背景
前些天购入一块NanoPi-R1
带emmc存储的版本,遂写入了官方提供的ubuntu 16.04系统。现在已经9012年了,16.04系统已经比较老了,所以就想使用do-release-upgrade
升级到18.04版本。但是未曾想,升级时提示/boot
目录可用空间不足49.5M,所以没有办法升级。通过fdisk -l
查看,/boot
目录对应的块设备/dev/mmcblk1p1
总共只有40M。这该怎么办呢?
方案
想了下可行的方案,建于原来emmc的分区是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 |
Disk /dev/mmcblk0: 7.3 GiB, 7818182656 bytes, 15269888 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xcd32eff2 Device Boot Start End Sectors Size Id Type /dev/mmcblk0p1 49152 131071 81920 40M 83 Linux /dev/mmcblk0p2 131072 2588671 2457600 1.2G 83 Linux /dev/mmcblk0p3 2588672 15269887 12681216 6G 83 Linux |
看了下使用情况,第二个分区已经占满,第三个分区空间比较大。所以最好的方法就是从最后一个分区缩小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,运行以下命令
1 2 |
nc -l 9995 > emmc.img |
这样以来就在监听并等待写入了
然后我通过之前写入emmc使用的TF卡启动进入了ubuntu,使用串口访问设备,命令为minicom -D /dev/[串口设备] -b 115200
然后配置好网卡,接下来准备传输了。在NanoPi-R1
上运行
1 2 |
dd if=/dev/mmcblk1 of=/dev/stdout bs=1M | busybox nc [PC的IP] 9995 |
接下来就看到开始传输了。通过查看网卡速度,基本上从emmc读取,通过千兆网卡传输速度在280~320mbps,真的算是很快了~这说明emmc的速度和千兆网卡IO性能都不错。
传输完成后,在PC上就得到了emmc.img这个文件。接下来要使用loop来挂载它并用Gparted编辑。鉴于这是一个含有多个分区的块设备镜像,所以使用partx
来挂载到loop,这样可以自动生成分区的块设备。在PC上执行以下命令
1 2 |
sudo partx -a emmc.img |
然后看到系统输出自动分配了loop3设备和loop3p1, loop3p2, loop3p3设备
接下来就是使用Gparted
来操作磁盘了。注意平时直接运行的Gparted是不在磁盘列表中现实loop设备的,所以我们通过命令行来直接运行Gparted强制制定设备
1 2 |
sudo gparted /dev/loop2 |
然后出现了熟悉的图形界面。接下来手工点击第三个分区,选择调整大小,在前部空出100M的空间。再点击第二个分区选择调整大小,向后平移100M。选择执行。
然后注意首个分区是fat16格式,所以不支持大小自动扩充。所以我们先挂载并拷贝出内容,再使用Gparted扩充分区并重新格式化到fat16再拷贝回来。这样我们就调整好了分区。看看最后的结果
1 2 3 4 5 6 7 8 9 10 11 12 13 |
root@h3:~/flash# fdisk -l /dev/loop3 Disk /dev/loop3:7.3 GiB,7818182656 字节,15269888 个扇区 单元:扇区 / 1 * 512 = 512 字节 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0xcd32eff2 设备 启动 起点 末尾 扇区 大小 Id 类型 /dev/loop3p1 49152 335871 286720 140M 6 FAT16 /dev/loop3p2 335872 2793471 2457600 1.2G 83 Linux /dev/loop3p3 2793472 15269887 12476416 6G 83 Linux |
这样分区就调整完毕,接下来需要取消挂载并传输写入回去。执行以下命令取消挂载
1 2 |
sudo partx -d /dev/loop3 |
这样挂载的loop文件就删除了,我们可以安全的传输emmc.img。在PC上运行以下命令准备传输
1 2 |
dd if=emmc.img of=/dev/stdout bs=1M | nc -l 9995 |
然后在NanoPi-R1
上执行以下命令接收并写入到emmc
1 2 |
busybox nc [PC的IP] 9995 | dd if=/dev/stdin of=/dev/mmcblk1 bs=1M |
按回车执行。查看写入速度基本也有240mbps~280mbps,还是很快~等待几分钟后写入完毕,关闭设备,拔出TF卡,重新上电启动。可以看到启动后/boot
分区有140M了。操作成功完成。
升级
然后执行sudo do-release-upgrade
,等待和输入一些信息后,升级完成。重启NanoPi-R1
,显示出了登陆提示已经是Ubuntu 18.04了~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ ssh pi@192.168.***.*** pi@192.168.***.***'s password: _____ _ _ _ _____ _ _____ ____ | ___| __(_) ___ _ __ __| | |_ _| ____| | | ____/ ___| | |_ | '__| |/ _ \ '_ \ / _` | | | | | _| | | | _|| | | _|| | | | __/ | | | (_| | | |_| | |___| |___| |__| |___ |_| |_| |_|\___|_| |_|\__,_|_|\__, |_____|_____|_____\____| |___/ Welcome to Ubuntu 18.04.2 LTS 4.14.111 System load: 0.30 Up time: 29 sec Local users: 2 Memory usage: 6 % of 1001Mb IP: 192.168.***.*** CPU temp: 45°C Usage of /: 28% of 5.8G * Documentation: http://wiki.friendlyarm.com/Ubuntu * Forum: http://www.friendlyarm.com/Forum/ Last login: Thu Jun 20 03:42:46 2019 pi@NanoPi-R1:~$ |
大功告成