Belirtilen konumdaki dosyayı kopyalamak ve okumak için Linux gb kullanın


1

ddKomutu, sabit sürücünün herhangi bir yerine bir dosya yazmak ve ardından aynı dosyayı bu konumdan okumak için kullanmak istiyorum . Herhangi bir dosya sisteminde veya bölümlemede bağımsız olmam gerekiyor. Bunu yapmak kolay değil. Önkoşullar:

  1. Bunu yapabilmek için sabit diskte dolaşabilmem gerekiyor. Pusula sektörler olurdu, diyelim ki 1 sektör = 512 B
  2. Dosya boyutu, diyelim ki 150 B. Basit metin dosyası.
  3. Bu dosyayı 2099200 sektörden başlayarak yazmak istiyorum.

Bunu denedim:

sudo dd if=my.txt of=/dev/sdb obs=512 seek=2099199
sudo dd if=/dev/sdb of=my.txt obs=150 count=1 ibs=512 skip=2099199

ancak çalışmıyor çünkü ibs512 B sayısından dolayı sadece 150 B okuyamıyorum . Sabit diskte kolayca gezinmek için bu sayıma ihtiyacım var, bu yüzden 512 B olmalı.

Bu olayı ele almanın kolay bir yolu var mı dd? Ya da belki bunu yapmak için başka bir komut veya yolu var? Her türlü dosya sisteminden ve bölümlemeden bağımsız olmam gerekiyor.

Yanıtlar:


1

Saymak bytes (2099199*512)değil aramak için bunu kullanabilirsiniz bs.

dd if=your.txt of=/dev/sdb count=1 bs=150 oflag=seek_bytes seek=1074789888 

ve

dd if=/dev/sdb of=your.txt count=1 bs=150 iflag=skip_bytes skip=1074789888 

Bakın man dd.


O zaman ne hakkında:

dd if=your.txt of=/dev/sdb bs=1 count=150 seek=1074789888 

ve

dd if=/dev/sdb of=your.txt bs=1 count=150 skip=1074789888 

maalesef dd versiyonumda bu bayraklar yok.
ncheltsov

0

Ö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 -
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.