Basit bir örnek olarak 100 MB'lık bir ham blok cihazı düşünün. Bu, her biri toplam 102760448 bayt için 512 baytlık 204800 bloktur.
Zor olan ilk 98MB'yi (200704 blok) kaydırmak, böylece önünde 2MB (4096 blok) boşluk var. Bunu yerinde yapmak için, henüz okunmamış bir sektöre hiçbir şey yazılmaması gerekir. Bunu başarmanın bir yolu bir tampon eklemektir:
$ dd if=/dev/sdj2 count=200704 | mbuffer -s 512 -b 4096 -P 100 | dd of=/dev/sdj2 seek=4096
Beklenti, mbuffer
yazara bir şey geçirmeden önce 4096 blok depolayacak, böylece okunmamış bir alana hiçbir şey yazılmamasını ve yazarın okuyucuyu arabellek boyutuna kadar geciktirmesini sağlayacaktır. Tampon, okuyucunun ve yazarın bu bileşenler içinde olabildiğince hızlı çalışmasına izin vermelidir.
Ancak, güvenilir bir şekilde çalışmıyor gibi görünüyor. Gerçek aygıtları kullanmayı denedim ama hiçbir zaman onlarla çalışmazken, bir dosya ile yapılan deneyler 64 bitlik kutumda çalıştı, ancak 32 bitlik kutumda çalışmadı.
İlk olarak, bazı hazırlık:
$ dd if=/dev/sdj2 count=200704 | md5sum
0f0727f6644dac7a6ec60ea98ffc6da9
$ dd if=/dev/sdj2 count=200704 of=testfile
Bu işe yaramıyor:
$ dd if=/dev/sdj2 count=200704 | mbuffer -s 512 -b 4096 -P 100 -H | dd of=/dev/sdj2 seek=4096
summary: 98.0 MiByte in 4.4sec - average of 22.0 MiB/s
md5 hash: 3cbf1ca59a250d19573285458e320ade
Bu, 64 bit sistemde çalışır, ancak 32 bit sistemde çalışmaz:
$ dd if=testfile count=200704 | mbuffer -s 512 -b 4096 -P 100 -H | dd of=testfile seek=4096 conv=notrunc
summary: 98.0 MiByte in 0.9sec - average of 111 MiB/s
md5 hash: 0f0727f6644dac7a6ec60ea98ffc6da9
Bu nasıl güvenilir bir şekilde yapılabilir?
notlar
Arabelleğe alma hakkında başka sorular okudum ve baktım pv
, buffer
ve mbuffer
. Ikincisi sadece gerekli arabellek boyutu ile çalışmak için alabilir.
Ara depolama kullanımı, her zaman çalışan soruna bariz bir çözümdür, ancak yeterli yedek kapasite olmadığında pratik değildir.
Arch Linux'u mbuffer
20140302 sürümüyle çalıştıran test platformları .
mbuffer
Aslında ikinci zorlamak gerektiğini dd
ilk için geride kalmaya ve sadece vardiya boyutunu tampon için yeterli RAM gerekir. Çok kötü dd
, problemi ortadan kaldıracağından blokları geriye doğru sırada okumayı ve yazmayı desteklemez!
-H
argümanı bu özelliği etkinleştirir).
mbuffer
hiç kullanmıyorsunuz ? Bunun yerine nedendd
blok cihazının tüm içeriğini tek seferde okuyorsunuzdd bs=102760448
? Tabii ki, şu ya da bu şekilde RAM'de arabelleğe alınır.