
zfs send
저장된 ZFS "전송 스트림"이 있습니다(즉, 출력을 파일로 리디렉션하여 생성됨 ). 나는 이러한 스트림의 내용을 수신하여 파일 시스템에 쓰지 않고 검사하고 싶습니다. 예를 들어 스트림 내부의 파일 이름 목록을 보고 싶습니다. 이를 수행할 수 있는 방법이 있습니까?
나는 몇 가지를 읽고 검색했지만 내가 말하는 것과 비슷한 것을 찾지 못했습니다. 저는 둘 다 사용하고 있어요FreeBSD그리고Linux의 ZFSZFS 구현.
답변1
일부 정보를 에 파이프하여 얻을 수 있지만 zstreamdump -d
스트림에 파일이 없기 때문에 파일 이름에 대한 정보는 직접 제공되지 않습니다. 하천은 블록으로 설명된 두 나무 사이의 순수한 차이입니다. 그러나 코드는 공개되어 있으므로 ZFS 구조 감지 및 구문 분석을 추가하면 더 많은 것을 얻을 수 있습니다.
ZFS 내부 구조~이다내부적으로 트리가 있고 모든 작업은 해당 트리에서 수행됩니다. 파일, 디렉터리, 파일 이름, 속성 및 기타 모든 것은 해당 트리의 데이터일 뿐입니다. 스냅샷, 볼륨 및 FS는 트리 루트이며, 다른 스냅샷을 찍을 때 현재 루트를 어딘가에 저장하는 것입니다. 라이브 시스템은 이전 트리에서 "떠나는" 많은 데이터를 그대로 유지하면서 이전 루트에서 끊임없이 표류하는 각 트랜잭션에 대해 새로운 루트를 생성합니다. 스트림은 트리 A에서 B가 되기 위해 수행되어야 하는 작업 목록을 나타냅니다.
나는 단지 당신이 찾고 있는 데이터가 스트림에 있어야 하는 것이 아니기 때문에 스트림에서 보지 못할 수도 있다는 점을 말씀드리고자 합니다. 파일이 삭제되면 해당 블록이 해제되므로 파일 이름이나 내용이 무엇인지 알 수 없습니다. 파일이 변경되면 개체 ID로 참조되므로 파일을 처음부터 다시 작성했지만 디렉터리 항목이 업데이트되지 않은 경우에도 스트림에서 아무것도 얻을 수 없습니다.
스트림이 차등 스트림이 아니거나 이전 상태에 대한 일부 데이터가 있으면 운이 좋을 것입니다. 그러나 이는 전체 스트림이 빈 루트를 대상 트리로 변환하여 필요한 모든 데이터를 포함하기 때문입니다. 따라서 블록 구문 분석 코드를 추가하여 zstreamdump
ZFS 내부 데이터를 감지하고 처리할 수 있습니다.
답변2
짧은 답변:
나는 데이터 세트로 다시 생성하기 위해 zfs receive로 파이프하는 것보다 가벼운 전송 스트림의 내용을 유용하게 카탈로그화할 수 있는 방법이 없다고 생각합니다.
훨씬 더 긴 답변:
전송 스트림은 스토리지 블록 수준의 데이터 모음입니다.~ 아니다파일 시스템 수준의 데이터 모음입니다. 전송 스트림은 개별 파일을 모르거나 신경쓰지 않습니다. 본질적으로 원시 블록 장치를 복제하도록 설계되었습니다. 한 사용자는 zfs send
파일이 직접 저장된 ZFS 데이터 세트를 복제하는 데 독점적으로 사용할 수 있지만 다른 사용자는 이를 사용하여 ext4, ntfs 또는 심지어 LUKS와 같은 암호화된 시스템으로 포맷된 ZVOL을 복제할 수 있습니다. 이 경우 ZFS는 어떤 정보가 있는지 전혀 알지 못합니다. 볼륨의 내용은 단지 해당 볼륨의 원시 블록을 저장하는 것뿐입니다.
zfs send
데이터 세트를 복제하든 원시 zvol을 복제하든 정확히 동일하게 작동합니다. 왜냐하면 원시 블록 스토리지 수준 아래의 어떤 것에도 관심이 없기 때문입니다. 파일 이름, 파일 크기, 경로 또는 기타 사항에 대해 알지 못합니다. zvol 또는 스냅샷의 특정 스냅샷에 어떤 블록이 속하는지는 알지만 알고 있습니다.~ 아니다해당 블록이 서로 어떻게 관련되어 있는지 알아보세요.
따라서 스트림의 파일 내용을 카탈로그화하는 간단한 방법은 없습니다 zfs send
.~이다하나의 파일에 대한 내부 카탈로그가 없습니다. 이 특정 스트림이 암호화되지 않은 ZFS 데이터 세트의 전체(증분 아님) 복제라는 것을 결론적으로 알고 있더라도 파일 이름이 포함된 블록을 파악하려면 해당 스트림의 모든 블록을 한 줄씩 구문 분석해야 합니다.
기본적으로 전송 스트림에서 파일 이름을 추출하려면 zfs receive
먼저 해당 스트림을 데이터세트에 적용하는 것과 동일한 작업을 수행해야 합니다.