đối số 'tìm kiếm' trong lệnh dd


20

Một số có thể giải thích cho tôi những gì đang xảy ra trong các dòng sau?

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

đặc biệt là tìm kiếm một phần không rõ ràng

Trang người đàn ông nói:

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

Khối kích thước obs là gì?

Câu trả lời:


22

ddđược thiết kế để sao chép các khối dữ liệu từ tệp đầu vào sang tệp đầu ra. Các ddtùy chọn kích thước khối như sau, từ trang man :

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=.

Các dd seektùy chọn tương tự như UNIX lseek()hệ thống gọi 1 . Nó di chuyển con trỏ đọc / ghi trong tệp. Từ trang người đàn ông :

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

Các tệp thông thường trong UNIX có thuộc tính thuận tiện mà bạn không phải đọc hoặc ghi chúng bắt đầu từ đầu; bạn có thể tìm kiếm bất cứ nơi nào và đọc hoặc viết bắt đầu từ đó. Vì vậy, bs=4096 seek=7có nghĩa là di chuyển đến vị trí 7 * 4096 byte từ đầu tệp đầu ra và bắt đầu viết từ đó. Nó sẽ không ghi vào phần của tệp nằm trong khoảng từ 0 đến 7 * 4096 byte.

Các khu vực của các tệp thông thường không bao giờ được ghi vào tất cả thậm chí không được phân bổ bởi hệ thống tệp cơ bản. Các khu vực này được gọi là lỗ và các tệp được gọi là tệp thưa . Trong ví dụ của bạn, file_with_holessẽ có một lỗ 7 * 4096 byte ở đầu. (h / t @frostschutz để chỉ ra rằng ddcắt ngắn tệp đầu ra theo mặc định.)

Bạn có thể đọc những khu vực chưa được phân bổ này; bạn nhận được một loạt các số không.

[1] trở lại khi ddđược viết, cuộc gọi hệ thống tương tự là seek().


Thật thú vị, trang người đàn ông của tôi rất khó chịu về điều này - `bs = BYTES đọc và viết lên tới byte BYTES tại một thời điểm`
Graeme

Tôi chưa thấy "tìm kiếm" trên UNIX, tôi đoán là "lseek".
kangear

1
Chỉ cần lưu ý, tôi đã cố gắng tìm kiếm một thiết bị ổ đĩa (exmaple dd if=/dev/zero bs=512 count=2 seek=8388607998 of=/dev/sdd:), nhưng những 'tập tin' / mô tả đó không thể tìm kiếm được: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

1
Các thiết bị @Pysis Disk thường có thể tìm kiếm được, nhưng có thể có một số vấn đề với các thiết bị rất lớn. Làm thế nào lớn (tính bằng byte) là / dev / sdd của bạn?
Đánh dấu Plotnick

1
Có lẽ tôi có trước đây và không thể nhớ. Tôi đang cố gắng truy cập vào khu vực GPT dự phòng hoặc 2 ở cuối đĩa 4TB.
Pysis

6

Các câu trả lời khác đã giải thích nó rồi, nhưng nếu bạn có bất kỳ nghi ngờ nào, bạn có thể thấy những gì ddlàm với 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 +++

Nó mở /dev/urandomđể đọc ( if=/dev/urandom), mở file_with_holesđể tạo / ghi ( of=file_with_holes).

Sau đó, nó cắt ngắn file_with_holesthành 4096*7= 28672byte ( bs=4096 seek=7). Cắt ngắn có nghĩa là nội dung tập tin sau vị trí đó bị mất. (Thêm conv=notruncđể tránh bước này). Sau đó, nó tìm kiếm 28672byte.

Sau đó, nó đọc 4096byte ( bs=4096được sử dụng như ibs) từ /dev/urandom, ghi 4096byte ( bs=4096được sử dụng như obs) vào file_with_holes, tiếp theo là đọc và ghi ( count=2) khác.

Sau đó, nó đóng /dev/urandom, đóng file_with_holesvà in mà nó đã sao chép 2*4096= 8192byte. Cuối cùng, nó thoát mà không có lỗi (0).


5

obslà kích thước khối đầu ra và ibslà kích thước khối đầu vào. Nếu bạn chỉ định bsmà không ibshoặc obsđiều này được sử dụng cho cả hai.

Vì vậy, tìm kiếm của bạn sẽ là 7 khối 4096 hoặc 28672 byte khi bắt đầu đầu ra. Sau đó, bạn sẽ sao chép 2 khối 4096 hoặc 8192 byte từ đầu vào đến điểm này trong đầu ra.


1

Tìm kiếm sẽ chỉ "thổi phồng" tập tin đầu ra. Seek = 7 có nghĩa là ở phần đầu của tệp đầu ra, 7 khối "trống" có kích thước khối đầu ra = obs = 4096byte sẽ được chèn vào. Đây là một cách để tạo các tệp rất lớn một cách nhanh chóng.


1
Hoặc bỏ qua dữ liệu khi bắt đầu mà bạn không muốn thay đổi. Khối trống chỉ có kết quả nếu tệp đầu ra ban đầu không có nhiều dữ liệu đó. Hướng dẫn cũng không rõ ràng về mức độ obsliên quan đến bs, lệnh sử dụng bssẽ thay thế obsnếu nó không có ở đó.
Graeme
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.