LVM によるルートファイルシステムのスナップショット作成
関連記事
この記事では、システム起動時にルートファイルシステムの LVM スナップショットを作成する設定方法について説明します。このようなスナップショットは、ダウンタイムを最小限に抑えた フルシステムバックアップ や、システムの更新をテストして元に戻すオプションに使用することができます。
必要なもの
LVM ルートファイルシステムと systemd を搭載したシステムが必要です。 LVM スナップショット の前提条件が正しく設定されていることを確認してください。
セットアップ
システムの起動時にルートボリュームのクリーンなスナップショットを作成するために systemd サービスを使用します。
/etc/systemd/system/mk-lvm-snapshots.service
を作成します。
[Unit] Description=make LVM snapshots Requires=local-fs-pre.target Wants=local-fs.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 サービスマニュアル を参照してください)。
新しい systemd ターゲット /etc/systemd/system/make-snapshots.target
を作成します。
[Unit] Description=Make Snapshots Requires=multi-user.target
multi-user.target
がデフォルトターゲットでない場合、ベースターゲットを適応させます。デスクトップに入りたい場合は、graphical.target
に変更する必要があります。
mk-lvm-snapshots.service
を 有効化
新しいターゲットでシステムを起動すると、ローカルファイルシステムをマウントした直後に LVM snapshot(s) が作成されます。
このターゲットで起動する GRUB メニューエントリを取得するには、/boot/grub/custom.cfg
をベースに作成します。
grub.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/lvmvolume/root ro systemd.unit=make-snapshots.target echo 'Loading initial ramdisk ...' initrd /boot/initramfs-linux.img }
grub.cfg
が変更された場合は、custom.cfg
を調整することを忘れないでください。
この grub エントリでシステムを再起動すると、lvs
に新しく作成されたスナップショットが表示されるはずです。
使い方
バックアップ
この機能を利用してシステムのフルバックアップを行うには、スナップショット作成ターゲットでシステムを再起動します。
スナップショットボリューム (必要であればさらにボリューム) を、できれば読み込み専用 (-o
) オプションを使ってマウントしてください。
次に、例えば tar を使って、Tar によるフルシステムバックアップ で説明されているようにシステムをバックアップします。
バックアップ中は、通常のボリュームへの変更はすべて不可視なので、システムを通常通り使用し続けることができます。 スナップショット バックアップ後、スナップショットボリュームを削除することを忘れないでください。 コピーオンライト操作により、スナップショットのスペースを使用します。スナップショット領域が完全に使用されるようになり、LVM が自動的にスナップショットを大きくすることができない場合、LVM は通常のボリュームへのさらなる書き込みを拒否するか、スナップショットを削除します。
更新を元に戻す
LVM スナップショットのもう1つの用途は、更新のテストと元に戻すことです。この場合、システムのスナップショットを作成します 既知の良好な状態で、後で更新または変更を実行します。
更新を永続的に保持したい場合は、lvremove を使用してスナップショットを削除するだけです。スナップショットに戻したい場合
スナップショットに対して lvconvert--merge
を発行します。システムの次回の再起動時(デフォルトのターゲットを使用)、スナップショット
通常のボリュームにマージされます。ボリュームへのすべての変更は、スナップショットが取り消された後に行われます。
既知の問題点
バグ 681582 により、アクティブなスナップショットを使用してシステムをシャットダウンするとスナップショットがしばらくハングすることがあります(現在1~3分)。回避策として、より短いジョブタイムアウトを設定することができます。
/usr/lib/systemd/system/dmeventd.service
のコピーを /etc/systemd/system
に作成し、以下のように挿入してください。
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