심볼릭 링크와 하드 링크의 차이점은 무엇입니까?


768

최근에 나는 면접 중에 이것을 물었다. 나는 정직하고 상징적 인 링크가 어떻게 행동하고 어떻게 만드는지 알았지 만 하드 링크의 사용법과 그것이 상징적 인 링크와 어떻게 다른지 이해하지 못한다고 말했다.


2
'하드 링크의 사용을 이해하지 못합니다'에 대해 바이너리를 많이 복사하는 빌드 시스템에서 사용할 수 있습니다. 실제 복사 대신 하드 링크를 만들면 속도가 빨라집니다. MSBuild 4.0이이를 지원합니다.
Ankush

13
이 링크를 이해하면 매우 유용합니다. askubuntu.com/questions/108771/…
kta

2
unix.stackexchange는 글 머리 기호 목록이 훌륭합니다 ... 모든 제약 조건을 매우 간결하게 배치하고 탈지하기 쉽기 때문에 매우 유용합니다. (이 글 머리 기호 중 많은 부분은이 질문에 대한 의견에서만 언급되었거나 전혀 언급되지 않은 가장자리 사례 / 캐비티를 다룹니다.)
Trevor Boyd Smith

답변:


779

파일 시스템 아래에서 파일은 inode로 표시됩니다. (또는 여러 개의 inode입니까? 확실하지 않습니다.)

파일 시스템의 파일은 기본적으로 inode에 대한 링크입니다.
그런 다음 하드 링크는 동일한 기본 inode에 대한 링크가있는 다른 파일을 만듭니다.

파일을 삭제하면 기본 inode에 대한 하나의 링크가 제거됩니다. inode는 inode에 대한 모든 링크가 삭제 된 경우에만 삭제됩니다 (또는 삭제 가능 / 쓰기 가능).

기호 링크는 파일 시스템의 다른 이름에 대한 링크입니다.

하드 링크가 만들어지면 링크는 inode로 연결됩니다. 원본 파일을 삭제, 이름 변경 또는 이동하면 기본 inode에 연결되는 하드 링크에 영향을 미치지 않습니다. inode의 데이터 변경 사항은 해당 inode를 참조하는 모든 파일에 반영됩니다.

참고 : 하드 링크는 동일한 파일 시스템 내에서만 유효합니다. 심볼릭 링크는 단순히 다른 파일의 이름이므로 파일 시스템에 걸쳐있을 수 있습니다.


2
i- 노드는 OS의 특정 변형에 의존한다고 확신합니다. 그러나 일반적으로 단일 i- 노드라고 생각합니다. i- 노드에는 파일에 대한 정보와 데이터가 디스크에서 저장되는 위치에 대한 정보가 있습니다. 큰 파일에는 추가 테이블에 대한 간접 포인터가 있습니다.
terson

76
심볼릭 링크가 파일 시스템을 교차 할 수 있고 하드 링크가 할 수없는 유용한 기능을 추가 할 수 있습니다 (동일한 파일 시스템의 파일을 참조해야 함).
paxdiablo

52
에서 좋은 시각적 인 설명이 리눅스 가제트에 기사
로드 리그

1
나는 또한 약간의 독서와 실험 csharpbsharp.tumblr.com
Adnan Bhatti에

1
@zen : 파일 시스템을 사용하지 않을 때는 언제든지 마운트 해제 / 다시 마운트 할 수 있습니다. 루트 파티션의 경우 약간 까다 롭지 만 수행 할 수 있습니다 (권장하지 않음). 루트를 위해이를 수행하려면 일반적으로 먼저 복구 CD를 부팅하여 마운트를 수정하고 다시 부팅하는 것이 가장 좋습니다. 그러나 수퍼 유저에게는 이런 종류의 질문을해야합니다.
Martin York

464

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존재하지 않는 파일에 대한 링크 일뿐입니다.


12
이것은 "파일"과 "하드 링크"가 동일하다는 것을 의미합니까? 파일이나 하드 링크를 삭제할 때 여전히 inode를 가리키는 한 내용이 계속 존재합니까?
Daniel W.

1
@DanFromGermany 맞습니다. 적어도 하나의 하드 링크 (예 : 파일)가 가리키고있는 한 컨텐츠에 도달 할 수 있습니다.
Adam Matan

6
touch blah1; touch blah2단축 할 수있다touch blah1 blah2
드미트리 Zaitsev

11
@DmitriZaitsev True이지만 초보자 IMO에게는 읽기 어렵습니다.
Adam Matan

8
나는 이것이 읽은 많은 답변과 관련하여 가장 이해하기 쉬운 대답이라고 생각합니다. 설명 텍스트보다 샘플이 더 좋습니다.
Scott Chu

435

말씀이 진행됨에 따라 그림은 천 단어의 가치가 있습니다. 그것을 시각화하는 방법은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

우리가 그 그림을 얻는 방법은 다음과 같습니다.

  1. myfile.txt파일 시스템에 새 inode (파일의 메타 데이터를 포함하고 내용이 포함 된 데이터 블록, 즉 "Hello, World!")를 가리키는 이름 을 작성하십시오 .

    $ echo 'Hello, World!' > myfile.txt
    
  2. my-hard-link파일에 대한 하드 링크 를 작성하십시오. myfile.txt이는 "지정한 동일한 inode를 myfile.txt가리키는 파일 작성"을 의미합니다 .

    $ ln myfile.txt my-hard-link
    
  3. my-soft-link파일에 대한 소프트 링크 를 작성하십시오. myfile.txt이는 "파일을 가리키는 파일 작성"을 의미합니다 myfile.txt.

    $ ln -s myfile.txt my-soft-link
    

myfile.txt삭제 (또는 이동) 된 경우 현재 수행되는 작업을 살펴보십시오 . my-hard-link여전히 동일한 내용을 가리 키므로 영향을받지 않지만 my-soft-link이제는 아무 것도 가리 키지 않습니다. 다른 답변은 각각의 장단점에 대해 설명합니다.


3
@ThunderWiring "포인트"란 링크가 참조하는 모든 것을 의미합니다. 하드 링크의 경우 inode를 직접 참조합니다 (즉,에서 참조하는 동일한 inode myfile.txt). 소프트 링크의 경우, 그것의 참조는 아이 노드 (데이터를 포함하는)이 아니라, 그것의 참조에 대한 파일 시스템 경로입니다 myfile.txt(예 /home/Documents/myfile.txt)
akivajgordon

4
나는 당신의 시각적 응답 @akivajgordon을 정말로 좋아합니다-차이점을 더 잘 이해하도록 도와주었습니다!
w

7
만 단어!
SaganRitual

13
어쩌면 느릴 지 모르지만 당신의 사진은 약 2 초 만에 20 년의 미스터리를 정리했습니다.
jdk1.0

3
가장 유용한 답변은이 게시물에 너무 깊이 묻혀 있다는 사실입니다. 나는 당신에게 100 인터넷 포인트를 줄 것이지만 슬프게도 당신에게 하나만 줄 수 있습니다.
Dagrooms

71

하드 링크는 원본 파일이 이동 될 때 유용합니다. 예를 들어, 파일을 / bin에서 / usr / bin으로 또는 / usr / local / bin으로 이동하십시오. / bin에있는 파일에 대한 심볼릭 링크는 이것에 의해 손상 될 수 있지만, 파일의 inode에 직접 링크되는 하드 링크는 상관하지 않습니다.

하드 링크는 디렉토리 항목 만 차지하므로 디스크 공간을 덜 차지할 수 있지만 symlink는 가리키는 이름을 저장하기 위해 자체 inode가 필요합니다.

하드 링크는 해결하는 데 시간이 덜 걸립니다. 심볼릭 링크는 심볼릭 링크 된 디렉토리에있는 다른 심볼릭 링크를 가리킬 수 있습니다. 그리고이 중 일부는 NFS 또는 다른 대기 시간이 긴 파일 시스템에있을 수 있으므로 네트워크 트래픽을 해결할 수 있습니다. 항상 동일한 파일 시스템에있는 하드 링크는 항상 단일 조회로 해결되며 네트워크 대기 시간과 관련이 없습니다 (NFS 파일 시스템의 하드 링크 인 경우 NFS 서버가 해결을 수행하므로 보이지 않습니다). 클라이언트 시스템). 때로는 이것이 중요합니다. 나에게는 그렇지 않지만 이것이 중요한 고성능 시스템을 상상할 수 있습니다.

또한 mmap (2) 및 심지어 open (2)와 같은 것들도 하드 링크와 동일한 기능을 사용하여 파일의 inode를 활성 상태로 유지하여 파일이 연결 해제 (2) 되더라도 프로세스가 계속 액세스 할 수 있도록합니다. 프로세스가 닫히면 파일이 실제로 사라집니다. 이것은 훨씬 더 안전한 임시 파일을 허용합니다 (여기서 오픈 및 링크 해제가 원자 적으로 발생할 수있는 경우 기억하지 못하는 POSIX API가있을 수 있으며 실제로는 안전한 임시 파일이 있습니다). 누구도 액세스 할 수없는 데이터. 글쎄, / proc가 모든 사람에게 파일 디스크립터를 볼 수있는 능력을 부여하기 전에는 사실 이었지만 그것은 또 다른 이야기입니다.

말하자면, 프로세스 A에서 열려 있지만 파일 시스템에서 링크되지 않은 파일을 복구하면 하드 링크를 사용하여 inode 링크를 다시 생성하므로 파일이 열려있는 프로세스가 닫히거나 사라질 때 파일이 사라지지 않습니다.


35

소프트 링크 :

소프트 또는 기호는 원본 파일에 대한 지름길입니다 .... 원본을 삭제하면 바로 가기가 실패하고 지름길 만 삭제하면 원본에 아무런 변화가 없습니다.

소프트 링크 구문 :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를 공유합니다. 소프트 링크는 그렇지 않습니다.
  • 하드 링크는 파일 시스템을 교차 할 수 없습니다. 소프트 링크는 그렇습니다.
  • 하드 링크를 사용하는 동안 기호 링크가 가리키는 위치를 즉시 알 수 있으므로 전체 파일 시스템을 탐색하여 동일한 inode를 공유하는 파일을 찾아야합니다.

    # find / -inum 517333

    /home/bobbin/sync.sh
    /root/synchro
    
  • 하드 링크는 디렉토리를 가리킬 수 없습니다.

하드 링크에는 두 가지 제한이 있습니다.

  • 디렉토리는 하드 링크 될 수 없습니다. 리눅스는 이것이 디렉토리의 비순환 트리 구조를 유지하는 것을 허용하지 않습니다.
  • 파일 시스템간에 하드 링크를 만들 수 없습니다. 파일 시스템마다 다른 독립 inode 테이블이 있기 때문에 두 파일 모두 동일한 파일 시스템에 있어야합니다 (파일 시스템마다 다른 두 개의 파일이 있지만 inode 번호는 동일 함).

3
"하드 링크의 크기는 내용의 크기이고, 소프트 링크는 파일 이름 크기입니다." 명확히하기 위해 다른 하드 링크를 만드는 것은 여유 공간에만 몇 바이트 만 영향을 미칩니다.
Ingo

34

하드 링크와 기호 링크의 차이점을 보는 간단한 방법은 간단한 예입니다. 파일에 대한 하드 링크는 파일이 저장된 위치 또는 해당 파일의 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"에 속하는 모든 내용을 계속 저장합니다.


파일이 매우 추상적 인 객체이며 모든 추상적 인 것들을 가지고 있다는 점을 지적하면 도움이 될 수 있습니다.
Cholthi Paul Ttiopic

28

심볼릭 링크는 경로 이름에 연결됩니다. 이것은 시스템의 파일 트리 어느 곳에 나있을 수 있으며 링크를 만들 때 존재할 필요도 없습니다. 대상 경로는 상대적이거나 절대적 일 수 있습니다.

하드 링크는 inode에 대한 추가 포인터로, 대상과 동일한 볼륨에만 존재할 수 있습니다. 파일에 대한 추가 하드 링크는 파일을 참조하는 데 사용되는 "원본"이름과 구별 할 수 없습니다.


또한 링크하는 파일을 제거하면 심볼릭 링크가 손상되고 하드 링크는 파일 시스템에 파일을 "유지"하므로 하드 링크는 유효합니다.
njsf 2016 년

21

나는 당신에게 Wikipedia를 지적 할 것입니다 :

몇 가지 사항 :

  • 하드 링크와 달리 심볼릭 링크는 파일 시스템을 교차 할 수 있습니다 (대부분).
  • 심볼릭 링크는 디렉토리를 가리킬 수 있습니다.
  • 하드 링크는 파일을 가리키며 둘 이상의 이름을 가진 동일한 파일을 참조 할 수있게합니다.
  • 링크가 하나 이상 있으면 데이터를 계속 사용할 수 있습니다.

1
이론적으로 (그리고 실제로는 일부 경우에도) 하드 링크는 디렉토리를 가리킬 수도 있습니다 (사실 "."는 현재 디렉토리에 대한 하드 링크이고 ".."는 상위 디렉토리에 대한 하드 링크입니다). 그러나 위험 할 수 있으므로 대부분의 UNIX는이를 허용하지 않습니다 (또는 특별한 조치를 취해야합니다). 애플은 예를 들어 자신의 타임 머신의 구현을 위해 그들을 사용 earthlingsoft.net/ssp/blog/2008/03/x5_time_machine
요아킴 사우어

3
기사로 연결되는 링크를 가리키고 있습니다. 그러면 심볼릭 링크가됩니까?
Ian Campbell

@JoachimSauer 새로운 Apple 파일 시스템으로 Time Machine이 디렉토리에 대한 하드 링크를 사용할 필요가 없다고 생각하십니까?
CJM

나는 Wikipedia의 설명이 가장 좋은 답변의 설명보다 훨씬 짧고 구체적이라는 것을 알았습니다.
lakesare

9

하드 링크는 증분 백업을 수행 할 때 매우 유용합니다. 예를 들어 rsnapshot을 참조하십시오 . 아이디어는 하드 링크를 사용하여 복사하는 것입니다.

  • 백업 번호 n을 n + 1로 복사
  • 백업 n-1을 n으로 복사
  • ...
  • 백업 0을 백업 1에 복사
  • 변경된 파일로 백업 0을 업데이트하십시오.

모든 증분 백업은 변경되지 않은 파일에 대해 동일한 inode 세트를 가리 키므로 새 백업은 변경 한 내용을 제외하고 추가 공간을 차지하지 않습니다.


6

하드 링크 대 소프트 링크

하드 링크 대 소프트 링크는이 이미지로 쉽게 설명 할 수 있습니다.


5
소프트 링크 그림이 옳지 않은 것 같습니다. 포인트 : 소프트 링크의 inode가 원본 파일의 inode를 가리 키지 않아야합니다. 원본 파일의 이름을 바꾸면 관련 소프트 링크가 작동하지 않습니다
percy507

@ percy507 네 맞아요-하지만 여전히 아주 훌륭하고 직관적 인 설명을 찾으십시오. 아이 노드 사이에 화살표가 없다고 상상해보십시오.
Michael Litvin

5

Nick의 질문에 덧붙입니다. 하드 링크 는 언제 유용합니까? 기호 링크가 작동하지 않는 유일한 응용 프로그램은 chrooted 환경에서 시스템 파일의 사본을 제공하는 것입니다.


다른 시스템의 다른 위치에 마운트 지점이있는 분산 시스템. 물론 이것은 일관되게 시스템에서 설계 될 수 있습니다.
terson

@Tanktalus가 훌륭한 예를 제공했다고 생각합니다.
Nick Stinemates

4

에서 MSDN ,

심볼릭 링크

심볼릭 링크는 다른 파일 시스템 객체를 가리키는 파일 시스템 객체입니다. 가리키는 객체를 대상이라고합니다.

심볼릭 링크는 사용자에게 투명합니다. 링크는 일반 파일 또는 디렉토리로 표시되며 사용자 나 응용 프로그램에서 정확히 동일한 방식으로 작동 할 수 있습니다.

심볼릭 링크는 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

3

또한:

  1. 하드 링크의 읽기 성능이 기호 링크보다 우수합니다 (마이크로 성능)
  2. 심볼릭 링크를 복사하거나 버전을 제어 할 수 있습니다. 다시 말해서 실제 파일입니다. 다른 한편으로, 하드 링크는 약간 낮은 수준에 있으며 심볼릭 링크와 비교할 때 하드 링크를 일반 파일이 아닌 하드 링크로 사용하는 수단을 제공하는 도구가 적습니다.

3

간단히 말하면, 하드 링크 : 그냥 파일에 새로운 이름을 추가하는 것입니다. 즉, 파일은 동시에 많은 이름을 가질 수 있습니다. 모든 이름은 서로 같고 선호하지 않습니다. 하드 링크는 모든 내용을 복사하는 것을 의미하지 않습니다 파일의 이름을 바꾸고 새 파일을 만드는 것은 아닙니다. 단지 알려진 대체 이름을 만듭니다.

심볼릭 링크 (symlink) : 다른 파일을 가리키는 파일 포인터입니다. 심볼릭 링크가 나중에 삭제 된 기존 파일을 가리키는 경우 이름이 더 이상 파일 이름을 지정하지 않아도 심볼릭 링크는 동일한 파일 이름을 계속 가리 킵니다.


3

일반적인 "파일"로 생각하는 것은 실제로 파일의 데이터와 디렉토리 항목의 두 가지입니다. 파일에 대한 하드 링크를 만들 때 실제로 동일한 데이터를 참조하는 두 번째 디렉토리 항목을 만듭니다. 두 디렉토리 항목 모두 기능이 동일합니다. 각 파일을 읽기 위해 파일을 여는 데 사용할 수 있습니다. 따라서 실제로 "파일과 하드 링크"가 없으며 "두 개의 디렉토리 항목이있는 파일 데이터"가 있습니다. 파일을 삭제하는 것으로 생각하면 실제로 디렉토리 항목이 삭제되고 데이터의 마지막 디렉토리 항목이 삭제되면 데이터 자체도 삭제됩니다. 디렉토리 항목이 하나만있는 일반 파일의 경우 디렉토리 항목을 삭제하면 항상 데이터가 삭제됩니다. (파일이 열려있는 동안 OS는 파일에 대한 임시 링크를 만듭니다.

예를 들어, 파일 A.txt, 하드 링크 B.txt를 작성하고 A.txt를 삭제하십시오. A.txt를 작성할 때 일부 데이터가 작성되었으며 디렉토리 항목 A.txt가 있습니다. 하드 링크를 작성할 때 정확히 동일한 데이터를 가리키는 다른 디렉토리 항목 B.txt가 작성되었습니다. A.txt를 삭제해도 처음에 B.txt 파일을 만든 것처럼 모든 데이터와 단일 디렉토리 항목 B.txt가 그대로 유지됩니다.

소프트 링크는 데이터를 포함하지 않고 다른 디렉토리 항목의 경로를 제외하고 거의 (거의) 일반 파일입니다. 소프트 링크가 참조하는 파일을 삭제하면 소프트 링크는 더 이상 디렉토리 항목을 가리 키지 않는 경로를 포함합니다. 고장났어. 소프트 링크를 삭제하면 다른 파일을 삭제하는 것처럼 해당 파일이 영향을받지 않습니다.


2

디렉토리 엔트리는 구조체 링크입니다 :

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 */

2

위의 모든 답변에 추가하여 하드 링크 및 소프트 링크 파일을 찾는 차이점은 다음과 같이 이해할 수 있습니다.

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. 불필요한 검색을 다른 마운트 지점에 저장합니다.

따라서 하드 링크를 검색하는 것이 소프트 링크를 검색하는 것보다 다소 빠릅니다 (잘못되었거나 명확하지 않은 경우 수정하십시오).


1

심볼릭 링크는 하드 링크와 비슷한 방식으로 파일에 다른 이름을 지정합니다. 그러나 심볼릭 링크가 남아 있어도 파일을 삭제할 수 있습니다.


심볼릭 링크는 "동일한 파일의 다른 이름"이 아니며 대상 파일에 연결되는 자체 파일입니다.
Kusalananda

1

사용량에 대한 나의 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


0

방금 일반적인 시나리오 인 소프트웨어 설치에서 하드 링크를 이해하는 쉬운 방법을 찾았습니다.

어느 날 Downloads설치 를 위해 폴더 에 소프트웨어를 다운로드했습니다 . 내가 한 후에 sudo make install일부 실행 파일이 cp로컬 bin 폴더에 ed되었습니다. 여기에 하드 링크를cp 만듭니다 . 나는 소프트웨어에 만족했지만 곧 장기적으로 좋은 곳이 아니라는 것을 깨달았습니다 . 그래서 나는 소프트웨어 폴더를 디렉토리에 넣었다. 글쎄, Windows와 같은 대상 링크에 대해 걱정하지 않고 이전과 같이 소프트웨어를 계속 실행할 수 있습니다. 이것은 하드 링크 가 직접 inode와 다른 파일을 찾는 것을 의미 합니다.Downloadsmvsource


0

이 대답에서 파일을 말할 때 메모리의 위치를 ​​의미합니다.

저장된 모든 데이터는 inodes라는 데이터 구조를 사용하여 메모리에 저장됩니다. 모든 inode에는 inode 번호가 있습니다. inode 번호는 inode에 액세스하는 데 사용됩니다. 파일에 대한 모든 하드 링크는 이름이 다를 수 있지만 동일한 inode 번호를 공유 할 수 있습니다. 모든 하드 링크는 동일한 inode 번호 (동일한 inode에 액세스)를 갖기 때문에 모두 동일한 물리적 메모리를 가리 킵니다.

심볼릭 링크는 특별한 종류의 파일입니다. 파일이기 때문에 파일 이름과 아이 노드 번호를 갖습니다. 위에서 언급 한 바와 같이 아이 노드 번호는 데이터를 가리키는 아이 노드를 얻습니다. 이제 심볼릭 링크를 특별하게 만드는 것은 심볼릭 링크의 inode 번호는 다른 파일의 "경로"를 가리키는 inode에 액세스합니다. 특히 심볼릭 링크의 inode 번호는 다른 하드 링크를 가리키는 해당 inode에 액세스합니다.

GUI에서 파일을 이동, 복사, 삭제하면 실제 메모리가 아닌 파일의 하드 링크로 재생됩니다. 파일을 삭제하면 파일의 하드 링크가 삭제됩니다. 파일에 대한 모든 하드 링크가 삭제 된 경우 메모리에 여전히 존재하더라도 저장된 데이터에 액세스 할 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.