ytutr 发表于 2016-8-31 09:04:36

KVM虚拟化

做这个实验,需要我们的cpu支持虚拟化,有的机器支持但是并未在bios开启,这个需要事先开启。

1. vmware安装centos6.6 64位 (略)
其中有几个注意的地方:
a. 内存给2g
b. 磁盘给50g, 或者再单独分一个磁盘,用来存储虚拟机文件
c. 最关键的一步,在创建虚拟机时,cpu是需要配置一下虚拟化的如图




2.安装kvm前的准备工作
a. 清除iptables规则
service iptables stop; service iptables save
b. 关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0


3. 开始安装kvm
a. 检查你的系统是否支持虚拟化
grep -Ei 'vmx|svm' /proc/cpuinfo
如果有输出内容,则支持,其中intel cpu支持会有vmx,amd cpu支持会有svm

b. 通过yum安装虚拟化的软件包
yum install -y kvm virt-*libvirtbridge-utils qemu-img
说明:
kvm:软件包中含有KVM内核模块,它在默认linux内核中提供kvm管理程序
libvirts:安装虚拟机管理工具,使用virsh等命令来管理和控制虚拟机。
bridge-utils:设置网络网卡桥接。
virt-*:创建、克隆虚拟机命令,以及图形化管理工具virt-manager
qemu-img:安装qemu组件,使用qemu命令来创建磁盘等。




c. 检查kvm模块是否加载
lsmod |grep kvm
正常应该是:
kvm_intel            554963
kvm                   3377721 kvm_intel

如果没有,需要执行
modprobe kvm-intel
还没有就重启一下试试

d. 配置网卡
cd /etc/sysconfig/network-scripts/
cp ifcfg-eth0 ifcfg-br0
分别编辑eth0和br0
ifcfg-eth0改成如下:
DEVICE=eth0
HWADDR=00:0C:29:55:A7:0A
TYPE=Ethernet
UUID=2be47d79-2a68-4b65-a9ce-6a2df93759c6
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
BRIDGE=br0


ifcfg-br0改成如下:
DEVICE=br0
#HWADDR=00:0C:29:55:A7:0A
TYPE=Bridge
#UUID=2be47d79-2a68-4b65-a9ce-6a2df93759c6
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.11.17
NETMASK=255.255.255.0
GATEWAY=192.168.11.1
DNS1=202.106.0.20

说明: 我的虚拟机是桥接模式,所以设置br0的ip和我的真机同样的网段,包括网关也是我路由器的ip,大家可以根据自己的环境去配置,目的是为了让虚拟机可以上网。

/etc/init.d/network restart
查看网卡如下:
br0       Link encap:EthernetHWaddr 00:0C:29:55:A7:0A
          inet addr:192.168.11.17Bcast:192.168.11.255Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe55:a70a/64 Scope:Link
          UP BROADCAST RUNNING MULTICASTMTU:1500Metric:1
          RX packets:141326 errors:0 dropped:0 overruns:0 frame:0
          TX packets:90931 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:456024940 (434.8 MiB)TX bytes:10933593 (10.4 MiB)

eth0      Link encap:EthernetHWaddr 00:0C:29:55:A7:0A
          inet6 addr: fe80::20c:29ff:fe55:a70a/64 Scope:Link
          UP BROADCAST RUNNING MULTICASTMTU:1500Metric:1
          RX packets:341978 errors:0 dropped:0 overruns:0 frame:0
          TX packets:90946 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:468848861 (447.1 MiB)TX bytes:10934699 (10.4 MiB)

lo      Link encap:Local Loopback
          inet addr:127.0.0.1Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNINGMTU:65536Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)TX bytes:0 (0.0 b)

virbr0    Link encap:EthernetHWaddr 52:54:00:14:EF:D5
          inet addr:192.168.122.1Bcast:192.168.122.255Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICASTMTU:1500Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)TX bytes:0 (0.0 b)



e. 启动或重启libvirtd服务和messagebus 服务
/etc/init.d/libvirtd start
/etc/init.d/messagebus restart

此时可以查看网络接口列表
brctl show 结果如下:
bridge name   bridge id               STP enabled   interfaces
br0             8000.000c2955a70a       no            eth0
virbr0          8000.52540014efd5       yes             virbr0-nic


4. 创建虚拟机
mkdir /data/   //创建一个存储虚拟机虚拟磁盘的目录,该目录所在分区必须足够大

virt-install \
--nameaming1 \
--ram 512 \
--disk path=/data/aming1.img,size=30 \
--vcpus 1 \
--os-type linux \
--os-variant rhel6 \
--network bridge=br0 \
--graphics none \
--console pty,target_type=serial \
--location 'http://mirrors.163.com/centos/6.7/os/i386/' \
--extra-args 'console=ttyS0,115200n8 serial'


说明:
--name指定虚拟机的名字
--ram 指定内存分配多少
--disk path 指定虚拟磁盘放到哪里,size=30 指定磁盘大小为30G,这样磁盘文件格式为raw,raw格式不能做快照,后面有说明,需要转换为qcow2格式,如果要使用qcow2格式的虚拟磁盘,需要事先创建qcow2格式的虚拟磁盘。 参考http://www.361way.com/kvm-qcow2-preallocation-metadata/3354.html   示例:qemu-img create -f qcow2 -o preallocation=metadata/data/test02.img 7G;--disk path=/data/test02.img,format=qcow2,size=7,bus=virtio
--vcpus 指定分配cpu几个
--os-type 指定系统类型为linux
--os-variant 指定系统版本
--network指定网络类型
--graphics 指定安装通过哪种类型,可以是vnc,也可以没有图形,在这里我们没有使用图形直接使用文本方式
--console 指定控制台类型
--location 指定安装介质地址,可以是网络地址,也可以是本地的一个绝对路径,(--location '/mnt/', 其中/mnt/下就是我们挂载的光盘镜像mount /dev/cdrom /mnt)如果是绝对路径,那么后面还需要指定一个安装介质,比如NFS,假如虚拟机设置ip后,不能连外网,那么就会提示让我们选择安装途径:                        
                        ┌───┤ Installation Method ├───┐
                        │                           │
                        │ What type of media contains   │
                        │ the installation image?             │
                        │                                             │
                        │      Local CD/DVD                  │
                        │      Hard drive                      │
                        │      NFS directory                  │
                        │      URL                               │
                        │                                             │
                        │   ┌────┐       ┌──────┐   │
                        │   │ OK    │       │ Back   │   │
                        │   └────┘       └──────┘   │
                        │                                             │
                        │                                             │
                        └─────────────────────┘

我在这里选择NFS,设置参数如下:
    ┌───────────────────────────┤ NFS Setup ├─────────
   │                                                                                                 │
   │ Please enter the server and NFSv3 path to your CentOS installation   │
   │ image and optionally additional NFS mount options.                        │
   │                                                                                                │
   │       NFS server name:            172.7.15.3______________            │
   │       CentOS directory:             /mnt/images/install.img_               │
   │       NFS mount options (optional): ro______________________       │


--extra-args 设定内核参数

当按下回车后,稍等几秒钟就可以看到安装提示了。
开始安装......
搜索文件 .treeinfo......                           |720 B   00:00 ...
搜索文件 vmlinuz......                               | 7.7 MB   00:02 ...
搜索文件 initrd.img......                            |63 MB   00:23 ...
创建存储文件 centos6.6_1.img                     |30 GB   00:00
创建域......                                          |    0 B   00:00
连接到域 centos6.6_1



然后就是我们非常熟悉的OK orNext 了 ,只不过这个过程是文本模式,如果想使用图形,只能开启vnc啦。

最后安装完,reboot就进入刚刚创建的虚拟机了。要想退回到宿主机,ctrl] 即可。
virsh list 可以列出当前的子机列表。
virsh console centos6.6_1可以进入指定的子机

9. 调整cpu和内存查看子机配置:
virsh dominfo test02
virsh edittest02
修改:
<memory unit='KiB'>524288</memory>
<currentMemory unit='KiB'>524288</currentMemory>
<vcpu placement='static'>1</vcpu>

为:
<memory unit='KiB'>624288</memory>
<currentMemory unit='KiB'>624288</currentMemory>
<vcpu placement='static'>2</vcpu>


重启虚拟机:
virsh destroy test02
virsh start test02

11. 虚拟机迁移

该方式要确保虚拟机是关机状态。
virsh shutdown test02
virsh dumpxml test02 > /etc/libvirt/qemu/test03.xml// 如果是远程机器,需要把该配置文件拷贝到远程机器上
virsh domblklist test02//查看test02子机的磁盘所在目录
Target   Source
------------------------------------------------
vda      /data/add1.qcow2
rsync -av /data/add1.qcow2 /data/test03.qcow2   //如果是迁移到远程,则需要把该磁盘文件拷贝到远程机器上
vi /etc/libvirt/qemu/test03.xm//因为是迁移到本机,配置文件用的是test02子机的配置,不改会有冲突,所以需要修改该文件,如果是远程机器不用修改
修改domname:
<name>test03</name>
修改uuid(随便更改一下数字,位数不要变)
<uuid>77bb10bd-3ad8-8899-958d-756063002969</uuid>
修改磁盘路径:
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw' cache='none'/>
      <source file='/data/test03.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>

virsh list --all   //会发现新迁移的test03子机

5. 克隆虚拟机
virt-clone --original centos6.6_1 --name template --file /data/clone1.img
如果子机centos6.6_1还未关机,则需要先关机,否则会报错:
ERROR    必须暂停或者关闭有要克隆设备的域。
关闭子机的方法是:
virsh shutdown centos6.6_1

说明: 默认,我们没有办法在宿主机直接shutdown自己,我们需要借助于子机上的acpid服务才可以,这个服务说白了就是让宿主机可以去调用子机的电源关闭的接口。所以,子机上需要安装并启动acpid服务。
先登录子机:
virsh console centos6.6_1
登录后,安装acpid服务:
yum install -y acpid
启动:
/etc/init.d/acpid start
按ctrl ] 退出来
此时再执行 virsh shutdown centos6.6_1 就可以啦。

克隆完后,virsh list all 就会发现clone1 这个子机,通过命令
virsh start clone1 可以开启该子机。


6. virsh 常用操作
a. 开启子机
virsh start centos6.6_1
也可以在开启的同时连上控制台
virsh start centos6.6_1 --console

b. 关闭子机
virsh shutdown centos6.6_1 (这个需要借助子机上的acpid服务)
另外一种方法是
virsh destroy centos6.6_1

c. 让子机随宿主机开机自动启动
virsh autostart centos6.6_1
解除自动启动
virsh autostart --disable centos6.6_1

d. 列出子机
virsh list//只能列出启动的子机
virsh list --all//可以把所有子机都列出来

e. 删除子机
virsh destroy clone1
virsh undefine clone1
rm -f /data/clone1.img

f. 挂起子机
virsh suspend centos6.6_1

h. 恢复子机
virsh resume centos6.6_1
7. 快照管理
a. 创建快照
virsh snapshot-create centos6.6_1
会报错:
unsupported configuration: internal snapshot for disk vda unsupported for storage type raw
这是因为raw格式的镜像不能做快照,所以需要先转换一下格式

b. 磁盘镜像转换格式
先查看当前子机磁盘镜像格式
qemu-img info /data/centos6.6_1.img
结果是:
image: /data/centos6.6_1.img
file format: raw
virtual size: 30G (32212254720 bytes)
disk size: 1.6G


把raw格式转换为qcow格式(其实是复制了一份):
qemu-img convert -f raw -O qcow2 /data/centos6.6_1.img /data/centos6.6_1.qcow2

qemu-img info /data/centos6.6_1.qcow2   //再次查看格式,结果如下
image: /data/centos6.6_1.qcow2
file format: qcow2
virtual size: 30G (32212254720 bytes)
disk size: 1.1G
cluster_size: 65536


现在我们还需要编辑子机配置文件,让它使用新格式的虚拟磁盘镜像文件
virsh edit centos6.6_1//这样就进入了该子机的配置文件(/etc/libvirt/qemu/centos6.6_1.xml),跟用vim编辑这个文件一样的用法
需要修改的地方是:
      <driver name='qemu' type='raw' cache='none'/>
      <source file='/data/centos6.6_1.img'/>

改为:
      <driver name='qemu' type='qcow2' cache='none'/>
      <source file='/data/centos6.6_1.qcow2'/>


c. 继续创建快照
virsh snapshot-create centos6.6_1//这次成功了,提示如下
Domain snapshot 1437248443 created


列出快照:
virsh snapshot-list centos6.6_1

查看当前子机的快照版本:
virsh snapshot-current centos6.6_1

centos6.6_1子机的快照文件在/var/lib/libvirt/qemu/snapshot/centos6.6_1/目录下


d.恢复快照
首先需要关闭子机
virsh destroy centos6.6_1

确认子机是否关闭
virsh domstate centos6.6_1
关闭

vish snapshot-list centos6.6_1//结果是
名称               Creation Time             状态
------------------------------------------------------------
1437248443         2015-07-19 03:40:43 +0800 shutoff
1437248847         2015-07-19 03:47:27 +0800 running


virsh snapshot-revert centos6.6_11437248443

e. 删除快照
virsh snapshot-delete centos6.6_11437248847


8. 磁盘扩容

a. 对于raw格式的虚拟磁盘扩容

qemu-img info /data/kvm/test03.img //本身只有9G


[*]image: /data/kvm/test03.img


[*]file format: raw


[*]virtual size: 9.0G (9663676416 bytes)


[*]disk size: 1.1G

复制代码

qemu-img resize /data/kvm/test03.img +2G

qemu-img info /data/kvm/test03.img //现在增加了2G


[*]image: /data/kvm/test03.img


[*]file format: raw


[*]virtual size: 11G (11811160064 bytes)


[*]disk size: 1.1G


[*]

复制代码

virsh destroy test03//关闭test03虚拟机
virsh start test03//开启test03虚拟机
virsh console test03//进入虚拟机

fdisk -l   查看已经磁盘分区已经增加
# fdisk -l



[*]Disk /dev/vda: 11.8 GB, 11811160064 bytes


[*]16 heads, 63 sectors/track, 22885 cylinders


[*]Units = cylinders of 1008 * 512 = 516096 bytes


[*]Sector size (logical/physical): 512 bytes / 512 bytes


[*]I/O size (minimum/optimal): 512 bytes / 512 bytes


[*]Disk identifier: 0x000099f3


[*]

[*]   Device Boot      Start         End      Blocks   IdSystem


[*]/dev/vda1   *         3      1018      512000   83Linux


[*]Partition 1 does not end on cylinder boundary.


[*]/dev/vda2            1018       16645   7875584   8eLinux LVM


[*]Partition 2 does not end on cylinder boundary.


[*]

[*]Disk /dev/mapper/VolGroup-lv_root: 7205 MB, 7205814272 bytes


[*]255 heads, 63 sectors/track, 876 cylinders


[*]Units = cylinders of 16065 * 512 = 8225280 bytes


[*]Sector size (logical/physical): 512 bytes / 512 bytes


[*]I/O size (minimum/optimal): 512 bytes / 512 bytes


[*]Disk identifier: 0x00000000


[*]

[*]

[*]Disk /dev/mapper/VolGroup-lv_swap: 855 MB, 855638016 bytes


[*]255 heads, 63 sectors/track, 104 cylinders


[*]Units = cylinders of 16065 * 512 = 8225280 bytes


[*]Sector size (logical/physical): 512 bytes / 512 bytes


[*]I/O size (minimum/optimal): 512 bytes / 512 bytes


[*]Disk identifier: 0x00000000

复制代码

但是磁盘挂载的空间并没有增加
# df -h


[*]Filesystem            SizeUsed Avail Use% Mounted on


[*]/dev/mapper/VolGroup-lv_root


[*]                      6.5G579M5.6G10% /


[*]tmpfs               250M   0250M   0% /dev/shm


[*]/dev/vda1             477M   26M427M   6% /boot


[*]

[*]

复制代码

因为新增加的空间还没有划分使用。所以要继续分区:
# fdisk /dev/vda



[*]WARNING: DOS-compatible mode is deprecated. It's strongly recommended to


[*]         switch off the mode (command 'c') and change display units to


[*]         sectors (command 'u').


[*]

[*]Command (m for help): p


[*]

[*]Disk /dev/vda: 11.8 GB, 11811160064 bytes


[*]16 heads, 63 sectors/track, 22885 cylinders


[*]Units = cylinders of 1008 * 512 = 516096 bytes


[*]Sector size (logical/physical): 512 bytes / 512 bytes


[*]I/O size (minimum/optimal): 512 bytes / 512 bytes


[*]Disk identifier: 0x000099f3


[*]

[*]   Device Boot      Start         End      Blocks   IdSystem


[*]/dev/vda1   *         3      1018      512000   83Linux


[*]Partition 1 does not end on cylinder boundary.


[*]/dev/vda2            1018       <font color="#ff0000">16645</font>   7875584   8eLinux LVM


[*]Partition 2 does not end on cylinder boundary.


[*]

[*]Command (m for help):<font color="#ff0000"> n</font>


[*]Command action


[*]   e   extended


[*]   p   primary partition (1-4)


[*]p


[*]Partition number (1-4): <font color="#ff0000">3</font>


[*]First cylinder (1-22885, default 1): <font color="#ff0000">16646</font>


[*]Last cylinder, +cylinders or +size{K,M,G} (16646-22885, default 22885):


[*]Using default value 22885


[*]

[*]Command (m for help): p


[*]

[*]Disk /dev/vda: 11.8 GB, 11811160064 bytes


[*]16 heads, 63 sectors/track, 22885 cylinders


[*]Units = cylinders of 1008 * 512 = 516096 bytes


[*]Sector size (logical/physical): 512 bytes / 512 bytes


[*]I/O size (minimum/optimal): 512 bytes / 512 bytes


[*]Disk identifier: 0x000099f3


[*]

[*]   Device Boot      Start         End      Blocks   IdSystem


[*]/dev/vda1   *         3      1018      512000   83Linux


[*]Partition 1 does not end on cylinder boundary.


[*]/dev/vda2            1018       16645   7875584   8eLinux LVM


[*]Partition 2 does not end on cylinder boundary.


[*]<font color="#ff0000">/dev/vda3         16646       22885   3144960   83Linux</font>


[*]

[*]Command (m for help): w


[*]The partition table has been altered!


[*]

[*]Calling ioctl() to re-read partition table.


[*]

[*]WARNING: Re-reading the partition table failed with error 16: Device or resource busy.


[*]The kernel still uses the old table. The new table will be used at


[*]the next reboot or after you run partprobe(8) or kpartx(8)


[*]Syncing disks.

复制代码

然后再把这个/dev/vda3 加入到lvm里面去:

ls/dev/vda3 如果没有这个分区,需要重启一下。

# pvcreate /dev/vda3


[*]<span style="line-height: 1.5; background-color: rgb(247, 247, 247);">Physical volume "/dev/vda3" successfully created</span>

复制代码

# pvs


[*]PV         VG       FmtAttr PSize PFree


[*]/dev/vda2 <font color="#ff0000"> VolGroup</font> lvm2 a--7.51g    0


[*]/dev/vda3         lvm2 ---3.00g 3.00g

复制代码

# vgextend VolGroup /dev/vda3


[*]Volume group "VolGroup" successfully extended

复制代码

# vgs


[*]VG       #PV #LV #SN Attr   VSize<font color="#ff0000">VFree</font>


[*]VolGroup   2   2   0 wz--n- 10.50g <font color="#ff0000">3.00g</font>

复制代码

# lvs


[*]LV      VG       Attr       LSize   Pool Origin Data%Meta%Move Log Cpy%Sync Convert


[*]lv_root VolGroup -wi-ao----   6.71g


[*]lv_swap VolGroup -wi-ao---- 816.00m

复制代码

# lvextend -l +100%FREE /dev/VolGroup/lv_root


[*]Size of logical volume VolGroup/lv_root changed from 6.71 GiB (1718 extents) to 9.71 GiB (2485 extents).


[*]Logical volume lv_root successfully resized

复制代码

# df -h


[*]Filesystem            SizeUsed Avail Use% Mounted on


[*]/dev/mapper/VolGroup-lv_root


[*]                      6.5G618M5.6G10% /


[*]tmpfs               250M   0250M   0% /dev/shm


[*]/dev/vda1             477M   26M427M   6% /boot

复制代码

# resize2fs /dev/VolGroup/lv_root


[*]resize2fs 1.41.12 (17-May-2010)


[*]Filesystem at /dev/VolGroup/lv_root is mounted on /; on-line resizing required


[*]old desc_blocks = 1, new_desc_blocks = 1


[*]Performing an on-line resize of /dev/VolGroup/lv_root to 2544640 (4k) blocks.


[*]The filesystem on /dev/VolGroup/lv_root is now 2544640 blocks long.

复制代码

# df -h


[*]Filesystem            SizeUsed Avail Use% Mounted on


[*]/dev/mapper/VolGroup-lv_root


[*]                     <font color="#ff0000"> 9.5G</font>618M8.4G   7% /


[*]tmpfs               250M   0250M   0% /dev/shm


[*]/dev/vda1             477M   26M427M   6% /boot

复制代码

另外,如果是增加磁盘,思路是:
创建磁盘: qemu-img create -f raw/data/kvm/test03_2.img 5G
关闭虚拟机: virsh destroy test03
编辑配置文件: virsh edit test03增加如下:


[*]<disk type='file' device='disk'>   


[*]<driver name='qemu' type='raw' cache='none'/>      


[*]<source file='/data/kvm/test03_2.img'/>      


[*]<target dev='vdb' bus='virtio'/>      


[*]</disk>

复制代码

开启虚拟机:virsh start test03
进入虚拟机:virsh console test03
分区: fdisk /dev/vdb
格式化 (略)
挂载 (略)
当然也可以按照上面的思路把 /dev/vdb1 加入到 lvm里面去


b. qcow2格式
步骤基本上和raw一样。如果提示 This image format does not support resize, 检查一下你qemu-img create的时候,是否有加preallocation=metadata 选项,如果有,就不能resize了。

10. 不重启虚拟机在线增加网卡
virsh domiflist test02查看test02子机的网卡列表
virsh attach-interface test02 --type bridge --source br0   //命令行增加一块网卡
virsh dumpxml test02 > /etc/libvirsh/qemu/test02.xml   //命令行增加的网卡只保存在内存中,重启就失效,所以需要保存到配置文件中,其中/etc/libvirsh/qemu/test02.xml 为test02子机的配置文件
virsh console test02 //进入虚拟机后,执行
ifconfig -a
发现多了一个网卡eth1


页: [1]
查看完整版本: KVM虚拟化