อาร์กิวเมนต์ 'find' ใน command dd


20

บางคนสามารถอธิบายว่าเกิดอะไรขึ้นในบรรทัดต่อไปนี้

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

โดยเฉพาะการค้นหาส่วนที่ไม่ชัดเจน

หน้าคนพูดว่า:

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

บล็อกขนาด obs คืออะไร?

คำตอบ:


22

ddถูกออกแบบมาเพื่อคัดลอกบล็อกข้อมูลจากไฟล์อินพุตไปยังไฟล์เอาต์พุต ddตัวเลือกขนาดของบล็อกดังต่อไปนี้จากหน้าคน :

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 seekตัวเลือกที่มีความคล้ายคลึงกับยูนิกซ์lseek()ระบบโทร1 มันย้ายตัวชี้อ่าน / เขียนภายในไฟล์ จากหน้าคน :

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

ไฟล์ทั่วไปใน UNIX มีคุณสมบัติที่สะดวกที่คุณไม่จำเป็นต้องอ่านหรือเขียนโดยเริ่มตั้งแต่ต้น คุณสามารถค้นหาได้ทุกที่และอ่านหรือเขียนเริ่มจากตรงนั้น ดังนั้นbs=4096 seek=7หมายถึงการย้ายไปยังตำแหน่ง 7 * 4096 ไบต์จากจุดเริ่มต้นของไฟล์เอาต์พุตและเริ่มเขียนจากที่นั่น มันจะไม่เขียนลงในส่วนของไฟล์ที่อยู่ระหว่าง 0 ถึง 7 * 4096 ไบต์

พื้นที่ของไฟล์ทั่วไปที่ไม่เคยเขียนถึงแม้จะไม่ได้รับการจัดสรรโดยระบบไฟล์พื้นฐาน พื้นที่เหล่านี้จะเรียกว่าหลุมและไฟล์จะเรียกว่าไฟล์เบาบาง ในตัวอย่างของคุณfile_with_holesจะมีรูขนาด 7 * 4096 ไบต์ (h / t @frostschutz สำหรับการชี้ให้เห็นว่าddตัดไฟล์เอาต์พุตโดยปริยาย)

มันก็โอเคที่จะอ่านพื้นที่ที่ไม่ได้ปันส่วนเหล่านี้; คุณได้เลขศูนย์

[1] กลับมาเมื่อถูกเขียนเรียกระบบที่คล้ายคลึงกันคือddseek()


ที่น่าสนใจหน้าคนของฉันเป็นที่น่ารำคาญอย่างไม่น่าเชื่อเกี่ยวกับเรื่องนี้ - `bs = BYTES อ่านและเขียนได้ถึงไบต์ไบต์ละครั้ง '
Graeme

ฉันไม่ได้เห็น "ค้นหา" บน UNIX อาจจะ "ดูดี" ฉันเดา
kangear

1
เพิ่งทราบว่าฉันพยายามหาอุปกรณ์ไดรฟ์ ( dd if=/dev/zero bs=512 count=2 seek=8388607998 of=/dev/sdddd: /dev/sdd: cannot seek: Invalid argument 0+0 records in 0+0 records out 0 bytes copied, 0.00765396 s, 0.0 kB/s
exmaple:)

1
@Pysis Disk มักจะหาอุปกรณ์ได้ แต่อาจมีปัญหาบางอย่างกับอุปกรณ์ที่มีขนาดใหญ่มาก / dev / sdd ของคุณมีขนาดใหญ่แค่ไหน?
Mark Plotnick

1
บางทีฉันอาจมีก่อนและจำไม่ได้ ฉันพยายามเข้าถึงภาค GPT สำรองหรือ 2 ที่ท้ายดิสก์ 4TB
Pysis

6

คำตอบอื่น ๆ อธิบายแล้ว แต่ถ้าคุณมีข้อสงสัยคุณสามารถดูสิ่งที่ddเกิด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 +++

มันเปิดขึ้น/dev/urandomสำหรับการอ่าน ( if=/dev/urandom) เปิดfile_with_holesสำหรับการสร้าง / เขียน ( of=file_with_holes)

จากนั้นจะตัดทอนfile_with_holesเป็น4096*7= 28672ไบต์ ( bs=4096 seek=7) การตัดปลายหมายความว่าเนื้อหาไฟล์หลังจากตำแหน่งนั้นหายไป (เพิ่มconv=notruncเพื่อหลีกเลี่ยงขั้นตอนนี้) จากนั้นมันจะหา28672ไบต์

จากนั้นอ่าน4096ไบต์ ( bs=4096ใช้เป็นibs) จาก/dev/urandomเขียน4096ไบต์ ( bs=4096ใช้เป็นobs) ไปที่file_with_holesตามด้วยการอ่านและเขียนอีกครั้ง ( count=2)

จากนั้นมันจะปิด/dev/urandomปิดfile_with_holesและพิมพ์ว่ามันถูกคัดลอก2*4096= 8192ไบต์ ในที่สุดมันก็ออกโดยไม่มีข้อผิดพลาด (0)


5

obsคือขนาดบล็อกออกและibsเป็นขนาดบล็อกอินพุต หากคุณระบุว่าbsไม่มีibsหรือตัวเลือกobsนี้ใช้สำหรับทั้งคู่

ดังนั้นการค้นหาของคุณจะเป็น 7 บล็อก 4096 หรือ 28672 ไบต์ที่จุดเริ่มต้นของผลลัพธ์ของคุณ จากนั้นคุณจะคัดลอก 2 บล็อก 4096 หรือ 8192 ไบต์จากจุดเริ่มต้นของอินพุตไปยังจุดนี้ในผลลัพธ์


1

ค้นหาจะ "ขยาย" ไฟล์เอาต์พุต Seek = 7 หมายความว่าที่จุดเริ่มต้นของไฟล์เอาต์พุตบล็อก 7 "ว่าง" ที่มีขนาดบล็อกเอาต์พุต = obs = 4096bytes จะถูกแทรก นี่เป็นวิธีสร้างไฟล์ขนาดใหญ่มากอย่างรวดเร็ว


1
หรือข้ามข้อมูลในช่วงเริ่มต้นซึ่งคุณไม่ต้องการเปลี่ยนแปลง บล็อกว่างเปล่าจะส่งผลเฉพาะถ้าไฟล์ที่ส่งออกครั้งแรกไม่มีข้อมูลมากพอ คู่มือยังไม่ชัดเจนว่าobsเกี่ยวข้องอย่างไรbsคำสั่งใช้bsซึ่งจะแทนที่obsหากไม่ได้มี
แกรม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.