我们不可能好多操作都是通过vnc这种图形化的方式去操作,那样是很影响效率的,所以我们要掌握一些常用的命令操作以辅助我们的管理。

一、virsh命令

libvirt带的一个命令virsh,是一个管理虚拟机的命令。

virsh既有命令行模式,也有交互模式,在命令行直接输入virsh就进入交互模式,virsh 后面跟命令参数,则是命令行模式。

# virsh --help  #首先查看一下帮助
virsh [options]... []
virsh [options]... [args...]
管理域:
attach-device                #从一个XML文件附加装置
attach-disk                   #附加磁盘设备
attach-interface           #附加网络界面
autostart                      #让一个域开机自启动
blkdeviotune               #设置或查询块设备I / O调整参数。
blkiotune                     #获取或设置blkio参数
blockcommit                #启动块提交操作。
blockcopy                     #开始块复制操作。
blockjob                       #管理活动块操作
blockpull                      #从其支持映像填充磁盘。
blockresize                   #调整域的块设备大小。
change-media             #更换CD或软盘驱动器的介质
console                        #连接到客户机控制台
cpu-baseline                #计算基准CPU
cpu-compare               #将主机CPU与由XML文件描述的CPU进行比较
cpu-stats                      #显示域cpu统计信息
create                           #从XML文件创建域
define                          #从XML文件定义(但不启动)域
desc                             #显示或设置域的描述或标题
destroy                         #销毁(停止)域
detach-device              #从XML文件中分离设备
detach-disk                  #分离磁盘设备
detach-interface          #分离网络接口
domdisplay                   #域显示连接URI
domfsfreeze                  #冻结域的挂载文件系统。
domfsthaw                    #解冻域的已安装的文件系统。
domfsinfo                      #获取域的已装载文件系统的信息。
domfstrim                     #在域的已装载文件系统上调用fstrim。
domhostname               #打印域的主机名
domid                           #将域名或UUID转换为域ID
domif-setlink                 #设置虚拟接口的链路状态
domiftune                     #获取/设置虚拟接口的参数
domjobabort                 #中止活动域作业
domjobinfo                    #域作业信息
domname                       #将域id或UUID转换为域名
domrename                    #重命名域
dompmsuspend              #使用电源管理功能正常挂起域
dompmwakeup               #从暂停状态唤醒域
domuuid                          #将域名或ID转换为域UUID
domxml-from-native        #将本机配置转换为域XML
domxml-to-native            #将域XML转换为本地配置
dump                               #将域的核心转储到文件以供分析
dumpxml                         #XML中的域信息
edit                                   #编辑域的XML配置
event                                 #域事件
inject-nmi                         #向来宾用户注入NMI
iothreadinfo                     #视图域IO线程
iothreadpin                      #控制域IO线程亲和性
iothreadadd                      #向域添加IO线程
iothreaddel                       #从来域中删除IO线程
send-key                           #向访客发送键码
send-process-signal           #向进程发送信号
lxc-enter-namespace           #LXC访客输入命名空间
managedsave                       #托管保存域状态
managedsave-remove            #删除域的托管保存
memtune                              #获取或设置内存参数
perf                                      #获取或设置perf事件
metadata                             #显示或设置域的自定义XML元数据
migrate                                #将域迁移到另一个主机
migrate-setmaxdowntime        #设置最大容许停机时间
migrate-compcache               #获取/设置压缩缓存大小
migrate-setspeed                #设置最大迁移带宽
migrate-getspeed                #获取最大迁移带宽
migrate-postcopy                #将正在运行的迁移从预拷贝切换到后拷贝
numatune                            #获取或设置numa参数
qemu-attach                        #qemu附加
qemu-monitor-command        #qemu监控命令
qemu-monitor-event              #qemu监事事件
qemu-agent-command           #qemu客户端命令
reboot                                     # 重新启动一个域
reset                                         #重置域
restore                                      #从一个存在的文件中的状态恢复一个域
resume                                      #恢复域
save                                            #将域状态保存到文件
save-image-define                   #重新定义域的已保存状态文件的XML
save-image-dumpxml             #以XML格式保存状态域信息
save-image-edit                       #编辑域的已保存状态文件的XML
schedinfo                                   #显示/设置调度程序参数
screenshot                                 #获取当前域控制台的屏幕截图并将其存储到文件中
set-user-password                     #在域内设置用户密码
setmaxmem                                #更改最大内存限制
setmem                                       #改变内存分配
setvcpus                                       #更改虚拟CPU的数量
shutdown                                     #正常关闭域
start                                              #启动(先前定义的)非活动域
suspend                                       #挂起域
ttyconsole                                    #tty控制台
undefine                                     #取消定义域
update-device                             #从XML文件更新设备
vcpucount                                   # 域vcpu计数
vcpuinfo                                       #详细域vcpu信息
vcpupin                                       #控制或查询域vcpu亲和性
emulatorpin                                #控制或查询域仿真器亲和性
vncdisplay                                    #vnc显示
guestvcpus                                    #查询或修改guest虚拟机中vcpu的状态(通过代理)
域监视:
domblkerror                                #在块设备上显示错误
domblkinfo                                 #域块设备大小信息
domblklist                                   #列出所有域块
domblkstat                                  #获取域的设备块统计信息
domcontrol                                 #域控制接口状态
domif-getlink                              #获取虚拟接口的链路状态
domifaddr                                   #获取运行域的网络接口地址
domiflist                                       #列出所有域虚拟接口
domifstat                                      #获取域的网络接口统计信息
dominfo                                       #域信息
dommemstat                                #获取域的内存统计信息
domstate                                      #域状态
domstats                                       #获取有关一个或多个域的统计信息
domtime                                       #域时间
list                                                  #域列表
主机和管理程序:
allocpages                                      #操作页面池大小
capabilities                                      #性能
cpu-models                                     #CPU型号
domcapabilities                               #域性能
freecell                                              #NUMA可用内存
freepages                                          #NUMA空闲页面
hostname                                          #打印管理程序主机名
maxvcpus                                           #连接最大vcpu
node-memory-tune                          #获取或设置节点内存参数
nodecpumap                                    #节点cpu映射
nodecpustats                                    #打印节点的cpu统计信息。
nodeinfo                                          #节点信息
nodememstats                                 #打印节点的内存统计信息。
nodesuspend                                   #将主机节点暂停给定的持续时间
sysinfo                                              #打印管理程序sysinfo
uri                                                      #打印管理程序规范URI
version                                              #显示版本
接口:
iface-begin                                          #创建当前接口设置的快照,可以稍后提交(iface-commit)或还原(iface-rollback)
iface-bridge                                       #创建桥接设备并将现有网络设备连接到它
iface-commit                                       #提交自iface-begin和自由恢复点以来的更改
iface-define                                          #定义不活动的持久物理主机接口或从XML文件修改现有的持久物理主机接口
iface-destroy                                         #销毁物理主机接口(禁用它/“if-down”)
iface-dumpxml                                   #接口信息
iface-edit                                            #编辑物理主机接口的XML配置
iface-list                                              #列出物理主机接口
iface-mac                                           #将接口名称转换为接口MAC地址
iface-name                                         #将接口MAC地址转换为接口名称
iface-rollback                                      #回滚到通过iface-begin创建的先前保存的配置
iface-start                                          #启动物理主机接口(启用它/“if-up”)
iface-unbridge                                   #在分离其从设备之后取消定义桥设备
iface-undefine                                #取消定义物理主机接口(将其从配置中删除)
网络过滤器:
nwfilter-define                                     #从XML文件定义或更新网络过滤器
nwfilter-dumpxml                           #网络过滤器信息
nwfilter-edit                                     #编辑网络过滤器的XML配置
nwfilter-list                                       #列出网络过滤器
nwfilter-undefine                            #取消定义网络过滤器
网络:
net-autostart                                     #自动启动网络
net-create                                         #从XML文件创建网络
net-define                                         #定义不活动的持久性虚拟网络或从XML文件修改现有的持久性虚拟网络
net-destroy                                         #销毁(停止)网络
net-dhcp-leases                                #打印指定网络的租借信息
net-dumpxml                                     #导出网络信息
net-edit                                                #编辑网络的XML配置
net-event                                             #网络事件
net-info                                              #网络信息
net-list                                                #列表网络
net-name                                           #将网络UUID转换为网络名称
net-start                                              #启动(先前定义的)非活动网络
net-undefine                                      #取消定义持久网络
net-update                                         #更新现有网络配置的部分
net-uuid                                             #将网络名称转换为网络UUID
节点设备:
nodedev-create                                   #创建由节点上的XML文件定义的设备
nodedev-destroy                                  #销毁(停止)节点上的设备
nodedev-detach                                    #从其设备驱动程序中分离节点设备
nodedev-dumpxml                               #节点设备详细信息
nodedev-list                                           #枚举此主机上的设备
nodedev-reattach                                  #将节点设备重新挂接到其设备驱动程序
nodedev-reset                                        #复位节点设备
保密:
secret-define                                            #定义或修改XML文件中的密钥
secret-dumpxml                                     #XML中的秘密属性
secret-get-value                                     #输出密值
secret-list                                                 #列表秘密
secret-set-value
secret-undefine
快照:
snapshot-create                                          #从XML创建快照
snapshot-create-as                                      #从一组args创建快照
snapshot-current                                           #获取或设置当前快照
snapshot-delete                                           #删除域快照
snapshot-dumpxml                                       #导出域快照的XML
snapshot-edit                                                #编辑快照的XML
snapshot-info                                               #快照信息
snapshot-list                                                 #列出域的快照
snapshot-parent                                            #获取快照的父级的名称
snapshot-revert                                           #将域恢复为快照
存储池:
find-storage-pool-sources-as                         #查找潜在的存储池源
find-storage-pool-sources                              #发现潜在的存储池源
pool-autostart                                                  #自动启动池
pool-build                                                         #构建一个池
pool-create-as                                                   #从一组args创建一个池
pool-create                                                         #从XML文件创建池
pool-define-as                                                     #从一组arg中定义一个池
pool-define                                                        #定义不活动的持久存储池或从XML文件修改现有的持久存储池
pool-delete                                                        #删除池
pool-destroy                                                       #销毁(停止)池
pool-dumpxml                                                  #池中的XML信息
pool-edit                                                           #编辑存储池的XML配置
pool-info                                                            #存储池信息
pool-list                                                               #列表池
pool-name                                                          #将池UUID转换为池名称
pool-refresh                                                       #刷新池
pool-start                                                          # 启动(以前定义的)非活动池
pool-undefine                                                  #取消定义非活动池
pool-uuid                                                            #将池名称转换为池UUID
pool-event                                                          #存储池事件
存储卷:
vol-clone                                                              #克隆卷
vol-create-as                                                        #从一组args创建一个卷
vol-create                                                              #从XML文件创建卷
vol-create-from                                                    #创建卷,使用另一个卷作为输入
vol-delete                                                            #删除卷
vol-download                                                      #将卷内容下载到文件
vol-dumpxml                                                        #导出卷组信息
vol-info                                                                  #存储卷信息
vol-key                                                                  #返回给定卷名或路径的卷密钥
vol-list                                                                   #卷列表
vol-name                                                              #返回给定卷密钥或路径的卷名称
vol-path                                                                #返回给定卷名或密钥的卷路径
vol-pool                                                                #返回给定卷密钥或路径的存储池
vol-resize                                                              #调整大小
vol-upload                                                            #将文件内容上传到卷
vol-wipe                                                                 #擦除一个卷
virsh本身:
cd                                                                            #更改当前目录
echo                                                                          #echo信息
exit                                                                          #退出
help                                                                        #帮助
pwd                                                                          #打印当前目录
quit                                                                            #退出此交互式终端
connect                                                                      #(重新)连接到管理程序
(1).virsh -c   连接qemu
这个有很多种形式,再上一篇文章中已经讲到了。
# virsh -c qemu:///system   #直接连接本地的qemu
# virsh -c qemu:///system "list --all"   #非交互模式,双括号后面使我们也执行的参数,但是本地不用这么着,远程控制的命令是:
其余连接格式如下:
qemu:///session                      (local access to per-user instance)
qemu+unix:///session                 (local access to per-user instance)
qemu:///system                       (local access to system instance)
qemu+unix:///system                  (local access to system instance)
qemu://example.com/system            (remote access, TLS/x509)
qemu+tcp://example.com/system        (remote access, SASl/Kerberos)
qemu+ssh://root@example.com/system   (remote access, SSH tunnelled)
# virsh -c qemu+ssh://192.168.8.220/system "list --all"  #virsh list --all此命令为查看所有域的状态
Id    Name                           State
----------------------------------------------------
-     192.168.1.101                  shut off
-     192.168.1.102                  shut off
-     192.168.1.103                  shut off
-     192.168.1.104                  shut off
(2). virsh 查看帮助
# virsh -h
(3). 开启一个域
# virsh start 192.168.1.101  #开启域名称为192.168.1.101的域(前提是存在此域)
Domain 192.168.1.101 started
(4). 设置域开机自启动与取消开机启动
# virsh autostart 192.168.1.102  #这样192.168.1.102的域会随着boot一起启动
Domain 192.168.1.102 marked as autostarted
#virsh auotstart --disable  192.168.1.102   #让192.168.1.102取消开机启动
(5). 对虚拟机进行正常关机操作
# virsh shutdown 192.168.1.101 #前提是192.168.1.101这个域启动着acpid这个服务,不然kvm不能管理虚拟机正常关机
Domain 192.168.1.101 is being shutdown
(6). 对虚拟机进行强制断电操作
# virsh destroy 192.168.1.102  #对192.168.1.102域进行强制断电操作,这样虚拟机不用开启acpid服务也可以管理,但是可能会损坏虚拟机的操作系统。
Domain 192.168.1.102 destroyed
(7). 对虚拟机进行重启操作
# virsh reboot  192.168.1.101  #对192.168.1.101这个域发送reboot重启命令,前提也是需要此虚拟机开启acpid服务
Domain 192.168.1.101 is being rebooted
(8). 连接虚拟机的console控制台(只能有一个)
# virsh console 192.168.1.101  #我已经console了一个连接
Connected to domain 192.168.1.101
Escape character is ^]
error: 操作失败: 这个域有活跃控制台会话
# ps -ef|grep 'console 192.168.1.101'|grep -v 'grep'  #通过进程查看,一个有一个console连接192.168.1.101,我们想连接的话就要把这个进程杀死
root     32291 31444  0 14:38 pts/0    00:00:00 virsh console 192.168.1.101
注:Ctrl+]  是退出console窗口
(9). 查看虚拟机的基本信息
# virsh  dominfo 192.168.1.103
Id:             16              #因为我们默认是让kvm给我们分配一个ID号,虚拟机处于开机状态才会有ID号
Name:           192.168.1.103   #虚拟机域的名称
UUID:           b29d9d32-1158-49a6-a46a-3829b35cb026
OS Type:        hvm
State:          running  #状态
CPU(s):         2  #vcpu的数量
CPU time:       18.4s
Max memory:     2097152 KiB  #允许的最大内存
Used memory:    2097152 KiB  #现在配置的内存
Persistent:     yes
Autostart:      disable
Managed save:   no
Security model: selinux
Security DOI:   0
Security label: system_u:system_r:svirt_t:s0:c245,c494 (permissive)
# virsh  dominfo 192.168.1.104
Id:             -
Name:           192.168.1.104
UUID:           a595e006-5c28-4561-aeae-3b550fa012d3
OS Type:        hvm
State:          shut off
CPU(s):         2
Max memory:     2097152 KiB
Used memory:    2097152 KiB
Persistent:     yes
Autostart:      disable
Managed save:   no
Security model: selinux
Security DOI:   0
虚拟机的7种状态:
running  虚拟机正在运行在cpu上
idel  虚拟机是闲置的,没有在运行,在等待IO或者休眠时虚拟机会进入这种状态
paused  虚拟机处于暂停状态,一般情况下是被admin运行了virsh   suspend才会处于这种状态,但是仍然消耗资源,只不过不被超级管理程序调度而已。
shutdown 虚拟机在关闭过程中
shut off  虚拟机没有运行,已经完全关闭
crashed  虚拟机崩溃
dying  虚拟机处于垂死的状态,但是又没完全关闭或崩溃
(10). 暂停和恢复暂停虚拟机
# virsh suspend 192.168.1.102  #让虚拟机192.168.1.102处于挂起状态
Domain 192.168.1.102 suspended
# virsh list --all  #查看状态
Id    Name                           State
----------------------------------------------------
14    192.168.1.102                  paused  #paused是暂停状态
15    192.168.1.101                  running
16    192.168.1.103                  running
17    192.168.1.104                  running
# virsh resume 192.168.1.102  #让192.168.1.102这台虚拟机解除挂起
Domain 192.168.1.102 resumed
(11). 导出虚拟机的配置文件
# virsh dumpxml 192.168.1.102 >/opt/192.168.1.102.xml  #将192.168.1.102的配置导入到/opt/192.168.1.102.xml ,也起到了备份的效果
(12).编辑某个虚拟机的配置文件
# virsh edit 192.168.1.102  #进去之后就跟vi的操作一样了
(13).通过配置文件启动虚拟机
# virsh create /etc/libvirt/qemu/192.168.1.101.xml   #如果192.168.1.101是关机状态,可以通过这种方式启动虚拟机
Domain 192.168.1.101 created from /etc/libvirt/qemu/192.168.1.101.xml
(14).获取一些虚拟机和宿主机的信息
# virsh domstate 192.168.1.102  #domstate来获取一个域的运行状态
running
# virsh  domid 192.168.1.103  #domid来获取一个域的ID值
16
# virsh  domname 16       #domname根据域的名称或UUID来获取域的名称
192.168.1.103
# virsh  vcpuinfo  16  #vcpuinfo获取一个虚拟机CPU的基本信息
VCPU:           0 #第几个虚拟机CPU
CPU:            1  #运行在哪个物理CPU上面
State:          running  #运行状态,目前是使用状态
CPU time:       15.2s   #使用时间
CPU Affinity:   yyyyyyyyyyyy  #亲和性的信息,yyyyyy表示可以使用物理CPU的逻辑核,这里12个连的y表示可以在所有的12个cpu上面调度,如果某个cpu不让调度用-表示。
VCPU:           1
CPU:            1
State:          running
CPU time:       5.8s
CPU Affinity:   yyyyyyyyyyyy
# virsh emulatorpin 192.168.1.101 #可以查看虚拟机可以使用那些物理逻辑CPU
emulator: CPU Affinity
----------------------------------
*: 0-11
# virsh emulatorpin 192.168.1.101 0-5 --live #设置192.168.1.101的虚拟机只能允许在物理逻辑cpu的0-5上面。
# virsh  dommemstat 16 #dommemstat 获取一个域的内存情况的统计信息
actual 2097152
swap_in 0
rss 363620
# virsh vncdisplay  14  #vncdisplay 获取一个域的VNC连接IP地址和端口
:10
# virsh uri  #uri  显示当前连接的URL
qemu:///system
# virsh  nodeinfo  #nodeinfo显示该节点的基本信息
CPU model:           x86_64
CPU(s):              12
CPU frequency:       1200 MHz
CPU socket(s):       1
Core(s) per socket:  6
Thread(s) per core:  2
NUMA cell(s):        1
Memory size:         16712260 KiB
# virsh sysinfo  #sysinfo以XML格式打印宿主机的信息
# virsh freecell    #显示当前MUMA单元的可用空闲内存
Total: 7344296 KiB
# virsh nodememstats     #显示当前节点内存使用情况
total  :             16361256 KiB
free   :              7311964 KiB
buffers:                 1216 KiB
cached :              5968008 KiB
(15).网络的管理命令
# virsh  iface-list #显示出物理主机的网络接口列表
Name                 State      MAC Address
---------------------------------------------------
br0                  active     a0:36:9f:80:7c:50
em1                  active     c8:1f:66:d8:65:01
em2                  active     c8:1f:66:d8:65:02
lo                   active     00:00:00:00:00:00
# virsh  iface-mac br0  #iface-mac 根据网络接口名称查询其对应的MAC地址
a0:36:9f:80:7c:50
# virsh  iface-name c8:1f:66:d8:65:01 #iface-name 根据MAC地址查询其对应的网络接口名称
em1
# virsh  iface-edit em2 #iface-edit编辑一个物理主机的网络接口的XML配置文件
# virsh  iface-destroy em2 #关闭宿主机上一个物理网络接口
Interface em2 destroyed
# virsh net-list #列出libvirt管理的虚拟网络
Name                 State      Autostart     Persistent
----------------------------------------------------------
default              active     yes           yes
# virsh net-info default  #net-info 根据名称查询一个虚拟网络的基本信息
Name:           default
UUID:           67076bfa-9954-4ccf-8b89-44ba029b27a2
Active:         yes
Persistent:     yes
Autostart:      yes
Bridge:         virbr0
#  virsh domiflist 192.168.1.11 #某个运行的主机域所使用的mac地址,就可以结合交换机上面的mac信息反查它所对应的IP接口     类型     源        型号      MAC
-------------------------------------------------------
vnet2      bridge     br0        virtio      52:54:00:b8:74:12
(16).存储池和存储卷的管理命令
# virsh pool-list  #显示出libvirt管理的存储池
Name                 State      Autostart
-------------------------------------------
data01               active     yes
data02               active     yes
data03               active     yes
data04               active     yes
default              active     yes
ISO                  active     yes
# virsh pool-info data01  #pool-info 根据一个存储池名称查询基本信息,我们这里对挂载点data01就行查看
Name:           data01
UUID:           81e9fdb1-127d-4408-9db8-33e8dfd0502f
State:          running
Persistent:     yes
Autostart:      yes
Capacity:       1.81 TiB
Allocation:     48.82 GiB
Available:      1.76 TiB
# virsh  pool-uuid data01 #pool-uuid 根据存储池的名称查询其UUID
81e9fdb1-127d-4408-9db8-33e8dfd0502f
# virsh vol-list data01 #vol-list 查询一个存储池中的存储卷的列表
Name                 Path
------------------------------------------------------------------------------
192.168.1.101.img    /KVM/data01/192.168.1.101.img
# virsh vol-name /KVM/data03/192.168.1.103.img #vol-name 查询一个存储卷的名称
192.168.1.103.img
# virsh vol-path --pool data02 192.168.1.102.img #vol-path --pool  存储池-name 查询一个存储卷的路径
/KVM/data02/192.168.1.102.img
# virsh vol-clone /KVM/data02/192.168.1.102.img 192.168.1.105.img  #克隆一个存储卷,克隆的存储卷名称为192.168.1.105.img
Vol 192.168.1.105.img cloned from 192.168.1.102.img
# ls -lh  /KVM/data02 #查看一下
total 6.4G
-rw-------. 1 qemu qemu 201G Jan  6 16:24 192.168.1.102.img
-rw-------. 1 qemu qemu 1.2G Jan  6 16:24 192.168.1.105.img
# virsh vol-delete /KVM/data02/192.168.1.105.img  #将刚才克隆的存储卷删除
博文来自:www.51niux.com
(17). 为某一个虚拟机重新设置CPU和内存
先调整虚拟机的内存大小:
# virsh setmaxmem 192.168.1.101 8G  #之前我们192.168.1.101定义的最大内存为2G,分配的内存也是2G,所以我们要将最大可分配内存提高上去,这一步要先关闭虚拟机才能操作。
# virsh setmem 192.168.1.101 4G  #现在分配给192.168.1.101(也可以用虚拟机的ID)从2G内存扩充到4G,但是# virsh edit 192.168.1.101查看配置文件还没有变化,需要重启虚拟机配置文件才会发生变化。
# virsh dominfo 192.168.1.101  #查看域信息已经生效
Id:             20
Name:           192.168.1.101
UUID:           2e9d1632-86fd-406a-86f5-7decbe8afc1d
OS Type:        hvm
State:          running
CPU(s):         2
CPU time:       19.0s
Max memory:     8388608 KiB
Used memory:    4194304 KiB
# virsh setmem 192.168.1.101 6G  #再增加到6G,从下图可以看出虚拟机的内存变化。(内存可以动态的增加和减少)

为什么虚拟机支持动态调整内存呢,因为我们引入了virtio-balloon气球概念:
  #查看配置文件有这句话,引入了balloon气球,可以动态调整内存,还可以再加一句话让10秒检查一次。
 
  
 
下来让我们调整虚拟机cpu的数量(CPU的热添加):
首先我们要调整的vcpu的数量要小于或者等于最大cpu个数,不然最大的cpu个数就要添加。
# virsh edit 192.168.1.101  #最大cpu的调整也需要关闭虚拟机,不知道命令只能去更改配置文件了
6  #将中间的数改为6,就是cuuent当前是2,但是我们的最大允许扩容到的vcpu数量是6。
# virsh start 192.168.1.101  #将虚拟机启动起来,我们动态扩容
# virsh setvcpus 192.168.1.101 3  #执行三次操作,让192.168.1.101这台虚拟机的cpu增长到3,4,5
# virsh setvcpus 192.168.1.101 4
# virsh setvcpus 192.168.1.101 5

# cat /proc/interrupts #也可以通过这个命令查看cpu的在线数量。
从上图中可以看出,不用重启机器,每动态扩充一下cpu的数量就增加一次。
# virsh setvcpus 192.168.1.101 2  #但是vcpu不支持在线缩减,可以通过在虚拟机上面:# echo 0 > /sys/devices/system/cpu/cpu2/online #0为关闭CPU,1为开启。但是宿主机上面的CPU个数是无法变小的。
error: 不支持的配置:failed to find appropriate hotpluggable vcpus to reach the desired target vcpu count
那么如何cpu会2呢?
# virsh sedit 192.168.1.101 #改6的cueeent为你想缩减会的cpu数量
# virsh shutdown 192.168.1.101 #关机
# virsh start 192.168.1.101  #再开机
# virsh dominfo 192.168.1.101  #再查看就变回来了
Id:             25   #可以看到虚拟机如果让宿主机自动分配的话老是自动增加的状态,可以每个虚拟机都手工设置好ID号。
Name:           192.168.1.101
UUID:           2e9d1632-86fd-406a-86f5-7decbe8afc1d
OS Type:        hvm
State:          running
CPU(s):         2
注意:我们通过命令所做的这些操作,都是临时生效的,当虚拟机重启的话,内存和cpu又会变成配置文件里面的设置了,所以如何让其永久生效呢?
就是去更改这个虚拟机的配置文件,让它就算重启的时候还是加载现在设置的配置
注:
注1:强制VCPU和物理CPU一对一绑定(CPU绑定实际上是Libvirt通过CGroup来实现的,通过CGroup直接去绑定KVM虚拟机进行也可以。通过CGroup还可以限制虚拟机磁盘、网络资源。):
# virsh vcpupin 192.168.1.101 0 7  #强制192.168.1.101的vcpu的第0个cpu与宿主机的编号为7的CPU绑定
# virsh vcpupin 192.168.1.101 1 8
# virsh vcpupin 192.168.1.101 2 9
# virsh vcpupin 192.168.1.101 3 10
# virsh dumpxml 192.168.1.101|grep vcpupin
# virsh  vcpuinfo 192.168.1.101  #可以看到是立马生效的,将机器重启再观察,发现也是一直生效的。
VCPU:           0
CPU:            7
State:          running
CPU time:       76.4s
CPU Affinity:   -------y----
VCPU:           1
CPU:            8
State:          running
CPU time:       58.3s
CPU Affinity:   --------y---
VCPU:           2
CPU:            9
State:          running
CPU time:       41.2s
CPU Affinity:   ---------y--
VCPU:           3
CPU:            10
State:          running
CPU time:       40.7s
CPU Affinity:   ----------y-
#CPU绑定适合应用在系统的CPU压力比较大或者多核CPU压力不平衡。
注2:
CPU host-passthrough技术:
为了保证虚拟机在不同宿主机之间迁移时候的兼容性,libvirt对CPU定义了几种标准的类型(CPU型号、生产商信息、CPU特性定义等信息),在/usr/share/libvirt/cpu_map.xml中可以查到。
cpu配置模式第一种是custom模型,就是在配置文件里面指定一个cpu型号。xml配置文件如下:
IvyBridge
第二种模型为host-model模型,根据物理CPU特性,选择一个最靠近的标准CPU型号。xml配置文件如下:
第三种模型就是host-passthrough,将物理cpu暴露给虚拟机使用,在虚拟机上面可以查看到物理CPU的型号。(云主机比较有意义,或者虚拟机嵌套的nested技术)xml配置文件如下:
#host-passthrough使用这个模型,不同型号CPU的宿主机之前虚拟机不能迁移。
博文来自:www.51niux.com
二、qemu-img命令详解
qemu-img是QEMU的磁盘管理工具,再完成qemu-kvm源码编译后就会默认编译好qemu-img这个二进制文件。qemu-img也是QEMU/KVM使用过程中的一个比较重要的工具,qemu-img 命令行工具是 Xen 和 KVM 用来格式化各种文件系统的,可使用 qemu-img 格式化虚拟客户端映像、附加存储设备以及网络存储。
qemu-img工具的命令格式基本用法为:qemu-img command [command options] ,查看详细使用方法用qemu-img -h
下面说一些常用用法:
(1).对磁盘进行一致性检查(对磁盘镜像文件进行一致性检查,查找镜像文件中的错误)
命令格式:check [-q] [-f fmt] [--output=ofmt] [-r [leaks | all]] [-T src_cache] filename
命令实操:
# qemu-img check /KVM/data10/192.168.1.112.img
No errors were found on the image.
3276800/3276800 = 100.00% allocated, 0.00% fragmented, 0.00% compressed clusters
Image end offset: 214781394944
(2). 创建虚拟机镜像(我们再创建虚拟机的时候可以通过命令先创建一个磁盘镜像,也可以在虚拟机新添加硬盘的时候创建一块盘作为新的扩展盘)。
命令格式为:create [-q] [-f fmt] [-o options] filename [size]
参数解释:
-q: 使用安静模式 - 不打印任何输出(错误除外)
-f : 指定镜像的格式,后面的fmt代表磁盘的格式
-o:指定各种选项  后面跟的options就是代表各种选项
filename:创建的磁盘镜像的名称
[size]:是以字节为单位的磁盘映像大小。 可选后缀'k'或'K','M','G', 'T','P'(petabyte,1024T)和'E'(exabyte,1024P)。'b'被忽略。
命令实操:
# qemu-img create -f qcow2 /KVM/data11/192.168.1.114.img 200G  #这是在/KVM/data11下面创建了一个磁盘格式为qcow2稀疏映像类型的名称叫192.168.1.114.img的磁盘大小200G的磁盘镜像。
Formatting '/KVM/data11/192.168.1.114.img', fmt=qcow2 size=214748364800 encryption=off cluster_size=65536 lazy_refcounts=off   #这是提示信息,创建非常快,这是一些创建时的参数提示。
# time qemu-img create -f qcow2 -o preallocation=full /KVM/data12/192.168.1.115.img 5G  #默认off模式:缺省预分配策略即不使用预分配策略。full模式:分配所有磁盘空间并置零预分配后的虚拟磁盘属于非稀疏映像类型
Formatting '/KVM/data12/192.168.1.115.img', fmt=qcow2 size=5368709120 encryption=off cluster_size=65536 preallocation='full' lazy_refcounts=off
real0m41.525s
user0m0.100s
sys0m3.491s
# time qemu-img create -f qcow2 -o preallocation=falloc /KVM/data12/192.168.1.115.img 5G #falloc模式:使用posix_fallocate()函数分配文件的块并标示它们的状态为未初始化相对full模式,创建虚拟磁盘的速度要快很多
Formatting '/KVM/data12/192.168.1.115.img', fmt=qcow2 size=5368709120 encryption=off cluster_size=65536 preallocation='falloc' lazy_refcounts=off
real0m0.924s
user0m0.057s
sys0m0.866s
#从上图的执行结果来看,默认不预分配的稀疏映像类型的格式创建速度是很快的,另外非稀疏映像类型falloc策略,无需对磁盘进行置零操作,因此其创建虚拟磁盘时的速度要比full模式快的多。通过falloc和full策略创建的磁盘的性能,要比稀疏映像创建的磁盘高的多。因为稀疏映像类型的格式虽然节省了磁盘空间,但是第一次要用的时候会花费时间去再物理磁盘上开辟空间。
(3). 输出镜像文件的信息
命令格式为:info [-f fmt] [--output=ofmt] [--backing-chain] filename
命令实操:
# qemu-img info /KVM/data10/192.168.1.112.img
image: /KVM/data10/192.168.1.112.img
file format: qcow2
virtual size: 200G (214748364800 bytes)
disk size: 4.9G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: true
(4).  虚拟机镜像格式转换
命令格式为:convert [-c] [-p] [-q] [-n] [-f fmt] [-t cache] [-T src_cache] [-O output_fmt] [-o options] [-s snapshot_name] [-S sparse_size] filename [filename2 [...]] output_filename
参数解释:
-c :表示目标映像必须压缩(仅限qcow格式)
-p : 显示命令的进度(只有某些命令)
-n : 跳过目标卷创建(如果创建卷则非常有用,在运行qemu-img之前)
-f: 源文件的镜像格式,不指定也没关系,一般会自己检测。
-t :指定写入cache策略,cache表示:用于写入输出磁盘映像的高速缓存模式,有效选项是:'none','writeback','writethrough', 'directsync'和'unsafe'。
-T:指定读取缓存策略,src_cache表示:src_cache'是用于读取输入磁盘映像的高速缓存模式,有效选项与cache选项相同。
-O :指定输出格式,默认raw,也就是转换之后镜像的格式。
-s :以严格模式运行,后面指定快照名称
-S :表示必须的连续字节数(默认为4k)在qemu-img中只包含零以创建稀疏图像 转换。 如果字节数为0,则不会扫描源未分配或零扇区,并且目的地图像将始终是完全分配。sparse_size表示稀疏镜像的大小。
filename:要转换的镜像的名称
output_filename:要转换后的镜像的名称
命令实操:
# qemu-img convert -f qcow2 -O raw  /KVM/data10/192.168.1.112.img /KVM/data10/192.168.1.112.img  #将磁盘文件从qcow2格式转换为raw格式
# qemu-img info /KVM/data10/192.168.1.112.img   #查看一下效果
image: /KVM/data10/192.168.1.112.img
file format: raw  #已经转换了
virtual size: 200G (214748364800 bytes)
disk size: 4.0K
(5).改变镜像文件的大小(raw和qcow2都支持动态的调整磁盘大小,但是qcow2不支持缩减)
命令格式为:resize [-q] filename [+ | -]size
命令实操:
# qemu-img info /KVM/data10/192.168.1.112.img
image: /KVM/data10/192.168.1.112.img
file format: qcow2
virtual size: 220G (236223201280 bytes)  #现在镜像大小为220G
disk size: 432K
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
# qemu-img resize /KVM/data10/192.168.1.112.img +40G  #给/KVM/data10/192.168.1.112.img 镜像添加40G
Image resized.  #提示镜像调整成功
# qemu-img info /KVM/data10/192.168.1.112.img
image: /KVM/data10/192.168.1.112.img
file format: qcow2
virtual size: 260G (279172874240 bytes)  #镜像添加了40G
disk size: 436K
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
# qemu-img resize /KVM/data10/192.168.1.112.img -10G  #给镜像减少-10G( qcow2不支持缩减)
qemu-img: qcow2 doesn't support shrinking images yet  #报错不支持缩减
qemu-img: This image does not support resize
(6). 镜像快照操作
命令格式:snapshot [-q] [-l | -a snapshot | -c snapshot | -d snapshot] filename
参数解释:
-l :查询并列出镜像文件所有快照
-a :恢复某个快照 ,a后面指定快照的id号
-c: 创建一个快照
-d :删除一个快照,后面也是指定快照的id号
命令实操:
# qemu-img  snapshot -c 192.168.1.112-2017-1-24 /KVM/data10/192.168.1.112.img  #对/KVM/data10/192.168.1.112.img 创建了一个名称为192.168.1.112-2017-1-24的快照
[root@localhost KVM]# qemu-img  snapshot -c 192.168.1.112-2017-1-25 /KVM/data10/192.168.1.112.img 创建了一个名称为192.168.1.112-2017-1-25的快照
[root@localhost KVM]# qemu-img info /KVM/data10/192.168.1.112.img   #查看一下磁盘镜像信息
image: /KVM/data10/192.168.1.112.img
file format: qcow2
virtual size: 200G (214748364800 bytes)
disk size: 440K
cluster_size: 65536
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         192.168.1.112-2017-1-24      0 2017-01-24 18:09:20   00:00:00.000
2         192.168.1.112-2017-1-25      0 2017-01-24 18:09:36   00:00:00.000
Format specific information:
compat: 1.1
lazy refcounts: false
# qemu-img snapshot -l /KVM/data10/192.168.1.112.img   #用-l也可以查看/KVM/data10/192.168.1.112.img  的快照信息
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         192.168.1.112-2017-1-24      0 2017-01-24 18:09:20   00:00:00.000
2         192.168.1.112-2017-1-25      0 2017-01-24 18:09:36   00:00:00.000
# qemu-img snapshot -d 2  /KVM/data10/192.168.1.112.img  #删除/KVM/data10/192.168.1.112.img的第二个快照,也就是192.168.1.112-2017-1-25。
博文来自:www.51niux.com
三、virt-viewer命令详解
virt-viewer是一个用于与虚拟化客户机的图形显示的轻量级交互接口工具。在virt-manager中查看客户机图形界面进行交互之时,其实已经间接地使用过virt-viewer工具。
virt-viewer的使用语法:virt-viewer [options] DOMAIN-NAME|ID|UUID
不过很少使用,因为需要图形界面。那直接用virt-manager这个就可以了啊。

四、virt相关命令
大部分命令都由包libguestfs-tools-c提供。
4.1 virt-ls
列出虚拟机中目录下的文件或目录,用法如下:
# virt-ls -d 192.168.1.110 /tools/   #virt-ls  -d 域名称   目录名称
confuse-2.7
confuse-2.7.tar.gz
ganglia-3.7.2
ganglia-3.7.2.tar.gz
ganglia-web-3.7.2.tar.gz
4.2 virt-what
# yum -y install virt-what
# virt-what  #检测当前是不是虚拟机,如果不是什么都不输出,如果是就会输出下面的信息。判断一台机器是否是虚拟机的时候很有用。
kvm
4.3 virt-top
# yum -y install virt-top
# virt-top  #再宿主机上面执行

#virt-top跟top类似,大M是按M排序,大P按cpu实际使用来排序。注意这上面显示的内存占用是虚拟机分配了多少内存并非实际运行线程占用了多少内存,而CPU显示的是实际CPU的使用率。
4.4 virt-cat
查看虚拟机文件的内容
# virt-cat  192.168.1.101 /etc/1     #在192.168.1.101的/etc下面创建了一个1的配置文件
192.168.1.101
4.5 virt-copy-out
将虚拟机里面的文件拷贝出来
# virt-copy-out -d 192.168.1.101 /etc/1 /tmp/  #将虚拟机192.168.1.101下面的/etc/1 拷贝到/tmp目录下面
# cat /tmp/1   #查看已经有了此文件
192.168.1.101
4.6 virt-df
将虚拟机中执行df命令的结果输出:
# virt-df -d 192.168.1.101 -h  #virt-df -d 虚拟机的域名称 -h,默认没有-h,要手工加上以可视化显示。
Filesystem                                Size       Used  Available  Use%
192.168.1.101:/dev/sda1                   190M        34M       141M   19%
192.168.1.101:/dev/sda3                   193G       2.1G       181G    2%
4.7 virt-alignment-scan
旧的操作系统安装时会使用不对齐的分区,这会引起一些不必要的I/O,这个命令的作用是检查是否正在不对齐的问题,如果存在,只是警告(Warns)你,当前这个工具不会帮你解决这个问题。
# virt-alignment-scan -d 192.168.1.101  #192.168.1.101 为虚拟机的域名
/dev/sda1      1048576         1024K   ok
/dev/sda2    210763776         1024K   ok
/dev/sda3   4610588672         1024K   ok
4.8 virt-install
virt-install是rpm包python-virtinst里的一个工具 。其是qemu-kvm工具的人性化实现。可以利用该工具在终端下创建虚拟机主机。
# yum install virt-install -y
命令格式:virt-install [OPTION]...  #详细可以#man virt-install
virt-install常用参数:
一般选项:
-n NAME: 虚拟机的名称
--memory MEMORY:虚拟机的内存大小,单位是M。--memory 512,maxmemory=1024这个例子是说当前内存是521M,最大可分配内存为1024M
--vcpus VCPUS:要为虚拟机配置的vCPU的数量。--vcpus 5分配五个cpu,--vcpus 5,maxcpus=10,cpuset=1-4,6,8 分配五个虚拟cpu,最大支持10个,绑定到了物理CPU的1,2,3,4,6,8处理器上。
安装方法选项:
--cdrom CDROM :光盘安装,并制定路径
-l LOCATION:例子:--location LOCATION 路径可以是http,nfs和ftp
--pxe     :使用PXE协议从网络引导
--import  :用现有的磁盘镜像构建虚拟机
-x EXTRA_ARGS:--extra-args EXTRA_ARGS 当执行从"--location"选项指定位置的客户机安装时,附加内核命令行参数到安装程序
--os-variant DISTRO_VARIANT:所安装的操作系统版本
--boot BOOT :配置虚拟机的启动顺序,例如:--boot hd,cdrom,menu=on
设备选项:
--disk DISK:配置磁盘设备。例如:--disk size = 10(默认位置为新的10GiB映像),--disk device = cdrom,bus = scsi
-w NETWORK:配置网络接口。 例如:--network bridge=br0    --network network=mynet,model=virtio,mac=00:11...
--graphics GRAPHICS:配置客户端显示设置。例如:--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   :配置guest虚拟机串行设备
--parallel PARALLEL:配置guest虚拟机并行设备
--channel CHANNEL :配置guest虚拟机通信通道
--console CONSOLE:配置console控制台
--hostdev HOSTDEV:配置物理USB / PCI / etc主机设备与虚拟机共享
--filesystem FILESYSTEM:将主机目录共享给虚拟机,如: --filesystem /my/source/dir,/dir/in/guest
--sound [SOUND] :给虚拟机配置虚拟的声卡设备
--watchdog WATCHDOG:配置虚拟机监视设备
--video VIDEO :配置虚拟机视频硬件。
--smartcard SMARTCARD:配置虚拟机智能卡设备。如:--smartcard mode=passthrough
--memballoon MEMBALLOON:配置气球设备.如:--memballoon model=virtio
虚拟化平台选项:
-v, --hvm :此客户端应为完全虚拟化的客户端
-p, --paravirt :此客户端为半虚拟化设置
--virt-type HV_TYPE:要使用的管理程序的名称(kvm,qemu,xen,...)
--arch ARCH: CPU架构来模拟
--machine MACHINE:要仿真的机器类型
其他选项:
--autostart  :设置为主机开机自启动
--transient: 创建临时域
--wait WAIT :等待安装完成的分钟数
--noautoconsole:不自动尝试连接虚拟机的console控制台
--noreboot :完成安装后不引导虚拟机
--print-xml [XMLONLY]:打印生成的域XML而不是创建虚拟机。
--dry-run :运行安装过程,但不创建虚拟机
--check CHECK :启用或禁用验证检查。如:--check path_in_use=off或者 --check all=off
命令实操:
# virt-install  -n 192.168.1.114 --memory 1024,maxmemory=2048 --vcpus 2  --cdrom=/ISO/CentOS-6.4-x86_64-bin-DVD1.iso --disk path=/KVM/data12/192.168.1.114.img,size=10,format=qcow2,bus=virtio --network bridge=br0,model=virtio --graphics vnc,listen=0.0.0.0,port=5914   --autostart --accelerate --virt-type=kvm
Starting install...
Allocating '192.168.1.128.img'                                                                                                                                                                       |  10 GB  00:00:00
Creating domain...                                                                                                                                                                                   |    0 B  00:00:00
Domain installation still in progress. Waiting for installation to complete. #如果虚拟机不创建完成的话,会一直卡在这里,这就需要通过vnc连接虚拟机去创建系统。
#创建一个名称为192.168.1.114,当前内存为1024MB最大内存为2048MB,当前cpu为2核,安装光盘为/ISO/CentOS-6.4-x86_64-bin-DVD1.iso,磁盘存放位置为/KVM/data12/192.168.1.114.img,磁盘空间大小为10G,磁盘格式为qcow2,磁盘为半虚拟化,网卡为桥接,类型也为半虚拟化模式,显示工具为vnc,默认是监听127.0.0.1这里让其监听在0.0.0.0的5914上面,设置为开机自启动,设置为加速安装模式,虚拟机类型为kvm。
这种格式就是需要通过vnc客户端连接宿主机的5914端口,进行vnc图形化的光盘安装操作。
加上参数--noautoconsole,不会一直卡上面那个创建界面等虚拟机创建完成以后才会停止创建过程,会执行完相关命令将这个过程丢到后台去。如下图:
# virt-install --name=192.168.1.127 --ram 2048 --vcpus=1 --disk path=/KVM/data14/192.168.1.127.img,format=qcow2,size=10,bus=virtio --accelerate --cdrom /ISO/CentOS-6.4-x86_64-bin-DVD1.iso --vnc --vncport=5927 --vnclisten=0.0.0.0 --network bridge=br0,model=virtio --noautoconsole
Starting install...
Allocating '192.168.1.127.img'                                                                                                                                                                       |  10 GB  00:00:00
Creating domain...                                                                                                                                                                                   |    0 B  00:00:00
Domain installation still in progress. You can reconnect to
the console to complete the installation process.
#
4.9 virt-clone
virt-clone 主要是用来克隆kvm虚拟机,并且通过 Options、General Option、Storage Configuration、Networking Configuration 等不同选项对新的虚拟机进行一些特殊的定义。
virt-clone常用参数:
General Options(一般选项):
-o:要被克隆的虚拟机的名称
-n:克隆后虚拟机的名称
--auto-clone:从原来的虚拟机配置自动生成克隆名称和存储路径
Storage Configuration(存储选项):
-f:指定新的虚拟机磁盘文件
--force-copy:强制复制设备,如:--force-copy = hdc
--nonsparse :不使用稀疏文件复制磁盘映像
--preserve-data:不要克隆存储,通过指定的新磁盘映像 --file保持不变
Networking Configuration(网络选项):
-m:克隆guest虚拟机的新固定MAC地址。 默认值为随机生成的MAC
Miscellaneous Options(其他选项):
--replace:不要检查名称冲突,用任何来宾覆盖 同名。
--print-xml:打印生成的域XML而不是创建虚拟机。
--check CHECK :启用或禁用验证检查。 例: --check path_in_use = off  --check all = off
命令实操:
# virt-clone -o 192.168.1.114 -n 192.168.1.115 -f /KVM/data13/192.168.1.115.img  #要被克隆的虚拟机要处于关机状态
WARNING  Setting the graphics device port to autoport, in order to avoid conflicting. #因为我们vnc不是自动分配所以冲突了提示记得修改。
Allocating '192.168.1.115.img'
Clone '192.168.1.115' created successfully.
#这里通过域名叫做192.168.1.114虚拟机创建一台新的虚拟机192.168.1.115.磁盘位置为:/KVM/data13/192.168.1.115.img
#还有一种方法就是导出配置文件,复制一份镜像,然后再去更改镜像配置文件,再重新定义配置文件,就不说了。其中有一点:uuid需要命令生成:uuidgen -r。
#注意1:如果你的镜像是两块磁盘(当然一般模板机都是一块磁盘),就要入下面指定多加一个-f指定磁盘:virt-clone -o demo  -n 192.168.14.66 -f /data/192.168.14.66.img -f /data/add/192.168.14.66_add.img
#多盘不加-f指定磁盘位置的话会有下面的报错:ERROR    丢失设备的源代码信息 vdb
#注意2:还有一个是不应该加在这里的,就是加载这里吧
注意上面我的192.168.14.66.img和192.168.14.66_add.img是不在同一个目录下面,是这样的你同一个目录下面只能存在一个192.168.14.66开头的img镜像,多了的话不管你后缀是啥就创建不了,如果你要挂载多快盘,那多快盘也不能在一个目录下面。可以入:/data/192.168.14.66_add/add01,/data/192.168.14.66_add/add02类似于这种的目录结构,当然这种情况也比较少一般也就是测试的时候会用到,如果需要多块盘一般也得上物理机了。
注:
KSM技术(宿主机的内存压缩主要采用KSM技术,原理是将相同的内存分页进行合并。KSM默认是打开的,主要有KSM服务和ksmtuned服务。KSM可以直接在线操作打开或关闭。可以临时缓解点宿主机内存不足)。
# service ksm status  #查看服务状态,默认是打开状态
# service ksmtuned status
# cat /sys/kernel/mm/ksm/pages_shared  #有多少共享内存页正在被使用
148
# cat /sys/kernel/mm/ksm/pages_sharing  #有多少节点被共享并且多少被保存
4846
# cat /sys/kernel/mm/ksm/pages_unshared  #内存被合并时有多少内存页独特但是反复被检查
138
# cat /sys/kernel/mm/ksm/pages_volatile  #多少内存页改变太快被放置
106380
# cat /sys/kernel/mm/ksm/full_scans   #多少次可以合并区域被扫描
6

#KSM不适合在生产环节使用,在业务压力大虚拟机内存变化频繁的时候会造成加重CPU的消耗用于内存扫描和内存超用使频繁使用swap交互导致虚拟机性能严重下降。测试环境内存压缩效果明显,多以多创建虚拟机。

注:

掌握上面的内容是很有用的,这可以帮助我们在虚拟机化偏单机而非像openstack那样做成集群环境的情况下,帮助我们做一些简化操作的事情。

打个比方,创建虚拟机,不同的操作系统需求,不同的磁盘空间 内存大小CPU大小以及机房不同公网IP的不同以及可能非公网而是内网IP等一些需求,虽然看着比较复杂但是还是有规律的可寻的事情,显然如果手工操作的话不仅时间长而且重复性操作太多,当你掌握了上面的命令后就可以写一个脚本来进行虚拟机的创建,只需要填上你的需求如IP、磁盘大小、cpu核数、内存大小,剩下的你就不用管了,1分钟一台虚拟机创建完毕。

#这是一个脚本需要下载到机器上之后改成.sh格式的。上面是之前写的一个脚本,大概能用,大概的思路也就是把一些规律化的操作写到脚本里面,变量手工输,以达到1分钟快速创建虚拟机的目录。

大概意思是需要一个Centos6和一个Centos7的10G左右的模板机,然后模板机里面是所有的该装的软件包组啊优化啊什么的都已经做了,然后脚本里面就是克隆完之后根据磁盘空间的需求让新创建的虚拟机磁盘空间变成指定的大小。虚拟机用的是lvm的格式因为其支持在线扩容。然后内存、cpu就好说了 改配置文件重新加载一下配置就是我们需要的了。会在一个文件服务器上面存放了机房的IP网关和掩码,然后就是根据IP的前三位去匹配子集对应的网关和掩码。然后呢可以写个定时任务比如监控虚拟机的一些信息,比如网络是否通啊(有的时候虚拟机需要重启网卡),比如/etc/rc.local里面的那个resize2fs的命令得删除掉啊,比如检查跟时间不服务之间的状态啊等等,根据实际情况来白。