マウントされた親ファイルシステムを置き換える変更を子ファイルシステムにマージできるようにしたいです。
私はすべてに興味があります。オンライン(つまり、マージしかし、クラッディングの設置)とオフライン(オーバーレイ除去後のマージ)解決策。
いくつかのオフラインソリューションが見つかり、それを回答として追加しました。
もし知っている人はいますか?オンライン解決策?オーバーレイがインストールされている間にレイヤーをマージするために実行できる「コミット」タイプのコマンドがあればよいでしょう。
次の質問でも同様の質問が提起されましたが、答えはありません。
- ファイルを変更してOverlayFsのサブディレクトリに同期する方法はありますか?
- OverlayFSディレクトリを介して低レベルのファイルを変更するには?
- OverlayFSは低レベルのディレクトリファイルをシームレスに編集します。
- OverlayFS - アンマウントせずに親ファイルシステムを継続的に変更する方法は?
この投稿のコメントにはさまざまな提案がありました。ファイルシステムのマージそして隠れ家、どちらも特定のユースケースに対処しますが、オーバーレイによって提供される一般的なファイルシステムに依存しないユースケースではありません。
私の目標は、すべての(可能であれば)ネイティブファイルシステムでLinuxアプリケーションで使用できるスナップショットを含む安全なファイルシステムサンドボックスを取得し、準備ができたときに変更をロールバックまたは手動でコミットできるようにすることです。 。
使い方を知っていれば、過去数年間のサンドボックス/仮想化イノベーションのおかげで、最新のメインラインLinuxに必要なすべての機能が組み込まれていると思います。
答え1
私は見つけたOverlayfs - ツールこのプロジェクトは便利なツールセット(diff、merge、Vacuum)を実装しています。オーバーレイをアンロードする必要があるためオフライン- 唯一の解決策。
これは良い概念の証明ですが、管理者が一人だけで、何年も活動していないため、現在の状態では依存しません。
答え2
努力するオンライン解決策ですが、まだ存在していません。
設定(たとえば、/tmp
ディレクトリからルートへ):
LOWER=$HOME
mkdir u1 w1 o1 O
mount -t overlay overlay -o lowerdir=$LOWER,upperdir=u1,workdir=w1 o1
mount --bind o1 O
その後、スナップショットを作成したい場合は、次O
のディレクトリで作業できます。$LOWER
mkdir u2 w2 o2
mount -t overlay overlay -o lowerdir=o1,upperdir=u2,workdir=w2 o2
(このようなネストされたオーバーライドは以前のカーネルでは機能しません。)
しかし、私はバインドマウントを代わりにO
ポイントに原子的に変更する方法が欲しいです。次以外は何をすべきかわかりません。o2
o1
umount O
mount --bind o2 O
(非原子性;削除されたウィンドウがありますO
)。
理想的には、実行中のプロセスがデフォルトのファイルシステムですO
。これが可能かどうか、またはこのようにデフォルトのファイルシステムを変更すると、開いているアプリケーションがあまりにも中断する可能性があるかどうかわかりません。もう少し調べてみる必要があります。o1
o2
O
その後、O
リダイレクトされたら、予防措置として読み取り専用にo2
再マウントし、rdiffdirやoverlayfs-toolsなどを使用してオフラインマージを実行できます。o1
o2
最後に、、および(今はすべての空のディレクトリ)を削除できるように自動的に再マウントする方法が必要です。繰り返しますが、これが可能かどうかわかりません。lowerdir=$HOME,upperdir=u2,workdir=w2
o1
u1
w1
それ以外の場合は、マージやクリーンアップを試みずにオーバーレイをより深くネストし、各インストールのオーバーレイと親ディレクトリを維持してスナップショットを取得できます。ただし、インストールできるネストオーバーレイの数は制限される可能性があります。ある時点で変更を維持するには、レイヤーをマージする必要があります。
答え3
その他オフライン私が思いついた解決策は次のとおりです。目次オーバーレイがインストールされたパッチを作成し、削除して適用します。このソリューションを使用するには、パッチをどこか(ディスクまたはramdisk / tmpfs)に保存するときに中間ステップが必要です。
答え4
==説明==
Btrfsスナップショットを使用して、親ディレクトリと子ディレクトリをマージします。 Btrfsサブボリュームはディレクトリとほぼ同じように機能しますが、サブボリュームのスナップショット(複製)を実行するため、追加のディスク容量は必要ありません。その後、Overlayfsの内容をスナップショットに再同期すると、親ディレクトリのディスク容量の2倍しか使用されません。 rsyncが完了したら、元の子ディレクトリと親ディレクトリを削除し、新しいスナップショットと新しい(空の)親ディレクトリに置き換えることができます。
==ステップ==
- Btrfsサブボリュームをデフォルトのディレクトリとして作成します(数日または数週間後にマージする準備ができたら、手順2に進みます)。
- プライマリディレクトリの(書き込み可能な)スナップショットを撮ります。
- Overlayfsをマウントしたら、rsyncを使用してOverlayfsのすべての変更をスナップショットに同期します。
- Overlayfsを削除します。
- サブディレクトリの削除
- 古いlowerdirを新しいスナップショットに置き換えます。
- 親ディレクトリを削除します。
- 新しい(空の)親ディレクトリを再作成します。
- Overlayfs ファイルシステムを再マウントします。
==Steps as terminal commands (untested!)==
1# btrfs subvolume create lowerdir
2# btrfs subvolume snapshot lowerdir lowerdir_new
3# rsync --delete -a overlayfs lowerdir_new
4# umount overlayfs
5# btrfs subvolume delete lowerdir
6# mv lowerdir_new lowerdir
7# rm -rf upperdir
8# mkdir upperdir
9# mount -o lowerdir
Btrfsスナップショットは新しいサブボリュームなので、このプロセスを無期限に繰り返すことができます。