Linux LVMスナップショットをコミットまたは復帰しますか?


16

CentOS 5サーバーで実験的なアップグレードを実行しようとしています。アップグレードが失敗した場合、ファイルシステムへの変更をバックアウトできるようにしたいと思います。このシナリオは、LVM2読み取り/書き込みスナップショットのLVM HOWTOのセクション3.8の例に似ていますが、実際のハウツーには例がありません。

  1. 変更をコミットして元のパーティションにマージする方法は?

  2. ファイルシステムを元の状態に復元して、変更を元に戻すにはどうすればよいですか?完全に再起動しない場合、いくつかのサービスを再起動する必要があると仮定する必要がありますか?

  3. パーティション上の特定のディレクトリのみをスナップショットすることは可能ですか、それともパーティション全体の操作ですか?

回答:


11

Linux 2.6.33+を実行していて、LVM 2.0.58+を使用している場合、LVM2 /デバイスマッパースナップショットのマージ機能を使用できます。

lvconvert --merge

この投稿を参照してください:http : //www.jonnor.com/2010/02/lvm-snapshot-merging-avaliable/

これは、参照するhttp://kernelnewbies.org/Linux_2_6_33を 2.0.58にし、LVMの変更履歴(セクション5、MD / DMを見て):ftp://sources.redhat.com/pub/lvm2/WHATS_NEW

しかし、私はまだそれを適切に使用する方法をあなたに言うことはできません;-)


dmsetup targetssnapshot-lvに適用されたmergeコマンドがスナップショットが作成された状態に戻る場合、snapshot-mergeを表示する必要があります。
ニルス

OPは、ある種のマージステップを介して変更をコミットすることについて混乱しているようです。スナップショットのサイズが大きくなると、変更がコミットされます。(変更の)スナップショットは、lvconvert --mergeを介してそれらをバックアウトするために必要な情報です。OPが変更に満足している場合、lvremoveを介してスナップショットを削除できます。
ビンス

20

Ubuntuでスナップショットベースのアップグレードを試しました。そしてええ、私は数回再起動する必要がありました。最初に元のroot-lvの名前を別の名前に変更して、スナップショットに元の名前を付けることができます(アップグレードにより多くの変更が作成され、変更は元のスナップショットよりも速くなるため):

 # lvrename lvm root root-old
 # lvcreate -n root -s lvm/root-old -L 10G

サイズは適切に選択する必要があります。次に、再起動すると、「新しい」lvm / ubuntuがルートとしてマウントされ、アップグレードを実行できます。これで、新しいバージョンをテストしたり、古いシステムに変更することもできます。

 # lvrename lvm root root-new
 # lvrename lvm root-old root
 # reboot

アップグレードをドロップしたい場合は、(古いシステムから)実行するだけです

# lvremove lvm/root-new

変更をコミットする場合は、(古いシステムから)実行するだけです

# lvconvert --merge lvm/root-new

または、新しいシステムから

# lvrename lvm root root-new
# lvconvert --merge lvm/root-new
# lvrename lvm root-old root

その後、再起動します。ボリュームが開いているため、システムはすぐにマージを拒否します。そのため、マージは起動中に開始され、システムで作業できる間は継続されます。

ああ、ところで:システムを変更するときは、適切なカーネルを使用することを忘れないでください。/ bootはlvmの一部ではないため、古いカーネルと新しいカーネルが並んで配置されます。


ご回答有難うございます。CentOS 7仮想マシンで手順を再生しましたが、それは魅力的なものでした。マージプロセスの途中で仮想マシンをリセットした後、LVMサブシステムは、システムがまだアップグレードされたファイルにアクセスしている間にそれを再開しました。
アンダーソンメデイロスゴメス

この回答の一部は、lvconvert --mergeによる変更のコミットを示唆しているようです。スナップショットのサイズが大きくなると、変更もコミットされます。lvconvert --mergeは、スナップショット情報を使用して変更を元に戻します(バックアウトします)。
ビンス

10

わかりました。HOWTO3.8を読み直して理解できたと思います。

  • 読み取り専用のスナップショット(LVM1など)には、スナップショットの作成後のブロックレベルの違いが含まれます。元のスナップショットは変更されますが、スナップショットは元の表現を保持します。スナップショットから読み取る、その時点でのデータが表示されます。
  • 読み取り/書き込みスナップショット(LVM2のデフォルト)は、次の場所に書き込むことができます。元のパーティションのフォークです。スナップショットの書き込みは、オリジナルを変更しません。

スナップショットが機能する方法は、オリジナルからのブロックレベルの変更セットです。したがって、オリジナルが書き込まれると、次のことが起こります。

  1. 何かがオリジナルに書き込もうとします。
  2. オリジナルが読み込まれ、オリジナルのブロックがスナップショットにコピーされます。
  3. オリジナルが変更されます。
  4. スナップショットには、「逆差分」が含まれます-スナップショットが作成されたときのように元の外観を変更します。

そのため、スナップショットを破棄しても、オリジナルにはまったく影響しません。オリジナルが変更されており、スナップショットにはそれらの変更のリストが含まれているだけです。

自分の質問に答える:

LVMを使用して新しいスナップショットを作成します。スナップショットマウントポイントに書き込むように更新を構成できる場合は、R / Wスナップショットを使用します。それ以外の場合は、ROまたはR / Wのいずれかが行います。

次に:

  • 書き込む場合はR / Wは、スナップショット、マウントポイントをコミット元にスナップショットを書き込むことによって、および復帰離れてスナップショットを投げることもできます。
  • 元のマウントポイントに書き込む場合は、スナップショットを破棄してコミットし、スナップショットから元の書き込みポイントに書き込みます。

私はまだこのマージを実行するための特別なツールを見つけていません-そして、私のシナリオがスナップショットの正確な使用目的ではないことを考えると、それがないかもしれません。rdiffの仕事のようですね。


使用可能なLVMマージツールはまだありません。作業中ですが、完全ではないと思います。
イグナシオバスケス-アブラムス

マージツールが(少なくともUbuntu Trustyに)存在するようになりました- lvconvert --merge <snapshot-name>元のディスクをそのスナップショットに「復元」し、そのスナップショットを削除します。もちろん、すぐに復元できます。
dpb 14

3

LVMはブロックレベルで動作します。ファイルシステムとは「わからない」。そのため、別のLVMボリュームのファイルシステムがそこにマウントされていない限り、特定のディレクトリのみをスナップショットすることはできません。

LVMスナップショットを作成するとき、実際にはボリュームの「書き込み時コピー」複製を要求します。スナップショットボリュームで変更されるブロックは、最初にスナップショットに変更されずに保存されます。したがって、「変更をコミットする」ために何もする必要はありません。スナップショットボリュームを削除するだけです。

このようなシナリオでLVMを使用したことがないため、「変更を元に戻す」ための推奨される方法はわかりませんが、LVMのドキュメントで説明されていると思います。それが何であれ、おそらく変更されたものをすべて再起動する必要があります。


2
  1. いくつかをマージする理由はありません。スナップショットを削除するだけで、ソースLVは変更されたままです
  2. 変更を元に戻すにはマージが必要です lvconvert --merge <snapshot name>
  3. LVMはブロックデバイスで動作します。FS関連の変更は、FSタイプに応じて特別なユーティリティ(xfs_growfs、e2fsck、...)で行う必要があります。

スナップショットは、元のLVの状態を「凍結」します。スナップショットを削除すると、その状態は忘れられます。スナップショットのマージは、その状態に戻ることを意味します

ただし、LVM内では、リライトされたデータをスナップショットに保存します。スナップショットのサイズが、LVおよびスナップショットの予想される変更量を満たしていることを確認してください


実際、スナップショットは何も凍結しません。必要に応じて後から元に戻すことができるように、変更を追加の場所に記録します。
ビンス

0

ドキュメントはわかりにくいです。lvcreate --mergeはすべての変更を元に戻すことを意味し、lvremoveは変更をコミットすることを意味するようです。区別は、使用方法にあります。

ほとんどの場合、スナップショットをライブボリュームの読み取り専用凍結ポイントコピーとして使用しているだけで、ライブボリュームは変化し続けます。この場合、マージする場合、論理的には、ライブボリュームを凍結コピーで上書きすることを意味します。つまり、マージは変更をロールバックし、削除は変更をコミットすることを意味します。

スナップショット(LVM2の新しいオプション)に書き込みますが、これはデフォルトの動作ではなく、おそらくアプリケーションを元のボリュームではなくスナップショットに書き込むために他の場所で構成を変更する必要がある場合、逆のことが当てはまります。

一部の人々は、スナップショットを一方向で使用するつもりであると仮定し、反対の仮定の下で操作するとシステムを破壊する可能性があるという指示を与えるため、スナップショットを扱うときは注意してください!


スナップショットをマウントするだけで、スナップショットに書き込みます。LVMのデフォルトとはほとんど関係のない場所にマウントされるもの-スナップショットであるかどうかに関係なく、各論理ボリュームで何をするかについてはあまり気にしません。単に開いているかどうかを追跡します。
ジョシップロダン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.