dd
자르기, 찾기, 건너뛰기 기능을 사용하여 파일을 읽고 쓰는 것 외에 어떤 도구를 사용해야 합니까? 명령줄 옵션이 불편하고 낯설고, dd
느리지만 정확한 검색 모드( bs=1
)와 빠르지만 융통성이 없는 모드( 또는 기타 모드) bs=4k
중에서 선택해야 하는 것을 좋아하지 않습니다.
잘림 여부에 관계없이 위치 31337의 파일(또는 파이프, 소켓 또는 개발)에서 555바이트를 읽고 이를 위치 128205의 다른 파일(블록 512+43 사용)에 쓸 수 있는 보다 현대적인 도구가 있습니까?
답변1
도구가 있습니다 (참고: 거의 동일한 기능을 가진 다른 프로그램 ddrescue
도 있습니다 ). dd_rescue
짧은 옵션에는 단일 대시, 긴 옵션에는 이중 대시가 포함된 보다 친숙한 구문을 사용합니다. 매뉴얼 페이지에서:
-i, --input-position=<bytes>
starting position in input file [0]
-K, --skip-size=<bytes>
initial size to skip on read error [64 KiB]
-M, --retrim
mark all failed blocks as non-trimmed
-o, --output-position=<bytes>
starting position in output file [ipos]
답변2
dcfldd또 다른 dd 대안입니다. 입력/출력의 유연성을 추구하는 것에 대한 OP의 질문을 다루지는 않지만 인터넷 검색을 통해 여기에 오는 다른 사람들에게는 유용할 수 있습니다.
이는 다음과 같은 추가 기능을 갖춘 gnu dd를 기반으로 합니다.
- 실시간 해싱 - dcfldd는 입력 데이터가 전송되는 동안 해시하여 데이터 무결성을 보장할 수 있습니다.
- 상태 출력 - dcfldd는 전송된 데이터 양과 작업에 소요되는 시간을 기반으로 진행 상황을 사용자에게 업데이트할 수 있습니다.
- 유연한 디스크 삭제 - dcfldd를 사용하면 디스크를 신속하게 삭제하고 필요한 경우 알려진 패턴을 사용할 수 있습니다.
- 이미지/삭제 확인 - dcfldd는 대상 드라이브가 지정된 입력 파일 또는 패턴과 비트 단위로 일치하는지 확인할 수 있습니다.
- 다중 출력 - dcfldd는 여러 파일이나 디스크에 동시에 출력할 수 있습니다.
- 출력 분할 - dcfldd는 출력을 여러 파일로 분할할 수 있으며 분할 명령보다 더 구성 가능합니다.
- 파이프형 출력 및 로그 - dcfldd는 모든 로그 데이터와 출력을 기본 명령 및 파일로 보낼 수 있습니다.
답변3
좋은 대안은 pv
가장 효율적인 청크 크기를 자동으로 계산하여 기본적으로 속도를 높일 뿐만 아니라 진행 등도 제공합니다. 사용법은 간단합니다:
pv < /dev/sda > sda.img
압축 측면에서도 좋은 성능을 발휘합니다. 한 번에 디스크를 백업하고 압축하는 빠른 방법은 다음과 같습니다.
pv < /dev/sdb | pigz -9 > disk.img.gz
더 자세히 알아볼 수 있습니다.여기.
답변4
실제로 성능 저하 없이, 잘림이나 반올림 오류 없이, 바이트 수준 정밀도로 dd 파이프를 사용하여 이 작업을 수행할 수 있습니다.
dd iflag=skip_bytes,count_bytes skip=1234 count=42 | dd oflag=seek_bytes conv=notrunc seek=12340 of=test.bin
왼쪽에서 dd는 처음 1234바이트를 건너뛰고 정확히 42바이트를 읽습니다. 이는 효율적인 섹터 버퍼링 및 정렬을 통해 수행됩니다. 반올림 오류 없이 오프셋 1234에서 42바이트를 읽습니다. 오른쪽에서 dd는 출력에서 정확히 12340바이트를 찾고 파이프에서 수신된 42바이트만 씁니다. 이는 효율적인 섹터 버퍼링 및 정렬을 통해 수행됩니다. 파이프라인 내에서 두 개의 dd 인스턴스는 올바르게 처리되는 마지막 몇 바이트를 제외하고 우수한 성능을 위해 섹터 크기의 청크로 데이터를 보내고 받습니다.
count_bytes에는 oflag가 없으므로 이 파이프가 필요합니다!
다음은 파이프 없이 2바이트만 계산하려는 예입니다. 추가 데이터가 입력에서 소비되고 출력에 기록됩니다.
$ printf aaa | dd oflag=seek_bytes conv=notrunc seek=0 count=2 | xxd
0+1 records in
0+1 records out
00000000: 6161 61 aaa
3 bytes copied, 0.000158916 s, 18.9 kB/s