두 개의 Linux(NixOS) 시스템이 있고 암호화된 ZFS 형식의 휴대용 USB 하드 드라이브를 공유하고 싶습니다. 한 컴퓨터에서는 제대로 작동했지만 두 번째 컴퓨터에 설치하려고 하면 드라이브의 ZFS 파일 시스템이 손상되었을 수 있습니다.
USB 드라이브를 한 시스템에서 다른 시스템으로 이동하기 전에 zpool을 내보내 마운트 해제했습니다. 두 번째 시스템의 드라이브에서 zpool을 가져올 수 있기를 원하지만 zpool의 ZFS 개념을 오해하고 있는 것일 수 있습니다. , 등 의 다양한 조합을 통해 두 번째 시스템에서 ZFS 드라이브를 볼 수 없습니다 zpool list
. 드라이브가 확실히 나타났지만 이 두 번째 시스템에 대한 ZFS의 자동 감지는 알 수 없는 이유로 드라이브를 무시했습니다.zpool import -a
zpool import -D
/dev/sdb
sudo zpool create z /dev/sdb
나는 zpool이 이 시스템에서 미러링해야 하는 완전히 가상적인 것이라고 생각하여 간단한 작업을 수행하게 되었지만 이 명령은 경고 없이 해당 드라이브의 원래 ZFS 파일 시스템을 덮어쓴 것 같습니다. 이제 드라이브는 암호화되지 않은 비어 있는 파일 시스템이 되었으며 여기에서 데이터를 복구할 수 있는지 확실하지 않습니다. 다행히 백업이 있어서 완전 손실은 아니었습니다.
두 가지 질문:
기존 vdev에 새 zpool을 생성하면 해당 장치의 이전 ZFS 파일 시스템이 영구적으로 삭제됩니까?
기존의 암호화된 ZFS 드라이브 zpool을 한 시스템에서 다른 시스템으로 가져오고 원래 zpool 구성 옵션(예: 압축, 암호화, 데이터 세트 등)을 모두 가져오려면 어떻게 해야 합니까? 그렇지 않다면
zpool import
무엇입니까?
답변1
실험을 통해 첫 번째 질문에 답했다고 생각합니다. 예, zpool create
영향을 받은 vdev의 기존 풀을 모두 삭제합니다.
이 풀을 공유할 시스템 간의 호환성을 보장하려는 경우 zpool 구조의 메커니즘이 정확하고 테스트 성공을 방해할 수 있는 잠재적인 차단이 없다고 확신할 때까지 암호화를 중단하는 것이 좋습니다. .
ZFS 풀을 시스템 간에 이식할 수 있는 데 필요한 조건 중 하나는 풀을 구성하는 블록 장치(및 풀 메타데이터에 인코딩된 블록 장치)가 풀이 있는 모든 시스템에서 명시적이어야 한다는 것입니다. 수입. 이로 인해 /dev/sdb
. 더 나은 접근 방식은 사용하려는 각 드라이브에 파티션을 만들고 사용된 각 파티션에 고유한 레이블을 할당하는 것입니다. 드라이브의 일련 번호는 풀 메타데이터에서 전자적으로 볼 수 있을 뿐만 아니라 출력에서도 볼 수 있고 blkid
물리적 드라이브 섀시를 검사할 때 사람이 볼 수 있기 때문에 사용하기 편리한 문자열인 경우가 많습니다.
따라서 하드 드라이브의 일련 번호가 이면 6SL0CTD
해당 드라이브에 파티션을 생성하고 레이블을 지정해야 합니다 zfs-data-6SL0CTD
. 그런 다음 잠재적으로 변경 가능한 물리적 장치가 아닌 해당 논리 장치를 참조하는 풀을 만듭니다.
# zpool create tank /dev/disk/by-partlabel/zfs-data-6SL0CTCD
또한 매뉴얼 페이지를 읽고 zpool import
무엇을 가져올지(또는 가져오지 말아야 할 이유) 확실하지 않을 때 사용할 수 있는 비파괴 도구가 많이 있다는 점에 유의하세요.
매개변수가 없는 경우:
# zpool import
가져올 수 있는 풀을 표시합니다. 테스트 케이스는 없지만 풀도 보여줄 것이라고 믿습니다.할 수 없다일반적으로 장비의 누락 또는 오작동으로 인해 수입됩니다. 장치가 "누락"되는 이유 중 하나는 풀 메타데이터에 /dev/sdb가 사용됨이 표시되어 있지만 호스트에 이미 /dev/sdb가 있고 장치에 풀과 일치하는 메타데이터가 없기 때문일 수 있습니다. 다시 말하지만, 파티션 레이블을 할당하고 파티션 레이블만을 기반으로 풀을 생성하는 것이 중요한 이유입니다. 해당 파티션 레이블이 있으면 풀을 찾을 수 있으며 무엇이든 가능합니다.물리적파티션이 나타나는 장치입니다.
# zpool import -N tank
풀을 가져오되 tank
풀에서 파일 시스템을 마운트하지 마십시오. 이는 풀에 대한 보조 검사로 사용될 수 있습니다. 아무것도 설치되어 있지 않아도 풀의 통계를 확인할 수 있고, 풀에 scrub
침대를 깔 수 있는 등의 작업이 가능합니다.
명확한 장치 이름을 사용하도록 풀을 올바르게 생성했다면 나중에 이것이 왜 중요한지 이해하게 될 것입니다.
zpool status -P
풀에 있는 모든 장치에 대한 전체 논리 경로가 표시됩니다.
# zpool status -P
pool: tank
state: ONLINE
scan: scrub repaired 0B in 21h34m with 0 errors on Sun Oct 10 21:58:23 2021
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
/dev/disk/by-partlabel/zfs-data-6SL0CTCD ONLINE 0 0 0
errors: No known data errors
그렇지 않으면 zpool status -L
표시됩니다.물리적풀에 있는 모든 장치의 장치 이름:
# zpool status -L
pool: tank
state: ONLINE
scan: scrub repaired 0B in 21h34m with 0 errors on Sun Oct 10 21:58:23 2021
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
sdb1 ONLINE 0 0 0
errors: No known data errors
물리적 장치 노드 대신 파티션 레이블을 사용하는 최종 결과는 zpool status -P
풀로 가져온 모든 시스템에서 출력이 동일하지만 출력이 zpool status -L
매우 다를 수 있다는 것입니다. 이것이 zpool create
풀로 가져와야 할 수 있는 모든 시스템에서 이러한 장치가 명시적임을 보장하기 위해 비변형 논리 장치 측면에서 명령을 작성해야 하는 이유입니다 .
명시적인 장치 이름을 기반으로 풀을 구축한 후에는 풀을 가져올 수 있어야 하는 호스트에 상당히 유사한 ZFS 스택이 있다고 가정하면 zpool 암호화가 간단해집니다.