간단히 말해서, 긴 이야기입니다. *HP 컨트롤러가 포함된 5.5TB RAID5 어레이가 있습니다. * HP는 매우 고통스러운 RAID5 알고리즘을 사용합니다(참조: 지연 패리티) * 요청을 생성된 새 블록 장치, HP 어레이의 이전 디스크로 변환하는 새 블록 드라이버를 작성했습니다. - 변환은 단방향입니다(읽기 전용) ).
그래서 잘 마운트된 것으로 보이는 5.5TB "배열"이 있고 EXT4 파일 시스템 모듈은 로그가 100%가 아니며 오류로 인해 여러 디렉터리를 읽을 수 없다고 불평하지만 나머지 데이터는 신뢰할 수 있을 만큼 손상되지 않은 것 같습니다. 내 덩어리 운전자가 옳은 일을 하고 있어요.
그러나 나는 매우 조심스럽습니다. 읽기 전용 모드를 켜고 파일 시스템에서 fsck를 실행했는데 내가 고려하지 않은 문제로 인해 시스템이 완전히 중단된 것을 발견하고 싶지는 않습니다.
내가 원하는 것은 블록 장치를 블록 수준의 루프 장치에 매핑하여 fsck를 실행할 수 있도록 하고(쓰기는 루프 장치에 캐시됨) 읽기가 병합됩니다(해당 섹터에 대해 쓰기가 기록되지 않은 경우). - 블록 장치 또는 루프 장치(있는 경우)를 읽습니다.
문제는 이렇게 구성하더라도 쓰기 캐시 역할을 하는 5.5TB 파일을 생성할 디스크 공간이 충분하지 않으며, 쓰기 용량이 몇 GB에 불과하므로 시간 낭비처럼 보인다는 것입니다. -max는 fsck가 작업을 완료할 때 사용됩니다.
질문: 블록 장치를 본질적으로 크기가 0이고 쓰기 작업에 따라 커지는 파일로 루프/유니온하는 방법이 있습니까?
미리 감사드립니다.
답변1
Copy-On-Write 모드에서 dm-snapshot 또는 NBD를 사용할 수 있습니다.
dm-snapshot 솔루션은 여기에 제공됩니다(반복하지 않아서 죄송합니다).
NBD의 경우 다음과 같이 설치 nbd-server
하고 nbd-client
사용할 수 있습니다.
mount /mnt/storage # something with some free space
losetup --read-only /dev/sda1 /dev/loop0 # to ensure it's readonly
ln -s /dev/loop0 /mnt/storage/loop0
nbd-server 127.0.0.1@4242 /mnt/storage/loop0 -c
nbd-server는 자신이 제공하는 파일과 동일한 위치에 임시 쓰기 캐시 파일을 저장해야 하기 때문에 심볼릭 링크가 필요합니다. 따라서 링크가 없으면 /dev/
전혀 쓸모가 없게 됩니다 .
마지막으로 클라이언트와 연결합니다.
nbd-client 127.0.0.1 4242 /dev/nbd0
이 NBD 솔루션의 유일한 문제점은 임시 저장소 사용 가능 여부에 관계없이 (장치 크기에 따라) 많은 RAM을 사용한다는 것입니다. 그 자체로도 때때로 메모리를 많이 소모하기 때문에 fsck
, 많이 설치하지 않으면 메모리가 부족해질 수 있습니다.