家里有部旧的红米 5A 手机,放着没啥用拿来刷成 Linux 玩一玩。没想到耗费了我很大的精力。

弯路

本来还是比较简单的一件事,因为一些不当操作导致了刷机失败,编译内核,查看 pmbootstrap 代码等等一系列操作。 开始我就给手机刷了新版本安卓,没想到固件跟 postmarketOS 开发者提供的内核不兼容。导致了内核无法启动。 fastboot boot boot.img 报错说 dtb not found。具体的一些问题可以看看 https://gitlab.com/postmarketOS/pmaports/-/issues/1848

简要介绍

刷机主要步骤如下:

  1. OEM 解锁
  2. 刷 recovery
  3. 电脑安装配置 pmbootstrap
  4. 生成并安装系统
  5. ssh 进入,配置系统

OEM 解锁

这里使用的是第三方开发的小米工具,官网 https://www.xiaomitool.com/V2/

java 编写的,三大主流系统都可以运行。

yay -S --needed xiaomitool-v2

手机端开启 USB 调试并在设备解锁状态里绑定帐号设备。

登录解锁工具解锁,注意选择地区。

刷入 recovery

下载地址 https://github.com/iusmac/recovery_rova/releases

我用的最新版 OrangeFox-R11.1_5

# 刷入
fastboot flash recovery OrangeFox-R11.1_5_FDE+FBE-Unofficial-rova.img
# 也可以直接启动
fastboot boot OrangeFox-R11.1_5_FDE+FBE-Unofficial-rova.img

注意不要进入 MIUI,否则 recovery 会被重置成官方版本

安装 pmbootstrap

其他系统及详情请查看 https://wiki.postmarketos.org/wiki/Installing_pmbootstrap

yay -S --needed pmbootstrap

安装完成之后初始化

pmbootstrap init

我的 ~/.config/pmbootstrap.cfg,主要是设备信息正确无误。

我修改了镜像源,中国访问加速。

[pmbootstrap]
aports = /home/light4/.local/var/pmbootstrap/cache_git/pmaports
ccache_size = 5G
is_default_channel = False
device = xiaomi-riva
extra_packages = neovim,git,curl
hostname =
build_pkgs_on_install = False
jobs = 17
kernel = stable
keymap =
locale = en_US.UTF-8
mirror_alpine = http://mirrors.tuna.tsinghua.edu.cn/alpine/
mirrors_postmarketos = http://mirrors.tuna.tsinghua.edu.cn/postmarketOS/
nonfree_firmware = True
nonfree_userland = True
ssh_keys = True
ssh_key_glob = ~/.ssh/id_*.pub
timezone = Asia/Shanghai
ui = gnome-mobile
ui_extras = False
user = light4
work = /home/light4/.local/var/pmbootstrap
boot_size = 512
extra_space = 0
sudo_timer = True
qemu_redir_stdio = False

[providers]

生成并安装系统

我选择了用 recovery 模式安装

https://wiki.postmarketos.org/wiki/Installation_from_recovery_mode

pmbootstrap install --android-recovery-zip
# 也可以选择安装到数据分区
pmbootstrap install --android-recovery-zip --recovery-install-partition=data

# 导出生成的系统,其实就是软链接到了 /tmp/postmarketOS-export/
pmbootstrap export

手机进入 recovery,并开启 adb sideload 模式

# adb sideload 安装具体的系统
adb sideload pmos-xiaomi-riva.zip

ssh 进入并配置系统

参考 WIKI:

# ssh 登录
ssh [email protected]

主要是配置 swap 和家目录

配置 swap

默认的 swapfile 在安装的系统分区并且大小为 1G。安装完系统分区就 100% 了。

# 关闭 swapfile
swapoff swapfile
# 删除文件
rm swapfile
# 使用 cache 分区
mkswap /dev/disk/by-partlabel/cache
# swapon
swapon /dev/disk/by-partlabel/cache

修改 /etc/fstab 自动挂载

# This file is *not* used to mount / or /boot.
# More information: https://postmarketos.org/fstab

/dev/disk/by-partlabel/cache    swap    swap    nofail  0 0
/root/swap                      swap    swap    nofail  0 0

更新服务

rc-update add swap

配置家目录

修改 /etc/fstab 自动挂载

# This file is *not* used to mount / or /boot.
# More information: https://postmarketos.org/fstab

/dev/disk/by-partlabel/cache    swap    swap    nofail    0      0
/root/swap                      swap    swap    nofail    0      0
/dev/disk/by-partlabel/userdata /home   ext4    noatime   0      2
# 挂载数据分区
mkdir -p /data
mount /dev/disk/by-partlabel/userdata /data
# 备份家目录
cp -a /home/light4 /data/
# 卸载
umount /data
# 删除系统分区家目录
rm -rf /home/light4
# 挂载新家目录
mount /dev/disk/by-partlabel/userdata /home
# 更新服务
rc-update add localmount default

其他

折腾的一个副产物: https://github.com/light4/gfd.sh 方便断点续传克隆 Git 仓库。

下载内核代码让人头大 😂。

小米 MIUI 正式版刷机包汇总

https://xiaomishequ.feishu.cn/sheets/shtcnsRTbwSvpUsaei6B04ogI6Z?sheet=bRyHnR

参考链接

  1. ArchWiki
  2. postmarketOS wiki
  3. gentoo wiki
  4. Debian wiki