.. _resize_asahi_linux_rootfs:
================================
调整Asahi Linux根文件系统大小
================================
我在拿到公司分配的 :ref:`apple_silicon_m1_pro` 的MacBook Pro笔记本之后,终于有机会尝试在高性能ARM电脑上实践自己梦想已久的 :ref:`mobile_cloud` 。
Asahi Linux磁盘分区
======================
然而,第一次使用 Asahi Linux 系统,并不熟悉安装过程,仅仅跟随安装提示指引默认安装。确实 :ref:`install_asahi_linux` 非常简单,但是安装完我才意识到安装程序是收缩了 :ref:`macos` 的系统磁盘分区,然后把空出来的磁盘几乎全部空间都用于 Asahi Llinux的根目录:
.. literalinclude:: resize_asahi_linux_rootfs/asahi_linux_default_fdisk
:language: bash
:caption: Asahi Linux默认磁盘分区情况
:emphasize-lines: 13-14
磁盘默认挂载如下:
.. literalinclude:: resize_asahi_linux_rootfs/asahi_linux_default_df
:language: bash
:caption: Asahi Linux默认磁盘分区挂载
:emphasize-lines: 4,7
.. note::
实际上Asahi Linux安装过程中是有一个选择磁盘分区大小的,当时我忽略了使用了MAX,即完全占用整个空闲磁盘。所以才带来本文的需要解决的问题
这里就存在一个困扰,我不希望将 :ref:`mobile_cloud` 构建在一个简陋的文件系统之上。在我的规划中:
- 采用 :ref:`zfs` 构建功能强大的卷管理: 不浪费任何磁盘空间(动态划分卷),高性能和高稳定性,并且是企业级大规模存储的基础技术
- 在独立的卷管理上构建 :ref:`libvirt` 存储,具有清晰型和稳定性
- 虚拟机内部构建 :ref:`ceph` 存储,实现虚拟化的分布式文件系统
这一切的构想都需要重新划分Asahi Linux的根分区,空出足够的空间来构建 :ref:`zfs` 存储卷
规划
=======
由于EXT4文件系统 **不支持在线收缩** :ref:`shrink_ext4_fs` ,所以对于上述根文件系统,我准备:
- 采用 :ref:`recover_system_by_tar` ,先对整个系统tar包备份并复制到其他主机上保存
- 采用外接U盘启动一个Linux系统,然后将Asahi Linux的根分区 ``/dev/nvme0n1p5`` 删除,再重新划分为3个分区(分别用于 恢复Asahi Linux系统分区 / :ref:`docker` / :ref:`libvirt` )
- 然后通过备份的tar包恢复Asahi Linux系统分区
备份
=====
- 默认情况下 ``/var/cache`` 目录会缓存大量的下载安装文件,这个可以清理掉降低备份占用空间( 参考 `The Recommended Way To Clean The Package Cache In Arch Linux `_ )::
pacman -Scc
- 在根目录下对整个系统进行备份:
.. literalinclude:: ../ubuntu_linux/admin/recover_system_by_tar/tar_backup
:language: bash
.. note::
遇到一个困难,如何能够通过U盘启动运行一个能够识别nvme的Linux?
我尝试了一下TF卡转USB读卡器,发现无法通过读卡器读取TF卡(不识别),这让我有些困扰
在线调整ext4根分区(失败)
===========================
.. warning::
我尝试参考 `How to resize ext4 root partition live without umount on Linux `_ 实际失败 **请勿按照本段落操作**
.. warning::
虽然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
========================
.. note::
没有进行,原因是分区破坏后,没有找到通过外部U盘启动的方法。并且我最后安装了 :ref:`extfs` 不能在存在Asahi Linux的分区存在情况下加载内核模块,所以我最后删除了Asahi Linux分区,然后重新 :ref:`install_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
...
.. figure:: ../../_static/linux/asahi_linux/asahi_linux_volumes.png
:scale: 70
在Disk Utility中可以看到Asahi Linux卷下有2个分区,分别对应p4和p4数据分区
- 删除 ``/dev/nvme0n1p4`` 和 ``/dev/nvme0n1p5`` 之后,内置 :ref:`nvme` 磁盘空出了 ``387.13GB`` 空间,从 ``Disk Utilites`` 可以看到:
.. figure:: ../../_static/linux/asahi_linux/asahi_linux_free.png
:scale: 70
删除了Asahi Linux的2个分区之后空闲空间
但是删除以后,实际上长按电源键启动还会看到 Asahi Linux 启动选贤,这是因为 ``/dev/nvme0n1p3`` 分区还存在,这个分区实际上是 ``Asahi Linux`` 的启动分区。这点从 Disk Utilites 工具可以看到,Linux分区删后已经有空闲磁盘空间,但是还有一个标记为 ``Asahi Linux`` 的分区存在:
.. figure:: ../../_static/linux/asahi_linux/asahi_linux_partition.png
:scale: 70
删除Asahi Linux的2个分区后还有一个Asahi Linux启动分区
再删除掉 ``Asahi Linux启动分区`` 之后,才真正完全清理了Asahi Linux,然后才能配置 :ref:`extfs` 工具的内核加载(需要变更 :ref:`macos` 安全策略允许加载第三方内核模块)
参考
======
- `How should I remove Asahi? #76 `_