该页面正在持续更新中!!!您可以在左侧找到最后编辑的时间。
这个wiki页面旨在为有经验的 Linux 用户提供自行配置系统的指导!
我们在这里只提供了 Arch Linux 安装的演示。您可能需要根据其他 Linux 发行版的安装情况进行适应。
如果您对了解这台机器上 Linux 的工作原理感兴趣,阅读这个wiki页面可能会有所帮助。
本文假设您正在家目录下的一个名为
odin2
的文件夹中进行操作。
mkdir -p ~/odin2
sudo pacman -Syyu --needed base-devel aarch64-linux-gnu-gcc aarch64-linux-gnu-binutils android-tools \
arch-install-scripts bc cpio dtc gettext git gparted graphviz imagemagick libelf pahole \
parted perl python qemu-user-static-binfmt tar usbutils xz python-sphinx texlive-latexextra
edl
可以从 bkerler/edl 手动安装。
yay -Sy edl-git
将 xbl_s_devprg_ns.melf 下载到 ~/odin2/
将 redmagic-abl.elf 下载到 ~/odin2/
下载并安装 Magisk APK
然后在开发者选项菜单中启用 ADB 访问,并将 Odin 2 连接到您的电脑。
之后,使用以下命令将 Odin 2 重启到 EDL 模式:
adb reboot edl
确认设备在 lsusb
中被检测到:
ID 05c6:9008 Qualcomm, Inc. Gobi Wireless Modem (QDL mode)
使用 edl 备份/转储特定分区:
mkdir ~/odin2/backup
cd ~/odin2
edl --loader=xbl_s_devprg_ns.melf --memory=ufs r init_boot_a backup/init_boot_a.img
edl --loader=xbl_s_devprg_ns.melf --memory=ufs r boot_a backup/boot_a.img
edl --loader=xbl_s_devprg_ns.melf --memory=ufs r abl_a backup/abl_a.img
edl --loader=xbl_s_devprg_ns.melf --memory=ufs r dtbo_a backup/dtbo_a.img
您需要确定包含最新的 Android 安装的当前slot!
对于slot B,请在上面使用init_boot_b
、boot_b
、abl_b
和dtbo_b
。
详细信息请阅读 B. 什么是 Android A/B Slots?
然后刷入 REDMAGIC abl(其中包含更好的 fastboot):
edl --loader=xbl_s_devprg_ns.melf --memory=ufs w abl_a redmagic-abl.elf
edl --loader=xbl_s_devprg_ns.melf --memory=ufs w abl_b redmagic-abl.elf
最后,重启设备以启动到 Android:
edl reset
将 backup/init_boot_a.img
复制到 Android 内部存储中的某个位置。然后,使用 Magisk 对其进行修补。这将生成一个名为 magisk-patched-xxxxxxx.img
的文件。
将修补后的文件复制到您的电脑,然后将 Odin 2 重新启动到 fastboot 模式:
adb reboot bootloader
使用 fastboot 来刷入修补后的文件:
fastboot flash init_boot_a magisk-patched-xxxxxxx.img # 检查 A/B Slots!
fastboot reboot
恭喜!您的 Odin 2 现在应该具备 root 权限了。
adb shell su -c cp /sys/firmware/fdt /sdcard/Download/
adb pull /sdcard/Download/fdt ~/odin2/odin2-android.dtb
dtc -I dtb -O dts ~/odin2/odin2-android.dtb -o ~/odin2/odin2-android.dts
mkdir -p ~/odin2/firmware
adb shell mkdir -p /sdcard/Download/firmware
adb shell su -c cp -r /vendor/bt_firmware/image /sdcard/Download/firmware/bt_firmware
adb shell su -c cp -r /vendor/firmware /sdcard/Download/firmware/firmware
adb shell su -c cp -r /vendor/firmware_mnt/image /sdcard/Download/firmware/firmware_mnt
adb pull /sdcard/Download/firmware ~/odin2/firmware_orig
您可以选择使用预编译的内核或自行构建内核。
从以下链接下载预编译的内核:
https://github.com/edk2-porting/linux-next/releases/tag/odin2-release
从 Github 上克隆内核源代码树:
cd ~/odin2
git clone https://github.com/edk2-porting/linux-next.git -b integration/ayn-odin2
构建内核:
cd linux-next
ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make odin2_defconfig
ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make -j$(nproc)
如果没有错误,您将得到编译后的内核和设备树文件:
arch/arm64/boot/Image.gz
arch/arm64/boot/dts/qcom/qcs8550-ayn-odin2-hypdtbo.dtb
您将会失去 Android 中的所有数据,就好像进行了恢复出厂设置!
您可以通过将 rootfs 安装在 microSD 卡上来跳过此步骤。
但请注意,microSD 卡的速度通常比 UFS 慢 100 倍!
将 Odin 2 重启到 fastboot 模式并启动到大容量存储模式:
adb reboot bootloader
fastboot boot msd.img-odin2
使用 sudo dmesg | tail -n 150
确认设备是否被检测到:
...
[14671.505850] usb 2-1: new SuperSpeed Plus Gen 2x1 USB device number 13 using xhci_hcd
[14671.523933] usb 2-1: New USB device found, idVendor=05f9, idProduct=1234, bcdDevice= 6.06
[14671.523946] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[14671.523950] usb 2-1: Product: Mass Storage
[14671.523953] usb 2-1: Manufacturer: Linux
[14671.523957] usb 2-1: SerialNumber: 1234567890
...
如果设备未出现,请尝试拔插电缆,或使用 Type-A 到 Type-C 电缆。
打开 GParted 并找到包含 userdata
分区的磁盘
在这个例子中,分区是 /dev/sdh17
。
现在返回终端。我们将使用 parted
来调整 userdata
分区的大小。
$ sudo parted /dev/sdh
GNU Parted 3.6
Using /dev/sdh
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Model: Qualcomm sda (scsi)
Disk /dev/sdh: 243GB
Sector size (logical/physical): 4096B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 24.6kB 1597kB 1573kB nvdata1
2 1597kB 3170kB 1573kB nvdata2
3 3170kB 7365kB 4194kB reserve1
4 7365kB 11.6MB 4194kB reserve2
5 11.6MB 45.1MB 33.6MB ext4 persist
6 45.1MB 112MB 67.1MB qpdata1
7 112MB 123MB 10.5MB qpdata2
8 123MB 123MB 524kB frp
9 123MB 124MB 524kB keystore
10 124MB 124MB 8192B ssd
11 124MB 2271MB 2147MB rawdump
12 2271MB 2272MB 1049kB misc
13 2272MB 2339MB 67.1MB metadata
14 2339MB 8019MB 5680MB super
15 8019MB 8019MB 65.5kB vbmeta_system_a
16 8019MB 8019MB 65.5kB vbmeta_system_b
17 8019MB 243GB 235GB userdata
(parted) resizepart 17
End? [243GB]? 48GB # 这里我将 userdata 分区的结束位置调整为 48GB,因为我想让它的大小缩小到 40GB,而它从 8019MB 开始
Warning: Shrinking a partition can cause data loss, are you sure you want to continue?
Yes/No? Yes
(parted) quit
现在返回到 GParted,点击 “GParted” -> “Refresh Devices”,您将看到 userdata
分区后面的未分配空间。
点击未分配空间,右键点击,选择 “New”,将 “Partition name” 和 “Label” 设置为 arch
,将 “File system” 设置为 btrfs
,点击 “Add”,然后点击 “✅ Apply All Operations”
现在,通过长按电源 + 音量减键将 Odin 2 重新启动到 fastboot 模式。在 fastboot 模式下,擦除 userdata
分区并重新启动到 Android:
fastboot erase userdata
fastboot reboot
首先,获取所需的工具:
cd ~/odin2
mkdir -p git firmware/qca firmware/qcom/sm8550/ayn/odin2
git clone https://github.com/andersson/pil-squasher git/pil-squasher
make -C git/pil-squasher
git clone https://github.com/qca/qca-swiss-army-knife git/qca-swiss-army-knife
cd ~/odin2/firmware/qcom/sm8550/ayn/odin2
~/odin2/git/pil-squasher/pil-squasher adsp.mbn ~/odin2/firmware_orig/firmware_mnt/adsp.mdt
~/odin2/git/pil-squasher/pil-squasher adsp_dtb.mbn ~/odin2/firmware_orig/firmware_mnt/adsp_dtb.mdt
~/odin2/git/pil-squasher/pil-squasher cdsp.mbn ~/odin2/firmware_orig/firmware_mnt/cdsp.mdt
~/odin2/git/pil-squasher/pil-squasher cdsp_dtb.mbn ~/odin2/firmware_orig/firmware_mnt/cdsp_dtb.mdt
cp ~/odin2/firmware_orig/firmware_mnt/*.jsn ./
cp ~/odin2/firmware_orig/firmware/a740_zap.mbn ./
cp ~/odin2/firmware_orig/firmware/gmu_gen70200.bin ~/odin2/firmware/qcom/
cp ~/odin2/firmware_orig/firmware/a740_sqe.fw ~/odin2/firmware/qcom/
cp ~/odin2/firmware_orig/bt_firmware/hmtbtfw20.tlv ~/odin2/firmware/qca/
cp ~/odin2/firmware_orig/bt_firmware/hmtnv20.bin ~/odin2/firmware/qca/
mkdir -p ~/odin2/firmware/ath12k/WCN7850/hw2.0
cp ~/odin2/firmware_orig/firmware_mnt/kiwi/phy_ucode20.elf ~/odin2/firmware/ath12k/WCN7850/hw2.0/m3.bin
cp ~/odin2/firmware_orig/firmware_mnt/kiwi/regdb.bin ~/odin2/firmware/ath12k/WCN7850/hw2.0/regdb.bin
cp ~/odin2/firmware_orig/firmware_mnt/kiwi/amss20.bin ~/odin2/firmware/ath12k/WCN7850/hw2.0/amss.bin
然后, 在 ~/odin2/firmware_orig/firmware_mnt/kiwi/
下面新建一个名叫 board-2.json
的文件:
[
{
"board": [
{
"names": [
"bus=pci,qmi-chip-id=2,qmi-board-id=255"
],
"data": "bdwlan.elf"
}
],
"regdb": [
{
"names": [
"bus=pci,qmi-chip-id=2,qmi-board-id=255"
],
"data": "regdb.bin"
}
]
}
]
最后, 使用 ath12k-bdencoder 工具来生成 board-2.bin 文件
cd ~/odin2/firmware_orig/firmware_mnt/kiwi
~/odin2/git/qca-swiss-army-knife/tools/scripts/ath12k/ath12k-bdencoder -c board-2.json
cp ~/odin2/firmware_orig/firmware_mnt/kiwi/board-2.bin ~/odin2/firmware/ath12k/WCN7850/hw2.0/board-2.bin
下载最新的 tarball: http://os.archlinuxarm.org/os/ArchLinuxARM-aarch64-latest.tar.gz
将 Odin 2 引导到大容量存储模式
作为 root 用户使用 bsdtar
提取 tarball,以保留扩展属性和 ACL
sudo -s
mount /dev/disk/by-partlabel/arch /mnt
bsdtar -xpf ArchLinuxARM-aarch64-latest.tar.gz -C /mnt
为了使此处命令正常执行,您需要
qemu-user-static-binfmt
和arch-install-scripts
软件包!
genfstab -L /mnt >> /mnt/etc/fstab
arch-chroot /mnt
ln -sf /usr/share/zoneinfo/区域/城市 /etc/localtime
编辑 /etc/locale.gen
文件,并取消注释 en_US.UTF-8 UTF-8
和其他所需的 UTF-8 区域设置。
通过运行以下命令生成区域设置:
locale-gen
创建 locale.conf
文件,并相应设置 LANG 变量:
/etc/locale.conf
LANG=en_US.UTF-8
pacman
打开 /etc/pacman.conf
文件,并取消注释 ParallelDownloads
# Misc options
#UseSyslog
#Color
#NoProgressBar
CheckSpace
#VerbosePkgLists
ParallelDownloads = 10
mkinitcpio
打开 /etc/mkinitcpio.conf
文件,并取消注释 zstd 压缩
# COMPRESSION
# Use this to compress the initramfs image. By default, gzip compression
# is used. Use 'cat' to create an uncompressed image.
COMPRESSION="zstd"
#COMPRESSION="gzip"
打开 /etc/mkinitcpio.d/linux-aarch64.preset
文件,并禁用 fallback preset
PRESETS=('default')
pacman-key --init
pacman-key --populate archlinuxarm
/etc/hostname
ayn-odin2
pacman -Syy archlinux-keyring
pacman -Syu btrfs-progs
由于 OpenGL 驱动程序存在问题,建议同时安装两个桌面环境。(其中一个桌面环境可能随时会出现问题 😕 )
pacman -S base-devel plasma-meta gnome git firefox chromium dolphin gedit wireless-regdb clang compiler-rt
hostnamectl chassis handset
systemctl enable gdm
systemctl disable systemd-networkd
systemctl enable NetworkManager
目前 Mesa 不支持 Adreno 740 GPU 的 OpenGL。因此,我们需要安装最新版本的 Mesa,并将
zink
配置为 OpenGL 到 Vulkan 的翻译层,以使桌面环境正常工作。
首先,从 https://github.com/edk2-porting/linux-next/releases/tag/odin2-release 下载最新的 Mesa。
安装包:
# 确保您在 chroot 环境中
pacman -U mesa-git-24.0.0_devel.179592.ce5475366e9.d41d8cd-1-aarch64.pkg.tar.xz
修改系统环境变量:
/etc/environment
#
# This file is parsed by pam_env module
#
# Syntax: simple "KEY=VAL" pairs on separate lines
#
__GLX_VENDOR_LIBRARY_NAME=mesa
MESA_LOADER_DRIVER_OVERRIDE=zink
GALLIUM_DRIVER=zink
首先退出 chroot 环境:
exit
将固件文件复制到目标系统:
cp -r /home/USERNAME/odin2/firmware/* /mnt/lib/firmware/
回到 chroot 环境:
arch-chroot /mnt
修改 /etc/mkinitcpio.conf
以包含固件文件:
# FILES
# This setting is similar to BINARIES above, however, files are added
# as-is and are not parsed in any way. This is useful for config files.
FILES=(
/lib/firmware/qcom/sm8550/ayn/odin2/adsp.mbn
/lib/firmware/qcom/sm8550/ayn/odin2/adsp_dtb.mbn
/lib/firmware/qcom/sm8550/ayn/odin2/cdsp.mbn
/lib/firmware/qcom/sm8550/ayn/odin2/cdsp_dtb.mbn
/lib/firmware/ath12k/WCN7850/hw2.0/amss.bin
/lib/firmware/ath12k/WCN7850/hw2.0/regdb.bin
/lib/firmware/ath12k/WCN7850/hw2.0/board-2.bin
/lib/firmware/ath12k/WCN7850/hw2.0/m3.bin
/lib/firmware/qca/hmtbtfw20.tlv
/lib/firmware/qca/hmtnv20.bin
/lib/firmware/qcom/sm8550/ayn/odin2/a740_zap.mbn
/lib/firmware/qcom/gmu_gen70200.bin
/lib/firmware/qcom/a740_sqe.fw
/lib/firmware/regulatory.db.p7s
/lib/firmware/regulatory.db
)
重新生成 initramfs:
mkinitcpio -P
将 initramfs 复制到您的电脑:
exit # 退出 chroot 环境
cp /mnt/boot/initramfs-linux.img /home/USERNAME/odin2/
chmod a+rw /home/USERNAME/odin2/initramfs-linux.img
arch-chroot /mnt
克隆 Qualcomm 服务的源代码:
cd
git clone https://github.com/andersson/qrtr.git
git clone https://github.com/andersson/pd-mapper.git
git clone https://github.com/andersson/tqftpserv.git
构建并安装它们:
pushd qrtr && make prefix=/usr && make prefix=/usr install && systemctl enable qrtr-ns && popd
pushd pd-mapper && make prefix=/usr && make prefix=/usr install && systemctl enable pd-mapper && popd
pushd tqftpserv && make prefix=/usr && make prefix=/usr install && systemctl enable tqftpserv && popd
退出 chroot 环境:
exit
umount /mnt
sync
将 Odin 2 重新启动到 fastboot 模式,并检查当前 Android 的 slot:
fastboot getvar current-slot
如果当前的 slot 是 A,则切换到 slot B,反之亦然。
fastboot set_active b
擦除将阻止 Linux 正常启动的分区:
fastboot erase dtbo_b
fastboot erase init_boot_b
创建引导镜像:
cp ~/odin2/linux-next/arch/arm64/boot/Image.gz ./
cp ~/odin2/linux-next/arch/arm64/boot/dts/qcom/qcs8550-ayn-odin2-hypdtbo.dtb ./
cat Image.gz qcs8550-ayn-odin2-hypdtbo.dtb > Image.gz-dtb
mkbootimg \
--kernel Image.gz-dtb \
--ramdisk ~/odin2/initramfs-linux.img \
--cmdline "clk_ignore_unused pd_ignore_unused panic=30 audit=0 loglevel=8 allow_mismatched_32bit_el0 root=PARTLABEL=arch rw rootfstype=btrfs drm.debug=0x100 mem_sleep_default=s2idle" \
--kernel_offset 0x8000 \
--ramdisk_offset 0x1000000 \
--tags_offset 0x100 \
--header_version 1 \
--os_version 13.0.0 \
--os_patch_level 2023-05 \
-o test.img-odin2
直接启动进入 Arch Linux:
fastboot boot test.img-odin2
或者,将内核刷入 slot B:
fastboot flash boot_b test.img-odin2
fastboot reboot
A. 在 Android 中,使用 adb 命令重启:adb reboot edl
B. 在 fastboot 模式下,选择 Reboot to emergency mode
(原始 abl)或 Boot to edload
(REDMAGIC abl)
C. 在主板背面将 BOOT
和 SD_1P8
点位短接
D. 在启动时按下 音量上 + 音量下(仅限原始 abl)
您可能需要先阅读以下文章:
在 Odin 2 上,每个 slot 包含以下分区:
abl aop aop_config bluetooth boot cpucp devcfg dsp dtbo featenabler hyp imagefv init_boot keymaster mdtp mdtpsecapp modem multiimgoem multiimgqti qupfw qweslicstore recovery rticmpdata shrm tz uefi uefisecapp vbmeta vbmeta_system vendor_boot vm-bootsys xbl xbl_config xbl_ramdump
您可以使用以下命令轻松确定当前 slot:
fastboot getvar current-slot
假设您在执行 Android 系统更新时处于 slot A,系统将更新 slot B 中的某些分区(例如,boot_b、init_boot_b)。
如果在 slot B 中安装了 Linux 内核,更新过程将覆盖内核。
因此,在执行 Android 更新之前,您需要备份 Linux 内核映像(boot_b 分区)。
TODO:更优雅的解决方案?
您可以使用 bkerler/edl 完成此操作。
edl --loader=xbl_s_devprg_ns.melf rl . --memory=ufs --skip=userdata,rawdump,logdump --genxml
这个命令将在备份过程中跳过三个分区:userdata, rawdump, logdump
。
如果您有其他不需要备份的分区,比如一个 Linux 安装,您也可以将这些分区添加到命令中。