ディレクトリのハードリンクをシンボリックリンクできますか? (このディレクトリの最上位にマウントすると、同じ物理的な場所を指しますか?)

ディレクトリのハードリンクをシンボリックリンクできますか? (このディレクトリの最上位にマウントすると、同じ物理的な場所を指しますか?)

mountしばらく前に、後で隠されたディレクトリのファイルにアクセスできるようにしたいと思いました。 SEでいくつかのQA回答を見つけた覚えがありますが、私が試した回答のどれも効果がなかったことを覚えています。たぶん彼らは以前のLinuxカーネルで作業していたかもしれません。これで、最新のカーネル(現在5.x)の1つを含むディストリビューションを使用しようとしています。

マウントによって隠されたディレクトリツリー部分にアクセスするために「標準」ツールを使用する方法が実際にある場合は、答えを作成してください。

私はいくつかの解決策を考えました。

  1. ディレクトリのハードリンクへのソフトリンクを作成するためのツールがありますか? AFAIK規格はlnこれを行うことはできません。ln -s(AFAIKと試行錯誤による)inodeではなくファイルツリーの場所へのリンクを作成します。その場所が指す位置が変更されると(上部マウントを介して)、シンボリックリンクは古い場所ではなく新しい場所を指します。

@terdonのコメントに応じて追加されました。
ユーザーの観点(少なくとも私の読者man lnなど)では、シンボリックリンクはオペレーティングシステム(システムユーティリティを含む)がinode(ハードリンク)と区別されるリンクの種類です。これはfindループを通過しないリンクです。

  1. 物理inodeデータを半手動で読み取った後dd(マウント前)、後で別のデータに適用します(デフォルトではハードリンク)。どうすればいいですか?

  2. カーネルのフォルダへのハードリンクを有効にします。 (私はこれを特別な作業にほとんど使用しない計画です。循環的推論を知っていますが、私が知っている限り、多くのUnixがこれを持っていて動作します。)どうすればよいですか?

PS:質問を複数に分割する方が良いかもしれません...

補足 2.ln -sテスト:

$ echo 123 > 1/1/te.xt
$ ln -s 1/1 2
$ ls 2
te.xt
$ sudo mount -o loop /path/ubuntu-20.04.3-desktop-amd64.iso 1
$ ls 2 # 2 is displayed as broken link in GUI
2

3つを追加しました。mount --bind以下で試してみてください。デフォルトのマウントポイントパスのコンテンツにアクセスする- 失敗

$ mount --bind 1 2
$ ls 2
1
$ sudo mount -o loop /path/ubuntu-20.04.3-desktop-amd64.iso 1
$ ls 2
boot  casper  dists  EFI  install  isolinux  md5sum.txt  pool  preseed  ubuntu

追加4:前のレベルにマウントバインディング - 同じ方法で失敗します(ところで、tmpfsシステムですが、ext4でも機能しますか?で読むように--bind提案した内容の説明が見つかりませんでしたman mount)。

補足5:オーバーシャ​​ドウイングコマンドの後に実行する必要があることがわかり
ました。mount --bindmount

答え1

..ディレクトリツリーに循環が発生し、ディレクトリエントリが一意でないため、ディレクトリへのハードリンクを作成できません。ディレクトリへのハードリンクを作成できないため、ディレクトリハードリンクへのソフトリンクを作成できません。

そうでなければファイルシステム自体に対するバイナリパッチ、この場合は、次のように、または他の方法で中断できます。少なくともfsckそれはあなたをガタガタさせ、ファイルシステムドライバも吐き出すかどうか疑問に思います。

にいくつかのデータがあり、他のものを/fooマウントするときにそのデータを使用できるようにする必要がある場合は、/foo最も簡単な方法は名前を/fooに変更し/barて新しい空のディレクトリを作成し、その新しい/fooディレクトリに別のファイルシステムをマウントすることです/foo

Linuxでは、バインドマウントを使用して何かをマウントし、ソースファイルがに表示されるようにソース/fooファイル全体をバインドマウントできます。しかし、残りの部分もそこに表示されるので、などが表示されます。//bar/foo/bar/foo//bar/bin/bar/etc

# mkdir /foo /bar
# touch /foo/file-in-root-fs.txt
# mount -t tmpfs tmpfs /foo
# mount --bind / /bar
# ls -l /bar/foo
total 0
-rw-r--r-- 1 root root 0 Dec  1 14:36 file-in-root-fs.txt

新しいインストールの下に1つのディレクトリだけがバインドマウントできることを確認しようとしましたが、方法が見つかりませんでした。

/fooインストールを最初にバインド/barしてから、インストールしようとする直接的な試みも、新しい/fooインストールを両方の場所にコピーするようです。 (これは古いカーネルにありますが)

# mount --bind /foo /bar
# mount -t tmpfs tmpfs /foo
# ls -ldi /foo /bar
46378188 drwxrwxrwt 2 root root 40 Dec  1 14:37 /bar/
46378188 drwxrwxrwt 2 root root 40 Dec  1 14:37 /foo/

関連情報