シンボリックリンクからマウントをバインドする方法

シンボリックリンクからマウントをバインドする方法

これは次のようになります。シンボリックリンクを介してバインドマウントを実行するには?

しかし、ここでの質問はシンボリックリンクから--bindをマウントする方法です。

私は/linux-4.13.0とそれを指すシンボリックリンクlinuxを持っています:/linux -> /linux-4.13.0

いいえ、私はmount --bind /linux /currentを好みますが、実際にはシンボリックリンクではなく/linux-4.13.0ターゲットをマウントします。これは、後でシンボリックリンクを変更してもインストールに影響を与えないことを意味します。この状況を変える方法はありますか?

答え1

残念ながら、マウントの基本のために望むことは不可能です。

「mount AB」を呼び出して「A」ディレクトリを取得し、「B」ではなくカーネルディレクトリ階層に追加します。通常、「A」は「B」に接続されたFSのルートを持つファイルシステムを含むブロックデバイスです。バインドマウントは単に「A」ディレクトリを取得します。 (モバイルマウントは基本的にバウンドマウントと同じで、元の位置から「A」を追加するだけです。)

したがって、提供する「A」および「B」パスは、まずすべてのシンボリックリンクと関連コンポーネントをナビゲートして2つの物理ディレクトリを取得することによって解決されます。カーネルには元のパスはありません。 (これがまさに、どのシステムが呼び出された "mount"コマンドを正確に記憶するために/ etc / mtabファイルを使用する理由でもあります。)

これはすべて、ディレクトリ以外のディレクトリ以外のディレクトリ(一般ファイルなど)をインストールする場合にも適用されます。ディレクトリ以外のディレクトリにディレクトリをマウントすることはできません。逆も同様です。

答え2

Linux v5.12+カーネルを使用すると、新しいマウントAPIを使用してシンボリックリンクからバインドマウントを作成できます。例は次のとおりです。

$ unshare --mount
$ mount --types tmpfs tmpfs /tmp
$ cd /tmp
$ echo TEST1 > test1
$ echo TEST2 > test2
$ ln --symbolic test1 symlink1
$ ln --symbolic test2 symlink2
$ cat symlink1
TEST1
$ cat symlink2
TEST2
$ bindmount-v2 symlink1 symlink2
Mounting symlink1 into symlink2
$ cat symlink2
TEST1
$ cat /proc/self/mountinfo | grep symlink
2221 2323 0:120 /symlink1 /tmp/symlink2 rw,relatime - tmpfs tmpfs rw,inode64

これは単純なCプログラムを使用しますbindmount-v2。標準インストールユーティリティにそれを追加しようとしたことはありません。

追加は、AT_SYMLINK_NOFOLLOWシンボリックリンクからバインドマウントを作成するための重要な部分です。

メモ:

  • 私が答えたのとほぼ同じですサーバー障害についてこれは、Bindmountの「シンボリックリンクを介した」および「シンボリックリンクの」ケースに適しているためです。
  • シンボリックリンクはディレクトリにバインドマウントしたり、ディレクトリからマウントすることはできません。

関連情報