Pertimbangkan perangkat blok mentah 100MB sebagai contoh sederhana. Itu adalah 2.048.000 blok masing-masing 512 byte untuk total 102760448 byte.
Tantangannya adalah untuk menggeser 98MB pertama (200704 blok) sehingga ada celah 2MB (4096 blok) di depannya. Untuk melakukan ini di tempat mengharuskan tidak ada yang ditulis untuk sektor yang belum dibaca. Salah satu cara untuk mencapai ini adalah dengan memperkenalkan buffer:
$ dd if=/dev/sdj2 count=200704 | mbuffer -s 512 -b 4096 -P 100 | dd of=/dev/sdj2 seek=4096
Harapannya adalah bahwa mbuffer
akan menyimpan 4.096 blok sebelum menyerahkan apa pun kepada penulis, sehingga memastikan bahwa tidak ada yang ditulis ke area yang belum dibaca dan bahwa penulis tertinggal pembaca dengan ukuran buffer. Buffer harus memungkinkan pembaca dan penulis beroperasi secepat mungkin dalam konstanta-konstanta itu.
Namun, sepertinya itu tidak berfungsi dengan baik. Saya sudah mencoba menggunakan perangkat nyata tetapi tidak pernah berhasil pada mereka, sedangkan percobaan dengan file bekerja pada kotak 64-bit saya tetapi tidak pada kotak 32-bit saya.
Pertama, beberapa persiapan:
$ dd if=/dev/sdj2 count=200704 | md5sum
0f0727f6644dac7a6ec60ea98ffc6da9
$ dd if=/dev/sdj2 count=200704 of=testfile
Ini tidak berfungsi:
$ 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
Ini berfungsi pada sistem 64-bit tetapi tidak pada sistem 32-bit:
$ 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
Bagaimana ini bisa dilakukan dengan andal?
catatan
Saya telah membaca pertanyaan lain tentang buffering dan melihat pv
, buffer
dan mbuffer
. Saya hanya bisa mendapatkan yang terakhir untuk bekerja dengan ukuran buffer yang diperlukan.
Menggunakan penyimpanan intermetiate adalah solusi yang jelas untuk masalah yang selalu berhasil tetapi tidak praktis ketika kapasitas cadangan yang memadai tidak tersedia.
Platform uji yang menjalankan Arch Linux dengan mbuffer
versi 20140302.
mbuffer
harus benar-benar memaksa kedua dd
tertinggal untuk pertama dan Anda hanya perlu cukup RAM untuk penyangga ukuran shift. Sayang sekali dd
tidak mendukung membaca dan menulis blok dalam urutan terbalik karena itu akan menghilangkan masalah!
-H
argumennya memungkinkan fitur ini).
mbuffer
sama sekali? Mengapa tidak malahdd
membaca seluruh isi perangkat blok dalam sekali pakaidd bs=102760448
? Tentu saja, satu atau lain cara itu buffered dalam RAM.