희소 파일부터 블록 장치까지

희소 파일부터 블록 장치까지

실제 크기는 몇 MB에 불과하지만 "겉보기 크기"는 약 1GB인 시스템 이미지 스파스 파일이 있습니다. (버그 없이) 블록 장치에 효율적으로 쓰려고 합니다. 제가 시도했지만 효과가 없었던 몇 가지 해결 방법은 다음과 같습니다.

  • dd if=sparse_file of=/dev/some_dev구멍을 포함하여 전체 파일을 처리하면 결국 다음과 같은 결과가 나타납니다.1007869952 bytes (1,0 GB) copied, 22,0301 s, 45,7 MB/s
  • cp --sparse=always sparse_file /dev/some_dev몇 MB가 오랜 시간(~13초)이 걸리기 때문에 작동하지 않는 것 같습니다.
  • ddrescue --sparse --force sparse_file /dev/some_dev메시지와 함께 실패함 ddrescue: Only regular files can be sparse.(참고: 다루는 내용과 반대 방향으로 작동함)여기).

다른 2가지 방법이 있습니다여기하지만 저는 단지 Linux 배포판의 표준 도구를 사용하고 싶습니다.

그렇다면 블록 이미지에 희소 파일을 쓰고 구멍을 건너뛸 수 있는 방법이 있습니까?

답변1

이 도구C로 작성된 내용이 도움이 될 수 있습니다. 표준 도구는 아니지만 매우 간단하고 컴파일하기 쉽습니다.

맞습니다. cp블록 장치에 대한 희소 출력은 지원되지 않습니다(맨 페이지에서 확인됨).

답변2

이 스레드와 관련된 문제가 발생했습니다. 무결성을 갖춘 LUKS 암호화 블록 장치를 만들었습니다. 데이터를 읽기 전에 섹터의 무결성을 확인할 수 있도록 각 섹터(예: 논리 블록)를 지우고 싶습니다. "luksFormat"에서 cryptsetup(8)은 기본적으로 모든 섹터를 지웁니다. 섹터를 덮어쓰면 해당 섹터의 무결성 비트도 덮어쓰므로 이전에 무결성 검사를 받았는지 신경 쓸 필요가 없습니다. 그러나 부분 쓰기로 인해 커널이 페이지 크기 내의 인접한 섹터와 함께 해당 섹터를 읽게 되고 관련 무결성을 확인할 수 없는 경우 쓰기가 실패합니다. 불행히도 mke2fs는 일부 섹터를 작성했습니다. 따라서 삭제되지 않은 장치에서는 mke2fs를 사용할 수 없습니다. 그래서 저는 이 "sparseblk" 유틸리티를 작성했습니다. 일반 파일에 fs 이미지를 만든 다음 일반 파일을 장치에 쓸 수 있습니다. "sparseblk" 유틸리티는 lseek(fd, offset, SEEK_DATA)를 통해 입력에서 구멍을 건너뛰고 쓰기 시 섹터 경계에 데이터를 채웁니다. 파일 시스템이 마운트되면 커널은 전체 섹터를 씁니다.

가상 시나리오:https://gitlab.com/cryptsetup/cryptsetup/issues/335#note_270050959

truncate -s 1G /tmp/1.img /tmp/2.img
truncate -s 980M /tmp/1.img /tmp/2.img
mke2fs /tmp/2.img
cryptsetup luksFormat \
    --key-file /etc/motd \
    --sector-size $(getconf PAGESIZE) \
    --cipher chacha20-plain \
    --integrity poly1305 \
    --integrity-no-wipe \
    /tmp/1.img
cryptsetup open --key-file /etc/motd /tmp/1.img dm-0
argv[0] < /tmp/2.img > /dev/mapper/dm-0
mount /dev/mapper/dm-0 /mnt/1

e2fsck 및 resize2fs 등으로 테스트하지 않았습니다.

그럼에도 불구하고 보안이 중요하다면 전체 장치를 지울 것입니다.

이 "sparseblk" 유틸리티를 다른 목적으로 사용할 수 있습니다. 이 "sparseblk" 유틸리티를 다른 목적으로 사용하는 경우 "논리적 블록 크기가 페이지 크기의 배수가 아닙니다"라는 경고를 무시할 수 있습니다.

posix는 SEEK_DATA SEEK_HOLE을 채택하고 있습니다.http://austingroupbugs.net/view.php?id=415

"희소 블록":https://gist.github.com/insulsa/18b7d31bd82ddade14db07f413c0b2d2

답변3

저는 단지 Linux 배포판의 표준 도구를 사용하고 싶습니다.

예를 들어, 기본적으로 무엇이 설치되어 있습니까?

당신이 생각하는 것에 따라 두 가지 가능한 대답이 있습니다.

  1. conv=sparsedd는 플래그로 지원됩니다 . 대상 장치가 모두 지워졌다는 것을 알고 있는 한,dd if=sparse_file conv=sparse of=/path/to/device

  2. qemu-img는 대부분의 표준 배포 저장소에서 설치할 수 있으며 희소 형식 및 쓰기를 이해합니다. 대상 블록 장치가 TRIM을 지원하는 경우 대상에 드물게 쓰게 되며 버전 4부터(제 생각에는?) 매개변수를 통해 강제로 드물게 쓰도록 할 수 있습니다 --target-is-zero.

qemu-img convert -O raw sparse_file /path/to/device 아니면 강제로 시키던가 qemu-img convert -O raw --target-is-zero sparse_file /path/to/device

관련 정보