web-dev-qa-db-ja.com

同じファイルシステムの「mount --bind」ディレクトリからファイルへの「ハードリンク」を作成できないのはなぜですか?

元の問題

1つのファイルシステムにファイルがあります:/data/src/file

そして私はそれを次のようにハードリンクしたいと思います:/home/user/proj/src/file

しかし、/homeは1つのディスクにあり、/dataは別のディスクにあるため、エラーが発生します。

$ cd /home/user/proj/src
$ ln /data/src/file .
ln: failed to create hard link './file' => '/data/src/file': Invalid cross-device link

さて、デバイス間でハードリンクできないことを学びました。理にかなっています。

手元の問題

だから私は空想を得て、/dataのファイルシステムにあるsrcフォルダをバインドマウントすると思いました。

$ mkdir -p /data/other/src
$ cd /home/user/proj
$ Sudo mount --bind /data/other/src src/
$ cd src
$ # (now we're technically on `/data`'s file system, right?)
$ ln /data/src/file .
ln: failed to create hard link './file' => '/data/src/file': Invalid cross-device link

なぜこれがまだ機能しないのですか?

Workaround

バインドされたディレクトリの代わりに「実際の」/dataディレクトリにいる限り、ハードリンクを作成できるため、この設定は正しいことを知っています。

$ cd /data/other/src
$ ln /data/src/file .
$ # OK
$ cd /home/user/proj/src
$ ls -lh
total 35M
-rw------- 2 user user 35M Jul 17 22:22 file

$

一部のシステム情報

$ uname -a
Linux <Host> 4.10.0-24-generic #28-Ubuntu SMP Wed Jun 14 08:14:34 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

$ findmnt
.
.
.
├─/home                               /dev/sdb8   ext4       rw,relatime,data=ordered
│ └─/home/usr/proj/src             /dev/sda2[/other/src]
│                                                 ext4       rw,relatime,data=ordered
└─/data                               /dev/sda2   ext4       rw,relatime,data=ordered

$ mountpoint -d /data
8:2

$ mountpoint -d /home/usr/proj/src/
8:2

:状況をわかりやすくするためにファイル名とディレクトリ名を手動で変更したので、コマンドの読み出しにタイプミスがある可能性があります。

9
jdk1.0

code には、残念なコメントの欠如があります。時間バインドマウントがv2.4で実装されたので、誰もそれを便利だと思ったことはありません。きっとあなたがする必要があるのは代わりの.mnt->mnt_sbと書いてあるところ.mnt...

それは、サブツリーの周りにセキュリティ境界を与えるからです。

PS:それはかなり何度も議論されましたが、検索を避けるために:例えばmount --bind/tmp/tmp;これで、/ tmpに書き込み可能であっても、ユーザーがroot fsがない他の場所へのリンクを作成できない状況が発生しました。同様の技術は他の分離のニーズでも機能します-基本的に、名前の変更/リンクを特定のサブツリーに限定できます。 IOW、それは意図的な機能です。ツリーの束をchrootにバインドして、メインツリーで1年後にどのように並べ替えるかに関係なく、予測可能な制限を取得できることに注意してください。

- アルヴィーロ

スレッドの下の方に具体例があります

Mount -r --bindが適切に機能するようになると(ページキャッシュの共有を許可しながら、必要な共有ライブラリのコピーをchroot jail内に配置するために使用します)、この機能はセキュリティを破壊します。

mkdir /usr/lib/libs.jail
for i in $LIST_OF_LIBRARIES; do
ln /usr/lib/$i /usr/lib/libs.jail/$i
done
mount -r /usr/lib/libs.jail /jail/lib
chown prisoner /usr/log/jail
mount /usr/log/jail /jail/usr/log
chrootuid /jail prisoner /bin/untrusted &

保護は十分なはずですが、/ jail/lib/libfoo.so(書き込みはEROFSを返します)を囚人に/ jail/usr/logにリンクさせないでください。

6
sourcejedi