컨테이너가있는 매우 밀도가 높은 가상화 환경이 있으므로 각 컨테이너를 실제로 작게 만들려고합니다. “정말 작은” 은 패키지 관리자 호환성을 손상시키지 않으면 서 기본 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 %, 무엇입니까?
이제 조사를 따릅니다 (스포일러 : 결과 없음).
-
파일 시스템이 장치의 시작 부분에서 시작할 수 없습니다. 이것은 이상하지만 가능합니다. 다행히도 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 바이트를 건너 뜁니다.
- 이것은 일기입니다!
전혀 그렇지 않다. df 출력의 경우 저널에서 사용 가능한 공간을 확보합니다.
- 오, 우리는 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
51
ext4 자체에서 사용중인 블록 을 제공 합니다. 마지막으로 하나의 블록 만 남았습니다. 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 blocks
inode 비트 맵에 할당됩니다.
246 blocks
inode 테이블에 할당됩니다.
이는 이미 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 %로 되돌아갔습니다. 시간 지연이 있거나 사용 가능한 크기를 업데이트하기 위해 다른 쓰기 작업이 필요했습니다.)
어쨌든, 나는 그것이 나의 호기심에 관한 것이라고 생각합니다.