阅前须知
本文为踩坑记录,可能会有错误,且并未写完,暂时无法刷入启动,仅作参考。
如有大佬能帮忙看看我错在哪里,鄙人感激不尽
前言
最近在b站看到了一些折腾随身WiFi的视频,感觉手痒痒,就在pdd下单了一个9.5¥的随身WiFi,下单前跟客服确认了CPU是骁龙410(只有410能刷机成真Linux系统)到手后发现是512MB RAM+4G ROM的配置,这个配置虽说有些极限,但是跑个Linux做服务器还是绰绰有余。于是,折腾开始!
刷机
备份
俗话说刷机千万条,备份第一条。到手咱们先给机器来个全盘备份。拆开塑料外壳可以看到机器的具体型号和reset键。
可以看到我这款是UFI103S
系列的,对于这款机器,按住reset键上电就是9008模式,非常方便。
备份很简单,使用MIKO全量备份工具读取全盘数据就ok。
可以按照我的标点一步一步来哈,备份出来.img或者.bin都可以,是一样的,只是拓展名不同。
救砖也一个道理,9008+MIKO
社区刷机包
一般来说,常见的型号都会有别人制作好的刷机包,酷安就有很多,目前我看到的有Debian,Ubuntu和Arch。
这些刷机包往往会有一键刷入脚本,也会标注root用户的密码和连接的ip。具体刷入步骤就不赘述了。
可惜的是,我没有看到内核较新的Arch刷机包,那么就只能自己编译一个了。
编译Arch
源码处理
在GitHub搜索可以得知,针对这款CPU有一个主线Linux仓库,msm8916-mainline/linux我们选择其中的msm8916/6.6
分支,因为这个分支是稳定版。分支名前面有wip
字样的是开发版,不建议使用。(我这里6.6版本编译不过,6.10可以)
可以直接下载.zip的压缩包,我们不作开发使用,没必要克隆仓库。(如果下载.zip会导致符号链接全炸)
克隆仓库,打开终端输入git clone https://github.com/msm8916-mainline/linux.git --depth=1
很明显,对于这样一颗很有潜力的CPU,只跑到1GHz有些浪费性能了,所以我们先进行超频处理。(酌情超频,我最后稳定使用的版本没有超频)
打开linux/drivers/clk/qcom/a53-pll.c
文件,修改25行左右。大概是每提升200Mhz增加10电压值。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
static const struct pll_freq_tbl a53pll_freq[] = {
{ 998400000, 52, 0x0, 0x1, 0 },
{ 1094400000, 57, 0x0, 0x1, 0 },
{ 1152000000, 62, 0x0, 0x1, 0 },
{ 1209600000, 63, 0x0, 0x1, 0 },
{ 1248000000, 65, 0x0, 0x1, 0 },
{ 1363200000, 71, 0x0, 0x1, 0 },
{ 1401600000, 73, 0x0, 0x1, 0 },
{ 1621600000, 84, 0x0, 0x1, 0 },
{ 1841600000, 96, 0x0, 0x1, 0 },
{ 1951600000, 103, 0x0, 0x1, 0 },
{ }
};
|
然后打开linux/arch/arm64/boot/dts/qcom/msm8916.dtsi
修改大概240行的代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
opp-1363200000 {
opp-hz = /bits/ 64 <1363200000>;
};
opp-1401600000 {
opp-hz = /bits/ 64 <1401600000>;
};
opp-1621600000 {
opp-hz = /bits/ 64 <1621600000>;
};
opp-1841600000 {
opp-hz = /bits/ 64 <1841600000>;
};
opp-1951600000 {
opp-hz = /bits/ 64 <1951600000>;
};
|
这样就完成了超频的配置了,如果刷上去开不了机,可能是CPU体质不行,可以删掉这些代码重新编译。
编译环境的配置
本人的编译环境是Manjaro+6.11内核,不清楚内核版本是否影响编译。(补充:后来使用manjaro成功编译了,应该是依赖没装全)
建议使用Ubuntu,版本不详,但是我24.04成功编译。
安装依赖:
1
|
sudo apt install binfmt-support qemu-user-static gcc-14-aarch64-linux-gnu kernel-package fakeroot mkbootimg bison flex gcc-aarch64-linux-gnu pkg-config libncurses-dev libssl-dev unzip git
|
以上依赖全都要装,少装一个就编译不出来
开始编译
然后来到linux文件夹下,打开终端
1
2
3
4
5
6
7
8
9
|
cd linux
export CROSS_COMPILE=aarch64-linux-gnu-
export ARCH=arm64
make msm8916_defconfig
make menuconfig
|
然后就能看到一个UI,你可以在这里调整内核设置,或者保持默认
调整好了就可以编译了make -j$(nproc)
,j后面的数字换成你的CPU核心数。
处理Arch的镜像
等待编译完成,然后就可以处理Arch Linux的镜像了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
cd ..
wget http://os.archlinuxarm.org/os/ArchLinuxARM-aarch64-latest.tar.gz
# 下载慢可以使用国内镜像 https://mirrors.tuna.tsinghua.edu.cn/archlinuxarm/os/ArchLinuxARM-aarch64-latest.tar.gz
dd if=/dev/zero of=archlinux.img bs=1G count=3
mkfs.btrfs archlinux.img #可选,前提是你开启了Btrfs支持,否则:mkfs.ext4 archlinux.img
mkdir arch
sudo mount archlinux.img arch
cd arch
sudo tar -xpvf ../ArchLinuxARM-aarch64-latest.tar.gz
|
等待解压完成,然后就可以进入chroot环境来修改系统了。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
cd ..
sudo mount --bind /dev arch/dev
sudo mount -t devpts devpts arch/dev/pts -o gid=5,mode=620
sudo mount -t proc proc arch/proc
sudo mount -t sysfs sysfs arch/sys
sudo mount -t tmpfs tmpfs arch/run
sudo rm -rf arch/etc/resolv.conf && sudo cp /etc/resolv.conf arch/etc/
|
然后需要进入chroot环境
1
2
3
4
5
6
7
|
sudo apt-get install qemu-user-static
sudo apt-get install qemu-user-binfmt
sudo update-binfmts --enable
sudo chroot arch
|
注:这里我的WSL是进不去的,但是Manjaro可以,不知道是不是因为WSL环境特殊
成功的话,可以运行一下pacman -V
然后可以刷新pacman的密钥
1
2
3
|
pacman-key --init
pacman-key --populate archlinuxarm
|
给pacman换源
1
2
3
|
nano /etc/pacman.d/mirrorlist
添加:Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxarm/$arch/$repo
|
更新一下系统,执行pacman -Syyu
(很慢,倒杯水去)
删除旧的内核,执行pacman -R linux-aarch64
退出chroot环境,按Ctrl+D
到编译环境,即linux环境。
1
2
3
|
sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=~/workspace/arch modules_install
sudo make ARCH=arm64 INSTALL_PATH=~/workspace/arch/boot install
|
sudo不能删,然后INSTALL_MOD_PATH和INSTALL_PATH按照你的arch文件夹路径修改,要使用绝对路径!
全部安装完成后,应该会提示Installing normal kernel
然后就正常优化系统,记得创建用户和安装必要包。
进入chroot,生成initrd.img
1
2
3
4
5
6
7
|
s /usr/lib/modules
#获取内核版本,然后在下面换成你自己克隆到的分支的版本
#下条命令以6.10作为例子(6.10.0-msm8916-gde069afffb30)
mkinitcpio --generate /boot/initrd.img-6.10.0-msm8916-gde069afffb30 --kernel 6.10.0-msm8916-gde069afffb30
sudo cp arch/boot/initrd.img-6.10.0-msm8916-gde069afffb30 /disk1 # 这里拷贝出来的路径可以自定义,但是要记得放哪了,要用
|
退出chroot,打包设备镜像
1
2
3
4
5
6
7
8
|
sudo umount arch/run
sudo umount arch/sys
sudo umount arch/proc
sudo umount arch/dev/pts
sudo umount arch/dev
sudo umount arch
#如果卸载不掉可以加上-l参数
|
请确定你完成了上面的步骤
打包镜像
然后新建一个文件夹,用来整理这些产物
这里应该包含:
1
2
3
4
5
6
7
|
1.archlinux.img # arch的系统镜像
2.UFI103.dtb # 随身WiFi的设备树
3.Image.gz # 编译产物,应该在 workspace/linux/arch/arm64/boot/ 里
4.initrd.img-6.10.0-msm8916-gde069afffb30 # 见上文,需改名为initrd.img
|
这里需要转换img文件,安装android-sdk-libsparse-utils
1
2
3
4
5
6
7
8
9
10
11
12
13
|
sudo apt install android-sdk-libsparse-utils
img2simg archlinux.img rootfs.img
cat Image.gz UFI103.dtb>ufi103-kernel-dtb
mkbootimg --base 0x80000000 --kernel_offset 0x00080000 --ramdisk_offset 0x02000000 --tags_offset 0x01e00000 --pagesize 2048 --second_offset 0x00f00000 --ramdisk initrd.img --cmdline "earlycon root=PARTUUID=a7ab80e8-e9d1-e8cd-f157-93f69b1d141e console=ttyMSM0,115200 no_framebuffer=true rw" --kernel ufi103-kernel-dtb -o ufi103-boot.img
# 这上面的命令需要按需修改,不要照抄
# 如果提示ModuleNotFoundError: No module named 'gki'
# 可以 sudo nano /usr/bin/mkbootimg
# 注释from gki.generate_gki_certificate import generate_gki_certificate这一行
|
然后就可以拷贝此文件夹下的rootfs.img和ufi103-boot.img
来刷入了。
寄了
上电无反应,寄了,等有时间修。