用一台 2009 年的老一体机,试着给自己家装个 AI

先说清楚:我不是做这个的专业人士,下面写的都是自己一边查一边试出来的,很多地方可能不严谨,甚至有理解错的地方。如果你看到有问题,欢迎指出来。

起因很简单:家里有一台 2009 年的联想一体机,早就不当主力机用了,扔了可惜,放着积灰也浪费。我平时会和 AI 聊一些自己的事,包括一些不想随便往外传的东西,所以一直想试试——能不能让它在自己的机器上跑,数据留在家里。

折腾了几周,现在算是能用了:平板打开一个网页就能跟它说话,它能读我的文件、跑命令、定时干活。下面把这过程记下来,重点是踩过的坑,因为那些坑我查了很久才弄明白。

拓扑图

大概是这样。平板只是个窗口和输入框,活都在这台老机器上干。右下角那个虚线箭头是唯一出网的地方——模型推理还是要走云 API,这点我没能绕过去。


一、为什么想装在自己机器上

三个理由,都是很私人的考虑,不一定适合你:

  1. 有些事情不想上传。 比如整理家里的老照片、翻一些自己的笔记。不是做了什么见不得人的事,就是单纯觉得没必要。
  2. 网页版的 AI 只能聊天。 我想让它直接动手——读文件、改文件、按时间干活。这个只有装在自己机器上才做得到。
  3. 不想看别人脸色。 服务关了、涨价了、账号出问题,我这边就断了。

代价也很实在:什么都得自己维护。 掉电、内存爆、服务不自启,这些我都遇到过,后面会写。


二、这台机器

项 值
机器 联想一体机,2009 年,Core2 双核
内存 6 GB(4+2,不对称,单通道)
系统盘 国产 TLC 固态 512 GB
系统 Linux Lite 7.8 / 内核 6.8
平时负载 空闲 0.3 左右,忙起来 1.5–2

这台机器不算老古董,但也确实不年轻了。我做的唯一一件正经优化是开 zram:6 GB 内存跑现代软件很容易爆,用 zram 拿一部分内存压缩后当交换区用,我看的那台压缩比大约 2.5:1,等于多出一两个 G。这步没做的话,后面会一直卡。

1
2
3
# 有 /dev/zram0 且是 swap,就说明开了
zramctl
swapon --show

三、我是怎么装的

第 1 步:装 AI 助手本体

我用的是 Hermes Agent,开源的,pip 装。选它主要是因为它能调用工具(读写文件、跑命令),也有会话记忆,不是只能聊天的壳子。它未必是最好的选择,我只是用它用顺手了。

1
2
pip install --user hermes-agent      # 或者按官方文档的安装方式
hermes --version

第 2 步:让它常驻

一开始我用 nohup 挂在后台,重启一次就全没了。后来改成 systemd 用户服务——我不是很懂 systemd,这配置是照着别人的例子改的,能用:

1
2
3
4
5
6
7
8
9
10
11
12
# ~/.config/systemd/user/ai-agent.service
[Unit]
Description=AI agent gateway
After=network-online.target

[Service]
ExecStart=%h/.local/bin/hermes gateway run
Restart=on-failure
RestartSec=5

[Install]
WantedBy=default.target
1
2
3
systemctl --user daemon-reload
systemctl --user enable --now ai-agent.service
loginctl enable-linger $USER

最后那行 enable-linger 我漏过很久——没它的话,注销之后服务就跟着停了,我一直以为是程序本身有问题。

第 3 步:把终端搬到平板上

我不太想在电脑前面坐着,所以想让平板也能用。试过几个办法,最后走的是 ttyd(浏览器里的终端)+ tmux(会话不丢):

1
2
3
4
sudo apt install ttyd tmux

ttyd -p 7681 -i 0.0.0.0 -W -c 用户名:密码 \
tmux new -A -s ai /home/你/.local/bin/hermes --tui

平板浏览器打开 http://你的局域网IP:7681,输用户名密码。

  • -W 是允许写入。不加的话页面能开但打不了字,我第一次就以为是坏了
  • tmux new -A -s ai:没有就新建,有就接上。这样换个设备、关掉浏览器、Wi-Fi 断了再回来,还在原来那段对话里
  • -c 用户:密码 是基本认证。这一条别省,-i 0.0.0.0 又不带密码,等于把整台机器的终端交给同一个网络里的所有人

第 4 步:把字放大(我最后才想到的)

平板能打开之后,我盯着那个界面看了半天才反应过来问题在哪:字太小了,输入那一行几乎是看不清的。而这个字号是 ttyd 启动参数里写死的:

1
2
-t fontSize=13   # 平板上基本没法用
-t fontSize=20 # 我现在用的

字号对比

同一个 tmux 会话、同一段输出,只改了 fontSize。左边 13,右边 20。


四、我踩的三个坑

坑 1:在同一个 Wi-Fi 里,换了个 IP 就打不开

我的机器有两块网卡,而且都在同一个网段(有线 192.168.31.95、无线 192.168.31.18)。平板连的是无线那个地址,我一开始随手给了它有线的那个。

结果很怪:平板说打不开,但服务明明是好的。

后来在机器上看谁真的连进来了,才明白:

1
2
ss -tn | grep :7681        # 看对端 IP,和本机是哪个地址在接
ip -4 -o addr show # 列出本机所有地址

平板是连上了,但回包从另一块网卡出去,源地址不是平板认的那个,所以它一直等。这个现象叫非对称路由,我没有去改路由表,只是改成给对方它真正在用的那个 IP,就好了。

坑 2:改字号,把自己的会话弄没了

ttyd 是 systemd 管着的,而 tmux 会话是它的子进程,在同一个 cgroup 里。所以:

1
systemctl --user restart ttyd-ai     # 会把 tmux 里的 AI 一起杀掉

我第一次改字号就是这么干的,正在聊的那段直接没了。后来学乖了:先用另一个端口起一个新实例比对,满意了再择机换。

1
2
ttyd -p 7682 -i 0.0.0.0 -W -c 用户名:密码 \
tmux new -A -s ai /home/你/.local/bin/hermes --tui

-A 会接上同一个会话,所以新端口打开看到的是同一段对话,只是字号不同。这个办法我现在一直在用。

坑 3:服务活着,不等于它健康

systemctl is-active 只告诉我进程没死。有一回它确实活着,但内存吃到 1.7 GB(这台一共才 6 GB),负载飙到 5,整台机器跟卡住了一样。

后来我养成了看这几个的习惯:

1
2
3
free -h
uptime
ps -eo pid,pcpu,pmem,etime,args --sort=-pcpu | head

在这台机器上,内存比 CPU 先出问题。


五、花了多少钱

  • 机器:0 元,家里原来就有的
  • 软件:都是开源的
  • 电费:一体机常开,我估摸着一个月二三十块,这只是估的,没细算过

六、现在的样子,和我不确定的地方

平时我就躺着,平板点开那个地址,跟它说”把外接硬盘上的照片按年份理一下,原件别删”,然后看它一条条做。用着还算顺手。

但也有不少我还没搞明白的:

  • 它偶尔会把事情做过头,我得盯着,不敢完全放手
  • 云端推理这一步我没能替掉,所谓”数据不出门”其实是打折的——文件和记忆留在本地,但对话内容还是会经过模型提供方。这一点我不想说得比实际更好听
  • 这套东西适不适合长期用,我自己也还在看

写下来主要是因为踩坑的时候查不到中文的完整记录,希望这些能省别人一点时间。如果我的理解哪里有错,欢迎说。


本文命令都在这台 6 GB / 双核的机器上跑过。你的机器如果更老,先把 zram 开起来再谈别的。


用一台 2009 年的老一体机,试着给自己家装个 AI
https://genui.art/2026/10/18/2026-10-18-lao-yiti-ji-zhuang-ai/
作者
快乐
发布于
2026年10月18日
许可协议