dd vs cat - dd는 오늘날에도 여전히 의미가 있나요?

dd vs cat - dd는 오늘날에도 여전히 의미가 있나요?

나는 최근에 우리가 cat최대한 많은 것을 사용할 수 있다는 것을 깨달았습니다.dd실제로는 것보다 낫다dd

나는 이것이 dd성능뿐만 아니라 정확성을 위해 실제로 블록 크기가 중요한 테이프 작업에 유용하다는 것을 알고 있습니다. 그런데 요즘 dd우리가 할 수 있는 상황 cat과 할 수 없는 상황이 있나요 ? (여기서는 20% 미만의 성능 차이는 중요하지 않다고 생각합니다.)

구체적인 예가 더 좋을 것 같습니다!

답변1

보기에는,ddIBM 운영 체제의 도구로, 외관(매개변수 전달)을 유지하며 거의 사용되지 않는 일부 기능(예: EBCDIC에서 ASCII로의 변환 또는 바이트 순서 역전...요즘에는 일반적이지 않음)을 수행합니다.

한 번 생각동일한 디스크에 큰 데이터 블록을 복사하는 것이 dd더 빠르지만(버퍼링을 더 효율적으로 사용하기 때문에)진짜가 아니야, 적어도 오늘날의 Linux 시스템에서는 그렇습니다.

읽기가 실제로 블록 단위로 수행되는 테이프를 처리할 때 일부 옵션이 유용하다고 생각합니다 dd(테이프 드라이버는 디스크 드라이버처럼 저장 매체의 블록을 숨기지 않습니다). 하지만 구체적인 내용은 모르겠습니다.

dd다른 POSIX 도구로는 (쉽게) 수행할 수 없는 한 가지 작업은처음 N 바이트 가져오기스트림. 이를 수행하기 위해 많은 시스템을 사용할 수 있지만 head -c 42일반적 head -c이지만 POSIX에는 존재하지 않습니다(그리고 현재 OpenBSD와 같은 플랫폼에서는 사용할 수 없습니다). ( tail -cPOSIX입니다.) 또한 head -c존재하더라도 소스에서 너무 많은 바이트를 읽을 수 있습니다(내부적으로 stdio 버퍼링을 사용하기 때문에). 이는 특수 파일에서 읽는 것만으로도 문제가 되거나 영향을 미칠 수 있습니다. 나머지 데이터를 다른 프로세스가 읽어야 할 때 파이프에서 읽는 것입니다. (현재 GNU coreutils는 정확한 읽기 계산을 사용 head -c하지만 FreeBSD와 NetBSD는 stdio를 사용합니다.)

보다 일반적으로 는 ddUnix 도구 중에서 고유한 기본 파일 API에 대한 인터페이스를 제공합니다.dd덮어쓰거나 자르기하나의 문서어느 시점에서든또는찾다파일에서. (이것은 dd고유한 능력이자 중요한 능력입니다. 이상하게도 dd다른 도구가 수행할 수 있는 작업으로 가장 잘 알려져 있습니다.)

  • 대부분의 Unix 도구는 출력 파일을 덮어쓰고 내용을 지우고 처음부터 시작합니다. 이는 >쉘에서 리디렉션을 사용할 때도 발생합니다.

  • >>셸에서 리디렉션을 사용 하거나 tee -a.

  • 모든 데이터를 삭제하여 파일을 단축하고 싶은 경우특정 시점 이후, 이는 기본 커널 및 C API에서 다음을 통해 제공됩니다.truncate함수이지만 POSIX 명령줄 도구에서는 노출되지 않습니다.와는 별개로dd:

      dd if=/dev/null of=/file/to/truncate seek=1 bs=123456  # truncate file to 123456 bytes
    

    (그러나 많은 현대 시스템은 truncate유틸리티를 제공합니다.)

  • 파일 중간에 있는 데이터를 덮어쓰려면 다음과 같은 방법으로 기본 API에서 이를 수행할 수도 있습니다.열리는잘림 없이 파일에 쓰기(및 호출lseek필요한 경우 원하는 위치로 이동), dd잘라내거나 추가하지 않고 파일만 열거나찾다쉘에서 (더 복잡한 예).

      # zero out the second kB block in the file (i.e. bytes 1024 to 2047)
      dd if=/dev/zero of=/path/to/file bs=1024 seek=1 count=1 conv=notrunc
    

그래서...시스템 도구로서는 dd거의 쓸모가 없습니다.심지어 위험하다. 텍스트(또는 바이너리 파일) 처리 도구로서 매우 가치가 높습니다!

답변2

아직 dd를 사용하여 생성할 수 있다고 언급한 사람은 없습니다.스파스 파일, 그러나 truncate동일한 목적으로 사용될 수도 있습니다.

dd if=/dev/zero of=sparse-file bs=1 count=1 seek=10GB

이는 거의 즉각적이며 루프백 파일로 사용할 수 있는 임의의 큰 파일을 생성합니다. 예:

loop=`losetup --show -f sparse-file`
mkfs.ext4 $loop
mkdir myloop
mount $loop myloop

이점은 처음에는 단일 디스크 공간 블록만 사용하고 이후에는 필요할 때만 확장된다는 것입니다(ext4 형식의 10GB 파일은 내 시스템에서 291MB를 소비합니다). du실제로 사용되는 디스크 공간의 양을 확인 하는 데 사용됩니다 . ls파일이 커질 수 있는 최대 크기만 보고됩니다.

답변3

dd명령에는 cat이 수용할 수 없는 많은 옵션이 포함되어 있습니다. 아마도 cat은 귀하의 사용 사례에서 실행 가능한 대체품이지만 dd 대체품은 아닙니다.

예를 들어 dd전체가 아닌 일부만 복사하는 경우가 있습니다. 장치의 알려진 위치를 기반으로 iso 이미지 또는 하드 드라이브 파티션 테이블의 중간에서 일부 비트를 제거하고 싶을 수도 있습니다. dd이러한 작업을 허용하는 시작, 중지 및 수량 옵션을 지정할 수 있습니다 .

이러한 옵션은 dd세분화된 데이터 조작에 필수적인 반면 cat*는 전체 파일 객체, 장치 또는 스트림에서만 작동할 수 있습니다.

*Gilles가 의견에서 지적했듯이 cat다른 도구와 결합하여 특정 개체의 일부를 분리하면서도 cat전체 개체를 조작할 수 있습니다.

답변4

dd하드 드라이브나 기타 저장 장치의 부트 섹터를 백업하고( dd if=/dev/sda of=boot_sector.bin bs=512 count=1) 나중에 다시 쓰는 데 dd if=boot_sector.bin of=/dev/sda유용합니다 ( ). 암호화된 볼륨의 헤더를 백업하는 데에도 유용합니다.

cat어쩌면 약간의 변형을 가해 완성할 수도 있겠지만, 나는 그 부분을 다시 작성하는 것을 믿지 않습니다. cat특정 바이트 수만 읽고 쓰는 것은 어렵습니다 .

관련 정보