it-swarm-ko.tech

dd vs cat-dd는 요즘에도 여전히 관련이 있습니까?

최근에 cat만큼 dd을 (를) 사용할 수 있다는 것을 깨달았습니다. 실제로 dd

dd는 성능뿐만 아니라 블록 크기가 실제로 올바른 테이프를 처리하는 데 유용하다는 것을 알고 있습니다. 하지만 요즘 dd가 할 수없는 일을 cat 할 수없는 상황이 있습니까? (여기서는 성능 차이가 20 % 미만인 것으로 간주합니다.)

구체적인 예는 좋을 것입니다!

129
kizzx2

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

한 가지 예는 dd을 사용하여 일부는 복사하지만 전체는 복사하지 않는 것입니다. 아마도 장치의 알려진 위치에 따라 하드 드라이브에서 iso 이미지의 중간 부분이나 파티션 테이블의 일부 비트를 제거하려고 할 수 있습니다. dd를 사용하면 이러한 작업을 허용하는 시작, 중지 및 수량 옵션을 지정할 수 있습니다.

이러한 dd 옵션을 사용하면 세밀한 데이터 조작에 반드시 필요한 반면 cat *는 전체 파일 개체, 장치 또는 스트림에서만 작동 할 수 있습니다.

* Gilles의 의견에서 언급했듯이 cat을 다른 도구와 결합하여 무언가를 분리 할 수 ​​있지만 cat는 여전히 전체 개체에서 작동합니다.

22
Caleb

Dd를 사용하여 sparse files 를 만들 수 있다고 언급 한 사람은 없지만 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

좋은 점은 처음에는 하나의 디스크 공간 블록 만 사용하고 나서 필요한만큼만 증가한다는 것입니다 (10GB 파일의 4 번째 형식은 시스템에서 291MB를 소비 함). du를 사용하여 실제로 사용되는 디스크 공간을 확인하십시오. ls는 파일이 커질 수있는 최대 크기 만보고합니다.

21

하드 드라이브의 특정 부분을 다른 것으로 재정의하는 것이 일반적인 예입니다. 예를 들어 다음 명령을 사용하여 MBR을 삭제하려고 할 수 있습니다.

dd if=/dev/zero of=/dev/sda bs=446 count=1

또한 빈 파일을 만들 수 있습니다 (예 : 루프 디스크 이미지).

dd if=/dev/zero of=10mb.file bs=1024k count=10
10
XQYZ

dd는 하드 드라이브 또는 다른 저장 장치의 부팅 섹터를 백업하는 데 매우 유용합니다 (dd if=/dev/sda of=boot_sector.bin bs=512 count=1) 나중에 다시 작성 (dd if=boot_sector.bin of=/dev/sda). 암호화 된 볼륨의 헤더를 백업 할 때도 유용합니다.

cat는 그렇게 할 수 있지만 재 작성 부분에서는 믿지 않을 것입니다. cat가 특정 바이트 수만 읽거나 쓰는 것은 어렵습니다.

9
LawrenceC

최근에 리눅스 역사상 처음으로 몇 개의 GB 단위의 100GB 파티션을 복제해야했습니다 (c.f cp -ar 또는 rsync 여러 번 나에게 도움이 됨). 물론 나는 dd '모든 사람들이 그것이 당신이 무엇을 사용하는지 알고 있으며, 성능에 겁을 먹었습니다. 약간의 인터넷 검색으로 인해 곧 ddrescue 로 연결되었습니다. 이는 몇 번 사용해 왔으며 훌륭하게 작동합니다 (dd보다 훨씬 빠름).

5
timday

몇 년 동안 내가 생각해 낸 dd 트릭은 다음과 같습니다.

친절하지 않은 tty 또는 비 대화식 모드 bash에서 잘라 내기 및 붙여 넣기

EOF/^ D/^ F가 감지되지 않는 상황에서는 dd를 사용하여 텍스트 파일을 호스트로 전송할 수 있습니다. 지정된 양의 바이트 후에 자동으로 읽기를 중지하기 때문입니다.

나는 작년에 원격 호스트에서 tty가 아닌 쉘을 얻을 수 있었고 파일을 전송 해야하는 보안 연습 중에 최근에 이것을 사용했습니다.

사실, 나는 바이너리 파일을 base64로 인코딩하고 느리지 만 안정적인 pure-bash base64 디코딩 스크립트를 사용하여 바이너리 파일을 만들었습니다.

dd of=textfile.txt bs=1 count=<size_of_data_in_paste_buffer>

매우 멋진 트릭은 dd가 실행되는 동안 USR1 신호를 보내면 현재 상태 (바이트 읽기, 초당 바이트)를 방출한다는 것입니다.

범용 처리량 상태 필터

나는 stdout을 통해 데이터를 내보내는 모든 프로그램에 대한 순수한 bash 진행 필터로 작동하도록 이것을 썼습니다. (참고 : 거의 모든 것은 stdout을 통해 데이터를 방출합니다. 바이트 수, 인쇄 해시 표시 (해시 모드가 설정된 경우 올드 스쿨 FTP 등)

(주) 진행 파일은 절름발이입니다. 이것은 대부분 개념 증명입니다. 다시 수정하면 변수를 사용합니다.

 dd bs=$BLKSZ of=${TMPFILE} 2>&1 \
                | grep --line-buffered -E '[[:digit:]]* bytes' \
                | awk '{ print $1 }' >> ${PROGRESS} &

 while [[ $(pidof dd) -gt 1 ]]; do

        # PROTIP: You can sleep partial seconds
        sleep .5

        # Force dd to update us on it's progress (which gets
        # redirected to $PROGRESS file.    
        pkill -USR1 dd
        local BYTES_THIS_CYCLE=$(tail -1 $PROGRESS)
        local XFER_BLKS=$(((BYTES_THIS_CYCLE-BYTES_LAST_CYCLE)/BLKSZ))

        if [ $XFER_BLKS -gt 0 ]; then
                printf "#%0.s" $(seq 0 $XFER_BLKS)
                BYTES_LAST_CYCLE=$BYTES_THIS_CYCLE
        fi
done

익명 셸 파일 핸들을 사용하는 슬라이스 및 주사위 파일

다음은 tmp 파일을 사용하여 부분 파일 데이터를 저장하지 않고 익명의 파일 핸들을 통해 tar 입력을 제공하여 오류없이 추출 할 수있는 서명 된 tar 파일을 얻는 방법에 대한 의사 코드 예입니다.

generate_hash() {
    echo "yay!"
}

# Create a tar file, generate a hash, append it to the end
tar -cf log.tar /var/log/* 2>/dev/null
TARFILE_SIZE=$(stat -f "%z" log.tar)
SIGNATURE=$(generate_hash log.tar)
echo $SIGNATURE >>log.tar

# Then, later, extract without getting an error..

tar xvf <(dd if=$OLDPWD/log.tar bs=1 count=${TARFILE_SIZE})

Tl; dr는 : dd가 매우 유용하다는 것을 알았습니다. 그리고 이것은 제가 머리 꼭대기에서 생각할 수있는 세 가지 예일뿐입니다.

5
synthesizerpatel

일부 출력 내용을 리디렉션 할 수 있습니다. Sudo로 작성해야하는 경우 특히 유용합니다.

echo some_content | Sudo dd status=none of=output.txt

Sudo 외에 다음과 같습니다.

echo some_content > output.txt

또는 이것 :

echo some_content | Sudo tee output.txt > /dev/null
5
Alexey