ユーザープロセスの場合、他の場所にディレクトリをマウントしたいのですが、ルート権限のないユーザースペースにマウントします。 mount --bind/Origin/destのようなものですが、vfsラッパーがあります。ユーザーモードで微調整されたchrootのように。
プログラムは、syscallをファイルにラップして、必要なパスを「置換」します。次のようなコマンドラインで呼び出すことができます。
bindvfs/fake-home:/ home ls/home
このalredyが存在すると確信しています! :)
PRoot は、例とほぼ同じ方法で使用できます。
proot -b /fake-home:/home ls /home
BindFS/Fuseとは異なり、PRootは、所有していないファイルやディレクトリをバインドできます。
parrot プログラムは、システムコールを傍受し、特定のパスをリダイレクトします(たとえば、/anonftp
で始まるすべてのパスは、FTP経由でリモートファイルに透過的にアクセスするために再マップされます)。また、完全にユーザースペースで実行されます。
ただし、一般的および一般的でないネットワークプロトコルの印象的な配列にもかかわらず、parrot
には、要求されたような単純なファイルシステム->ファイルシステムの書き換えを行うモジュールがありません。 C言語プログラミングを知っていれば、これを追加するのは非常に簡単です。
または、 bindfs ( Fuse の上で実行されます)は、ユーザースペースではmount --bind
のように機能します。 (ただし、これは、質問で述べたように、/home
を/fake-home
にリダイレクトする場合とは逆の方向に進みます。)
VFSは、ファイルシステムの非ルートマウントをすでに許可しています。 user
またはusers
オプションをfstabエントリに追加し、vfs.usermount=1
が/etc/sysctl
にあることを確認できます。
ただし、これによってchrootのようなコントロールが得られることはありません。 bind
オプションは、権限を変更したり、「代替」アクセスを許可したりすることはありません。これは、まったく同じファイルシステムとコンテンツの2番目のmtabエントリです。バインドマウントの変更はオリジナルに影響します。
先に進む前に、必ず最終目標を明確にしてください。
mount_namespacesを使用すると、他のプロセスでは見られないmount --bind
を実行できます。ただし、通常、mount --bind
はrootユーザーのみに制限されています(セキュリティ上の理由から)。したがって、mount_namespacesをroot以外のユーザーが使用できるようにするには、最初に ser_namespaces を使用して、新しい名前空間の「ローカルルート」になり、この操作が許可されるようにする必要があります。
このようにシェルでこれを試すことができます-この例は、chrootディレクトリの準備でのuser&mountスペースの使用を具体的に示しています(そしてchroot
操作も通常特権があります):
unshare --user --map-root-user --mount-proc --pid --fork
mkdir -p newroot/dev
mount --rbind /dev newroot/dev
....other chroot preparation....
chroot newroot
su - user1
ディレクトリに他のマウントポイントが含まれている場合(私の場合はmount --rbind
が機能する)、新しいuser&mount名前空間ではこれのみが機能するため、(mount --bind
の代わりに)/dev/
を使用していることに注意してください。
おそらく、これについての説明は、ユーザーは、通常は特権のないユーザーには表示されないもの、つまり「サブマウント」によって隠されたサブディレクトリを表示する方法を取得するべきではないということです。サブマウントを削除しないために、--rbind
のみが許可されます。