Linux에서 심볼릭 링크를 사용하는 방법은 무엇입니까?

Linux에서 심볼릭 링크를 사용하는 방법은 무엇입니까?

내 말은, 일부 프로세스가 심볼릭 링크를 읽으려고 하면 어떻게 됩니까? 읽거나 쓰는 동안 심볼릭 링크가 변경되면 어떻게 되나요?

예: 2개의 거대하고 유사한 100G 파일이 있으며 심볼릭 /mnt/1링크 를 통해 사용할 수 있습니다 . 일부 프로그램은 읽기를 시작합니다 . 잠시 후 링크가 에서 로 변경되지만 파일 은 여전히 ​​읽혀지고 있습니다./mnt/2/mnt/1/home/user/fileA/home/user/file/mnt/1/mnt/2A

프로그램이 절대 경로를 캐시합니까?

심볼릭 링크가 변경되었기 때문에 오류가 발생하여 실패합니까, 아니면 아무 일도 일어나지 않은 것처럼 작동합니까?

/home/user/file블록 장치(예: 복제된 iSCSI 디스크 2개)에 연결되면 달라 지나요?

답변1

심볼릭 링크는 실제 파일의 이름(인덱스 노드) 파일 시스템에서. 시스템은 실제 파일을 찾기 위해 심볼릭 링크를 해석하고 파일을 열 때 파일의 inode를 찾아 사용합니다. 이 시점에서 파일을 가져오는 데 사용하는 경로는 중요하지 않습니다. 운영 체제는 콘텐츠를 캐시하지 않고 해당 inode를 통해 파일에서 읽습니다. 내가 이해하는 바에 따르면, 하드 링크를 통해 파일 읽기를 시작하고 해당 하드 링크를 제거할 수 있습니다 (파일이 여전히 다른 곳에서 링크되어 있는 한) . 그리고 파일이 구문 분석된 한(이름 문자열 -> inode) .

답변2

상징적인링크는 다음을 포함하는 작은 파일입니다.장소(즉, 대상 파일의 경로 및 파일 이름) 디렉토리 항목에 심볼릭 링크임을 나타내는 플래그가 있습니다.

심볼릭 링크를 열면 운영 체제는 해당 위치에서 대상 파일을 찾습니다. 대상 자체가 심볼릭 링크인 경우 해당 위치가 파일을 가리킬 때까지 해당 위치(1)(2)도 따릅니다.아니요심볼릭 링크(라고 부르자최종 문서). 그런 다음 운영 체제는 다음을 얻습니다.인덱스 노드~의최종 문서(인덱스 노드에는 수정 시간과 같은 메타데이터가 포함되어 있으며 파일 데이터에 대한 포인터도 포함되어 있습니다.) 마지막 인덱스 노드최종 문서열릴. 이제부터 프로세스는 해당 inode를 사용하여 파일을 읽고 씁니다. 따라서 심볼릭 링크 이름이나 경로를 변경하고, 심볼릭 링크를 삭제하고, 경로나 이름을 변경하세요.최종 문서심지어 삭제최종 문서(3) 프로세스에 영향을 미치지 않습니다. 여전히 동일한 inode에서 읽습니다.

대부분의 경우 기호 링크에 대한 파일 데이터 조작은 다음과 같은 영향을 미칩니다.최종 문서(예를 들어, 심볼릭 링크를 읽고 쓰는 것은 읽기/쓰기입니다.최종 문서) 그러나 예외도 있습니다. readlink()시스템 호출은 심볼릭 링크 자체의 내용을 읽습니다.

반면에 이름 바꾸기나 삭제와 같은 파일 메타데이터 작업은 기호 링크에 영향을 미치는 경우가 많습니다. 그러나 여기에는 예외가 있습니다. lstat()시스템 호출은 stat()기호 링크가 아닌 기호 링크 자체에 대한 정보를 반환한다는 점을 제외하면 유사합니다.최종 문서(2).


(1) 레벨 수에 제한이 있으며 심볼릭 링크의 위치가 상대 경로인 경우 상황이 더 복잡해집니다.

(2) 독서Symlink(7): 심볼릭 링크 처리자세한 내용은.man 7 symlink

(3) rm명령이나 unlink()시스템 호출은 파일을 물리적으로 삭제하지 않습니다. 파일 inode를 가리키는 디렉토리 항목을 삭제합니다. 파일 자체는 다음과 같은 경우에만 삭제됩니다.둘 다a) 해당 inode를 참조하는 디렉토리 항목(하드 링크)이 더 이상 없으며 b) 파일을 연 프로세스가 없습니다.

답변3

이는 대부분 Linux에 투명하며 운영 체제보다 사용 중인 파일 시스템과 더 관련이 있습니다.

VFAT 파티션에서는 작동하는 심볼릭 링크를 생성할 수 없기 때문에 일반 파일도 아니고 아주 작은 파일도 아닙니다. 예를 들어 파일 시스템에 의해 직접 기록되므로 심볼릭 링크 자체를 복사하면 됩니다.

심볼릭 링크와 하드 링크의 차이점은 하드 링크와 같은 데이터 섹터를 가리키는 것이 아니라 하드 링크를 지정한다는 것입니다.

예:

테스트 1:

echo 'data' >file.txt

이렇게 하면 섹터 10~20*을 가리키는 하드 링크 file.txt가 생성됩니다(*번호는 설명용일 뿐입니다).

테스트 2:

이제 만약에?

ln file.txt file_2.txt

그러면 섹터 10~20(file.txt와 동일)을 가리키는 하드 링크 file_2.txt가 생성되므로 file.txt를 삭제하면 섹터 10~20이 남고 file_2.txt에서 데이터를 볼 수 있습니다. (file.txt와 file_2.txt 모두 원본과 같습니다)

테스트 3:

ln -s file.txt file_sym.txt 

file_sym.txt 심볼릭 링크를 하드 링크 file.txt로 지정하므로 file_sym.txt에 액세스하려고 하면 file.txt가 표시되지만 file.txt를 삭제하면 file_sym은 더 이상 대상을 찾을 수 없습니다.

이는 Linux의 ext4 모듈(또는 커널에서 컴파일된 경우)과 같은 파일 시스템에 의해 관리되며 Linux를 사용하는지 다른 Unix를 사용하는지 여부는 중요하지 않습니다.

관련 정보