# 小米11魔改服务器
# 背景
在咸鱼买了一款二手小米11,卖家自称9成新,功能外观均良好,到手之后一眼看上去没啥问题,还给贴了膜,于是大概测试了一下没问题,就确认收货了。然后在抖音下单买了手机壳,准备做备机用。
几天后,手机壳到货,卖家还给贴心的送了膜。回头看了下原机贴的膜,感觉贴的不好,里面脏兮兮的,还有几个气泡,应该是没擦干净,于是撕了原机膜准备贴新膜。撕了膜之后发现原屏幕跟氢氟酸腐蚀过似的,一片坑坑洼洼,脏兮兮的,自己用酒精反复擦,也擦不干净,心想坏了,赶紧咸鱼联系卖家,不出意外的联系不上。没办法了,自己动手贴膜试试看吧,说不定能遮掩一下看不出来,然后自己尝试了贴三次,卖家送的膜全贴完了,也没贴出原来卖家贴的那种效果,不得不说卖家贴膜水平真高。
撕掉膜,裸屏用了两天,怎么用怎么不舒服,再卖肯定卖不掉,扔掉又可惜,于是心想做个服务器,还能废品利用一下,于是有了本次魔改操作。因为对安卓刷机并不擅长,所以在此记录下操作步骤,以免后续遗忘。
小米手机 CIT 测试方法:
CIT 测试主要是测试一些硬件,比如屏幕、触摸、扬声器、各种传感器等外设,我收到手机后,就是在 CIT 中测试了下,发现没问题就确认收货了。
# 在拨号面板输入以下代码进入 CIT 测试
*#*#6484#*#*
下文默认具备的软件环境:
已下载 adb.exe
以及 fastboot.exe
文件,并已配置好环境变量。如果安装过 Android Studio
,那么运行环境应该是具备的。测试方法:
PS C:\Users\MallocX> adb --version
Android Debug Bridge version 1.0.41
Version 34.0.4-10411341
Installed as C:\Tools\Android\platform-tools\adb.exe
PS C:\Users\MallocX> fastboot --version
fastboot version 34.0.4-10411341
Installed as C:\Tools\Android\platform-tools\fastboot.exe
# 一、获取ROOT权限
# 1、解BL锁
我买的这个手机卖家已经解锁了,所以直接跳过这个步骤。
闲鱼有各种付费解BL的商家,如果后续我还要刷机,应该会选择直接付费解锁,据说解BL这个难度颇高。
# 2、修补 boot.img
以下操作全程参考 Magisk 中文网 (opens new window) 教程。
# 2.1、下载 ROM
Magisk 官网提供了很多机器的 ROM 包下载 链接 (opens new window),可以根据机器任意挑选下载。
本次操作我选择在 miuier (opens new window) 下载小米11 ROM 包,下载时注意,手机版本号要和 ROM 包版本号一致,如下图:
可以选择线刷包或者卡刷包,我在此选择的是线刷包。(不确定两者的具体区别是什么,但 boot.img 应该都是存在的)
# 2.2、提取 boot.img
提取操作 Magisk 官网 教程 (opens new window) 逐步操作即可,这个步骤还是很简单。
- 下载 ROM 包镜像提取工具 payload-dumper-go;
- 将下载的 ROM 包放到 payload-dumper-go 解压后的文件夹内(与 payload-dumper-go.exe 平级);
- 执行批处理文件“打开CMD命令行.bat”,然后选择 b 提取 boot.img 文件。
稍等片刻,即可在 img 文件夹中看到提取完成的 boot.img 文件。将该文件复制到手机 Download 文件夹备用,可以用以下命令快速完成。
adb push ./boot.img /sdcard/Download/
# 2.3、安装 Magisk
Magisk GitHub 仓库地址:The Magic Mask for Android (opens new window)
在官网 下载 (opens new window) Magisk APP,然后安装,用以下命令快速完成安装。
adb install ./Magisk-v28.1.apk
# 2.4、修补 boot.img
根据 Magisk 官网 教程 (opens new window) 逐步操作,进行 boot.img 修补操作。
- 手机打开 Magisk APP,点击主页右上角 安装 按钮;
- 选择刚刚上传到 Download 文件夹下的 boot.img 文件;
- 点击 选择并修补一个文件,然后点击 开始 按钮,开始修补 boot.img;
- 等待片刻,命令行界面显示
- All done!
提示,说明修补完成; - 修补完成的文件名称为
magisk_patched-28100_3D7Go.img
,文件后缀的字母应该是随机生成的,后续使用需要注意文件名称。
# 2.5、备份文件
备份 boot.img
文件以及 magisk_patched-28100_3D7Go.img
文件,准备刷入修补后的 boot 镜像,如果刷机后无法开机,可以刷入原 boot.img
文件恢复。
这个地方有个坑,风险需要再评估:
如果下载的原镜像有问题,那么提取的 boot.img 也有概率有问题。如果 boot.img 有问题,那么刷机后无法开机,就无法复原了,所以此处最好是将手机原本的 boot.img 备份出来,但是如何备份,后续待摸索。也算是我运气好,如果刷变砖了,那就真凉了。
# 3、刷入修补后的 boot.img
# 3.1、手机进入 Bootloader 模式
- 手机关机后,按下 “电源键 + 音量下键”,一起长按大约 10 秒钟左右;
- 屏幕显示 “FASTBOOT” 字样,则算是成功进入。
# 3.2、电脑驱动更新
手机进入 Bootloader 模式后,接入电脑后,命令行运行 fastboot devices
发现没有设备,打开设备管理器之后发现设备未识别,解决方法是:
- 右键点击未被识别的 USB 设备,选择更新驱动程序;
- 选择 “手动查找并安装驱动程序软件” 选项;
- 选择 “WinUsb.dll 设备”;
- 选择 “Android ADB Interface”;
因为刷机操作已经过去几天了,以上步骤凭记忆编写,后续再复现发现卸载掉驱动后可以系统可以自动安装了,所以无法复现,步骤可能有出入,仅供参考。
# 3.3、刷入修补后的 boot.img 文件
Windows 终端执行以下指令
# 检测手机有没有被识别到,如果列出手机串号则成功识别
PS C:\Users\MallocX\MI-11> fastboot devices
7a9b3049 fastboot
# 刷入修补后的 boot.img
PS C:\Users\MallocX\MI-11> fastboot flash init_boot .\magisk_patched-28100_3D7Go.img
Sending 'init_boot' (8192 KB) OKAY [ 0.312s]
Writing 'init_boot' OKAY [ 0.007s]
Finished. Total time: 0.319s
# 如果要还原 boot.img 则执行以下命令
PS C:\Users\MallocX\MI-11> fastboot flash init_boot .\boot.img
# 重启手机
PS C:\Users\MallocX\MI-11> fastboot reboot
修补后的 boot.img 写入 flash 后,输入命令重启手机(也可以手工重启),开机后打开 Magisk 软件,主界面如果显示 Magisk 版本号,即为刷入成功,至此成功获取 root 权限。
# 二、设置上电自动开机
既然是要做服务器,肯定要满足无人值守的条件,上电自动开机是必须要实现的。
# 1、没有成功实施的方案
网上教程主要有两类,但是我都没搞定,后续还要研究下失败原因,所以还是记录在这里:
# 1.1、修改 boot.img
主要流程是解包 boot.img,提取 init.rc 文件,并进行修改,然后重新打包再刷入,接包方法有两种,但我都没成功。
使用 bootimg.exe 解包
参考教程:手机Android通电自动开机(关机状态下)教程 - 知乎 (opens new window) ,实际 bootimg.exe
执行时,无法解包,错误如图:
使用 magiskbootkitchen 解包
参考教程:解包小米11的boot.img,还原内核符号以及地址 - 吾爱破解 - 52pojie.cn (opens new window),实际解包后,没有找到 init.rc 文件。
# 1.2、直接修改 /etc/init/hw/init.rc 文件
下载MT管理器,获取 root 权限,然后进入 /etc/init/hw 目录,直接编辑 init.rc 文件。具体方法:
# 找到以下代码
on charger
class_start charger
# 追加开机代码,最终如下
on charger
class_start charger
setprop ro.bootmode "normal"
setprop sys.powerctl "reboot"
实际修改后,保存时弹窗提示如下:
错误信息
挂载读写失败
/
网上查了一下,说是要重新挂载为读写模式,那就试试吧。
PS D:\> adb shell
venus:/ # su
# 以下指令是根据网上教程照搬的,实际执行失败
venus:/ # mount -o rw,remount /system
mount: '/system' not in /proc/mounts
# 既然弹窗提示根目录挂载读写失败,干脆直接挂载根目录,然后没有报错
venus:/ # mount -o rw,remount /
# 然后覆盖 init.rc 验证下是否可编辑
# 先 copy 出来
venus:/ # cp /etc/init/hw/init.rc /sdcard/Download/
# 确定 copy 成功
venus:/ # ls /sdcard/Download
boot.img init.rc magisk_patched-28100_3D7Go.img
# 再反写进去,写入失败
venus:/ # cp /sdcard/Download/init.rc /etc/init/hw/init.rc
cp: /etc/init/hw/init.rc: Read-only file system
# 至此已经没耐心了,直接 chmod 777,依然无效,彻底失败
venus:/ # chmod 777 /etc/init/hw/init.rc
chmod: chmod '/etc/init/hw/init.rc' to 0777: Read-only file system
venus:/ # chmod -R 777 /etc/init/hw
chmod: chmod '/etc/init/hw' to 0777: Read-only file system
chmod: chmod 'init.rc' to 0777: Read-only file system
chmod: chmod 'init.usb.configfs.rc' to 0777: Read-only file system
chmod: chmod 'init.usb.rc' to 0777: Read-only file system
chmod: chmod 'init.zygote32.rc' to 0777: Read-only file system
chmod: chmod 'init.zygote64_32.rc' to 0777: Read-only file system
# 2、实际成功的方案
使用 magisk-autoboot 插件成功实现上电开机。
GitHub: https://github.com/anasfanani/magisk-autoboot (opens new window)
magisk-autoboot 插件似乎功能很强,后续再深入学习一下,同时学习下 magisk 插件的原理以及开发。
# 三、开机自启动一些服务
后续手机做为服务器,无人值守需要满足一定的条件,比如出问题能够远程调试,断网能够自动连接等,以免出异常后还要到现场处理。
Magisk 能够在开机时,自动执行 /data/adb/service.d/
路径中的所有脚本,但是要注意,该文件夹中的脚本类似于配置文件,不能加 shebang line
即不指定解释器路径,而是由 magisk
自动执行,如果添加则无法成功运行。同时也无需添加 x
权限。
# 3.1、自动开机 ADB 网络调试
/data/adb/service.d 目录中,创建脚本,文件名称随意,比如 adb_tcp_init.sh
。
# 启动 adb tcp 调试
setprop service.adb.tcp.port 5555
# 停止 adbd 服务
stop adbd
# 启动 adbd 服务
start adbd
# 3.2、自动连接指定 ssid 的 Wi-Fi 热点
/data/adb/service.d 目录中,创建脚本,文件名称随意,比如 auto_connect_wifi.sh
。
# 将以下 ssid 和 password 替换为需要连接的热点名称
cmd -w wifi connect-network [ssid] wpa2 [password]
# 关闭 Wi-Fi
svc wifi disable
# 启动 Wi-Fi
svc wifi enable
# 3.3、自动信任指定 PC 的 USB 调试
只要将本机 adbkey.pub
放到 /data/misc/adb/adb_keys
路径下,那么手机插入指定PC时,手机将不再弹出 “USB调试信任确认” 对话框。
以下操作按理说执行一次即可,无需设置为开机启动,但就怕出现某些意外情况导致公钥文件丢失,所以还是设置为开机运行,保底。
# PC 端 CMD 执行
# 在 adb_keys 下放一份公钥文件,实现 USB 插入免授权
PS C:\Users\MallocX\.android> adb push ./adbkey.pub /data/misc/adb/adb_keys/
# 在 Download 文件夹下放一个备份文件
PS C:\Users\MallocX\.android> adb push ./adbkey.pub /sdcard/Download/
/data/adb/service.d 目录中,创建脚本,文件名称随意,比如 auto_auth_usb.sh
。
# 每次开机后将备份公钥复制一份
cp /sdcard/Download/adbkey.pub /data/misc/adb/adb_keys/
# 四、Termux 安装
要在手机上运行 Linux 服务,Termux 肯定少不了。
# 4.1、安装 Termux APP
在 GitHub 下载 Termux (opens new window) 以及 Termux:Boot (opens new window),直接安装。
PS C:\Users\MallocX\Desktop\MI-11> adb install .\termux-app_v0.119.0-beta.1+apt-android-7-github-debug_arm64-v8a.apk
PS C:\Users\MallocX\Desktop\MI-11> adb install .\termux-boot-app_v0.8.1+github.debug.apk
# 4.2、设置 Termux 开启自动运行
原理上来说,开机后可以让 Magisk 直接启动 Termux,但是 Termux 官方提供了开机运行方案 Termux:Boot,此处直接采用官方方案了,因为 Termux-Boot 还提供了 Termux 启动后,自动运行服务功能。
进入 “设置” -> “应用设置” -> “应用管理” 菜单
打开 Termux 以及 Termux:Boot 的 “自启动” 选项即可
# 4.3、获取 Termux Root 权限
在 Termux
命令行中,直接输入 su
,然后 Magisk 即弹窗提示 Termux 请求 Root 权限,手工点击 “同意” 即可。
# 4.4、Termux 环境常用软件安装
一般情况来说,安装 Termux
之后第一件事情是换源,但我没有换源,安装速度还不错,所以没有再折腾换源的事情了,后面如果有需要换源,再补充。
# 登录 root 用户,获取 root 权限
~ $ su
# 确认 root 用户
:/data/data/com.termux/files/home # whoami
# 退出 root 用户
:/data/data/com.termux/files/home # exit
# 因为 Termux root 用户实际上执行的是 adb shell,所以以下指令均在 Termux 普通用户角色下执行
# 设置用户密码,用于后续 ssh 登录,root 用户实际也是这个密码
~ $ passwd
# 安装 ssh
~ $ # pkg install openssh
# 启用 ssh
~ $ sshd
# 查看自己的ip地址
~ $ ifconfig
# 至此,可以通过ip地址远程登录 termux,端口号为 8022
# 安装vim
~ $ pkg install vim
# 这是一个 Termux 常识。$PREFIX 是 termux 环境宏,实际路径如下,后面会用到。
~ $ echo $PREFIX
/data/data/com.termux/files/usr
# 安装nginx
~ $ pkg install nginx
# 编辑nginx配置
~ $ vim $PREFIX/etc/nginx/nginx.conf
# 启动nginx
~ $ nginx
# 安装 privoxy
~ $ pkg install privoxy
# 编辑 privoxy 配置
~$ vim $PREFIX/etc/privoxy/config
# 启动 privoxy
~ $ privoxy $PREFIX/etc/privoxy/config
# 安装 redis
~ $ pkg install redis
# 启动 redis 终端运行
~ $ redis-server
# 启动 redis 后台运行
~ $ redis-server --daemonize yes
# termux 能够支持大多数 linux 软件,还能支持标准的 linux 发行版,比如 ubuntu、debian 等,后续有需要再尝试。
# 4.5、设置 Termux 服务自启动
Termux:Boot
提供了服务自启动方案,即启动后自动执行文件: ~/.termux/boot/startup.sh
,所以创建 startup.sh
文件,然后添加 x
权限。
#!/data/data/com.termux/files/usr/bin/bash
# 注意,此处指定的解析器是 termux 的 bash
# Termux 保活,防止息屏后终止运行
termux-wake-lock
# 启动 ssh
sshd
# 启动 nginx
nginx
# 启动 redis
redis-server --daemonize yes
# 启动 privoxy
privoxy $PREFIX/etc/privoxy/config
# 4.6、设置 Termux 用户登录自动运行
在 Termux
用户目录创建 .bashrc
文件,每次用户登录后,则会直接运行该脚本。
.bashrc
本质上是一个配置文件,与 magisk
的启动脚本类似,无需添加 shebang line
,也无需添加 x
权限。
~ $ vim .bashrc
# 此处判断 SSH 登录终端不执行,防止重复运行,如果不需要,则删除这个 if 即可。
if [ -z "$SSH_TTY" ]; then
# 暂时没想好需要运行什么内容,随便添加一行,测试可用性
echo "hello termux !"
fi
# 五、伪装与隐藏
因为很多软件和游戏会检测手机是否Root,然后会弹窗警告和闪退,所以基本的伪装是必要的。
# 5.1、Magisk 隐藏三部曲
- 随机包名:隐藏 Magisk 应用 (opens new window),直接设置自己想要在桌面显示的名称即可;
- 隐藏 root:Shamiko 安装 (opens new window),此处采用白名单模式隐藏;
- 隐藏应用列表:Hide My Applist 安装 (opens new window),这步还没操作,待验证。
# 5.2、桌面图标隐藏
安装软件:「Amarok」一键隐藏你的隐私文件和应用 (opens new window),然后设置 root 模式隐藏应用
即可。
# 六、一些待探索的问题以及发现的华点
# 1、待探索的问题
- BL 解锁问题,以后有机会再实践;
- 上文提到的从原机提取 boot.img 的方法,毕竟现在的方法很不可靠;
- init.rc 文件修改方法,涉及到 boot.img 的解包以及打包,以及文件挂载问题;
- 有必要学习下 Magisk 模块,以及 LSPosed 模块的编写。
# 2、华点
- Andoird USB 调试模式下,
adb reverse
指令建立端口映射居然可以绕开 Windows 防火墙。 - 关闭开发者模式后,直接用 Termux 启动 adbd 网络调试服务后,
adb connect
指令居然能成功连接。
# 七、后面可能要做的事情
# 1、硬件设计
后面可能会做个壳子,然后将整个手机放在壳子里,就像软路由那样。
既然放在壳子里,肯定要考虑直供电问题,手机锂电池4.3V,但常规的电源电压是5V,这地方计划直接用 5V 串二极管的方式来降压。二极管管压降刚好是0.7V,同时还能防止手机USB连接时反向给充电器充电。但手机开机电流应该蛮大的,二极管不知道可不可行,得试试。不行就买个开关电源。
因为小米11用骁龙888处理器,发热量大,公认的暖手宝,为了长期稳定的使用,需要考虑散热问题。
如果放在铁壳子里,可能会影响 Wi-Fi 信号,需考虑如何将 Wi-Fi 天线接出来,或者使用 RJ45 转 Type-C USB。经测试, RJ45 转 Type-C USB可以正常使用。
# 2、软件方面
- 初步计划安装 FTP、WebDav 等服务,放公司做 NAS 使用。
- 既然是放公司,是不是可以搞个自动打卡的脚本……
- 游戏挂机,每日签到、简单的日常挂机任务什么的能自动处理一下,不确定会不会被封号,先拿小号试试吧。