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

本文地址 Centos下libvirt/KVM的基本使用 转载请注明出处