본문 바로가기
리눅스

dd (Unix)

by 다움위키 2023. 12. 26.

dd유닉스유닉스-계열 운영 시스템을 위한 명령줄 유틸리티이며, 그것의 주요 목적은 파일을 변환하고 복사하는 것입니다.

유닉스에서, 하드웨어에 대한 장치 드라이버 (예를 들어, 하드 디스크 드라이브) 및 특수 장치 파일 (예를 들어, /dev/zero/dev/random)은 일반 파일처럼 파일 시스템에 나타납니다; dd는 이들 파일에서/파일로 읽고/읽거나 쓸 수 있는데, 함수가 각각의 드라이버에서 구현되었다는 조건 아래에서 그렇습니다. 결과적으로, dd는 하드 드라이브의 부트 섹터를 백업하고, 고정된 양의 임의 데이터를 얻는 것과 같은 작업에 사용될 수 있습니다. dd 프로그램은 바이트 순서 스와핑과 ASCIIEBCDIC 텍스트 인코딩 사이의 변환을 포함하여 복사되는 데이터에 대한 변환을 수행할 수도 있습니다.

History

이름 ddIBMJCL (Job Control Language)에 있는 DD 문에 대한 암시이며, 여기에서 "Data Definition"의 약어입니다. 이 명령의 구문은 다른 유닉스 명령보다 JCL 문과 더 유사하므로, Eric S. Raymond는 "인터페이스 디자인은 분명히 장난이었습니다"라고 말했습니다. 인터페이스는 명령줄 옵션 스타일을 사용하기 위해 Plan 9의 dd 명령에서 재설계되었습니다. dd는 때때로 드라이브-지우기 능력으로 인해 유머러스하게 "디스크 파괴자"라고 불리기도 합니다.

원래 ASCIIEBCDIC 사이를 변환하도록 의도된, dd버전 5 유닉스에서 처음 등장했습니다. dd 명령은 1987년 X/Open 이식성 가이드 문제 2 이후로 지정되었습니다. 이것은 단일 UNIX 사양의 일부인 IEEE 표준 1003.1-2008 (POSIX)에 의해 상속됩니다.

GNU coreutils에 번들된 dd의 버전은 Paul Rubin, David MacKenzie, 및 Stuart Kemp에 의해 작성되었습니다.

Usage

dd명령줄 구문은 많은 다른 유닉스 프로그램과 다릅니다. 그것은 보다 표준적인 -option value 또는 --option=value 형식이 아닌 명령줄 옵션에 대해 구문 option=value을 사용합니다. 기본적으로, dd표준-입력에서 읽고 표준-출력에 쓰지만, 이것들은 if (입력 파일) 및 of (출력 파일) 옵션을 사용함으로써 변경될 수 있습니다.

dd의 특정 특색은 직접 메모리 접근에 대해 옵션을 구현하기 위한 dd의 능력과 같은 컴퓨터 시스템 능력에 따라 달라집니다. 실행 중인 dd 프로세스에 SIGINFO 신호 (또는 리눅스에서 USR1 신호)를 보내면 I/O 통계를 표준 오류로 한 번 인쇄하고 그런-다음 복사를 계속하게 만듭니다. dd는 키보드에서 표준 입력을 읽을 수 있습니다. 파일 끝 (EOF)에 도달될 때, dd는 탈출할 것입니다. 신호 및 EOF는 소프트웨어에 의해 결정됩니다. 예를 들어, 윈도우로 이식된 유닉스 도구는 EOF에 따라 다릅니다: Cygwin은 Ctrl+D (보통의 유닉스 EOF)를 사용하고 MKS Toolkit은 Ctrl+Z (보통의 윈도우 EOF)를 사용합니다.

dd 호출의 비-표준화된 부분은 구현에 따라 따릅니다.

Output messages

완료되면, dd는 데이터 전송의 통계에 대한 표준-오류 스트림에 인쇄합니다. 형식은 POSIX에서 표준화되었습니다. GNU dd의 매뉴얼 페이지는 이 형식을 설명하지 않지만, BSD 매뉴얼에는 설명되어 있습니다.

각 "Records in" 및 "Records out" 줄은 전송된 전체 블록의 숫자 + 부분 블록의 숫자를 보여주는데, 예를 들어, 왜냐하면 전체 블록을 읽기 전에 물리적 매체가 종료되었거나 물리적 오류로 인해 전체 블록을 읽을 수 없었기 때문입니다.

Block size

블록은 한 번에 읽거나 쓰거나 변환되는 바이트의 숫자를 측정하는 단위입니다. 명령줄 옵션은 출력/쓰기 (obs)와 비교된 입력/읽기 (ibs)에 대해 다른 블록 크기를 지정할 수 있지만, 블록 크기 (bs) 옵션은 ibsobs 둘 다를 덮어쓸 것입니다. 입력과 출력 블록 크기 둘 다에 대해 기본값은 모두 512 바이트 (디스크의 전통적인 블록 크기, 및 POSIX-지정된 "블록"의 크기)입니다. 복사를 위한 count 옵션은, 읽기를 위한 skip 카운트와 쓰기를 위한 seek 카운트 둘 다와 마찬가지로 블록 단위로 측정됩니다. 변환 연산은 "변환 블록 크기" (cbs)의 영향도 받습니다.

블록 크기 옵션에 제공된 값은 십진수 (밑수 10) 정수 바이트로 해석됩니다. 그것은 역시 블록 크기가 바이트보다 큰 단위의 정수임을 나타내는 접미사를 포함할 수 있습니다. POSIX는 오직 512에 대해 접미사 b (블록)을 지정하고 1024에 대해 k (키비바이트)를 지정합니다. 구현은 그것들이 지원하는 추가적인 접미사에 따라 다릅니다: (자유) BSD는 소문자 m (메비바이트), g (기비바이트)를 사용하고, 계속해서 tebibyte, exbibyte, pebibyte, zebibyte, 및 yobibyte를 사용하지만, GNU는 같은 단위에 대해 MG를 사용하고 그것들의 SI 단위 짝 (킬로바이트)에 사용된 kB, MB, 및 GB와 함께 사용합니다. 예를 들어, GNU dd에 대해, bs=16M는 16 메비바이트 (16777216 바이트)의 블록-크기를 나타내고 bs=3kB는 3000 바이트를 지정합니다.

게다가, 일부 구현에서는 x 문자를 블록 크기 및 카운트 매개변수 둘 다에 대해 곱셈 연산자로 이해합니다. 예를 들어, bs=2x80x18b는 2 × 80 × 18 × 512 = 1474560 bytes, 1440 KiB 플로피 디스크의 정확한 크기로 해석됩니다. 이것은 POSIX에서 요구되지만, GNU에서는 지원하지 않는 것 같습니다. 결과적으로,bs=$((2*80*18))b의 POSIX 쉘 산술 구문을 사용하는 것이 이식성이 더 높습니다.

블록 크기는 dd 명령을 복사하는 성능에 영향을 미칩니다. 많은 작은 읽기 또는 쓰기를 수행하는 것은 종종 더 적은 큰 읽기 또는 쓰기를 수행하는 것보다 느립니다. 큰 블록을 사용하면 더 많은 RAM을 요구하고 오류 복구를 복잡하게 할 수 있습니다. dd가 테이프 드라이브 또는 네트워크와 같은 가변 블록 크기 장치와 함께 사용될 때, 블록 크기는 사용된 네트워크 프로토콜에 따라 테이프 레코드 크기 또는 패킷 크기를 결정할 수 있습니다.

Uses

dd 명령은 다양한 목적에 대해 사용될 수 있습니다. 일반-복사 명령에 대해 도메인-지정 대안보다 더 느린 경향이 있지만, "임의의 점에서 파일을 덮어쓰거나 자르기 위해 또는 파일에서 탐색"하기 위한 고유한 능력, 유닉스 파일 API에 대한 상당한 낮은 수준의 인터페이스에 탁월합니다.

아래 예제는 주로 블록 크기 인수에서 GNU dd를 사용한다고 가정합니다. 그것들을 이식-가능하도록 만들기 위해, 예를 들어 bs=64M를 쉘 산술 표현 bs=$((64*1024*1024)) 또는 bs=$((64 << 20))으로 대체하십시오 (비트 시프트와 동등하게 작성됩니다).

Data transfer

dd는 파일, 장치, 파티션 및 볼륨에 걸쳐 데이터를 복제할 수 있습니다. 그 데이터는 이들 중 임의의 하나로 입력되거나 출력될 수 있습니다; 그러나 파티션으로 이동할 때 출력과 관련하여 중요한 차이점이 있습니다. 역시, 전송하는 동안, 그 데이터는 매체에 맞게 conv 옵션을 사용하여 수정될 수 있습니다. (이를 위해, 어쨌든, ddcat보다 더 느립니다.)

dd의 데이터 전송 형식
block=$(isosize -d 2048 /dev/sr0)
dd if=/dev/sr0 of=isoimage.iso bs=2048 count=$blocks status=progress
CD-ROM, DVD 또는 Blu-ray 디스크에서 ISO 디스크 이미지를 생성합니다.
dd if=system.img of=/dev/sdc bs=64M conv=noerror 이전에 생성된 이미지에서 하드 디스크 드라이브 (또는 SD 카드, 등)를 복원합니다.
dd if=/dev/sdb2 of=partition.image bs=64M conv=noerror 64MiB 블록 크기를 사용하여 파티션 sdb2의 이미지를 생성합니다.
dd if=/dev/sda2 of=/dev/sdb2 bs=64M conv=noerror 하나의 파티션을 또 다른 파티션으로 복제합니다.
dd if=/dev/ad0 of=/dev/ad1 bs=64M conv=noerror 하드 디스크 드라이브 "ad0"를 "ad1"으로 복제합니다.

noerror 옵션은 오류가 있으면 계속 진행하는 것을 의미하지만, sync 옵션은 출력 블록을 채우게 되는 원인이 됩니다.

In-place modification

dd는 제자리에서 데이터를 수정할 수 있습니다. 예를 들어, 다음은 파일의 처음 512바이트를 null 바이트로 덮어씁니다:

dd if=/dev/zero of=path/to/file bs=512 count=1 conv=notrunc

notrunc 변환 옵션은 출력 파일을 자르지 않음을 의미합니다 – 즉, 출력 파일이 이미 존재하면, 단지 지정된 바이트를 대체하고 출력 파일의 나머지 부분을 그대로 둡니다. 이 옵션없이, dd는 512바이트 길이의 출력 파일을 생성할 것입니다.

Master boot record backup and restore

위의 예제는 역시 장치의 임의의 영역을 마스터 부트 레코드와 같은 파일에 백업하고 복원하기 위해 사용될 수 있습니다.

플로피 디스크의 처음 두 섹터를 복제하기 위해:

dd if=/dev/fd0 of=MBRboot.img bs=512 count=2

Disk wipe

보안상의 이유로, 때때로 폐기된 장치의 디스크 지움을 해야 할 필요가 있습니다. 이것은 유닉스 특수 파일에서 "데이터 전송"에 의해 성취될 수 있습니다.

  • 디스크에 영들을 쓰기 위해, dd if=/dev/zero of=/dev/sda bs=16M을 사용하십시오.
  • 디스크에 임의의 데이터를 쓰기 위해, dd if=/dev/urandom of=/dev/sda bs=16M을 사용하십시오.

위의 데이터 수정 예제와 비교할 때, notrunc 변환 옵션은 dd의 출력 파일이 블록 장치일 때 아무런 영향을 미치지 않으므로 필요하지 않습니다.

bs=16M 옵션은 dd를 한 번에 16 메비바이트를 읽고 쓸 수 있게 만듭니다. 현대 시스템에 대해, 훨씬 더 큰 블록 크기가 더 빠를 수 있습니다. 임의의 데이터로 드라이브를 채우는 것은 드라이브에 영을 채우는 것보다 더 오래 걸릴 수 있음을 주목해야 하는데, 왜냐하면 임의의 데이터는 CPU에서 생성되어야 하지만, 영을 만드는 것은 매우 빠르기 때문입니다. 현대 하드-디스크 드라이브에서, 드라이브를 영으로 채우는 것은 포함된 대부분의 데이터를 영구적으로 복구할 수 없게 만들 것입니다. 어쨌든, 플래시 메모리와 같은 다른 종류의 드라이브를 사용하면, 더 많은 데이터가 데이터 잔류에 의해 여전히 복구될 수 있을 것입니다.

현대 하드 디스크 드라이브는 드라이브에서 접근할 수 있는 부분과 접근할 수 없는 부분을 모두 영구적으로 안전하게 지우도록 설계된 Secure Erase 명령을 포함합니다. 그것은 일부 솔리드-스테이트 드라이브 (플래시 드라이브)에서도 작동할 수 있습니다. 2017년이래로, 그것은 USB 플래시 드라이브에서 작동하지 않고 Secure Digital 플래시 메모리에서도 작동하지 않습니다. 사용 가능할 때, 이것은 dd를 사용하는 것보다 둘 다에서 더 빠르고, 더 안전합니다. 리눅스 머신에서 hdparm 명령의 --security-erase-enhanced 옵션을 통해 통해 접근할 수 있습니다.

파쇄(shred) 프로그램은 개별 파일을 보다 안전하게 삭제할 뿐만 아니라 여러 번 덮어쓸 수 있는 기능을 제공합니다.

Data recovery

데이터 복구는 잠재적으로 접근할 수 없는 일부 부품을 갖는 드라이브에서 읽는 것과 관련합니다. dd는 유연한 건너뛰기 (seek) 및 기타 낮은-수준 설정으로 이 작업에 매우 적합합니다. 바닐라 dd는, 어쨌든, 사용자가 오류 메시지를 읽어야 하고 읽을 수 있는 영역을 수동으로 계산해야 하므로 사용하기에 힘듭니다. 단일 블록 크기는 역시 절충이 이루어져야 하므로 복구의 세분성을 제한합니다: 더 많은 데이터를 복구하려면 작은 블록을 사용하거나 속도를 위해 큰 블록을 사용하십시오.

dd_rescue라는 C 프로그램은 1999년 10월에 작성되었습니다. 그것은 dd의 변환 기능성을 없애고 딜레마를 처리하기 위해 두 가지 블록 크기를 지원합니다. 만약 큰 크기를 사용한 읽기가 실패하면, 가능한 한 많은 데이터를 수집하기 위해 더 작은 크기로 다시 시작합니다. 역시 거꾸로도 가능합니다. 2003년에, dd_rhelp 스크립트는 dd_rescue를 사용하는 프로세스를 자동화하여, 자체적으로 읽은 무슨 영역이 읽혔는지 추적하도록 작성되었습니다.

2004년에, GNU는 ddrescue라고 불리는 dd와 관련이 없는 별도의 유틸리티를 작성했습니다. 그것은 보다 정교한 동적 블록 크기 알고리듬을 가지고 내부적으로 무엇이 읽혀 왔는지 내용을 추적합니다. dd_rescuedd_rhelp 둘 다의 저자는 그것이 이것들의 구현보다 더 우수하다고 생각합니다. 더 최근 GNU 프로그램을 이전 스크립트와 구별을 돕기 위해, 대안적인 이름이 때때로 addrescue (freecode.com 및 freshmeat.net의 이름), gddrescue (데비안 패키지 이름) 및 gnu_ddrescue (오픈수저 패키지 이름)를 포함하여 GNU의 ddrescue에 사용됩니다.

savehd7라고 불리는 또 다른 오픈-소스 프로그램은 정교한 알고리듬을 사용하지만, 자체 프로그래밍 언어 해석기를 설치해야 합니다.

Benchmarking drive performance

드라이브 벤치마크 테스트를 수행하고 1024-바이트 블록에 대한 순차 (및 보통 단일-스레드된) 시스템 읽기와 쓰기 성능을 분석하기 위해:

  • 쓰기 성능: dd if=/dev/zero bs=1024 count=1000000 of=1GB_file_to_write
  • 읽기 성능: dd if=1GB_file_to_read of=/dev/null bs=1024

Generating a file with random data

커널 랜덤 드라이버를 사용하여 100개의 랜덤 바이트 파일을 만들기 위해:

dd if=/dev/urandom of=myrandom bs=100 count=1

Converting a file to upper case

파일을 대문자로 변환하기 위해:

dd if=filename of=filename1 conv=ucase,notrunc

Progress indicator

주로 필터로 설계된 프로그램이기 때문에, dd는 통상적으로 진행률 표시를 제공하지 않습니다. 이것은 실행 중인 GNU dd 프로세스에 USR1 신호를 보냄으로써 극복될 수 있으며, 결과적으로 dd는 전송된 블록의 현재 숫자를 인쇄합니다.

다음 한-줄짜리 결과는 dd-piddd의 프로세스-id로 대체될 때 전송이 완료될 때까지 10초마다 진행 상황을 계속 출력합니다:

while kill -USR1 dd-pid ; do sleep 10 ; done

더 최신 버전의 GNU dd는 stderr로 전송 통계를 주기적으로 인쇄할 수 있는 status=progress 옵션을 지원합니다.

Forks

dcfldd

dcfldd는 당시 미국 국방부 컴퓨터 법의학 연구소에서 일하던 Nick Harbour에 의해 개발된 향상된 버전인 GNU dd포크입니다. dd와 비교하여, dcfldd는 둘 이상의 출력 파일을 허용하고, 동시 다중 체크섬 계산을 지원하고, 파일 일치를 위한 확인 모드를 제공하고, 연산의 백분율 진행을 표시할 수 있습니다. 마지막 릴리스는 2020년이었습니다.

dc3dd

dc3dd는 미국 국방부 사이버 범죄 센터 (DC3)에서 또 다른 향상된 GNU dd입니다. 그것은 GNU 업스트림이 업데이트될 때마다 업데이트한다는 명시된 목표를 가진 dcfldd의 연속으로 볼 수 있습니다. 마지막 릴리스는 2018년이었습니다.

External links