ウェブサイト検索

Linux でスナップショットを作成する方法


スナップショットは、特定の時点でのファイルシステムの状態のイメージです。スナップショットは、何か問題が発生した場合に「時間を巻き戻し」、システムを正常な状態に戻すのに非常に役立ちます。この記事の執筆時点では、Linux 上でアトミック スナップショットを作成できるネイティブな方法は主に 2 つあります。LVM (Logical Volume Manager) を使用する方法と、組み込み機能としてスナップショットを備えた BTRFS ファイルシステムを作成する方法です。

このチュートリアルでは、LVM スナップショットと BTRFS スナップショットの違い、Linux 上でスナップショットを作成および管理する方法を学びます。

このチュートリアルでは次のことを学びます:

  • 従来のシンLVMスナップショットを作成および管理する方法
  • BTRFS スナップショットを作成および管理する方法

LVM 対 BTRFS

LVM と BTRFS を比較するのは完全に公平ではありません。後者はファイルシステムですが、前者はボリューム マネージャーであり、ストレージ デバイス上の抽象化レイヤーとして機能し、論理ボリュームとボリューム グループの概念を導入することでスペース管理にさらなる柔軟性を提供します。では、両者を比較しながら?これは、BTRFS ファイルシステムが、少なくとも Linux では伝統的に LVM を使用して実装されていたいくつかの機能をファイルシステム レベルで統合しているためです。たとえば、BTRFS ファイルシステムは複数のデバイスにまたがることができます。これは RAID 構成の実装に使用でき、この場合に最も興味深いのは、アトミック スナップショットの作成をサポートすることです。

LVM スナップショットと BTRFS スナップショットは多かれ少なかれ同じ目的を果たしますが、まったく異なるものです。前者はブロック デバイスとして作成され、後者はメイン ファイル システム上のネームスペースを使用して作成されます。

シック LVM スナップショットとシン LVM スナップショット

LVM について話すときは、従来の (「シック」) 論理ボリュームとシン論理ボリュームとスナップショットを区別する必要があります。 LVM シン プロビジョニングについては、最近の記事で詳しく説明しました。ここで、一言で言えば、シック ボリュームとシン ボリュームの主な違いは、スペースの割り当て方法であると言えます。従来の LVM 論理ボリュームを使用する場合、スペースは作成時に割り当てられます。代わりに、「シン」ボリュームは「仮想」サイズで作成されます。これらは、実際に必要な場合にのみスペースが割り当てられるシン ストレージ プールの一部です。

従来のスナップショット、つまり「シック」スナップショットを作成する場合は、通常の論理ボリュームを作成する場合と同様に、ボリューム グループ内でボリューム グループに割り当てるスペースの量を指定する必要があります。このスペースはすぐにスナップショット用に予約されます。このスペースは、ソース ボリューム上で変更されるブロックを保存するためにのみ使用されるため、元のボリュームほど大きくする必要はありません。元のボリューム上のデータは、変更される前にスナップショットにコピーされて保存されます。この戦略はコピー オン ライト (CoW) と呼ばれます。従来の LVM スナップショットは、オリジンに発生したすべての変更を保存するのに十分な大きさでなければなりません。満杯になると、 自動的に削除されます。

シック スナップショットは、長期間保存することを目的としていません。通常、ファイル システムを「凍結」状態にするために使用され、一貫性のあるバックアップを作成するのに役立ちます。これらは通常、そのようなバックアップが完了した直後に破棄されます。パフォーマンスに大きな影響を与えるためです。データを共有しないため、オリジンでの変更には既存のスナップショットの数と同じ数の CoW 操作が必要です。

従来の LVM 論理ボリュームのシック スナップショットの作成と管理

従来の LVM 論理ボリュームのシック スナップショットを作成する方法を見てみましょう。以下の例では、「root」という名前の論理ボリュームがあります。論理ボリュームは「fedora」というボリューム グループに存在します。 vgdisplay コマンドの出力でわかるように、このボリューム グループには空き領域があります。

 --- Volume group ---
 VG Name fedora
 System ID 
 Format lvm2
 Metadata Areas 1
 Metadata Sequence No 6
 VG Access read/write
 VG Status resizable
 MAX LV 0
 Cur LV 1
 Open LV 1
 Max PV 0
 Cur PV 1
 Act PV 1
 VG Size 48.41 GiB
 PE Size 4.00 MiB
 Total PE 12393
 Alloc PE / Size 5120 / 20.00 GiB
 Free PE / Size 7273 / 28.41 GiB
 VG UUID ZX67es-BWk3-SENV-L25P-VwvI-mqsx-qCqxVJ

「/」にマウントされている「ルート」論理ボリュームのバックアップを作成するとします。バックアップ自体の実行中にファイルが変更される可能性があるため、マウントされたファイルシステムのバックアップを実行することはお勧めできません。ボリュームのスナップショットを作成すると、システムを停止せずにファイルシステムの「凍結された」ビューを取得できます。すでに述べたように、スナップショットは、一定期間内にソース ボリュームに発生する可能性のあるすべての変更を保持するのに十分な大きさでなければなりません。以下の例では、5 GiB のサイズのスナップショットを作成します。

$ sudo lvcreate -s /dev/fedora/root -L 5GiB -n root-snapshot0

スナップショットを作成するには、-s オプション (--snapshot の略) を指定して lvcreate を呼び出します。スナップショットに割り当てたいスペースの量を -L (--size の略) の引数として指定し、スナップショット名を の引数として指定します。 -n (--name の短縮形)。スナップショットが作成されると、lvs コマンドの出力に表示されます。

 LV             VG     Attr       LSize  Pool Origin Data% Meta% Move Log Cpy%Sync Convert
 root           fedora owi-aos--- 20.00g 
 root-snapshot0 fedora swi-a-s---  5.00g      root   0.01

従来の LVM スナップショットは、「Attr」列の値を調べることで認識できます。そこでは、最初の属性ビットが「s」であることがわかります。 「Origin 」列には、スナップショットの基になっているボリュームの名前も表示されます (この場合は「root 」)。繰り返しますが、従来のスナップショットを扱っているため、それに割り当てたスペースはボリューム グループから直ちに削除されます。

 --- Volume group ---
 VG Name fedora
 System ID 
 Format lvm2
 Metadata Areas 1
 Metadata Sequence No 13
 VG Access read/write
 VG Status resizable
 MAX LV 0
 Cur LV 2
 Open LV 1
 Max PV 0
 Cur PV 1
 Act PV 1
 VG Size 48.41 GiB
 PE Size 4.00 MiB
 Total PE 12393
 Alloc PE / Size 6400 / 25.00 GiB
 Free PE / Size 5993 / 23.41 GiB
 VG UUID ZX67es-BWk3-SENV-L25P-VwvI-mqsx-qCqxVJ

スナップショットを使用して元のボリュームの一貫したバックアップを作成する以外に、スナップショットを元のボリュームに「マージ」して、スナップショットの作成後に発生したすべての変更を削除することもできます。スナップショットを元の位置にマージするには、lvconvert コマンドを --merge オプションとともに使用し、引数としてスナップショットのパスを指定します。たとえば、root-snapshot0 スナップショットを root ボリュームにマージして戻すには、次のコマンドを実行します。

$ sudo lvconvert --merge /dev/fedora/root-snapshot0

元のボリュームとスナップショットの両方を閉じることができる場合は、「マージ」がすぐに行われます。この場合のようにこれが不可能な場合、マージは次回のアクティブ化時に (おそらく次回の再起動時に) 行われます。マージ後、 スナップショットは削除されます。 スナップショットをマージする代わりにすぐに削除したい場合は、lvremove コマンドを使用します。

$ sudo lvremove /dev/fedora/root-snapshot0

LVM シン論理ボリュームのシン スナップショットの作成と管理

シン LVM スナップショットは、元の同じストレージ プール内に存在するため、従来のスナップショットよりもはるかに効率的です。つまり、 シン LVM スナップショットや他のスナップショットとデータを共有します。 「pool00」というシン プール内に「root」というシン LVM ボリュームがあるとします。

 LV     VG     Attr       LSize   Pool   Origin Data% Meta% Move Log Cpy%Sync Convert
 pool00 fedora twi-aotz-- <38.61g               5.63   12.15 
 root   fedora Vwi-aotz-- <38.61g pool00        5.63

「root」ボリュームのスナップショットを作成するには、もう一度 lvcreate コマンドを使用します。ただし、 今回はサイズは指定しませんです。シン スナップショットは、常に元のサイズと同じ仮想 サイズで作成されます。

$ sudo lvcreate -s /dev/fedora/root -n root-snapshot0

スナップショット作成後の lvs コマンドの出力は次のとおりです。

LV             VG     Attr       LSize   Pool   Origin Data% Meta% Move Log Cpy%Sync Convert
pool00         fedora twi-aotz-- <38.61g               5.64  12.26 
root           fedora Vwi-aotz-- <38.61g pool00        5.63 
root-snapshot0 fedora Vwi---tz-k <38.61g pool00 root

ご覧のとおり、「root」ボリュームがスナップショットの起点として報告されています。スナップショットと元のボリュームの仮想サイズは同じです。この場合、元のボリュームとスナップショットの仮想サイズの合計が実際のプール領域よりも大きいため、オーバープロビジョニングになります。

シン スナップショットは、「アクティベーション スキップ」フラグを使用して作成されます。このフラグは、「Attr」列値の最後のビットの「k」として報告されます。これにより、アクティベーション コマンドを使用するときにアクティベーションが妨げられます。たとえば、ボリューム グループ内のすべての論理ボリュームをアクティブにするには、vgchange -ay コマンドを使用します。 -K オプション (--ignoreactivationskip の略) を使用しない限り、これはアクティベーション スキップ フラグでボリュームをアクティベートしません。例:

$ sudo vgchange -a y -K /dev/fedora

シン ボリュームからスキップ アクティベーション フラグを削除するには、-k オプションを指定して lvchange コマンドを使用します。たとえば、「root-snapshot0」スナップショットから「skip activity」フラグを削除するには、次のコマンドを実行します。

$ sudo lvchange -k n /dev/fedora/root-snapshot0

すでに述べたように、同じシン論理ボリュームの複数のシン スナップショット、さらにはスナップショットのスナップショットを効率的に作成できます。 「root」ボリュームの別のスナップショットを作成しましょう。

$ sudo lvcreate -s /dev/fedora/root -n root-snapshot1

もう一度、元の仮想サイズと同じ仮想サイズでスナップショットが作成されます。

LV             VG     Attr       LSize   Pool   Origin Data% Meta% Move Log Cpy%Sync Convert
pool00         fedora twi-aotz-- <38.61g               5.89  12.57 
root           fedora Vwi-aotz-- <38.61g pool00        5.84 
root-snapshot0 fedora Vwi---tz-k <38.61g pool00 root 
root-snapshot1 fedora Vwi---tz-k <38.61g pool00 root

標準の論理ボリュームとスナップショットを使用する場合と同様に、lvconvert コマンドを使用してシン スナップショットを元の位置に直接マージできます。従来のスナップショットの場合と同様、これにより、マージされたスナップショットが削除されます。ただし、シン ボリュームを使用する場合、スナップショットを結合すると、同じ元のボリュームに基づく他のスナップショットから「元の」参照が削除されるという効果もあります。これらには作成時のオリジナルの状態を表すデータが含まれていますが、それらを lvconvert コマンドを使用して直接マージすることはできません

ただし、シン ボリュームを使用する場合は、スナップショットを元のボリュームにマージする代わりに、別の戦略を使用できます。まず、元のシン ボリュームの名前を変更し (場合によっては削除し)、次にスナップショットのスナップショットを作成します。に戻したいので、元のボリュームとして名前を付けます。こうすることで、特定の状態に戻すことができ、スナップショットを保持することができます。

たとえば、root-snapshot0 スナップショットで表される状態に戻したいとします。まず最初に、おそらく元の名前に現在の日付を追加して、「ルート」シン論理ボリュームの名前を変更します。

$ sudo lvrename /dev/fedora/root "root-$(date "+%Y-%m-%d")"

次に、使用するスナップショットのスナップショットを取得し、「root」という名前を付けます。

$ sudo lvcreate -s /dev/fedora/root-snapshot0 -n root

LVM スナップショットの削除

LVM スナップショットは、「lvremove」コマンドを使用して、他の論理ボリュームと同様に簡単に削除できます。前の例で作成した「root-snapshot0」スナップショットを削除するには、次のコマンドを実行します。

$ sudo lvremove /dev/fedora/root-snapshot0

専用チュートリアルで指定したように、シン ボリュームの場合、論理ボリュームを削除するときに、fstrim コマンドを実行するまでスペースがプールに返されないことに注意してください。

BTRFS スナップショット

BTRFS は、組み込み機能としてスナップショットを備えた最新のファイルシステムです。これは、Fedora、OpenSUSE、および SUSE Linux Enterprise でデフォルトで使用され、実質的に他のすべての主要なディストリビューション (RHEL とクローンは例外) でサポートされています。 LVM 論理ボリュームとは異なり、BTRFS サブボリュームは分離されたブロック デバイスではなく、分離された名前空間を使用し、独自のディレクトリ階層を持つファイル システムのゾーンです。 BTRFS ファイルシステム上で使用可能なサブボリュームのリストを取得するには、次のコマンドを実行します。

$ sudo btrfs subvolume list /

新しくインストールされた Fedora システムでは、上記のコマンドは次の出力を返します。

ID 256 gen 46 top level 5 path root
ID 257 gen 45 top level 5 path home
ID 258 gen 41 top level 256 path var/lib/portables

このコマンドは、既存のサブボリュームごとにID世代番号 (トランザクションごとに増加する内部カウンター)、トップレベル (親) IDを返します。 と、 親内のサブボリュームの相対パスです。上で、「root」と「home」がトップレベル ボリューム (「メイン」btrfs ファイルシステム) のサブボリュームであることがわかります。ID は常に 5 です。これは、トップレベルのボリューム (この場合はディスクの 3 番目のパーティションにあります) をマウントすることで簡単に確認できます。

$ sudo mount /dev/vda3 /mnt

ファイルシステムをマウントした後、/mnt ディレクトリの内容を調べると、2 つのサブボリュームがディレクトリとして表示されます。

$ ls -l /mnt
total 0
drwxr-xr-x. 1 root root 6 Aug 29 13:56 home
dr-xr-xr-x. 1 root root 138 Aug 29 13:48 root

BTRFS スナップショットの作成

BTRFS スナップショットは単なる追加のサブボリュームです。スナップショットを作成するには、「snapshot」サブコマンドを使用し、ソース サブボリュームのパスとスナップショットを作成するパスを引数として渡します。 「/」にマウントされている「ルート」サブボリュームのスナップショットを作成し、「/.snapshot0」として保存するには、次のコマンドを実行します。

$ sudo btrfs subvolume snapshot / /.snapshot0

デフォルトでは、スナップショットは読み取り/書き込みモードで作成されます。スナップショットを読み取り専用にするには、上記のコマンドに -r オプションを追加します。 /.snapshot0 ディレクトリの内容を調べると、独自のディレクトリ構造が含まれていることがわかります。

$ ls -l /.snapshot0
dr-xr-xr-x. 1 root root 0 Jan 23 2024 afs
lrwxrwxrwx. 1 root root 7 Jan 23 2024 bin -> usr/bin
drwxr-xr-x. 1 root root 0 Aug 29 13:44 boot
drwxr-xr-x. 1 root root 0 Aug 29 13:44 dev
drwxr-xr-x. 1 root root 2658 Aug 30 03:54 etc
drwxr-xr-x. 1 root root 0 Aug 29 13:44 home
lrwxrwxrwx. 1 root root 7 Jan 23 2024 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Jan 23 2024 lib64 -> usr/lib64
drwxr-xr-x. 1 root root 0 Jan 23 2024 media
drwxr-xr-x. 1 root root 0 Jan 23 2024 mnt
drwxr-xr-x. 1 root root 0 Jan 23 2024 opt
drwxr-xr-x. 1 root root 0 Aug 29 13:44 proc
dr-xr-x---. 1 root root 128 Aug 29 13:57 root
drwxr-xr-x. 1 root root 0 Aug 29 13:44 run
lrwxrwxrwx. 1 root root 8 Jan 23 2024 sbin -> usr/sbin
drwxr-xr-x. 1 root root 0 Jan 23 2024 srv
drwxr-xr-x. 1 root root 0 Aug 29 13:44 sys
drwxrwxrwt. 1 root root 0 Aug 29 13:44 tmp
drwxr-xr-x. 1 root root 100 Aug 29 13:48 usr
drwxr-xr-x. 1 root root 170 Aug 30 03:54 var

スナップショットは再帰的ではなく、親サブボリュームのコンテンツのみを含みます。たとえば、/.snapshot0/home/ ディレクトリのコンテンツを調べると、ディレクトリが空であることがわかります。 home」サブボリュームはシステム内のその位置にマウントされます。予想どおり、スナップショットがサブボリュームのリストに表示されます。

$ sudo btrfs subvol list /
ID 256 gen 65 top level 5 path root
ID 257 gen 61 top level 5 path home
ID 258 gen 41 top level 256 path var/lib/portables
ID 261 gen 61 top level 256 path .snapshot0

BTRFS スナップショットの使用

サブボリュームをスナップショットで表される状態に戻すように設計された特定のコマンドはありませんが、コマンドを使用する方法はいくつかあります。これまで見てきたように、BTRFS スナップショットはファイル レベルにあるため、ファイル レベルをナビゲートするだけでファイルの特定のバージョンを簡単に取得できます。

ファイルシステムを以前の状態に戻すには、btrfs-assistant などのグラフィカル プログラムで使用されるのと同じ戦略を採用することもできます。前の例では、「ルート」サブボリュームのスナップショットを取得しました。そのスナップショットは、その特定の時点での親サブボリュームの状態をキャプチャしました。その時点に戻すには、元のサブボリュームをそのスナップショットに置き換えるだけです。まず、トップレベルのファイルシステムをマウントします。

$ sudo mount /dev/vda3 /mnt

ここで、現在の日付を追加して「ルート」ボリュームの名前を変更します。 mv コマンドを使用するだけで、サブボリュームの名前を変更できます。

$ sudo mv /mnt/root "/mnt/root-$(date "+%Y-%m-%d")"

戻したいスナップショットのコピーを保持するために、そのスナップショットの新しいスナップショットを作成し、それを /mnt/root として保存します。

$ sudo btrfs subvolume snapshot /.snapshot0 /mnt/root

BTRFS スナップショットの削除

スナップショットを削除するには、「delete」サブコマンドを使用し、スナップショットのパスを引数として渡します。ほんの一例として、 /.snapshot0 スナップショットを削除するには、次のコマンドを実行します。

$ sudo btrfs subvolume delete /.snapshot0

サブボリュームを削除しても、既存のネストされたサブボリュームは削除されません。

結論

スナップショットを使用すると、特定の時点でのファイルシステムの状態を凍結できます。 Linux では、LVM または BTRFS ファイルシステムを使用してスナップショットを作成できます。この記事では、従来のシン LVM スナップショットを作成する方法について説明しました。この 2 つの違い、およびそれらと BTRFS スナップショットの違いについて学びました。 ZFS は、組み込み機能としてスナップショットを備えたもう 1 つの高度なファイルシステムです。ただし、ライセンスの問題により、Linux カーネルではサポートされておらず、外部モジュールとしてコンパイルする必要があるため、このチュートリアルには含めていません。

関連記事: