(需更新)
社区已经有很多编译的系统可玩了,但是为了追求彻底,我还是想自己编译一个系统用用看,顺便试着调整内核进行超频...
本文参照多个文章整理后编写
编译UFI设备的Debian固件
编译410随身wifi_Debian超频版教程&经验
关于 OpenStick
如果只想刷入社区的系统镜像,可看第5节 系统刷入
系统与环境
编译需要在主机为Linux系统下进行,因此本次选择vmware虚拟机进行
系统镜像: Ubuntu2210_Desktop_amd64
编译过程中全程以普通用户进行,不能进入root用户编译,仅使用sudo提权
系统安装完成后打开终端开始换源,如果不换源后续安装软件会较慢:
sudo vi /etc/apt/sources.list
注释全部内容,更换为:
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ kinetic main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ kinetic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ kinetic-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ kinetic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ kinetic-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ kinetic-backports main restricted universe multiverse
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ kinetic-security main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ kinetic-security main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu/ kinetic-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ kinetic-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ kinetic-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ kinetic-proposed main restricted universe multiverse
工具准备
输入指令安装软件包:
sudo apt install binfmt-support qemu-user-static gcc-10-aarch64-linux-gnu kernel-package fakeroot simg2img img2simg mkbootimg bison flex gcc-aarch64-linux-gnu pkg-config libncurses-dev libssl-dev unzip git
克隆仓库代码:
git clone https://github.com/OpenStick/linux.git --depth=1
内核超频
此时不急着去编译源码,为了获得更佳的性能,先对其进行超频修改
进入目录 linux/drivers/clk/qcom 找到 a53-pll.c文件,进行修改
打开文件后,可根据下图为参考,21-27行内,第一块为运行频率,第二块则为供电电压。根据前面的规律,大致可以判断为每提升200Mhz增加10电压值,但是由于再往后就超出了芯片设计频率,同时要考虑功耗与发热,因此往后提升时要略增加一些电压值,如 { 1841600000, 96, 0x0, 0x1, 0 }
static const struct pll_freq_tbl a53pll_freq[] = {
{ 998400000, 52, 0x0, 0x1, 0 },
{ 1094400000, 57, 0x0, 0x1, 0 },
{ 1152000000, 62, 0x0, 0x1, 0 },
{ 1209600000, 63, 0x0, 0x1, 0 },
{ 1248000000, 65, 0x0, 0x1, 0 },
{ 1363200000, 71, 0x0, 0x1, 0 },
{ 1401600000, 73, 0x0, 0x1, 0 },
{ 1621600000, 84, 0x0, 0x1, 0 },
{ 1841600000, 96, 0x0, 0x1, 0 },
{ 1951600000, 103, 0x0, 0x1, 0 },
{ }
};
找到第二个目录 linux/arch/arm64/boot/dts/qcom 修改其中的 msm8916.dtsi 文件,在220行左右出现默认频率,在此之后进行增加,增加的频率需要在前一个文件内添加好
opp-1363200000 {
opp-hz = /bits/ 64 <1363200000>;
};
opp-1401600000 {
opp-hz = /bits/ 64 <1401600000>;
};
opp-1621600000 {
opp-hz = /bits/ 64 <1621600000>;
};
opp-1841600000 {
opp-hz = /bits/ 64 <1841600000>;
};
opp-1951600000 {
opp-hz = /bits/ 64 <1951600000>;
};
内核编译
编译配置
回到刚刚git拉取的终端,开始执行编译前的配置
cd linux
export CROSS_COMPILE=aarch64-linux-gnu-
export ARCH=arm64
make msm8916_defconfig
make menuconfig
具体的make配置可以参考网上公共教程,也可以直接使用默认配置进行下一步
开始编译
这里的 -j4 请根据自己CPU的核心数或虚拟机分配核心数来修改
make -j4
生成软件包
生成debian格式的deb软件包:
fakeroot make-kpkg --initrd --cross-compile aarch64-linux-gnu- --arch arm64 kernel_image kernel_headers
生成结束后,输入 ls ../ 即可查看生成的deb文件包
保留文件
在上一级目录创建bak文件夹,将必要的文件提取出来备用
路径:arch/arm64/boot/Image.gz
设备树dtb路径:arch/arm64/boot/dts/qcom/msm8916-handsome-openstick-xxxxxx 这里要根据设备型号选择,本文使用001B设备
也可以一次性打包多个设备版本,如再拉取一个 003 的棒子的设备树(与001c通用)
mkdir ../bak
cp arch/arm64/boot/Image.gz ../bak/
cp arch/arm64/boot/dts/qcom/msm8916-handsome-openstick-ufi001b.dtb ../bak/
cp arch/arm64/boot/dts/qcom/msm8916-handsome-openstick-ufi001c.dtb ../bak/
下载底包
下载debian底包,并将解压后的rootfs.img放到bak目录内
cd ../bak
wget https://github.com/OpenStick/OpenStick/releases/download/v1/debian.zip && unzip debian.zip
mv ./debian/rootfs.img ./
解包挂载
simg2img rootfs.img root.img
sudo mount root.img /mnt
sudo mount --bind /proc /mnt/proc
sudo mount --bind /dev /mnt/dev
sudo mount --bind /dev/pts /mnt/dev/pts
sudo mount --bind /sys /mnt/sys
将前面生成的deb软件包复制到 /mnt 目录
sudo cp ../linux-*.deb /mnt
使用 chroot 进入挂载的系统,移除系统内原有的linux-image包,并安装刚刚生成的deb软件包,安装后删除deb文件
sudo chroot /mnt
dpkg -l | grep -E "linux-headers|linux-image" |awk '{print $2}'|xargs dpkg -P
dpkg -i *.deb
rm linux-*.deb
系统优化
与正常debian系统一样进行换源等常规优化操作
换源:
cat>/etc/apt/sources.list<<EOF
deb http://mirrors.ustc.edu.cn/debian stable main contrib non-free
# deb-src http://mirrors.ustc.edu.cn/debian stable main contrib non-free
deb http://mirrors.ustc.edu.cn/debian stable-updates main contrib non-free
# deb-src http://mirrors.ustc.edu.cn/debian stable-updates main contrib non-free
EOF
安装常用软件并调整时区 区域:6 Asia 时区:70 Shanghai
apt install locales usbutils curl wget fdisk net-tools nano
dpkg-reconfigure locales
dpkg-reconfigure tzdata
启用Root并默认自动登录,并修改root密码(本文设置为123123)
sed -i '/PermitRootLogin /c PermitRootLogin yes' /etc/ssh/sshd_config
sed -i '/PasswordAuthentication /c PasswordAuthentication yes' /etc/ssh/sshd_config
passwd root
创建 rc.local 开机启动脚本
cat>>/etc/systemd/system/rc-local.service<<EOF
[Unit]
Description=/etc/rc.local
ConditionPathExists=/etc/rc.local
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99
[Install]
WantedBy=multi-user.target
EOF
cat <<EOF >/etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
exit 0
EOF
systemctl daemon-reload && systemctl enable rc-local
history -c
配置结束,输入 exit 可退出
将 /mnt/boot/initrd**.img 取出到 bak 文件夹内备用
cp /mnt/boot/initrd.img-* ./
取消挂载并打包
取消刚刚的boot.img的挂载
sudo umount /mnt/proc
sudo umount /mnt/dev/pts
sudo umount /mnt/dev
sudo umount /mnt/sys
sudo umount /mnt
将 boot.img 转为刷机用的 rootfs.img 格式
img2simg root.img rootfs.img
将Image和dtb合并(由于前面拉了两个设备树,这里合并两次)
cat Image.gz msm8916-handsome-openstick-ufi001b.dtb>ufi001b-kernel-dtb
cat Image.gz msm8916-handsome-openstick-ufi001c.dtb>ufi001c-kernel-dtb
将前面提取出来的 initrd**.img 改名为 initrd.img
mv initrd.img-* initrd.img
生成镜像
生成001b的镜像
mkbootimg --base 0x80000000 --kernel_offset 0x00080000 --ramdisk_offset 0x02000000 --tags_offset 0x01e00000 --pagesize 2048 --second_offset 0x00f00000 --ramdisk initrd.img --cmdline "earlycon root=PARTUUID=a7ab80e8-e9d1-e8cd-f157-93f69b1d141e console=ttyMSM0,115200 no_framebuffer=true rw" --kernel ufi001b-kernel-dtb -o ufi001b-boot.img
生成001c/003的镜像
mkbootimg --base 0x80000000 --kernel_offset 0x00080000 --ramdisk_offset 0x02000000 --tags_offset 0x01e00000 --pagesize 2048 --second_offset 0x00f00000 --ramdisk initrd.img --cmdline "earlycon root=PARTUUID=a7ab80e8-e9d1-e8cd-f157-93f69b1d141e console=ttyMSM0,115200 no_framebuffer=true rw" --kernel ufi001c-kernel-dtb -o ufi001c-boot.img
整理文件,将boot与rootfs.img整理出来(可选)
mkdir ufi_debian
mv ufi001*.img ./ufi_debian/
mv rootfs.img ./ufi_debian/
最后,将这些文件从虚拟机复制到主机,接入棒子,准备下一个环节:开始刷机
刷入系统
要想把Debian刷入到棒子内,需要在棒子的fastboot模式下刷入。如果棒子是刚做完第一章的备份工作后,只需要跳过第0节继续往下跟着做即可;如果棒子已经刷入过openwrt或者Debian等linux系统,请备份好必要资料后,看下面第0节进入fastboot模式。除了esim,务必不要插入sim卡的时候刷机,否则可能会无法检测到卡,出现这种情况重新刷入就可以了(除非刷机包有要求插卡刷入)
第0节
已刷机的棒子进fastboot
如果你的棒子是新买的并且已经做完备份工作了,可以直接跳过该小节,直接使用adb重启至fastboot
备份好必要文件后,拔下棒子
按板子上的RST按钮,并插入到电脑,此时电脑会识别到9008设备
使用第一章的软件 Qualcomm Premium Tool V2.4 ,打开后扫描分区,按下图所示格式化boot分区
格式化完成后,拔掉棒子,重新插入,即可自动进入fastboot模式
打开第一章的adb工具包 tools 文件夹,在文件夹上方地址栏输入cmd,打开cmd窗口
输入指令 fastboot devices
即可查看是否有设备连接
如果连接成功,即可开始跳转到第2节
第1节
进入到fastboot模式,如果是从第0节完成,则可以跳过这一节往下看;如果棒子刚买回来且做了备份工作后,可以看这一节进入fastboot
正常插入棒子,等待其开机,设备管理器显示adb即可
如果显示如下图,同时出现adb与9091设备,代表设备还没有完全开机,稍等片刻即可
打开第一章内的adb工具包 tools 文件夹,在文件夹上方地址栏输入cmd,打开cmd窗口
输入指令 adb devices
,查看是否有adb设备连接,如有,可继续执行指令 adb reboot bootloader
此时电脑会提示新设备接入,输入指令 fastboot devices
即可查看是否有设备连接
此时棒子成功进入fastboot模式,可以进行刷机
第2节
准备Debian\linux\openwrt刷入工具包,优先刷入ufi003(001c)
如果使用社区提供的刷机镜像压缩包,里面一般有全部分区文件和 flash.bat 刷机脚本,可以直接使用包里面的 flash.bat 一键刷入;如果只准备了rootfs.img 与 boot.img 和本文一样,那就需要下载基础包,将这俩文件放基础包内,并把 *-boot.img 改名为 boot.img 即可
基础包链接:https://www.123pan.com/s/Dpq0Vv-p9UHd.html
提取码:dkdF (本文采用这一个)
源链接:https://github.com/OpenStick/OpenStick/releases/tag/v1
(建议使用前面链接,本文有改动刷入脚本,可自动刷入lk2nd与rootfs、boot)
源链接配合源教程食用更佳:https://www.kancloud.cn/handsomehacker/openstick/2636506
将基础包下载后解压,可得到一个base文件夹。将前面生成的 rootfs.img 与 ufi001c-boot.img 复制到该文件夹内,并将 ufi001c-boot.img 改名为 boot.img ,然后运行 flash.bat 即可开始刷入,不会超过3分钟(如果rootfs包较大,耗时也会久,如果长时间不跑进度可以尝试重新刷入,进入fastboot方法看第0节)
等显示 All done!! 之后棒子会自动重启,并尝试开机
如果在电脑里面找不到设备,可以参考文章:https://www.kancloud.cn/handsomehacker/openstick/2636506
本文结束,后续折腾请等待更新
我按你的方法编译了一个debian,刷机后为什么用nmtui看不到附近的wifi了啊,是少了什么选线吗