Yuhang Zheng

ubuntu22.04中发现的两个好用服务

N 人看过

目前在做RK3588的Ubuntu22.04的系统移植工作的时候,发现了Github上一个非常好的项目https://github.com/Joshua-Riek/ubuntu-rockchip

目前我也是在基于这个项目上的代码再做开发,今天的文章不再多说这些,主要是分享在移植过程中看到的两个比较好用的服务。

一个是开机之后自动调整串口的窗口大小的resize.sh

image-20230828171313945

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

image-20230828172714023

如果有需要的话可以参照着这个放到自己的文件系统上去,但是需要注意的是自动扩展文件系统分区的这个脚本有坑。

先看一下它原本的内容:

#!/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改变,也就是下面这张图中选中的部分

image-20230828182015690

如果你的文件系统启动时是根据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命令而已……