打开/关闭搜索
搜索
打开/关闭菜单
通知
打开/关闭个人菜单
查看“为手机安装Linux”的源代码
来自Uotan Wiki · 刷机百科
查看
阅读
查看源代码
查看历史
associated-pages
页面
讨论
更多操作
←
为手机安装Linux
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
== 该章节将引导你为一些手机安装主线Linux操作系统 == 注意:本教程中,操作环境为64位Ubuntu,目标机器为OnePlus6T,我们将尝试利用UEFI在OnePlus6T上启动Archlinux * 不同于Windows, Linux的安装过程可能具有一定的复杂性,步骤繁杂,方案多样,如果你使用不同的机型,请先仔细阅读本文和搜索资料;此外,主线Linux的开发(内核驱动移植,制作dts等)不在本文讨论范畴内。 [[文件:Archlinux-neofetch-op6t.png|缩略图|无|349x349像素]] === 1 编译内核 === sdm845成品: [Releases · silime/kernel-builder (github.com)](https://github.com/silime/kernel-builder) ==== 1.1 安装相关依赖 ==== 对于Ubuntu 22.04 LTS: sudo apt install build-essential openssl pkg-config libssl-dev libncurses5-dev pkg-config minizip libelf-dev flex bison libc6-dev libidn11-dev rsync bc liblz4-tool sudo apt install gcc-aarch64-linux-gnu dpkg-dev git ==== 1.2 克隆内核源码 ==== 你可以在“-b”参数后选择其他分支 mkdir ~/workspace cd ~/workspace git clone --depth=1 https://gitlab.com/sdm845-mainline/linux.git -b sdm845/6.8-dev 可用分支可在gitlab网页查看 ==== 1.3 生成 .config ==== make ARCH=arm64 defconfig sdm845.config # generate .config ==== 1.4 进行编译 ==== make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc) 生成deb包供Debian系得GNU/Linux使用 make -j$(nproc) ARCH=arm64 KBUILD_DEBARCH=arm64 KDEB_CHANGELOG_DIST=mobile CROSS_COMPILE=aarch64-linux-gnu- deb-pkg # This will generate several deb files in ../ === 2 制作rootfs === ==== 2.1 下载 ==== 对于Archlinux,从http://os.archlinuxarm.org/os/ArchLinuxARM-aarch64-latest.tar.gz下载 cd ~/workspace wget http://os.archlinuxarm.org/os/ArchLinuxARM-aarch64-latest.tar.gz 对于Ubuntu,从 [Index of /ubuntu-base](https://cdimage.ubuntu.com/ubuntu-base/)选择自己想要的版本 ==== 2.2 制作 ==== ===== 2.2.1 进入chroot ===== 由于rootfs为ARM64,所以安装qemu-user-static sudo apt install qemu-user-static 创建img并挂载 dd if=/dev/zero of=archlinux.img bs=1G count=6 mkfs.ext4 archlinux.img mkdir arch sudo mount archlinux.img arch 解压 cd arch sudo tar -xpvf ../ArchLinuxARM-aarch64-latest.tar.gz 进入chroot环境 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/ sudo chroot arch ===== 2.2.2 初始化pacman keyring ===== pacman-key --init pacman-key --populate archlinuxarm ===== 2.2.3 换源 (可选) ===== 详见 https://mirrors.tuna.tsinghua.edu.cn/help/archlinuxarm/ pacman -Syyu # upgrade ===== 2.2.4 卸载旧的内核和firmware ===== pacman -Q | grep -i linux pacman -R linux-aarch64 linux-firmware linux-firmware-whence exit # exit chroot environment ===== 2.2.5 安装新的内核 ===== * 确保已经退出`chroot`环境 然后: cd ~/workspace/linux 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 如果是`debian`系也可以直接chroot环境中用dpkg安装deb:<code>dpkg -i *.deb</code> ===== 2.2.6 安装新的firmware ===== * 可以尝试从PostmarketOS<ref>https://wiki.postmarketos.org/wiki/OnePlus_6T_(oneplus-fajita)</ref>中提取 进入chroot环境 sudo chroot ~/workspace/arch 移动解压得到的文件 mv * /usr/lib/firmware/ ldconfig 修改/etc/mkinitcpio.conf nano /etc/mkinitcpio.conf 找到 # BINARIES # This setting includes any additional binaries a given user may # wish into the CPIO image. This is run last, so it may be used to # override the actual binaries included by a given hook # BINARIES are dependency parsed, so you may safely ignore libraries BINARIES=() 在`BINARIES=()`填入`xxxx_zap.mbn/ipa_fws.mbn`的路径 这两个固件的来源一般是手机提取并放在特殊的位置加载(具体由`dts/dtsi`指定) 对于fajita,改为: BINARIES=(/usr/lib/firmware/qcom/sdm845/oneplus6/a630_zap.mbn /usr/lib/firmware/qcom/sdm845/oneplus6/ipa_fws.mbn) 生成initrd.img ls /usr/lib/modules # get kernel version mkinitcpio --generate /boot/initrd.img-5.18.0-sdm845-00109-gf7ad1e5036bb-dirty --kernel 5.18.0-sdm845-00109-gf7ad1e5036bb-dirty ===== 2.2.7 安装软件包和基本配置<ref>https://archlinuxstudio.github.io/ArchLinuxTutorial/#/</ref> ===== ====== 2.2.7.1 设置时区 ====== ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # Shanghai ====== 2.2.7.2 设置locale ====== 参考:https://wiki.archlinux.org/title/Locale nano /etc/locale.gen # uncomment en_US.UTF-8 UTF-8 # uncomment zh_CN.UTF-8 UTF-8 locale-gen ====== 2.2.7.3 自定义主机名 ====== # For example echo 'OnePlus6T' > /etc/hostname ====== 2.2.7.4 alarm(Archlinuxarm内置非root用户)配置 ====== 更改alarm密码,并添加到wheel用户组 passwd alarm # Change its password. Default is "alarm" usermod -aG wheel alarm 添加sudo,设置sudo权限 pacman -S sudo EDITOR=nano visudo 找到下面这样的一行,把前面的注释符号 `#` 去掉 #%wheel ALL=(ALL:ALL) ALL ====== 2.2.7.5 必要软件包 ====== pacman -S base base-devel dhcpcd iwd pacman -S grub efibootmgr pacman -S networkmanager modemmanager pacman -S bluez bluez-utils pulseaudio-bluetooth pacman -S qrtr rmtfs systemctl enable NetworkManager bluetooth qrtr-ns rmtfs systemctl enable ModemManager pacman -S git wget pacman -S ntfs-3g usbutils 再安装 pd-mapper 和 tqftpserv * 可以此处下载成品:https://github.com/silime/ArchLinux-Packages * 也可以在步骤2.2.7.6后直接用pacman安装! * 注:默认的PKGBUILD有问题,需要手动修复,在这里不详细描述,如果嫌麻烦,也可以直接编译安装 a. 直接编译安装(不推荐): git clone https://github.com/andersson/pd-mapper.git git clone https://github.com/andersson/tqftpserv.git cd pd-mapper && make && make install && cd .. cd tqftpserv && make && make install && cd .. # clean rm -rf tqftpserv pd-mapper b. 使用pkgbuild # Switch to alarm first su alarm cd ~ # Compile and Install pd-mapper git clone https://aur.archlinux.org/pd-mapper-git.git ~/pd-mapper-git cd ~/pd-mapper-git nano PKGBUILD # fix some errors makepkg -si #Compile and Install tqftpserv git clone https://aur.archlinux.org/tqftpserv-git.git ~/tqftpserv-git cd ~/tqftpserv-git nano PKGBUILD # fix some errors makepkg -si 启用 pd-mapper 和 tqftpserv sudo systemctl enable tqftpserv pd-mapper 回到root用户 exit ====== 2.2.7.6 添加Renegade Project源<ref>https://mirror.renegade-project.tech/index.html#/</ref>(可选) ====== 导入 GPG key: pacman-key --recv-keys 5E29D8F17064598A7A2223E2C735F8DF5B624511 pacman-key --lsign-key 5E29D8F17064598A7A2223E2C735F8DF5B624511 在 /etc/pacman.conf 文件末尾添加以下内容: [renegade-project] Server = https://mirror.renegade-project.tech/arch/$arch 安装 renegade-project-keyring: pacman -S renegade-project-keyring 刷新 pacman -Syy ====== 2.2.7.7 安装用于切换slot的qbootctl(推荐) ====== * 确保已经完成了步骤2.2.7.6 pacman -Sy qbootctl ====== 2.2.7.8 安装更多package使一些硬件工作 ====== * 来自:https://github.com/silime/ArchLinux-Packages/releases ** 请用pacman安装[https://github.com/silime/ArchLinux-Packages/releases/tag/sensors sensors package],[https://github.com/silime/ArchLinux-Packages/releases/tag/alsa-ucm-oneplus-0.5.10 alsa-ucm-oneplus-0.5.10],[https://github.com/silime/ArchLinux-Packages/releases/tag/q6voice q6voice] ====== 2.2.7.9 修改Modemmanager ====== * 重新编译ModemManager,开启`plugin_qcom_soc`,并安装 su alarm mkdir ~/modemmanager cd ~/modemmanager nano PKGBUILD * 将 [PKGBUILD - modemmanager (aarch64) | Package Files | Arch Linux ARM](https://archlinuxarm.org/packages/aarch64/modemmanager/files/PKGBUILD) 中的内容复制进PKGBUILD,然后进行以下修改 ** 将`arch=(x86_64)`改为`arch=(x86_64 aarch64)` ** 将`-D plugin_qcom_soc=disabled`一行删除 10c10 < arch=(x86_64) --- > arch=(x86_64 aarch64) 35d34 < -D plugin_qcom_soc=disabled * 编译和安装 makepkg -rsi # compile and install cd .. sudo rm -rf ~/modemmanager exit systemctl enable ModemManager ====== 2.2.7.10 其他软件 ====== 中文字体 pacman -S noto-fonts-cjk # Chinese fonts yay su alarm cd ~ git clone https://aur.archlinux.org/yay-bin.git cd yay-bin && makepkg -si exit 桌面环境 * 自选,建议gnome或phosh ** 如`gnome` pacman -S gnome systemctl enable gdm * 如安装phosh,建议添加danctnix源 [danctnix (arikawa-hi.me)](https://p64.arikawa-hi.me/danctnix/),然后安装 网络浏览器 # for example, chromium pacman -S chromium ===== 2.2.8 tfa98xx音频修复 ===== echo 'snd-soc-tfa98xx' > /etc/modules-load.d/snd-soc-tfa98xx.conf ===== 2.2.9 打包 ===== 先清理,在chroot环境中 pacman -Scc # pacman 进alarm用户 su alarm # switch to alarm # clean bash history for alarm cat /dev/null > ~/.bash_history && history -c && exit 在root用户 # clean bash history for root cat /dev/null > ~/.bash_history && history -c 退出chroot环境 exit 解除挂载 cd ~/workspace sudo umount ~/workspace/arch/run sudo umount ~/workspace/arch/sys sudo umount ~/workspace/arch/proc sudo umount ~/workspace/arch/dev/pts sudo umount ~/workspace/arch/dev 用tar打包 cd ~/workspace/arch sudo tar -czvf ~/workspace/arch.tar.gz * # This will generate arch.tar.gz === 3 安装到手机 === ==== 3.1 刷入twrp和Magisk ==== * 你也可以使用KernelSU或其它方式获取root权限 ==== 3.2 分区、格式化分区 ==== 连接手机、电脑,手机进twrp 将`parted`复制到手机储存 电脑输入: adb shell 然后输入: cp /sdcard/parted /sbin/ && chmod 755 /sbin/parted umount /data && umount /sdcard parted /dev/block/sda 输入`p`查看当前分区情况 p 对于一加6T,可这样分区: * 压缩分区17 resizepart 17 # input 61GB * 创建新分区 mkpart esp fat32 61GB 62GB mkpart arch ext4 62GB 125GB set 18 esp on 随后退出parted q 再次重启到twrp,格式化各分区 电脑输入: adb shell 然后输入: mkfs.fat -F32 -s1 /dev/block/by-name/esp mke2fs -t ext4 /dev/block/by-name/arch mke2fs -t ext4 /dev/block/by-name/userdata ==== 3.3 获取UUID ==== 重启到Android,在termux或adb shell输入 su blkid /dev/block/by-name/arch 记下UUID值 ==== 3.4 准备grub配置文件 ==== *下载: ** https://forum.renegade-project.tech/uploads/short-url/hlr2fHanyoSkM1pOPy1eywhLiSm.zip ** https://forum.renegade-project.tech/uploads/short-url/hlr2fHanyoSkM1pOPy1eywhLiSm.zip 将boot.tar.gz中grub.cfg的uuid全部改为步骤3.3中得到的 替换所有这种字符 [[文件:3a12afa8f91aef1d2d2fb693b93d0e13eae37729.png|缩略图]] ==== 3.5 解压rootfs ==== 将arch.tar.gz复制到手机内部存储 * 建议使用termux操作 pkg update pkg install tsu 提权 tsu # root permission needed 挂载&解压 cd ~ mkdir arch mount /dev/block/by-name/arch ~/arch cd ~/arch tar -xpvf /sdcard/arch.tar.gz # extract ==== 3.6 安装grub ==== tsu cd ~ mkdir esp mount /dev/block/by-name/esp esp mkdir esp/EFI 将esp.zip中这两个文件夹复制到~/esp/EFI/ 将boot.tar.gz内两个文件夹复制进~/arch/boot * 检查 # /dev/block/by-name/arch has been mounted! cd ~/arch/boot && ls ==== 3.7 获取、添加dtb ==== 对于一加6T,还需要将这两个dtb复制到~/arch/boot * 注:对于一加6(T)不要使用内核编译生成的dtb ** 见arch/arm64/boot/dts/qcom/sdm845-oneplus-common.dtsi,将不会有显示 对于其它设备,请获取合适的dtb /delete-node/ &rmtfs_mem; / { aliases { serial0 = &uart9; hsuart0 = &uart6; }; chosen { stdout-path = "serial0:115200n8"; /*line 30 in dtsi*/ }; volume-keys { compatible = "gpio-keys"; label = "Volume keys"; autorepeat; ===== 3.7.1 dtb的获取 ===== 下载适用自己设备的postmarketOS的boot.img.xz,解压得到img文件 使用 extract-dtb<ref>https://pypi.org/project/extract-dtb/</ref> pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple extract-dtb extract-dtb 20220608-1408-postmarketOS-v22.06-phosh-18-oneplus-fajita-boot.img -o . # use your own img # will generate something like 01_dtbdump_,OnePlus_6T.dtb ls mv 01_dtbdump_,OnePlus_6T.dtb sdm845-oneplus-fajita.dtb ===== 3.7.2 修改dtb,使得可能支持USB otg ===== 安装dtc工具 sudo apt install device-tree-compiler -y 转换dtb为dts dtc -I dtb -O dts -o temp.dts sdm845-oneplus-fajita.dtb 修改temp.dts nano temp.dts 查找`dr_mode` dwc3@a600000 { compatible = "snps,dwc3"; reg = <0x00 0xa600000 0x00 0xcd00>; interrupts = <0x00 0x85 0x04>; iommus = <0x25 0x740 0x00>; snps,dis_u2_susphy_quirk; snps,dis_enblslpm_quirk; phys = <0xb8>; phy-names = "usb2-phy"; dr_mode = "peripheral"; maximum-speed = "high-speed"; }; 将`peripheral`改为`host` 此时生成的dtb将支持otg,但要外界供电,为了USB主动供电,需要进一步修改,但会导致充电失效 将charger@1000那段删除 pmic@2 { compatible = "qcom,pmi8998\0qcom,spmi-pmic"; reg = <0x02 0x00>; #address-cells = <0x01>; #size-cells = <0x00>; charger@1000 { compatible = "qcom,pmi8998-charger"; reg = <0x1000>; interrupts = <0x02 0x13 0x04 0x03 0x02 0x> interrupt-names = "usb-plugin\0bat-ov\0wd> io-channels = <0xdd 0x03 0xdd 0x04>; io-channel-names = "usbin_i\0usbin_v"; status = "okay"; monitored-battery = <0xde>; }; gpios@c000 { compatible = "qcom,pmi8998-gpio\0qcom,spm> reg = <0xc000>; gpio-controller; gpio-ranges = <0xdf 0x00 0x00 0x0e>; #gpio-cells = <0x02>; interrupt-controller; #interrupt-cells = <0x02>; phandle = <0xdf>; }; 生成新的dtb dtc -I dts -O dtb -o sdm845-oneplus-fajita-host.dtb temp.dts 复制好dtb,你的usb otg应该就**有可能**工作 === 4 刷入UEFI === 进入bootloader 临时启动 fastboot boot boot-xxx.img 刷入到当前boot分区 fastboot flash boot boot-xxx.img === 5 Enjoy!=== 恭喜你!你已经成功在你的手机上安装Archlinux!!希望你能有所收获!! ==== 5.1 adbd ==== * 确保已经添加Renegade Project源 sudo pacman -S adbd adbd能帮助你用adb调试手机上的Linux ==== 5.2 coremark跑分 ==== yay -S coremark-git coremark ==== 5.3 unixbench 跑分 ==== ======================================================================== BYTE UNIX Benchmarks (Version 5.1.3) System: : GNU/Linux OS: GNU/Linux -- 5.18.0-sdm845-00109-gf7ad1e5036bb-dirty -- #1 SMP PREEMPT Thu Jun 2 01:12:20 UTC 2022 Machine: aarch64 (unknown) Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8") CPU 0: (38.4 bogomips) CPU 1: (38.4 bogomips) CPU 2: (38.4 bogomips) CPU 3: (38.4 bogomips) CPU 4: (38.4 bogomips) CPU 5: (38.4 bogomips) CPU 6: (38.4 bogomips) CPU 7: (38.4 bogomips) 08:08:45 up 4 min, 3 users, load average: 0.23, 0.15, 0.07; runlevel ------------------------------------------------------------------------ Benchmark Run: Wed Jun 15 2022 08:08:45 - 08:36:48 8 CPUs in system; running 1 parallel copy of tests Dhrystone 2 using register variables 31371686.9 lps (10.0 s, 7 samples) Double-Precision Whetstone 6636.9 MWIPS (9.9 s, 7 samples) Execl Throughput 3464.7 lps (30.0 s, 2 samples) File Copy 1024 bufsize 2000 maxblocks 431850.5 KBps (30.0 s, 2 samples) File Copy 256 bufsize 500 maxblocks 212468.6 KBps (30.0 s, 2 samples) File Copy 4096 bufsize 8000 maxblocks 1100792.9 KBps (30.0 s, 2 samples) Pipe Throughput 1189114.2 lps (10.0 s, 7 samples) Pipe-based Context Switching 16156.4 lps (10.0 s, 7 samples) Process Creation 1880.5 lps (30.0 s, 2 samples) Shell Scripts (1 concurrent) 1267.7 lpm (60.0 s, 2 samples) Shell Scripts (8 concurrent) 928.5 lpm (60.0 s, 2 samples) System Call Overhead 904143.8 lps (10.0 s, 7 samples) System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 31371686.9 2688.2 Double-Precision Whetstone 55.0 6636.9 1206.7 Execl Throughput 43.0 3464.7 805.7 File Copy 1024 bufsize 2000 maxblocks 3960.0 431850.5 1090.5 File Copy 256 bufsize 500 maxblocks 1655.0 212468.6 1283.8 File Copy 4096 bufsize 8000 maxblocks 5800.0 1100792.9 1897.9 Pipe Throughput 12440.0 1189114.2 955.9 Pipe-based Context Switching 4000.0 16156.4 40.4 Process Creation 126.0 1880.5 149.2 Shell Scripts (1 concurrent) 42.4 1267.7 299.0 Shell Scripts (8 concurrent) 6.0 928.5 1547.5 System Call Overhead 15000.0 904143.8 602.8 ======== System Benchmarks Index Score 687.6 ------------------------------------------------------------------------ Benchmark Run: Wed Jun 15 2022 08:36:48 - 09:05:10 8 CPUs in system; running 8 parallel copies of tests Dhrystone 2 using register variables 157010560.9 lps (10.0 s, 7 samples) Double-Precision Whetstone 38380.8 MWIPS (9.5 s, 7 samples) Execl Throughput 14684.0 lps (29.9 s, 2 samples) File Copy 1024 bufsize 2000 maxblocks 775566.4 KBps (30.0 s, 2 samples) File Copy 256 bufsize 500 maxblocks 247697.5 KBps (30.0 s, 2 samples) File Copy 4096 bufsize 8000 maxblocks 1947686.0 KBps (30.0 s, 2 samples) Pipe Throughput 6462292.1 lps (10.0 s, 7 samples) Pipe-based Context Switching 535021.4 lps (10.0 s, 7 samples) Process Creation 21863.7 lps (30.0 s, 2 samples) Shell Scripts (1 concurrent) 12727.2 lpm (60.0 s, 2 samples) Shell Scripts (8 concurrent) 1865.6 lpm (60.1 s, 2 samples) System Call Overhead 4647127.5 lps (10.0 s, 7 samples) System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 157010560.9 13454.2 Double-Precision Whetstone 55.0 38380.8 6978.3 Execl Throughput 43.0 14684.0 3414.9 File Copy 1024 bufsize 2000 maxblocks 3960.0 775566.4 1958.5 File Copy 256 bufsize 500 maxblocks 1655.0 247697.5 1496.7 File Copy 4096 bufsize 8000 maxblocks 5800.0 1947686.0 3358.1 Pipe Throughput 12440.0 6462292.1 5194.8 Pipe-based Context Switching 4000.0 535021.4 1337.6 Process Creation 126.0 21863.7 1735.2 Shell Scripts (1 concurrent) 42.4 12727.2 3001.7 Shell Scripts (8 concurrent) 6.0 1865.6 3109.4 System Call Overhead 15000.0 4647127.5 3098.1 ======== System Benchmarks Index Score 3187.6 === 6 对一些设备的更多调整 === ==== 6.1 修复sdm845关机crashdump ==== sudo nano /etc/systemd/system/shutdown-modem.service 填入 [Unit] Description=Poweroff modem remoteproc to prevent wlan fw crash DefaultDependencies=no Before=shutdown.target [Service] Type=oneshot # remoteproc2 is always the modem on SDM845 ExecStart=echo stop | tee /sys/class/remoteproc/remoteproc*/state [Install] WantedBy=shutdown.target 启用服务 sudo systemctl enable shutdown-modem.service 它会在关机前关闭`modem remoteproc`
返回
为手机安装Linux
。