원본 파일을 삭제해도 하드 링크가 손상되지 않는 이유는 무엇입니까? [복사]

원본 파일을 삭제해도 하드 링크가 손상되지 않는 이유는 무엇입니까? [복사]

원본 파일을 삭제해도 하드 링크가 손상되지 않는 이유는 무엇입니까? 원본 파일을 삭제하면 소프트 링크는 깨지지만 하드 링크는 깨지지 않는데 왜 깨지지 않는 걸까요?

답변1

뭘 잘못 이해한 것 같군요하드 링크그리고문서유닉스에 있습니다.

유닉스 파일 시스템의 기본은문서. ㅏ문서비구조적이다익명의바이트 스트림. 하나의 문서이름 없음. 그거 하나만 갖고 있어파일 일련번호, 기본적으로 해당 파일 시스템의 고유 식별자입니다. (파일 일련 번호는 때때로인덱스 노드)

여러 가지 유형이 있습니다.특수 파일표준화 정도는POSIX:

운영 체제는 고유한 유형의 특수 파일을 추가할 수 있습니다. 예를 들면 다음과 같습니다.솔라리스가지다.

/dev/sda장치 파일은 첫 번째 하드 디스크와 상호 작용하기 위한 기존 인터페이스와 같이 장치와 상호 작용하기 위한 인터페이스를 제공하는 데 사용됩니다 . FIFO 특수 파일은 셸 파이프처럼 작동하지만 이름이 있기 때문에 파일을 읽고 쓰는 두 프로세스가 서로 다른 시간과 서로 다른 보안 컨텍스트에서 시작될 수 있습니다. 소켓은 네트워크 소켓과 유사한 프로세스 간 통신을 허용하지만 로컬 컴퓨터에서만 가능합니다.

이제 문제와 관련된 두 가지 특별한 유형의 파일인 디렉토리와 기호 링크에 대해 논의해 보겠습니다.

디렉토리 특수 파일은 실제로 실제 디렉토리와 매우 유사합니다. 예를 들어 전화번호부를 생각해 보세요. 사람 이름과 전화번호가 나열되어 있습니다. 이것이 바로 Unix 파일 시스템에서 디렉토리가 수행하는 작업입니다. 디렉토리에는 파일 이름과 파일 일련 번호가 나열됩니다.

이것이름과 파일 일련번호 페어링그게 우리가 부르는 거야하드 링크(아니면 그냥협회).

Unix에서 "파일 삭제"를 사용하는 경우rm유틸리티, 누구세요아니요실제로 "파일 삭제". 당신은 삭제 중입니다해당 이름에 대한 디렉토리 항목, 즉, 당신은하드 링크 제거, 파일이 아닌. 이것은 ... 불리운다풀리다실제로 사용되는 POSIX 라이브러리 함수는 rm다음과 같습니다.unlink.

따라서 다음과 같은 작업을 수행할 때

touch foo

당신은아니요foo이름은 없지만 특정 파일 일련 번호가 있는 파일을 생성했습니다 .그리고foo방금 생성한 파일의 파일 시퀀스 번호에 이름을 연결하는 디렉터리 항목을 현재 디렉터리에 추가했습니다 .

이제 사용하실 때ln유틸리티만들다두번째하드 링크:

ln foo bar

당신은두번째bar이름을 연결된 동일한 파일 시퀀스 번호 에 연결하는 현재 디렉터리의 디렉터리 항목입니다 .foo

두 링크 모두 특별하지 않다는 점을 인식하는 것이 중요합니다. 그들은 정확히 동일합니다.

지금 연결을 해제하는 경우 foo:

rm foo

foo사용자가 해야 할 일은 이름을 파일의 일련 번호에 연결하는 디렉토리 항목을 삭제하는 것뿐입니다. 훌륭해아니요파일을 삭제합니다. 따라서 bar디렉토리 항목은 전혀 건드리지 않기 때문에 해당 이름을 사용하여 파일에 계속 액세스할 수 있습니다 .

사실 당신은할 수 없다Unix에서 파일을 삭제합니다. 링크만 삭제할 수 있습니다. 파일 시스템 자체는 파일을 가리키는 링크가 더 이상 없고 더 이상 열려 있지 않으면 파일을 삭제합니다.

심볼릭 링크그러나 이것은 다음을 포함하는 특수 파일입니다.. 즉, 당신이 할 때

ln -s /path/to/quux baz

누구세요문자 그대로/path/to/quux파일 에 문자열을 씁니다 . 보다 정확하게는 다음을 포함하는 심볼릭 링크 특수 파일을 생성합니다./path/to/quux 그리고baz방금 생성한 파일의 파일 시퀀스 번호에 이름을 연결하는 디렉터리 항목을 현재 디렉터리에 생성하고 있습니다 .

/path/to/quux파일 일련 번호로 확인되는지 여부는 실제로 중요하지 않습니다. 실제로 일부 프로그램에서는 이를 사용하여 영리한 구성을 수행합니다. 예를 들어,포드그리고개틀링웹 서버는 기호 링크를 사용하여 HTTP 리디렉션을 나타내므로 다음을 수행합니다.

ln -s https://www.google.com/ /var/www/search.html

로 이동하면 http://mydomain/search.html으로 리디렉션됩니다 https://www.google.com/.

간단히 말해서:

원본 파일을 삭제해도 하드 링크가 손상되지 않는 이유는 무엇입니까?

원본 파일을 삭제하지 않았기 때문입니다. 여러 링크 중 하나만 삭제했습니다. 더 이상 해당 특정 이름을 사용하여 파일에 액세스할 수 없지만 파일은 여전히 ​​존재하며 다른 이름을 사용하여 계속 액세스할 수 있습니다.

원본 파일을 삭제하면 sorflink가 손상됩니다

다시 말하지만 원본 파일은 삭제되지 않습니다. 당신은 삭제 중입니다이름. 그러나 심볼릭 링크는 다음을 가리킨다.이름파일보다는요. 따라서 이제 심볼릭 링크는 더 이상 파일로 확인할 수 없는 이름을 가리킵니다.


참고 사항: 흥미로운 점을 발견했을 수 있습니다. 디렉터리는 파일에 대한 이름 매핑을 제공합니다. 그러나 디렉토리 자체도 파일입니다. 따라서 디렉터리는 자동으로 이름-디렉터리 매핑을 제공합니다.

즉, 디렉터리는 Unix에서 임의로 중첩될 수 있습니다!

널리 사용되는 모든 파일 시스템은 임의 깊이의 중첩 계층을 허용하므로 오늘날에는 그다지 흥미롭지 않게 들릴 수 있습니다. 그러나 거의 60년 전 유닉스가 탄생했을 당시에는 전혀 그렇지 않았습니다. 당시 일부 파일 시스템에는 디렉터리가 전혀 없거나 고정된 중첩 수준(예: 2개 수준)이 있었습니다.

디렉토리를 특수 파일로 만들면 특별한 구조를 추가하지 않고도 계층화된 파일 시스템을 무료로 얻을 수 있습니다. 이것은 매우 우아한 디자인입니다.

답변2

이는 하드 링크가 본질적으로 동일한 파일에 대한 참조이고 하드 링크에 관한 한 "원본" 파일이 없기 때문입니다. 이는 디스크(파일의 모든 메타데이터가 포함된 inode)의 동일한 데이터 구조를 가리킵니다.

소프트 링크는 파일을 설명하는 데이터 구조가 아닌 파일 이름을 가리킵니다.

답변3

Linux에서 파일은 파일 시스템 내에서 inode숫자로 고유하게 식별됩니다. 이는 파일 시스템 전체에서 고유함이 보장되는 숫자 ID일 뿐입니다(참고: inodes재활용은 가능하지만 inode두 개의 "활성" 파일은 동일한 파일 시스템에서 동일한 파일을 가질 수 없습니다).

inode파일 이름은 특정 디렉토리에 추가되는 "편의 태그" 에 지나지 않습니다 . 하드 링크 파일은 간단히 추가됩니다.다른동일하거나 다른 디렉토리에 편리한 이름을 사용하십시오(첫 번째 경우에는 새 하드 링크의 이름이 달라야 합니다).

inode로 번호를 확인할 수 있습니다 ls -i. 예를 들어:

# ls -alni
total 4
 68329917 drwxr-xr-x.  2 1000 1000   37 Feb  3 15:25 .
101396179 drwx------. 25 1000 1000 4096 Feb  3 15:24 ..
 68329918 -rw-r--r--.  2 1000 1000    0 Feb  3 15:25 test.txt
 68329918 -rw-r--r--.  2 1000 1000    0 Feb  3 15:25 zzz.txt

실제로는 동일한 숫자를 가지고 있습니다 zzz.txt.test.txtinode동일한파일 - 서로 다른 두 이름으로 참조됩니다. 단순히 두 이름 중 하나를 삭제해도 inode파일 시스템에서 실제로 제거(링크 해제)되지는 않지만 다른 이름은 영향을 받지 않습니다.

소프트 링크완전히 다른 것입니다. 원본 파일에 대한 실제 링크가 아니라 inode원본 파일을 가리키는 특수한 작은 파일입니다(자체 차이점 있음).inode경로/이름. 원본 파일을 삭제하면 손상된("손상된") 포인터가 남습니다.

관련 정보