5.11 で追加された OverlayFS の非特権マウント(2)
前回は、OverlayFS の非特権マウントの基本的な部分について説明しました。
ところで OverlayFS はシンプルながらも、より進んだ使い方ができる機能やオプションが存在します。基本的な機能以上の機能を使う場合、OverlayFS は拡張ファイル属性を使います。
例えば連載第18回で説明した「opaque(不透明)ディレクトリ」機能や、以前のブログエントリーで説明したredirect_dir機能などです。
しかし拡張ファイル属性で、この trusted
で始まる属性(trusted
名前空間)を使う場合は特権が必要であり、当然 User Namespace 内の root ではこの属性を使用できません。このような場合、代わりに自由に定義して使える属性(名前空間)として user
が存在します1。
OverlayFS でも、この機能を使うように実装されており、trusted
の代わりに user
を使う場合は、マウントオプションとして userxattr
を指定してマウントします。この場合、trusted.overlay.*
ではなく user.overlay.*
を使うようになります。
非特権の場合の拡張ファイル属性
この拡張ファイル属性の動きを連載で説明した「opaque(不透明)ディレクトリ」を使って説明しましょう。この機能を使うと lowerdir
に指定した下層側のディレクトリの内容が見えなくなります。
opaqueディレクトリを使いたい場合、拡張ファイル属性 trusted.overlay.opaque
に y
という値を入れます。非特権 OverlayFS の場合は、この代わりに user.overlay.opaque
を使うわけです。
この機能の動きを見るための環境を作成しましょう。
$ mkdir lower upper work overlay $ mkdir {lower,upper}/opaquetest $ touch lower/opaquetest/testfile_lower upper/opaquetest/testfile_upper
これまでの実行例と同様に lower
、upper
、work
、overlay
というディレクトリを作成し、lower
と upper
の両方のディレクトリに opaquetest
というディレクトリを作成します(連載の例と同じです)。そして lower
、upper
配下の opaquetest
ディレクトリ内にそれぞれ testfile_lower
、testfile_upper
というファイルを置きます。
この環境で普通に OverlayFS マウントを行うと、次のように見えるはずです。
# tree overlay/ overlay/ └── opaquetest ├── testfile_lower └── testfile_upper 1 directory, 2 files
userxattr
オプションを使わない場合
まずは userxattr
オプションを指定せずに OverlayFS マウントを行い、動きを見てみましょう。当然、期待する動きはしないはずです。
# setfattr -n "user.overlay.opaque" -v "y" upper/opaquetest/ (拡張ファイル属性を設定する) # getfattr -n "user.overlay.opaque" upper/opaquetest/ (拡張ファイル属性が設定されたのを確認) # file: upper/opaquetest/ user.overlay.opaque="y" # mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=work overlay overlay # tree overlay/ (拡張ファイル属性を設定したものの、特にOverlayFSの動きに変化はない) overlay/ └── opaquetest ├── testfile_lower └── testfile_upper 1 directory, 2 files # umount overlay
上記の例のように user.overlay.opaque
属性を設定しても、特に先ほどの普通に OverlayFS マウントを行ったときと動きに変化はありません。
userxattr
オプションを追加してマウントした場合
それでは OverlayFS マウントを行う際に userxattr
オプションを追加してみましょう。
# getfattr -n "user.overlay.opaque" upper/opaquetest/ (拡張属性が設定されているのを確認) # file: upper/opaquetest/ user.overlay.opaque="y" # mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=work,userxattr overlay overlay (userxattrオプションを指定してマウント) # tree lower upper (lower, upper以下のopaquetestディレクトリにはそれぞれファイルが存在する) lower └── opaquetest └── testfile_lower upper └── opaquetest └── testfile_upper 2 directories, 2 files # tree overlay/ (overlayディレクトリを見ると上層側に置いたファイルしか見えない) overlay/ └── opaquetest └── testfile_upper 1 directory, 1 file
このように上層側のファイルしか見えません。opaque ディレクトリの機能が働いていることがわかります。
非特権マウントの場合に使えない機能
以上のように、非特権マウントの場合は trusted.overlay
の代わりに user.overlay
を使って OverlayFS 独自の機能を実現します。
しかし非特権の場合、特権を持っているケースと同じように機能を使うと危険なケースがあります(特権の取得につながるとか)。このような機能については非特権の場合には使えないようになっています。
この機能のひとつが、以前ブログで紹介したredirect_dir機能 です。
次のように、この機能を使うためにオプションを指定してマウントしようとするとエラーになります。
$ unshare --user --map-root-user --mount # mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=work,userxattr,redirect_dir=on overlay overlay mount: /home/karma/tmp/overlay: wrong fs type, bad option, bad superblock on overlay, missing codepage or helper program, or other error.
当然ですが、redirect_dir=off
とするとマウントできます。
# mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=work,userxattr,redirect_dir=off overlay overlay # grep overlay /proc/self/mountinfo 119 109 0:62 / /home/karma/tmp/overlay rw,relatime - overlay overlay rw,lowerdir=lower,upperdir=upper,workdir=work,redirect_dir=off,index=off,metacopy=off
他にも非特権の場合、metacopy
機能が使えないようです(こちらの機能は私はまだ調べていないので詳細はまたの機会に)。