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 分区。
至此 deepin 深度操作系统便被成功移植至随身WiFi上,这台曾经局限于联网功能的小设备已成功化身为可随身携带的 Linux 开发平台。
参考资源:
高通410 随身WIFI刷入Debian系统(玩法合集)https://sswifi.net/tutorial/2-410-wifidebian.html
我的4g网卡运行着GNU/Linuxhttps://blog.csdn.net/github_38345754/article/details/121462292
lk2ndhttps://github.com/OpenStick/lk2nd
原文地址:https://bbs.deepin.org/post/286546