CENTOS7上KVM的应用

1. 准备工作

1.1 确认硬件支持虚拟化

    为了能够顺利使用kvm创建虚拟机,需要验证服务器的BIOS开启虚拟化技术(Virtualization Technology)。以DELL服务器为例,重新启动服务器并在POST期间按F2进入BIOS,然后选择“Processors Settings”,并验证“Virtualization Technology”是否设置为“Enabled”。保存和Exit,让服务器启动。
    服务器启动后要检查的另一项是处理器是否支持vt。这项检查不是必不可少的,但如果处理器支持vt,虚拟机性能会比较好:

# grep -E 'svm|vmx' /proc/cpuinfo 
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm epb intel_ppin ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms xsaveopt dtherm arat pln pts spec_ctrl intel_stibp flush_l1d
...

    vmx 用于Intel架构;svm用于AMD架构

1.2 安装相关软件包
# yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install
# systemctl start libvirtd

    验证是否加载了kvm,kvm_intel两个内核模块,如果未加载,使用modprobe命令手动加载:

# lsmod |grep kvm
kvm_intel             183705  0 
kvm                   615914  1 kvm_intel
1.3 配置宿主机网络

    默认情况下,虚拟机创建完毕只能连接到192.168.122.0的私网,无法与宿主机的局域网连通,所以需要把宿主机相关网口纳入到网桥。最终的目的是让新创建的虚拟机可以正常接入网络。
    1. 修改网口配置文件
    在实验中,我这台宿主机网口配置文件为/etc/sysconfig/network-scripts/ifcfg-eno1,在文件末尾追加 “BRIDGE=br0”,“br0”为马上要创建的网桥。最终的网卡配置文件如下,很明显,eno1使用的静态IP:

# cat ifcfg-eno1 
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
NAME=eno1
UUID=b026f418-450d-48d9-85d2-c38aa851339f
DEVICE=eno1
ONBOOT=yes
NETMASK=255.255.255.0
IPADDR=192.168.20.160
GATEWAY=192.168.20.2
IPV6INIT=no
PEERDNS=yes
DNS1=114.114.114.114
BRIDGE=br0

    2. 创建网桥
    编辑/etc/sysconfig/network-scripts/ifcfg-br0,内容如下:

# cat ifcfg-br0 
DEVICE=br0
BOOTPROTO=none
ONBOOT=yes
TYPE=Bridge
IPADDR=192.168.20.160
NETMASK=255.255.255.0
GATEWAY=192.168.20.2

    网桥使用的是eno1网口的IP地址,为什么呢?因为配置完成后,物理网口eno1不会有IP地址,网桥br0将会获得IP地址,并承担起eno1和虚拟机的数据转发工作。网桥这里也可以配置其他IP地址,但为了保证宿主机其他业务正常工作,建议IP地址不要更改。

    3. 重启网络服务,进行验证。
    查看网桥情况:

# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.40f2e9084d82       no              eno1

    查询网络情况:

# ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
...
17: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.20.160/24 brd 192.168.20.255 scope global noprefixroute br0
       valid_lft forever preferred_lft forever
    inet6 xxxx::xxxx:xxxx:xxxx:xxxx/64 scope link 
       valid_lft forever preferred_lft forever

    网桥有IP,eno1没有IP,看起来一切正常。

1.4 修改网络转发的内核参数

    编辑/etc/sysctl.conf:

net.ipv4.ip_forward = 1

    重新加载参数:

# sysctl -p /etc/sysctl.conf

2. 创建虚拟机

# virt-install --network bridge:br0 --name vm1 --ram=1024 --vcpus=1 --disk path=/vm-images/vm1.img,size=10 --graphics none --location /usr/local/src/CentOS-7-x86_64-Minimal-1611.iso --extra-args console=ttyS0

    创建虚拟机主要就是上面这条命令,如果使用,请按照实际情况进行修改。
    --network bridge:br0 表示该虚拟机使用br0的网桥进行数据包的发送和接收;
    --name vm1 虚拟机名字为vm1;
    --ram=1024 虚拟机内存为1G;
    --vcpus=1 虚拟机cpu有1核;
    --disk path=/vm-images/vm1.img,size=10 虚拟机镜像存储路径为/vm-images/vm1.img,虚拟机大小为10G;
    --graphics none 因为这里是使用命令行进行操作系统的安装,所以一定要加上这个参数。如果使用图形界面安装操作系统,就不用加该参数了;
    --location /usr/local/src/CentOS-7-x86_64-Minimal-1611.iso 这是安装镜像的位置。根据virt-install的man手册,如果想使用CDROM文件进行操作系统的安装,并且安装命令中有-‌-extra-args和-‌-initrd-inject选项(这两项是使用kickstart安装系统需要设置的),可以考虑以下3种方式:
(1)root权限下使用参数-‌-location ISO;
(2)将ISO镜像挂载到本地文件夹,使用参数-‌-location DIRECTORY;
(3)将ISO镜像挂载到本地文件夹,将文件夹映射到本地http服务,使用参数–location http://localhost/DIRECTORY;
    在这里我选择的是第(1)个方法。
    注意:请不要使用-‌-cdrom ISO加-‌-extra-args的参数配置,会如下错误,赶快将-‌-cdrom改成-‌-location吧:

WARNING CDROM media does not print to the text console by default, so you likely will not see text install output. You might want to use --location. See the man page for examples of using --location with CDROM media

    --extra-args console=ttyS0 额外参数的设置,这里表示将安装进度反馈到控制台上。
    注意:不要使用-‌-extra-args=“console=tty0 console=ttyS0,115200” 这个参数,会进入telnet界面并卡住不动:

Connected to domain XXX
Escape character is ^]

3. 克隆虚拟机

    1. 确保虚拟机处于关机或者挂起状态,使用如下命令挂起虚拟机:

# virsh suspend vm1 

    2. 使用virt-clone克隆虚拟机:

# virt-clone --connect qemu:///system --original vm1 --name vm1-clone --file /vm-images/vm1-clone.img

    virt-clone不会更改操作系统中的任何内容,它只复制磁盘并为克隆机生成新的mac地址。诸如主机名、密码、静态IP地址等都不在该工具的配置范围内,需要使用virt sysprep命令或者直接进入虚拟机修改。

4. 管理虚拟机

    一般虚拟机的配置文件位于/etc/libvirt/qemu,如果需要配置CPU,内存,硬盘,可以使用命令virsh edit vm1或者直接编辑配置文件。

4.1 基础命令

    列出虚拟机:

# virsh list --all

    查询虚拟机信息

# virsh dominfo vm1

    查询vcpu/memory信息

# virt-top

    关机

# virsh shutdown vm1

    开机

# virsh start vm1

    宿主机开机启动虚拟机vm1

# virsh autostart vm1

    宿主机开机不启动虚拟机vm1

# virsh autostart --disable vm1

    从命令行进入虚拟机vm1登录界面

# virsh console vm1 
4.2 USB设备挂载到虚拟机

    首先确定将存储设备插入主机后的设备名称。在本例中,它是/dev/sdb:

# virsh attach-disk vm1 /dev/sdb vdb --driver qemu --mode shareable

    注意:
    vdb是要映射到虚拟机内部的设备名;
    可以一次将USB设备装载到多台虚拟机,但如果挂载到多台虚拟机,是没有写权限的。
    现在,可以直接从vm1上的/dev/vdb访问存储设备。工作完成后,只需将其与虚拟机分离:

# virsh detach-disk vm1 vdb
4.3 调整虚拟机内存

    默认情况下,VM中的最大内存值将始终等于,创建虚拟机时virt-install命令中-‌-ram参数指定的内存。
    例如,如果创建了一个内存为1GB的虚拟机,则可以动态减少此数量,而无需关闭该虚拟机。如果要将内存增加到1GB以上,则首先增加其最大内存设置,这首先需要关闭VM。
    在本次实验中,尝试将vm1虚拟机的内存从1G减少至512M:
    1.查询当前内存总量

# virsh dominfo vm1 | grep memory
Max memory:     1048576 KiB
Used memory:    1048576 KiB

    2.如果虚拟机正在运行,使用如下命令将内存缩减至512M

# virsh setmem vm1 524288

虚拟机关机情况下,不能使用该命令
    3.核实内存,完成减少

# virsh dominfo vm1 | grep memory
Max memory:     524288 KiB
Used memory:    524288 KiB

    然后,将vm1内存从512M增至2G
    1.确认虚拟机关机的情况下,编辑虚拟机配置来调整内存最大值

# virsh edit vm1

<domain type='kvm'>
  <name>vm1</name>
  <uuid>360d39cf-9d28-4db8-a978-a451f1054a11</uuid>
  <memory unit='KiB'>524288</memory>
  <currentMemory unit='KiB'>524288</currentMemory>
  ...

    修改位置如下所示:

<memory unit='KiB'>524288</memory>

    2.启动vm1,并进行虚拟机内存动态调整

# virsh list --all
 Id    Name                           State
----------------------------------------------------
 16    vm1                            running
# virsh dominfo vm1 | grep memory
Max memory:     2097152 KiB
Used memory:    524288 KiB
# virsh setmem vm1 2097152 

# virsh dominfo vm1 | grep memory
Max memory:     2097152 KiB
Used memory:    2097152 KiB

    注意:
    修改内存之后,如果服务器重启,一定要检查一下当前内存是否正确,如果不正确,就修改一下:

<currentMemory unit='KiB'>1048576</currentMemory>
4.4 调整虚拟机vcpu数量

    确保虚拟机关机后,使用命令编辑vcpu数量

# virsh edit vm1

    修改vcpu数量位置:

<vcpu placement='static'>1</vcpu>
4.5 调整虚拟机硬盘容量

    假设为虚拟机vm1-clone新增10G的硬盘空间,虚拟机原硬盘容量为

# virt-df -h vm1-clone
Filesystem                                Size       Used  Available  Use%
vm1-clone:/dev/sda1                      1014M       105M       909M   11%
vm1-clone:/dev/cl/root                    8.0G       918M       7.1G   12%

    1.创建1个10G数据块

# dd if=/dev/zero of=/vm-images/vm1-clone-add.img bs=1M count=10240

10240+0 records in
10240+0 records out
10737418240 bytes (11 GB) copied, 607.012 s, 17.7 MB/s

    2.确保虚拟机vm1-clone关机,编辑配置文件/etc/libvirt/qemu/vm1-clone.xml:
    复制disk设备:

<disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/vm-images/vm1-clone.img'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>

    新增块设备:

<disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/vm-images/vm1-clone-add.img'/>
      <target dev='vdb' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
    </disk>

    需要修改type,source file,target dev和slot四个位置。type=‘raw’;source file为新增的镜像块位置;新增的target dev标签需要按顺序排列,第一块硬盘是vda,所以扩容的硬盘为vdb;slot是插槽,使用下面语句进行查看,slot 0x1-7已经全部被占用了,所以新增的硬盘槽位就设置为0x08。

# grep slot /etc/libvirt/qemu/vm1-clone.xml 
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x7'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0' multifunction='on'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>

    3. 使用升级后的配置文件重启虚拟机

# virsh create /etc/libvirt/qemu/vm1-clone.xml
Domain vm1-clone created from /etc/libvirt/qemu/vm1-clone.xml

    4. 进入虚拟机,扩容的硬盘已经可以查看到了。

# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0          11:0    1 1024M  0 rom  
vda         252:0    0   10G  0 disk 
├─vda1      252:1    0    1G  0 part /boot
└─vda2      252:2    0    9G  0 part 
  ├─cl-root 253:0    0    8G  0 lvm  /
  └─cl-swap 253:1    0    1G  0 lvm  [SWAP]
vdb         252:16   0   10G  0 disk 

    后面就是使用fdisk格式化,创建pv,vg,lv等等一系列扩容指令了。

4.6 删除虚拟机

    1.确保虚拟机关机

# virsh shutdown vm1-clone

    如果虚拟机没有反应,需要强制关机

# virsh destroy vm1-clone

    2.删除虚拟机配置,即删除了文件/etc/libvirt/qemu/vm1-clone.xml

# virsh undefine vm1-clone

    3.最后,删除虚拟机镜像

# rm /vm-images/vm1-clone*
rm: remove regular file ‘/vm-images/vm1-clone-add.img’? y
rm: remove regular file ‘/vm-images/vm1-clone.img’? y
参考文档

https://linux.dell.com/files/whitepapers/KVM_Virtualization_in_RHEL_7_Made_Easy.pdf
https://www.linux-kvm.org/page/Networking

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值