
최근 Solaris 11 시스템에서 개발하는 동안 다음 문제가 발생했습니다.
어쨌든 일부 디렉터리의 상위 포인터( ..
)는 상위 디렉터리와 다른 디렉터리를 가리킵니다.
p
상위 디렉토리 와 문제의 디렉토리
d
(즉, d
디렉토리 내에 위치 p
) 를 호출해 보겠습니다 .
그렇지 d/..
않다 p
. 특히 이 두 명령은
ls -ild p
ls -ild p/d/..
다른 i-노드 번호를 표시합니다. 실제로 두 번째 명령은 동일한 i-node를 다른 하위 디렉터리로 제공합니다 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와 달리)도 디렉토리에 대한 하드 링크 생성을 지원하지만 루트 사용자에 대해서만 지원됩니다.
보시다시피, 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 간접 계층 역할을 하여 파일 시스템 트리가 동일한 컴퓨터에 두 번째로 마운트될 수 있도록 하는 것입니다. 이 Linux 바인드 마운트가 루프백 파일 시스템 아이디어를 다시 구현한 것인지 확실하지 않습니다.
그것은 명백하다fbk
드라이버(파일 에뮬레이션 블록 장치)는 1988년 10월에 제가 개발했으며 1990년대 중반에 잘못된 이름으로 Linux에서 다시 구현되었습니다 loopback
.
답변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