머리말
컴퓨터 A에 12명의 사용자 홈 디렉터리가 포함된 1TB의 암호화된 파티션이 있다고 가정합니다 sda2
. 이 파티션을 이라고 부르겠습니다. 원격 컴퓨터 B에 이 파티션을 매일 백업하고 싶습니다. 안전하고 단순하게 유지하려면 B의 백업은 sda2
B 의 정확한 이미지 복사본이어야 합니다.
sda2
나는 명령을 사용하여 로컬 이미지를 생성 dd
하고 다음을 통해 B로 전송할 수도 있다는 것을 알고 있습니다 ssh
.
$ dd if=/dev/sda2 | ssh B dd of=/backups/A.sda2.image
이 접근 방식의 문제점은 파티션 크기입니다. 테라바이트의 데이터는 네트워크를 쉽게 통과할 수 없으므로 백업 작업 빈도가 실제로 한 달에 한 번 미만으로 제한됩니다. 이때 증분 백업 도구가 필요합니다.
rsync
제 생각에는 이것이 이전의 어려움에 대한 해결책이라고 생각합니다. 그러나 테스트하려고 하면 특수 파일 및 명령으로 처리되므로 rsync
실패 합니다./dev/sda2
$ rsync /dev/sda2 B:/backups/A.sda2.image
내가하고 싶은 일을하지 않습니다.
질문
일반 파일 rsync
처리를 속이는 방법이 있나요 ?/dev/sda2
노트
이 작업을 수행할 수 있는 옵션 이 있는지 묻는 것이 아닙니다. rsync
(그런 옵션이 있으면 좋겠지만 이는 이야기의 절반에 불과합니다.) 다음을 mount
허용하는 명령이나 시스템 호출과 같은 것이 있는지 궁금합니다. 예를 들어, I 다른 응용 프로그램이 직접 읽거나 쓸 수 있도록 /mnt/sda2.live_image
원본 내용이 포함된 일반 파일을 만듭니다 ./dev/sda2
sda2
sda2.live_image
어떤 도움이라도 대단히 감사하겠습니다.
답변1
패치할 수 있다thru_fhlibfuse 데모 파일 시스템은 다음과 같습니다:
diff --git a/example/passthrough_fh.c b/example/passthrough_fh.c
index 13eb41e..146cb03 100644
--- a/example/passthrough_fh.c
+++ b/example/passthrough_fh.c
@@ -72,6 +72,21 @@ static void *xmp_init(struct fuse_conn_info *conn,
return NULL;
}
+
+static void b2r(int devfd, struct stat *stbuf)
+{
+ off_t disk_size;
+
+ disk_size = lseek(devfd, 0, SEEK_END);
+ if (disk_size == -1)
+ return;
+
+ stbuf->st_size = disk_size;
+ stbuf->st_blocks = disk_size / stbuf->st_blksize;
+ stbuf->st_mode &= ~S_IFBLK;
+ stbuf->st_mode |= S_IFREG;
+}
+
static int xmp_getattr(const char *path, struct stat *stbuf,
struct fuse_file_info *fi)
{
@@ -85,6 +100,16 @@ static int xmp_getattr(const char *path, struct stat *stbuf,
res = lstat(path, stbuf);
if (res == -1)
return -errno;
+ if (S_ISBLK(stbuf->st_mode)) {
+ int fd;
+ if (fi)
+ fd = fi->fh;
+ else
+ fd = open(path, O_RDONLY);
+ b2r(fd, stbuf);
+ if (!fi)
+ close(fd);
+ }
return 0;
}
루트로 설치하면 블록 장치가 일반 파일로 나타나는 파일 시스템의 이미지가 제공됩니다. -omodules=subdir,subdir=/dev
이미지 /dev에만 전달됩니다 .
(저는 Xhyve가 블록 장치 사용을 거부하기 때문에 Linux 설치를 OS X의 Xhyve VM으로 부팅할 수 있도록 이중 부팅 Mac/Linux 시스템에서 이 패치의 변형을 사용합니다.)
답변2
의견에서 설명했듯이 블록 장치 기반 백업은 일반적으로 나쁜 생각입니다.
암호화되지 않은 장치에서는 일반적으로 다음 단계를 사용하여 이 작업을 수행합니다.
dd if=/dev/zero of=<mountpoint>/tmp_zero_file bs=1M
사용 가능한 공간을 더 나은 비율로 압축하려면 빈 공간을 0( )으로 채우세요.- 그 다음에
dd if=<your block device> |gzip -9 | ssh backup_host "cat > backup.gz"
- 그 다음에
rm <mountpoint>/tmp_zero_file
.
여기서 문제는 디스크가 암호화되었기 때문에 파일에 0이 기록된다는 것입니다.에 익숙해암호화 계층으로 인해 블록이 0으로 설정됩니다.
귀하의 사용 사례에 대해서는 다음을 사용하는 것이 좋습니다.이중성암호화 및 증분 백업을 구현하는 rsync 기반 백업 도구입니다.
답변3
전체 파티션을 살펴보는 만큼, 무엇이 바뀌었는지 알아보려면 전체 내용을 읽어야 합니다. 실제로 변경 사항을 찾으려면 새 버전과 이전 버전을 모두 읽어야 하므로 전체 내용을 복사하는 것이 더 좋습니다. 기가비트 이더넷과 좋은 디스크를 사용하면 100MB/s를 얻을 수 있으므로 TB에 10000초 또는 약 3시간이 걸리므로 야간 백업이 가능합니다. OTOH, 대상이 SSD라면 빨리 닳겠죠.
현재 수행 중인 작업은 백업이 아니라 미러입니다. 이는 미러링 이벤트 후에 실수로 파일을 삭제했다는 사실을 사용자가 알게 된 경우에는 실제로 도움이 되지 않습니다.