最近、Solaris 11 システムで開発中に次の問題が発生しました。
とにかく、一部のディレクトリの親ポインタ(..
)は、親ディレクトリとは異なるディレクトリを指します。
p
親ディレクトリと問題のディレクトリ
d
(つまり、d
ディレクトリ内に位置p
)を呼び出してみましょう。
そうではd/..
ありませんp
。特に、これら2つのコマンドは
ls -ild p
ls -ild p/d/..
他のiノード番号を表示します。実際、2番目のコマンドは同じiノードを別のサブディレクトリに提供しますp
。p/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
にインストールします。/mnt
ufsファイルシステム(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