web-dev-qa-db-ja.com

OverlayFSを使用するにはどうすればよいですか?

この answer および 電子メールメッセージ は、「OverlayFS」と呼ばれるものがUbuntu 11.10で使用可能であり、Ubuntu 12.04のaufsを強制的に置き換えることを示します。

どうやって使うの?ドキュメントはどこにありますか?

53
ændrük

編集:この回答を書いてから、overlayfsでいくつかの変更が行われました。つまり、必須パラメーターworkdirの追加です。この新しいパラメーターの詳細については、下記の tottiの回答 を参照してください。

やっと見つけました。カーネルソースでそれに対する参照を見つけましたが、何らかの理由でkernel.orgのgitツリーに表示されません。しかし! Ubuntuカーネルソースを次のようにプルすると:apt-get source linux-image-3.0.0-16-genericlinux-3.0.0/Documentation/overlayfs.txtにあります。 linux-docパッケージの/usr/share/doc/linux-doc/filesystems/overlayfs.txt.gzにもあります。

実際のヘルプドキュメントは、「マウント方法」ではなく「動作方法」に近いため、ここに簡単な要約を示します(カーネルドキュメントには1つの例があります)。

mount -t overlayfs -o [mount options] overlayfs [mountpoint for merged system]

[マウントオプション]は次のとおりです。

  • lowerdir = somedir:lowerdirは、新しいファイルシステムを配置するディレクトリです。重複がある場合は、実際にはupperdirのバージョンによって上書きされます(実際には隠されます)。
  • upperdir = somedir:upperdirは、lowerdirをオーバーレイするディレクトリです。 lowerdirとupperdirに重複するファイル名が存在する場合、upperdirのバージョンが優先されます。
  • 標準マウントオプション。コードから私が見た唯一のものはro/rwですが、実験することができます。

最初は混乱していたので、おそらく明確にする必要がありますが、overlayfsをマウントしても実際にはファイルシステムがマウントされないということです。 overlayfsマウントを使用してsquashfsファイルシステムをマウントしようとしましたが、それは動作しません。最初に(私の場合はsquashfs)ファイルシステムを任意のディレクトリにマウントし、次にoverlayfsを使用してマウントポイント(ディレクトリ)と別のディレクトリをターシャリディレクトリ(overlayfsマウントポイント)にマージする必要があります(編集:この「ターシャリ」ディレクトリ実際にはupperdir =ディレクトリにすることができます)。三次ディレクトリは、マージされたファイルシステム(またはディレクトリツリー-柔軟な)を表示する場所です。

例1、ルートファイルシステムのオーバーレイ

私はベースUbuntuシステムがfilesystem.squashfsとして存在するUbuntuハイブリッドブートディスクで作業しており、ubuntu.overlay kubuntu.overlay xubuntu.overlayおよびlubuntu.overlayというファイルがあります。 .overlayファイルは、filesystem.squashfsの内容が(スペースを節約するために)削除された、上記システムの基本インストールです。次に、overlayfsと上記のオプションを使用してinitスクリプトを変更し、(ブートパラメーターから)正しいディストリビューションの.overlayファイルをオーバーレイします。

これらは、initスクリプトで使用した行です(すべての変数が変換されると):

mkdir -p /overlay
mount -t squashfs /cdrom/casper/ubuntu.overlay /overlay
mount -t overlayfs -o lowerdir=/filesystem.squashfs,upperdir=/overlay overlayfs /

上記のfilesystem.squashfsは、ファイルではなく、casperによって作成されたdirectoryであることに注意してください。

これら3つのステートメントは、/overlayディレクトリを作成し、/overlayディレクトリにsquashfsファイルシステムをマウントし、OverlayFSを使用して/overlayの内容を/に本質的にマージします。

例2、2つのディレクトリの透過的なマージ

リリースごとにライブUSBを再構築するプロセスでは、OverlayFSを使用して時間を大幅に節約します。まずは、最も基本的なインストールであるubuntu-coreイメージの内容を含むubuntu-baseというディレクトリから始めます。次に、ubuntu、kubuntu、lubuntu、およびxubuntuというディレクトリを作成します。

次に、OverlayFSを使用して、ubuntu-baseのファイルを個々のディレクトリに表示します。私はこのようなものを使用します:

mount -t overlayfs -o lowerdir=ubuntu-base,upperdir=kubuntu overlayfs kubuntu

これにより、ubuntu-baseのファイルがkubuntuフォルダーに表示されます。次に、chrootをkubuntuフォルダーに移動して、apt-get install kubuntu-desktopなどの操作を行います。このOverlayFSマウント中に行われた変更は、上位ディレクトリ(この場合はkubuntuフォルダー)に残ります。次に、OverlayFSをアンマウントすると、実際にはubuntu-baseに存在するが、kubuntuフォルダーに「ミラーリング」されているファイルは、変更されない限り消えます。これにより、ubuntu-baseにファイルの複数のコピーを作成する必要がなくなり、各場所に物理的に存在するかのように使用できます。

62
Chuck R

https://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt から:

上も下も

オーバーレイファイルシステムは、「上部」ファイルシステムと「下部」ファイルシステムの2つのファイルシステムを組み合わせたものです。両方のファイルシステムに名前が存在する場合、「上位」ファイルシステムのオブジェクトは表示されますが、「下位」ファイルシステムのオブジェクトは非表示になるか、ディレクトリの場合は「上位」オブジェクトとマージされます。

両方のディレクトリツリーが同じファイルシステムに存在する可能性が非常に高く、ファイルシステムのルートを指定する必要がないため、「ファイルシステム」ではなく、上部および下部の「ディレクトリツリー」を参照する方が適切です。上部または下部のいずれか。

下位のファイルシステムは、Linuxがサポートする任意のファイルシステムにすることができ、書き込み可能である必要はありません。下位のファイルシステムは別のoverlayfsである場合もあります。上位のファイルシステムは通常書き込み可能であり、それがtrusted。*拡張属性の作成をサポートし、readdir応答で有効なd_typeを提供する必要があるため、NFSは適切ではありません。

2つの読み取り専用ファイルシステムの読み取り専用オーバーレイは、任意のファイルシステムタイプを使用できます。

ディレクトリ

オーバーレイには主にディレクトリが含まれます。指定された名前が上位と下位の両方のファイルシステムに表示され、いずれかの非ディレクトリを参照する場合、下位オブジェクトは非表示になります-名前は上位オブジェクトのみを参照します。

上位オブジェクトと下位オブジェクトの両方がディレクトリである場合、マージされたディレクトリが形成されます。

マウント時に、マウントオプション「lowerdir」および「upperdir」として指定された2つのディレクトリが、マージされたディレクトリに結合されます。

mount -t overlay overlay -olowerdir=/lower,upperdir=/upper,workdir=/work /merged

「workdir」は、upperdirと同じファイルシステム上の空のディレクトリである必要があります。

次に、このようなマージされたディレクトリでルックアップが要求されるたびに、ルックアップは実際の各ディレクトリで実行され、結合された結果はオーバーレイファイルシステムに属するdentryにキャッシュされます。両方の実際のルックアップでディレクトリが見つかった場合、両方が保存され、マージされたディレクトリが作成されます。それ以外の場合は、1つのみが保存されます。

ディレクトリの名前のリストのみがマージされます。メタデータや拡張属性などの他のコンテンツは、上位ディレクトリについてのみ報告されます。下位ディレクトリのこれらの属性は非表示です。

20
totti

これらのアーティクルを拡張して、読み取り専用ルートfsを設定するoverlayfs用のスクリプトを含めました。

それが役に立てば幸い。

7
Floyd42

最小限の実行可能な例

# Create the filesystems.
dd if=/dev/zero of=lower.ext4 bs=1024 count=102400
mkfs -t ext4 lower.ext4
cp lower.ext4 upper.ext4
mkdir lower upper overlay
Sudo mount lower.ext4 lower
Sudo mount upper.ext4 upper
Sudo chown "$USER:$USER" lower upper
printf lower-content > lower/lower-file
# Upper and work must be on the same filesystem.
mkdir upper/upper upper/work
printf upper-content > upper/upper/upper-file
# Work must be empty. E.g. this would be bad:
#printf work-content > upper/work/work-file
# Make the lower readonly to show that that is possible:
# writes actually end up on the upper filesystem.
Sudo mount -o remount,ro lower.ext4 lower

# Create the overlay mount.
Sudo mount \
  -t overlay \
  -o lowerdir=lower,upperdir=upper/upper,workdir=upper/work \
  none \
  overlay \
;

# Interact with the mount.
printf 'overlay-content' > overlay/overlay-file
ls lower upper/upper upper/work overlay

# Write to underlying directories while mounted
# gives undefined behaviour.
#printf lower-content-2 > lower/lower-file-2
#printf upper-content-2 > upper/upper-file-2

# Unmount the overlay and observe state.
Sudo umount overlay
ls lower upper/upper upper/work

# Cleanup.
Sudo umount upper lower

GitHubアップストリーム

マウント付きの最初のlsの出力:

lower:
lost+found  lower-file

overlay:
lost+found  lower-file  overlay-file  upper-file

upper/upper:
overlay-file  upper-file

upper/work:
work

マウントなしの2番目のlsの出力:

lower:
lost+found  lower-file

upper/upper:
overlay-file  upper-file

upper/work:
work

解釈:

  • 低い:オーバーレイへの書き込み後に変更されませんでした
  • 上部:オーバーレイの変更を受け取りました
  • オーバーレイ:上下両方のファイルを表示します
  • 作業:ランダムなコンテンツ(work/ディレクトリ)が含まれています

適応例: OverlayFSの使用例

複数の下位レイヤーを使用したより複雑な例: Overlayfs reload with multiple layers(migration from aufs)

Ubuntu 18.04、Linuxカーネル4.15.0でテスト済み。