写入树莓派官方镜像的时候,我们会发现当树莓派第一次启动后,磁盘空间会自动扩充到整个TF卡。那么当我们自己制作镜像的时候,能不能去除未使用的空间,制作体积较小的镜像,并在该镜像启动时自动扩展,从而适应不同大小的新TF卡呢?答案是当然可以,通过在国内外各种论坛的探索,本文将介绍完全基于树莓派原版系统实现方式的自动磁盘扩展。
由于我们备份镜像需要对磁盘空间进行更改,需要另一个Linux系统对需要创建镜像的磁盘进行操作。如果你的电脑装有Linux系统,可以直接使用读卡器读取需要创建镜像的TF卡。如果没有,也可以将另一张安装了Linux系统的TF卡插入树莓派,再使用读卡器挂载需要创建镜像的TF卡。本文使用后一种方式,如果是前一种方式也是雷同。
1、重新放入“resize2fs_once”文件
其实在树莓派的官方镜像中,在“/etc/init.d”路径下,共有33个文件,而不是启动后的32个。原因是有一个名叫“resize2fs_once”的文件,顾名思义只在启动时运行一次,然后自我删除,它就是官方用来自动扩展磁盘的脚本。那么事情就简单了,只需重新在需要做镜像的磁盘中放入即可。
“resize2fs_once”文件可以直接从官方镜像文件中获取,只要是全新未启动过的都会含有,建议从自己的全新镜像中提取。
*这里提供一个提取自“raspios_arm64-2021-05-28”的“resize2fs_once”,不保证全版本适用。https://raw.githubusercontent.com/TimeFlyingAway/Raspberry_Pi_OS-resize/main/resize2fs_once
首先插入另一块TF卡启动树莓派,系统正常启动后将需要制作镜像的TF卡插入读卡器连接到树莓派的USB接口。此时,正常情况下,树莓派会自动挂载插入的TF卡并在桌面显示两个磁盘,“boot”和“rootfs”(默认挂载在路径“/media/pi”下)。
打开“rootfs”,依次进入“etc”,“init.d”(默认路径“/media/pi/rootfs/etc/init.d”),放入“resize2fs_once”文件。任何放入方法均可,这里不再赘述。
然后授予“resize2fs_once”,755权限。
1 | sudo chmod 755 resize2fs_once |
*需要注意,“resize2fs_once”在第一次启动,扩展至全磁盘时,会导致swap分区恢复到默认大小,但如果swap分区配置正确,无需任何操作再次重启即可恢复用户设置。
2、修改“cmdline.txt”
完成“resize2fs_once”的放入后,还需将“cmdline.txt”复原。
打开挂载的“boot”磁盘(默认路径“/media/pi/boot”),编辑“cmdline.txt”后保存。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #可以使用任何你喜欢的方式编辑,比如 sudo nano /media/pi/boot/cmdline.txt sudo vi /media/pi/boot/cmdline.txt #在“quiet”和“splash”中间添加 init=/usr/lib/raspi-config/init_resize.sh #比如,如果原先是 console=serial0,115200 console=tty1 root=PARTUUID=0a1b2c3d-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles #则改为 console=serial0,115200 console=tty1 root=PARTUUID=0a1b2c3d-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh splash plymouth.ignore-serial-consoles ###请务必保留其余部分不变### |
至此,有关自动扩展磁盘的设置已经结束,以下内容为如何创建占用空间较小的符合官方镜像烧写软件“Raspberry Pi Imager” 的镜像。
3、缩小磁盘大小
然后使用GParted对磁盘大小进行调整。GParted是图形化界面,易于理解同时自带校验等,当然也可以直接使用parted、fdisk或resize2fs等命令进行操作,这里不再赘述。(Windows对于ext4的支持十分差,虽然个别软件也能分区,但还是建议直接使用Linux,不给自己找麻烦,是吧)
然后打开LX终端,启动GParted。
1 | sudo gparted |
如果出现“sudo: gparted:找不到命令”,即没有安装GParted,请先安装。
1 | sudo apt install gparted |
正常打开后会出现图形化界面。
右侧将磁盘选择为读卡器,一般为“/dev/sda”。选中“rootfs”,右键,选择“卸载(U)”。
然后继续选中“rootfs”,右键,选择“更改大小/移动(R)”。
根据实际情况调整分区大小,建议略大于已占用空间,并点击“调整大小/移动”。
点击工具栏“应用全部操作”,保存修改并执行,同时校验磁盘。弹出警告点击“应用(A)”确认。
等待进度条完成,完成后点击“关闭(C)”,待GParted自动刷新后,检查分区结果。
4、制作镜像并进一步压缩
制作镜像的方式也有很多,这里我使用“Win32DiskImager”。“映像文件”选择保存镜像的位置,并新建一个“.img”结尾的文件,选中。“设备”选择TF卡对应的任意一个盘符即可,但请务必选择正确,避免选中其他U盘等。校验值根据喜好选择,也可以选择“无”。务必勾选“仅读取已分配分区”。然后点击读取,等待进度条完成。
完成后将“.img”文件添加到压缩文件,变为“.zip”进一步缩小镜像体积。这里强力推荐使用开源免费小巧的压缩软件7-Zip。使用7-Zip添加压缩文件,压缩格式选择“zip”,压缩等级选择“5 – 标准压缩”,其他默认即可。通过这样生成的压缩文件,可以直接被树莓派官方的镜像刷写软件“Raspberry Pi Imager”识别并刷写。