本文介绍Linux虚拟机 KVM 相关内容。
KVM(Kernel-based Virtual Machine) ,基于内核的虚拟机,配合QEMU(处理器虚拟软件),需要CPU支持虚拟化技术(并且在BIOS里打开虚拟化选项),效率可达到物理机的80%以上。此外,它对SMP的支持很好。
虚拟工具 | 效率描述 |
---|---|
Vmware | 的功能全面,设置全面,速度相对最慢 |
VirtualBox | 效率比Vmware高一些,中文用户最多 |
KVM | 效率最高 |
需要cpu有虚拟化功能,并且在BIOS中开启
/proc/cpuinfo
,如果在cpu flags字段看到了vmx(Intel)或svm(AMD),那么你的处理器就支持KVM。egrep '(vmx|svm)' /proc/cpuinfo
或者简单地计数
egrep -c '(vmx|svm)' /proc/cpuinfo
防火墙和Linux 安全管理工具,为了方便可以选择暂时关闭
关闭 iptables 服务:
[root@kvm ~]# service iptables stop
[root@kvm ~]# chkconfig iptables off
关闭 selinux:
[root@kvm ~]# setenforce 0
[root@kvm ~]# vi /etc/selinux/config
SELINUX=disabled
安装KVM及依赖项
sudo apt update
sudo apt install qemu qemu-kvm libvirt-bin bridge-utils
如果
libvirt-bin
找不到,报错类似
E: Package 'libvirt-bin' has no installation candidate
原因是由于libvirt-bin被拆成了两个包
libvirt-daemon-system libvirt-clients
执行如下安装命令即可:
sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
sudo apt install virt-manager
sudo systemctl start libvirtd.service
sudo systemctl enable libvirtd.service
/etc/init.d/libvirtd start
/etc/init.d/messagebus restart
service libvirtd status
查看libvirtd服务状态service libvirtd status
[root@kvm ~]# lsmod | grep kvm_intel
kvm_intel 53484 0
kvm 316506 1 kvm_intel
如果没有加载,可以尝试执行命令:modprobe kvm_intel ,不行的话,试试重启宿主机。
一般虚拟机网络配置有Bridge、NAT等几种模式。
简单理解,就是NAT模式下,虚机隐藏在宿主机后面了,虚机能通过宿主机访问外网,但局域网其它主机访问不到它,Bridge模式下,虚机跟宿主机一样平等地存在,局域网其它主机可直接通过IP与其通信。一般我们创建虚机是用来部署服务供使用的, 所以都是用Bridge模式。
$ sudo vim /etc/netplan/50-cloud-init.yaml
# This file is generated from information provided by
# the datasource. Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
ethernets:
enp6s0:
dhcp4: true
enp7s0:
dhcp4: no
dhcp6: no
version: 2
bridges:
br0:
interfaces: [enp7s0]
dhcp4: no
addresses: [192.168.40.241/24]
gateway4: 192.168.40.1
nameservers:
addresses: [114.114.114.114,8.8.8.8]
sudo netplan apply
重启网络服务生效,然后通过ifconfig
查看,原来挂在enp7s0网卡下的IP现在挂到了br0上,宿主机及所有其它虚拟机都通过该网桥来与外部通讯。我们也可以通过brctl show
来直观地查看:$ brctl show
bridge name bridge id STP enabled interfaces
br0 8000.2a5be3ec2698 no enp7s0
docker0 8000.02424524dcce no veth580af8e
veth74119f3
vethe7a2b0f
vethfe89039
目前因为还没虚机,所以只有宿主机的网卡enp7s0挂在网桥br0上。同时也可以看到docker容器也是通过网桥docker0来通讯的。
[root@kvm ~]# cd /etc/sysconfig/network-scripts/
[root@kvm ~]# cp ifcfg-eth0 ifcfg-br0
[root@kvm ~]# vi ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=none
BRIDGE=br0
[root@kvm ~]# vi ifcfg-br0
DEVICE=br0
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=static
IPADDR=172.16.1.8
PREFIX=24
GATEWAY=172.16.1.1
DNS1=114.114.114.114
NAME=br0
# 重启网络
[root@kvm ~]# service network restart
关于虚拟机镜像,有很多种类型:raw、qcow2、vmdk等,我们推荐使用 qcow2 格式的镜像,因为 qcow2 格式的镜像支持快照,使用的比较广泛。在创建虚拟机之前需要手动去创建 qcow2 格式的镜像磁盘文件,以供安装虚拟机时使用。按照如下命令进行创建:
qemu-img create -f qcow2 -o preallocation=metadata /data/kvm/liwei01.qcow2 50G
virt-install --name liwei01 --ram 1024 --vcpus 1 \
-f /data/kvm/liwei01.qcow2 --os-type linux \
--os-variant rhel6 --network bridge=br0 \
--graphics none --console pty,target_type=serial \
--location 'http://mirrors.163.com/centos/6.8/os/i386/' \
--extra-args 'console=ttyS0,115200n8 serial'
virt-install --name liwei01 --ram 1024 --vcpus 1 \
-f /data/kvm/liwei01.qcow2 --os-type linux \
--os-variant rhel6 --network bridge=br0 \
--graphics vnc,listen=0.0.0.0,port=5920 \
--location 'http://mirrors.163.com/centos/6.8/os/i386/'
virt-install --name liwei01 --ram 1024 --vcpus 1 \
-f /data/kvm/liwei01.qcow2 --os-type linux \
--os-variant rhel6 --network bridge=br0 \
--cdrom CentOS-6.8-i386-minimal.iso \
--graphics vnc,listen=0.0.0.0,port=5920
安装命令
sudo virt-install --name=dev-server1 --memory=16384,maxmemory=16384 \
--vcpus=4,maxvcpus=4 --os-type=linux --os-variant=rhel7 \
--location=/home/devuser/tools/CentOS-7-x86_64-DVD-1810.iso \
--disk path=/var/lib/libvirt/images/devserver1.img,size=300 \
--bridge=br0 --graphics=none --console=pty,target_type=serial \
--extra-args="console=tty0 console=ttyS0"
如果执行上述命令出现qemu-kvm: could not open 'xx/CentOS-7-x86_64-DVD-1810.iso': Permission denied
异常退出时,可通过修改/etc/libvirt/qemu.conf
文件将user = "root"
,group = "root"
前面的注释去掉解决(https://github.com/jedi4ever/veewee/issues/996)
创建镜像文件:
[root@kvm ~]# qemu-img create -f qcow2 /data/kvm/liwei.qcow2 50G
# 通过 liwei.qcow2 安装虚拟机 ... 安装完毕.
[root@kvm ~]# cp /data/kvm/liwei.qcow2 /data/kvm/liwei01.qcow2
安装命令:
# 以拷贝的 liwei01.qcow2 为模板进行安装,安装方式是从 liwei01.qcow2 镜像启动[root@kvm ~]# virt-install --name liwei01 --ram 1024 --vcpus=1 \
--disk /data/kvm/liwei01.qcow2,format=qcow2,bus=virtio \
--network bridge=br0 --graphics vnc,listen=0.0.0.0,port=5904 \
--boot hd
说明:本方式创建 img 镜像的时候没有指定 preallocation=metadata 选项,这样存储文件空间显示比较小,方便拷贝,不加这个选项时,在 virt-install 时候需要在 –disk 选项后边加上 bus=virtio,如果不加在安装操作系统的时候似乎是识别不出来磁盘空间,会提示磁盘空间不足。采用这种方式安装的速度非常快,其实就是从已经存在的操作系统镜像启动虚拟机并 define 一个新的虚拟机 liwei01,可以通过脚本快速创建出多个相同配置的虚拟机。当然可以在基础镜像中安装公共的软件包和设置相同的配置,这样后续基于这个 img 安装的虚拟机都有类似的配置,省去重复安装软件包的麻烦。
创建镜像:
[root@kvm ~]# qemu-img create -f qcow2 -o preallocation=metadata /data/kvm/liwei.qcow2 50G
# 通过 liwei.qcow2 安装虚拟机 ... 安装完毕.
# 以 liwei.qcow2 镜像为模板创建 liwei01.qcow2 镜像
[root@kvm ~]# qemu-img create -f qcow2 -o backing_file=liwei.qcow2 liwei01.qcow2 10G
安装命令:
[root@kvm ~]# virt-install --name liwei01 --ram 1024 --vcpus=1 \
--disk /data/kvm/liwei01.qcow2,format=qcow2,bus=virtio \
--network bridge=br0 --graphics vnc,listen=0.0.0.0,port=5904 \
--boot hd
说明:在创建镜像 liwei01.qcow2 指定了 backing_file=liwei.qcow2 选项,表示以 liwei.qcow2 为后端镜像,以后对虚机 liwei01 的所有的写操作都会记录到 liwei01 镜像,实际操作系统是在 liwei.qcow2 镜像中,liwei.qcow2 镜像是只读的。也就是说后续以 liwei.qcow2 镜像为后端的虚机都共享这个镜像,而具体某个虚机的写操作内容都要记录到对应自己的镜像文件中去。注意和方式4的区别。
方式一:通过文本控制台进行管理安装 virsh console liwei01 后续也能用此方式进行登陆管理虚拟机。 方式二:通过 vnc 客户端进行连接, virsh vncdisplay liwei01 :20 客户端通过url: 172.16.1.8:20 进行连接。 方式三:同方式二一样,具体安装过程与普通操作系统安装过程一样,过程略。
ip a
命令查看/etc/sysconfig/network-scripts/ifcfg-eth0
文件中添加如下内容:# vi /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static #静态指定IP
DEFROUTE=yes
#IPV4_FAILURE_FATAL=no
#IPV6INIT=yes
#IPV6_AUTOCONF=yes
#IPV6_DEFROUTE=yes
#IPV6_FAILURE_FATAL=no
#IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=449ed621-97a8-45b9-902f-0d347e27de98
DEVICE=eth0
ONBOOT=yes #开机自动启动
IPADDR=192.168.40.96
NETMASK=255.255.255.0
GATEWAY=192.168.40.1
DNS1=192.168.40.1
systemctl restart network
重启网络生效,这时候再运行ip a
查看,eth0下面已经有配置的IP了。不出意外的话,局域网其它主机就可以通过该IP来远程SSH连接了。这时候我们再通过
brctl show
来查看网桥挂载情况,br0下面已经多了一个vnet0虚拟网卡了。
devuser@server_01:~$ brctl show
bridge name bridge id STP enabled interfaces
br0 8000.2a5be3ec2698 no enp7s0
vnet0
docker0 8000.02424524dcce no veth580af8e
veth74119f3
vethd270ee8
vethe7a2b0f
vethfe89039
virsh list
列出所有的,则virsh list --all
virsh console
,后面接虚拟机ID或名称
$ virsh console 5
Connected to domain dev-server1
Escape character is ^]
CentOS Linux 7 (Core)
Kernel 3.10.0-957.el7.x86_64 on an x86_64
dev-server1 login:
输入用户名,密码即可登录虚拟机,按
Ctrl+]
可退出。
virsh start|shutdown
devuser@cserver_01:~$ virsh start dev-server1
Domain dev-server1 started
devuser@server_01:~$ virsh shutdown 5
Domain 5 is being shutdown
devuser@server_01:~$ virsh autostart dev-server1
Domain dev-server1 marked as autostarted
devuser@server_01:~$ virsh suspend dev-server1 # 挂起虚拟机
devuser@server_01:~$ virsh resume dev-server1 # 恢复挂起的虚拟机
devuser@server_01:~$ virsh undefine dev-server1 # 彻底销毁虚拟机,会删除虚拟机配置文件,但不会删除虚拟磁盘
开机:virsh start vm 关机:virsh shutdown vm 如果不生效,需要在 vm 中执行:yum install -y acpid 强关:virsh destroy vm 删除:virsh undefine vm 定义:virsh define vm 挂起:virsh suspend vm 恢复:virsh resume vm
虚拟机列表:virsh list 包含关机的虚机:virsh list --all 设置自动启动:virsh autostart vm 关闭自动启动:virsh autostart --disable vm 登陆虚机控制台:virsh console vm # 只对指定了console的虚机才管用,方式一 退出虚机控制台:ctrl + ]
将虚拟机 liwei01 克隆为虚拟机 liwei02
[root@kvm ~]# virt-clone --original liwei01 --name liwei02 --file /data/kvm/liwei02.qcow2
注意:克隆前需要先关闭虚拟机;克隆完毕,一般需要设置虚拟机的网络。
1. 创建快照的条件
2. 创建快照
[root@kvm ~]# virsh snapshot-create liwei
3查看快照列表
[root@kvm ~]# virsh snapshot-list liwei
# 可以通过 qemu-img 查看镜像的快照信息
[root@kvm ~]# qemu-img info /data/kvm/liwei.img
4. 切换快照
[root@kvm ~]# virsh snapshot-revert liwei 1477285698
5. 查看当前快照
[root@kvm ~]# virsh snapshot-current liwei
6. 删除快照
[root@kvm ~]# virsh snapshot-delete liwei 1477285698
7. 快照文件存储位置
/var/lib/libvirt/qemu/snapshot
1. 虚拟机扩容磁盘,给现有磁盘增加容量
[root@kvm ~]# qemu-img resize /data/kvm/liwei.qcow2 +5G
# 重启虚拟机 reboot虚机不生效
[root@kvm ~]# virsh destroy liwei
[root@kvm ~]# virsh start liwei
在虚拟机中使用 fdisk -l 查看,通过观察block 块 id 可以发现存储空间多了,还必须将多余部分分区、格式化使用,默认使用 lvm 。
2. 给虚拟机添加磁盘
按照如下步骤:
注:可以尝试不分区直接格式化,也可以尝试使用 lvm 。
思路:首先得有镜像文件(已有) + xml 配置文件
[root@kvm ~]# virsh dumpxml liwei > /etc/libvirt/qemu/liwei01.xml
# 编辑配置文件,修改为适当的值
# 添加定义
virsh define /etc/libvirt/qemu/liwei01.xml
virsh list --all #即可查到该虚拟机
如果要调整的 cpu 核数和内存超过安装虚机时指定的最大值,则需要关闭虚机来修改最大值,动态调整的值不能超过设置最大值,擦,一般使用值和最大值都是保持一致,一起修改。所以在线动态修改没什么意义,推荐直接修改配置文件就 OK。
[root@kvm ~]# virsh edit liwei01
<memory unit='KiB'>1048576</memory>
<currentMemory unit='KiB'>1048576</currentMemory>
<vcpu placement='static'>1</vcpu>
重启虚机 liwei01 就ok.
1. 添加虚拟机网卡
# 临时命令生效
[root@kvm ~]# virsh attach-interface liwei --type bridge --source br0
# 修改虚机配置文件
[root@kvm ~]# virsh dumpxml liwei > /etc/libvirt/qemu/liwei.xml
[root@kvm ~]# virsh define /etc/libvirt/qemu/liwei.xml
2. 删除虚拟机网卡
[root@kvm ~]# virsh detach-interface liwei --type bridge --mac 52:54:00:14:86:cf
3. 指定网卡类型
网卡默认类型是 rtl 品牌的网卡,这里设置为 intel 网卡 e1000 系列。修改如下配置文件即可。
<interface type='bridge'>
<mac address='52:54:00:b5:68:a4'/>
<source bridge='br0'/>
<model type='e1000'/> # 添加设置字段
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
使用 virsh 重启虚拟机,在虚拟机中查看:
[root@localhost ~]# lspci | grep "Ethernet"
00:03.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 03)
几个步骤:
1.关闭虚拟机
2.拷贝镜像文件
3.拷贝配置文件
4.virsh define vm