나는 디렉토리의 하드 링크가 위험한 이유(루프, 상위 디렉토리 링크로 인한 rmdir 문제)를 이해하고 해당 주제에 대한 다른 질문을 읽었습니다. 그래서 나는 와 이외의 디렉토리에 대한 하드 링크가 사용되지 .
않는다고 가정합니다 ..
. 하지만 CentOS 5 및 6에서는 다음을 볼 수 있습니다.
# ls -id /etc/init.d/
459259 /etc/init.d/
# ls -id /etc/rc.d/init.d/
459259 /etc/rc.d/init.d/
# ls -id /etc/init.d/../
458798 /etc/init.d/../
# ls -id /etc/rc.d/
458798 /etc/rc.d/
# ls -id /etc/
425985 /etc/
즉, 동일한 inode를 가리키고 동일한 inode를 가리키지 않는 디렉토리에 대한 2개의 다른 경로가 /etc/init.d/
실제로 하드 링크 디렉토리의 경우 /etc/rc.d/
입니까 ? /etc/
그렇지 않다면 무엇입니까? 그렇다면 Red Hat이 이 작업을 수행하는 이유는 무엇입니까?
편집: 어리석은 질문을 해서 죄송합니다. 심볼릭 링크라는 것을 알 수 있을 것입니다. 오늘은 커피가 부족한 것 같아요.
답변1
하드링크가 아닌 소프트링크입니다. 심볼릭 링크는 다른 파일을 가리킵니다. 심볼릭 링크를 열면 해당 링크가 가리키는 파일이 열립니다. rm을 사용하여 심볼릭 링크를 삭제하면 심볼릭 링크 자체가 삭제되지만 실제 파일은 삭제되지 않습니다.
이는 허가 시작 부분에 문자 l로 표시됩니다.
lrwxrwxrwx. 1 root root 11 Aug 10 2016 init.d -> rc.d/init.d
또한 rc0.d에서 rc6.d까지의 모든 파일은 rc.d/rc0.d에 대한 심볼릭 링크입니다.
답변2
RHEL, Fedora 및 CentOS에서는/etc/init.d
예심볼릭 링크도착하다 /etc/rc.d/init.d
. 하드 링크가 포함되지 않습니다.
Red Hat이 원하더라도 사용되는 파일 시스템에서는 불가능합니다.
답변3
이 게시물은 약간 오래되었지만 OP가 보고 있는 동작이 아직 설명되지 않은 것 같습니다. 다른 사람들이 말했듯이, /etc/init.d
그렇습니다 /etc/rc.d/init.d
. 누락된 부분은 위에 사용된 두 경로가 동일한 inode를 반환하는 이유이며, 이는 후행 슬래시를 사용하기 때문입니다. 경로가 슬래시로 끝나면 디렉터리가 대상 디렉터리임을 커널과 기타 도구에 알리는 것입니다. 의도한 대상이 실제로 존재하지 않는 디렉터리일 때 mv/cp 명령이 파일 이름을 바꾸지 않도록 보호합니다. 또한 ls에서 사용하는 lstat(2) 시스템 호출이 기호 링크를 역참조하고 그것이 가리키는 디렉터리를 반환하도록 합니다(기존 디렉터리를 가리키지 않으면 오류가 발생합니다). 차이점을 확인하려면 다음 예를 시도해 보세요.
$ ls -id .
927578 .
$ ls -id ./parent
927641 ./parent
$ ls -id ./parent/
927641 ./parent/
$ ls -id ./parent/child
927643 ./parent/child
$ ls -id ./parent/child/
927643 ./parent/child/
$ ls -id ./child
927645 ./child
$ ls -id ./child/
927643 ./child/
$ ls -idL ./child
927643 ./child
$ ls -id ./child/..
927641 ./child/..
$ ls -id ./child/../..
927578 ./child/../..
후행 슬래시의 존재는 심볼릭 링크의 경우에만 중요하지만 링크의 inode는 숨겨지는 것을 볼 수 있습니다. 또한 ls에 대한 -L 옵션은 모든 파일 유형에 대해 작동하지만 유사한 작업을 수행합니다.