1KiB 블록 크기의 100MiB 파티션에 해당하는 여유 블록/공간이 없는 이유는 무엇입니까?

1KiB 블록 크기의 100MiB 파티션에 해당하는 여유 블록/공간이 없는 이유는 무엇입니까?

저는 매우 높은 밀도의 컨테이너 가상화 환경을 갖고 있기 때문에 각 컨테이너를 아주 작게 만들려고 노력하고 있습니다. "매우 작음"은 87MB를 의미합니다.우분투14.04(Trusty Tahr)은 패키지 관리자 호환성을 손상시키지 않습니다.

그래서 나는 사용한다좌심실 용적내 컨테이너의 백업 저장소로서 최근에 매우 이상한 숫자를 보았습니다. 여기 그들이 온다.

100MiB(예, 2의 거듭제곱) 논리 볼륨을 생성해 보겠습니다.

sudo lvcreate -L100M -n test1 /dev/purgatory

치수를 확인하고 싶어서 발행합니다.sudo lvs --units k

test1             purgatory  -wi-a----  102400.00k

맙소사, 말 그대로 100MiB입니다.

이제외부 4파일 시스템. 물론, 우리는 -m 0공간 낭비를 방지하는 매개 변수를 기억합니다.

sudo mkfs.ext4 -m 0 /dev/purgatory/test1

mke2fs 1.42.9 (4-Feb-2014)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
25688 inodes, 102400 blocks
0 blocks (0.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
13 block groups
8192 blocks per group, 8192 fragments per group
1976 inodes per group
Superblock backups stored on blocks:
        8193, 24577, 40961, 57345, 73729

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

달콤하고 깨끗합니다. 블록 크기에 주의하세요. 논리 볼륨이 작기 때문에 mkfs.ext4는 일반적인 4KiB 대신 1KiB 크기의 블록을 만들기로 결정했습니다.

이제 설치하겠습니다.

sudo mount /dev/purgatory/test1 /mnt/test1

인수 없이 호출 해 보겠습니다 df(1KiB 청크를 보고 싶습니다).

/dev/mapper/purgatory-test1     95054    1550     91456   2% /mnt/test1

잠깐만, 야~

총 95054개의 블록이 있습니다. 그러나 장치 자체에는 102,400개의 1KiB 블록이 있습니다. 저장 공간이 92.8%밖에 없습니다. 우리 동네는 어디야?

실제 블록 디바이스에서 살펴보겠습니다. A에는 16777216개의 1K 블록이 있는 16GiB 가상 디스크가 있지만 df 출력에는 15396784개의 블록만 있습니다. 91.7%, 이게 뭐죠?

이제 조사 상태가 다음과 같이 보고됩니다.(스포일러: 결과 없음)

  1. 파일 시스템은 장치 시작 부분에서 시작할 수 없습니다. 이상하지만 가능합니다. 다행히 ext4에는 매직 바이트가 있으므로 그 존재를 확인해 보겠습니다.

    sudo hexdump -C /dev/purgatory/test1 | sudo hexdump -C /dev/purgatory/test1 | grep "53 ef"

이것은 슈퍼블록을 보여줍니다:

00000430  a9 10 e7 54 01 00 ff ff  53 ef 01 00 01 00 00 00  |...T....S.......|

16진수 430 = 1072년 12월이므로 첫 번째 킬로바이트 이후 어딘가에 있습니다. 합리적으로 보입니다. ext4는 VBR과 같은 이상한 현상을 처리하기 위해 처음 1024바이트를 건너뜁니다.

  1. 이건 일기야!

전혀 그렇지 않다. 로그는 df 출력에 사용할 수 있는 공간을 차지합니다.

  1. 아, dump2fs가 있고 거기에서 크기를 확인할 수 있습니다!

...많은 grep...

sudo dumpe2fs /dev/purgatory/test1 | grep "Free blocks"

아야.

Free blocks:              93504
  Free blocks: 3510-8192
  Free blocks: 8451-16384
  Free blocks: 16385-24576
  Free blocks: 24835-32768
  Free blocks: 32769-40960
  Free blocks: 41219-49152
  Free blocks: 53249-57344
  Free blocks: 57603-65536
  Free blocks: 65537-73728
  Free blocks: 73987-81920
  Free blocks: 81921-90112
  Free blocks: 90113-98304
  Free blocks: 98305-102399

다른 번호가 있습니다. 93504개의 무료 블록.

질문은: 무슨 일이 일어나고 있는 걸까요?

  • 블록 장치: 102400k(lvs가 말함)
  • 파일 시스템 크기: 95054k(df가 말함)
  • 무료 블록: 93504k(dumpe2fs에 따르면)
  • 사용 가능한 크기: 91456k(df에 따르면)

답변1

이 시도:mkfs.ext4 -N 104 -m0 -O ^has_journal,^resize_inode /dev/purgatory/test1

나는 그것이 정말로 "무슨 일이 일어나고 있는지"에 대한 아이디어를 제공한다고 생각합니다.

-N 104(파일 시스템에 있어야 하는 iNode 수를 설정합니다.)

  • iNode당 "비용"쓸 수 있는공백(128바이트)

-m 0(예약된 블록 없음)
-O ^has_journal,^resize_inode(기능 비활성화 has_journalresize_inode

  • resize_inode"비용"무료공간( df-12K에 표시되는 1550개의 1K-블록/2% 대부분은 "lost+found" 폴더에 대한 것임)
  • has_journal"비용"쓸 수 있는공간 (귀하의 경우 4096 1K 블록)

102348사용할 수 없는 또 다른 52개의 블록 이 남습니다 ( 102400"lost+found" 폴더를 삭제하는 경우). 그럼 다음 내용을 더 자세히 살펴보겠습니다 dumpe2fs.

Group 0: (Blocks 1-8192) [ITABLE_ZEROED]
  Checksum 0x5ee2, unused inodes 65533
  Primary superblock at 1, Group descriptors at 2-2
  Block bitmap at 3 (+2), Inode bitmap at 19 (+18)
  Inode table at 35-35 (+34)
  8150 free blocks, 0 free inodes, 1 directories, 65533 unused inodes
  Free blocks: 17-18, 32-34, 48-8192
  Free inodes: 
Group 1: (Blocks 8193-16384) [BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x56cf, unused inodes 5
  Backup superblock at 8193, Group descriptors at 8194-8194
  Block bitmap at 4 (+4294959107), Inode bitmap at 20 (+4294959123)
  Inode table at 36-36 (+4294959139)
  8190 free blocks, 6 free inodes, 0 directories, 5 unused inodes
  Free blocks: 8193-16384
  Free inodes: 11-16
Group 2: (Blocks 16385-24576) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x51eb, unused inodes 8
  Block bitmap at 5 (+4294950916), Inode bitmap at 21 (+4294950932)
  Inode table at 37-37 (+4294950948)
  8192 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 16385-24576
  Free inodes: 17-24
Group 3: (Blocks 24577-32768) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x3de1, unused inodes 8
  Backup superblock at 24577, Group descriptors at 24578-24578
  Block bitmap at 6 (+4294942725), Inode bitmap at 22 (+4294942741)
  Inode table at 38-38 (+4294942757)
  8190 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 24577-32768
  Free inodes: 25-32
Group 4: (Blocks 32769-40960) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x79b9, unused inodes 8
  Block bitmap at 7 (+4294934534), Inode bitmap at 23 (+4294934550)
  Inode table at 39-39 (+4294934566)
  8192 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 32769-40960
  Free inodes: 33-40
Group 5: (Blocks 40961-49152) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x0059, unused inodes 8
  Backup superblock at 40961, Group descriptors at 40962-40962
  Block bitmap at 8 (+4294926343), Inode bitmap at 24 (+4294926359)
  Inode table at 40-40 (+4294926375)
  8190 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 40961-49152
  Free inodes: 41-48
Group 6: (Blocks 49153-57344) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x3000, unused inodes 8
  Block bitmap at 9 (+4294918152), Inode bitmap at 25 (+4294918168)
  Inode table at 41-41 (+4294918184)
  8192 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 49153-57344
  Free inodes: 49-56
Group 7: (Blocks 57345-65536) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x5c0a, unused inodes 8
  Backup superblock at 57345, Group descriptors at 57346-57346
  Block bitmap at 10 (+4294909961), Inode bitmap at 26 (+4294909977)
  Inode table at 42-42 (+4294909993)
  8190 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 57345-65536
  Free inodes: 57-64
Group 8: (Blocks 65537-73728) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0xf050, unused inodes 8
  Block bitmap at 11 (+4294901770), Inode bitmap at 27 (+4294901786)
  Inode table at 43-43 (+4294901802)
  8192 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 65537-73728
  Free inodes: 65-72
Group 9: (Blocks 73729-81920) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x50fd, unused inodes 8
  Backup superblock at 73729, Group descriptors at 73730-73730
  Block bitmap at 12 (+4294893579), Inode bitmap at 28 (+4294893595)
  Inode table at 44-44 (+4294893611)
  8190 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 73729-81920
  Free inodes: 73-80
Group 10: (Blocks 81921-90112) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x60a4, unused inodes 8
  Block bitmap at 13 (+4294885388), Inode bitmap at 29 (+4294885404)
  Inode table at 45-45 (+4294885420)
  8192 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 81921-90112
  Free inodes: 81-88
Group 11: (Blocks 90113-98304) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0x28de, unused inodes 8
  Block bitmap at 14 (+4294877197), Inode bitmap at 30 (+4294877213)
  Inode table at 46-46 (+4294877229)
  8192 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 90113-98304
  Free inodes: 89-96
Group 12: (Blocks 98305-102399) [INODE_UNINIT, ITABLE_ZEROED]
  Checksum 0x9223, unused inodes 8
  Block bitmap at 15 (+4294869006), Inode bitmap at 31 (+4294869022)
  Inode table at 47-47 (+4294869038)
  4095 free blocks, 8 free inodes, 0 directories, 8 unused inodes
  Free blocks: 98305-102399
  Free inodes: 97-104

사용된 블록(백업 슈퍼블록, 그룹 설명자, 블록 비트맵, inode 비트맵 및 inode 테이블의 경우)을 계산하거나 다음을 grep수행하여 계산합니다.

LANG=C dumpe2fs /dev/mapper/vg_vms-test1 | grep ' at ' | grep -v ',' | wc -l

이는 블록이 있는 행 수(우리의 경우)를 제공하고

LANG=C dumpe2fs /dev/mapper/vg_vms-test1 | grep ' at ' | grep ',' | wc -l

이는 두 개의 블록이 있는 행 수를 제공합니다(이 경우).

13따라서 (이 예에서는) 각각 하나의 블록을 포함하는 행과 각각 두 개의 블록을 포함하는 행이 있습니다 19.

13+19*2

51ext4 자체가 사용하는 블록을 제공합니다 . 드디어 한 조각만 남았습니다. 블록 0은 1024부트 섹터 등의 시작 부분에서 건너뛴 바이트 입니다.

답변2

짧은 답변:

블록 장치의 모든 공간이 데이터용으로 사용 가능한 공간이 되는 것은 아닙니다. 일부 원시 공간은 파일 시스템 내부 및 숨겨진 장부를 위해 필요합니다.

이 기록에는 슈퍼블록, 블록 그룹 설명자, 블록 및 inode 비트맵, inode 테이블이 포함됩니다. 또한 백업/복원 목적으로 슈퍼블록의 복사본이 여러 위치에 생성됩니다. EXT4 파일 시스템의 내부에 대한 더 긴 기사는 다음에서 찾을 수 있습니다.ext4.wiki.kernel.org.

EXT4는 로그 파일 시스템이므로 약간의 공간도 차지합니다.

또한 향후 파일 시스템 확장을 위해 일부 공간이 예약되어 있습니다.

긴 답변:

내 테스트 시스템 중 하나에서 시나리오를 재현했습니다.

lvcreate -L 100M -n test MyVG
mkfs.ext4 -b 1024 /dev/MyVG/test 

그런 다음 파일 시스템을 마운트하기 전에 다음 dumpe2fs이 표시됩니다.

Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              25688
Block count:              102400
Reserved block count:     5120
Free blocks:              93504
Free inodes:              25677
First block:              1
Block size:               1024
Fragment size:            1024
Reserved GDT blocks:      256
Blocks per group:         8192
Fragments per group:      8192
Inodes per group:         1976
Inode blocks per group:   247
Flex block group size:    16
Filesystem created:       Fri Feb 20 13:20:54 2015
Last mount time:          n/a
Last write time:          Fri Feb 20 13:20:55 2015
...
Journal size:             4096k  
...

설치 후:

df /tmp/test/
Filesystem              1K-blocks  Used Available Use% Mounted on
/dev/mapper/MyVG-test       99150  5646     88384   7% /tmp/test

그렇다면 df그것은 우리에게 무엇을 보여줍니까? 원시 저장 장치 용량의 102,400개 블록 중 99,150개의 1K 블록이 파일 시스템에 표시됩니다. 이는 원시 저장 공간의 3,250개의 1K 바이트 블록이 더 이상 실제 데이터 저장에 사용할 수 없음을 의미합니다.

그 덩어리들은 어디로 갔나요? 출력에서 아래로 스크롤하여 dumpe2fs정확한 위치를 표시합니다.

Group 0: (Blocks 1-8192) [ITABLE_ZEROED]
  Checksum 0x0d67, unused inodes 1965
  Primary superblock at 1, Group descriptors at 2-2
  Reserved GDT blocks at 3-258
  Block bitmap at 259 (+258), Inode bitmap at 275 (+274)
  Inode table at 291-537 (+290)
  4683 free blocks, 1965 free inodes, 2 directories, 1965 unused inodes
  Free blocks: 3510-8192
  Free inodes: 12-1976

1 block (블록 #0) x86 부트 섹터 및 기타 이상한 항목을 설치할 수 있도록 처음 1024바이트를 건너뜁니다.
1 block 1차 슈퍼블록이 점유함.
1 block 그룹 설명자를 포함합니다.
256 blocks그룹 설명자 테이블용으로 예약됨향후 파일 시스템의 크기를 조정할 수 있습니다. 16 blocks 블록 비트맵에 할당됩니다.
16 blocksinode 비트맵에 할당됩니다.
246 blocksinode 테이블에 할당됩니다.

이는 이미 누락된 블록 3,250개 중 537개를 차지합니다. ext4 파일 시스템은 일련의 블록 그룹으로 나누어져 있으며, 아래로 스크롤하면 파일 시스템 내의 원시 스토리지 용량이 다른 블록 그룹에 유사하게 할당된 것을 볼 수 있습니다.

Group 1: (Blocks 8193-16384) [INODE_UNINIT, ITABLE_ZEROED]
  Checksum 0x0618, unused inodes 1976
  Backup superblock at 8193, Group descriptors at 8194-8194
  Reserved GDT blocks at 8195-8450
  Block bitmap at 260 (+4294959363), Inode bitmap at 276 (+4294959379)
  Inode table at 538-784 (+4294959641)
  7934 free blocks, 1976 free inodes, 0 directories, 1976 unused inodes
  Free blocks: 8451-16384
  Free inodes: 1977-3952
Group 2: (Blocks 16385-24576) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Checksum 0xcfd3, unused inodes 1976
  Block bitmap at 261 (+4294951172), Inode bitmap at 277 (+4294951188)
  Inode table at 785-1031 (+4294951696)
  8192 free blocks, 1976 free inodes, 0 directories, 1976 unused inodes
  Free blocks: 16385-24576
  Free inodes: 3953-5928 
Group ....

이제 출력으로 돌아갑니다 df.

df /tmp/test/
Filesystem              1K-blocks  Used Available Use% Mounted on
/dev/mapper/MyVG-test       99150  5646     88384   7% /tmp/test

새 파일 시스템에서는 다음과 같은 이유로 용량의 7%가 사용 중인 것으로 표시됩니다.

99150(파일 시스템 크기) - 5120(예약된 블록 수) - 5646(사용된 블록 중 4096은 로그(또한 dumpe2fs 출력의 일부)에서 나온 것임)
= 88384

dumpe2fs의 여유 블록 수는 파일 시스템의 여유 크기에서 실제 사용량을 뺀 값이므로(예약된 블록은 고려하지 않음) 99150 - 5646 = 93504입니다.

답변3

이것은 질문에 대한 답변은 아니지만 궁금해서 다른 사람들도 그렇게 할 것이라고 생각했습니다. liveCD를 부팅하고 오타로 인해 손상될 염려 없이 하드 드라이브를 마음대로 사용할 수 있었기 때문에 계속해서 테스트해 보았습니다.

mkfs가 있는 모든 FS에 대해 Ubuntu 14.10을 사용하여 100MiB 파티션에 파티션을 만들었습니다. (64MiB만 지원하는 minix와 SCO에 대해 들어본 적이 없는 bfs는 제외합니다.)

df -k먼저 (기본 mkfs 설정을 사용하여) 사용 가능한 공간을 살펴본 다음 각 FS의 파일을 dd편집하여 /dev/zero항상 채워지는지 확인했습니다. (즉, 선언된 내용이 available space실제로 사용 가능한지 확인합니다.)
for i in /media/ubuntu/small-*;do sudo dd if=/dev/zero of="$i/fill" bs=16k;done

* FS: empty `df -k` : non-zero `df -k` when full (false bottom)
* jfs:  101020k
* fat32:100808k  : 4
* ntfs:  99896k
* btrfs: 98276k  : 4428
* ext2:  92480k
* xfs:   90652k  : 20
* ext4:  86336k
* ext3:  88367k
* reiserfs(v3): 69552k

btrfs에 사용되지 않은 공간이 너무 많은 이유는 무엇입니까? 메타데이터용일까요? 음 ... 아니:

$ for i in /media/ubuntu/small-*;do sudo touch "$i/touched";done
touch: cannot touch ‘/media/ubuntu/small-btrfs/touched’: No space left on device
touch: cannot touch ‘/media/ubuntu/small-reiser/touched’: No space left on device

트리 기반 파일 시스템은 빈 파일을 어디에든 압축할 수 없지만 다른 모든 시스템에서는 가능합니다.

또는 만들 수 있는 파일의 크기를 확인하세요.

$ ls -SdlG --block-size=1k /media/ubuntu/small-*/*
-rw-r--r-- 1 root   101020 Feb 21 11:55 /media/ubuntu/small-jfs/fill
-rw-r--r-- 1 ubuntu 100804 Feb 21 11:55 /media/ubuntu/small-fat/fill
-rw------- 1 ubuntu  99848 Feb 21 11:55 /media/ubuntu/small-ntfs/fill
-rw-r--r-- 1 root    97216 Feb 21 11:55 /media/ubuntu/small-ext2/fill
-rw-r--r-- 1 root    93705 Feb 21 11:27 /media/ubuntu/small-btrfs/foo
-rw-r--r-- 1 root    93120 Feb 21 11:55 /media/ubuntu/small-ext3/fill
-rw-r--r-- 1 root    91440 Feb 21 11:55 /media/ubuntu/small-ext/fill
-rw-r--r-- 1 root    90632 Feb 21 11:55 /media/ubuntu/small-xfs/fill
-rw-r--r-- 1 root    69480 Feb 21 11:55 /media/ubuntu/small-reiser/fill
drwx------ 2 root       12 Feb 21 11:33 /media/ubuntu/small-ext2/lost+found
drwx------ 2 root       12 Feb 21 11:43 /media/ubuntu/small-ext3/lost+found
drwx------ 2 root       12 Feb 21 11:29 /media/ubuntu/small-ext/lost+found

(저는 모든 파일 시스템을 생성하는 데 열중하고 싶지 않기 때문에 ext4 파티션을 "small-ext"라고 부릅니다. 따라서 여기에서는 ext=ext4입니다. 원래 pre-ext2 ext가 아닙니다.)

df -k다시 삭제하면 출력은 다음과 같습니다.

/dev/sdd6          95980    5328     90652   6% /media/ubuntu/small-xfs
/dev/sdd7          95054    1550     86336   2% /media/ubuntu/small-ext
/dev/sdd5         102400   93880    101020  96% /media/ubuntu/small-btrfs
/dev/sdd8         101168  101168         0 100% /media/ubuntu/small-jfs
/dev/sdd9          99150    1550     92480   2% /media/ubuntu/small-ext2
/dev/sdd10        102392   32840     69552  33% /media/ubuntu/small-reiser
/dev/sdd11        100808       1    100808   1% /media/ubuntu/small-fat
/dev/sdd12        102396    2548     99848   3% /media/ubuntu/small-ntfs
/dev/sdd13         95054    1567     88367   2% /media/ubuntu/small-ext3

("touched"를 제거한 후 jfs 사용량도 1%로 돌아갔습니다. 시간이 지연되었거나 업데이트할 여유 크기를 얻으려면 또 다른 쓰기가 필요했습니다.)

아무튼 그냥 내 호기심 때문이었던 것 같다.

관련 정보