ルートがソースディレクトリにアクセスできないときにmount --bindを生成する方法は?

ルートがソースディレクトリにアクセスできないときにmount --bindを生成する方法は?

を使用してテスト環境を作成しようとすると、ソースディレクトリにアクセスできず、mount --bind権限エラーで失敗することが時々あることに驚きました。rootこれは NFS ファイルシステムにのみ影響を与えるようです。

mount --bindアクセスできないディレクトリにアクセスする方法はありますかroot?たぶんinode番号を介して直接可能ですか?

はい

vagrant:vagrant一般ユーザーが完全にアクセスできるNFSマウントがあります。

vagrant@ubuntu-xenial:/tmp$ find nfs_mount/ -ls
     4375      4 drwxr-xr-x   3 vagrant  vagrant      4096 Mar 20 21:28 nfs_mount/
   257090      4 drwxr-xr-x   3 vagrant  vagrant      4096 Mar 20 21:28 nfs_mount/source
   257091      4 drwx------   3 vagrant  vagrant      4096 Mar 20 21:28 nfs_mount/source/path
   257092      4 drwx------   3 vagrant  vagrant      4096 Mar 20 21:28 nfs_mount/source/path/is
   257093      4 drwx------   2 vagrant  vagrant      4096 Mar 20 21:28 nfs_mount/source/path/is/here

...しかし、root:root次はできません。

vagrant@ubuntu-xenial:/tmp$ sudo find nfs_mount/ -ls
     4375      4 drwxr-xr-x   3 vagrant  vagrant      4096 Mar 20 21:28 nfs_mount/
   257090      4 drwxr-xr-x   3 vagrant  vagrant      4096 Mar 20 21:28 nfs_mount/source
   257091      4 drwx------   3 vagrant  vagrant      4096 Mar 20 21:28 nfs_mount/source/path
find: ‘nfs_mount/source/path’: Permission denied

試してもmount --bind失敗した場合:

vagrant@ubuntu-xenial:/tmp$ mkdir /tmp/bindtarget

vagrant@ubuntu-xenial:/tmp$ sudo mount --bind /tmp/nfs_mount/source/path/is/here/ /tmp/bindtarget/
mount: mount /tmp/nfs_mount/source/path/is/here/ on /tmp/bindtarget failed: Permission denied

NFSマウント/tmp/nfs_mountはで提供されており、localhost:/srvソースファイルシステムに直接移動してもディレクトリ権限によって問題は発生しません。

vagrant@ubuntu-xenial:/tmp$ sudo mount --bind /srv/source/path/is/here/ /tmp/bindtarget/

vagrant@ubuntu-xenial:/tmp$ findmnt /tmp/bindtarget
TARGET          SOURCE                              FSTYPE OPTIONS
/tmp/bindtarget /dev/sda1[/srv/source/path/is/here] ext4   rw,relatime,data=ordered

NFS設定(もしあれば):

vagrant@ubuntu-xenial:/tmp$ showmount -e localhost
Export list for localhost:
/srv *

vagrant@ubuntu-xenial:/tmp$ cat /etc/exports
/srv/       *(rw,sync,no_subtree_check)

 環境

  • Ubuntu 16.04 (Xenial64)
  • Linux ubuntu-xenial 4.4.0-116-generic #140-Ubuntu SMP 月 2月 12日 21:23:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

答え1

マウントするのは危険です。いくつかのクリーンアップ操作は、マウントポイントを考慮せず/tmpに突然作業することを決定し、実際に属していない古いファイルを削除する可能性があるためです。つまり、OPの例を使います。/tmp/tmp/tmp


方法1:

NFS環境に対する完全な制御権限がある場合は、no_root_squashエクスポートオプションにこのオプションを追加するだけです。これにより、ルートクライアントがサーバー上の誰にでもマッピングされ、権限を失うことを防ぐことができます。


方法2:

それ以外の場合は、まだ使用されている削除されたファイルにアクセスするのと同じように、探している比較的簡単なソリューションがあります。 / procを使用してください。

簡単にするために、2つの端末が必要です。

ユーザー端末:

vagrant@ubuntu-xenial:/tmp$ cd /tmp/nfs_mount/source/path/is/here/
vagrant@ubuntu-xenial:/tmp/nfs_mount/source/path/is/here$ echo $$
12345

ルートターミナル:ルートは必要なディレクトリへの参照を取得できますが、まだ読み取ることはできませんが、インストールは可能です。

# ls -l /proc/12345/cwd
lrwxrwxrwx. 1 vagrant vagrant 0 Mar 21 01:18 /proc/12345/cwd -> /tmp/nfs_mount/source/path/is/here
# ls -l /proc/12345/cwd/
ls: cannot open directory '/proc/12345/cwd/': Permission denied

# mount --bind /proc/12345/cwd /tmp/bindtarget
# ls /tmp/bindtarget
ls: cannot open directory '/tmp/bindtarget': Permission denied

それはすべてです。

関連情報