LVM によるルートファイルシステムのスナップショットの作成
関連記事
この記事ではシステムの起動時にルートファイルシステムの LVM スナップショットを作成するように設定する方法を説明します。スナップショットを使うことで素早くフルシステムバックアップを行ったり、システムアップデートで問題が起こったときに元の状態に戻すことができます。
要件
LVM のルートファイルシステムと systemd が必要です。
セットアップ
systemd サービスを使うことでルートボリュームのスナップショットをシステムの起動時に作成できます。/etc/systemd/system/mk-lvm-snapshots.service
を以下の内容で作成してください:
[Unit] Description=make LVM snapshots Requires=local-fs-pre.target DefaultDependencies=no Conflicts=shutdown.target After=local-fs-pre.target Before=local-fs.target [Install] WantedBy=make-snapshots.target [Service] Type=oneshot ExecStart=/usr/sbin/lvcreate -L10G -n snap-root -s lvmvolume/root
lvcreate
コマンドのルートボリュームグループやボリューム名は適当な名前に置き換えてください。また、スナップショットのサイズも必要に応じて調整してください。ExecStart
プロパティを増やして lvcreate コマンドを追加することで他のファイルシステムのスナップショットも作成できます。
新しい systemd ターゲット /etc/systemd/system/make-snapshots.target
を作成してください:
[Unit] Description=Make Snapshots Requires=multi-user.target
multi-user.target
がデフォルトのターゲットでない場合、適切なターゲットに置き換えてください。
# systemctl enable mk-lvm-snapshots.service
で新しいサービスを有効化します。
システムが新しいターゲットで起動すると、ローカルのファイルシステムがマウントされた直後に LVM のスナップショットが作成されます。ターゲットを起動する GRUB メニューエントリを表示するには通常の grub.cfg
のエントリを元に /boot/grub/custom.cfg
を作成してください。カーネルコマンドラインを編集して make-snapshots.target
を起動するように設定してください:
### make snapshots ### menuentry 'Arch GNU/Linux, make snapshots' --class arch --class gnu-linux --class gnu --class os { ... echo 'Loading Linux core repo kernel ...' linux /boot/vmlinuz-linux root=/dev/mapper/lvmvolume-root ro systemd.unit=make-snapshots.target echo 'Loading initial ramdisk ...' initrd /boot/initramfs-linux.img }
grub.cfg
に変更があったときは custom.cfg
にも変更を適用することを忘れないでください。
新しい GRUB エントリでシステムを再起動すると # lvs
によって新しく作成されたスナップショットが表示されるはずです。
使用方法
バックアップ
フルシステムバックアップに使いたい場合、スナップショットを作成するターゲットでシステムを再起動してください。スナップショットボリュームをマウントしてから (読み取り専用オプションを使うと良いでしょう)、バックアップを実行してください。例えば tar を使用する方法が tar によるフルシステムバックアップに記載されています。
バックアップ中でもシステムは通常通りに使うことができます。通常のボリュームへの変更はスナップショットに反映されないためです。バックアップを行った後は忘れずにスナップショットボリュームを削除してください。copy-on-write の操作であるため通常ボリュームへの変更はスナップショットの領域を使用します。スナップショット領域が満杯になると LVM は自動的にスナップショットを拡張できないため、通常ボリュームへの書き込みを拒否したりスナップショットを破棄したりします。
アップデートのリバート
LVM スナップショットを使うことでアップデートをテストしてからリバートすることもできます。その場合、システムが問題なく動作する状態でスナップショットを作成して、その後にアップデートを実行してください。
# lvremove
でスナップショットを破棄することでアップデートを永続的に適用できます。スナップショットされた状態に戻したいときは # lvconvert --merge
を実行してください。システムを再起動するとスナップショットが通常ボリュームに書き戻されます。スナップショットの後にボリュームに書き込まれたデータは元に戻ります。
既知の問題
バグ が原因でシャットダウンが有効な状態でシステムをシャットダウンするとしばらくフリーズが発生することがあります (1〜3分ほど)。ジョブのタイムアウトを短く設定することで解決します。/etc/systemd/system
に /usr/lib/systemd/system/dmeventd.service
のコピーを作成して JobTimeoutSec=10
を追加してください:
[Unit] Description=Device-mapper event daemon Documentation=man:dmeventd(8) Requires=dmeventd.socket After=dmeventd.socket DefaultDependencies=no JobTimeoutSec=10 [Service] Type=forking ExecStart=/usr/sbin/dmeventd ExecReload=/usr/sbin/dmeventd -R Environment=SD_ACTIVATION=1 PIDFile=/run/dmeventd.pid OOMScoreAdjust=-1000