调整Asahi Linux根文件系统大小

我在拿到公司分配的 Apple ARM架构芯片M1 Pro 的MacBook Pro笔记本之后,终于有机会尝试在高性能ARM电脑上实践自己梦想已久的 移动云计算构建

Asahi Linux磁盘分区

然而,第一次使用 Asahi Linux 系统,并不熟悉安装过程,仅仅跟随安装提示指引默认安装。确实 安装Asahi Linux 非常简单,但是安装完我才意识到安装程序是收缩了 macOS 的系统磁盘分区,然后把空出来的磁盘几乎全部空间都用于 Asahi Llinux的根目录:

Asahi Linux默认磁盘分区情况
Disk /dev/nvme0n1: 465.92 GiB, 500277792768 bytes, 122138133 sectors
Disk model: APPLE SSD AP0512R                       
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 57706D35-0379-476A-8451-0C7205AE3150

Device             Start       End  Sectors   Size Type
/dev/nvme0n1p1         6    128005   128000   500M Apple Silicon boot
/dev/nvme0n1p2    128006  48407557 48279552 184.2G Apple APFS
/dev/nvme0n1p3  48407558  49017861   610304   2.3G Apple APFS
/dev/nvme0n1p4  49017862  49139973   122112   477M EFI System
/dev/nvme0n1p5  49139974 120827397 71687424 273.5G Linux filesystem
/dev/nvme0n1p6 120827419 122138127  1310709     5G Apple Silicon recovery


Disk /dev/nvme0n2: 3 MiB, 3145728 bytes, 768 sectors
Disk model: APPLE SSD AP0512R                       
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/nvme0n3: 128 MiB, 134217728 bytes, 32768 sectors
Disk model: APPLE SSD AP0512R                       
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes

磁盘默认挂载如下:

Asahi Linux默认磁盘分区挂载
Filesystem      Size  Used Avail Use% Mounted on
dev              16G     0   16G   0% /dev
run              16G  5.3M   16G   1% /run
/dev/nvme0n1p5  270G  7.0G  252G   3% /
tmpfs            16G   65M   16G   1% /dev/shm
tmpfs            16G     0   16G   0% /tmp
/dev/nvme0n1p4  476M   57M  420M  12% /boot/efi
tmpfs           3.2G   30M  3.1G   1% /run/user/502

备注

实际上Asahi Linux安装过程中是有一个选择磁盘分区大小的,当时我忽略了使用了MAX,即完全占用整个空闲磁盘。所以才带来本文的需要解决的问题

这里就存在一个困扰,我不希望将 移动云计算构建 构建在一个简陋的文件系统之上。在我的规划中:

  • 采用 ZFS 构建功能强大的卷管理: 不浪费任何磁盘空间(动态划分卷),高性能和高稳定性,并且是企业级大规模存储的基础技术

  • 在独立的卷管理上构建 Libvirt虚拟机管理器 存储,具有清晰型和稳定性

  • 虚拟机内部构建 Ceph Atlas 存储,实现虚拟化的分布式文件系统

这一切的构想都需要重新划分Asahi Linux的根分区,空出足够的空间来构建 ZFS 存储卷

规划

由于EXT4文件系统 不支持在线收缩 resize_ext4_rootfs ,所以对于上述根文件系统,我准备:

  • 采用 通过tar备份和恢复Linux系统 ,先对整个系统tar包备份并复制到其他主机上保存

  • 采用外接U盘启动一个Linux系统,然后将Asahi Linux的根分区 /dev/nvme0n1p5 删除,再重新划分为3个分区(分别用于 恢复Asahi Linux系统分区 / Docker Atlas / Libvirt虚拟机管理器 )

  • 然后通过备份的tar包恢复Asahi Linux系统分区

备份

cd /
tar -cvpzf backup.tar.gz --exclude=/backup.tar.gz --exclude=/home/huatai/Dropbox \
  --exclude=/var/cache --exclude=/home/huatai/.cache \
  --one-file-system /

备注

遇到一个困难,如何能够通过U盘启动运行一个能够识别nvme的Linux?

我尝试了一下TF卡转USB读卡器,发现无法通过读卡器读取TF卡(不识别),这让我有些困扰

在线调整ext4根分区(失败)

警告

我尝试参考 How to resize ext4 root partition live without umount on Linux 实际失败 请勿按照本段落操作

警告

虽然EXT4文件系统不支持在线收缩,所以通常通过备份恢复方式来更改分区大小。但是,理论上只要数据写磁盘没有超过shrink后的磁盘分区,是可以直接修改分区结尾部分来调整分区大小的。

高危操作,一定要确保数据备份。我的实践环境没有重要数据,所以这样操作

  • 前面已经检查过根文件分区:

    /dev/nvme0n1p5  49139974 120827397 71687424 273.5G Linux filesystem
    

现在删除掉这个分区,然后重新创建分区,只要确保起始扇区不变,同时结束扇区有足够空间容纳现有数据就可以

  • 磁盘操作:

    fdisk /dev/nvme0n1
    

完整过程:

Welcome to fdisk (util-linux 2.38.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

This disk is currently in use - repartitioning is probably a bad idea.
It's recommended to umount all file systems, and swapoff all swap
partitions on this disk.


Command (m for help): d
Partition number (1-6, default 6): 5

Partition 5 has been deleted.

Command (m for help): p
Disk /dev/nvme0n1: 465.92 GiB, 500277792768 bytes, 122138133 sectors
Disk model: APPLE SSD AP0512R
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 57706D35-0379-476A-8451-0C7205AE3150

Device             Start       End  Sectors   Size Type
/dev/nvme0n1p1         6    128005   128000   500M Apple Silicon boot
/dev/nvme0n1p2    128006  48407557 48279552 184.2G Apple APFS
/dev/nvme0n1p3  48407558  49017861   610304   2.3G Apple APFS
/dev/nvme0n1p4  49017862  49139973   122112   477M EFI System
/dev/nvme0n1p6 120827419 122138127  1310709     5G Apple Silicon recovery

Command (m for help): n
Partition number (5,7-128, default 5):
First sector (49139974-120827418, default 49140224): 49139974
Last sector, +/-sectors or +/-size{K,M,G,T,P} (49139974-120827418, default 120827418): +32G

Created a new partition 5 of type 'Linux filesystem' and of size 32 GiB.
Partition #5 contains a ext4 signature.

Do you want to remove the signature? [Y]es/[N]o: N

Command (m for help): p

Disk /dev/nvme0n1: 465.92 GiB, 500277792768 bytes, 122138133 sectors
Disk model: APPLE SSD AP0512R
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 57706D35-0379-476A-8451-0C7205AE3150

Device             Start       End  Sectors   Size Type
/dev/nvme0n1p1         6    128005   128000   500M Apple Silicon boot
/dev/nvme0n1p2    128006  48407557 48279552 184.2G Apple APFS
/dev/nvme0n1p3  48407558  49017861   610304   2.3G Apple APFS
/dev/nvme0n1p4  49017862  49139973   122112   477M EFI System
/dev/nvme0n1p5  49139974  57528575  8388602    32G Linux filesystem
/dev/nvme0n1p6 120827419 122138127  1310709     5G Apple Silicon recovery

Command (m for help): w
The partition table has been altered.
Syncing disks.
  • 强制操作系统重启时进行fsck:

    touch /forcefsck
    
  • 但是重启以后终端提示:

    Loading Linux linux-asahi ...
    error: attempt to read or write outside of partition.
    Loading initial ramdisk ...
    error: you need to load the kernel first.
    
    Press any key to continue...
    

我尝试按 e 修订grub启动内核参数添加 fsck.mode=force 但是依然失败

放弃,还是老老实实从备份恢复

从备份恢复Asahi Linux

备注

没有进行,原因是分区破坏后,没有找到通过外部U盘启动的方法。并且我最后安装了 macOS平台使用extFS读写Linux的EXT文件系统 不能在存在Asahi Linux的分区存在情况下加载内核模块,所以我最后删除了Asahi Linux分区,然后重新 安装Asahi Linux

Asahi Linux分区删除

Asahi Linux提供了一个卸载脚本:

curl -L https://alx.sh/wipe-linux | sh

从脚本中可以单独执行命令(我的实际操作方法)来删除Linux分区:

diskutil list | grep Apple_APFS | grep '\b2\.5 GB' | sed 's/.* //g' | while read i; do
    echo "diskutil apfs deleteContainer $i"
done
diskutil list /dev/disk0 | grep -Ei 'asahi|linux|EFI' | sed 's/.* //g' | while read i; do
    echo "diskutil eraseVolume free free $i"
done

需要注意,删除掉2个Linux分区(p4和p5):

Device             Start       End  Sectors   Size Type
...
/dev/nvme0n1p3  48407558  49017861   610304   2.3G Apple APFS
/dev/nvme0n1p4  49017862  49139973   122112   477M EFI System
/dev/nvme0n1p5  49139974 120827397 71687424 273.5G Linux filesystem
...
../../_images/asahi_linux_volumes.png

在Disk Utility中可以看到Asahi Linux卷下有2个分区,分别对应p4和p4数据分区

  • 删除 /dev/nvme0n1p4/dev/nvme0n1p5 之后,内置 NVMe存储 磁盘空出了 387.13GB 空间,从 Disk Utilites 可以看到:

../../_images/asahi_linux_free.png

删除了Asahi Linux的2个分区之后空闲空间

但是删除以后,实际上长按电源键启动还会看到 Asahi Linux 启动选贤,这是因为 /dev/nvme0n1p3 分区还存在,这个分区实际上是 Asahi Linux 的启动分区。这点从 Disk Utilites 工具可以看到,Linux分区删后已经有空闲磁盘空间,但是还有一个标记为 Asahi Linux 的分区存在:

../../_images/asahi_linux_partition.png

删除Asahi Linux的2个分区后还有一个Asahi Linux启动分区

再删除掉 Asahi Linux启动分区 之后,才真正完全清理了Asahi Linux,然后才能配置 macOS平台使用extFS读写Linux的EXT文件系统 工具的内核加载(需要变更 macOS 安全策略允许加载第三方内核模块)

参考