ext4
자동으로 생성된 수천 개의 필수 파일이 포함된 포맷된 디스크가 있습니다 . 그 중 수천 개는 길이가 1바이트에 불과하고 일부는 길이가 2바이트입니다. 두 작은 파일 세트의 모든 파일은 동일합니다.
이러한 1바이트 길이의 파일(예: 1000개)을 찾아서 각 파일을 삭제하고 단일 대표 파일에 하드 링크하면 얼마나 많은 공간을 절약할 수 있습니까?
이와 같이:
# ls -l
-rw-r----- 1 john john 1 Feb 25 10:29 a
-rw-r----- 1 john john 1 Feb 25 10:29 b
-rw-r----- 1 john john 1 Feb 25 10:29 c
# du -kcs ?
4 a
4 b
4 c
12 total
통합해 보세요:
# rm b c
# ln a b
# ln a c
ll
total 12
-rw-r----- 3 john john 1 Feb 25 10:29 a
-rw-r----- 3 john john 1 Feb 25 10:29 b
-rw-r----- 3 john john 1 Feb 25 10:29 c
# du -kcs ?
4 a
4 total
( du
목록에 나와 있지도 않아서 b
궁금 c
합니다.)
질문: 할당 블록 크기가 4KiB이면 정말 그렇게 쉽나요? 1000개 파일 시나리오에서 999*4KiB가 저장됩니까?
또는 ext4
투명하게 "꼬리를 병합"하거나 "디렉토리 inode"에 작은 파일을 저장할 수 있는 기능이 있습니까(일부 파일 시스템이 이를 수행할 수 있다는 것을 막연하게 기억합니다)?
(파일 할당 블록이 다양할 수 있다는 것을 알고 있으며 유사한 명령을 통해 tune2fs -l /dev/sda1
알 수 있습니다.)
답변1
저장소 파일은 파일 내용을 저장하는 데 사용되는 블록, 파일 메타데이터를 저장하는 데 사용되는 inode, inode를 가리키는 디렉터리 항목(또는 항목)의 세 부분으로 나뉩니다.
여러 개의 별도 파일을 생성하는 경우 가장 일반적인 경우 파일 수에 따라 이 요금을 여러 번 지불하게 됩니다.
인라인 데이터 사용(파일 시스템이 적절한 옵션으로 생성된 경우) 파일이 충분히 작으면 파일 내용을 저장하는 데 사용되는 블록을 저장할 수 있지만 여전히 파일당 하나의 inode와 파일당 하나 이상의 디렉터리 항목이 필요합니다.
하드 링크를 사용하면 파일 내용을 저장하는 데 사용되는 블록을 저장합니다.그리고inode: 단 하나의 inode, 하나의 파일 데이터 인스턴스(inode의 인라인이든 별도이든) 및 링크만큼 많은 디렉토리 항목이 있습니다.
어쨌든 디렉토리 항목을 저장해야 한다는 점을 고려하면 하드 링크는 사실상 무료입니다. 다른 것에는 더 많은 저장 공간이 필요합니다. 정확히 얼마나 많은지는 파일 시스템의 특정 설정에 따라 다릅니다.