물론 심볼릭 링크는 공간을 차지하지만 이름과 대상 및 기타 메타데이터를 저장하는 데 필요한 몇 바이트만 필요합니다.
심볼릭 링크가 실제로 디스크 사용량에 영향을 미치나요?
제 질문은, 심볼릭 링크에 걸리는 바이트 수를 결정할 수 있느냐는 것입니다.
$ touch alfa.txt
$ ln -s alfa.txt bravo.txt
du와 ls는 모두 "alfa.txt"인 8을 보고합니다.
$ du -b bravo.txt
8 bravo.txt
$ ls -l bravo.txt
lrwxrwxrwx 1 Steven None 8 Mar 8 18:17 bravo.txt -> alfa.txt
"몇 바이트의 추가 메타데이터"를 포함하여 심볼릭 링크의 실제 크기를 인쇄하는 명령이 있습니까?
답변1
그런 종류이지만 파일 크기는 해당 정밀도 수준에서 잘 정의되지 않습니다.
심볼릭 링크는 네 부분으로 구성됩니다.
- 항목인 디렉토리에 저장된 링크의 이름입니다.
- 나머지 메타데이터를 찾는 데 사용되는 각 디렉터리 항목에 대한 추가 메타데이터가 있습니다. 이는 일반적으로 인덱스 노드의 위치입니다. 또한 각 디렉토리 항목에는 파일 이름을 채우고 균형 잡힌 트리 또는 해시와 같은 데이터 구조를 유지하는 데 몇 바이트가 소요됩니다.
- 타임스탬프와 같은 심볼릭 링크 자체에 대한 추가 메타데이터입니다. 이 메타데이터는 빈 일반 파일과 같은 다른 파일 형식에도 존재합니다.
- 링크의 대상입니다.
파일 시스템에서 심볼릭 링크가 여러 개의 하드 링크를 가질 수 있도록 허용하는 경우 처음 두 부분은 디렉터리 항목별로 표시되고 마지막 두 부분은 심볼릭 링크당 한 번만 표시됩니다.
ext2/ext3/ext4에서, 심볼릭 링크의 대상 길이가 최대 60바이트이면 inode에 저장됩니다. 질문하여 이를 확인할 수 있습니다 du
. 대상이 60바이트 이하인 심볼릭 링크의 경우 0을 보고하고 더 큰 대상의 경우 1블록을 보고합니다.
일반 파일과 마찬가지로 보고된 숫자에는 du
디렉토리 항목 및 inode 저장이 포함되지 않습니다. 심볼릭 링크가 차지하는 공간이 얼마나 되는지 정확히 알고 싶다면 해당 공간도 계산해야 합니다. 대부분의 기존 파일 시스템은 파일 시스템 생성 시 inode를 할당하므로 비용이 분할됩니다. 즉, 디렉터리 항목의 크기는 데이터 블록 수를 기준으로 계산되고 inode는 inode 풀의 크기를 기준으로 계산됩니다.
디렉토리 항목 자체의 크기와 관련하여 항목이 차지하는 정확한 바이트 수는 디렉토리에 있는 다른 항목에 따라 달라질 수 있습니다. 그러나 디렉토리는 일반적으로 전체 블록을 차지하므로 항목을 더 많이 생성하면 항목이 더 이상 한 블록에 맞지 않고 두 번째 블록이 할당될 때까지 디렉토리 크기는 동일하게 유지됩니다. 디렉토리 항목이 블록에 어떻게 저장되는지 정확히 이해하려면 파일 시스템 디버거와 파일 시스템 형식에 대한 기본적인 이해가 필요합니다. 또는 파일 시스템 형식에 대한 좋은 이해와 디렉토리에 존재하는 다른 항목에 대한 지식이 필요합니다. 항목이 생성되는 순서와 다른 항목이 삭제되는 순서가 있습니다.
요약하면 "몇 바이트의 추가 메타데이터"는 다음과 같습니다.
- 가변 크기 디렉토리 항목. 심볼릭 링크를 생성해도 효과가 없거나 블록이 추가될 수 있습니다.
- 인덱스 노드.
그렇지 않으면 대상이 0에서 1 블록 사이를 차지할 수 있습니다.
답변2
이 ls
명령은 사용하는 inode 수를 계산하지 않고 기호 링크의 실제 크기를 표시합니다. 8이 "alfa.txt"라고 말하는 것은 절대적으로 정확합니다. 이것은 생성한 심볼릭 링크의 "실제 크기"입니다. 다시 말하지만, 다른 모든 파일의 크기에 포함되지 않는 것처럼 크기에는 사용하는 inode가 포함되지 않습니다. 긴 경로에 대한 심볼릭 링크를 만드는 경우 크기는 경로 길이를 반영합니다.