
파일 크기를 합산하면 하나의 수치가 나옵니다. 을 실행하면 du
다른 수치를 얻게 됩니다. 내 파티션의 모든 파일을 실행하면 사용된 클레임 du
과 일치하지 않습니다 df
. 내 파일의 전체 크기에 대한 수치가 왜 이렇게 다양합니까? 컴퓨터는 추가할 수 없나요?
추가에 대해 말하자면, 의 "사용됨" 및 "사용 가능" 열을 추가하면 df
전체 수치를 얻을 수 없습니다. 그리고 그 총 수치는 내 파티션의 크기보다 작습니다. 그리고 파티션 크기를 더하면 디스크 크기를 알 수 없습니다! 무엇을 제공합니까?
답변1
숫자를 합산하는 것은 쉽습니다. 문제는 추가해야 할 숫자가 너무 많다는 것입니다.
파일은 얼마나 많은 디스크 공간을 사용합니까?
기본 아이디어는 다음을 포함하는 파일이N바이트 사용N바이트의 디스크 공간과 파일의 메타데이터(권한, 타임스탬프 등)와 같은 일부 제어 정보에 대한 비트와 파일이 저장된 위치를 찾는 데 시스템이 필요한 정보에 대한 약간의 오버헤드가 있습니다. 그러나 많은 합병증이 있습니다.
미세한 합병증
각 파일을 도서관에 있는 일련의 책으로 생각하세요. 작은 파일은 한 권으로 구성되지만, 큰 파일은 백과사전처럼 여러 권으로 구성됩니다. 파일을 찾을 수 있도록 모든 볼륨을 참조하는 카드 카탈로그가 있습니다. 각 볼륨에는 표지로 인해 약간의 오버헤드가 있습니다. 파일이 매우 작은 경우 이 오버헤드는 상대적으로 큽니다. 또한 카드 카탈로그 자체도 어느 정도 공간을 차지합니다.
좀 더 기술적으로 말하자면, 일반적인 단순 파일 시스템에서는 공간이 다음과 같이 나뉩니다.블록. 일반적인 블록 크기는 4KiB입니다. 각 파일은 정수 개의 블록을 차지합니다. 파일 크기가 블록 크기의 배수가 아니면 마지막 블록은 부분적으로만 사용됩니다. 따라서 1바이트 파일과 4096바이트 파일은 모두 1블록을 차지하는 반면, 4097바이트 파일은 2블록을 차지합니다. ls
또는 : 을 사용하여 이를 관찰할 수 있습니다 du
. 파일 시스템의 블록 크기가 4KiB인 경우 ls -s
및 du
는 1바이트 파일에 대해 4KiB를 보고합니다.
파일이 큰 경우 파일을 구성하는 블록 목록을 저장하기 위해 추가 블록이 필요합니다.간접 블록; 보다 정교한 파일 시스템은 이를 다음과 같은 형태로 최적화할 수 있습니다.범위). ls -l
또는 GNU 에서 보고한 파일 크기에는 표시되지 않습니다 du --apparent-size
. 크기와 반대로 디스크 사용량을 보고하는 du
및 는 이를 설명합니다.ls -s
일부 파일 시스템은 마지막 블록에 남은 여유 공간을 재사용하려고 시도합니다.동일한 블록에 여러 개의 파일 테일을 압축합니다.. 일부 파일 시스템(예:Linux 3.8 이후의 ext4inode에 완전히 맞는 작은 파일(단 몇 바이트)에는 0 블록을 사용합니다.
거시적 합병증
일반적으로 위에서 볼 수 있듯이 에서 보고하는 전체 크기는 du
파일에서 사용되는 블록 또는 범위 크기의 합계입니다.
du
파일이 압축된 경우 에서 보고하는 크기가 더 작을 수 있습니다. Unix 시스템은 전통적으로 조잡한 형태의 압축을 지원합니다. 파일 블록에 널 바이트만 포함된 경우 0 블록을 저장하는 대신 파일 시스템은 해당 블록을 완전히 생략할 수 있습니다. 이와 같이 블록이 생략된 파일을스파스 파일. 파일에 큰 일련의 널 바이트가 포함되어 있으면 스파스 파일이 자동으로 생성되지 않습니다. 애플리케이션은 파일이 스파스가 되도록 준비해야 합니다.
다음과 같은 일부 파일 시스템btrfs그리고zfs범용 지원압축.
고급 합병증
zfs 및 btrfs와 같은 최신 파일 시스템의 두 가지 주요 기능인 스냅샷과 중복 제거는 파일 크기와 디스크 사용량 간의 관계를 훨씬 더 멀리 만듭니다.
스냅샷특정 날짜에 파일 시스템이 정지된 상태입니다. 이 기능을 지원하는 파일 시스템에는 서로 다른 날짜에 촬영된 여러 스냅샷이 포함될 수 있습니다. 물론 이러한 스냅샷은 공간을 차지합니다. 극단적인 경우 파일 시스템의 활성 버전에서 모든 파일을 삭제하면 스냅샷이 남아 있어도 파일 시스템이 비어 있지 않습니다.
스냅샷 이후 또는 두 스냅샷이 생성된 사이에 변경되지 않은 파일이나 블록은 스냅샷과 활성 버전 또는 다른 스냅샷에 동일하게 존재합니다. 이는 다음을 통해 구현됩니다.기록 중 복사. 일부 극단적인 경우에는 사용 가능한 공간이 부족하여 전체 파일 시스템에서 파일을 삭제하지 못할 수도 있습니다. 왜냐하면 해당 파일을 제거하려면 디렉터리에 블록 복사본을 만들어야 하고 해당 블록 하나를 위한 공간도 더 이상 없기 때문입니다.
중복 제거동일한 블록을 저장하지 않는 것으로 구성된 저장 최적화 기술입니다. 일반적인 데이터의 경우 중복 항목을 찾는 것이 항상 노력할 가치가 있는 것은 아닙니다. 둘 다zfs그리고btrfs선택 기능으로 중복 제거를 지원합니다.
총합이 du
파일 크기의 합과 다른 이유는 무엇입니까?
위에서 본 것처럼 du
각 파일에 대해 에서 보고하는 크기는 일반적으로 파일에서 사용하는 블록 또는 범위의 크기를 합한 것입니다. 기본적으로 ls -l
크기는 바이트 단위로 나열되지만 du
일부 기존 시스템에서는 크기가 KiB 또는 512바이트 단위(섹터)로 나열됩니다( du -k
킬로바이트를 강제로 사용함). 대부분의 최신 유니스는 K, M, G 등을 사용하여 "사람이 읽을 수 있는" 숫자를 지원 ls -lh
하고 적절하게 사용하면 충분합니다(KiB, MiB, GiB의 경우).du -h
du
디렉터리에서 실행하면 디렉터리 트리에 있는 모든 파일의 디스크 사용량이 합산됩니다.디렉토리를 포함하여그들 자신. 디렉터리에는 데이터(파일 이름 및 파일의 메타데이터 위치에 대한 포인터)가 포함되어 있으므로 약간의 저장 공간이 필요합니다. 작은 디렉터리는 한 블록을 차지하고, 큰 디렉터리에는 더 많은 블록이 필요합니다. 디렉터리에서 사용하는 저장소의 양은 디렉터리에 포함된 파일뿐 아니라 디렉터리가 삽입된 순서와 일부 파일이 제거되는 순서에 따라 달라지는 경우가 있습니다(일부 파일 시스템의 경우 이로 인해 구멍이 남을 수 있습니다. 즉, 디스크 공간과 성능이 절충됩니다) ), 그러나 차이는 미미할 것입니다(여기서 추가 블록이 있음). 을 실행하면 ls -ld /some/directory
디렉터리 크기가 나열됩니다. (출력 상단의 "total NNN" 행은 ls -l
관련 없는 숫자이며, KiB 또는 섹터로 표시되는 나열된 항목의 블록 크기 합계입니다.)
du
포함되어 있으니 참고하세요도트 파일or 옵션 ls
을 사용하지 않으면 표시되지 않습니다 .-A
-a
때로는 du
예상 금액보다 적게 보고되기도 합니다. 다음과 같은 경우에 이런 일이 발생합니다.하드 링크디렉터리 트리 내부: du
각 파일을 한 번만 계산합니다. 스위치를 사용하여 du -l
파일 수 계산N시간이 있다면N하드 링크.
ZFS
Linux 와 같은 일부 파일 시스템에서는 du
파일의 확장 속성이 차지하는 전체 디스크 공간을 보고하지 않습니다.
디렉토리 아래에 마운트 지점이 있는 경우 du
옵션이 제공되지 않는 한 이 마운트 지점에 있는 모든 파일도 계산됩니다 -x
. 따라서 예를 들어 루트 파일 시스템에 있는 파일의 전체 크기를 알고 싶다면 du -x /
가 아닌 를 실행하십시오 du /
.
파일 시스템이 비어 있지 않은 디렉토리에 마운트된 경우, 해당 디렉토리의 파일은 마운트된 파일 시스템에 의해 숨겨집니다. 그들은 여전히 그들의 공간을 차지하고 있지만 du
찾지 못할 것입니다.
삭제된 파일
파일이 있을 때삭제됨, 이는 반드시 파일 자체가 아닌 디렉토리 항목만 제거합니다. 실제로 파일을 삭제하여 디스크 공간을 확보하려면 두 가지 조건이 필요합니다.
- 파일의 링크 수는 0으로 낮아져야 합니다. 파일에 여러 개의 하드 링크가 있는 경우 하나를 제거해도 다른 링크에는 영향을 주지 않습니다.
- 파일이 일부 프로세스에 의해 열려 있는 한 데이터는 그대로 유지됩니다. 모든 프로세스가 파일을 닫은 경우에만 파일이 삭제됩니다. 출력
fuser -m
또는lsof
마운트 지점에는 파일이 삭제되더라도 해당 파일 시스템에서 파일이 열려 있는 프로세스가 포함됩니다. - 프로세스에서 삭제된 파일을 열지 않더라도 해당 파일이 장치의 백엔드인 경우 파일 공간을 회수하지 못할 수 있습니다
loop
.losetup -a
(as )는 현재 어떤 장치가 어떤 파일에 설정되어 있는지root
알려줍니다 . 디스크 공간을 회수하려면 먼저loop
루프 장치를 제거해야 합니다( 를 사용하여 ).losetup -d
일부 파일 관리자나 GUI 환경에서 파일을 삭제하면 삭제 취소가 가능한 휴지통에 들어갈 수 있습니다. 파일을 삭제 취소할 수 있는 한 해당 공간은 계속 소모됩니다.
이 숫자는 df
정확히 무엇에서 나온 것인가요?
일반적인 파일 시스템에는 다음이 포함됩니다.
- 파일(디렉터리 포함) 데이터와 일부 메타데이터(간접 블록 및 일부 파일 시스템의 확장 속성 포함)를 포함하는 블록입니다.
- 무료 블록.
- 루트 사용자에게 예약된 블록입니다.
- 슈퍼블록 및 기타 제어 정보.
- 아이노드
- ㅏ신문
에서는 첫 번째 종류만 보고합니다 du
. 의 경우 df
"used", "available" 및 total 열에 들어가는 내용은 파일 시스템에 따라 다릅니다(물론 사용된 블록(간접 블록 포함)은 항상 "used" 열에 있고 사용되지 않은 블록은 항상 " 사용 가능” 열).
ext2/ext3/ext4의 파일 시스템예약하다루트 사용자에게 공간의 5%. 이는 루트 파일 시스템에서 시스템이 꽉 찼을 때 시스템을 계속 작동시키려는 경우에 유용합니다(특히 로깅의 경우, 시스템 관리자가 문제를 해결하는 동안 약간의 데이터를 저장할 수 있도록 하는 경우). 와 같은 데이터 파티션의 경우에도 /home
거의 가득 찬 파일 시스템은 조각화되기 쉽기 때문에 예약된 공간을 유지하는 것이 유용합니다. Linux는 파일이 기록될 때 많은 연속 블록을 미리 할당하여 조각화(특히 하드 디스크와 같은 회전하는 기계 장치에서 파일 액세스 속도를 늦추는)를 방지하려고 시도하지만 연속 블록이 많지 않으면 작동하지 않습니다. .
btrfs가 아닌 ext4까지의 기존 파일 시스템은 고정된 수의 파일 시스템을 예약합니다.아이노드파일 시스템이 생성될 때. 이는 파일 시스템 설계를 상당히 단순화하지만 inode 수의 크기를 적절하게 조정해야 한다는 단점이 있습니다. inode가 너무 많으면 공간이 낭비됩니다. inode가 너무 적으면 공간이 부족해지기 전에 파일 시스템에 inode가 부족해질 수 있습니다. 이 명령은 df -i
사용 중인 inode 수와 사용 가능한 수를 보고합니다(개념이 적용되지 않는 파일 시스템은 0을 보고할 수 있음).
tune2fs -l
ext2/ext3/ext4 파일 시스템이 포함된 볼륨에서 실행하면 총 수와 사용 가능한 inode 및 블록 수를 포함한 일부 통계가 보고됩니다.
문제를 혼동할 수 있는 또 다른 특징은 다음과 같습니다.하위 볼륨(에서 지원됨btrfs, 그리고 zfs에서 이름 아래데이터 세트). 여러 하위 볼륨은 동일한 공간을 공유하지만 별도의 디렉터리 트리 루트를 갖습니다.
파일 시스템이 네트워크(NFS, Samba 등)를 통해 마운트되고 서버가 해당 파일 시스템의 일부를 내보내는 경우(예:서버에 /home
파일 시스템이 있고 내보내기/home/bob
), df
클라이언트에서는 클라이언트에서 내보내고 마운트되는 부분뿐만 아니라 전체 파일 시스템에 대한 데이터를 반영합니다.
내 디스크 공간을 무엇이 사용하고 있나요?
위에서 본 것처럼 보고된 전체 크기는 df
항상 파일 시스템의 모든 제어 데이터를 고려하지 않습니다. 필요한 경우 파일 시스템별 도구를 사용하여 파일 시스템의 정확한 크기를 가져옵니다. 예를 들어, ext2/ext3/ext4의 경우 실행 tune2fs -l
하고 블록 크기에 블록 수를 곱합니다.
파일 시스템을 생성하면 일반적으로 포함하는 파티션이나 볼륨의 사용 가능한 공간이 채워집니다. 때로는 파일 시스템을 이동하거나 볼륨 크기를 조정한 경우 파일 시스템이 더 작아질 수도 있습니다.
Linux에서는 lsblk
사용 가능한 스토리지 볼륨에 대한 개요를 제공합니다. 추가 정보가 필요하거나 가 없는 경우 lsblk
특수 볼륨 관리 또는 파티셔닝 도구를 사용하여 어떤 파티션이 있는지 확인하세요. Linux에는 lvs
, vgs
, pvs
가 있습니다.LVM,fdisk
기존 PC 스타일("MBR") 파티션(최신 시스템의 GPT 포함)의 경우gdisk
~을 위한GPT파티션,disklabel
BSD 디스크 라벨의 경우,나뉜등. Linux에서는 cat /proc/partitions
빠른 요약을 제공합니다. 일반적인 설치에는 운영 체제에서 사용하는 최소 두 개의 파티션 또는 볼륨(파일 시스템(경우에 따라 그 이상) 및교환용량.
일부 컴퓨터에는 다음을 포함하는 파티션이 있습니다.바이오스또는 기타 진단 소프트웨어. 컴퓨터UEFI전용 부트로더 파티션이 있습니다.
마지막으로, 대부분의 컴퓨터 프로그램은 1024 = 2 10 의 거듭제곱을 기반으로 하는 단위를 사용한다는 점에 유의하세요 (프로그래머는 이진수와 2의 거듭제곱을 좋아하기 때문입니다). 따라서 1kB = 1024B, 1MB = 1048576B, 1GB = 1073741824, 1TB = 1099511627776B, … 공식적으로 이러한 단위는 다음과 같이 알려져 있습니다.키비바이트키B,메비바이트MiB 등이지만 대부분의 소프트웨어는 k 또는 kB, M 또는 MB 등을 보고합니다. 반면에 하드 디스크 제조업체는 체계적으로 미터법(1000 기반 단위)을 사용합니다. 따라서 1TB 드라이브는 931GiB 또는 0.904TiB에 불과합니다.
답변2
파일 크기 및 디스크 공간 계산의 복잡성에 대한 간략한 요약:
파일이 디스크에서 차지하는 공간은 각 블록 크기에 대해 소요되는 블록 수 + 소요되는 inode 수의 배수입니다. 1바이트 길이의 파일에는 최소 1개의 블록, 1개의 inode 및 1개의 디렉토리 항목이 필요합니다.
그러나 파일이 다른 파일에 대한 하드 링크인 경우에는 추가 디렉토리 항목이 하나만 필요할 수 있습니다. 이는 동일한 블록 세트에 대한 또 다른 참조일 뿐입니다.
- 파일 내용의 크기입니다. 이것이
ls
표시되는 것입니다. - 여유 디스크 공간은 들어갈 수 있는 가장 큰 파일의 크기나 디스크에 들어갈 수 있는 모든 파일 콘텐츠 크기의 합계가 아닙니다. 그 사이 어딘가에 있습니다. 이는 파일 수(inode를 차지함), 블록 크기 및 각 파일의 내용이 블록을 얼마나 가깝게 채우는지에 따라 달라집니다.
이는 파일 시스템의 표면적인 부분에 불과하며 지나치게 단순화되었습니다. 또한 다른 파일 시스템은 다르게 작동한다는 점을 기억하십시오.
stat
이 정보 중 일부를 찾는 데 매우 도움이 됩니다. 다음은 stat를 사용하는 방법과 그 장점에 대한 몇 가지 예입니다.http://landoflinux.com/linux_stat_command_examples.html
답변3
df
일반적으로 파일 시스템이 무엇인지, 각 파일 시스템이 얼마나 꽉 차 있는지, 마운트된 위치를 확인하는 데 사용됩니다. 파일 시스템의 공간이 부족하거나 파일 시스템 간에 항목을 이동하거나 더 큰 디스크를 구입하려는 경우 등에 매우 유용합니다.
du
각 디렉터리가 소비하는 누적 스토리지 양에 대한 세부 정보를 보여줍니다( windirstat
Windows에서와 유사). 파일 정리를 시도할 때 공간을 많이 차지하는 위치를 찾는 데 유용합니다.
다른 사람들이 설명하는 작은 수치 차이를 제외하면 du
및 df
유틸리티는 매우 다른 목적으로 사용된다고 생각합니다.
답변4
du
여기서는 와 다른 원인이 되는 다양한 사례를 설명하겠습니다 df
.
df
파일 시스템에 할당된 블록을 계산하려면 du
각 파일의 크기 정보를 사용하세요. 차이에는 여러 가지 원인이 있을 수 있습니다.
응용 프로그램에서 아직 열려 있는 연결 해제된(삭제된) 파일입니다. 파일 정보가 누락되었으며 블록은 여전히 할당되어 있습니다.
lsof +aL1 <filesystem>
프로세스를 식별하는 데 도움이 됩니다. 대부분의 경우 공간을 확보하기 위해 프로세스를 종료해야 합니다(프로세스에 따라 다르며 때로는 구성을 다시 로드하는 것으로 충분함).마운트 지점 아래의 파일은 숨겨져 있지만
du
에는 숨겨져 있지 않습니다df
.debugfs
파일 시스템을 읽는 데 도움이 될 수 있습니다.$ sudo debugfs debugfs 1.42.12 (29-Aug-2014) debugfs: open /dev/xxx (the desired file system device) debugfs: cd /boot debugfs: ls -l 1966081 40755 (2) 0 0 4096 26-May-2016 16:28 . 2 40555 (2) 0 0 4096 11-May-2016 10:43 .. 1974291 100644 (1) 0 0 0 26-May-2016 16:28 bob <---<<< /boot/bob is hidden by /boot fs
스파스 파일그게 현실보다 더 커 보이는군요. 할당되지 않은 블록은 로 계산되지 않지만
df
겉보기 파일 크기는 으로 계산됩니다du
.
하드 링크는 속이지 않는다는 점에 유의하십시오 du
.