[ Content contribution] 随身WiFi玩转系统移植!deepin + 高通骁龙410实战全记录 | 内附视频
Tofloor
poster avatar
deepin小助手
Super Moderator
OM
2025-04-23 11:15
Author

以用为本.png

你是否想过,掌心大小的随身 WiFi 设备,也能变身为功能完整的 Linux 开发平台?

本文将以 deepin 深度操作系统以及高通骁龙 410 处理器随身 WIFI 为例,为大家分享系统移植的使用思路与经验。感谢社区用户 @空木蓮華 的投稿及贡献。

导出eMMC数据

在设备开发与维护场景中,获取主线内核设备树的最佳参考源是原厂固件包内 boot.img 搭载的原始设备树文件。为分析整个系统,我们首先需要备份eMMC存储芯片各个分区的数据,最直观的实现方案是通过安卓 Shell 终端,利用 dd 命令将各个分区逐一生成镜像文件。

此处我们使用基于Python3 实现的高通EDL模式编程器,只需进入EDL模式,即可通过该工具实现分区擦除、烧写、导出等操作。具体操作步骤如下:

# 这里用 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 目录下。

╰─❯ 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 状态:

╰─❯ 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校准数据之外所有分区的内容。

根文件系统制作

安装基础工具链

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 镜像。

# 使用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

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

用户与本地化

(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 服务

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 服务

# 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 服务

#这里修改原本的 mobile-usb-gadget 脚本
sudo vim rootfs/usr/sbin/mobile-usb-gadget
#!/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

清除缓存

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

转换镜像

# 这里把 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。

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

拷贝固件

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

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

卸载设备

sudo umount -l rootfs tmp
sudo losetup -D

三、镜像制作

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

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

四、镜像烧录

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

fastboot -S 200m flash rootfs rootfs.img

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

edl w rootfs rootfs.img

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

image.png


以上便是在随身WiFi上移植 deepin 系统的全过程,本教程至此结束。

通过以上讲解,相信大家已经了解了系统磁盘镜像的制作过程。这里以 deepin 为例,如果需要其他发行版也可参考这一思路灵活修改。

再次感谢 @空木蓮華 的贡献及分享!若您在实践过程中遇到了任何问题,或者对我们的教程有任何建议,欢迎随时回帖与我们交流。

参考资源:

  1. 高通410 随身WIFI刷入Debian系统(玩法合集)

https://sswifi.net/tutorial/2-410-wifidebian.html

  1. 我的4g网卡运行着GNU/Linux

https://blog.csdn.net/github_38345754/article/details/121462292

  1. lk2nd

https://github.com/OpenStick/lk2nd

  1. OpenStick

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

查看原文:https://chenchongbiao.github.io/ExploreDeepinDev/system/system-porting/Qualcomm410.html

B站视频:【22元随身Wi-Fi 玩转系统移植!deepin + 高通骁龙410 实战全记录】

Reply Favorite View the author
All Replies
xye9008
deepin
2025-04-23 14:19
#1

牛掰。

Reply View the author
流星追月
deepin
2025-04-23 16:17
#2

再幸苦点,把deeoin23刷入华为P70手机中,看看能不能打通电话。

Reply View the author
出售星辰之书的书商
Moderator
2025-04-23 16:49
#3
流星追月

再幸苦点,把deeoin23刷入华为P70手机中,看看能不能打通电话。

首先你要说服华为放开BL锁权限joy

Reply View the author
晚秋(lateautumn)
Moderator
2025-04-23 18:00
#4

我这个大白,看都看不懂。绝对大咖applaud

Reply View the author