web-dev-qa-db-ja.com

Linux LVMスナップショットをコミットまたは元に戻しますか?

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

  1. 変更をコミットして元のパーティションにマージするにはどうすればよいですか?

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

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

16
Shewfig

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_ (セクション5、MD/DMを参照)および2.0.58のLVM変更ログを参照: ftp://sources.redhat.com/ pub/lvm2/WHATS_NEW

しかし、それを適切に使用する方法はまだ説明できません;-)

11

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

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

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

 # 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の一部ではないので、古いカーネルと新しいカーネルが並んで配置されます。

21
Viktor Dick

わかりました。HOWTO3.8を再読することで理解できたと思います。

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

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

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

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

自分の質問に答える:

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

次に:

  • R/Wスナップショットマウントポイントに書き込む場合、スナップショットをオリジナルに書き込むことによりcommit、スローすることによりrevertスナップショットを離れて。
  • originalマウントポイントに書き込む場合、スナップショットを破棄してcommit、スナップショットからスナップショットに書き込むことでrevert元の。

私はまだこのマージを実行するためのツールをまだ見つけていません-そして、私のシナリオがスナップショットの意図された使用と完全に一致していないことを考えると、それはないかもしれません。 rdiffの仕事のように聞こえます。

10
Shewfig

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

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

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

3
Jacek Konieczny
  1. マージする理由はありません。スナップショットを削除するだけで、ソースLVは変更されたままになります
  2. 変更を元に戻すにはマージが必要ですlvconvert --merge <snapshot name>
  3. LVMはブロックデバイスで動作します。 FS関連の変更はすべて、FS type

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

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

2
deman_killer

ドキュメントは紛らわしいです。 lvcreate --mergeはすべての変更を元に戻すことを意味し、lvremoveは変更をコミットすることを意味するようです。違いは、それをどのように使用するかです。

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

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

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

0
RedScourge