LVM によるルートファイルシステムのスナップショットの作成

提供: ArchWiki
ナビゲーションに移動 検索に移動

関連記事

この記事ではシステムの起動時にルートファイルシステムの 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 コマンドを追加することで他のファイルシステムのスナップショットも作成できます。

ノート: 実行中の環境で # lvcreate コマンドをテストして期待通りに動作することを確認してください。テストスナップショットは # lvremove で削除できます。実行中の環境で作成されたスナップショットはシングルユーザーモードや起動時に作成されたスナップショットと比べると完全性に欠けます。

新しい 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 によって新しく作成されたスナップショットが表示されるはずです。

ヒント: 新しいサービスのメッセージを確認するには # journalctl -u mk-lvm-snapshots.service を使ってください。

使用方法

バックアップ

フルシステムバックアップに使いたい場合、スナップショットを作成するターゲットでシステムを再起動してください。スナップショットボリュームをマウントしてから (読み取り専用オプションを使うと良いでしょう)、バックアップを実行してください。例えば 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