Awk

如何創建一個 csh 腳本來辨識我保存虛擬機的正確 USB 磁碟

  • February 25, 2022

我正在執行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 標記da3my-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 nameif並且只 lunname匹配以下之一:r1w1e2NM13N4CZ3e4d31334e34435a。這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}'

引用自:https://unix.stackexchange.com/questions/691448