kvm-新
KVM
IBM,文档:http://www.ibm.com/developerworks/cn/linux/l-using-kvm/
lxd容器虚拟化:https://linuxcontainers.org/lxd/introduction/
准备前
安装系统时,关闭网卡自动命名,装完系统网卡名为eth0
关闭selinux 防火墙
systemctl disable firewalld
systemctl disable NetworkManager
准备前配置好网卡IP
bond0=eth0+eth1
yum install bridge-utils -y
[root@Final network-scripts]# cat ifcfg-eth0
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
NM_CONTROLLED=no
MASTER=bond0
USERCTL=no
SLAVE=yes
[root@Final network-scripts]# cat ifcfg-eth1
BOOTPROTO=none
NAME=eth1
DEVICE=eth1
ONBOOT=yes
NM_CONTROLLED=no
MASTER=bond0
USERCTL=no
SLAVE=yes
[root@Final network-scripts]# cat ifcfg-bond0
BOOTPROTO=static
NAME=bond0
DEVICE=bond0
TYPE=Bond
BONDING_MASTER=yes
BOOTPROTO=static
ONBOOT=yes
BONDING_OPTS="mode=0 miimon=500"
BRIDGE=br0
[root@Final network-scripts]# cat ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.10.254
NETMASK=255.255.255.0
[root@Final network-scripts]# cat ifcfg-eth2
TYPE=Ethernet
BOOTPROTO=dhcp
DEFROUTE=yes
NAME=eth2
DEVICE=eth2
ONBOOT=yes
NM_CONTROLLED=no
注:弄了半天网卡服务起不来
eth2用dhcp的地址,要加NM_CONTROLLED=no
若网卡服务起不来,使用journalctl -f -u network 查看日志
1、确认CPU已经支持虚拟化,intel的CPU虚拟化技术交vmx,AMD的CPU交svm
grep -E "vmx|svm" /proc/cpuinfo
2、安装kvm平台及工具包及桌面
yum -y install qemu-kvm qemu-kvm-tools libvirt virt-manager virt-install
yum groupinstall "GNOME Desktop" -y
注安装桌面环境若有问题
file /boot/efi/EFI/centos from install of fwupdate-efi-12-5.el7.centos.x86_64 conflicts with file from package grub2-common-1:2.02-0.65.el7.centos.2.noarch
Error Summary
解决方法
yum update grub2-common -y
3、启动 libvirtsd 并设置为开机启动,librirtd 会创建一个桥接的网卡 virbr0 而且 IP 地址是 192.168.122.1
systemctl start libvirtd
systemctl enable libvirtd
ifconfig virbr0
4、为虚拟机分配 IP 地址的服务
ps -aux | grep dns
5、创建磁盘
qemu-img create -f raw /opt/CentOS-7-x86_64.raw 10G #创建一个格式为raw大小为10G的裸磁盘
qemu-img create -f qcow2 /var/lib/libvirt/images/centos7.5.qcow2 50G #创建一个稀疏格式为qcow2大小为50G的裸磁盘
6、开始安装
#virsh-install命令帮助:
[root@linux-node1 ~]# virt-install --help
usage: virt-install --name NAME --ram RAM STORAGE INSTALL [options]
使用指定安装介质新建虚拟机。
optional arguments:
-h, --help show this help message and exit
--version show program's version number and exit
--connect URI 使用 libvirt URI 连接到 hypervisor
通用选项:
-n NAME, --name NAME 客户端事件名称
--memory MEMORY 配置虚拟机内存分配。例如:
--memory 1024 (in MiB)
--memory 512,maxmemory=1024
--vcpus VCPUS 为虚拟机配置的 vcpus 数。例如:
--vcpus 5
--vcpus 5,maxcpus=10,cpuset=1-4,6,8
--vcpus sockets=2,cores=4,threads=2,
--cpu CPU CPU 型号及功能。例如:
--cpu coreduo,+x2apic
--cpu host
--metadata METADATA 配置虚拟机元数据。例如:
--metadata name=foo,title="My pretty title",uuid=...
--metadata description="My nice long description"
安装方法选项:
--cdrom CDROM 光驱安装介质
-l LOCATION, --location LOCATION
安装源(例如:nfs:host:/path、http://host/path
ftp://host/path)
--pxe 使用 PXE 协议从网络引导
--import 在磁盘映像中构建虚拟机
--livecd 将光驱介质视为 Live CD
-x EXTRA_ARGS, --extra-args EXTRA_ARGS
附加到使用 --location 引导的内核的参数
--initrd-inject INITRD_INJECT
使用 --location 为 initrd 的 root
添加给定文件
--os-variant DISTRO_VARIANT
在其中安装 OS 变体的虚拟机,比如
'fedora18'、'rhel6'、'winxp' 等等。
--boot BOOT 配置虚拟机引导设置。例如:
--boot hd,cdrom,menu=on
--boot init=/sbin/init (for containers)
--idmap IDMAP 为 LXC 容器启用用户名称空间。例如:
--idmap uid_start=0,uid_target=1000,uid_count=10
设备选项:
--disk DISK 使用不同选项指定存储。例如:
--disk size=10 (new 10GiB image in default location)
--disk /my/existing/disk,cache=none
--disk device=cdrom,bus=scsi
--disk=?
-w NETWORK, --network NETWORK
配置虚拟机网络接口。例如:
--network bridge=mybr0
--network network=my_libvirt_virtual_net
--network network=mynet,model=virtio,mac=00:11...
--network none
--network help
--graphics GRAPHICS 配置虚拟机显示设置。例如:
--graphics vnc
--graphics spice,port=5901,tlsport=5902
--graphics none
--graphics vnc,password=foobar,port=5910,keymap=ja
--controller CONTROLLER
配置虚拟机控制程序设备。例如:
--controller type=usb,model=ich9-ehci1
--input INPUT 配置虚拟机输入设备。例如:
--input tablet
--input keyboard,bus=usb
--serial SERIAL 配置虚拟机串口设备
--parallel PARALLEL 配置虚拟机并口设备
--channel CHANNEL 配置虚拟机沟通频道
--console CONSOLE 配置虚拟机与主机之间的文本控制台连接
--hostdev HOSTDEV 将物理 USB/PCI/etc
主机设备配置为与虚拟机共享
--filesystem FILESYSTEM
将主机目录传递给虚拟机。例如:
--filesystem /my/source/dir,/dir/in/guest
--filesystem template_name,/,type=template
--sound [SOUND] 配置虚拟机声音设备模拟
--watchdog WATCHDOG 配置虚拟机 watchdog 设备
--video VIDEO 配置虚拟机视频硬件。
--smartcard SMARTCARD
配置虚拟机智能卡设备。例如:
--smartcard mode=passthrough
--redirdev REDIRDEV 配置虚拟机重定向设备。例如:
--redirdev usb,type=tcp,server=192.168.1.1:4000
--memballoon MEMBALLOON
配置虚拟机 memballoon 设备。例如:
--memballoon model=virtio
--tpm TPM 配置虚拟机 TPM 设备。例如:
--tpm /dev/tpm
--rng RNG 配置虚拟机 RNG 设备。例如:
--rng /dev/random
--panic PANIC 配置虚拟机 panic 设备。例如:
--panic default
虚拟机配置选项:
--security SECURITY 设定域安全驱动器配置。
--numatune NUMATUNE 为域进程调整 NUMA 策略。
--memtune MEMTUNE 为域进程调整内粗策略。
--blkiotune BLKIOTUNE
为域进程调整 blkio 策略。
--memorybacking MEMORYBACKING
为域进程设置内存后备策略。例如:
--memorybacking hugepages=on
--features FEATURES 设置域 <features> XML。例如:
--features acpi=off
--features apic=on,eoi=on
--clock CLOCK 设置域 <clock> XML。例如:
--clock offset=localtime,rtc_tickpolicy=catchup
--pm PM 配置 VM 电源管理功能
--events EVENTS 配置 VM 生命周期管理策略
--resource RESOURCE 配置 VM 资源分区(cgroups)
虚拟化平台选项:
-v, --hvm 客户端应该是一个全虚拟客户端
-p, --paravirt 这个客户端一个是一个半虚拟客户端
--container 这台虚拟机需要一个容器客户端
--virt-type HV_TYPE 要使用的管理程序名称(kvm、qemu、xen
等等)
--arch ARCH 模拟的 CPU 构架
--machine MACHINE 要模拟的机器类型
其它选项:
--autostart 引导主机时自动启动域。
--wait WAIT 等待安装完成的分钟数。
--noautoconsole 不要自动尝试连接到客户端控制台
--noreboot 完成安装后不要引导虚拟机。
--print-xml [XMLONLY]
输出所生成域 XML,而不是创建虚拟机。
--dry-run 完成安装步骤,但不要创建设备或者定义
虚拟机。
--check CHECK 启用或禁用验证检查。例如:
--check path_in_use=off
--check all=off
-q, --quiet 禁止无错误输出
-d, --debug 输入故障排除信息
使用 '--option=?' 或者 '--option help' 查看可用子选项
有关示例及完整选项语法,请查看 man page。
- 默认网络
[root@linux-node1 ~]# virt-install --virt-type kvm --name CentOS-7-x86_64 --ram 1024 --cdrom=/opt/CentOS-7-x86_64-DVD-1511.iso --disk path=/opt/CentOS-7-x86_64.raw --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
- 桥接网络:
virt-install --virt-type kvm --name openstack-middleware1 --ram 1024 --vcpus 4 --cdrom=/ISO/CentOS-7-x86_64-DVD-1804.iso --disk path=/var/lib/libvirt/images/centos7.5.qcow2 --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
- 安装Windows:
qemu-img create -f qcow2 /var/lib/libvirt/images/Windows-2008_r2-x86_64.qcow2 200G
virt-install --virt-type kvm --name Win_2008_r2-x86_64 --ram 3072 --vcpus=2 --os-type=windows --cdrom=/usr/local/src/windows_server_2008_r2.iso --disk path=/var/lib/libvirt/images/Windows-2008_r2-x86_64.qcow2,format=qcow2,bus=virtio --disk path=/usr/local/src/virtio-win-0.1.141_amd64.vfd,device=floppy --network bridge=br0,model=virtio --graphics vnc,listen=0.0.0.0 --noautoconsole
开始安装......
我们可以用VNC客户端来连接
- 注:若SSH连接很慢
1、使用了 dns 反查,这样的话当 ssh 某个 IP 时,系统会试图通过 DNS 反查相对应的域名,如果 DNS 中没有这个 IP 的域名解析,则会等到 DNS 查询超时才会进行下一步,消耗很长时间
vim /etc/ssh/sshd_config
UseDNS no
默认情况下会有一行被注释掉的记录 #UseDNS yes,虽然这条记录被注释掉了,但 ssh 缺省情况下 UseDNS 的值是 yes,所以要显式的指定该值为 no
重新启动 ssh 服务
service sshd restart
2、这种情况在本地主机或远程主机启动图形的情况下比较明显,该参数似乎是在做图形方面的认证,具体功能还不清楚,但修改以后可以明显提高 ssh 远程登录速度
修改 GSSAPIAuthentication 参数为 no,默认是 yes
重新启动 ssh 服务
service sshd restart
虚拟机磁盘的格式
根据存储数据方式的不同可以分为两种格式,一种是稀疏模式。一种是全镜像模式,全镜像模式无法做快照,IO 层面是有 qemu 模拟的,CPU 和内存是有 KVM 实现的,以下是 KVM 的功能:
KVM 所支持的功能包括:
- 支持CPU 和 memory 超分(Overcommit)
- 支持半虚拟化I/O (virtio)
- 支持热插拔 (cpu,块设备、网络设备等)
- 支持实时迁移(Live Migration)
- 支持 PCI 设备直接分配和 单根I/O 虚拟化 (SR-IOV)
- 支持 内核同页合并 (KSM )
- 支持 NUMA (Non-Uniform Memory Access,非一致存储访问结构
磁盘格式的转换
https://www.ibm.com/developerworks/cn/linux/l-cn-mgrtvm3/index.html
raw 转换为 qcow2
qemu-img convert -f raw centos.img -O qcow2 centos.qcow2
qcow2 转换为 raw
qemu-img convert -O qcow2 my.raw myqow.qcow
VMDK 转换为 qcow2
qemu-img convert -f vmdk -O qcow2 xxx.vmdk xxx.img
查看磁盘详细信息
qemu-img info xxx.raw #查看raw格式的磁盘信息
qemu-img info xxx.qcow #查看qcow格式的磁盘信息
宿主机的优化
全虚拟化和半虚拟化,内核态 Ring 0 可以直接访问周边的硬件设备,CPU、内存、网卡和硬盘等,应用运行在 Ring 3 是用户态,用户态不能直接操作硬件,如果要操作硬件会产生系统调用,客户端的操作系统不能工作在 Ring 0,因此 Intel 提供 vt-x 提供加速上下文切换,KVM 在系统里面是一个 qemu 进程,进程要受到 CPU 的调度,在多核 CPU 进程可能会被调度到任意 CPU 核心,CPU 的一级缓存是使用静态内存做的,二级缓存是使用高速的动态内存,缓存是将经常访问的数据缓存下来以加速访问速度,将进程绑定在一个 CPU 可以提高缓存的命中率:
CPU 绑定优化
taskset --help
用法:taskset [选项] [掩码 | cpu列表] [pid|命令 [参数...]]
选项:
-a, --all-tasks 在给定 pid 的所有任务(线程)上操作
-p, --pid 在存在的给定 pid 上操作
-c, --cpu-list 以列表格式显示和指定 CPU
-h, --help 显示此帮助
-V, --version 输出版本信息
默认行为是运行一条新命令:
taskset 03 sshd -b 1024
您可以获取现有任务的掩码:
taskset -p 700
或设置掩码:
taskset -p 03 700
使用逗号分隔的列表格式而不是掩码:
taskset -pc 0,3,7-11 700
列表格式中的范围可以带一个跨度参数:
例如 0-31:2 与掩码 0x55555555 等效
taskset -cp 2 42340 #将进程号为42340的进程指定运行在第二核心CPU
内存优化
内存 EPT 技术:
系统将内存识别为虚拟内存,包含物理内存和交换分区,KVM 是一个进程,EPT 是 Intel 用于加快内存映射的技术
大页内存,加快内存寻址:
cat /proc/meminfo
...
Hugepagesize: 2048 kB #Centos 7默认已开启
开启内存合并
cat /sys/kernel/mm/transparent_hugepage/enabled #将连续的没有使用的内存合并为2M一个表,减少内存碎片
IO 优化
使用 virtIO 半虚拟化的 IO 技术,让磁盘知道其运行在虚拟机环境当中
磁盘的调度算法
顺序读写远大于随机读写,系统的 IO 调度器是
cat /sys/block/sda/queue/scheduler #Centos 7 默认只有 3 个,Centos 6 有 4 个
noop:不进行调度,用于 SSD
[deadline]:最后期限算法,防止写操作因为不能读取而被饿死的情况
cfq:完全公平,公平分配 IO 访问,Centos 6 的默认算法
写入磁盘的几种方式
writeback:同时使用了虚拟机和物理机的 pagecache,会被同时写入到虚拟机和物理机的 pagecache 在写入到物理磁盘缓存,这种方式写入速度快但是假如突然断电会导致出现数据丢失而导致数据一致性出现问题,本方式性能最好但是不安全。
None:将数据直接写入到物理磁盘缓存在写入磁盘,速度次于 writeback。
writethrough:直接写入到物理磁盘,突然断电的话数据丢失最少,但是速度比较慢,因为绕过了上面的两层 pagecache 即没有使用缓存。
web 站点适用于使用 writeback,即读多写少的情况,对于需要提供数据安全的场景必须数据库等推荐使用 writethrough,KVM 默认就是使用的 writethrough:
注:此笔记部分为摘录