Ön notlar
Sadece açık olmak için:
- "Bu dosyayı 2099200 sektöründen başlayarak yazmak istiyorsanız" kullanmalısınız
obs=512 seek=2099200
. Sektörler 0 ile numaralandırılmıştır. “Sektör 0'dan başlayarak” ile yapılabilir seek=0
; "sektör 1'den" seek=1
vb.
- Bu cevaptaki komutlar içermez
sudo
. Bu okunabilirlik içindir. Sadece sudo
gerekirse kullanın .
Gerçek cevap
Sizin gibi verileri yazdıktan sonra, okuma sırasında gezinmenin en iyi yolunun kullanmak olduğuna katılıyorum ibs=512
. İle count=1
size 512 bayt okuma ve obs
bu etkileyemez. Bu 512'den tam olarak 150 bayt almak aslında oldukça kolay:
dd if=/dev/sdb ibs=512 skip=2099199 | dd of=my.txt ibs=1 count=150
Notlar:
- İlk
dd
ihtiyacın yok count=1
. İkinci çıkıştan sonra boruya yazmaya çalışırsa dd
, bir sinyal ( SIGPIPE
) alır ve oradan da çıkar . Ve dd
örneğin 9999 bayt işlemek için ikinciye ihtiyacınız varsa , orayı değiştirmek yeterlidir count
. Sen hesaplamak gerekmez count
ilk için dd
. Boru hattı mekanizması, çıktısının alıcıyı kaybettiğini bildirir.
- Başka bir yol
… | head -c 150
ancak bu POSIX değil.
Genel olarak dd
bu nedenle kullanılan kısmi blok okuyabilir ibs=1 count=150
değil, ibs=150 count=1
(karşılaştırma bu yanıt ). İkincisi muhtemelen bu durumda işe yarayacaktı, yine de genel olarak hatırlamanız gereken dd
bloklardan daha küçük olanları okuyabilir ibs
ve her biri yine de sayısını artırabilir. iflag=fullblock
yardımcı olur, ancak bu özellik POSIX için gerekli değildir ve sizin dd
de desteklemiyor olabilir. Birincisi iki nedenden ötürü dd
güvenli olmalı ibs=512
:
- Giriş dosyası aranabilir, bu nedenle
dd
sadece uygun ofseti hesaplar ve ister. Bir borudan okunursa, aslında 2099199 bloğu okuması gerekir ve genel olarak bunlardan herhangi biri kısmi olabilir, bu nedenle atılan verilerin miktarı beklediğinizden daha az olabilir. Aranabilir giriş dosyası bu konuda risk oluşturmaz.
- Cihazın bir mantıksal kesimini kapsaması beklenen bir bloğun fiili okuması size kısmi bir blok veremez. Cihaz tüm sektörü okur veya hiç bir şey okumaz (okuma hatası). "Bir mantıksal kesimi içermesi gereken bir blok" un uygun boyut ve sapma gerektirdiğini, bir kesimin ortasında başlayamayacağını not edin. Senin durumunda bu şartlar yerine getirildi.
Gelişme, iyileşme, düzelme, ilerleme
tar
dosya sonu işaretçisi olarak ikili sıfırlarla dolu iki 512 baytlık bloğu olan arşivler oluşturur. Bu, daha sonra arşivin nerede bittiğini algılayabildiği anlamına gelir, takip eden çöpleri kolayca görmezden gelebilir. Buna ek olarak, meta verileri (yol, izinler vb.) Depolar, tek bir dosyayla sınırlı değildir, dizinleri saklayabilir… Bu nedenle bazı ek yükler vardır, yine de aşağıdaki prosedür umut verici görünmektedir:
Arşiv my.txt
:
tar -cf my.txt.tar my.txt
Arşivi cihaza yazın:
dd if=my.txt.tar of=/dev/sdb obs=512 seek=2099199
Veya bir boru hattında her iki adımı da oluşturmadan yapabilirsiniz my.txt.tar
:
tar -cf - my.txt | dd of=/dev/sdb obs=512 seek=2099199
(Arşiv orijinal dosya daha büyüktür unutmayın. Sole-sonu dosyası işaretleyici 1 KiB alacaktır. Veri yerde seçilen sektöründen sonra varsa, o zaman bu durumu dikkate almalıdır. Oluşturma my.txt.tar
ve kullanılabilir alan ile boyutunu karşılaştırarak kullanmadan önce gitmenin yolu dd
.
Neyse, çağrılan orijinal dosyayı almak için:
dd if=/dev/sdb ibs=512 skip=2099199 | tar -xf -
Bu kadar. Boyutunu veya adını hatırlamanıza gerek yok. Ve tar
onun stdin borulu herhangi bir arşiv ile yapabileceği her şeyi yapabilirsiniz; örneğin içeriği listeleyebilirsiniz:
dd if=/dev/sdb ibs=512 skip=2099199 | tar -tvf -