ubuntu22.04中发现的两个好用服务
目前在做RK3588的Ubuntu22.04的系统移植工作的时候,发现了Github上一个非常好的项目https://github.com/Joshua-Riek/ubuntu-rockchip
目前我也是在基于这个项目上的代码再做开发,今天的文章不再多说这些,主要是分享在移植过程中看到的两个比较好用的服务。
一个是开机之后自动调整串口的窗口大小的resize.sh
另一个是会在第一次启动时自动扩展文件系统分区的resize-filesystem.sh
如果有需要的话可以参照着这个放到自己的文件系统上去,但是需要注意的是自动扩展文件系统分区的这个脚本有坑。
先看一下它原本的内容:
#!/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
可见它首先是找到了根文件系统挂载的分区,然后获取了根分区的一些信息:
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设备的总块大小:
#该分区的起始块的位置
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命令读取出来,结果如下:
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来寻找根文件系统的话,再次重启就会发现找不到文件系统了
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的内容,改完文件如下:
#!/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命令而已……