在手机通过uefi原生运行Ubuntu的教程

KALI 手机通过UEFI运行Kali-Linux的教程 - Linux - Renegade Project (renegade-project.org)

注意步骤10里的补充!!!!!

这个帖子现在是一个Wiki 有建设性想法的人都能编辑

image

大家好啊!今天来教大家怎么在手机原生运行Ubuntu

作者:@snnbyyds

编辑:@snnbyyds @bigfootaca

一加6t为例(a/b)(sdm845)(128GB)

注:触摸屏暂时无法运行,是步骤的问题,请大佬指出

支持设备:

OnePlus 6 (enchilada)
OnePlus 6T (fajita)
Xiaomi MIX 3 (perseus)
Xiaomi PocoPhone F1 (beryllium)
Meizu 16th (m1882)
Meizu 16th Plus (m1892)
Smartisan R1 (trident)
BlackShark One (skr-a0)
OPPO Find X (pafm00)
Xiaomi MIX 2S (polaris)
LG G7 (judyln)
Samsung Galaxy S9+ (star2qltechn)
Xiaomi MI 7 (dipper-old)
Xiaomi MI 8 (dipper)
Nubia X (nx616j)
Nokia9 PureView (olympic)
ASUS ZenFone 5Z (draco)
Vivo NEX Dual Display (pd1821)

0.准备

0.1 准备文件、硬件

内核:https://github.com/edk2-porting/linux-snapdragon
ubuntu:Ubuntu 20.04.3 LTS (Focal Fossa) Daily Build (选择arm64)
uefi:https://github.com/edk2-porting/edk2-sdm845
Parted:[Linux][ARM32][parted 3.2] Statically linked parted
Termux:https://termux.com/
gnu-toolchain:GNU Toolchain | GNU-A Downloads – Arm Developer (AArch64 GNU/Linux target (aarch64-none-linux-gnu))
grub:链接: https://pan.baidu.com/s/1nnyZgHHwUw0J4kjPNp6Z6Q 密码: n76u

你还需要:安装了ubuntu的电脑,一台手机,数据线

0.2 准备环境

0.2.1 配置电脑上的ubuntu

终端输入:

sudo apt-add-repository ppa:cubic-wizard/release
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6494C6D6997C215E
sudo apt update -y && sudo apt upgrade -y
sudo apt install libncurses5-dev openssl libssl-dev build-essential pkg-config libc6-dev bison flex libelf-dev zlibc minizip libidn11-dev libidn11 liblz4-tool  
sudo apt-get install android-tools-adb android-tools-fastboot
sudo apt install cubic qemu-user-static

0.2.2 手机刷入TWRP、Magisk(略)

1.编译内核(电脑ubuntu下)

1.1 解压linux-snapdragon-linux-rolling-stable.zip

我这边解压在桌面 /home/sn/桌面

1.2 配置cross compile

解压gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz

"-10.3-2021.07-"版本号不一样不要紧 我这边解压在桌面 /home/sn/桌面

1.3 编译

补充:

修改dts

为了OTG挂载U盘,我需要将dts文件中的

&usb_1_dwc3 {
	dr_mode = "peripheral";

	/* fastest mode for USB 2 */
	maximum-speed = "high-speed";
	
	/* Remove USB3 phy */
	phys = <&usb_1_hsphy>;
	phy-names = "usb2-phy";
};

修改为

&usb_1_dwc3 {
	dr_mode = "host";

	/* fastest mode for USB 2 */
	maximum-speed = "high-speed";
	
	/* Remove USB3 phy */
	phys = <&usb_1_hsphy>;
	phy-names = "usb2-phy";
};

image

编译内核deb文件

修改 scripts/setlocalversion 中的 res 可以避免在版本号后面添加 “+”号(直接删除那段if-else) [这完全没必要]
禁用 fts 驱动可以避免屏幕一直打印geni_i2c a90000.i2c:dma_map_single:for tx faild
方法 : 新建 /etc/modprobe.d/fts.conf 添加内容为 blacklist fts (将 fts 加入黑名单以避免加载)
查看日志 journalctl --root=

打开内核源码文件夹,右键,选择“在终端中打开”

内核源码文件夹

输入:

cp arch/arm64/configs/perseus_defconfig .config
make -j4 ARCH=arm64 KBUILD_DEBARCH=arm64 KDEB_CHANGELOG_DIST=focal CROSS_COMPILE=/home/sn/桌面/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- deb-pkg
#-j后面的数字越大,速度越快,但不要超过cpu核心数,CROSS_COMPILE=后面的路径要学会变通

一路回车,完成后编译就开始了

编译开始

完成后得到deb

2.手机配置

2.1 分区

连接手机、电脑,手机进twrp

parted复制到手机储存

ubuntu 终端或windows powershell/cmd输入:

adb shell

随后输入:

cp /sdcard/parted /sbin/ && chmod 755 /sbin/parted
umount /data && umount /sdcard
parted /dev/block/sda

输入p查看当前分区

接下来:

rm 17
mkpart esp fat32 6559MB 7000MB
mkpart ubuntu ext4 7000MB 61GB
mkpart userdata ext4 61GB 125GB
set 17 esp on
#前一个数字是内存开始,后一个是结束,差值为分区大小
#如果出现
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel?

就输入i,回车

结束后输入p

重启到twrp

2.2 格式化分区,检查android系统

电脑输入:

adb shell
mkfs.fat -F32 -s1 /dev/block/by-name/esp
mke2fs -t ext4 /dev/block/by-name/ubuntu
mke2fs -t ext4 /dev/block/by-name/userdata

重启到android

2.3 获取UUID

在android系统下,连接手机电脑

电脑输入

adb shell
su
blkid /dev/block/sda17
blkid /dev/block/sda18

#17,18为parted中的分区号,注意magisk同意root权限,注意开启usb调试

我这边是

/dev/block/sda17: UUID="DAB5-C3BD" TYPE="vfat" 
/dev/block/sda18: UUID="9a1416e6-ed82-4a60-b62d-7cb41d8dd01b" TYPE="ext4"

记下两个uuid

3.准备ubuntu arm64文件

3.1 chroot环境

*以下操作也可手动

在桌面以任意方式新建文件夹proj

如果执行了0.2中的命令,会有一个叫cubic的应用

运行

选择一个文件夹,例如 /home/sn/桌面/proj

选择ubuntu的iso,focal-desktop-arm64.iso

下一步x2

直到这里

点击按钮复制deb文件

3.2 安装内核

cubic输入

dpkg -i *.deb   #安装内核
rm -rf *.deb      #清理

image

4 配置grub和fstab

4.1 GNU GRUB

通过步骤0.1的链接下载grub文件

cubic输入:

cd /boot
ls    #查看/boot下文件
rm -rf initrd.img && rm -rf vmlinuz   
#删除错误和无效的链接
ln -s initrd.img-5.13.5-xiaomi-sdm845 initrd.img
ln -s vmlinuz-5.13.5-xiaomi-sdm845 vmlinuz    
#根据自己文件名灵活更改
ln -s /usr/lib/linux-image-5.13.5-xiaomi-sdm845/qcom/sdm845-oneplus-fajita.dtb fajita.dtb     
#路径要灵活更改,使用的dtb根据设备名和厂家灵活更改,比如对于小米Mix3:ln -s /usr/lib/linux-image-5.13.5-xiaomi-sdm845/qcom/sdm845-xiaomi-perseus.dtb perseus.dtb

编辑文件:启动/boot/grub/grub.cfg

内容:

修改其中9dfe5004-0a6d-40db-98a2-ebfb4b1db883为你自己在2.3中生成的uuid

比如:/dev/block/sda18: UUID="9a1416e6-ed82-4a60-b62d-7cb41d8dd01b" TYPE="ext4"

那就改为9a1416e6-ed82-4a60-b62d-7cb41d8dd01b
可能还要修改devicetree /boot/fajita.dtb为正确的dtb 比如你先前执行了ln -s /usr/lib/linux-image-5.13.5-xiaomi-sdm845/qcom/sdm845-xiaomi-perseus.dtb perseus.dtb改为perseus.dtb

*共3处

启动/boot/grub/grub.cfg
同样修改 启动/efi/EFI/ubuntu/grub.cfg

*共一处

启动/efi/EFI/ubuntu/grub.cfg
cubic输入:

cd /boot

点击cubic中按钮
image

选择 启动/boot 下两个文件夹

点击select、在点击copy就会把文件复制到正确位置(/boot

4.2 fstab

*用到2.3中uuid

/dev/block/sda17: UUID="DAB5-C3BD" TYPE="vfat" 
/dev/block/sda18: UUID="9a1416e6-ed82-4a60-b62d-7cb41d8dd01b" TYPE="ext4"

cubic窗口输入

cat << __EOF__ > /etc/fstab

随后一行行输入(7e454382-2dc0-467b-ae53-0972ad622530和07A6-8B46替换成自己的uuid)
”#“后面有空格

# /etc/fstab: static file system information. 
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/nvme0n1p2 during installation
UUID=7e454382-2dc0-467b-ae53-0972ad622530 /               ext4    errors=remount-ro 0       1
# /boot/efi was on /dev/nvme0n1p1 during installation
UUID=07A6-8B46  /boot/efi       vfat    umask=0077      0       1

最后输入

__EOF__

回车

4.3 生成squashfs文件

cubic一路next,可以在/home/sn/桌面/proj/custom-disk/casper找到filesystem.squashfs

将其复制到手机储存

5 termux

5.1 安装并配置

安装termux

打开

输入

pkg update && pkg upgrade

选项都选y

5.2 添加squashfs-tools-ng

pkg install squashfs-tools-ng

6 部署ubuntu到手机

6.1 ubuntu分区

termux输入

su         #root权限
mount /dev/block/sda18 /mnt    #挂载ubuntu分区
/data/data/com.termux/files/usr/bin/rdsquashfs -O -C -T -X -u / -p /mnt /sdcard/filesystem.squashfs
umount /mnt

6.2 esp分区

termux继续输入

mount /dev/block/sda17 /mnt
cp -r /sdcard/efi/* /mnt
umount /mnt

7 UEFI

进入fastboot

对于a/b

临时启动uefi

fastboot boot boot-xxx.img

刷入到当前boot分区

fastboot flash boot boot-xxx.img

刷入到recovery分区

fastboot flash recovery boot-xxx.img

其他a/b

临时启动uefi

fastboot boot boot-xxx.img

刷入a或b

fastboot flash boot_a boot-xxx.img

fastboot flash boot_b boot-xxx.img

所有a/b

可用

fastboot set_active a

fastboot set_active b

切换a/b

8.ENJOY :smiley:

如果无法使用触摸屏,请外接键鼠

9.BUG

因为我比较垃圾,我的触摸屏没有工作

10.其他一些步骤(建议执行但撰写wiki时未执行)

引自: 小米MIX3尝试运行ubuntu-desktop的一些记录 - Linux - Renegade Project (renegade-project.org)

wifi 相关

生成手机的 board-2.bin 文件
创建 board-2.bin 文件夹

mkdir -p board-2.bin/bdf && cd board-2.bin/bdf

从手机 /firmware/image 目录复制 bdwlan.b* 文件

cp bdwlan.b* .
cd ..

创建脚本内容如下

cat << __EOF__ > make_board-2.bin.sh
#!/bin/bash

if [ \! -d qca-swiss-army-knife ]; then
        git clone https://hub.fastgit.org/qca/qca-swiss-army-knife.git
        exit 0
fi

JSON="bdf/board-2.json"

iter=0
echo "[" > "${JSON}"
for file in bdf/bdwlan.*; do
 [[ $file == *.txt ]] && continue

 iter=$((iter+1))
 [ $iter -ne 1 ] && echo "  }," >> "${JSON}"

 echo "  {" >> "${JSON}"
 echo "          \"data\": \"$file\"," >> "${JSON}"
 if [[ $file == */bdwlan.bin ]]; then
  file_ext="ff"	# 注意,Mix3此处为 ff
 else
  file_ext="$(printf '%x\n' "$(basename "${file}" | sed -E 's:^.*\.b?([0-9a-f]*)$:0x\1:')")"
 fi
 echo "          \"names\": [\"bus=snoc,qmi-board-id=${file_ext}\"]" >> "${JSON}"
done

echo "  }" >> "${JSON}"
echo "]" >> "${JSON}"

python2 qca-swiss-army-knife/tools/scripts/ath10k/ath10k-bdencoder -c "${JSON}" -o board-2.bin
__EOF__

为 make_board-2.bin.sh 添加执行权限

chmod +x make_board-2.bin.sh

执行 make_board-2.bin.sh 创建 board-2.bin 文件

./make_board-2.bin.sh

将生成的 board-2.bin 文件拷贝至 /lib/firmware/ath10k/WCN3990/hw1.0/ 下

cp board-2.bin /lib/firmware/ath10k/WCN3990/hw1.0/

安装 qrtr rmtfs pd-mapper tqftpserv ( 后面三个依赖第一个 )

apt install git build-essential libudev-dev --no-install-recommends -y

git clone https://hub.fastgit.org/andersson/qrtr.git
git clone https://hub.fastgit.org/andersson/rmtfs.git
git clone https://hub.fastgit.org/andersson/pd-mapper.git
git clone https://hub.fastgit.org/andersson/tqftpserv.git

注意此4个程序的默认安装目录位于 /usr/local/bin /usr/local/include /usr/local/lib 下, 这里我将其安装至 /usr/bin /usr/lib /etc/systemd/system/ 下

cd qrtr && make && make install && cd ..
cd rmtfs && make && make install && cd ..
cd pd-mapper && make && make install && cd ..
cd tqftpserv && make && make install && cd ..

systemctl enable qrtr-ns
systemctl enable pd-mapper
systemctl enable tqftpserv
systemctl enable rmtfs

systemctl start qrtr-ns
systemctl start pd-mapper
systemctl start tqftpserv
systemctl start rmtfs

firmware 相关

生成mbn格式固件

git clone https://hub.fastgit.org/edk2-porting/pil-squasher.git

cd pil-squasher && make && make install

pil-squasher使用方法

pil-squasher xxx.mbn xxx.mdt

涉及的文件包含:

/lib/firmware/qcom/a630_zap.mbn

/lib/firmware/qcom/sdm845/adsp.mbn
/lib/firmware/qcom/sdm845/cdsp.mbn
/lib/firmware/qcom/sdm845/modem.mbn

/lib/firmware/qcom/venus-5.2/venus.mbn

复制替换的文件

/lib/firmware/qcom/a630_sqe.fw
/lib/firmware/qcom/a630_gmu.bin

/lib/firmware/qcom/sdm845/adspr.jsn
/lib/firmware/qcom/sdm845/adspua.jsn
/lib/firmware/qcom/sdm845/cdspr.jsn
/lib/firmware/qcom/sdm845/mba.mbn
/lib/firmware/qcom/sdm845/modemuw.jsn
/lib/firmware/qcom/sdm845/wlanmdsp.mbn

/lib/firmware/qcom/venus-5.2/venus.b00
/lib/firmware/qcom/venus-5.2/venus.b01
/lib/firmware/qcom/venus-5.2/venus.b02
/lib/firmware/qcom/venus-5.2/venus.b03
/lib/firmware/qcom/venus-5.2/venus.b04
/lib/firmware/qcom/venus-5.2/venus.mdt

手动增加以下文件

/lib/firmware/st_fts_e5.ftb	# fts 固件,来自 https://github.com/MiCode/Xiaomi_Kernel_OpenSource/tree/dipper-q-oss 编译文件
/lib/firmware/stm_fts_production_limits.csv	# fts 文件,来自手机
/lib/firmware/tas2557_uCDSP.bin	# 来自手机

11.效果演示

### 如果偷pmos ### mi8

mix2s

### @strongtz @skr-niao @evsio0n @BigfootACA 如有错误,直接编辑即可
8 Likes

:smiley: :slightly_smiling_face: :smiley: :grinning_face_with_smiling_eyes:

4 Likes

我就很纳闷,apt是装不了交叉编译器么?

1 Like

当然可以啦

4 Likes

看得出为什么触屏会炸吗

4 Likes

mix2s ft屏幕触屏和USB都不工作,uefi版本是1.0.2

1 Like

装ubuntu的话,usb wifi 蓝牙 摄像头 啥的都能驱动吗

1 Like

基本都能

4 Likes

lte能用吗?

1 Like

可是手上没有845的手机,只有红米7pro,675的,不知道怎么把845的移植675呢,没有方向,能给个方向看能不能研究研究
看着好心痒,好想试试.

2 Likes

其实我就觉得跑linux会不会比跑windows方便一些,驱动这些应该支持会好一些,而且基本都开源

1 Like

你使用的内核是小米mix3的内核,触屏驱动和一加6T的不通用,所以在ubuntu中不能使用触摸屏,请尝试使用oneplus6t的内核编译,或者将一加6t的内核触摸屏驱动文件复制主线中,也可以试试postmarketOS的内核。

1 Like

小太阳说过,perseus_defconfig是通用的,名字他是瞎取得

4 Likes

我现在就在偷postmarketos

4 Likes

虚拟机的ubuntu跑cubic是不是有问题啊,疯狂进出虚拟环境,嵌套虚拟化?得主机直接装ubuntu?之前发现双系统很鸡肋直接删了

1 Like

:smiley:搞个WIN+UBUNTU双系统

1 Like

qemu-user-static 装了吗

4 Likes

装了,试了cubic classic也不行,自己配置chroot能进环境但是还是很多命令都没有基本没用

1 Like

大哥那个grub能不能给个其他网盘的,或者压缩一下

1 Like

大佬我把uuid给你,能帮忙弄一个squashfs吗,我这cubic和chroot都没办法弄,搞了几天了,:pray:t2:

1 Like
Powered by Nexet