dd는 각 입력 블록을 두 배 크기로 확대/패딩해야 합니다.

dd는 각 입력 블록을 두 배 크기로 확대/패딩해야 합니다.

나는 이것을 주장하는 몇 가지 예를 찾았지만 dd가 주어진 블록 크기를 가진 파일을 그 블록 크기의 두 배로 변환하도록 관리할 수 없습니다.

dd if=disk256bytesectors.img of=disk512bytesectors.img cbs=256 ibs=512 obs=512 conv=sync

내 디스크 img 크기는 10MB이고 새 이미지에 대해 20MB를 예상했지만 아무것도 없습니다.

따라서 각 256바이트 블록을 512바이트 블록으로 변환해야 하며, 각 512바이트 블록의 후반부는 null, 0, 공백 등이 됩니다.

dd 수동 상태 전환=동기화

변환 및 출력 전에 ibs보다 짧은 입력 블록을 널 바이트로 이 크기로 채웁니다.

하지만 입력 블록은 결코 자신보다 짧지 않습니까? ! ? ! 그렇다면 이것은 무엇을 의미합니까?

그런데 어떻게 해야 합니까?

답변1

명령에 대해 지정할 때 socatUnix 도메인 소켓을 사용하는 것을 사용할 수 있습니다. dd에 대한 입력이 256바이트만 되도록 보장하기 위해 exec:데이터그램( ) 형식으로 구성할 수 있습니다 .type=2

예를 들어, 각 데이터그램에 대해 2바이트( )가 4( ) -b2로 채워집니다 .bs=4

$ echo abcdefx | socat -u -b2 - exec:'dd bs=4 conv=sync',type=2 | od -c   
0000000   a   b  \0  \0   c   d  \0  \0   e   f  \0  \0   x  \n  \0  \0

위의 stdin에 대한 파이프 사용은 socat이 테스트에만 해당됩니다. 일반적으로 socat필요한 -b크기(예: ) <file socat -u ...의 전체 "청크"를 읽을 수 있도록 표준 입력에 직접 입력 파일을 제공해야 합니다 .

답변2

dd바이너리 편집기를 사용하는 방법을 모르겠습니다 .

bbeUbuntu 저장소에서 사용 가능 universe하며 바로 사용할 수 있습니다.

sudo apt install bbe

나는 대부분의 Linux 배포판이 이를 사용할 것이라고 생각합니다. 명령줄 세부정보는 man bbe아래 스크립트를 참조하세요.

#!/bin/bash

if ! test -f 256dots
then
 for i in {1..256};do echo -n '.';done > 256dots
fi

filler=$(cat 256dots)

bbe -b :256 -e "A $filler" d256.img > d512.img
  • 먼저 쉘 변수를 점으로 채우는 파일을 만듭니다(원하는 경우 수정할 수 있습니다).
  • 입력 파일에서 다음 256바이트 블록을 읽고 패딩을 추가합니다.
  • 그런 다음 256바이트의 각 입력 블록에 대해 512바이트를 기록하여 모두 출력 파일에 기록됩니다.

이 쉘스크립트는 물론 개선될 수 있지만 다음 파일 이름으로 작동했습니다.

  • 입력 파일:d256.img

  • 결과물 파일:d512.img

답변3

주요 문제

따라서 각 256바이트 블록을 512바이트 블록으로 변환해야 하며, 각 512바이트 블록의 후반부는 null, 0, 공백 등이 됩니다.

dd나는 이것이 이루어질 수 없다고 생각한다 .

bbesed" 바이너리 같은 편집기" 입니다 . 데비안에서는 bbe패키지에 있습니다 .

를 실행하여 bbe블록 길이를 256으로 지정합니다. 아래 코드에서 이 $(…)섹션은 다음과 같은 스크립트를 생성합니다 A \0\0\0\0…. 256번의 출연이 있을 것이다 \0. 이 스크립트의 의미는 "각 블록 뒤에 256 NULL 바이트 추가"입니다.

<disk256bytesectors.img bbe -b :256 -e "$(
   printf 'A '; yes '\0' | head -n 256 | tr -d '\n'
)" >disk512bytesectors.img

이렇게 하면 입력의 각 256바이트 블록이 출력에서 ​​512바이트로 늘어납니다.


에 대한 부가 질문dd

conv=sync[...] 하지만 입력 블록은 결코 자신보다 짧지 않습니까? ! ? ! 그렇다면 이것은 무엇을 의미합니까?

즉, dd읽기 횟수가 ibs단일 읽기 작업() 그런 다음 conv=syncNULL 바이트를 추가합니다.

답변4

입력을 채우기 위해 패딩 입력을 제공하는 데 사용할 dd수도 있습니다 . dd예를 들어 크기가 256과 512 대신 2와 4라고 가정합니다.

dd bs=2 count=1 |
dd bs=4 count=1 conv=sync

첫 번째는 dd2바이트만 읽고, 두 번째는 dd2바이트를 읽은 다음 4바이트로 한 번 채웁니다.

더 이상 데이터가 없을 때까지( dd보고할 때 0 bytes copied:) 루프에서 이 작업을 수행해야 하는데 이는 다소 비효율적입니다. 예를 들어, 입력 문자열 abcdefx의 경우:

#!/bin/bash
echo abcdefx | ( exec 3>&1
while   log=$(dd bs=2 count=1 status=none |
              dd bs=4 count=1 conv=sync 2>&1 1>&3)
        ! [[ "$log" =~ [^0-9]'0 bytes copied' ]]
do :
done ) | od -c

밝혀지다

0000000   a   b  \0  \0   c   d  \0  \0   e   f  \0  \0   x  \n  \0  \0

관련 정보