[unix] 1 KiB 블록 크기의 정확히 100 MiB 파티션에 해당하는 사용 가능한 블록 / 공간이없는 이유는 무엇입니까?

컨테이너가있는 매우 밀도가 높은 가상화 환경이 있으므로 각 컨테이너를 실제로 작게 만들려고합니다. “정말 작은” 은 패키지 관리자 호환성을 손상시키지 않으면 서 기본 Ubuntu 14.04 (Trusty Tahr)에서 87MB를 의미 합니다.

따라서 컨테이너의 백업 저장소로 LVM 을 사용 하고 최근에 매우 이상한 숫자를 발견했습니다. 여기 있습니다.

100MiB (예, 2의 거듭 제곱) 논리 볼륨을 만들어 봅시다.

sudo lvcreate -L100M -n test1 /dev/purgatory

크기를 확인하고 싶습니다. sudo lvs --units k

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

Sweet, 이건 정말 100MiB입니다.

이제 ext4 파일 시스템을 만들어 보자 . 물론 -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는 일반적인 4 KiB가 아닌 1 KiB 크기의 블록을 만들기로 결정했습니다.

이제 마운트하겠습니다.

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

그리고 df매개 변수없이 호출합시다 (1 KiB 블록을보고 싶습니다)

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

잠깐만 요 ~

우리는 총 95054 블록을 가지고 있습니다. 그러나 장치 자체에는 1 KiB의 102400 블록이 있습니다. 스토리지는 92.8 %에 불과합니다. 내 블록 어 Where 어?

실제 블록 장치에서 살펴 보겠습니다. A에는 16GiB 가상 디스크, 1777의 16777216 블록이 있지만 15396784 블록 만 df 출력에 있습니다. 91.7 %, 무엇입니까?

이제 조사를 따릅니다 (스포일러 : 결과 없음).

  1. 파일 시스템이 장치의 시작 부분에서 시작할 수 없습니다. 이것은 이상하지만 가능합니다. 다행히도 ext4에는 매직 바이트가 있습니다.

    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를 가지고 있고 거기에서 크기를 확인할 수 있습니다!

… 많은 greps …

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 says)


답변

이 시도: 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_journal하고resize_inode

  • resize_inode“비용” 여유 공간 ( df-12K 에서 볼 수있는 1550 개의 1K 블록 / 2 %의 대부분은 “잃어버린 + 찾은”폴더에 사용됨)
  • has_journal“비용” 사용 가능한 공간 (귀하의 경우 4096 개의 1K 블록)

우리는 얻을 102348밖으로 102400사용할 수없는 또 다른 52 개 블록 (우리가 삭제 한 경우 폴더 “잃어버린 + 발견”). 따라서 우리는 다음과 같이 다이빙합니다 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 자체에서 사용중인 블록 을 제공 합니다. 마지막으로 하나의 블록 만 남았습니다. 1024부트 섹터와 같은 것의 시작 부분에서 건너 뛴 바이트 인 블록 0 .


답변

짧은 대답 :

블록 장치의 모든 공간이 데이터에 사용 가능한 공간이되는 것은 아닙니다. 일부 원시 공간은 파일 시스템 내부에 필요합니다.

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

EXT4는 저널링 된 파일 시스템이므로 공간을 차지합니다.

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

긴 대답 :

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

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

그런 다음 파일 시스템을 마운트하기 전에 a가 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우리에게 무엇을 보여줍니까? 원시 스토리지 장치 용량의 102400 블록에서 99150 1K 블록이 파일 시스템에 표시됩니다. 즉, 원시 스토리지 공간의 3250 1KB 블록은 실제 데이터 스토리지에 사용할 수 없게되었습니다.

그 블록들은 어디로 갔습니까? 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 테이블에 할당됩니다.

이는 이미 3250 개의 누락 된 블록 중 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 (파일 시스템의 크기) MINUS 5120 (예약 된 블록 수) MINUS 5646 (사용 된 블록, 4096 개는 저널에서 가져온 것입니다 (dumpe2fs` 출력의 일부))
= 88384

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


답변

질문에 대한 답은 아니지만 궁금해서 다른 사람들이 그렇게 할 것이라고 상상합니다. 라이브 CD가 이미 부팅되어 있고 오타가 없어도 걱정할 수없는 하드 드라이브가 있었으므로 테스트를 진행했습니다.

Ubuntu 14.10에서 제공하는 모든 FS로 파티션을 100MiB 파티션에 만들었습니다. (64MiB 만 지원하는 minix와 내가 들어 본 적이없는 SCO 인 bfs는 제외)

먼저 나는 보았다 df -k그때, (기본 mkfs를 설정으로) 사용할 수있는 공간 dd에드 /dev/zero모든 방법을 확인 그들이 채워질 수 구성하는 각 FS의 파일에. (즉, 청구 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”라고 불렀다.

그리고 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

(jfs는 “touched”도 제거한 후 1 %로 되돌아갔습니다. 시간 지연이 있거나 사용 가능한 크기를 업데이트하기 위해 다른 쓰기 작업이 필요했습니다.)

어쨌든, 나는 그것이 나의 호기심에 관한 것이라고 생각합니다.


답변