调整NanoPi-R1的emmc boot分区容量

背景

前些天购入一块NanoPi-R1带emmc存储的版本,遂写入了官方提供的ubuntu 16.04系统。现在已经9012年了,16.04系统已经比较老了,所以就想使用do-release-upgrade升级到18.04版本。但是未曾想,升级时提示/boot目录可用空间不足49.5M,所以没有办法升级。通过fdisk -l查看,/boot目录对应的块设备/dev/mmcblk1p1总共只有40M。这该怎么办呢?

方案

想了下可行的方案,建于原来emmc的分区是这样的:

看了下使用情况,第二个分区已经占满,第三个分区空间比较大。所以最好的方法就是从最后一个分区缩小100M,然后平移第二个分区,扩充第一个分区。这样以来第一个分区剩余空间就足够了。

平移扩充方案已经确定,那应当如何操作呢? NanoPi-R1支持通过TF卡启动和emmc启动两种方式。要知道自己手工平移分区和缩小分区操作是很复杂的(不常用,也懒的研究了。。。),我之前一直都是使用图形界面下的Gparted来操作,那如何可以让设备的emmc也可以通过图形界面来操作呢?

直接在NanoPi-R1上启动图形界面需要先在TF卡上的Ubuntu安装桌面环境和vnc,这样才方便操作,看了下这个环境下TF磁盘可用空间几乎没有了,所以操作起来好像不太容易。所以不如直接把emmc的镜像拖到PC的Ubuntu上进行操作,再传回来。

那如何传这个大小7个多G的镜像呢? NanoPi-R1支持千兆网络,使用nc拖回来看起来是不错的选择。这样拖回来之后从PC上处理好镜像,再拖回去写入到NanoPi-R1的emmc中,就可以了。

实施

接下来就是实际操作了。

首先从PC的Ubuntu准备好接收镜像文件。打开一个Terminal,运行以下命令

这样以来就在监听并等待写入了

然后我通过之前写入emmc使用的TF卡启动进入了ubuntu,使用串口访问设备,命令为minicom -D /dev/[串口设备] -b 115200

然后配置好网卡,接下来准备传输了。在NanoPi-R1上运行

接下来就看到开始传输了。通过查看网卡速度,基本上从emmc读取,通过千兆网卡传输速度在280~320mbps,真的算是很快了~这说明emmc的速度和千兆网卡IO性能都不错。

传输完成后,在PC上就得到了emmc.img这个文件。接下来要使用loop来挂载它并用Gparted编辑。鉴于这是一个含有多个分区的块设备镜像,所以使用partx来挂载到loop,这样可以自动生成分区的块设备。在PC上执行以下命令

然后看到系统输出自动分配了loop3设备和loop3p1, loop3p2, loop3p3设备

接下来就是使用Gparted来操作磁盘了。注意平时直接运行的Gparted是不在磁盘列表中现实loop设备的,所以我们通过命令行来直接运行Gparted强制制定设备

然后出现了熟悉的图形界面。接下来手工点击第三个分区,选择调整大小,在前部空出100M的空间。再点击第二个分区选择调整大小,向后平移100M。选择执行。

然后注意首个分区是fat16格式,所以不支持大小自动扩充。所以我们先挂载并拷贝出内容,再使用Gparted扩充分区并重新格式化到fat16再拷贝回来。这样我们就调整好了分区。看看最后的结果

这样分区就调整完毕,接下来需要取消挂载并传输写入回去。执行以下命令取消挂载

这样挂载的loop文件就删除了,我们可以安全的传输emmc.img。在PC上运行以下命令准备传输

然后在NanoPi-R1上执行以下命令接收并写入到emmc

按回车执行。查看写入速度基本也有240mbps~280mbps,还是很快~等待几分钟后写入完毕,关闭设备,拔出TF卡,重新上电启动。可以看到启动后/boot分区有140M了。操作成功完成。

升级

然后执行sudo do-release-upgrade,等待和输入一些信息后,升级完成。重启NanoPi-R1,显示出了登陆提示已经是Ubuntu 18.04了~

大功告成