目前在做RK3588的Ubuntu22.04的系统移植工作的时候,发现了Github上一个非常好的项目https://github.com/Joshua-Riek/ubuntu-rockchip
目前我也是在基于这个项目上的代码再做开发,今天的文章不再多说这些,主要是分享在移植过程中看到的两个比较好用的服务。
一个是开机之后自动调整串口的窗口大小的resize.sh

另一个是会在第一次启动时自动扩展文件系统分区的resize-filesystem.sh

如果有需要的话可以参照着这个放到自己的文件系统上去,但是需要注意的是自动扩展文件系统分区的这个脚本有坑。
先看一下它原本的内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #!/bin/bash
# Get the root partition partition_root="$(findmnt -n -o SOURCE /)" partition_name="$(lsblk -no name "${partition_root}")" partition_pkname="$(lsblk -no pkname "${partition_root}")" partition_num="$(echo "${partition_name}" | grep -Eo '[0-9]+$')"
# Get size of disk and root partition partition_start="$(cat /sys/block/${partition_pkname}/${partition_name}/start)" partition_end="$(( partition_start + $(cat /sys/block/${partition_pkname}/${partition_name}/size)))" partition_newend="$(( $(cat /sys/block/${partition_pkname}/size) - 8))"
# Resize partition and filesystem if [ "${partition_newend}" -gt "${partition_end}" ]; then sgdisk -e "/dev/${partition_pkname}" sgdisk -d "${partition_num}" "/dev/${partition_pkname}" sgdisk -N "${partition_num}" "/dev/${partition_pkname}" partprobe "/dev/${partition_pkname}" resize2fs "/dev/${partition_name}"
sync --file-system sync fi
systemctl disable resize-filesystem
|
可见它首先是找到了根文件系统挂载的分区,然后获取了根分区的一些信息:
1 2 3 4 5 6 7 8
| root@ok3588:~# findmnt -n -o SOURCE / /dev/mmcblk0p6 root@ok3588:~# lsblk -no name /dev/mmcblk0p6 mmcblk0p6 root@ok3588:~# lsblk -no pkname /dev/mmcblk0p6 mmcblk0 root@ok3588:~# echo mmcblk0p6 | grep -Eo '[0-9]+$' 6
|
然后得到了该分区的起始块的位置,分区的块大小,以及分区所属的emmc设备的总块大小:
1 2 3 4 5 6 7 8 9
| #该分区的起始块的位置 root@ok3588:~# cat /sys/block/mmcblk0/mmcblk0p6/start 491520 #分区的块大小 root@ok3588:~# cat /sys/block/mmcblk0/mmcblk0p6/size 29360128 #分区所属的emmc设备的总块大小 root@ok3588:~# echo $(( $(cat /sys/block/mmcblk0/size) - 8)) 60620792
|
这些信息也可以使用fdisk命令读取出来,结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| root@ok3588:~# fdisk -l /dev/mmcblk0 Disk /dev/mmcblk0: 28.91 GiB, 31037849600 bytes, 60620800 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: gpt Disk identifier: C7370000-0000-4254-8000-52D400004C25
Device Start End Sectors Size Type /dev/mmcblk0p1 16384 24575 8192 4M unknown /dev/mmcblk0p2 24576 32767 8192 4M unknown /dev/mmcblk0p3 32768 163839 131072 64M unknown /dev/mmcblk0p4 163840 425983 262144 128M unknown /dev/mmcblk0p5 425984 491519 65536 32M unknown /dev/mmcblk0p6 491520 29851647 29360128 14G unknown /dev/mmcblk0p7 29851648 30113791 262144 128M unknown /dev/mmcblk0p8 30113792 60620735 30506944 14.5G unknown
|
然后使用sgdisk命令对mmcblk0p6分区又重新进行的分区调整,最后使用resize2fs命令拓展了分区大小
这个坑就在于sgdisk命令,它使用-d参数删除了分区信息,又使用-N参数重新建立了分区,这个操作会导致分区的PARTUUID改变,也就是下面这张图中选中的部分

如果你的文件系统启动时是根据PARTUUID来寻找根文件系统的话,再次重启就会发现找不到文件系统了
1 2
| root@ok3588:~# cat /proc/cmdline storagemedia=emmc androidboot.storagemedia=emmc androidboot.mode=normal rw rootwait earlycon=uart8250,mmio32,0xfeb50000 console=ttyFIQ0 irqchip.gicv3_pseudo_nmi=0 root=PARTUUID=614e0000-0000
|
所以我最终的方法是修改了resize-filesystem.sh,去除了sgdisk的内容,改完文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #!/bin/bash
# Get the root partition partition_root="$(findmnt -n -o SOURCE /)" partition_userdata="$(findmnt -n -o SOURCE /userdata)" partition_name="$(lsblk -no name "${partition_root}")" partition_pkname="$(lsblk -no pkname "${partition_root}")" partition_num="$(echo "${partition_name}" | grep -Eo '[0-9]+$')"
# Get size of disk and root partition partition_start="$(cat /sys/block/${partition_pkname}/${partition_name}/start)" partition_end="$(( partition_start + $(cat /sys/block/${partition_pkname}/${partition_name}/size)))" partition_newend="$(( $(cat /sys/block/${partition_pkname}/size) - 8))"
# Resize partition and filesystem if [ "${partition_newend}" -gt "${partition_end}" ]; then # sgdisk -e "/dev/${partition_pkname}" # sgdisk -d "${partition_num}" "/dev/${partition_pkname}" # sgdisk -N "${partition_num}" "/dev/${partition_pkname}" # partprobe "/dev/${partition_pkname}" resize2fs "/dev/${partition_name}" resize2fs "${partition_userdata}"
sync --file-system sync fi
systemctl disable resize-filesystem
|
顺便把最后一个userdata分区也拓展了一下,其实最后有用的不过也是resize2fs命令而已……