随身WiFi玩转系统移植!deepin + 高通骁龙410实战全记录

1.导出eMMC数据

在设备开发与维护场景中,获取主线内核设备树的最佳参考源是原厂固件包内 boot.img 搭载的原始设备树文件。
为分析整个系统,我们首先需要备份 eMMC 存储芯片各个分区的数据,最直观的实现方案是通过安卓 Shell 终端,利用 dd 命令将各个分区逐一生成镜像文件。
此处我们使用基于 Python3 实现的高通 EDL 模式编程器,只需进入 EDL 模式,即可通过该工具实现分区擦除、烧写、导出等操作。具体操作步骤如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 这里用 ubuntu22 进行安装,借助 distrobox
sudo apt install adb fastboot python3-dev python3-pip python3-venv liblzma-dev git udev

git clone --depth=1 https://github.com/bkerler/edl.git
cd edl
git submodule update --init --recursive
pip3 install -r requirements.txt

chmod +x ./install-linux-edl-drivers.sh
bash ./install-linux-edl-drivers.sh
sudo python3 setup.py build
sudo pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
sudo python3 setup.py install

安装完成后,执行以下命令,可以看到 adb reboot edl 提示,随后切换另一个终端执行。导出的文件在 dumps 目录下。

1
2
3
4
5
6
7
8
9
╰─❯ edl rl dumps --skip=userdata --genxml
Qualcomm Sahara / Firehose Client V3.62 (c) B.Kerler 2018-2024.
main - Trying with no loader given ...
main - Waiting for the device
......
main - Hint: Press and hold vol up+dwn, connect usb. For some, only use vol up.
main - Xiaomi: Press and hold vol dwn + pwr, in fastboot mode connect usb.
Run "./fastpwn oem edl".
main - Other: Run "adb reboot edl".

随后我们需要判断设备 Secure Boot(安全启动)功能的状态:

  • 若Secure Boot(安全启动)未开启:引导程序、GPU 驱动、WiFi 等固件只需使用高通官方测试密钥重新签名,即可直接在设备上运行;
  • 若Secure Boot(安全启动)已开启:必须获取厂商密匙签名CPU才能启动我们自己的引导程序、设备固件。
    EDL 模式自带的诊断功能可直接查询 Secure Boot 状态:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ╰─❯ edl secureboot ─╯
    Qualcomm Sahara / Firehose Client V3.62 (c) B.Kerler 2018-2024.
    main - Trying with no loader given ...
    main - Waiting for the device
    main - Device detected :)
    main - Mode detected: firehose
    Sec_Boot0 PKHash-Index:0 OEM_PKHash: False Auth_Enabled: FalseUse_Serial: False
    Sec_Boot1 PKHash-Index:0 OEM_PKHash: False Auth_Enabled: FalseUse_Serial: False
    Sec_Boot2 PKHash-Index:0 OEM_PKHash: False Auth_Enabled: FalseUse_Serial: False
    Sec_Boot3 PKHash-Index:0 OEM_PKHash: False Auth_Enabled: FalseUse_Serial: False
    Secure boot disabled.
    可以看到此处显示Secure boot disabled,即secure boot没有开启。此时可以自由替换除WiFi和Modem校准数据之外所有分区的内容。

2.根文件系统制作

安装基础工具链

1
2
3
sudo apt update -y
sudo apt-get install -y qemu-user-static binfmt-support mmdebstrap arch-test usrmerge usr-is-merged
sudo systemctl restart systemd-binfmt

不同型号的设备可能有微小的区别,自行查找对应的资源,这里只替换资源里的 rootfs.img 镜像。

1
2
3
4
5
6
7
8
9
10
# 使用mmdebstrap创建基础系统(arm64架构)  
mkdir -p rootfs
sudo mmdebstrap \
--hook-dir=/usr/share/mmdebstrap/hooks/merged-usr \
--include="ca-certificates,locales,sudo,apt,adduser,polkitd,systemd,network-manager,dbus-daemon,apt-utils,bash-completion,curl,vim,bash,deepin-keyring,init,ssh,net-tools,iputils-ping,lshw,iproute2,iptables,procps,wpasupplicant,dmidecode,ntpsec-ntpdate,linux-firmware" \
--architectures=arm64 \
beige \
rootfs \
"deb https://community-packages.deepin.com/beige/ beige main commercial community" \
"deb https://proposed-packages.deepin.com/beige-testing/ unstable/25 main commercial community"

挂载 chroot

1
2
3
4
5
6
7
sudo mount -t tmpfs -o "size=99%" tmpfs rootfs/tmp
sudo mount -t tmpfs -o "size=99%" tmpfs rootfs/var/tmp
sudo mount -t proc chproc rootfs/proc
sudo mount -t sysfs chsys rootfs/sys
sudo mount --bind /dev rootfs/dev
sudo mount -t devpts devpts rootfs/dev/pts
sudo mount --bind /etc/resolv.conf rootfs/etc/resolv.conf

用户与本地化

1
2
3
4
5
6
7
8
9
10
11
12
13
(chroot) useradd  -s /bin/bash -m -g users deepin
(chroot) usermod -a -G sudo deepin
(chroot) chsh -s /bin/bash deepin
(chroot) echo root:deepin | chpasswd
(chroot) echo deepin:deepin | chpasswd
# 取消注释
(chroot) sed -i -E 's/#[[:space:]]*(en_US.UTF-8[[:space:]]+UTF-8)/\1/g' /etc/locale.gen
(chroot) sed -i -E 's/#[[:space:]]*(zh_CN.UTF-8[[:space:]]+UTF-8)/\1/g' /etc/locale.gen
# 生成语言设置
(chroot) locale-gen

# 设置本地上海时区
(chroot) ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

添加 adbd 服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
git clone https://github.com/HandsomeYingyan/android-tools.git

# 添加额外的软件包
sudo curl -L http://repo.mobian-project.org/mobian.gpg -o rootfs/etc/apt/trusted.gpg.d/mobian.gpg
echo "deb http://repo.mobian-project.org/ bookworm main non-free" | sudo tee rootfs/etc/apt/sources.list.d/mobian.list

sudo chroot rootfs bash

(chroot) apt update
(chroot) apt install mobian-tweaks-common mobile-usb-networking
(chroot) apt install make zlib1g-dev pkgconf libssl-dev
(chroot) cd android-tools
# 编译 adbd 服务
(chroot) make -f adbd.mk
(chroot) cp adbd /usr/bin/adbd

添加 gc 服务

1
2
3
4
5
6
7
8
9
10
11
# gc 的仓库,这里从原作者发布的Debian根文件系统里的直接拷贝
git clone https://github.com/HandsomeMod/gc.git

# libusbgx的动态库从这个仓库编译,这里从原作者发布的Debian根文件系统里的动态库直接拷贝
git clone https://github.com/linux-usb-gadgets/libusbgx.git

sudo chroot rootfs bash

(chroot) apt install libconfig9
# 测试下gc 命令
(chroot) gc

修改 mobile-usb-gadget 服务

1
2
#这里修改原本的 mobile-usb-gadget 脚本
sudo vim rootfs/usr/sbin/mobile-usb-gadget
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/bin/sh

CONFIGFS=/sys/kernel/config/usb_gadget/g1

setup() {
#echo host > /sys/kernel/debug/usb/ci_hdrc.0/role
# Remove All Gadgets If Gadget Exist
[ -d $CONFIGFS ] && gc -c

# Setiing Up Rndis
gc -a rndis
sleep 1

# Setting Up Adbd
gc -a ffs
mkdir -p /dev/usb-ffs/adb

# in offical version of gc name will be ffs.x
mount -t functionfs adb /dev/usb-ffs/adb

# Fire Up Adbd
adbd -D &
# (hack) wait adbd setup
sleep 1

# Enable Gadget
gc -e

}

reset() {
echo "Removing the USB gadget..."

# Remove USB gadget
if [ -d $CONFIGFS ]; then
echo "Removing gadget configuration..."
gc -c
fi
}

case "$1" in
reset) reset ;;
setup) setup ;;
*) ;;
esac

清除缓存

1
(chroot) apt clean && rm -rf /var/cache/apt/archives/*

转换镜像

1
2
3
4
5
6
7
# 这里把 openstick 提供的 rootfs.img 转化为 root.img
sudo apt install android-sdk-libsparse-utils
simg2img rootfs.img root.img

LOOP=$(sudo loestup -Pf --show root.img)
mkdir tmp
sudo mount $LOOP tmp

拷贝内核

这里不重新构建内核,用 openstick 提供的内核和boot.img。

1
2
3
4
# 拷贝内核和内核模块
sudo cp -a tmp/boot/* rootfs/boot
sudo mkdir rootfs/modules
sudo cp -a tmp/modules/5.15.0-handsomekernel+ rootfs/modules

拷贝固件

这里从原作者给出根文件系统拷贝 /lib/firmware/* 里的驱动到新制作的根文件系统。

1
sudo cp -a tmp/lib/firmware/* rootfs/lib/firmware

卸载设备

1
2
sudo umount -l rootfs tmp
sudo losetup -D

3.镜像制作

创建一个新磁盘,启动的磁盘已经写死到 boot.img 这里创建一个磁盘并设置原本的 UUID。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
dd if=/dev/zero of=root.img bs=1M count=1300
mkfs.ext4 -L rootfs -b 4096 root.img

# 这里不替换原本的boot.img 这里把新的磁盘镜像设置与原本的rootfs.img一样的UUID
tune2fs -U e92c62a7-390f-4edc-b36f-b71f931c5a21 root.img

LOOP=$(sudo losetup -Pf --show root.img)
mkdir root
sudo mount $LOOP root

# 拷贝前面创建的根文件系统
sudo cp -a rootfs/* root
sudo umount root
sudo losetup -d $LOOP

# 将 root.img 转换 rootfs.img
img2simg root.img rootfs.img

4.镜像烧录

WIFI网卡进入 fastboot 模式(插入设备使用 adb reboot bootloader)后,把 rootfs 重新刷入。

1
fastboot -S 200m flash rootfs rootfs.img

如果刷写错误可以按住 WIFI 网卡上的按键进入 edl 模式,使用前面的 edl 工具,刷 rootfs 分区。

1
edl w rootfs rootfs.img

至此 deepin 深度操作系统便被成功移植至随身WiFi上,这台曾经局限于联网功能的小设备已成功化身为可随身携带的 Linux 开发平台。

1.png


参考资源:

高通410 随身WIFI刷入Debian系统(玩法合集)
https://sswifi.net/tutorial/2-410-wifidebian.html

我的4g网卡运行着GNU/Linux
https://blog.csdn.net/github_38345754/article/details/121462292

lk2nd
https://github.com/OpenStick/lk2nd

OpenStick
https://www.kancloud.cn/handsomehacker/openstick/2636505

原文地址:
https://bbs.deepin.org/post/286546