ヘッダー
コンピュータAに12人のユーザーホームディレクトリを含む1TBの暗号化パーティションがあるとしますsda2
。このパーティションをと呼びます。リモートコンピュータBにこのパーティションを毎日バックアップしたいと思います。安全で簡単にするために、Bのバックアップはsda2
Bの正確なイメージコピーでなければなりません。
sda2
私はコマンドを使ってローカルイメージを作成し、dd
次のようにBに転送することもできますssh
。
$ dd if=/dev/sda2 | ssh B dd of=/backups/A.sda2.image
このアプローチの問題はパーティションサイズです。テラバイトのデータはネットワークを簡単に通過できないため、バックアップジョブの頻度は実際に月に1回未満に制限されます。この時点で増分バックアップツールが必要です。
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
。
ここで問題は、ディスクが暗号化されているため、ファイルにゼロが書き込まれることです。に慣れる暗号化層のため、ブロックはゼロに設定されます。
あなたのユースケースについては、以下を使用することをお勧めします。二重性暗号化と増分バックアップを実装するrsyncベースのバックアップツール。
答え3
パーティション全体を見るだけで、何が変わったのかを知るには、内容全体を読む必要があります。実際に変更を見つけるには、新しいバージョンと古いバージョンの両方を読む必要があるため、コンテンツ全体をコピーする方が良いでしょう。ギガビットイーサネットと良いディスクを使用すると、100 MB / sを得ることができ、TBに10000秒または約3時間かかり、夜間バックアップが可能になります。 OTOH、対象がSSDなら早く摩耗しますね。
現在実行中の作業はバックアップではなくミラーです。これは、ミラーリングイベントの後に誤ってファイルを削除したことをユーザーが知っている場合は、実際には役に立ちません。