元の質問
ファイルシステムにファイルがあります。/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に入れないでください。
答え2
デバイス間の接続ができない理由は、あいまいさを引き起こすからです。ファイルのディレクトリエントリには、(単純なシステムでは)関連ファイルのinode番号が含まれます。ハードリンク(他のディレクトリエントリ)にも同じinode番号を含める必要があります。大丈夫ですが、inode番号は単一のファイルシステム内でのみ一意です(通常1から始まる密集したセットです)。
バンドルのインストールは問題を解決しません。はい、構造の「フィクション」を構築しますが、ファイルシステム内のすべてのiノード番号を再指定して、関連するファイルシステム内ですべてが一意であることを確認するわけではありません。それは愚かなことです。
この制限はUNIXシステムでは常に存在していました。この問題を解決するために、部分的にシンボリックリンクが考案されました。私は彼らが機能的に同じではないことを知っていますが、一般的に良いです。
シンボリックリンクを試してみますか? ( ln -s
)