在上一篇折腾的文章中介绍了已经root的Android手机部署Linux榨干性能的具体操作
如果折腾完拉一个fastfetch就放那了, 那也太浪费了, 好不容易让已经逝世的Android再次复活, 当然得让它把活干起来, 我们手里不养闲机
跟着上一个教程完整弄完后, 我们拥有了一个标准的ARM Linux系统, 并且已经具备以下特性
由于Android内核限制不支持docker以及systemd, 但是我们可以使用其他的服务管理
在此之前, 需要进行一些小的问题处理
解决联网问题之后, 访问有些HTTPS地址会提示x509, 能ping通域名, 但是无法通过curl等工具实际访问页面
这是因为我们部署的系统太干净了, 缺少基础的根CA证书, 安装一下就能解决
apt update && apt install ca-certificates安装后还提示509, 可尝试在~/.bashrc中设置环境变量export SSL_CERT_FILE=/etc/tls/cert.pem
source ~/.bashrc# You may uncomment the following lines if you want `ls' to be colorized:export LS_OPTIONS='--color=auto'eval "$(dircolors)"alias ls='ls $LS_OPTIONS'alias ll='ls $LS_OPTIONS -l'alias l='ls $LS_OPTIONS -lA'修改完成后重新开启一个SSH连接测试效果
Android 15+版本, Google 引入了极其严格的后台进程限制(Background Execution Limits)和幻影进程杀手(Phantom Process Killer), 像Termux这种应用只要在后台占用的CPU过高, 或者子进程过多(比如超过32个), 可能会被系统杀后台
为避免这些问题, 让服务器稳定运行, 除了配置时提到的允许权限/打开通知/允许后台/电量使用无限制之外, 还可以进行以下操作, 确保万无一失
用termux(root)或者adb shell(root)连接, 打开命令行, 输入su切换root
su# 增加幻影进程的最大数量限制至最大值 (LineageOS上未找到该选项, 但还是执行一下)device_config put activity_manager max_phantom_processes 2147483647# 禁用幻影进程监控开关setprop persist.sys.fflag.override.settings_enable_monitor_phantom_procs false配置好环境之后不要轻易更新系统, 否则可能导致配置失效
若无特殊说明, 命令行都是在chroot中的Linux下执行, 清华源可以按照自己的需要替换, 使用https前先按照第一步处理好ca
cd /etc/aptcp sources.list sources.list.baksed -i 's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/g' sources.listapt update# 确保ca-certificates已经安装,https访问正常sed -i 's/http:/https/g' sources.listapt updateapt dist-upgrade自带的sysv可以用来管理一些提供了sysv脚本的服务, 比如ssh和supervisor, 但很多服务应用可能只提供systemd配置, 或者根本没有提供服务管理配置, 自己手撸sysv的服务管理脚本挺麻烦, 使用supervisor来配置服务会简单很多
apt安装supervisor, sysv设置supervisor自启动
apt install supervisorservice supervisor startservice --status-allsupervisor的配置文件与日志文件: 配置/etc/supervisor/supervisor.config, 日志/var/log/supervisor
常用命令
supervisorctl reload # 会重启所有管理的进程, 如果只是加载新添加的配置可以运行以下指令supervisorctl reread # 重新读取配置文件supervisorctl update # 刷新配置到进程组supervisorctl help # 查看可用命令supervisorctl -h # 帮助若需要创建新的服务, 在/etc/supervisor/conf.d目录下新建服务配置即可管理服务
配置模板如下, 不是每一项都需要
[program:my_service]; 启动命令,注意这里写绝对路径, 不支持管道/通配符等复杂运算command=/usr/local/bin/my_server --port 8080 --config /etc/my_server/config.json; 程序运行的运行目录 (相当于 cd 到这个目录再执行)directory=/opt/my_server/; 以哪个用户的身份运行 (强烈建议不要全用 root)user=www-data; 随 supervisord 启动而启动autostart=true; 程序异常退出后自动重启autorestart=true; 重启重试次数startretries=3; 环境变量设置 (如果有的话)environment=RUST_LOG="info",NODE_ENV="production"; 标准输出日志路径stdout_logfile=/var/log/my_server_out.logstdout_logfile_maxbytes=50MBstdout_logfile_backups=3; 错误输出日志路径stderr_logfile=/var/log/my_server_err.log包括siyuan在内的一些服务之前在termux篇中也说过, 但是标准的ARM Linux环境兼容性更好, 不容易出现各种奇怪的问题
在Termux中搭建HTTP导航页服务时我没有使用lighttpd而是使用darkhttpd, 就是因为兼容性问题
因此, 我觉得有root时用chroot搭建arm linux环境, 没有root时在termux中用proot搭建arm linux环境才是最佳选择
在官网下载linux-arm64版本(依据设备架构, 后续以arm64为例)
解压到~/.local/bin/siyuan/
创建supervisor服务配置 /etc/supervisor/conf.d/siyuan.conf
[program:siyuan]directory=/root/.local/bin/siyuan/resourcescommand=/root/.local/bin/siyuan/resources/kernel/SiYuan-Kernel -accessAuthCode mypasswd -lang zh_CN -workspace /root/siyuan -wd /root/.local/bin/siyuan/resourcesautostart=trueautorestart=truestartreties=3stderr_logfile=/var/log/siyuan.errstdout_logfile=/var/log/siyuan.logstdout_logfile_maxbytes=10MBstdout_logfile_backups=3;redirect_stderr=trueenvironment=RUN_IN_CONTAINER=1启动服务, 查看日志
supervisorctl updatecat /var/log/siyuan.log若一切正常, 可以访问http://ip:6806愉快使用
这是一个Web端的VSCode, 在Termux环境下我也尝试部署过, 发现启动正常但是大多数插件都提示不支持Web平台, 在chroot环境下又部署了一个, 发现插件都可以用
下载code-server需要设置代理, 直接使用官方脚本
# 设置为自己局域网内的代理地址export https_proxy=http://192.168.9.7:10808# 使用官方脚本安装curl -fsSL https://code-server.dev/install.sh | sh如果代理不方便处理, 可以直接从github上下载Linux ARM64版本, 解压到设备上 (https://github.com/coder/code-server)
先运行一次, 生成基础配置文件
code-server# 修改配置文件nano ~/.config/code-server配置如下
# 监听地址和端口bind-addr: 0.0.0.0:8080# 授权方式 password 或者 none (无密码)auth: password# 密码password: asdfqwert# 开启自签名cert https (自签名的https浏览器会提示证书不安全, 忽略即可)cert: true最好开启https访问, 否则会有些功能受限制, 浏览器提示证书风险不用管, 反正只是局域网访问
supervisor服务配置 /etc/supervisor/conf.d/code-server.conf
[program:code-server]directory=/rootcommand=/usr/bin/code-serverautostart=trueautorestart=truestartreties=3stderr_logfile=/var/log/code-server.errstdout_logfile=/var/log/code-server.logstdout_logfile_maxbytes=10MBstdout_logfile_backups=3如果扩展安装/下载失败, 可以自己下载, 拖到vscode文件目录中, 命令行安装
code-server --install-extension ./xxxx.vsix安装自己开发常用扩展, 比如: neo-git-graph, dracula theme, indent-rainbow, render line endings, python, python debugger, godot-tools, godot files, clangd
apt install lighttpd -y安装完成后已经自动在/etc/init.d目录下创建自启动配置, 运行配置在/etc/lighttpd/lighttpd.conf, 默认网站路径为/var/www/html/
# 开启lighttpd服务service lighttpd start# 已经可以看到lighttpd服务service --status-all访问http://ip:80, 页面正常, 替换页面/var/www/html/index.lighttpd.html
<!doctype html><html lang="en-US"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <link rel="shortcut icon" href="#" /> <title>Services List</title> </head> <body> <div class="container"> <h1>Services List</h1> <div id="services" class="list-group"> </div> </div> <script> let services = [ ["https", "code-server", 8080, ""], ["http", "siyuan", 6806, ""], ]; let container = document.querySelector("#services"); let hostname = window.location.hostname; let content = ""; services.forEach((service) => { content += "<a class=\"list-group-item list-group-item-action\" " + "target=\"_blank\" " + "href=\"" + service[0] + "://" + hostname + ":" + service[2] + service[3] + "\">" + service[1] + "</a>\n"; }) container.innerHTML = content;</script> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script> </body></html>打开godot官网: https://github.com/godotengine/godot/releases
下载版本: stable_linux.arm64
虽然不能用图形界面, 但可以headless模式运行, 可以在code-server中配合插件开发调试 (需要添加headless参数), 或者进行CI/DI集成
运行之后提示一个错误:
libfontconfig.so.1: cannot open shared object file: No such file or directory
来搜索解决一下
apt install libfontconfig1安装后再运行, 不再提示错误
但是提示root用户风险, 可以在.bashrc中添加export GODOT_SILENCE_ROOT_WARNING=1, 之后执行source .bashrc屏蔽掉
语言服务器LSP连接: 代码提示, 自动补全, 文档提示
在code-server中安装godot-tools, godot-files两个扩展
确保godot在path目录中
在godot-tools配置中打开 lsp-headless (launch the LSP as a headless child process)
上述配置若正确无误, 则LSP是可以直接使用的, 不需要手动启动进程
Godot项目调试
打开调试侧边栏, 点击创建一个launch.json, 配置选择"GDScript Godot Debug", 会生成一个默认配置, 默认生成的调试配置如下
{ "name": "GDScript: Launch Project", "type": "godot", "request": "launch", "project": "${workspaceFolder}", "debug_collisions":false, "debug_paths":false, "debug_navigation":false, "additional_options": ""}默认配置直接打断点调试是跑不起来的, 必须在additional_options配置中加上--headless参数
直接F5试试, 很棒, 可以正常调试运行, 变量, 堆栈都可以正常显示, 可以拿手机摸鱼开发Godot游戏了!

你们还想看哪些折腾教程呢, 打在评论区吧