如何創建一個 csh 腳本來辨識我保存虛擬機的正確 USB 磁碟
我正在執行Freebsd 13R並且作為 shell 我正在使用csh。我想創建一個腳本,當我給出命令“ geom disk list ”並給出“ da3 ”作為輸出時,它看起來存在“ r1w1e2 ”或“ NM13N4CZ ”或“ 3e4d31334e34435a ”這個詞。我需要這個腳本,因為我的USB磁碟的映射經常改變。但我需要確定儲存我創建的所有 *.img(虛擬機)文件的磁碟是什麼。例如,此刻,當我發出命令時:
geom disk list : Geom name: da3 Providers: 1. Name: da3 Mediasize: 2000398933504 (1.8T) Sectorsize: 512 Stripesize: 4096 Stripeoffset: 0 Mode: r1w1e2 descr: Seagate M3 Portable lunname: NM13N4CZ lunid: 3e4d31334e34435a ident: NM13N4CZ rotationrate: unknown fwsectors: 63 fwheads: 255
我看到正確的磁碟是da3。所以,我可以像這樣用bhyve啟動我想要的虛擬機:
bhyve -S -c sockets=2,cores=2,threads=2 -m 8G -w -H -A \ -s 0,hostbridge \ -s 2,virtio-blk,/mnt/$disk$p2/bhyve/os/Linux/photon.img \ -s 3:0,passthru,1/0/0 \ -s 9,virtio-net,tap0 \ -s 10,virtio-9p,sharename=/ \ -s 29,fbuf,tcp=0.0.0.0:5900,w=1440,h=900 \ -s 30,xhci,tablet \ -s 31,lpc \ -l bootrom,/usr/local/share/uefi-firmware/BHYVE_BHF_CODE.fd \ -l com1,stdio \ vm0
喜歡 $ disk $ 是da3和 p2 永遠不會改變。很感謝。
解決方案 :
解決方案 :
set vmdisk=`geom disk list | awk '/^Geom name: /{d=$NF} /^ *lunname: (r1w1e2|NM13N4CZ|3e4d31334e34435a)/ && d{print d}'` echo $vmdisk da2 -s 2,virtio-blk,/mnt/$vmdisk'p2'/bhyve/os/Linux/photon.img \
我想這會讓兩個響應者不清楚你的真正目的是什麼,但該
GEOM
層的主要設計目標之一是避免必須搜尋原始設備節點來試圖找到你的設備去哪裡。您目前的方法避開了使用該GEOM
層提供的所有與設備無關的優勢。假設您的 2T USB 驅動器有一個
GPT
分區表。如果您將唯一的(並且希望是描述性的)GPT 標籤應用於該驅動器的分區 2,您將能夠通過該標籤安裝或引用該分區,而不是被迫找出正確的(並且不斷變化的)/dev/daNpM
設備節點。首先,最後一次弄清楚你的 USB 驅動器在哪裡。我們假設它是
/dev/da3
. 在這裡,我們將分區 2 標記da3
為my-vm-partition
:# gpart modify -l my-vm-partition -i 2 /dev/da3
現在你可以:
# mount /dev/gpt/my-vm-partition /mnt
無需了解底層
/dev/daN
設備的任何資訊。或者,如果 Bhyve 命令行確實是您的最終目標,則類似於:
# mkdir /my-vm-partition # mount /dev/gpt/my-vm-partition /my-vm-partition # bhyve -S -c sockets=2,cores=2,threads=2 -m 8G -w -H -A \ -s 0,hostbridge \ -s 2,virtio-blk,/my-vm-partition/bhyve/os/Linux/photon.img \ -s 3:0,passthru,1/0/0 \ -s 9,virtio-net,tap0 \ -s 10,virtio-9p,sharename=/ \ -s 29,fbuf,tcp=0.0.0.0:5900,w=1440,h=900 \ -s 30,xhci,tablet \ -s 31,lpc \ -l bootrom,/usr/local/share/uefi-firmware/BHYVE_BHF_CODE.fd \ -l com1,stdio \ vm0
您可能還想看看 Matt Churchyard 的優秀
vm-bhyve
軟體包及其 ZFS 集成。通過 ZFS 池名稱或 ZFS 文件系統名稱掛載文件系統還可以省去嘗試從/dev
樹中找出正確設備編號的所有麻煩。
如果我理解你的問題,你想得到
Geom name
if並且只lunname
匹配以下之一:r1w1e2
,NM13N4CZ
或3e4d31334e34435a
。這sed
應該有效(我無法測試bsd sed
):your_cmd | sed -n 's/^Geom name: \(.*\)$/\1/;ta;/^ *lunname: \(r1w1e2\|NM13N4CZ\|3e4d31334e34435a\)$/{g;p};d;:a h'
我很確定這個 awk 會起作用:
your_cmd | awk '/^Geom name: /{d=$NF} /^ *lunname: (r1w1e2|NM13N4CZ|3e4d31334e34435a)$/ && d{print d}'