df -h 中的分区大小与 /proc/partitions 中的大小完全不同
Partition's size in df -h is totally different than the size in /proc/partitions
我正在使用 buildroot 为我的 raspi A+ 构建自定义 linux 系统。
使用 genimage,我在 1 GB sdcard 上创建了两个分区。第一个分区是引导分区。这是 vfat,它是 32 MB。第二个分区是 ext4,它是 rootfs,它是 512 MB.
一旦我用新烧录的 sdcard 启动我的 raspi 并输入 df -h
我在输出中得到这个:
Filesystem Size Used Available Use% Mounted on
/dev/root 17.1M 14.0M 1.8M 89% /
devtmpfs 200.6M 0 200.6M 0% /dev
tmpfs 200.7M 0 200.7M 0% /dev/shm
tmpfs 200.7M 0 200.7M 0% /tmp
tmpfs 200.7M 4.0K 200.7M 0% /run
如您所见,/dev/root
是 17.1 MB 而不是 512 MB。
然后,我发出 cat /proc/partitions
:
major minor #blocks name
1 0 4096 ram0
1 1 4096 ram1
1 2 4096 ram2
1 3 4096 ram3
1 4 4096 ram4
1 5 4096 ram5
1 6 4096 ram6
1 7 4096 ram7
1 8 4096 ram8
1 9 4096 ram9
1 10 4096 ram10
1 11 4096 ram11
1 12 4096 ram12
1 13 4096 ram13
1 14 4096 ram14
1 15 4096 ram15
179 0 969728 mmcblk0
179 1 32768 mmcblk0p1
179 2 524288 mmcblk0p2
我们清楚地看到sdcard(mmcblk0)是1GB,boot分区(mmcblk0p1)是32MB,rootfs分区(mmcblk0p2)是512MB。
所以,为了说服自己 mmcblk0p2 分区可能挂载不当,我用 mount -t ext4 -o rw /dev/mmcblk0p2 /mnt
再次挂载它,然后我再次发出 df -h
:
Filesystem Size Used Available Use% Mounted on
/dev/root 17.1M 14.0M 1.8M 89% /
devtmpfs 200.6M 0 200.6M 0% /dev
tmpfs 200.7M 0 200.7M 0% /dev/shm
tmpfs 200.7M 0 200.7M 0% /tmp
tmpfs 200.7M 4.0K 200.7M 0% /run
/dev/mmcblk0p2 17.1M 14.0M 1.8M 89% /mnt
同样,我看到 mmcblk0p2 大小为 17.1 MB。
所以,我的问题是 为什么 cat /proc/partitions
返回我的 rootfs 分区的预期大小,而 df -h
returns 是完全不同的虚假大小?
TL;DR: 将 BR2_TARGET_ROOTFS_EXT2_BLOCKS
设置为 524288.
你必须区分分区和分区上的文件系统。
分区大小和偏移量在分区table中指定,您可以使用cat /proc/partitions
查看它们。分区是使用 fdisk
之类的工具创建的(或者当您使用 Buildroot 时,它通常由 genimage
创建)。
文件系统大小在文件系统超级块中指定,这是一段指定文件系统大小的元数据、任何选项(例如,如果使用日志记录)、簇大小等。这是由 mke2fs
。当您直接在分区上使用 mke2fs
时,它将使用文件系统分区的完整 space,这通常是您想要的。但是,当您在 之前创建文件系统 对 SD 卡进行分区时(使用 Buildroot 等生成映像时通常会出现这种情况),您必须将大小指定为 mke2fs
(cfr. man page: 第二个参数是blocks-count
).
在 Buildroot 中,您通常将图像创建为文件,而不是直接写入 SD 卡。这是因为 SD 卡的大小事先未知,并且您必须是 root 才能写入 SD 卡。因此,当您创建文件系统时,Buildroot 无法知道 ext4 文件系统应该有多大。在 Buildroot 的 2017.05 版本之前,它会尝试估计文件系统应该有多大才能容纳所有内容,并创建一个恰好大小的文件系统。你可能就是这种情况。
要解决此问题,您应该将配置变量 BR2_TARGET_ROOTFS_EXT2_BLOCKS
设置为 524288(= 1024 字节块中的 512MB)。或者,如果您使用比 2017.05 版本更新的 Buildroot,将 BR2_TARGET_ROOTFS_EXT2_SIZE
设置为 512M(新选项以字节为单位,但允许后缀 K、M、G)。
我正在使用 buildroot 为我的 raspi A+ 构建自定义 linux 系统。
使用 genimage,我在 1 GB sdcard 上创建了两个分区。第一个分区是引导分区。这是 vfat,它是 32 MB。第二个分区是 ext4,它是 rootfs,它是 512 MB.
一旦我用新烧录的 sdcard 启动我的 raspi 并输入 df -h
我在输出中得到这个:
Filesystem Size Used Available Use% Mounted on
/dev/root 17.1M 14.0M 1.8M 89% /
devtmpfs 200.6M 0 200.6M 0% /dev
tmpfs 200.7M 0 200.7M 0% /dev/shm
tmpfs 200.7M 0 200.7M 0% /tmp
tmpfs 200.7M 4.0K 200.7M 0% /run
如您所见,/dev/root
是 17.1 MB 而不是 512 MB。
然后,我发出 cat /proc/partitions
:
major minor #blocks name
1 0 4096 ram0
1 1 4096 ram1
1 2 4096 ram2
1 3 4096 ram3
1 4 4096 ram4
1 5 4096 ram5
1 6 4096 ram6
1 7 4096 ram7
1 8 4096 ram8
1 9 4096 ram9
1 10 4096 ram10
1 11 4096 ram11
1 12 4096 ram12
1 13 4096 ram13
1 14 4096 ram14
1 15 4096 ram15
179 0 969728 mmcblk0
179 1 32768 mmcblk0p1
179 2 524288 mmcblk0p2
我们清楚地看到sdcard(mmcblk0)是1GB,boot分区(mmcblk0p1)是32MB,rootfs分区(mmcblk0p2)是512MB。
所以,为了说服自己 mmcblk0p2 分区可能挂载不当,我用 mount -t ext4 -o rw /dev/mmcblk0p2 /mnt
再次挂载它,然后我再次发出 df -h
:
Filesystem Size Used Available Use% Mounted on
/dev/root 17.1M 14.0M 1.8M 89% /
devtmpfs 200.6M 0 200.6M 0% /dev
tmpfs 200.7M 0 200.7M 0% /dev/shm
tmpfs 200.7M 0 200.7M 0% /tmp
tmpfs 200.7M 4.0K 200.7M 0% /run
/dev/mmcblk0p2 17.1M 14.0M 1.8M 89% /mnt
同样,我看到 mmcblk0p2 大小为 17.1 MB。
所以,我的问题是 为什么 cat /proc/partitions
返回我的 rootfs 分区的预期大小,而 df -h
returns 是完全不同的虚假大小?
TL;DR: 将 BR2_TARGET_ROOTFS_EXT2_BLOCKS
设置为 524288.
你必须区分分区和分区上的文件系统。
分区大小和偏移量在分区table中指定,您可以使用cat /proc/partitions
查看它们。分区是使用 fdisk
之类的工具创建的(或者当您使用 Buildroot 时,它通常由 genimage
创建)。
文件系统大小在文件系统超级块中指定,这是一段指定文件系统大小的元数据、任何选项(例如,如果使用日志记录)、簇大小等。这是由 mke2fs
。当您直接在分区上使用 mke2fs
时,它将使用文件系统分区的完整 space,这通常是您想要的。但是,当您在 之前创建文件系统 对 SD 卡进行分区时(使用 Buildroot 等生成映像时通常会出现这种情况),您必须将大小指定为 mke2fs
(cfr. man page: 第二个参数是blocks-count
).
在 Buildroot 中,您通常将图像创建为文件,而不是直接写入 SD 卡。这是因为 SD 卡的大小事先未知,并且您必须是 root 才能写入 SD 卡。因此,当您创建文件系统时,Buildroot 无法知道 ext4 文件系统应该有多大。在 Buildroot 的 2017.05 版本之前,它会尝试估计文件系统应该有多大才能容纳所有内容,并创建一个恰好大小的文件系统。你可能就是这种情况。
要解决此问题,您应该将配置变量 BR2_TARGET_ROOTFS_EXT2_BLOCKS
设置为 524288(= 1024 字节块中的 512MB)。或者,如果您使用比 2017.05 版本更新的 Buildroot,将 BR2_TARGET_ROOTFS_EXT2_SIZE
设置为 512M(新选项以字节为单位,但允许后缀 K、M、G)。