调整Asahi Linux根文件系统大小
我在拿到公司分配的 Apple ARM架构芯片M1 Pro 的MacBook Pro笔记本之后,终于有机会尝试在高性能ARM电脑上实践自己梦想已久的 移动云计算构建 。
Asahi Linux磁盘分区
然而,第一次使用 Asahi Linux 系统,并不熟悉安装过程,仅仅跟随安装提示指引默认安装。确实 安装Asahi Linux 非常简单,但是安装完我才意识到安装程序是收缩了 macOS 的系统磁盘分区,然后把空出来的磁盘几乎全部空间都用于 Asahi Llinux的根目录:
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
磁盘默认挂载如下:
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 存储,实现虚拟化的分布式文件系统
这一切的构想都需要重新划分Asahi Linux的根分区,空出足够的空间来构建 ZFS 存储卷
规划
由于EXT4文件系统 不支持在线收缩 收缩EXT4文件系统 ,所以对于上述根文件系统,我准备:
采用 通过tar备份和恢复Linux系统 ,先对整个系统tar包备份并复制到其他主机上保存
采用外接U盘启动一个Linux系统,然后将Asahi Linux的根分区
/dev/nvme0n1p5
删除,再重新划分为3个分区(分别用于 恢复Asahi Linux系统分区 / Docker / Libvirt虚拟机管理器 )然后通过备份的tar包恢复Asahi Linux系统分区
备份
默认情况下
/var/cache
目录会缓存大量的下载安装文件,这个可以清理掉降低备份占用空间( 参考 The Recommended Way To Clean The Package Cache In Arch Linux ):pacman -Scc
在根目录下对整个系统进行备份:
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
...
删除
/dev/nvme0n1p4
和/dev/nvme0n1p5
之后,内置 NVMe存储 磁盘空出了387.13GB
空间,从Disk Utilites
可以看到:
但是删除以后,实际上长按电源键启动还会看到 Asahi Linux 启动选贤,这是因为 /dev/nvme0n1p3
分区还存在,这个分区实际上是 Asahi Linux
的启动分区。这点从 Disk Utilites 工具可以看到,Linux分区删后已经有空闲磁盘空间,但是还有一个标记为 Asahi Linux
的分区存在:
再删除掉 Asahi Linux启动分区
之后,才真正完全清理了Asahi Linux,然后才能配置 macOS平台使用extFS读写Linux的EXT文件系统 工具的内核加载(需要变更 macOS 安全策略允许加载第三方内核模块)