디스크 이미지를 자체 소스에 다시 쓰는 방법은 무엇입니까?

디스크 이미지를 자체 소스에 다시 쓰는 방법은 무엇입니까?

이미지를 생성하고 동일한 장치의 새 파일 /dev/sda에 출력을 쓰려고 합니다 . .iso새 이미지 파일을 제외하여 출력이 자체 입력이 되는 것을 방지하려면 어떻게 해야 합니까? 보시다시피, 사용 가능한 공간이 더 이상 없을 때까지 일종의 무한 피드백 루프(우로보로스 등)가 생성됩니다.

root@linux:~# df /dev/sda1
Filesystem     1K-blocks      Used Available Use% Mounted on
/dev/sda1      303569136   4313624 283812008   2% /
root@linux:~# dd if=/dev/sda of=/root/image.iso
306419534336 bytes (306 GB, 285 GiB) copied, 10098.4 s, 30.3 MB/s
dd: writing to '/root/image.iso': No space left on device
598483361+0 records in
598483360+0 records out
306423480320 bytes (306 GB, 285 GiB) copied, 10099.5 s, 30.3 MB/s
root@linux:~# df /dev/sda1
Filesystem     1K-blocks      Used Available Use% Mounted on
/dev/sda1      303569136 303552756         0 100% /
root@linux:~# ls -sh /root/
total 286G
286G image.iso

답변1

여기서는 거기로 갈 수 없습니다.

대신, 당신이 원하는 것을 할 수 없습니다. 기억하세요, dd는 블록을 읽고 쓰는 것뿐입니다... /dev/sda를 가리키면 알다시피 계속 진행됩니다.

디스크에 조각화가 전혀 없는지 확인하고 데이터가 모두 연속되어 있는지 확인하고 너무 많은 블록만 추가하는 경우(데이터를 가져오지만 해당 위치에 도달하기 전에 중지하는 경우) 이 작업을 수행할 수 있습니다. 당신은 그것을 쓰고 싶어합니다). dd의 bs(블록 크기) 및 count 매개변수를 확인하세요.

당신에게 도움이 될 수 있는 방법은 충분한 크기의 빈 파일을 만들고, 여기에 파일 시스템을 쓰고, 마운트한 다음 rsync를 사용하여 데이터를 새 파일 시스템에 복사하는 것입니다. 그런 다음 스파스 파일을 마운트 해제하면 모든 데이터가 포함된 파일 시스템의 "이미지"가 생성됩니다.

답변2

dd에게 파일 내용이 아닌 장치의 블록을 읽도록 요청하고 있습니다. 파일 시스템 데이터를 읽으려면 덤프 유틸리티 중 하나를 사용할 수 있습니다. ext의 경우 dumpXFS와 같은 다른 유틸리티에는 xfs_접두사가 있습니다.

기본적으로 수행할 수 있는 작업은 LVM 또는 ZFS를 사용하고 스냅샷을 만드는 것입니다. 이는 복제하지 않을 것처럼 분명한 방식으로 데이터를 소비하지 않고 대신 기본 데이터가 변경될 때만 복제(쓰기 위해 복사)만 수행합니다.

수행되는 작업은 dd블록 0에서 시작하여 마지막 실린더에 도달할 때까지 전체 장치를 계속 탐색하는 것이며 원본 데이터보다 적은 공간에 원본 데이터를 저장할 수 없습니다. 디스크가 먼저 0으로 채워지는 경우:

dd if=/dev/zero of=/root/space_hog

그런 다음 파일을 삭제하고 압축 도구를 사용하여 즉시 추가할 수 있습니다.

dd if=/dev/sda | gzip > /root/image.iso.gz

무작위 데이터 압축(이 장치에 스왑이 있습니까?)은 까다로운 작업이므로 시간이 더 오래 걸립니다.

관련 정보