家里云的另一种实现方式
长期搞“家里云”,以前要么是动辄上百瓦的x86,要么是价格被炒高的arm小主机。本文章另一种实现方式:用闲置手机改,成本低、性能强,带电池还算个UPS)。
设备选择
这次选的是 一加6T (OnePlus 6T)。 骁龙845+8G+128G,大概 200块不到 就能拿下。 对比一下,现在同性能的ARM开发板或者树莓派,算上电源散热外壳,少说也要300-500往上。而且手机改完服务器,长期运行功率也就 5W不到,电费几乎可以忽略。 可以流畅跑Home assistant,青龙版本等等各种服务
系统选择
既然要长期稳定运行,Android肯定是不行的,限制太多。我们要刷真的Linux——PostmarketOS 。此系统基于alpine linux,大体使用与普通主机无区别。此文章基于v25.12版本的PostmarketOS。
刷机
去pmOS官网下载对应机型(oneplus-fajita)的包,解压出来拿到 boot.img 和 userdata.img。
手机进Fastboot,几行命令搞定:
fastboot flashing unlock # 手机上按音量键选解锁,电源键确认
fastboot erase dtbo
fastboot flash boot boot.img
fastboot flash userdata userdata.img
fastboot reboot初始化 & SSH
重启后进入桌面:
- 触屏连上家里的WiFi。
- 打开终端,敲命令开SSH:
Bash sudo systemctl enable --now sshd - 看眼IP,电脑SSH连上去,把手机插一个地方就行了。
改时区:
sudo timedatectl set-timezone Asia/Shanghai
sudo timedatectl set-ntp true电源管理:防鼓包脚本
长期插着电肯定怕电池鼓包。虽然不是旁路供电,但我们可以通过脚本控制充放电阈值(呼吸充电)。
原理就是改 /sys/class/power_supply/ 下的参数。我写了个带文件锁的脚本,防并发冲突。
脚本 battery_ctrl.sh:
#!/bin/bash
# 路径根据机型可能不同,一加6t是这个
CHARGER_NODE="/sys/class/power_supply/pmi8998-charger"
BATTERY_NODE="/sys/class/power_supply/bq27411-0"
CTRL_FILE="$CHARGER_NODE/current_max"
CAP_FILE="$BATTERY_NODE/capacity"
# 阈值:65%停,50%充
MAX_CAP=65
MIN_CAP=50
CHARGE_uA=1500000 # 1.5A
STOP_uA=0
# 加个锁,防止脚本多开
LOCK_FILE="/tmp/battery_ctrl.lock"
exec 200>"$LOCK_FILE"
flock -n 200 || exit 1
if [ ! -f "$CTRL_FILE" ] || [ ! -f "$CAP_FILE" ]; then
exit 1
fi
NOW_CAP=$(cat "$CAP_FILE")
NOW_SETTING=$(cat "$CTRL_FILE")
if [ "$NOW_CAP" -ge "$MAX_CAP" ]; then
# 到了上限,切断电流
if [ "$NOW_SETTING" -gt "$STOP_uA" ]; then
echo "$STOP_uA" > "$CTRL_FILE"
fi
elif [ "$NOW_CAP" -le "$MIN_CAP" ]; then
# 掉到底线,恢复充电
if [ "$NOW_SETTING" -lt "$CHARGE_uA" ]; then
echo "$CHARGE_uA" > "$CTRL_FILE"
fi
fi
flock -u 200别忘了给权限,然后加到 Crontab 里每分钟跑一次:
chmod +x battery_ctrl.sh
# 输入 sudo crontab -e 添加:
* * * * * /root/battery_ctrl.shDocker以及各种服务的避坑指南
目前pmOS上Systemd还在完善中,直接 apk add docker 装完是用不了的。
你会发现起不来,报错 code=exited, status=1/FAILURE。这是因为官方包里的Systemd配置文件路径写歪了。
手动修正一下:
# 1. 建个目录
sudo mkdir -p /etc/systemd/system/docker.service.d
# 2. 强行覆盖ExecStart路径
printf "[Service]\nExecStart=\nExecStart=/usr/bin/dockerd\n" | sudo tee /etc/systemd/system/docker.service.d/override.conf
# 3. 重载,搞定
sudo systemctl daemon-reload
sudo systemctl restart docker包括其他的服务,你也需要进行如上的操作,才能正常使用Systemd
外网访问
- 有公网IPv6的直接跑个DDNS。
- 没有的就挂个FRP
欢迎留言哦~
对此博文有任何问题欢迎交流哦~
本文章所有内容仅供学习和参考,作者已尽力确保其准确性。因跟随本文章操作而导致的任何数据丢失、设备损坏或其他直接或间接损失,作者概不负责。请在操作前务必做好数据备份,并自行承担所有风险。