共计 5208 个字符,预计需要花费 14 分钟才能阅读完成。
一、KVM介绍
kvm 是 Kernel-based Virtual Machine 的简称,是一个开源的系统虚拟化模块,自 Linux2.6.20 之后集成在 Linux 的各个主要发行版本中。它使用 Linux 自身的调度器进行管理,所以相对于 Xen,其核心源码 很少。KVM 目前已成为学术界的主流 VMM 之一。
KVM 的虚拟化需要硬件支持(如 IntelVT 技术或者 AMDV 技术)。是基于硬件的完全虚拟化。 而 Xen 早期则是基于软件模拟的 Para-Virtualization,新版本则是基于硬件支持的完全虚拟化。但 Xen 本身有自己的进程调度器,存储管理模块等,所以代码较为庞大。广为流传的商业系统虚拟化软件 VMwareESX 系列是基于软件模拟的 Full-Virtualization。
因为对进程管理比较麻烦,RedHat 发布了一个开源项目 libvirt。libvirt 有命令行工具也有 API,可 以通过图形化界面,完成对虚拟机的管理。大多数管理平台通过 libvirt 来完成对 KVM 虚拟机的管理; 比如 Openstack、Cloudstack、OpenNebula 等。
二、创建虚拟机
1. 查看 cpu 是否支持虚拟化
egrep -c '(vmx|svm)' /proc/cpuinfo
0表示不支持,其他表示支持。
2. 安装相关软件包并启动
# ubuntu
apt install -y qemu qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
# centos
yum install -y qemu qemu-kvm libvirt virt-install bridge-utils
- qemu 是可以仿真出操作系统的仿真软件,但是速度很慢。
- qemu-kvm 是 qume 和 kvm 的整合,kvm 主要负责虚拟化 cpu、内存,其他的如网络、硬盘等由 qume 负责虚拟化。
- libvirt-bin 这个包拆分为libvirt-daemon-system libvirt-clients,主要负责管理 kvm
- bridge-utils 用来管理桥接网卡
启动 libvirtd:
systemctl start libvirtd && systemctl enable libvirtd
查看kvm服务是否正常:
virsh -c qemu:///system list
3. 创建桥接网卡(可选)
如果不创建桥接网卡,则默认网络模式为 nat,与其他虚拟机不互通。通过网卡桥接,可以使创建的虚拟机与宿主机处在同一网段。
首先确保需要桥接的网卡是一块有线网卡,无线网卡不支持,且有线网卡需要设置为 dhcp。
3.1 Ubuntu
3.1.1 新建网桥
- 命令行方式创建网桥(重启失效)
# 创建一块br0的网桥
brctl addbr br0
# 将物理网卡作为接口接在br0网桥上
brctl addif br0 enp2s0
# 给br0设置ip
ifconfig br0 172.21.9.199/24 up
- 配置文件方式创建网桥
修改 /etc/netplan/01-network-manager-all.yaml
文件
network:
version: 2
renderer: NetworkManager
ethernets:
enp2s0:
dhcp4: false
dhcp6: false
bridges:
br0:
interfaces: [enp2s0]
dhcp4: false
addresses: [172.21.9.199/24]
nameservers:
addresses: [114.114.114.114,8.8.8.8]
重新配置网络:
netplan apply
理论上是这样设置,但是不知为何我失败了......
3.1.2 创建qemu/kvm使用virsh网络
# 进入qume的网卡配置目录
cd /etc/libvirt/qemu/networks
# 创建br0的桥接网卡桥接在br0网桥-配置文件
cat > br0.xml <<EOF
<network>
<name>br0</name>
<uuid>e2527501-bba0-4576-85fb-e3b51629cef7</uuid>
<forward mode='bridge'/>
<bridge name='br0'/>
</network>
EOF
# 创建网卡、开启网卡、自启动网卡
virsh net-define br0.xml && \
virsh net-start br0 && \
virsh net-autostart br0
# 查看网卡信息
virsh net-list --all
3.2 Centos
3.2.1 新建网桥
原来的网卡ifcfg-eth0
配置:
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
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=38f146bb-9a35-4407-9071-936655c84307
DEVICE=br0
ONBOOT=yes
IPADDR=172.21.9.204
GATEWAY=172.21.9.254
NETMASK=255.255.255.0
DNS1=114.114.114.114
DNS2=8.8.8.8
需要先创建网桥 br0,然后将 eth0 桥接到 br0 上。
# 复制 eth0 配置文件
cp ifcfg-eth0 ifcfg-br0
ifcfg-eth0 修改,将原来网卡的静态ip改为none,并注释相关IP、网关配置,然后添加 BRIDGE=br0。
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
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=38f146bb-9a35-4407-9071-936655c84307
DEVICE=eth0
ONBOOT=yes
#IPADDR=172.21.9.204
#GATEWAY=172.21.9.254
#NETMASK=255.255.255.0
#DNS1=114.114.114.114
#DNS2=8.8.8.8
BRIDGE=br0
ifcfg-br0 修改为静态 ip 设置,并修改TYPE、NAME、UUID、DEVICE,最重要的这里 TYPE 要改为桥接。
TYPE=Bridge
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
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=br0
UUID=38f146bb-9a35-4407-9071-936655c84307
DEVICE=br0
ONBOOT=yes
IPADDR=172.21.9.204
GATEWAY=172.21.9.254
NETMASK=255.255.255.0
DNS1=114.114.114.114
DNS2=8.8.8.8
重启网卡:
systemctl restart network
3.2.2 创建qemu/kvm使用virsh网络
# 进入qume的网卡配置目录
cd /etc/libvirt/qemu/networks
# 创建br0的桥接网卡桥接在br0网桥-配置文件
cat > br0.xml <<EOF
<network>
<name>br0</name>
<uuid>e2527501-bba0-4576-85fb-e3b51629cef7</uuid>
<forward mode='bridge'/>
<bridge name='br0'/>
</network>
EOF
# 创建网卡、开启网卡、自启动网卡
virsh net-define br0.xml && \
virsh net-start br0 && \
virsh net-autostart br0
# 查看网卡信息
virsh net-list --all
4. 创建虚拟机
上传 centos7 镜像CentOS-7-x86_64-Minimal-2009.iso
到宿主姐的 opt 目录下。
virt-install \
--name=centos7 \
--virt-type=kvm \
--os-type=linux \
--os-variant=rhel7 \
--vcpus=4,maxvcpus=4 \
--memory=1024,maxmemory=2048 \
--location=/opt/CentOS-7-x86_64-Minimal-2009.iso \
--disk path=/var/lib/libvirt/images/centos7.qcow2,size=20,format=qcow2 \
--network bridge=br0 \
--graphics vnc,listen=0.0.0.0,port=5900 \
--noautoconsole
如果没有配置桥接,需要指定 --network network=default。
参数解释:
- --name:虚拟机名称
- --virt-type:要使用的管理程序名称,如 kvm、qemu、xen 等
- --os-type:针对一类操作系统优化虚拟机配置,如 linux、window
- --os-variant:针对特定操作系统变体 rhel7.0、win10 进一步优化虚拟机配置
- --vcpus=4:分配给虚拟机的 cpu 核数
- --memory=1024:分配给虚拟机的内存
- --location:安装源,有本地、nfs、http、ftp几种,多用于ks网络安装
- --disk: 使用不同选项作为磁盘使用安装介质
- --network: 设置网络(如:--network network=default,bridge=br0)
- --graphics:设置 vnc
- --noautoconsole:不要自动尝试连接到客户端控制台
三、安装 web 管理面板(可选)
docker run -d \
--name webvirtmgr \
-v /home/docker/webvirtmgr/data/:/data/ \
-e WEBVIRTMGR_ADMIN_USERNAME=admin \
-e WEBVIRTMGR_ADMIN_EMAIL=admin@local.domain \
-e WEBVIRTMGR_ADMIN_PASSWORD=password \
-p 8000:8000 \
--restart=always \
odivlad/webvirtmgr
进入容器生成 ssh 秘钥,并将公钥复制到宿主机。
# 进入容器
docker exec -it webvirtmgr bash
# 生成秘钥
ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa -q
# 设置免密登录,xxx 为宿主机 ip
ssh-copy-id -i ~/.ssh/id_rsa.pub xxx
接下来就可以使用 web 界面,以 ssh 的方式管理虚拟机了。
四、相关命令
- 基本操作
# 查看虚拟机
virsh list --all
# 开启虚拟机
virsh start centos7
# 关闭虚拟机
virsh shutdown centos7
# 重启虚拟机
virsh reboot centos7
# 删除虚拟机
virsh destroy centos7
- 快照
生成快照,快照文件位置 /var/lib/libvirt/qemu/snapshot/
。
进行快照之前需要确保磁盘格式必须是qcow2,因为raw格式是不支持快照的。
# 生成快照
virsh snapshot-create centos7 # 生成随机快照名称
virsh snapshot-create-as centos7 init-snapshot # 生成指定名称快照
# 删除快照
virsh snapshot-delete centos7 init-snapshot
# 查看快照信息
virsh snapshot-info centos7 init-snapshot
qemu-img info /var/lib/libvirt/images/centos7.qcow2
# 恢复快照
virsh snapshot-revert centos7 init-snapshot
# 删除快照
virsh snapshot-delete centos7 test
提醒:本文发布于742天前,文中所关联的信息可能已发生改变,请知悉!