BDへの安全なバックアップ方法。


というのを契機にしてバックアップ方法を再考してたんですが、堅牢なBD書き出し方法を考えたので書き留めます。

要求

  • メディアの劣化・破損の対策を講じる
  • メディアが第三者に渡った場合のデータ漏洩を防止する
  • 利便性のため、ディスクから直接ファイルを読み出せる
  • アクセスに必要なツールはすべてフリーソフトで構成されていること

構成

上記の要求を踏まえ、このような構成でディスクを作成することにしました。

  1. ファイルをEXT4フォーマットのイメージに格納(a)
  2. イメージはLUKSにて暗号化
  3. イメージをBDに書き出す際、エラー訂正情報を付与する

依存

  • cryptsetup
  • dvdisaster
  • mdadm

作成手順

EXT4ディスクイメージの作成
cd /tmp
dd if=/dev/zero bs=1M count=3500 of=disk.img.0
dd if=/dev/zero bs=1M count=3500 of=disk.img.1
dd if=/dev/zero bs=1M count=3500 of=disk.img.2
dd if=/dev/zero bs=1M count=3500 of=disk.img.3
dd if=/dev/zero bs=1M count=3500 of=disk.img.4

sudo losetup /dev/loop0 disk.img.0
sudo losetup /dev/loop1 disk.img.1
sudo losetup /dev/loop2 disk.img.2
sudo losetup /dev/loop3 disk.img.3
sudo losetup /dev/loop4 disk.img.4

sudo mdadm --create /dev/md/md0 -l linear -n 5 /dev/loop0 /dev/loop1 /dev/loop2 /dev/loop3 /dev/loop4
sudo cryptsetup luksFormat /dev/md/md0
sudo cryptsetup luksOpen /dev/md/md0 disk
sudo mkfs.ext4 /dev/mapper/disk
mkdir mount
sudo mount /dev/mapper/disk mount
sudo chown USERNAME mount

単一のrawイメージではなく複数のイメージをRAID0で束ねているのは、ISO9660フォーマットの仕様上4GB以上のファイルを格納できないため。単一イメージにしてしまうとファイル分割の必要がある。

ディスクイメージにファイルを投入

/tmp/mountに書き出したいファイルをコピーする

ISOイメージを作成
sudo umount mount
sudo cryptsetup luksClose disk
sudo mdadm --stop /dev/md/md0
sudo losetup -d /dev/loop0
sudo losetup -d /dev/loop1
sudo losetup -d /dev/loop2
sudo losetup -d /dev/loop3
sudo losetup -d /dev/loop4
mkisofs -L -R -o disk.iso -V DISKNAME disk.img.*
dvdisaster -c -i disk.iso -mRS02 -n BD

上記のパラメータだと、30%ほどの冗長性が確保できる。あとは作成したISOイメージをBD-Rに書き出せばよい。

マウント方法
sudo losetup /dev/loop0 /path/to/disk.img.0
sudo losetup /dev/loop1 /path/to/disk.img.1
sudo losetup /dev/loop1 /path/to/disk.img.2
sudo losetup /dev/loop1 /path/to/disk.img.3
sudo losetup /dev/loop1 /path/to/disk.img.4
sudo mdadm --assemble --force /dev/md/md0 /dev/loop0 /dev/loop1 /dev/loop2 /dev/loop3 /dev/loop4
sudo cryptsetup luksOpen /dev/md/md0 disk
mkdir /tmp/mount
sudo mount /dev/mapper/disk /tmp/mount