chroot的Linux服务配置-当云服务器真正用起来

在上一篇折腾的文章中介绍了已经root的Android手机部署Linux榨干性能的具体操作

(此处应该有链接,但是我不知道怎么插)

如果折腾完拉一个fastfetch就放那了, 那也太浪费了, 好不容易让已经逝世的Android再次复活, 当然得让它把活干起来, 我们手里不养闲机

跟着上一个教程完整弄完后, 我们拥有了一个标准的ARM Linux系统, 并且已经具备以下特性

  • 随着LinuxDeploy开机自启动, 自动获取CPU唤醒锁
  • 基本的sysv服务管理, SSH服务能被sysv自动拉起, 开机不需要任何操作就可以SSH连接
  • 可以连接外网, 下载/安装和更新软件

由于Android内核限制不支持docker以及systemd, 但是我们可以使用其他的服务管理

在此之前, 需要进行一些小的问题处理

1. 基本配置与问题处理

1.1 访问HTTPS提示x509

解决联网问题之后, 访问有些HTTPS地址会提示x509, 能ping通域名, 但是无法通过curl等工具实际访问页面

这是因为我们部署的系统太干净了, 缺少基础的根CA证书, 安装一下就能解决

bash 复制代码
apt update && apt install ca-certificates

安装后还提示509, 可尝试在~/.bashrc中设置环境变量export SSL_CERT_FILE=/etc/tls/cert.pem

1.2 SSH连接后的彩色显示/Tab补全/历史命令

  • 编辑 /etc/passwd 在对应用户名后将sh更改为bash

  • 编辑 ~/.bashrc 取消注释其中要显示颜色的行

    bash 复制代码
    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连接测试效果

1.3 禁用可能的进程杀手

Android 15+版本, Google 引入了极其严格的后台进程限制 (Background Execution Limits)和幻影进程杀手(Phantom Process Killer), 像Termux这种应用只要在后台占用的CPU过高, 或者子进程过多(比如超过32个), 可能会被系统杀后台

为避免这些问题, 让服务器稳定运行, 除了配置时提到的允许权限/打开通知/允许后台/电量使用无限制之外, 还可以进行以下操作, 确保万无一失

用termux(root)或者adb shell(root)连接, 打开命令行, 输入su切换root

bash 复制代码
su
# 增加幻影进程的最大数量限制至最大值 (LineageOS上未找到该选项, 但还是执行一下)
device_config put activity_manager max_phantom_processes 2147483647
# 禁用幻影进程监控开关
setprop persist.sys.fflag.override.settings_enable_monitor_phantom_procs false

配置好环境之后不要轻易更新系统, 否则可能导致配置失效

1.4 配置apt软件源解决下载过慢问题

若无特殊说明, 命令行都是在chroot中的Linux下执行, 清华源可以按照自己的需要替换, 使用https前先按照第一步处理好ca

bash 复制代码
cd /etc/apt
cp sources.list sources.list.bak
sed -i 's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/g' sources.list
apt update
# 确保ca-certificates已经安装,https访问正常
sed -i 's/http:/https/g' sources.list
apt update
apt dist-upgrade

2. supervisor服务管理器

自带的sysv可以用来管理一些提供了sysv脚本的服务, 比如ssh和supervisor, 但很多服务应用可能只提供systemd配置, 或者根本没有提供服务管理配置, 自己手撸sysv的服务管理脚本挺麻烦, 使用supervisor来配置服务会简单很多

apt安装supervisor, sysv设置supervisor自启动

bash 复制代码
apt install supervisor
service supervisor start
service --status-all

supervisor的配置文件与日志文件: 配置/etc/supervisor/supervisor.config, 日志/var/log/supervisor

常用命令

bash 复制代码
supervisorctl reload # 会重启所有管理的进程, 如果只是加载新添加的配置可以运行以下指令
supervisorctl reread # 重新读取配置文件
supervisorctl update # 刷新配置到进程组
supervisorctl help # 查看可用命令
supervisorctl -h # 帮助

若需要创建新的服务, 在/etc/supervisor/conf.d目录下新建服务配置即可管理服务

配置模板如下, 不是每一项都需要

ini 复制代码
[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.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=3
; 错误输出日志路径
stderr_logfile=/var/log/my_server_err.log

2.1 Siyuan笔记

包括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

ini 复制代码
[program:siyuan]
directory=/root/.local/bin/siyuan/resources
command=/root/.local/bin/siyuan/resources/kernel/SiYuan-Kernel -accessAuthCode mypasswd -lang zh_CN -workspace /root/siyuan -wd /root/.local/bin/siyuan/resources
autostart=true
autorestart=true
startreties=3
stderr_logfile=/var/log/siyuan.err
stdout_logfile=/var/log/siyuan.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=3
;redirect_stderr=true
environment=RUN_IN_CONTAINER=1

启动服务, 查看日志

bash 复制代码
supervisorctl update
cat /var/log/siyuan.log

若一切正常, 可以访问http://ip:6806愉快使用

2.2 code-server开发环境

这是一个Web端的VSCode, 在Termux环境下我也尝试部署过, 发现启动正常但是大多数插件都提示不支持Web平台, 在chroot环境下又部署了一个, 发现插件都可以用

下载code-server需要设置代理, 直接使用官方脚本

bash 复制代码
# 设置为自己局域网内的代理地址
export https_proxy=http://192.168.9.7:10808
# 使用官方脚本安装
curl -fsSL https://code-server.dev/install.sh | sh

如果代理不方便处理, 可以直接从github上下载Linux ARM64版本, 解压到设备上

先运行一次, 生成基础配置文件

bash 复制代码
code-server
# 修改配置文件
nano ~/.config/code-server

配置如下

yaml 复制代码
# 监听地址和端口
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

ini 复制代码
[program:code-server]
directory=/root
command=/usr/bin/code-server
autostart=true
autorestart=true
startreties=3
stderr_logfile=/var/log/code-server.err
stdout_logfile=/var/log/code-server.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=3

如果扩展安装/下载失败, 可以自己下载, 拖到vscode文件目录中, 命令行安装

bash 复制代码
code-server --install-extension ./xxxx.vsix

安装自己开发常用扩展, 比如: neo-git-graph, dracula theme, indent-rainbow, render line endings, python, python debugger, godot-tools, godot files, clangd

2.3 lighttpd导航Web页

bash 复制代码
apt install lighttpd -y

安装完成后已经自动在/etc/init.d目录下创建自启动配置, 运行配置在/etc/lighttpd/lighttpd.conf, 默认网站路径为/var/www/html/

bash 复制代码
# 开启lighttpd服务
service lighttpd start
# 已经可以看到lighttpd服务
service --status-all

访问http://ip:80, 页面正常, 替换页面/var/www/html/index.lighttpd.html

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>

2.4 以Headless运行Godot

打开godot官网: github.com/godotengine...

下载版本: stable_linux.arm64

虽然不能用图形界面, 但可以headless模式运行, 可以在code-server中配合插件开发调试 (需要添加headless参数), 或者进行CI/DI集成

运行之后提示一个错误:

libfontconfig.so.1: cannot open shared object file: No such file or directory

来搜索解决一下

bash 复制代码
apt install libfontconfig1

安装后再运行, 不再提示错误

但是提示root用户风险, 可以在.bashrc中添加export GODOT_SILENCE_ROOT_WARNING=1, 之后执行source .bashrc屏蔽掉

2.5 在code-server中进行headless模式的Godot开发调试

语言服务器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", 会生成一个默认配置, 默认生成的调试配置如下

json 复制代码
{
    "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游戏了!


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

  • proot下的ARM Linux自启动与服务管理方案
  • chroot/proot环境部署v2raya代理
  • chroot/proot环境部署Claude Code/Codex
  • chroot/proot环境部署OpenClaw/NanoClaw
相关推荐
Digitally2 小时前
5 种在安卓手机 / 平板与电脑间同步音乐的方法
android
野生技术架构师2 小时前
一个简单SQL的深度解析
android·数据库·sql
云飞云共享云桌面2 小时前
研发部门使用SolidWorks和ug,cad,设计共享云桌面应该怎么选?
运维·服务器·网络·人工智能·3d
zh_xuan2 小时前
Android SharedFlow实现事件总线
android·sharedflow
坏小虎2 小时前
Expo 快速创建 Android/iOS 应用开发指南
android·ios·rn·expo
csj502 小时前
安卓基础之《(27)—真机调试》
android
BullSmall2 小时前
linux 系统下模拟网络丢失和ping延迟,可以怎么来模拟
linux·网络·php
brahmsjiang2 小时前
理解Android AOT编译与内存映射:从Zygote启动到页表权限隔离
android·linux·zygote
亚空间仓鼠2 小时前
OpenEuler系统常用服务(十)
linux·运维·服务器·网络