Featured image of post 随身WiFi踩坑折腾记(一)

随身WiFi踩坑折腾记(一)

阅前须知

本文为踩坑记录,可能会有错误,且并未写完,暂时无法刷入启动,仅作参考。

如有大佬能帮忙看看我错在哪里,鄙人感激不尽

前言

最近在b站看到了一些折腾随身WiFi的视频,感觉手痒痒,就在pdd下单了一个9.5¥的随身WiFi,下单前跟客服确认了CPU是骁龙410(只有410能刷机成Linux系统)到手后发现是512MB RAM+4G ROM的配置,这个配置虽说有些极限,但是跑个Linux做服务器还是绰绰有余。于是,折腾开始!

刷机

备份

俗话说刷机千万条,备份第一条。到手咱们先给机器来个全盘备份。拆开塑料外壳可以看到机器的具体型号和reset键。

随身WiFi的pcb

可以看到我这款是UFI103S系列的,对于这款机器,按住reset键上电就是9008模式,非常方便。

9008

备份很简单,使用MIKO全量备份工具读取全盘数据就ok。

MIKO备份

可以按照我的标点一步一步来哈,备份出来.img或者.bin都可以,是一样的,只是拓展名不同。

救砖也一个道理,9008+MIKO

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电压值。

a53-pll修改

 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行的代码。

msm8916-dtsi修改

 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,你可以在这里调整内核设置,或者保持默认

menuconfig

调整好了就可以编译了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

chroot成功

然后可以刷新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参数

请确定你完成了上面的步骤

打包镜像

然后新建一个文件夹,用来整理这些产物

output文件夹

这里应该包含:

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来刷入了。

寄了

上电无反应,寄了,等有时间修。

Have a try!
使用 Hugo 构建
主题 StackJimmy 设计
本博客已稳定运行