최근에 나는 면접 중에 이것을 물었다. 나는 정직하고 상징적 인 링크가 어떻게 행동하고 어떻게 만드는지 알았지 만 하드 링크의 사용법과 그것이 상징적 인 링크와 어떻게 다른지 이해하지 못한다고 말했다.
최근에 나는 면접 중에 이것을 물었다. 나는 정직하고 상징적 인 링크가 어떻게 행동하고 어떻게 만드는지 알았지 만 하드 링크의 사용법과 그것이 상징적 인 링크와 어떻게 다른지 이해하지 못한다고 말했다.
답변:
파일 시스템 아래에서 파일은 inode로 표시됩니다. (또는 여러 개의 inode입니까? 확실하지 않습니다.)
파일 시스템의 파일은 기본적으로 inode에 대한 링크입니다.
그런 다음 하드 링크는 동일한 기본 inode에 대한 링크가있는 다른 파일을 만듭니다.
파일을 삭제하면 기본 inode에 대한 하나의 링크가 제거됩니다. inode는 inode에 대한 모든 링크가 삭제 된 경우에만 삭제됩니다 (또는 삭제 가능 / 쓰기 가능).
기호 링크는 파일 시스템의 다른 이름에 대한 링크입니다.
하드 링크가 만들어지면 링크는 inode로 연결됩니다. 원본 파일을 삭제, 이름 변경 또는 이동하면 기본 inode에 연결되는 하드 링크에 영향을 미치지 않습니다. inode의 데이터 변경 사항은 해당 inode를 참조하는 모든 파일에 반영됩니다.
참고 : 하드 링크는 동일한 파일 시스템 내에서만 유효합니다. 심볼릭 링크는 단순히 다른 파일의 이름이므로 파일 시스템에 걸쳐있을 수 있습니다.
Linux (ish) 콘솔을 사용하면 도움이 될만한 직관력이 있습니다.
두 개의 파일을 작성하십시오.
$ touch foo; touch bar
그들에 데이터를 입력하십시오 :
$ echo "Cat" > foo
$ echo "Dog" > bar
(실제로 파일이 존재하지 않으면 파일을 생성하기 때문에 에코를 먼저 사용할 수 있었지만 결코 신경 쓰지 않았습니다.)
그리고 예상대로 :
$cat foo; cat bar
Cat
Dog
하드 링크와 소프트 링크를 만들어 봅시다 :
$ ln foo foo-hard
$ ln -s bar bar-soft
방금 일어난 일을 봅시다 :
$ ls -l
foo
foo-hard
bar
bar-soft -> bar
foo의 이름을 바꾸는 것은 중요하지 않습니다 :
$ mv foo foo-new
$ cat foo-hard
Cat
foo-hard는 변경되지 않은 파일의 inode, 내용을 가리 킵니다.
$ mv bar bar-new
$ ls bar-soft
bar-soft
$ cat bar-soft
cat: bar-soft: No such file or directory
소프트 링크가 내용이 아닌 이름, 변경된 내용을 가리 키므로 파일의 내용을 찾을 수 없습니다.
마찬가지로, foo
삭제 된 경우 foo-hard
에도 컨텐츠를 보유합니다. bar
삭제 된 경우 bar-soft
존재하지 않는 파일에 대한 링크 일뿐입니다.
touch blah1; touch blah2
단축 할 수있다touch blah1 blah2
말씀이 진행됨에 따라 그림은 천 단어의 가치가 있습니다. 그것을 시각화하는 방법은 다음과 같습니다.
우리가 그 그림을 얻는 방법은 다음과 같습니다.
myfile.txt
파일 시스템에 새 inode (파일의 메타 데이터를 포함하고 내용이 포함 된 데이터 블록, 즉 "Hello, World!")를 가리키는 이름 을 작성하십시오 .
$ echo 'Hello, World!' > myfile.txt
my-hard-link
파일에 대한 하드 링크 를 작성하십시오. myfile.txt
이는 "지정한 동일한 inode를 myfile.txt
가리키는 파일 작성"을 의미합니다 .
$ ln myfile.txt my-hard-link
my-soft-link
파일에 대한 소프트 링크 를 작성하십시오. myfile.txt
이는 "파일을 가리키는 파일 작성"을 의미합니다 myfile.txt
.
$ ln -s myfile.txt my-soft-link
myfile.txt
삭제 (또는 이동) 된 경우 현재 수행되는 작업을 살펴보십시오 . my-hard-link
여전히 동일한 내용을 가리 키므로 영향을받지 않지만 my-soft-link
이제는 아무 것도 가리 키지 않습니다. 다른 답변은 각각의 장단점에 대해 설명합니다.
myfile.txt
). 소프트 링크의 경우, 그것의 참조는 아이 노드 (데이터를 포함하는)이 아니라, 그것의 참조에 대한 파일 시스템 경로입니다 myfile.txt
(예 /home/Documents/myfile.txt
)
하드 링크는 원본 파일이 이동 될 때 유용합니다. 예를 들어, 파일을 / bin에서 / usr / bin으로 또는 / usr / local / bin으로 이동하십시오. / bin에있는 파일에 대한 심볼릭 링크는 이것에 의해 손상 될 수 있지만, 파일의 inode에 직접 링크되는 하드 링크는 상관하지 않습니다.
하드 링크는 디렉토리 항목 만 차지하므로 디스크 공간을 덜 차지할 수 있지만 symlink는 가리키는 이름을 저장하기 위해 자체 inode가 필요합니다.
하드 링크는 해결하는 데 시간이 덜 걸립니다. 심볼릭 링크는 심볼릭 링크 된 디렉토리에있는 다른 심볼릭 링크를 가리킬 수 있습니다. 그리고이 중 일부는 NFS 또는 다른 대기 시간이 긴 파일 시스템에있을 수 있으므로 네트워크 트래픽을 해결할 수 있습니다. 항상 동일한 파일 시스템에있는 하드 링크는 항상 단일 조회로 해결되며 네트워크 대기 시간과 관련이 없습니다 (NFS 파일 시스템의 하드 링크 인 경우 NFS 서버가 해결을 수행하므로 보이지 않습니다). 클라이언트 시스템). 때로는 이것이 중요합니다. 나에게는 그렇지 않지만 이것이 중요한 고성능 시스템을 상상할 수 있습니다.
또한 mmap (2) 및 심지어 open (2)와 같은 것들도 하드 링크와 동일한 기능을 사용하여 파일의 inode를 활성 상태로 유지하여 파일이 연결 해제 (2) 되더라도 프로세스가 계속 액세스 할 수 있도록합니다. 프로세스가 닫히면 파일이 실제로 사라집니다. 이것은 훨씬 더 안전한 임시 파일을 허용합니다 (여기서 오픈 및 링크 해제가 원자 적으로 발생할 수있는 경우 기억하지 못하는 POSIX API가있을 수 있으며 실제로는 안전한 임시 파일이 있습니다). 누구도 액세스 할 수없는 데이터. 글쎄, / proc가 모든 사람에게 파일 디스크립터를 볼 수있는 능력을 부여하기 전에는 사실 이었지만 그것은 또 다른 이야기입니다.
말하자면, 프로세스 A에서 열려 있지만 파일 시스템에서 링크되지 않은 파일을 복구하면 하드 링크를 사용하여 inode 링크를 다시 생성하므로 파일이 열려있는 프로세스가 닫히거나 사라질 때 파일이 사라지지 않습니다.
소프트 링크 :
소프트 또는 기호는 원본 파일에 대한 지름길입니다 .... 원본을 삭제하면 바로 가기가 실패하고 지름길 만 삭제하면 원본에 아무런 변화가 없습니다.
소프트 링크 구문 :ln -s Pathof_Target_file link
출력 : link -> ./Target_file
증명 : readlink link
또한 ls -l link
출력 에서 파일이 소프트 링크임을 나타내는 llrwxrwxrwx
로 첫 글자 가 표시됩니다.
링크 삭제 : unlink link
참고 : 원하는 경우 현재 디렉토리에서 다른 위치로 이동 한 후에도 소프트 링크가 작동 할 수 있습니다. 소프트 링크를 만드는 동안 상대 경로가 아닌 절대 경로를 제공하십시오. 즉 (./Target_file이 아닌 / root / user / Target_file에서 시작)
하드 링크 :
하드 링크는 미러 사본이거나 동일한 파일에 대한 여러 경로입니다. file1에 무언가를하고 파일 2에 나타납니다. 하나를 삭제하면 다른 하나는 여전히 유효합니다.
inode (또는 파일)는 모든 (하드) 링크 또는 (동일한 파일) 노이드에 대한 모든 경로가 삭제 된 경우에만 삭제됩니다.
하드 링크가 만들어지면 링크는 원본 파일의 inode를 갖습니다. 원본 파일의 이름을 바꾸거나 이동하면 기본 inode에 연결된 하드 링크에는 영향을 미치지 않습니다. inode의 데이터 변경 사항은 해당 inode를 참조하는 모든 파일에 반영됩니다.
하드 링크 구문 :ln Target_file link
출력 : 이름이 링크 된 파일이 Targetfile과 동일한 inode 번호로 작성됩니다.
증명 : ls -i link Target_file
(아이 노드 확인)
링크 삭제 : rm -f link
(일반 파일처럼 링크 삭제)
참고 : 심볼릭 링크는 단순히 다른 파일의 이름이므로 파일 시스템에 걸쳐있을 수 있습니다. 하드 링크는 동일한 파일 시스템 내에서만 유효합니다.
심볼릭 링크에는 하드 링크가없는 일부 기능이 있습니다.
하드 링크를 사용하는 동안 기호 링크가 가리키는 위치를 즉시 알 수 있으므로 전체 파일 시스템을 탐색하여 동일한 inode를 공유하는 파일을 찾아야합니다.
# find / -inum 517333
/home/bobbin/sync.sh /root/synchro
하드 링크는 디렉토리를 가리킬 수 없습니다.
하드 링크에는 두 가지 제한이 있습니다.
하드 링크와 기호 링크의 차이점을 보는 간단한 방법은 간단한 예입니다. 파일에 대한 하드 링크는 파일이 저장된 위치 또는 해당 파일의 inode를 가리 킵니다. 심볼릭 링크는 실제 파일 자체를 가리 킵니다.
따라서 "a"라는 파일이 있고 하드 링크 "b"와 심볼릭 링크 "c"를 만들면 모두 "a"파일을 참조합니다.
echo "111" > a
ln a b
ln -s a c
"a", "b"및 "c"의 출력은 다음과 같습니다.
cat a --> 111
cat b --> 111
cat c --> 111
이제 파일 "a"를 제거하고 "a", "b"및 "c"의 출력에 어떤 영향이 있는지 살펴 보겠습니다.
rm a
cat a --> No such file or directory
cat b --> 111
cat c --> No such file or directory
무슨 일이야?
파일 "c"는 파일 "a"자체를 가리 키기 때문에 파일 "a"가 삭제되면 "c"파일은 가리킬 것이 없으며 실제로는 파일도 삭제됩니다.
그러나 파일 "b"는 파일 "a"의 저장 위치 또는 inode를 가리 킵니다. 따라서 "a"파일이 삭제되면 더 이상 inode를 가리 키지 않지만 "b"파일은 더 이상 하드 링크가 더 이상 가리 키지 않을 때까지 "a"에 속하는 모든 내용을 계속 저장합니다.
심볼릭 링크는 경로 이름에 연결됩니다. 이것은 시스템의 파일 트리 어느 곳에 나있을 수 있으며 링크를 만들 때 존재할 필요도 없습니다. 대상 경로는 상대적이거나 절대적 일 수 있습니다.
하드 링크는 inode에 대한 추가 포인터로, 대상과 동일한 볼륨에만 존재할 수 있습니다. 파일에 대한 추가 하드 링크는 파일을 참조하는 데 사용되는 "원본"이름과 구별 할 수 없습니다.
나는 당신에게 Wikipedia를 지적 할 것입니다 :
몇 가지 사항 :
하드 링크는 증분 백업을 수행 할 때 매우 유용합니다. 예를 들어 rsnapshot을 참조하십시오 . 아이디어는 하드 링크를 사용하여 복사하는 것입니다.
모든 증분 백업은 변경되지 않은 파일에 대해 동일한 inode 세트를 가리 키므로 새 백업은 변경 한 내용을 제외하고 추가 공간을 차지하지 않습니다.
Nick의 질문에 덧붙입니다. 하드 링크 는 언제 유용합니까? 기호 링크가 작동하지 않는 유일한 응용 프로그램은 chrooted 환경에서 시스템 파일의 사본을 제공하는 것입니다.
심볼릭 링크는 다른 파일 시스템 객체를 가리키는 파일 시스템 객체입니다. 가리키는 객체를 대상이라고합니다.
심볼릭 링크는 사용자에게 투명합니다. 링크는 일반 파일 또는 디렉토리로 표시되며 사용자 나 응용 프로그램에서 정확히 동일한 방식으로 작동 할 수 있습니다.
심볼릭 링크는 UNIX 운영 체제와의 마이그레이션 및 응용 프로그램 호환성을 지원하도록 설계되었습니다. Microsoft는 UNIX 링크처럼 작동하도록 기호 링크를 구현했습니다.
심볼릭 링크는 절대 또는 상대 링크 일 수 있습니다. 절대 링크는 경로 이름의 각 부분을 지정하는 링크입니다. 상대 링크는 상대 경로 지정자가 지정된 경로에있는 위치를 기준으로 결정됩니다.
절대 기호 링크의 예
X: "C:\alpha\beta\absLink\gamma\file"
Link: "absLink" maps to "\\machineB\share"
Modified Path: "\\machineB\share\gamma\file"
상대 심볼릭 링크의 예
X: C:\alpha\beta\link\gamma\file
Link: "link" maps to "..\..\theta"
Modified Path: "C:\alpha\beta\..\..\theta\gamma\file"
Final Path: "C:\theta\gamma\file"
하드 링크는 하나 개 이상의 경로가 하나의 파일 참조하는 파일의 파일 시스템 표현입니다 같은 볼륨을 .
창에서 하드 링크를 만들려면 링크를 만들 위치로 이동하여 다음 명령을 입력하십시오.
mklink /H Link_name target_path
하드 링크는 작성된 순서에 관계없이 모든 순서를 삭제할 수 있습니다. 또한 하드 링크를 만들 수 없습니다
NTFS는 junction이라는 다른 링크 유형을 지원합니다. MSDN은 다음과 같이 정의합니다.
정션 (소프트 링크라고도 함)은 참조하는 스토리지 오브젝트가 별도의 디렉토리이며, 정션 이 동일한 컴퓨터의 다른 로컬 볼륨에있는 디렉토리를 링크 할 수 있다는 점에서 하드 링크와 다릅니다 . 그렇지 않으면 접점은 하드 링크와 동일하게 작동합니다.
하드 링크 섹션과 정션 섹션의 굵은 체 부분은이 둘의 기본 차이점을 보여줍니다.
창에서 접합을 작성하고 링크를 작성할 위치로 이동 한 후 다음을 입력하십시오.
mklink /J link_name target_path
간단히 말하면, 하드 링크 : 그냥 파일에 새로운 이름을 추가하는 것입니다. 즉, 파일은 동시에 많은 이름을 가질 수 있습니다. 모든 이름은 서로 같고 선호하지 않습니다. 하드 링크는 모든 내용을 복사하는 것을 의미하지 않습니다 파일의 이름을 바꾸고 새 파일을 만드는 것은 아닙니다. 단지 알려진 대체 이름을 만듭니다.
심볼릭 링크 (symlink) : 다른 파일을 가리키는 파일 포인터입니다. 심볼릭 링크가 나중에 삭제 된 기존 파일을 가리키는 경우 이름이 더 이상 파일 이름을 지정하지 않아도 심볼릭 링크는 동일한 파일 이름을 계속 가리 킵니다.
일반적인 "파일"로 생각하는 것은 실제로 파일의 데이터와 디렉토리 항목의 두 가지입니다. 파일에 대한 하드 링크를 만들 때 실제로 동일한 데이터를 참조하는 두 번째 디렉토리 항목을 만듭니다. 두 디렉토리 항목 모두 기능이 동일합니다. 각 파일을 읽기 위해 파일을 여는 데 사용할 수 있습니다. 따라서 실제로 "파일과 하드 링크"가 없으며 "두 개의 디렉토리 항목이있는 파일 데이터"가 있습니다. 파일을 삭제하는 것으로 생각하면 실제로 디렉토리 항목이 삭제되고 데이터의 마지막 디렉토리 항목이 삭제되면 데이터 자체도 삭제됩니다. 디렉토리 항목이 하나만있는 일반 파일의 경우 디렉토리 항목을 삭제하면 항상 데이터가 삭제됩니다. (파일이 열려있는 동안 OS는 파일에 대한 임시 링크를 만듭니다.
예를 들어, 파일 A.txt, 하드 링크 B.txt를 작성하고 A.txt를 삭제하십시오. A.txt를 작성할 때 일부 데이터가 작성되었으며 디렉토리 항목 A.txt가 있습니다. 하드 링크를 작성할 때 정확히 동일한 데이터를 가리키는 다른 디렉토리 항목 B.txt가 작성되었습니다. A.txt를 삭제해도 처음에 B.txt 파일을 만든 것처럼 모든 데이터와 단일 디렉토리 항목 B.txt가 그대로 유지됩니다.
소프트 링크는 데이터를 포함하지 않고 다른 디렉토리 항목의 경로를 제외하고 거의 (거의) 일반 파일입니다. 소프트 링크가 참조하는 파일을 삭제하면 소프트 링크는 더 이상 디렉토리 항목을 가리 키지 않는 경로를 포함합니다. 고장났어. 소프트 링크를 삭제하면 다른 파일을 삭제하는 것처럼 해당 파일이 영향을받지 않습니다.
디렉토리 엔트리는 구조체 링크입니다 :
struct dentry{
ino_t ino;
char name[256];
}
ino는 inode의 수이고, 이름은 파일 이름입니다. inode 구조는 다음과 같습니다.
struct inode{
link_t nlink;
...
}
예를 들어 / 1 파일을 만들면 디렉토리 항목은 다음과 같습니다.
struct dentry{
ino_t ino; /* such as 15 */
char name[256]; /* "1" */
}
inode 구조체는 다음과 같습니다.
struct inode{ /* inode number 15 */
link_t nlink; /* nlink = 1 */
...
}
그런 다음 하드 링크 (/ 100 일 수 있음)를 만들고 디렉토리 항목은 다음과 같습니다.
struct dentry{
ino_t ino; /* 15 */
char name[256]; /* 100 */
}
inode 구조체는 다음과 같습니다.
struct inode{ /* inode numebr 15 */
link_t nlink; /* nlink = 2 */
...
}
그런 다음 파일 1에 대한 심볼릭 링크 (/ 200 일 수 있음)를 만듭니다. 디렉토리 항목은 다음과 같습니다.
struct dentry{
ino_t ino; /* such as 16 */
char name[256]; /* "200" */
}
inode 구조체는 다음과 같습니다.
struct inode{ /* inode number 15 */
link_t nlink; /* nlink = 2 */
...
}
struct inode{ /* inode number 16 */
link_t nlink; /* nlink = 1 */
...
} /* the data of inode 16 maybe /1 or 1 */
위의 모든 답변에 추가하여 하드 링크 및 소프트 링크 파일을 찾는 차이점은 다음과 같이 이해할 수 있습니다.
f6
현재 디렉토리와라는 디렉토리에 파일 이 t2
있습니다.
파일 이름이 f1
이고에 ./t2/f2
대한 심볼릭 링크 f6
입니다.
파일 이름 f7
및 ./t2/f8
의 하드 링크입니다 f6
.
소프트 링크와 하드 링크를 찾으려면 다음을 사용할 수 있습니다.
$ find -L . -samefile f6
> ./f1
> ./f6
> ./f7
> ./t2/f2
> ./t2/f8
하드 링크 만 찾으려면 다음을 사용할 수 있습니다.
$ find . -xdev -samefile f6
> ./f6
> ./f7
> ./t2/f8
동일한 파일 시스템에서 하드 링크를 만들 수 있으므로 동일한 파일 시스템 / 마운트 포인트에서 -L
옵션을 사용 하지 않고 모든 하드 링크를 검색 할 수 있습니다 -xdev
. 불필요한 검색을 다른 마운트 지점에 저장합니다.
따라서 하드 링크를 검색하는 것이 소프트 링크를 검색하는 것보다 다소 빠릅니다 (잘못되었거나 명확하지 않은 경우 수정하십시오).
심볼릭 링크는 하드 링크와 비슷한 방식으로 파일에 다른 이름을 지정합니다. 그러나 심볼릭 링크가 남아 있어도 파일을 삭제할 수 있습니다.
사용량에 대한 나의 2 센트 :
소프트 링크를 사용하여 긴 경로 이름을 줄일 수 있습니다.
ln -s /long/folder/name/on/long/path/file.txt /short/file.txt
변경 사항은 /short/file.txt
원본 파일에 적용됩니다.
하드 링크를 사용하여 큰 파일을 이동할 수 있습니다.
$ ls -lh /myapp/dev/
total 10G
-rw-r--r-- 2 root root 10G May 22 12:09 application.bin
ln /myapp/dev/application.bin /myapp/prd/application.bin
다른 폴더로 즉시 복사 /myapp/dev
하고 파일을 터치하지 않고 원본 파일 ( )을 이동하거나 삭제할 수 있습니다./myapp/prd
방금 일반적인 시나리오 인 소프트웨어 설치에서 하드 링크를 이해하는 쉬운 방법을 찾았습니다.
어느 날 Downloads
설치 를 위해 폴더 에 소프트웨어를 다운로드했습니다 . 내가 한 후에 sudo make install
일부 실행 파일이 cp
로컬 bin 폴더에 ed되었습니다. 여기에 하드 링크를cp
만듭니다 . 나는 소프트웨어에 만족했지만 곧 장기적으로 좋은 곳이 아니라는 것을 깨달았습니다 . 그래서 나는 소프트웨어 폴더를 디렉토리에 넣었다. 글쎄, Windows와 같은 대상 링크에 대해 걱정하지 않고 이전과 같이 소프트웨어를 계속 실행할 수 있습니다. 이것은 하드 링크 가 직접 inode와 다른 파일을 찾는 것을 의미 합니다.Downloads
mv
source
이 대답에서 파일을 말할 때 메모리의 위치를 의미합니다.
저장된 모든 데이터는 inodes라는 데이터 구조를 사용하여 메모리에 저장됩니다. 모든 inode에는 inode 번호가 있습니다. inode 번호는 inode에 액세스하는 데 사용됩니다. 파일에 대한 모든 하드 링크는 이름이 다를 수 있지만 동일한 inode 번호를 공유 할 수 있습니다. 모든 하드 링크는 동일한 inode 번호 (동일한 inode에 액세스)를 갖기 때문에 모두 동일한 물리적 메모리를 가리 킵니다.
심볼릭 링크는 특별한 종류의 파일입니다. 파일이기 때문에 파일 이름과 아이 노드 번호를 갖습니다. 위에서 언급 한 바와 같이 아이 노드 번호는 데이터를 가리키는 아이 노드를 얻습니다. 이제 심볼릭 링크를 특별하게 만드는 것은 심볼릭 링크의 inode 번호는 다른 파일의 "경로"를 가리키는 inode에 액세스합니다. 특히 심볼릭 링크의 inode 번호는 다른 하드 링크를 가리키는 해당 inode에 액세스합니다.
GUI에서 파일을 이동, 복사, 삭제하면 실제 메모리가 아닌 파일의 하드 링크로 재생됩니다. 파일을 삭제하면 파일의 하드 링크가 삭제됩니다. 파일에 대한 모든 하드 링크가 삭제 된 경우 메모리에 여전히 존재하더라도 저장된 데이터에 액세스 할 수 없습니다.