在kvm虛擬化環境中,我們經常遇到一些需求,如忘記虛擬機密碼,使用鏡像部署虛擬機不知道初始密碼,在不登錄虛擬機的情況下如何對虛擬機進行一些簡單的操作等等。此篇文章會給你答案,在介紹方法之前,先介紹一個一個概念channel device,如下:
1. channel是主機和虛擬機之前的私有通道,在libvirt的xml中典型的配置如下:
...
<devices>
<channel type='unix'>
<source mode='bind' path='/tmp/guestfwd'/>
<target type='guestfwd' address='10.0.2.1' port='4600'/>
</channel>
<!-- KVM virtio channel -->
<channel type='pty'>
<target type='virtio' name='arbitrary.virtio.serial.port.name'/>
</channel>
<channel type='unix'>
<source mode='bind' path='/var/lib/libvirt/qemu/f16x86_64.agent'/>
<target type='virtio' name='org.qemu.guest_agent.0' state='connected'/>
</channel>
<channel type='spicevmc'>
<target type='virtio' name='com.redhat.spice.0'/>
</channel>
</devices>
...
channel可以通過多種方式實現。通道的具體類型在目標元素的type屬性中給出。不同的通道類型具有不同的目標屬性。
guestfwd
TCP流量通過制定的IP地址和端口被轉發道host的管道設備中,target設備必須要有IP地址和端口
virtio
半虛擬化virtio通道,通道被暴露在/dev/vport*下。
channel的基本實現原理:創建虛機時,需要在xml中配置channel段,寫入相關參數,啟動虛機時,會在宿主機上生成對應unix socket文件,同時,會在vm里生成一個字符設備,生成的unix socket和字符設備可以理解為一個channel隧道的兩端。
2.比較常見的是通過channel使用qemu guest agent(qga)qga實現過程:
虛擬機鏡像制作時,安裝好qemu-guest-agent守護進程并配置開啟自啟動,qemu-guest-agent進程會監聽字符設備。
宿主機上,將虛機中qga支持的rpc指令,通過channel發送,虛機中的qemu-guest-agent從串口設備收到數據后,執行相關指令。可實現文件讀寫、密碼修改等。使用步驟如下:
1)虛擬機安裝agent
#yum install qemu-guest-agent
2)啟動服務
#systemctl enable qemu-guest-agent
3)創建虛擬機,xml里面加入:
<channel type='unix'>
<source mode='bind' path='/var/lib/libvirt/qemu/compile.agent'/>
<target type='virtio' name='org.qemu.guest_agent.0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
4)啟動虛擬機,通道建立就可以通信,如:
# virsh
virsh # set-user-password
error: command 'set-user-password' requires <domain> option
error: command 'set-user-password' requires <user> option
error: command 'set-user-password' requires <password> option
virsh # set-user-password 10 administrator xxxxxx
Password set successfully for administrator in 10
# virsh qemu-agent-command vm01 '{"execute":"guest-info"}'
{"return":{"version":"5.0.0.4","supported_commands":[{"enabled":true,"name":"guest-get-osinfo","success-response":true},{"enabled":true,"name":"guest-get-timezone","success-response":true},{"enabled":true,"name":"guest-get-users","success-response":true},{"enabled":true,"name":"guest-get-host-name","success-response":true},{"enabled":false,"name":"guest-exec","success-response":true},{"enabled":false,"name":"guest-exec-status","success-response":true},{"enabled":true,"name":"guest-get-memory-block-info","success-response":true},{"enabled":true,"name":"guest-set-memory-blocks","success-response":true},{"enabled":true,"name":"guest-get-memory-blocks","success-response":true},{"enabled":true,"name":"guest-set-user-password","success-response":true},{"enabled":true,"name":"guest-get-fsinfo","success-response":true},{"enabled":true,"name":"guest-set-vcpus","success-response":true},{"enabled":true,"name":"guest-get-vcpus","success-response":true},{"enabled":true,"name":"guest-network-get-interfaces","success-response":true},{"enabled":true,"name":"guest-suspend-hybrid","success-response":false},{"enabled":true,"name":"guest-suspend-ram","success-response":false},{"enabled":true,"name":"guest-suspend-disk","success-response":false},{"enabled":true,"name":"guest-fstrim","success-response":true},{"enabled":true,"name":"guest-fsfreeze-thaw","success-response":true},{"enabled":true,"name":"guest-fsfreeze-freeze-list","success-response":true},{"enabled":true,"name":"guest-fsfreeze-freeze","success-response":true},{"enabled":true,"name":"guest-fsfreeze-status","success-response":true},{"enabled":false,"name":"guest-file-flush","success-response":true},{"enabled":false,"name":"guest-file-seek","success-response":true},{"enabled":false,"name":"guest-file-write","success-response":true},{"enabled":false,"name":"guest-file-read","success-response":true},{"enabled":false,"name":"guest-file-close","success-response":true},{"enabled":false,"name":"guest-file-open","success-response":true},{"enabled":true,"name":"guest-shutdown","success-response":false},{"enabled":true,"name":"guest-info","success-response":true},{"enabled":true,"name":"guest-set-time","success-response":true},{"enabled":true,"name":"guest-get-time","success-response":true},{"enabled":true,"name":"guest-ping","success-response":true},{"enabled":true,"name":"guest-sync","success-response":true},{"enabled":true,"name":"guest-sync-delimited","success-response":true}]}}
[root@gzinf-computer-55e235e17e32 tmp]# virsh qemu-agent-command vm02 '{"execute":"guest-info"}'
error: Guest agent is not responding: QEMU guest agent is not connected
其他常用命令如:
'{"execute":"guest-network-get-interfaces"}'
'{"execute":"guest-ping"}'
如此便可以在不登陸虛擬機的情況下對虛擬機進行一些簡單的操作。