Centos下libvirt/KVM的基本使用
KVM (Kernel-based Virtual Machine) 是 Linux 内核中的一个虚拟机, 具体原理不懂.
使用 KVM 的前提
硬件支持
grep -E "(vmx|svm)" /proc/cpuinfo
如果没有输出, 则不能使用 KVM
加载内核模块
lsmod | grep kvm
查看是否已经加载
安装KVM及相关软件
主要使用 libvirt
yum -y install qemu-kvm libvirt virt-install bridge-utils
systemctl start libvirtd
systemctl enable libvirtd
理论上这个时候 KVM 内核模块已经加载, 并且 libvirtd 已经启动.
网络
经过上面的步骤, 使用 ip ad
能够看到多了 virbr0 这个网桥 (网桥介绍可以参考这里Bridge一节)
使用 brctl
(bridge-utils套件提供) 命令可以看到更多详细信息
# brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.525400c96ae2 yes virbr0-nic
这个网桥连接多个网络设备, 这里用于链接宿主机和虚拟机.
默认的这个网络设备使用了NAT的方式给虚拟机系统访问网络的能力, 查看NAT的具体配置可使用 virsh net-dumpxml default
命令. 可以看到网桥的地址, DHCP的地址范围以及NAT的端口范围.
<network>
<name>default</name>
<uuid>9698a2c1-c8a1-4ec3-8cc3-0a8edebab6c4</uuid>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:c9:6a:e2'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
NAT的功能也借助了iptables, 查看iptables规则, 可以看到一堆规则
-A INPUT -i virbr0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT
-A FORWARD -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT
-A FORWARD -i virbr0 -o virbr0 -j ACCEPT
-A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -o virbr0 -p udp -m udp --dport 68 -j ACCEPT
可以使用 virsh net-edit default
修改相关参数
总之, 这个就是为了给虚拟机上网用的.
创建虚拟机
这里使用在线安装的方式安装 Centos7, 下面是安装命令
virt-install \
--name centos7 \
--ram 1024 \
--disk path=/var/kvm/images/centos7.img,size=30 \
--vcpus 2 \
--os-type linux \
--os-variant rhel7 \
--network bridge=virbr0 \
--graphics none \
--console pty,target_type=serial \
--location 'http://ftp.iij.ad.jp/pub/linux/centos/7/os/x86_64/' \
--extra-args 'console=ttyS0,115200n8 serial'
上面这些参数都可以参考字面意思, 简单概括: 从 http://ftp.iij.ad.jp/pub/linux/centos/7/os/x86_64/
这个源创建一台1G内存, 2核CPU, 30G硬盘, 系统名称为 centos7 的虚拟机.
因为使用ssh连接到的远程宿主机, 只能用 Text Mode 进行安装, 一路安装就可以.
nest
有时我们需要在虚拟机里再安装虚拟机, 这个时候就需要开启 KVM 的嵌套功能
查看是否开启 cat /sys/module/kvm_intel/parameters/nested
如果是 N 说明没有开启, 可以卸载内核模块再使用额外参数加载模块
modprobe -r kvm-intel
modprobe kvm-intel nested=1
这种方式宿主机重启就又会失效, 如果想一直生效, 在grub启动参数中添加 kvm-intel.nested=1
即可.
参考:
KVM-FAQ
Archlinux-wiki-KVM
Server World-Centos7-KVM