0이 아닌 블록만 작성하여 디스크 백업 복원

0이 아닌 블록만 작성하여 디스크 백업 복원

원시 형식의 디스크 백업이 있고 처음에 0으로 채워져 있다고 가정하면 sda.img백업 /dev/sda을 복원할 때 어떻게 0을 건너뛸 수 있습니까? 시뮬레이션은 dd입력 스트림에서 제로 블록을 감지하고 출력 장치에서 적절한 조회를 수행해야 합니다.

노트

cp옵션을 시도했지만 --sparse=always대상이 블록 장치인 경우 작동하지 않는 것 같습니다.

[root@vmarch ~]# truncate sda.img -s1G
[root@vmarch ~]# cat sda.img | cp --sparse=always /dev/stdin sdb.img
[root@vmarch ~]# du -h sda.img sdb.img
0       sda.img
0       sdb.img
[root@vmarch ~]# ls -lh sda.img sdb.img
-rw-r--r-- 1 root root 1.0G Jul 31 09:17 sda.img
-rw------- 1 root root 1.0G Jul 31 09:17 sdb.img
[root@vmarch ~]# losetup -f sdb.img
[root@vmarch ~]# losetup
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE     DIO
/dev/loop0         0      0         0  0 /root/sdb.img   0
[root@vmarch ~]# cp --sparse=always sda.img /dev/loop0
[root@vmarch ~]# du -h sda.img sdb.img
0       sda.img
1.1G    sdb.img

답변1

GNU coreutils(예: 비임베디드 Linux)를 사용하면 다음을 cp --sparse=always사용하여 출력 파일을 가능한 한 희박하게 만들 수 있습니다.

cp --sparse=always sda.img /dev/sda

이것은 직선보다 빠를 수도 있고 그렇지 않을 수도 있습니다.

cat sda.img >/dev/sda

cp --sparse=always입력 내용을 읽고 분석하는 데 더 많은 시간을 투자해야 합니다. 이 cat버전은 쓰는 데 더 많은 시간이 걸리지만 출력 장치가 느리지 않는 한 복사 기간에 큰 영향을 미치지 않습니다. 이 경우 읽기 및 쓰기가 대부분 병렬화될 수 있기 때문입니다.

관련 정보