大数跨境
0
0

虚拟机管理KVM基本操作

虚拟机管理KVM基本操作 云容灾备份安全治理
2020-11-13
1
导读:较多关注于Openstack,Ovirt,Ceph,K8S,Docker,GLusterFs,Ansile,

较多关注于Openstack,Ovirt,Ceph,K8S,Docker,GLusterFs,Ansile,Saltstack,Python,希望和大家分享和探讨。阅读本文需要对KVM有些了解,有问题可下方留言。\

一、KVM简介

1、基于内核的虚拟机 Kernel-based Virtual Machine(KVM)是一种内建于 Linux® 中的开源虚拟化技术。
具体而言,KVM 可帮助您将 Linux 转变为虚拟机监控程序,使主机计算机能够运行多个隔离的虚拟环境,
即虚拟客户机或虚拟机(VM)。

2、KVM Linux 的一部分。Linux 2.6.20 或更新版本包括 KVM。KVM 2006 年首次公布,并在一年后合
并到主流 Linux 内核版本中。由于 KVM 属于现有的 Linux 代码,因此它能立即享受每一项新的 Linux 功能、
修复和发展,无需进行额外工程。

二、KVM安装

注:不同发行版本,参考相应命令以及参数
yum -y install libvirt-daemon libvirt-client qemu-kvm libvirt-daemon-driver-qemu
# Install [virt-install virt-manager virt-v2v virt-p2v ]
# Libvirt-daemon libvirt守护进程
# Libvirt-client libvirt 用户端软件提供客户端管理命令
# qemu-kvm 提供底层仿真支持
# 最后一个是 libvirt连接qemu的驱动,当然不仅仅只是包含qemu的驱动,还有其他的
systemctl start libvirt && systemctl enable libvirt

三、虚拟机管理常用命令

virsh list [--all]	列出虚机[所有]
virsh net-list [--all] 列出正在使用的网络
virsh start [shutdown |reboot ] 虚机开机关机重启
virsh destory 强制硬关闭虚机
virsh define [undefine] 根据xml文件定义虚机删除虚机
virsh console 连接虚机console

常用的virsh管理命令
列出所有的虚拟机
}# virsh list --all

显示虚拟机信息
]# virsh dominfo CentOS-V6.5.23-server01

列出ID6的虚拟机名
]# virsh domname 6

显示虚拟机内存和cpu的使用情况
]# yum install virt-top -y
]# virt-top

显示虚拟机分区信息
]# yum install libguestfs-tools -y
]# virt-df $hostname

关闭虚拟机
]# virsh shutdown CentOS-V6.5.23-server01

强制关闭虚拟机
]# virsh destroy CentOS-V6.5.23-server01

启动虚拟机
]# virsh start CentOS-V6.5.23-server01

设置虚拟机随系统自启
]# virsh autostart CentOS-V6.5.23-server01

关闭虚拟机随系统自启
]# virsh autostart --disable CentOS-V6.5.23-server01

删除虚拟机
]# virsh undefine CentOS-V6.5.23-server01

通过控制窗口登录虚拟机
]# virsh console CentOS-V6.5.23-server01

挂起$hostname虚拟机
]# virsh suspend CentOS-V6.5.23-server01

恢复挂起的虚拟机
]# virsh resume CentOS-V6.5.23-server01

查看网卡配置信息
]# virsh domiflist CentOS-V6.5.23-server01
Interface Type Source Model MAC
-------------------------------------------------------
vnet0 network default rtl8139 52:54:00:90:0a:7a

查看该虚拟机的磁盘位置
]# virsh domblklist CentOS-V6.5.23-server01
Target Source
------------------------------------------------
hda /data/raw/disk01.raw
hdc -

查看KVM虚拟机当前配置
]# virsh dumpxml CentOS-V6.5.23-server01

--config, --live, --current
--config
使用--config时,只会修改对应虚拟机的XML配置。这个配置直到虚拟机下一次启动时才会生效。注意,使用virsh reboot domain并不会让新的设置生效!
--live
当使--live时,客户机(就是虚拟机)必须是活动状态,配置会立即生效。可以看到,如果使--live时,客户机没有启动,系统会报错的。而且,这时并没有将配置写到虚拟机的XML配置中,即,在虚拟机下一次启动时,这个配置就没了。
如果hypervisor支持的话,可以同时使用--config 和 --live。
--current
使用 --current时,会根据当前客户机的状态来生效。这个说的有点隐晦,实际上就是说,当客户机处于关闭状态时,它等价--config;当客户机处于运行状态时,它等价于--live。

四、网卡硬盘内存CPU存储池

# 管理虚拟机网卡
virsh attach-interface 添加网卡:
# virsh domiflist CentOS-V6.5.23-server01
Interface Type Source Model MAC
-------------------------------------------------------
vnet0 network default rtl8139 52:54:00:90:0a:7a

# virsh attach-interface CentOS-V6.5.23-server01 --type network --source default --model rtl8139 --live --config
Interface attached successfully

]# virsh domiflist CentOS-V6.5.23-server01
Interface Type Source Model MAC
-------------------------------------------------------
vnet0 network default rtl8139 52:54:00:90:0a:7a
vnet1 network default rtl8139 52:54:00:ae:84:d0

virsh detach-interface 删除网卡:
# virsh detach-interface CentOS-V6.5.23-server01 --type network --mac 52:54:00:00:34:55 --live --config
Interface detached successfully

# virsh domiflist CentOS-V6.5.23-server01
Interface Type Source Model MAC
-------------------------------------------------------
vnet0 network default rtl8139 52:54:00:90:0a:7a


# 管理虚拟机硬盘
新建raw格式虚拟盘
# qemu-img create -f raw /data/raw/disk02.raw 5G
Formatting '/data/raw/disk02.raw', fmt=raw size=5368709120
# qemu-img info /data/raw/disk02.raw
image: /data/raw/disk02.raw
file format: raw
virtual size: 5.0G (5368709120 bytes)
disk size: 0

挂载到虚拟机
# virsh attach-disk centosv6.5.23_01 [--source] /data/raw/disk02.raw sdb --subdriver=raw --live --config
Disk attached successfully

查看块设备

# virsh domblklist centosv6.5.23_01

Target Source
------------------------------------------------
hda /data/raw/disk01.raw
hdc -
sdb /data/raw/disk02.raw

从虚拟机卸载虚拟盘
# virsh detach-disk centosv6.5.23_01 [--target] sdc --live --config

# 管理虚拟机内存
virsh setmem 命令帮助:
# virsh setmem --help
NAME
setmem - change memory allocation
SYNOPSIS
setmem <domain> <size> [--config] [--live] [--current]
DESCRIPTION
Change the current memory allocation in the guest domain.
OPTIONS
[--domain] <string> domain name, id or uuid
[--size] <number> new memory size, as scaled integer (default KiB)
--config affect next boot
--live affect running domain
--current affect current domain

# 实验一下,调小一台虚拟机的内存:
# virsh dominfo centos_server01
Id: 6
Name: centos_server01
UUID: 9953497f-930f-fa61-a0dc-174f1872294e
OS Type: hvm
State: running
CPU(s): 2
CPU time: 6.7s
Max memory: 1048576 KiB
Used memory: 1048576 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: apparmor
Security DOI: 0
Security label: libvirt-9953497f-930f-fa61-a0dc-174f1872294e (enforcing)
[root@ubuntu ~]# virsh setmem centos_server01 --size 524288 --live --config
[root@ubuntu ~]# virsh dominfo centos_server01
Id: 6
Name: centos_server01
UUID: 9953497f-930f-fa61-a0dc-174f1872294e
OS Type: hvm
State: running
CPU(s): 2
CPU time: 26.9s
Max memory: 1048576 KiB
Used memory: 524288 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: apparmor
Security DOI: 0
Security label: libvirt-9953497f-930f-fa61-a0dc-174f1872294e (enforcing)
设置最大内存限制
virsh setmaxmem 命令帮助:
]# virsh setmaxmem --help
NAME
setmaxmem - change maximum memory limit

SYNOPSIS
setmaxmem <domain> <size> [--config] [--live] [--current]

DESCRIPTION
Change the maximum memory allocation limit in the guest domain.
OPTIONS
[--domain] <string> domain name, id or uuid
[--size] <number> new maximum memory size, as scaled integer (default KiB)
--config affect next boot
--live affect running domain
--current affect current domain

需要关闭虚拟机再配置
]# virsh setmaxmem centos_server01 1572864 --config
error: Unable to change MaxMemorySize
error: Requested operation is not valid: cannot resize the maximum memory on an active domain
]# virsh shutdown centos_server01
Domain centos_server01 is being shutdown
]# virsh setmaxmem centos_server01 1572864 --config
]# virsh dominfo centos_server01
Id: -
Name: centos_server01
UUID: 9953497f-930f-fa61-a0dc-174f1872294e
OS Type: hvm
State: shut off
CPU(s): 2
Max memory: 1572864 KiB
Used memory: 524288 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: apparmor
Security DOI: 0

#然后现在给他加大到1G
]# virsh setmem centos_server01 --size 1048576 --live --config
]# virsh dominfo centos_server01
Id: 5
Name: centos_server01
UUID: 9953497f-930f-fa61-a0dc-174f1872294e
OS Type: hvm
State: running
CPU(s): 2
CPU time: 30.5s
Max memory: 1572864 KiB
Used memory: 1048576 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: apparmor
Security DOI: 0
Security label: libvirt-9953497f-930f-fa61-a0dc-174f1872294e (enforcing)


# 管理虚拟机CPU
查看虚拟机CPU数量配置
]# virsh vcpucount centos_server01
maximum config 2
maximum live 2
current config 2
current live 2

配置虚拟机最大CPU个数限制
]# virsh setvcpus centos_server01 --maximum 4 --config
]# virsh vcpucount centos_server01
maximum config 4
maximum live 2
current config 2
current live 2

配置最大CPU个数限制需要重启后才能生效
ps: --maximum must be used with --config only
配置虚拟机CPU个数
]# virsh setvcpus centos_server01 --count 4 --config
[root@ubuntu8 ~]# virsh vcpucount centos_server01
maximum config 4
maximum live 2
current config 4
current live 2

虚拟机CPU在maximum live的限制内,可以通过--live参数直接生效
CPU可以在限制内热添加,但无法热减少,只能使用--config配置好后,等下次重启生效:
]# virsh setvcpus centos_server01 --count 2 --live
error: internal error: cannot change vcpu count of this domain

五、模板机制作以及克隆

# 虚拟机内部操作
# 1.禁用Selinux
setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 2.卸载防火墙以及NetworkManager
systemctl stop firewalld NetworkManager
systemctl disable firewalld NetworkManager
systemctl mask firewalld NetworkManager
systemctl start serial-getty@ttyS0.service
systemctl enable serial-getty@ttyS0.service
# 3.修改网卡
cat << EOF >>/etc/sysconfig/network-scripts/ifcfs-eth0
DEVICE="eth0"
ONBOOT="yes"
TYPE="Ethernet"
BOOTPROTO="static"
IPADDR="192.168.100.2"
NETMASK="255.255.255.0"
GATEWAY="192.168.100.1"
EOF
# 4.禁用空路由 使机器只能有一个网关
echo 'NOZEROCONF="yes"' > /etc/sysconfig/network
# 5.添加console 可以直接使用 virsh console host
vi /etc/default/grub
GRUB_SERIAL_COMMAND="serial --unit=1 --speed=115200"
GRUB_CMDLINE_LINUX="biosdevname=0 net.ifnames=0 console=tty0 console=ttyS0,115200"
grub2-mkconfig -o /boot/grub2/grub.cfg
# 6.修改挂载
sed -i 'UUID/c/dev/vda1/ defaults 0 0' /etc/fstab
echo 'GRUB_DISABLE_LINUX_UUID="true"' >> /etc/default/grub
echo 'GRUB_ENABLE_LINUX_LABEL="true"' >> /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg
# 7.安装分区扩容软件
yum install -y cloud-utils-growpart
echo 'LANG=en_US.UTF-8
growpart /dev/vda 1
xfs_growfs /
sed -i '
/LANG=en_US.UTF-8/d' /etc/rc.d/rc.local
sed -i '
/^growpart \/dev\/vda 1$/d' /etc/rc.d/rc.local
sed -i '
/xfs_growfs \//d' /etc/rc.d/rc.local
'
> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
# 8.安装常用软件
yum install -y net-tools vim lrzsz tree screen lsof tcp wget tcpdump nc mtr nmap openssl-devel ntpdate glances bash-completion psmisc
# 9.配置文件名描述符
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
echo "* soft nproc 65535" >> /etc/security/limits.conf
echo "* hard nproc 65535" >> /etc/security/limits.conf
# 10.历史命令
echo 'export HISTTIMEFORMAT=" %F %T `whoami` "' >> /etc/profile
source /etc/profile
# 11.内核参数优化
cat << EOF >> /etc/sysctl.conf
# 表示套接字由本端要求关闭,这个参数决定了它保持在FIN-wAIT-2状态的时间,默认值是60秒,建议调整为2,该参数对应系统路径为:/proc/sys/net/ipv4/tcp_fin_timeout 60
net.ipv4.tcp_fin_timeout = 2
# 表示开启TCP链接中TIME_WAIT sockets的快速回收,该参数对应系统路径为:/proc/sys/net/ipv4/tcp_tw_recycle,默认为0 表示关闭,不建议开>启,因为nat网络问题
net.ipv4.tcp_tw_reuse = 1
# reuse和recycle这俩个参数是为防止生产环境下web,squid等业务服务器time_wait网络状态数量过多设置的
net.ipv4.tcp_tw_recycle = 0
#表示开启SYN Cookies功能,当出现SYN等待队列溢出时,启用Cookies来处理,可防范少量SYN攻击,该参数对应系统路径为:/proc/sys/net/ipv4/tcp_syscookies,默认为1,表示开启
net.ipv4.tcp_syncookies = 1
# 关闭ipv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
# 避免放大攻击
net.ipv4.icmp_echo_ignore_broadcasts = 1
#允许系统打开的端口范围,不建议从1024开始,因为某些端口会存在10000以内。一般情况下已够用。
net.ipv4.ip_local_port_range = 10000 65000
EOF

# 清理模板机
# 清理模板机
history -c
ssh-copy-id 虚拟机IP
virsh shutdown 虚拟机名
virt-sysprep -d 虚拟机名
virsh undefine 虚拟机名
# 定制化清理
virt-sysprep --list-operations
virt-sysprep -a /data/kvm/template/tpl.qcow2 --hostname localhost --root-password password:testpwd

# 克隆脚本作者是我徒弟
# 仅供大家参考

# 可修改区域
TEMPLATEDIR=/vhost/template/
IMGDIR=/vhost/images/
XMLDIR=/vhost/xml/
NETDIR=/vhost/network/

# 后端盘 && 网络
function imgCreate(){
while true
do
read -e -p '请输入克隆主机名:' VMNAME
[[ ${VMNAME} = 'q' || ${VMNAME} = 'quit' || ${VMNAME} = 'exit' ]] && exit 0
if [[ ${VMNAME} =~ ^[a-z] ]];then
[[ -f ${IMGDIR}${VMNAME}.qcow2 ]] && echo "${VMNAME} 已存在,请重试" && continue
eval "qemu-img create -f qcow2 -b ${TEMPLATEDIR}template.qcow2 ${IMGDIR}${VMNAME}.qcow2" &> /dev/null
fi
break
done
}

# XML修改
function xmlModify(){
eval "cp ${TEMPLATEDIR}template.xml ${XMLDIR}${VMNAME}.xml"
$(sed -i "s/centos7/${VMNAME}/g" ${XMLDIR}${VMNAME}.xml)
$(sed -i "#source#s#<source.*\/>#<source file=${IMGDIR}${VMNAME}.qcow2>#" template.xml)
virsh define ${XMLDIR}${VMNAME}.xml &> /dev/null
}
# 配置IP
function ipConfigure(){
read -e -p '请输入克隆IP地址:' VMNET
[[ ${VMNET} = 'q' || ${VMNET} = 'quit' || ${VMNET} = 'exit' ]] && exit 0
$(cat ${TEMPLATEDIR}template.eth0 > ${NETDIR}ifcfg-eth0)
$(sed -i "s/IPADDR=/IPADDR=${VMNET}/g" ${NETDIR}ifcfg-eth0)
eval "virt-copy-in -d ${VMNAME} ${NETDIR}ifcfg-eth0 /etc/sysconfig/network-scripts/"
eval "virsh start ${VMNAME}" &> /dev/null
HOSTS="${VMNET} ${VMNAME}"
eval " echo ${HOSTS} >> /etc/hosts"
}

# 返回
function msgReturn(){
eval "clear"
echo -e "\033[36m /******************************************************** \033[0m"
echo -e "\033[31m 虚拟机名字:${VMNAME} \033[0m"
echo -e "\033[31m 虚拟机地址:${VMNET} \033[0m"
echo -e "\033[31m 虚拟机密码:1 \033[0m"
echo -e "\033[31m 虚拟机配置:2C4G \033[0m"
echo -e "\033[31m 虚拟机连接:ssh ${VMNET} \033[0m"
echo -e "\033[36m ********************************************************/ \033[0m"
sleep 5
eval "clear"
}

# 主模块
function main(){
imgCreate
xmlModify
ipConfigure
msgReturn
}

trap main EXIT

Libvirt 调优

一、CPU缓存区域
# 对于物理 CPU,同一个 core 的 threads 共享 L2 Cache,同一个 socket 的 cores 共享 L3 cache,所以虚拟机的 vcpu 应当尽可能在同一个 core 和 同一个 socket 中,增加 cache 的命中率,从而提高性能。IBM 测试过,合理绑定 vcpu 能给 JVM 来的 16% 的性能提升[2]。
# 实现策略:虚拟机 vcpu 尽可能限定在一个 core 或者一个 socket 中。例如:当 vcpu 为 2 时,2 个 vcpu 应限定在同一个 core 中,当 vcpu 大于 2 小于 12 时,应限定在同一个 socket 中
<vcpu placement='static' cpuset='0-5'>4</vcpu> # cpuset 限定 vcpu

二、NUMA调整
# 2 个 vcpu 分别绑定到不同 numa 节点的非超线程核上和分配到一对相邻的超线程核上的性能相差有 30%~40%(通过 SPEC CPU2006 工具测试)。可见,同一个虚拟机的 vcpu 需限定在同一个 NUMA 节点,并且分配该 NUMA 节点下的内存给虚拟机,保证虚拟机尽可能访问 local memory 而非 remote memory。
<numatune>
<memory mode="preferred" nodeset="0"/>
</numatune>

三、磁盘IO调整

# kvm 支持多种虚拟机多种 IO Cache 方式:writeback, none, writethrough 等。性能上:writeback > none > writethrough,安全上 writeback < none < writethrough。For the best storage performance on guest operating systems that use raw disk volumes or partitions, completely avoid the page cache on the host[2].
# writeback mode在mail server这种小文件 高io的服务器上,其性能是很差的,none模式大部分情况要比writethrough性能稍好一点,所以选择none。
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='none'/> # cache 可为 writeback, none, writethrough,directsync,unsafe 等
...
</disk>

# 半虚拟化io设备,针对cpu和内存,kvm全是全虚拟化设备,而针对磁盘和网络,则出现了半虚拟化io设备,目的是标准化guest和host之间数据交换接口,减少交互流程和内存拷贝,提升vm io效率,可以在libvirt xml中设置,disk中加入
<target dev='vda' bus='virtio'/>

# 异步读写,分别包括Native aio: kernel AIO 和 threaded aio: user space AIO emulated by posix thread workers,内核方式要比用户态的方式性能稍好一点,所以一般情况都选择native
<driver name='qemu' type='qcow2' cache='none' aio='native'/>

# deadline:per-device IO queue,较好实时性,较好aggregate throughput,不够公平,当某些vm有大量io操作,占用了大量io资源时,其它后加入的vm很有可能抢占不到io资源。
echo cfq > /sys/block/sdb/queue/scheduler

四、关闭内存共享
# 1.禁止某个 Guest 与其它 Guest 共享内存,XML 文件可配置为
<memoryBacking>
<nosharepages/>
</memoryBacking>

# 2. 禁止所有 Guest 直接共享内存,Host 配置为
echo 0 > /sys/kernel/mm/ksm/pages_shared
echo 0 > /sys/kernel/mm/ksm/pages_sharing

五、打开透明大页
# 1) 允许某个 Guest 开启透明大页

Guest XML Format
<memoryBacking>
<hugepages/>
</memoryBacking>

echo 25000 > /pro c/sys/vm/nr_hugepages
mount -t hugetlbfs hugetlbfs /dev/hugepages
service libvirtd restart

# 2) 允许 Host 中所有 Guest 开启透明大页

echo always > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo 0 > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag


【声明】内容源于网络
0
0
云容灾备份安全治理
分享云灾备规划、实施、运营、备份与恢复、数据安全、数据治理;窥视国内外备份软件与监控软件知识前沿水平线; 越努力,越幸运!
内容 2171
粉丝 0
云容灾备份安全治理 分享云灾备规划、实施、运营、备份与恢复、数据安全、数据治理;窥视国内外备份软件与监控软件知识前沿水平线; 越努力,越幸运!
总阅读4.1k
粉丝0
内容2.2k