추가 정보
우선, 답변해 주신 모든 분들께 감사드립니다.
그래서 디렉터리/폴더 항목이 4KB를 차지하여 숫자가 왜곡되었다는 아래 답변을 테스트하기 위해 테스트를 다시 실행했습니다. 그래서 이번에는 한 디렉터리에 20,000개의 파일을 넣고 다른 디렉터리에는 cp'd를 사용했습니다. 결과는 매우 다릅니다. 파일 이름의 길이를 제거하면 각 하드 링크의 길이는 약 13바이트로 600바이트보다 훨씬 좋습니다. 좋아요, 완전성을 위해 아래에 제공된 답변을 고려하십시오. 이는 항목당 4KB를 차지하는 디렉터리/폴더 때문입니다. 다시 테스트했지만 이번에는 수천 개의 디렉터리를 만들고 각 디렉터리에 파일을 배치했습니다. 수학을 수행한 후의 계산(하드 드라이브에서 차지하는 공간 증가/파일 수(디렉터리 무시))은 파일당 거의 정확히 4KB입니다. 이는 하드 링크가 몇 바이트만 차지하지만 실제 디렉터리/폴더 항목이 차지하는 것을 보여줍니다. 4KB.
그래서 rsync/하드 링크/스냅샷 백업 전략을 구현할 생각이고 하드 링크가 차지하는 데이터의 양을 알고 싶습니다. 예를 들어 디렉터리 항목 등으로 추가로 연결된 항목이 있어야 합니다. 어쨌든 이에 대한 정보를 찾을 수 없는 것 같습니다. 파일 시스템에 따라 달라지는 것 같습니다. 내가 찾을 수 있는 유일한 정보는 그들이 공간을 차지하지 않는다는 것(아마도 파일 내용을 위한 공간을 차지하지 않는다는 의미)과 그들이 차지하는 공간은 하드 링크를 저장하는 데 몇 바이트만 차지하기 때문에 무시할 수 있다는 것입니다.
그래서 저는 두 개의 시스템(가상 머신 하나, 실제 하드웨어 하나)을 선택하고 루트 디렉터리에서 루트로 다음을 수행했습니다.
mkdir link
cp -al usr link
이 usr
디렉터리에는 약 54,000개의 파일이 포함되어 있습니다. 하드디스크 공간 사용량이 약 34MB 증가합니다. 그러면 각 하드 링크는 약 600바이트를 차지합니다. 아니면 제가 뭔가 잘못하고 있는 걸까요?
두 시스템 모두에서 LVM을 사용하고 있으며 형식은 ext4입니다.
파일 이름 크기는 총 1.5MB 정도입니다(ls -R을 수행하고 파일로 리디렉션하여 얻었습니다).
솔직히 하드 링크를 사용한 rsync는 매우 잘 작동하므로 몇 대의 작업자 서버에서 일일 백업에 사용할 계획입니다. 또한 상당히 오랜 기간 동안 이와 같은 증분 백업/스냅샷을 수행하는 것이 쉬울 것이라고 생각합니다. 그러나 10일 후에는 30MB가 300MB가 되는 식입니다. 또한 실제 파일 데이터/콘텐츠가 몇 백 KB 정도만 변경된다면 하루에 30MB 이상의 하드 링크를 저장하는 것이 과도해 보일 수 있지만 최신 디스크 크기에 대한 귀하의 주장에는 동의합니다. 이 하드 링크 크기가 어디서도 언급되지 않았기 때문에 제가 뭔가 잘못하고 있는 게 아닐까 생각했습니다. Linux 운영 체제에서 600바이트는 일반적인 하드 링크입니까?
사용된 공간을 계산하기 위해 df
before와 after를 수행했습니다 cp -al
.
답변1
cp -al usr link
다수의 하드 링크가 생성되지만 일부 디렉토리도 생성됩니다. 디렉토리는 하드 링크될 수 없으므로 복사됩니다.
각 하드 링크는 디렉토리 항목의 공간을 차지하며 디렉토리 항목은 최소한 파일 이름과 inode 번호를 저장해야 합니다. 각 디렉토리는 디렉토리 항목 하나의 공간과 해당 메타데이터에 대한 inode를 차지합니다. 대부분의 파일 시스템(ext2 제품군 포함)은 inode 공간을 별도로 계산합니다. 모든 하드 링크는 복사 작업으로 생성된 디렉터리에 있습니다. 따라서 표시되는 공간은 실제로 아래 디렉토리의 크기입니다 /usr
.
대부분의 파일 시스템에서 각 디렉터리는 최소한 하나의 블록을 차지합니다. 4kB는 Linux의 일반적인 블록 크기입니다. 따라서 복제본이 kB 단위로 4×(디렉터리 수)를 차지할 것으로 예상할 수 있으며, 여러 블록이 필요한 더 큰 디렉터리에 대한 일부 변경도 가능합니다. 4kB 블록을 가정하면 복사본은 약 8500개의 블록을 생성하는데, 이는 /usr
54000개의 파일이 포함된 디렉터리에 적합한 것처럼 들립니다.
디렉터리에는 상위 디렉터리가 하나만 있어야 합니다. 실제로 하드 링크가 있습니다(또는 최신 파일 시스템이 배후에서 하드 링크를 사용하지 않는 경향이 있지만 적어도 그렇게 나타납니다 .
) ..
. 그러나 다른 하드 링크를 만들 수는 없습니다. 일부 Unix 변형에서는 루트가 일부 파일 시스템의 디렉터리에 대한 하드 링크를 만들 수 있도록 허용하지만 삭제할 수 없는 루프를 생성하거나 액세스할 수 없는 디렉터리 트리를 숨길 위험이 있습니다.