CentOS 7でシステムを更新前に戻せるようにするならyumプラグイン「fs-snapshot」

CentOS 7でシステムを更新前に戻せるようにするならyumプラグイン「fs-snapshot」

Linux環境でも、システムの更新やパッケージの削除を行った際、何らかの理由で不具合が起こる可能性があります。

そんな万が一に備えるために、yumコマンドにはシステムの更新やパッケージの削除などの処理前に、ファイルシステムのスナップショットを取得するプラグイン「yum-plugin-fs-snapshot」があります。

ここでは、CentOS 7のLVM環境を例に「yum-plugin-fs-snapshot」の使い方を紹介します。

yum-plugin-fs-snapshotとは

「yum-plugin-fs-snapshot」は、システムの更新やパッケージの削除などを行う前に、ファイルシステムのスナップショットを作成するyumの拡張機能(プラグイン)です。

このプライグインを利用すると、yumでシステムの更新やパッケージの削除などの処理を実行する前に、自動的にルートファイルシステムのスナップショットを取得してくれるようになり、万が一、不具合が発生した場合、取得されたスナップショットを使ってファイルシステムをカンタンに戻すことができます。

なお、このプラグインを利用するには、ルートファイルシステム が LVMかBtrfsである必要があり、ルートファイルシステムがあるボリュームグループに十分な空きエクステント(未使用の領域)が必要です。

yum-plugin-fs-snapshotのインストール

空きエクステントの確認

プラグインを利用する前の事前確認として、ルートファイルシステムがあるボリュームグループに十分な空きエクステント(未使用の領域)があるかを確認します。

確認するには、次のコマンドを実行します。

# vgdisplay

  --- Volume group ---
  VG Name               centos
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  40
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               <48.80 GiB
  PE Size               4.00 MiB
  Total PE              12492
  Alloc PE / Size       8653 / 33.80 GiB
  Free  PE / Size       3839 / <15.00 GiB
  VG UUID               Uwqv3Q-BGHh-0hQ4-Df2h-xdnL-RMFs-8m4imW

この例では、ボリュームグループは一つ(centos)しかなく、ご覧のように、空きエクステント(下から2行目の「Free PE / Size」の行)が、約15GBあることが確認できます。

なお「Free PE / Size」の行が「0」と表示されている場合は、空きエクステントがないということなので、その場合は、ボリュームグループを拡張するなどして、あらかじめ空きエクステントを増やしておく必要があります。

HDDを増設してLVMのボリュームグループを拡張する方法については、以下の記事で紹介しています。

CentOS 7でLVMのボリュームグループを拡張する方法
CentOS 7でLVMのボリュームグループを拡張する方法
CentOS 7マシンにHDDを増設して、LVMのボリュームグループを拡張する方法を紹介します。

インストール

「yum-plugin-fs-snapshot」は、以下のコマンドでインストールします。

# yum install yum-plugin-fs-snapshot

設定

設定ファイルは、次のように編集します。

# vi /etc/yum/pluginconf.d/fs-snapshot.conf
…(省略)
[lvm]
enabled = 1    ←「0」を「1」に変更する
# 'lvcreate_size_args' option must specify the snapshot LV size using -L or -l
lvcreate_size_args = -l 15%ORIGIN    ←コメントアウトを外す

「lvcreate_size_args」では、スナップショットに割り当てる論理ボリュームのサイズを指定しており、デフォルトでは、ルートファイルシステムの論理ボリューム(複製元)サイズの15%となっています。スナップショットを長期保存しないなら、このサイズを変更する必要性はないと思います。

スナップショットを取得する

yum-plugin-fs-snapshotが正しく設定されていれば、yumコマンドを利用してシステムの更新やパッケージの削除を行うと、以下のように出力行でスナップショットが採られていることが確認できます。

# yum update

…(省略)
Running transaction
fs-snapshot: snapshotting / (/dev/centos/root): root_yum_20190329200125
…(省略)

取得済みスナップショットを確認する

取得したスナップショットの名前、数、サイズなどを確認する場合は、以下のコマンドを実行します。以下の例では、2つスナップショットが採られていることが確認できます。

# yum fssnap list

読み込んだプラグイン:fastestmirror, fs-snapshot
List of 2 snapshosts:
Snapshot 容量 Used Free Origin Tags
centos/root_yum_20190329200125 4.7 G 0.3% 5.7 G root yum_20190329200125
centos/root_yum_20190329200952 4.7 G 0.0% 5.7 G root yum_20190329200952
fssnap list done

パッケージ「lvm2-python-libs」がないとスナップショットが表示できないので、エラーが出た場合は、別途インストールしましょう。

取得済みスナップショットを削除するには

取得したスナップショットは、自動では削除されないため、スナップショットを何個も保存していると、ボリュームグループに空きエクステントがなり、スナップショットが取得できなくなってしまいます。また、スナップショットが取得できなくなると、yumコマンドもエラーで実行できなくなってしまいます。

なので、システムの更新やパッケージの変更後、システムの動作に問題がないことを確認したら、以下のようにコマンドを実行して、スナップショットはこまめに削除しましょう。

# lvremove /dev/centos/root_yum_20190329200952

Do you really want to remove active logical volume centos/root_yum_20190329200952? [y/n]: y
Logical volume "root_yum_20190329200952" successfully removed

スナップショットで変更を元に戻すには

システムに何らかの不具合が発生するなどして、ファイルシステムをスナップショットを使って復元したい場合は、以下のようにコマンドを実行して、スナップショットを複製元(ここではルートファイルシステム)にマージ(結合)します。

# lvconvert --merge /dev/centos/root_yum_20190329200125

Delaying merge since origin is open.
Merging of snapshot centos/root_yum_20190329200125 will occur on next activation of centos/root.

なお、ルートファイルシステムのように閉じることができない複製元へのスナップショットのマージは、システムの再起動後に実行されるので「lvconvert」コマンドを実行したらシステムを再起動します。

再起動すると自動的にマージが行われ、マージが完了すると、マージされたスナップショットは、自動的に削除されます。

あとがき

最近のセキュリティ対策では、サーバー環境などのシステムを最新の状態に保つことが重要だとよく言われますが、安定的に動作しているマシンに変更を加えるのは、ためらわれるものです。

ですが、ここで紹介した機能を利用すれば、システムの更新やパッケージの追加・削除などで、万が一トラブルが発生しても、素早くファイルシステムを復旧できるので、もしもの時に備えて導入しておくのもありではないでしょうか。