Unix:「..」は親を指していません。これはどのように可能ですか?

Unix:「..」は親を指していません。これはどのように可能ですか?

最近、Solaris 11 システムで開発中に次の問題が発生しました。

とにかく、一部のディレクトリの親ポインタ(..)は、親ディレクトリとは異なるディレクトリを指します。

p親ディレクトリと問題のディレクトリ d (つまり、dディレクトリ内に位置p)を呼び出してみましょう。

そうではd/..ありませんp。特に、これら2つのコマンドは

ls -ild  p

ls -ild  p/d/..

他のiノード番号を表示します。実際、2番目のコマンドは同じiノードを別のサブディレクトリに提供しますpp/x

そしていいえ、dシンボリックリンクではありません。 (これが私が最初にチェックすることです。)

どうやってこれができますか?カーネルがそのようなことが起こるのを防ぐと思います。

私は他の人がディレクトリを移動して名前を変更することを知っていますが、彼らが正確に何をしているのかわかりません。しかし、彼らはシステムのハッキング方法を知らないようです。

答え1

元の質問に対する実際の回答を提供し、この状態を生成する方法を説明します。

mkfile 100m ufs
lofiadm -a /path/to/ufs
newfs /dev/rlofi/1
newfs: Neues Dateisystem /dev/rlofi/1 erstellen: (y/n)? y
/dev/rlofi/1:   204600 Sektoren in 341 Zylindern von 1 Spuren, 600 Sektoren
        99,9MB in 22 Zylindergruppen (16 c/g, 4,69MB/g, 2240 i/g)
Superblock Backups (für fsck -F ufs -o b=#) bei:
 32, 9632, 19232, 28832, 38432, 48032, 57632, 67232, 76832, 86432,
 115232, 124832, 134432, 144032, 153632, 163232, 172832, 182432, 192032, 201632

mount /dev/lofi/1 /mnt
cd /mnt
mkdir -p a/b/c d

ls -lid a/b/ a/b/c a/b/c/..
     5 drwxr-xr-x   3 root     root         512 Apr 20 17:05 a/b/
     6 drwxr-xr-x   2 root     root         512 Apr 20 17:05 a/b/c
     5 drwxr-xr-x   3 root     root         512 Apr 20 17:05 a/b/c/..

link a/b/c/ d/hlink
ls -lid a/b/ a/b/c a/b/c/.. d/ d/hlink/ d/hlink/..
     5 drwxr-xr-x   3 root     root         512 Apr 20 17:05 a/b/
     6 drwxr-xr-x   3 root     root         512 Apr 20 17:05 a/b/c
     5 drwxr-xr-x   3 root     root         512 Apr 20 17:05 a/b/c/..
     7 drwxr-xr-x   2 root     root         512 Apr 20 17:08 d/
     6 drwxr-xr-x   3 root     root         512 Apr 20 17:05 d/hlink/
     5 drwxr-xr-x   3 root     root         512 Apr 20 17:05 d/hlink/..

これによりテストが生成されます。あらかじめファイルシステムにファイルを保存したら、次のようにブロックデバイスとして使用します。lofi(7d)「ループバックファイルドライバ」(以下の注を参照)を選択し、そのディレクトリfbkにインストールします。/mntufsファイルシステム(zfsとは異なり)もディレクトリへのハードリンク生成をサポートしますが、rootユーザーに対してのみサポートされます。

ご覧のとおり、inode番号はa/b/5、inode番号もof a/b/c/..5です。また、呼び出しによってa / b / cディレクトリのリンク数が1増加したことを確認できますlink

新しいハードリンクディレクトリを作成したら、inode番号が7(上記のディレクトリのinode番号)ではなく5(上記のディレクトリのinode番号)であることがd/hlinkわかります。d/hlink/..

注:loopbackファイルシステムは1987年にSunOS-4.0で初めて登場しました。その目的は、VFS間接層として機能し、ファイルシステムツリーを同じコンピュータに2番目にマウントできるようにすることです。このLinuxバインドマウントがループバックファイルシステムのアイデアを再実装したかどうかはわかりません。

それは明らかですfbkドライバ(ファイルエミュレーションブロックデバイス)は1988年10月に私が開発し、1990年代半ばに間違った名前でLinuxで再実装されましたloopback

答え2

最も単純な可能性が最も可能性が高いという前提から始めると、次のようになります。

私は他の人がディレクトリを移動して名前を変更することを知っていますが、彼らが正確に何をしているのかわかりません。

これにより、シーンの再現が比較的簡単になります。最初の端末のプロンプトを2番目の端末のプロンプト1$で実行するこの例を考えてみましょう。2$

# Set up the scenario
1$ mkdir a a/b a/b/c d
1$ cd a/b/c

# Look at the parent inode
1$ ls -lid ..
143279 drwxr-xr-x 3 roaima roaima 4096 Apr 20 08:42 ..

# Second session changes the directory structure
2$ mv a/b/c d

# Look at the parent inode once more - notice it's changed
1$ ls -lid ..
142603 drwxr-xr-x 3 roaima roaima 4096 Apr 20 08:43

関連情報