dd komutunda 'seek' argümanı


20

Bazıları bana aşağıdaki satırlarda neler olduğunu açıklayabilir mi?

dd if=/dev/urandom bs=4096 seek=7 count=2 of=file_with_holes

özellikle arama kısmı net değil

Man sayfaları diyor ki:

 seek=BLOCKS
              skip BLOCKS obs-sized blocks at start of output

Engelli blok nedir?

Yanıtlar:


22

ddveri bloklarını bir girdi dosyasından bir çıktı dosyasına kopyalamak için tasarlanmıştır . ddBlok boyutu seçenekleri arasından, aşağıdaki gibidir adam sayfası :

ibs=expr
    Specify the input block size, in bytes, by expr (default is 512).
obs=expr
    Specify the output block size, in bytes, by expr (default is 512).
bs=expr
    Set both input and output block sizes to expr bytes, superseding ibs= and obs=.

dd seekSeçeneği UNIX benzer lseek()sistem çağrısı 1 . Okuma / yazma işaretçisini dosya içinde taşır. Gönderen adam sayfası :

seek=n
    Skip n blocks (using the specified output block size) from the beginning of the output file before copying. 

UNIX'teki sıradan dosyalar, başlangıçtan başlayarak bunları okumak veya yazmak zorunda olmadığınız kullanışlı özelliklere sahiptir; her yerden arayabilir ve oradan başlayarak okuyabilir veya yazabilirsiniz. Yani bs=4096 seek=7çıktı dosyasının başlangıcından itibaren 7 * 4096 bayt bir konuma gitmek ve oradan yazmaya başlamak anlamına gelir. Dosyanın 0 ile 7 * 4096 bayt arasındaki bölümüne yazmaz.

Asla yazılmayan sıradan dosyaların alanları, temel dosya sistemi tarafından bile tahsis edilmez. Bu alanlara delikler ve dosyalara seyrek dosyalar denir . Örneğin, file_with_holesbaşında 7 * 4096 baytlık bir delik olacaktır. (h / t @frostschutz ddçıktı dosyasını varsayılan olarak kısaltır.)

Bu ayrılmamış alanları okumakta sorun yoktur; bir sürü sıfır elde edersiniz.

[1] ddyazıldığı zaman , benzer sistem çağrısı yapıldı seek().


İlginç, adam sayfam bu konuda can sıkıcı bir şekilde beklenmedik
Graeme

Ben UNIX üzerinde "arama" görmedim, belki "lseek" sanırım.
kangear

1
Sadece bir sürücü cihazı (exmaple:) aramaya çalışıyordum dd if=/dev/zero bs=512 count=2 seek=8388607998 of=/dev/sdd, ancak bu 'dosyalar' / tanımlayıcılar aranabilir değil:dd: /dev/sdd: cannot seek: Invalid argument 0+0 records in 0+0 records out 0 bytes copied, 0.00765396 s, 0.0 kB/s
Pysis 17:02

1
@Pisis Disk cihazları genellikle aranabilir, ancak belki de çok büyük cihazlarla ilgili bazı sorunlar vardır. / Dev / sdd'niz ne kadar büyük (bayt cinsinden)?
Mark Plotnick

1
Belki daha önce de var ve hatırlayamıyorum. 4 TB'lık bir diskin sonunda yedek GPT sektörüne veya 2'ye erişmeye çalışıyorum.
Piz

6

Diğer cevaplar zaten açıkladı, ancak herhangi bir şüpheniz varsa, görebilirsiniz ddile yapar strace.

$ strace dd if=/dev/urandom bs=4096 seek=7 count=2 of=file_with_holes
# output is shortened considerably
open("/dev/urandom", O_RDONLY)          = 0
open("file_with_holes", O_RDWR|O_CREAT, 0666) = 1
ftruncate(1, 28672)                     = 0
lseek(1, 28672, SEEK_CUR)               = 28672
read(0, "\244\212\222v\25\342\346\226\237\211\23\252\303\360\201\346@\351\6c.HF$Umt\362;E\233\261"..., 4096) = 4096
write(1, "\244\212\222v\25\342\346\226\237\211\23\252\303\360\201\346@\351\6c.HF$Umt\362;E\233\261"..., 4096) = 4096
read(0, "~\212q\224\256\241\277\344V\204\204h\312\25pw9\34\270WM\267\274~\236\313|{\v\6i\22"..., 4096) = 4096
write(1, "~\212q\224\256\241\277\344V\204\204h\312\25pw9\34\270WM\267\274~\236\313|{\v\6i\22"..., 4096) = 4096
close(0)                                = 0
close(1)                                = 0
write(2, "2+0 records in\n2+0 records out\n", 312+0 records in
2+0 records out
) = 31
write(2, "8192 bytes (8.2 kB) copied", 268192 bytes (8.2 kB) copied) = 26
write(2, ", 0.00104527 s, 7.8 MB/s\n", 25, 0.00104527 s, 7.8 MB/s
) = 25
+++ exited with 0 +++

Bu açılır /dev/urandomokumak için ( if=/dev/urandom) açılır file_with_holes(yaratmak / yazma için of=file_with_holes).

Sonra keser file_with_holesiçin 4096*7= 28672bayt ( bs=4096 seek=7). Kesilme, bu konumdan sonraki dosya içeriğinin kaybolduğu anlamına gelir. ( conv=notruncBu adımı önlemek için ekleyin ). Sonra 28672bayt arar .

Ardından 4096baytları (olarak bs=4096kullanılır ibs) okur /dev/urandom, 4096baytları (olarak bs=4096kullanılır obs) ve file_with_holesardından başka bir okuma ve yazma ( count=2) yazar.

Sonra kopyalar, kapatır /dev/urandom, kapatır file_with_holesve yazdırır 2*4096= 8192bayt. Sonunda hatasız çıkar (0).


5

obsçıkış bloğu boyutu ve ibsgiriş bloğu boyutu. bsOlmadan belirtirseniz ibsveya obsbu her ikisi için de kullanılır.

Bu nedenle, aramanız çıkışınızın başlangıcında 4096 veya 28672 baytlık 7 blok olacaktır. Ardından, girişin başlangıcından çıkıştaki bu noktaya 4096 veya 8192 baytlık 2 bloğu kopyalayacaksınız.


1

Seek sadece çıktı dosyasını "şişirir". Seek = 7, çıktı dosyasının başına, çıktı bloğu boyutu = obs = 4096byte olan 7 "boş" bloğun ekleneceği anlamına gelir. Bu, çok büyük dosyaları hızlı bir şekilde oluşturmanın bir yoludur.


1
Veya başlangıçta değiştirmek istemediğiniz verileri atlamak için. Boş bloklar yalnızca çıktı dosyası başlangıçta bu kadar veriye sahip değilse ortaya çıkar. Manuel de nasıl belli değil obsilgilidir bs, komutun kullandığı bshangi ikame edecektir obsorada değilse.
Graeme
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.