云计算百科
云计算领域专业知识百科平台

手机自建博客并打通 IPv6 公网:Termux + Ubuntu chroot + Halo 2

适用场景:

  • 安卓手机已 Root


一、安装termux

1.1 安装 Termux

本站提供了一个下载链接(有github的可以到GitHub上下载)

https://github.com/termux/termux-app/releases/download/v0.119.0-beta.3/termux-app_v0.119.0-beta.3+apt-android-7-github-debug_universal.apk

1.2 Termux 初始化与更新

进入 Termux 后执行:

termux-setup-storage
pkg update -y
pkg upgrade -y

1.3 安装常用工具(SSH/下载/解压/同步)

pkg install -y openssh rsync curl wget tar unzip

2. 选择 Ubuntu 安装目录

我建议放到 /data/local/ubuntu(稳定、不在 sdcard 上):

su -c "mkdir -p /data/local/ubuntu && chmod 700 /data/local/ubuntu"

二、termux内安装Ubuntu

3. 下载 Ubuntu Base(arm64)并解压

Ubuntu Base 的官方发布页在这里(noble/24.04.x)。我用 24.04.3 举例(arm64):

cd ~
wget -O ubuntu-base.tar.gz https://cdimage.ubuntu.com/ubuntu-base/releases/noble/release/ubuntu-base-24.04.3-base-arm64.tar.gz

解压到目标目录(一定要用 root 解压,保留属主/权限):

su -c "tar -xpf /storage/emulated/0/Download/ubuntu-base-24.04.3-base-arm64.tar.gz -C /data/local/ubuntu –numeric-owner"

创建一些常用挂载点:

su -c "mkdir -p /data/local/ubuntu/{proc,sys,dev,dev/pts,run,tmp,mnt/sdcard}"

把 Termux 的 DNS 配置同步进 Ubuntu(避免进 chroot 后没网):

su -c "cp -f /data/data/com.termux/files/usr/etc/resolv.conf /data/local/ubuntu/etc/resolv.conf"


4. 做“一键进入 Ubuntu”的启动脚本

在 Termux 里创建 start-ubuntu.sh:

cat > ~/start-ubuntu.sh <<'EOF'
#!/data/data/com.termux/files/usr/bin/bash
set -e

UBU=/data/local/ubuntu
BB=/data/data/com.termux/files/usr/bin/busybox

# sync DNS
su -c "cp -f /data/data/com.termux/files/usr/etc/resolv.conf $UBU/etc/resolv.conf" 2>/dev/null || true

# mounts
su -c "mount -t proc proc $UBU/proc" 2>/dev/null || true
su -c "mount -t sysfs sysfs $UBU/sys" 2>/dev/null || true
su -c "mount –bind /dev $UBU/dev" 2>/dev/null || true
su -c "mount –bind /dev/pts $UBU/dev/pts" 2>/dev/null || true
su -c "mount –bind /sdcard $UBU/mnt/sdcard" 2>/dev/null || true

# enter chroot
su -c "$BB chroot $UBU /usr/bin/env -i HOME=/root TERM=$TERM \\
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \\
/bin/bash –login"
EOF

chmod +x ~/start-ubuntu.sh

运行进入 Ubuntu:

./start-ubuntu.sh


5. 第一次进 Ubuntu 后要做的初始化

进来后先装基础包、建用户:

apt-get update
apt-get install -y sudo ca-certificates curl vim net-tools iproute2 openssh-server
passwd root

adduser xin
usermod -aG sudo xin

(可选)设置时区:

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime


6. 启动 SSH(可选)

Ubuntu 在 chroot 里一般不会自动起服务,所以手动起 sshd:

mkdir -p /run/sshd
/usr/sbin/sshd

然后你就能在同一局域网里用电脑 SSH 到手机(前提是手机和电脑互通)。

三、部署 Halo 2(跑在 8090)

1)创建目录

mkdir -p /opt/halo /opt/halo/.halo2
ls -ld /opt/halo /opt/halo/.halo2

2)下载 Halo Jar

进入目录后下载:

cd /opt/halo
wget -O /opt/halo/halo.jar https://dl.halo.run/release/halo-2.22.3.jar
ls -lh /opt/halo/halo.jar

如果你已经下载到了别处(比如 /root/halo.jar),那就用移动命令:

mv /root/halo.jar /opt/halo/halo.jar
ls -lh /opt/halo/halo.jar

3)写 Halo 配置文件 application.yaml

自动取 wlan0 的 IP:

IP=$(ip -4 addr show wlan0 | awk '/inet /{print $2}' | cut -d/ -f1 | head -n1)

cat > /opt/halo/.halo2/application.yaml <<EOF
server:
port: 8090
halo:
work-dir: /opt/halo/.halo2
external-url: http://$IP:8090
EOF

cat /opt/halo/.halo2/application.yaml

external-url 建议填你手机在局域网的 IP,这样同一 WiFi 下电脑可以直接访问。

4)写启动脚本(java -jar)

cat > /opt/halo/start.sh <<'EOF'
#!/usr/bin/env bash
set -e
cd /opt/halo
nohup java -jar /opt/halo/halo.jar \\
–spring.config.additional-location=optional:file:/opt/halo/.halo2/ \\
> /opt/halo/halo.log 2>&1 &
echo $! > /opt/halo/halo.pid
echo "Halo started. PID=$(cat /opt/halo/halo.pid)"
EOF

chmod +x /opt/halo/start.sh

5)启动 Halo

/opt/halo/start.sh

6)验证 Halo 是否启动成功

ss -lntp | grep ':8090' || echo "8090 not listening yet"
tail -n 120 /opt/halo/halo.log

当你看到类似:

  • Netty started on port 8090

  • Started Application … 并且:

ss -lntp | grep ':8090'

能看到 LISTEN … *:8090 … users:(("java",pid=xxxxx,…)) 就说明 Halo 服务已经起来了。


四、在 chroot Ubuntu 里安装并启动 MariaDB(MySQL)

你是为了 Halo 用 MySQL。这里按你最终跑通的方式写:手动启动 mariadbd。

1)安装 MariaDB

apt-get update
apt-get install -y mariadb-server

2)准备运行目录、tmp 目录、数据目录权限

mkdir -p /run/mysqld /var/tmp /var/lib/mysql
chmod 1777 /var/tmp
chown -R mysql:mysql /run/mysqld
chown -R mysql:mysql /var/lib/mysql

3)初始化系统表(解决 mysql.* 表不存在)

你遇到过 hostname/resolveip 的提示,所以用 –force 直接初始化最稳:

mariadb-install-db –user=mysql –datadir=/var/lib/mysql –force

4)chroot 下手动启动 mariadbd(后台 nohup)

nohup /usr/sbin/mariadbd \\
–user=mysql \\
–datadir=/var/lib/mysql \\
–socket=/run/mysqld/mysqld.sock \\
–pid-file=/run/mysqld/mysqld.pid \\
–tmpdir=/var/tmp \\
–skip-networking=0 \\
–bind-address=127.0.0.1 \\
> /var/log/mariadb.log 2>&1 &

5)验证 MariaDB 是否 alive

mysqladmin –socket=/run/mysqld/mysqld.sock ping

看到 mysqld is alive 就成功。

如果想看日志:

tail -n 120 /var/log/mariadb.log


五、创建 Halo 用的 MySQL 数据库和账号

你之前遇到过:

  • Access denied for user 'halo'@'localhost'

所以最稳做法是 同时创建 halo@localhost 和 halo@127.0.0.1 两个用户(密码相同):

mysql –socket=/run/mysqld/mysqld.sock -uroot <<'SQL'
CREATE DATABASE IF NOT EXISTS halo
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

CREATE USER IF NOT EXISTS 'halo'@'127.0.0.1' IDENTIFIED BY 'Halo@123456';
CREATE USER IF NOT EXISTS 'halo'@'localhost' IDENTIFIED BY 'Halo@123456';

GRANT ALL PRIVILEGES ON halo.* TO 'halo'@'127.0.0.1';
GRANT ALL PRIVILEGES ON halo.* TO 'halo'@'localhost';

FLUSH PRIVILEGES;
SQL

验证:

mysql –socket=/run/mysqld/mysqld.sock -uhalo -pHalo@123456 -e "SHOW DATABASES;"
mysql –socket=/run/mysqld/mysqld.sock -uroot -e "SELECT User,Host FROM mysql.user WHERE User='halo';"

你之前验证过能看到:

  • halo | 127.0.0.1

  • halo | localhost

这就是正确状态。


六、安装 MariaDB JDBC

这一步你已经成功:/usr/share/java/mariadb-java-client.jar

apt-get install -y libmariadb-java
ls -lh /usr/share/java | egrep -i 'mariadb|mysql'


七、Halo 的启动/停止/修正 PID

1)停止 Halo

if [ -f /opt/halo/halo.pid ]; then kill -9 "$(cat /opt/halo/halo.pid)" 2>/dev/null || true; fi
pkill -f "halo.jar" 2>/dev/null || true

2)启动 Halo

/opt/halo/start.sh

3)确认监听端口

sleep 5
ss -lntp | grep ':8090' || echo "8090 still not listening"

4)修正 halo.pid(避免脚本 PID 和真实监听 PID 不一致)

你也看到过:start.sh 打印的 PID 不一定就是最终监听 8090 的 PID。最稳是从 ss 里取:

PID=$(ss -lntp | awk -F'pid=' '/:8090/{print $2}' | awk -F',' '{print $1}' | head -n1)
echo "$PID" > /opt/halo/halo.pid
echo "halo.pid fixed => $(cat /opt/halo/halo.pid)"


八、验证

1)Halo 监听成功

ss -lntp | grep ':8090'

2)Halo 日志正常

tail -n 80 /opt/halo/halo.log

3)MariaDB alive

mysqladmin –socket=/run/mysqld/mysqld.sock ping

4)Halo 数据库存在、账号可登录

mysql –socket=/run/mysqld/mysqld.sock -uhalo -pHalo@123456 -e "SHOW DATABASES;"


九、找运维师傅光猫开启IPv6

由于现在很多运营商都是动态超密了所以我的建议是直接找运维小哥开ipv6并且要到超密(超密不知道何时失效)

十、光猫关闭防火墙开IPv6虚拟主机

1)关闭IPv6防火墙

通过安全-防护墙-IPv6防护墙,有等级调制中等,没有等级直接关闭即可

2)查看外网是否可以访问

1.手机浏览器访问https://ipv6ready.me/index.html.zh_CN即可查看是否为公网 2.通过各种IPv6 ping的网站去测试是否可以ping通如果可以就已经完成,不行就继续下面的步骤

3)设置IPv6虚拟服务器(关闭防火墙后外网能访问即可不用设置了)

通过应用-高级NAT配置-IPv6虚拟服务器设置新增相应的服务器

十一、疑难杂症

1)无法获取到IPv6地址或者是获取了无法上网

查看上级路由设备是否开启了IPv6透传如果没有请开启不支持请直连光猫或者换路由器

2)某些端口无法开放

运营商规则由于无法备案目前我看是80、443、8080端口都无法访问

赞(0)
未经允许不得转载:网硕互联帮助中心 » 手机自建博客并打通 IPv6 公网:Termux + Ubuntu chroot + Halo 2
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!