GNU / Linux : 오버레이 블록 장치 / 스택 가능한 블록 장치


14

GNU / Linux에는 디렉토리를 오버레이하는 통합 마운트가 있습니다. 따라서 읽기 전용 디렉토리 위에 쓰기 가능한 디렉토리를 마운트 할 수 있습니다. 쓰기 가능한 디렉토리가 마운트 해제되면 읽기 전용 디렉토리는 변경되지 않습니다.

블록 장치에 대해 동일한 기능을 찾고 있습니다-쓰기 가능 부분은 파일에 저장하는 것이 좋습니다. 그래서 나는 다음과 같은 것을 실행하고 싶습니다 :

device-setup /dev/newdevice /dev/read-only-device overlayfile

/ dev / newdevice에 쓰면 변경 사항이 오버레이 파일에 저장되어야합니다. 쓰인 섹터를 읽으면 오버레이 파일에서 데이터를 가져와야합니다. 쓰지 않은 섹터를 읽으면 / dev / read-only-device에서 데이터를 가져와야합니다.

그러한 도구가 있습니까?


답변:


22

장치 매퍼와 해당 snapshot대상 을 사용하여이를 수행 할 수 있습니다 .

기본적으로 쓰기 가능한 스냅 샷을 만들 때 LVM과 동일한 작업을 수행합니다.

dev=/dev/read-only-device
ovl=/path/to/overlay.file
newdevname=newdevice
size=$(blockdev --getsz "$dev")

loop=$(losetup -f --show -- "$ovl")
printf '%s\n' "0 $size snapshot $dev $loop P 8" |
  dmsetup create "$newdevname"

그런 다음 오버레이 된 장치에로 액세스 할 수 있습니다 /dev/mapper/newdevice.

동시에 원래 장치에 액세스해야하는 경우 다음을 수행 할 수 있습니다.

printf '%s\n' "0 $size snapshot-origin $dev" |
  dmsetup create originaldevice

그리고 그것을 통해 액세스하십시오 /dev/mapper/originaldevice.

해당 장치에 기록한 다음 스냅 샷 장치에 기록 된 청크 외에도 오버레이 파일에는 스냅 샷 원본에 기록 할 때 덮어 쓴 청크의 사본이 포함됩니다.

오버레이 파일은 스파 스 파일 일 수 있습니다. (예 :)로 만들면 truncate -s10G the-file원래 기기만큼 크지 않아도됩니다. 이 얼마나 가득 찬지 알 수 있습니다 dmsetup status "$newdevname".

참고 : 스냅 샷 장치 에는 크기 및 내용이 필요합니다 .


1
후속 흥미로운 질문은 acc.umulated 변경 후 원래의 장치에 병합 할 수 있는지 여부를
IMZ을 - 이반 Zakharyaschev을

1
후속 답변 : 예. "장치 매퍼를 사용하면… *) 블록 장치의 스냅 샷을 스냅 샷의 원래 장치로 다시 병합 할 수 있습니다." kernel.org/doc/Documentation/device-mapper/snapshot.txt
imz-Ivan Zakharyaschev

스냅 샷 대상 (여러분의 경우 8)에 대한 chunksize 매개 변수는 무엇을 의미합니까? 그것을 선택하는 방법?
imz-Ivan Zakharyaschev

1
@Tom DM 테이블의 숫자는 기본 블록 장치의 물리적 섹터 크기가 아니라 항상 512 바이트 단위를 나타냅니다. 따라서 4K 섹터가있는 장치 위에 스냅 샷 8의 배수가 아닌 것을 사용하는 것은 나쁜 생각입니다.
Stéphane Chazelas

1
@Tom에서 청크 크기는 스냅 샷의 세분성을 결정합니다. 오버레이 파일에 대한 FS의 블록 크기가 아니라 블록 장치에있는 모든 작업에서 수행되는 I / O 작업의 간격입니다. 따라서 롤백. getsz 대 getsize 주셔서 감사합니다.
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.