나는 이것을 주장하는 몇 가지 예를 찾았지만 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
명령에 대해 지정할 때 socat
Unix 도메인 소켓을 사용하는 것을 사용할 수 있습니다. 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
바이너리 편집기를 사용하는 방법을 모르겠습니다 .
bbe
Ubuntu 저장소에서 사용 가능 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
나는 이것이 이루어질 수 없다고 생각한다 .
bbe
sed
" 바이너리 같은 편집기" 입니다 . 데비안에서는 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=sync
NULL 바이트를 추가합니다.
답변4
입력을 채우기 위해 패딩 입력을 제공하는 데 사용할 dd
수도 있습니다 . dd
예를 들어 크기가 256과 512 대신 2와 4라고 가정합니다.
dd bs=2 count=1 |
dd bs=4 count=1 conv=sync
첫 번째는 dd
2바이트만 읽고, 두 번째는 dd
2바이트를 읽은 다음 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