Pipe
管道限制數據(以字節為單位)
我正在嘗試做一個複製的“高級案例”。
有一個管道寫入塊設備,在其末端有一個不應觸及的分區。我知道這個分區從哪裡開始。在這種情況下,我想覆蓋分區表。
為了簡單起見,管道以
dd if=myfile
.dd if=myfile > /dev/sda
我可以做類似的事情
dd if=myfile | dd bs=1B count=startofmypartition-~1000000 > /dev/sda
但是有沒有更好的方法可以做到這一點,這種方法有什麼缺點嗎?
pv
有一個大小選項,但它聲明它僅用於計算 ETA,所以我不確定這是否可行:(來自手冊頁:)-s SIZE, --size SIZE Assume the total amount of data to be transferred is SIZE bytes when calculating percentages and ETAs. The same suffixes of "k", "m" etc can be used as with -L.
我知道會有更多的寫操作,但它應該是使用相同數量空間的磁碟上的相同數據 - 只要它不是磁帶驅動器。
dd bs=1
效率非常低,因為它每個字節執行一個read()
和一個系統呼叫。write()
無論如何在塊設備上使用都沒有多大意義dd
(除非您想使用特殊標誌,例如conv=noerror,sync...
處理錯誤或偏移)在這裡你可以這樣做:
offset=$(($(cat /sys/class/block/sda3/start) * 512)) && pv -trabSs "$offset" < myfile > /dev/sda
(或者
head -c "$offset"
如果您不關心進度資訊,請使用)。
pv
並將head
選擇足夠的緩衝區大小來優化性能。(請注意,由於您在磁碟的開頭寫入數據,因此您將有效地覆蓋分區表!)。
另一種選擇可能是創建一個新的塊設備,它只映射
/dev/sda
您願意覆蓋的部分像:
echo "0 $(cat /sys/class/block/sda3/start) linear /dev/sda 0" | dmsetup create writable_sda && cp myfile /dev/mapper/writable_sda