블록 장치를 일반 파일로 마운트

블록 장치를 일반 파일로 마운트

머리말

컴퓨터 A에 12명의 사용자 홈 디렉터리가 포함된 1TB의 암호화된 파티션이 있다고 가정합니다 sda2. 이 파티션을 이라고 부르겠습니다. 원격 컴퓨터 B에 이 파티션을 매일 백업하고 싶습니다. 안전하고 단순하게 유지하려면 B의 백업은 sda2B 의 정확한 이미지 복사본이어야 합니다.

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/sda2sda2sda2.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

의견에서 설명했듯이 블록 장치 기반 백업은 일반적으로 나쁜 생각입니다.

암호화되지 않은 장치에서는 일반적으로 다음 단계를 사용하여 이 작업을 수행합니다.

  1. dd if=/dev/zero of=<mountpoint>/tmp_zero_file bs=1M사용 가능한 공간을 더 나은 비율로 압축하려면 빈 공간을 0( )으로 채우세요.
  2. 그 다음에dd if=<your block device> |gzip -9 | ssh backup_host "cat > backup.gz"
  3. 그 다음에 rm <mountpoint>/tmp_zero_file.

여기서 문제는 디스크가 암호화되었기 때문에 파일에 0이 기록된다는 것입니다.에 익숙해암호화 계층으로 인해 블록이 0으로 설정됩니다.

귀하의 사용 사례에 대해서는 다음을 사용하는 것이 좋습니다.이중성암호화 및 증분 백업을 구현하는 rsync 기반 백업 도구입니다.

답변3

전체 파티션을 살펴보는 만큼, 무엇이 바뀌었는지 알아보려면 전체 내용을 읽어야 합니다. 실제로 변경 사항을 찾으려면 새 버전과 이전 버전을 모두 읽어야 하므로 전체 내용을 복사하는 것이 더 좋습니다. 기가비트 이더넷과 좋은 디스크를 사용하면 100MB/s를 얻을 수 있으므로 TB에 10000초 또는 약 3시간이 걸리므로 야간 백업이 가능합니다. OTOH, 대상이 SSD라면 빨리 닳겠죠.

현재 수행 중인 작업은 백업이 아니라 미러입니다. 이는 미러링 이벤트 후에 실수로 파일을 삭제했다는 사실을 사용자가 알게 된 경우에는 실제로 도움이 되지 않습니다.

관련 정보