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

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

元の質問

ファイルシステムにファイルがあります。/data/src/file

私はそれを次にハードリンクしたい:/home/user/proj/src/file

ただし、/homeあるディスクと/data別のディスクではエラーが発生します。

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

いいですね。複数のデバイスにわたってハードリンクを接続できないことを理解してください。言葉になりますね。

当面の問題

srcだから私はファイルシステムにフォルダをバインドマウントしたいと思いました。/data

$ 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

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

解決策

/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

ノート:もう少し明確にするためにファイル名とディレクトリ名を手動で変更したため、コマンドの読み込みに誤字が1〜2箇所ある場合があります。

ベストアンサー1

残念なレビューがないパスワード。 v2.4では、バインドマウントが実装されているので、誰もそれが役に立つとは思わなかったようです。もちろん、あなたがしなければならないことは、.mnt->mnt_sbそれが言うところを変えることだけです.mnt...

これは、サブツリーの周りに安全な境界を提供するためです。

PS:これは何度も議論されていますが、検索を避けるために:たとえば、mount --bind /tmp /tmpを考えてみましょう。現在、ルートファイルシステムがないと他の場所へのリンクを作成できない状況があります。でも/ tmp書き込みが可能です。 。同様の技術が他の分離要件にも適用される。デフォルトでは、特定のサブツリーの名前変更/リンクを制限できます。 IOW、これは意図的な機能です。 1年後、メインツリーで状況がどのように再配置されても、複数のツリーをchrootにまとめて予測可能な制限を得ることができます。

-アルベイロ

スレッドの下に具体的な例があります。

mount -r --bind操作を実行するたびに(ページキャッシュの共有を許可しながら、必要な共有ライブラリのコピーをchroot刑務所に配置するために使用されます)、この機能はセキュリティを破ります。

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に入れないでください。

おすすめ記事