我很喜欢玩FreeBSD里的bhyve虚拟机,大家可能都知道,有时候虚拟机加载的OS死机了,虚拟机的进程并没有被杀死,这不是bug,而是开发者说这样是为了加快虚拟机的启动过程,现在,我想创建一个脚本,以终止在执行“ps ax”时仍列出的“停用”虚拟机|grep bhyve",但是这个不能再用了。让我们看下面的例子:
mario@marietto:/home/marietto # ps ax | grep bhyve
13720 - Is 0:00.00 bhyve: system.pwd (bhyve)
13721 - Is 0:00.00 bhyve: system.grp (bhyve)
13831 - Ss 0:00.00 bhyve: system.pwd (bhyve)
13832 - Ss 0:00.00 bhyve: system.grp (bhyve)
13826 4 SC+ 0:17.34 bhyve: vm2 (bhyve)
13715 1 IC+ 1:00.55 bhyve: vm4 (bhyve)
13852 3 S+ 0:00.00 grep bhyve
在本例中,我有两个虚拟机,分别称为vm2和vm4,它们变成了ghost,因为它们内部的操作系统已经停止。为了清楚起见,我想向您展示我通常用来启动bhyve vm的脚本:
bhyve -S -c sockets=2,cores=2,threads=2 -m 8G -w -H -A \
-s 0,hostbridge \
-s 1,nvme,/dev/nvd0,bootindex=1 \
-s 2,virtio-blk,/dev/$vmdisk4 \
-s 3,virtio-blk,/dev/$vmdisk8 \
-s 4,virtio-blk,/dev/$vmdisk11 \
-s 10,virtio-net,tap2 \
-s 11,virtio-9p,sharename=/ \
-s 12,hda,play=/dev/dsp,rec=/dev/dsp \
-s 29,fbuf,tcp=0.0.0.0:5902,w=1600,h=950 \
-s 30,xhci,tablet \
-s 31,lpc \
-l bootrom,/usr/local/share/uefi-firmware/BHYVE_BHF_CODE.fd \
vm2 < /dev/null & sleep 2 && vncviewer 0:2
现在,由于没有任何简单方法可以知道虚拟机是Ghost还是正在运行,我考虑了这样一个系统:
mario@marietto:/home/marietto # ps ax | grep vnc
13841 4 S+ 0:00.03 vncviewer 0:2
13727 1 S+ 0:00.04 vncviewer 0:4
13854 3 S+ 0:00.00 grep vnc
grepping vncviewer会话号是确定哪个虚拟机真正在运行的最安全的方法,因为当虚拟机真正在运行时,我从不关闭vncviewer窗口,而是最小化其窗口,并且由于我已将相同的编号与虚拟机和vncviewer会话关联,我确定vm2和vm4还在运行,当我停止vm2和vm4的时候,对应的vnc会话应该是关闭的,现在,我想做的是创建一个脚本,在这种情况下,作为输出,它能够给予我2和4。因此,脚本应该将数字2赋给第一个变量,将数字4赋给第二个变量:
$runvm1 = 2
$rvnvm2 = 4
以后我会这样完成脚本:
bhyvectl --vm=$runvm1 --force-reset
bhyvectl --vm=$runvm1 --destroy
bhyvectl --vm=$runvm2 --force-reset
bhyvectl --vm=$runvm2 --destroy
因为我希望重置并销毁在以下列出的进程之间仍然可见的所有Ghost虚拟机:
mario@marietto:/home/marietto # ps ax | grep bhyve
1条答案
按热度按时间62lalag41#
这将获得您的值。