원시 형식의 디스크 백업이 있고 처음에 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
버전은 쓰는 데 더 많은 시간이 걸리지만 출력 장치가 느리지 않는 한 복사 기간에 큰 영향을 미치지 않습니다. 이 경우 읽기 및 쓰기가 대부분 병렬화될 수 있기 때문입니다.