여러 컴퓨터 간에 폴더 트리를 동기화 상태로 유지하려고 합니다. 현재 저는 unison
중앙 원격 서버와 함께 스타 토폴로지를 사용하고 있습니다. 서버의 데이터를 암호화하길 원하므로 서버에서는 트리 unison
(폴더 포함 .unison
)가 트리 내부에 보관됩니다 encfs
. 동기화를 수행하기 위해 각 클라이언트는 다음을 수행합니다.
- 다음을 사용하여 서버 스토리지를 마운트합니다.
sshfs
- 스토리지를 로컬
encfs
로 마운트sshfs
unison
문서의 로컬 복사본과 마운트된 복사본 사이에서 수행됩니다 .
설정에는 다음과 같은 많은 장점이 있습니다.
- 오픈 소스 도구
- 스크립트 가능한 명령줄 솔루션
- 보안 통신
ssh
encfs
폴더 트리는 절대 해독되지 않기 때문에 서버의 개인 정보 보호unison
일반 텍스트를 통해 실행되므로 동기화 중에 수정 사항을 비교하는 기능
잘 작동하지 않는 한 가지는 동기화 속도입니다. encfs
서버의 폴더가 클라이언트에 탑재되기 때문에 클라이언트가 수행하는 모든 호출은 서버로 stat()
전달되어야 합니다 . ssh
문서 트리에는 이미 수천 개의 파일이 있으며 unison
동기화는 각 파일에 대해 최소 한 번의 stat()
호출을 수행해야 합니다(폴더에 저장된 상태에 대한 수정 사항을 배제하기 위해 .unison
). 위에 나열된 장점을 유지하는 더 빠른 대안이 있습니까?
참고: 마지막 조건을 제거하려면 unison
암호 텍스트를 실행하고 트리를 로컬에서만 마운트 할 수 있습니다 encfs
. 그런 다음 unison
클라이언트와 서버에서 로컬로 실행되므로 stat()
호출 속도가 빨라집니다. 하지만 적어도 어떤 파일이 동기화되고 있는지 확인할 수 있는 옵션이 있다는 것은 좋은 일입니다. 암호문을 unison
사용 하면 encfs
파일 이름이 암호화됩니다.
이 문제를 해결하려면 동기화 중에 파일 메타데이터를 서버에서 클라이언트로 효율적으로 전송해야 한다는 것을 알고 있습니다. 예를 들어 메타데이터를 한 곳에 저장하여 하나(또는 몇 개의) 데이터 블록만 전송하여 모두 전송할 수 있는 방법(예: 기존 도구의 조합)이 있는지 궁금합니다. , 수천 개의 블록을 보내는 대신( stat()
통화 전달이 수행하는 작업)
예를 들어 서버의 큰 파일 내부에 저장된 초과 파티션 encfs
으로 교체하고 over를 통해 클라이언트에 마운트 한다면 어떻게 될까요 ? 파일 시스템이 파일 메타데이터를 함께 유지하여 몇 개의 블록만 전송하여 전송되도록 합니까 ? 전체 암호화된 파일을 다시 작성하는 대신 업데이트 중에 몇 개의 블록만 보내는 방법을 알고 계십니까 ?ext4
dm-crypt
losetup
sshfs
ext4
sshfs
답변1
ext4
나는 이상 luks
으로 성공했습니다 sshfs
. 나는 이 유형의 마운트에서 실행하는 것이 over over unison
보다 훨씬 빠르다는 것을 알았습니다 . 따라서 수천 개의 구조체가 어떻게든 fs에 함께 묶여 있어야 동기화 중에 네트워크 트래픽이 덜 필요합니다.encfs
sshfs
stat()
ext4
약간 짜증나는 점은 파일 시스템에 모든 파일에 대한 사용자 ID가 필요하며 이 사용자 ID는 fs가 클라이언트에 로컬로 마운트될 ext4
때 액세스 권한을 계산하는 데 사용된다는 것입니다 . ext4
내 경우에는 로컬 사용자 ID를 특정 번호로 변경하기로 선택했습니다.모두내가 동기화 중인 클라이언트입니다. 대안은 파일을 ext4
uid 0으로 fs에 저장한 다음 루트가 아닌 uid로 fs를 bindfs
마운트 하는 것입니다.ext4