我想寫一個圖像同時在兩張 SD 卡上。我設想至少有兩種並發寫作場景:
tee
是否可以用類似的分叉機制來寫圖像?是否可以從兩個不同的 BASH shell 執行 cat 或 pv 指令?
sudo sh -c 'pv sdcard.image >/dev/sdb' sudo sh -c 'pv sdcard.image >/dev/mmcblk0' sudo sh -c 'cat sdcard.image >/dev/sdb' sudo sh -c 'cat sdcard.image >/dev/mmcblk0'
我可以預見一個問題,如果兩個目標可以以不同的速率寫入,那麼可能有必要降低寫入速度,以免使較慢的寫入器過載。影像很大:能夠燃燒多個目標是一個顯著的優勢。
答案1
是否可以用 T 卹或類似的分叉機制來寫入影像?
sudo tee /dev/sdb /dev/mmcblk0 < sdcard.image > /dev/null
答案2
是否可以從兩個不同的 BASH shell 執行 cat 指令?
哪個cat
命令?
如果您只想獲得與此處相同的結果:
sudo sh -c 'pv sdcard.image >/dev/sdb'
sudo sh -c 'pv sdcard.image >/dev/mmcblk0'
但只要按一下 Enter 鍵,為什麼不簡單地組合這樣的指令呢?
sudo sh -c 'pv sdcard.image /dev/sdb && pv sdcard.image /dev/mmcblk0'
是因為你不想讀取該檔案兩次嗎?
(&&
只有當第一個命令成功時,才會執行第二個命令;如果您仍然想執行第二個命令,您可以更改&&
a ;
)
要僅從檔案系統讀取一次文件,您可以這樣做:
cat sdcard.image | tee /dev/sdb > /dev/mmcblk0
在這裡,您正在利用tee
預設行為:tee
發送到文件的內容,將其發送到設備目標之一,將該設備作為命令的文件參數tee
,以及tee
發送到的內容標準輸出,您將其重新導向到您的其他裝置目標。
或者,讀取影像兩次,但是執行兩者同時寫入, 在平行線, 和parallel
:
parallel 'cat sdcard.image >' ::: /dev/{sdb,mmcblk0}
注意:請記住parallel
,這是GNU parallel
,而不是moreutils parallel
答案3
這是並發複製的最低限度的 shell 腳本。如果有任何錯誤,這會將它們拋出到 STDERR。
#!/bin/sh
echo "Image file ${1}"
echo "1st SD Card Path ${2}"
echo "2nd SD Card Path ${3}"
dd if=${1} of=${2}&
dd if=${1} of=${3}
用法sh script.sh image_file first_card_path second_card_path