디렉토리 하드 링크는 여러 가지 방법으로 파일 시스템을 손상시킵니다
그들은 당신이 루프를 만들 수 있습니다
디렉토리에 대한 하드 링크는 자신의 부모에 링크 될 수 있으며, 이로 인해 파일 시스템 루프가 생성됩니다. 예를 들어,이 명령은 백 링크로 루프를 만들 수 있습니다 l
.
mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l
디렉토리 루프가있는 파일 시스템의 깊이는 다음과 같습니다.
cd /tmp/a/b/l/b/l/b/l/b/l/b
그러한 디렉토리 구조를 순회 할 때 무한 루프를 피하는 것은 다소 어렵습니다 (예를 들어 POSIX는이 find
를 피해야합니다).
이러한 종류의 하드 링크가있는 파일 시스템은 트리가 아닙니다. 트리는 정의상 루프를 포함하지 않아야하기 때문입니다.
부모 디렉토리의 모호함을 깨뜨립니다.
파일 시스템 루프를 사용하면 여러 상위 디렉토리가 존재합니다.
cd /tmp/a/b
cd /tmp/a/b/l/b
첫 번째 경우 /tmp/a
는의 상위 디렉토리입니다 /tmp/a/b
.
두 번째 경우 /tmp/a/b/l
는의 상위 디렉토리이며 /tmp/a/b/l/b
와 동일합니다 /tmp/a/b
.
따라서 두 개의 상위 디렉토리가 있습니다.
그들은 파일을 곱합니다
심볼릭 링크를 확인한 후 경로로 파일을 식별합니다. 그래서
/tmp/a/b/foo.txt
/tmp/a/b/l/b/foo.txt
다른 파일입니다.
파일의 추가 경로는 무한히 많습니다. 물론 그들의 inode 수는 동일합니다. 그러나 루프를 명시 적으로 기대하지 않으면 확인할 필요가 없습니다.
디렉토리 하드 링크는 하위 디렉토리 또는 하위 또는 상위가 아닌 디렉토리를 가리킬 수도 있습니다. 이 경우 링크의 하위 인 파일은 두 개의 경로로 식별되는 두 개의 파일로 복제됩니다.
당신의 예
$ ln /Some/Direcoty /home/nischay/Hard-Directory
$ echo foo > /home/nischay/Hard-Directory/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ echo bar >> /Some/Direcoty/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ cat /Some/Direcoty/foobar.txt
foo
bar
그러면 디렉토리에 대한 소프트 링크는 어떻게 작동합니까?
소프트 링크 및 소프트 링크 된 디렉토리 루프를 포함 할 수있는 경로는 종종 파일을 식별하고 열기 위해 사용됩니다. 일반적인 선형 경로로 사용할 수 있습니다.
그러나 경로를 사용하여 파일을 비교할 때 다른 상황이 있습니다. 이 경우 경로의 기호 링크를 먼저 해석하여 최소 로 변환 하고 표준 경로를 작성하는 데 일반적으로 동의합니다 .
소프트 링크는 링크없이 경로로 확장 될 수 있기 때문에 가능합니다. 경로에있는 모든 소프트 링크를 사용하여이 작업을 수행 한 후 나머지 경로는 트리의 일부이며 경로는 항상 명확합니다.
이 명령 readlink
은 정식 경로의 경로를 확인할 수 있습니다.
$ readlink -f /some/symlinked/path
소프트 링크는 파일 시스템이 사용하는 것과 다릅니다
소프트 링크는 파일 시스템 내부의 링크와 다르기 때문에 모든 문제를 일으킬 수 없습니다. 하드 링크와 구별 될 수 있으며 필요한 경우 심볼릭 링크가없는 경로로 분석 될 수 있습니다.
어떤 의미에서 심볼릭 링크를 추가해도 기본 파일 시스템 구조가 변경되지는 않지만 유지되지만 응용 프로그램 계층과 같은 더 많은 구조가 추가됩니다.
보낸 사람 man readlink
:
NAME
readlink - print resolved symbolic links or canonical
file names
SYNOPSIS
readlink [OPTION]... FILE...
DESCRIPTION
Print value of a symbolic link or canonical file name
-f, --canonicalize
canonicalize by following every symlink in
every component of the given name recursively;
all but the last component must exist
[ ... ]