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