Ö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=1vb.
- Bu cevaptaki komutlar içermez
sudo. Bu okunabilirlik içindir. Sadece sudogerekirse 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=1size 512 bayt okuma ve obsbu 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
ddihtiyacı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 countilk için dd. Boru hattı mekanizması, çıktısının alıcıyı kaybettiğini bildirir.
- Başka bir yol
… | head -c 150ancak bu POSIX değil.
Genel olarak ddbu nedenle kullanılan kısmi blok okuyabilir ibs=1 count=150değ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 ddbloklardan daha küçük olanları okuyabilir ibsve her biri yine de sayısını artırabilir. iflag=fullblockyardımcı olur, ancak bu özellik POSIX için gerekli değildir ve sizin ddde desteklemiyor olabilir. Birincisi iki nedenden ötürü ddgüvenli olmalı ibs=512:
- Giriş dosyası aranabilir, bu nedenle
ddsadece 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
tardosya 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.tarve 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 taronun 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 -