我想写一个图像同时在两张 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