十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

手机安装CentOS7并搭建LNMP:Termux+proot完整实战

手机安装CentOS7并搭建LNMP:Termux+proot完整实战 手机安装 centos7 与 lnmp平时用电脑装个 CentOS 7 再配 LNMP 环境对玩服务器的朋友来说就跟吃饭喝水一样自然。但要是你说“我想在手机上把 CentOS 7 跑起来再把 Nginx、MySQL、PHP 全家桶也安排上”十个人里有九个会觉得你是在瞎折腾。不过说实话这事不仅能干而且干完之后对理解 Linux 系统结构、服务进程、网络配置这些底层逻辑帮助特别大。我当初就是在地铁上突发奇想后来在安卓手机上真把这套环境跑通了用手机浏览器访问自己搭出来的 PHP 页面那一刻瞬间感觉这些年没白折腾。这篇内容我会把“手机安装 CentOS 7 LNMP”的完整路子讲清楚。先说什么方案靠谱再一步步教你拿到一个能用的 CentOS 7 系统然后解决内存、存储、网络这些手机上特有的坑最后把 LNMP 四个组件逐一装起来并打通。整个过程不涉及硬件刷机、不改系统底层分区所有操作都在应用层完成相对安全可控适合想搞懂 Linux 运行原理的新手也适合想拿旧手机当临时开发测试机的老手。1. 手机运行 CentOS 7 的方案选型与底层逻辑1.1 为什么不是“刷机”而是“容器化”很多朋友一听到手机装 Linux下意识以为要把安卓干掉直接刷成 CentOS。对某些电视盒子或者开发板来说确实有把系统整个替换掉的玩法但手机不同驱动、基带、指纹、通信协议这些跟硬件绑得太紧了CentOS 官方根本不会为手机硬件适配驱动直接刷进去的结果大概率是变砖或者没信号。所以真正靠谱的思路是保留安卓系统在上面通过容器或者虚拟化方式跑一个 CentOS 7 的用户态环境。这相当于在安卓里开了一个“国中之国”虽然底层还是安卓内核但用户空间、系统库、命令工具全换成了 CentOS 7 的跑起来之后你看到的、用到的就是一个地地道道的 CentOS。我在各种方案里试了一圈最终长期用的组合是 Termux proot。Termux 是一个安卓上的终端模拟器自带软件源和包管理能在不 root 的情况下提供 Linux 环境proot 则是用户态的 chroot它通过 ptrace 系统调用来模拟 chroot 的能力不需要超级用户权限就能把另一个根文件系统“圈”进来。这套组合最大的好处就是不用 root安全性高而且 Termux 维护很活跃软件源里东西很全。还有其他几种方案简单对比一下方案是否需 Root性能损耗稳定性推荐场景Termux proot不需要较高系统调用翻译稳定新手学习、轻度测试、便携环境Termux chroot需要低稳定已 root 设备追求性能Linux Deploy需要低可定制有 root 且想自动部署模拟器跑虚拟机不需要极高一般不推荐手机散热和性能不够看1.2 硬件要求与镜像架构选择虽然说是“手机”但不同设备的处理器架构差别很大。绝大多数安卓手机是 ARM64 架构也就是 aarch64但如果你手里是个老电视盒子比如热词里提到过的 860av3.2-m那可能是 amlogic 芯片也是 ARM64还有些平板或者迷你主机用的是 x86_64 处理器。选镜像前一定先搞清楚自己的 CPU 架构用终端命令uname -m看一眼就行x86_64 和 aarch64 的包不能混用装错架构的软件会在运行时报“Exec format error”。内存方面跑 CentOS 7 本身占的内存很小但加上 MySQL 和 PHP-FPM 之后就不一样了。我建议至少 2GB 内存起步4GB 会更舒服。存储空间准备 8GB 以上CentOS 7 基础系统解压后大概 1-2GB装完 LNMP 之后再加上日志、临时文件、swap 分区5GB 很轻松就用掉了。1.3 这套环境能做什么、不能做什么在动手之前得摆正预期。手机上的 CentOS 7 LNMP 天然有两个短板一是计算性能手机 SoC 的单核和多核性能跟服务器 CPU 没法比编译源码时尤其明显二是 I/O 性能手机闪存本身不慢但 proot 的环境下 I/O 路径更长并发高了之后 MySQL 磁盘读写会明显吃力。所以它适合的是学习 Linux 命令、练习 Nginx 配置、调试 PHP 代码、临时跑个轻量站点、出门在外应急看看服务状态。不适合的是代替生产服务器、跑高并发应用、执行大规模数据库计算。2. 在手机上部署 CentOS 7 根文件系统2.1 Termux 初始化与基本软件准备第一件事去 F-Droid 下载 Termux。注意不要在应用商店直接装那个版本商店里的可能年久失修F-Droid 上的才是官方维护版本。装好之后先做一次软件源更新和升级pkg update pkg upgradeTermux 初始的软件源在国外国内网络访问速度不太理想可以先更换成清华或中科大的镜像源。用termux-change-repo命令就能进入图形化选源界面找到 China 对应的镜像选上即可。换完源再把后续需要的包装上pkg install proot wget tar xz-utils unzip which这里面的proot是运行容器环境的核心wget用来下载 CentOS 根文件系统压缩包tar和xz-utils用来解压which用于后续定位命令时排查问题。2.2 获取 CentOS 7 根文件系统CentOS 官方提供 Docker 镜像但不提供可以直接解压用的 rootfs 包所以通常的做法是从 Docker Hub 拉取 CentOS 7 镜像再导出。当然如果你设备能直接接受 Docker 那一套也可以在 Termux 里再套一层但那样层级太多运行效率更差不如直接下载 rootfs 压缩包。我用的命令是拉取官方仓库的 CentOS 7 镜像并导出为 tar 包wget https://github.com/CentOS/sig-cloud-instance-images/raw/CentOS-7-x86_64/docker/centos-7-x86_64-rootfs.tar.xz注意这个地址是 x86_64 架构的。如果你手机是 aarch64需要找对应架构的根文件系统。GitHub 上也有社区维护的多架构 CentOS 7 rootfs或者你可以在一台电脑上先用 Docker 导出对应架构的镜像再传到手机上——这个方式最灵活电脑上执行docker pull centos:7然后docker export把导出的 tar 包弄到手机里即可。拿到 rootfs 压缩包后在 Termux 里规划好工作目录建议把所有文件放在~/centos7下mkdir -p ~/centos7 cd ~/centos7 # 如果是 tar.xz 格式 tar -xJf centos-7-x86_64-rootfs.tar.xz # 如果是 tar 格式 tar -xf centos-7-rootfs.tar解压完成后你会在~/centos7下看到bin、etc、usr、var等目录这就是 CentOS 7 的根目录结构。2.3 编写启动脚本并进入 CentOS 7有了根目录还不够每次进入容器都要敲一长串 proot 参数太反人类了。我直接把启动命令写成一个脚本文件#!/data/data/com.termux/files/usr/bin/bash unset LD_PRELOAD proot \ --rootfs$HOME/centos7 \ --kernel-release3.10.0 \ -b /dev -b /proc -b /sys -b $HOME/centos7/tmp \ -w /root \ /usr/bin/env -i \ PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \ HOME/root \ TERM$TERM \ /bin/bash --login这里解释一下几个关键参数--rootfs指定 CentOS 7 的根目录位置-b是 bind mount把安卓的/dev、/proc、/sys映射进去。这三个目录是 Linux 运行的基础没有它们很多命令会报错-w /root指定当前工作目录env -i清理环境变量避免安卓的环境变量干扰 CentOS 内部程序保存为start-centos.sh并赋予执行权限以后每次想进 CentOS 就运行chmod x start-centos.sh ./start-centos.sh看到[rootlocalhost ~]#这样的提示符就说明你已经进入 CentOS 7 了。2.4 容器内的初始化配置刚进入容器首先要配网络。CentOS 7 里默认可能没有启用网卡或者网卡名跟实际的对不上。在 proot 环境下容器其实直接复用安卓的网络堆栈所以一般不需要配置 IP但 DNS 经常是空的。先检查一下cat /etc/resolv.conf如果内容不对直接写公共 DNSecho nameserver 223.5.5.5 /etc/resolv.conf echo nameserver 8.8.8.8 /etc/resolv.conf然后是 yum 源。CentOS 7 官方源已经不再维护了直接访问会 404 或者慢到怀疑人生。之前热词里也看到很多人搜“centos7换源”、“centos7配置本地yum源”。我建议把官方源替换成阿里云镜像源cd /etc/yum.repos.d/ sed -i s|mirrorlist|#mirrorlist|g CentOS-Base.repo sed -i s|#baseurlhttp://mirror.centos.org|baseurlhttp://mirrors.aliyun.com|g CentOS-Base.repo替换完执行yum clean all yum makecache验证一下源是否可用。这一步做完后面装软件的幸福感会提升一大截。3. 手机环境下必须处理的内存与系统细节3.1 交换分区别让 MySQL 死在半路手机内存再大跑起 MySQL PHP-FPM 也容易见底。Linux 系统的 OOM Killer 在内存不足时会随机杀掉进程我遇到过 MySQL 服务进程被杀死导致整个 LNMP 环境崩溃的情况非常无语。解决办法是在容器里设置 swap 文件让系统在内存吃紧时把一部分数据换到磁盘上。在 CentOS 容器内执行dd if/dev/zero of/swapfile bs1M count2048 mkswap /swapfile swapon /swapfile这样就会生成一个 2GB 的 swap 文件。注意别贪多手机闪存写入寿命有限内存够用的话 swap 设置 1-2GB 就行。设置完后用free -h查看效果可以看到 Swap 一栏已经有容量了。但这只是临时生效重启容器后 swap 就丢了。想每次启动自动挂载就把启动脚本里在 proot 命令之前先执行# 在 start-centos.sh 里proot 之前加入 $HOME/centos7/usr/sbin/swapon /swapfile 2/dev/null || true也可以进入容器后在/etc/rc.d/rc.local里加swapon /swapfile不过因为容器里 systemd 跑不起来rc.local 也不一定生效所以最稳妥还是放在 Termux 的启动脚本里。3.2 容器里没有 systemd 怎么办这是个大坑我说清楚一点。CentOS 7 默认用 systemd 作为 init 系统但 proot 环境没有内核级别的 cgroups 权限systemd 是没法正常启动的。你运行systemctl start nginx大概率会报错“Failed to connect to bus”。所以容器里的服务管理要另想办法。我的经验是直接用命令启动服务或者写一个简陋的启动脚本。比如手动敲nginx它就以前台或守护进程方式跑起来了MySQL 用mysqld_safe 启动PHP-FPM 用php-fpm直接启动。需要开机自启的话只能在 Termux 的启动脚本里等 proot 进入 CentOS 后再自动执行这些命令。比如在start-centos.sh末尾加上proot ... /bin/bash -c nginx; mysqld_safe ; php-fpm这样每次启动容器LNMP 三大件就一起拉起来了。3.3 字符集与中文显示问题在容器里安装软件时经常遇到中文乱码是因为系统默认没有生成中文 locale。如果你的应用需要支持中文先看看现有 localelocale一般输出会是POSIX或者C没有中文。安装中文支持yum install -y kde-l10n-Chinese glibc-common localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 echo export LANGzh_CN.UTF-8 /etc/profile source /etc/profile弄完之后基本不会出现中文乱码了。不过提醒一句手机终端模拟器本身的字体和编码也要支持 UTF-8Termux 默认是支持的不用担心。3.4 软件包版本与依赖的取舍CentOS 7 仓库里的软件版本都比较老比如 PHP 默认是 5.4MySQL 是 5.7通过 MariaDB 替代。如果你是想搭一个能跑现代框架比如 Laravel的环境默认仓库的 PHP 版本肯定不够用需要额外引入 EPEL 和 Remi 仓库yum install -y epel-release rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-7.rpm yum install -y yum-utils yum-config-manager --enable remi-php74然后就能安装 PHP 7.4 了yum install -y php php-fpm php-mysqlnd php-gd php-xml php-mbstring这块非常关键很多人卡在“装完 PHP 但是版本太老跑个新项目一堆错”多半是没用 Remi 源。4. LNMP 环境搭建实战记录4.1 Nginx安装与虚拟主机配置先装 Nginxyum install -y nginx装完后 CentOS 7 里 Nginx 的配置文件在/etc/nginx/nginx.conf默认站点在/usr/share/nginx/html。在容器里因为没有 systemd所以启动方式是直接执行nginx。想测试配置有没有写错用nginx -t。我个人习惯不用默认站点而是给测试项目建一个独立虚拟主机配置文件放在/etc/nginx/conf.d/test.confserver { listen 8080; server_name localhost; root /usr/share/nginx/html; index index.php index.html index.htm; access_log /var/log/nginx/test.access.log; error_log /var/log/nginx/test.error.log; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }注意这里监听的是 8080 端口不是 80。因为 Termux 环境下 80 端口可能需要额外权限或者会跟手机上的其他服务冲突。用 8080 在手机上测试没什么区别访问的时候在手机浏览器里输入http://localhost:8080就行。改完配置执行nginx -t验证无误后nginx -s reload让配置生效。如果之前已经启动过 Nginx就用nginx -s stop先停掉再启动。4.2 MariaDB/MySQL初始化数据库与授权CentOS 7 默认源里没有 MySQL只有 MariaDB但 MariaDB 完全兼容 MySQL 的协议和命令用起来没什么不适感。yum install -y mariadb-server mariadb安装完成后因为容器里没有 systemd所以直接执行mysqld_safe --skip-grant-tables --skip-grant-tables是跳过权限验证这个适合首次初始化。此时再执行mysql -u root进入 MySQL 后先修复 root 密码删除无用账号FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY yourpassword; exit;然后把刚才的后台进程停掉用正常方式重新启动mysqladmin -u root -p shutdown mysqld_safe 启动正常后用密码登录测试一下mysql -u root -p顺手创建一个测试数据库和用户CREATE DATABASE testdb DEFAULT CHARACTER SET utf8mb4; CREATE USER testuserlocalhost IDENTIFIED BY testpass; GRANT ALL PRIVILEGES ON testdb.* TO testuserlocalhost; FLUSH PRIVILEGES; EXIT;这里有个很容易踩的坑手机环境内存小MariaDB 默认的innodb_buffer_pool_size是 128M如果本身可用内存只有 1-2GB加上 PHP-FPM 基本就爆了。建议在/etc/my.cnf里调小一点[mysqld] innodb_buffer_pool_size32M key_buffer_size8M max_connections20 skip-name-resolveskip-name-resolve这个参数特别重要它能让 MySQL 不对客户端 IP 做反解析连接速度会快很多而且能减少一定内存开销。4.3 PHP-FPM版本选择与 Nginx 联动有了之前的 Remi 源安装 PHP 7.4 就很顺手了。执行yum install -y php php-fpm php-mysqlnd php-gd php-xml php-mbstring php-jsonPHP-FPM 的默认配置在/etc/php-fpm.d/www.conf注意里面listen的配置。默认可能是listen /run/php-fpm/www.sockNginx 那边用的fastcgi_pass 127.0.0.1:9000是 TCP 模式。要么把 PHP-FPM 也改成 TCP 模式要么把 Nginx 配置改成 unix socket 模式。我这里保持统一直接把 PHP-FPM 改成listen 127.0.0.1:9000改完后执行php-fpm用ps aux | grep php-fpm确认进程是否起来了。接着在 Nginx 站点目录下创建测试文件echo ?php phpinfo(); ? /usr/share/nginx/html/index.php然后在手机浏览器打开http://localhost:8080/index.php能看到一大堆 PHP 配置信息就说明 Nginx 和 PHP-FPM 已经成功联通了。4.4 验证整个 LNMP 环境刚才看到 PHP 信息页只能说明 PHP 解析正常但 MySQL 还没验证。写一个测试脚本来验证数据库连接echo ?php $conn new mysqli(127.0.0.1, testuser, testpass, testdb); if ($conn-connect_error) { die(连接失败: . $conn-connect_error); } echo LNMP 环境运行正常MySQL 连接成功; ? /usr/share/nginx/html/dbtest.php浏览器访问http://localhost:8080/dbtest.php看到成功提示信息说明 Nginx 负责页面访问、PHP 负责业务处理、MySQL 负责数据存储三条链路全部打通。到这里手机上的 CentOS 7 LNMP 已经可以正常工作了。5. 常见问题与排查技巧实录5.1 网络访问不了yum 一直超时这是进入容器后第一个容易遇到的问题。现象是yum install卡住或者报 Could not resolve host。原因基本是两个一是/etc/resolv.conf里的 DNS 不对二是容器里没有设置网关。proot 环境下网络栈是复用的网卡和路由一般没问题最主要还是 DNS。解决方法就是前面写的强制写入公共 DNS并且注意容器启动后/etc/resolv.conf不会被自动重置。如果改完还是不行可以在 Termux 里先看看安卓侧能不能上网curl -I https://www.baidu.com如果安卓侧正常、容器内异常就八成是 DNS 问题反复确认/etc/resolv.conf内容。5.2 运行 MySQL 时内存不足被 OOM这是手机容器最麻烦的问题。MySQL 属于吃内存大户安卓后台还有一堆应用抢占内存。建议关闭手机上不必要的后台应用把/etc/my.cnf里的innodb_buffer_pool_size调低确保 swap 文件已经挂载不要同时跑过多服务如果 PHP-FPM 用不到可以先不启动我自己的体验是配置 2GB swap 之后跑一个个人博客的流量强度完全没问题不会 OOM。5.3 systemd 不能用服务怎么自启服务无法自启是容器模式的天然限制。我的解决办法是在 Termux 的启动脚本里用-c参数在进入容器的同时执行启动命令。比如这样proot ... /bin/bash -c mysqld_safe --skip-grant-tables sleep 5 php-fpm nginx /bin/bash --login sleep 5是给 MySQL 一点初始化时间否则 MySQL 没起来 PHP 连接数据库就会报错。这个脚本写好后每次启动容器就能直接得到一套可用的 LNMP 服务。5.4 网络端口占用或防火墙拦截手机上跑服务端口问题也得注意。Termux 本身不限制端口但有些定制安卓系统可能有额外限制。如果浏览器访问不到先检查 Nginx 是否在运行ps aux | grep nginx然后监听端口netstat -tlnp | grep 8080如果显示LISTEN正常还访问不了那可能是安卓系统的网络策略拦截了。切换飞行模式再打开试试或者换一个端口比如 8888。另外手机和电脑在同一 WiFi 下时你可以用电脑浏览器访问手机局域网 IP 加端口比如http://192.168.1.100:8080这样测试更接近真实环境。5.5 CPU 架构不匹配导致安装软件报错如果你是从网上随便找的 CentOS 7 rootfs很容易遇到架构不匹配问题。比如拿了个 x86_64 的包在 ARM64 设备上跑会直接报Exec format error。用uname -m进容器里确认一下当前架构再用file /bin/bash看看这个可执行文件的实际架构两者必须对应。如果发现不对老老实实找对应架构的 rootfs这个没有捷径架构错了后面全是坑。6. 一些我踩过坑后的实在建议这套折腾下来最深的感受是手机装 CentOS 不是“能不能跑”的问题而是“你用什么样的姿势跑”的问题。容器或者用户态模拟的方案虽然性能上有损失但胜在安全、可回退、不破坏手机原有系统。我自己的主力机也装了这套环境偶尔在外面临时改个配置、看个日志、跑个 PHP 脚本比掏电脑方便太多。再补充几个小技巧手机的 SSH 客户端连的自己 CentOS 容器是纯本机 loopback但如果你在同一个 WiFi 下用电脑 SSH 登录手机 Termux在 Termux 里映射端口后就能远程进入 CentOS体验会更好。折腾前先用cp备份 rootfs 目录因为某些配置改坏可能需要重新解压有备份就是秒级恢复。千万不要把手机 CentOS 环境直接暴露到公网哪怕是测试环境都不要手机上的系统和网络环境不适合承担公网暴露的风险。电源管理要留意如果充电时系统会自动休眠Termux 进程被后台冻结容器也会跟着卡住。可以先在安卓设置里给 Termux 应用加上“忽略电池优化”的权限保证它在后台稳定运行。这套环境我维持了大半年从最初在地铁上突发奇想到现在已经成为我日常的随身开发沙箱。手机性能虽然不强但它能做到真正意义上的“开机即用、随手可得”。如果你手里刚好有旧手机闲置与其让它落灰不如折腾成随身 Linux 环境重新定义“服务器”这三个字。
返回列表