1

我正在使用 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) 为 1 GB,引导分区 (mmcblk0p1) 为 32 MB,rootfs 分区 (mmcblk0p2) 为 512 MB。

因此,为了说服自己 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返回完全不同的虚假大小?

4

1 回答 1

4

TL;DR:设置BR2_TARGET_ROOTFS_EXT2_BLOCKS为 524288。

您必须将分区与分区上的文件系统区分开来。

分区大小和偏移量在分区表中指定,您可以使用cat /proc/partitions. 分区是使用类似的工具创建的fdisk(或者当您使用 Buildroot 时,它通常由创建genimage)。

文件系统大小在文件系统超级块中指定,这是一段元数据,指定文件系统大小、任何选项(例如,如果使用日志)、集群大小等。这是由类似mke2fs. 当您mke2fs直接在分区上使用时,它将使用分区的全部空间用于文件系统,这通常是您想要的。但是,当您在对 SD 卡进行分区之前创建文件系统时(通常是使用 Buildroot 生成映像时的情况),您必须将大小指定为mke2fs(参见手册页:第二个参数是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)。

于 2017-10-04T08:51:31.323 回答