누군가 다음의 차이점을 말해 줄 수 있습니까?
du -s dir
3705012 dir
du -s --apparent-size dir
3614558 dir
이러한 디렉터리는 블록 장치(cryptsetup을 사용하여 생성됨) 내에 위치합니다. 또는 더 나은 방법: 암호화된 블록 장치 내부의 파일에 대해서만 --apparent-size를 추가해야 하는 이유는 무엇입니까?
답변1
파일의 "겉보기 크기"는 파일에 실제로 얼마나 유효한 데이터가 있는지를 나타냅니다. 파일에서 읽을 수 있는 실제 데이터 양입니다. 블록 지향 장치는 바이트가 아닌 블록만 저장할 수 있습니다. 따라서 디스크 사용량은 항상 다음으로 높은 블록으로 반올림됩니다. 이 경우 "블록"은 파일 시스템이 공간을 할당하는 방식에 따라 저장 장치의 물리적 블록과 같지 않을 수도 있습니다.
암호화된 장치의 경우 파일 시스템은 암호화/암호 해독 정보를 지원하기 위한 오버헤드를 포함하는 데 사용되는 공간만큼 확장될 수 있습니다. 또한 파일 끝과 파일이 포함된 블록 끝 사이의 사용되지 않는 공간을 암호화하거나 무작위화하여 파일이 더 크게 보일 수도 있습니다 du
.
이 중 어느 것도 암호화된 파일 시스템에서 지원하지 않을 수 있는 스파스 파일 처리를 고려하지 않습니다.
답변2
최소 블록 세분성 예시
그것을 가지고 놀면서 무슨 일이 일어나는지 봅시다.
mount
내가 마운트된 ext4 파티션에 있다고 알려줍니다 /
.
블록 크기를 찾았습니다.그리고:
stat -fc %s .
이것은 만든다:
4096
이제 다음과 같은 크기의 파일을 만들어 보겠습니다 1 4095 4096 4097
.
#!/usr/bin/env bash
for size in 1 4095 4096 4097; do
dd if=/dev/zero of=f bs=1 count="${size}" status=none
echo "size ${size}"
echo "real $(du --block-size=1 f)"
echo "apparent $(du --block-size=1 --apparent-size f)"
echo
done
결과 :
size 1
real 4096 f
apparent 1 f
size 4095
real 4096 f
apparent 4095 f
size 4096
real 4096 f
apparent 4096 f
size 4097
real 8192 f
apparent 4097 f
따라서 우리는 그 이하이거나 같은 것이 4096
실제로 바이트를 차지한다는 것을 알 수 있습니다.4096
그리고 일단 넘어가면 까지 올라 4097
갑니다 .8192
2 * 4096
분명히 디스크는 항상 바이트 블록 경계에 데이터를 저장합니다 4096
.
스파스 파일은 어떻게 되나요?
정확한 표현이 무엇인지는 조사하지 않았지만 분명히 고려하고 있습니다 --apparent
.
이로 인해 겉보기 크기가 실제 디스크 사용량보다 커질 수 있습니다.
예를 들어:
dd seek=1G if=/dev/zero of=f bs=1 count=1 status=none
du --block-size=1 f
du --block-size=1 --apparent f
다음을 제공합니다:
8192 f
1073741825 f
관련된:https://stackoverflow.com/questions/38718864/how-to-test-if-sparse-file-is-supported
여러 개의 작은 파일을 저장하고 싶다면 어떻게 해야 하나요?
몇 가지 가능성은 다음과 같습니다:
- 파일 시스템 대신 데이터베이스를 사용하십시오.https://stackoverflow.com/questions/38120895/database-vs-file-system-storage
- 지원되는 파일 시스템 사용블록 재할당
서지:
- https://serverfault.com/questions/565966/which-block-sizes-for-millions-of-small-files
- https://askubuntu.com/questions/641900/how-file-system-block-size-works
우분투 16.04에서 테스트되었습니다.