在 Armbian 上为虚拟桌面安装 Chromium 浏览器(踩坑全记录)
上一篇写了整套远程桌面的搭建(Xvfb + XFCE + noVNC + nps),这篇单独把"浏览器"这个环节展开讲。看起来只是
apt install一条命令的事,但在 root 用户、无真实屏幕、ARM 架构这几个条件叠加下,我实际踩了四五个坑。如果你也在 Armbian / 树莓派 / 任何 ARM 板子上装 Chromium,这篇文章应该能帮你少走弯路。
一、环境前提
- 系统:Armbian(Debian 系),root 用户直接操作
- 显示:无真实屏幕,图形界面跑在虚拟显示器
:99(Xvfb)上 - 架构:ARM64
还没搭好虚拟桌面的,建议先看上一篇文章把 Xvfb + XFCE + noVNC 跑起来,浏览器是装在"桌面里"的。
二、安装:一条命令
bash
sudo apt update
sudo apt install -y chromium
就这一条。Debian/Armbian 源里的 chromium 包是为 ARM 编译好的,不需要下载 Chrome 官方的 deb(那个是 amd64 的,ARM 装不上;网上很多教程教下载 Chrome 安装包的步骤在 ARM 板子上直接作废)。
如果提示找不到 chromium 包,可能你的源里包名叫:
bash
sudo apt install -y chromium-browser
两个名字试哪个存在用哪个。
安装完验证:
bash
chromium --version
能输出版本号(如 Chromium 120.x.x.x)就说明装好了。
三、第一个坑:直接启动报 Permission denied
装完我兴冲冲地敲:
bash
DISPLAY=:99 chromium &
结果报错:
/root: Permission denied
原因:root 用户运行 Chromium 时,它尝试在 /root 下创建/读取配置目录的方式与普通用户不同,加上默认 sandbox(沙箱)机制在 root 环境下的限制,直接就起不来。
解法:加 --no-sandbox 和显式的 --user-data-dir:
bash
DISPLAY=:99 chromium --no-sandbox --user-data-dir=/root/.config/chromium &
--no-sandbox:关闭沙箱。root 下必须加,否则 Chromium 拒绝启动(提示 "Running as root without --no-sandbox is not supported")--user-data-dir:明确指定用户数据目录(存书签、缓存、Cookie 的地方)。不指定时它会自己猜路径,猜错了就是那个 Permission denied
四、第二个坑:DISPLAY 变量不生效
另一个常见翻车点:加了参数还是报 cannot open display 之类。
原因:浏览器必须知道往哪块屏幕上画。我们前面虚拟屏幕是 :99,但这个环境变量只在当前 shell 会话里有效 ------你换一个 SSH 窗口、或者由 supervisor 拉起时,环境变量就丢了。
解法:每次启动都显式带上:
bash
DISPLAY=:99 chromium --no-sandbox --user-data-dir=/root/.config/chromium &
或者先 export DISPLAY=:99 再启动,但显式前缀写法更保险,一行自包含。
启动成功后,打开 noVNC 网页应该能看到 Chromium 窗口出现在桌面上。
五、第三个坑:SSH 断线浏览器就被杀
上面这条命令带着 & 跑在后台,看着没问题------但它是当前 SSH 会话的子进程 。手机 SSH 一断(息屏、切后台都可能),浏览器跟着被杀。这是整套部署里最隐蔽的坑,因为"刚才明明还好好的"。
临时解法:用 nohup:
bash
nohup env DISPLAY=:99 chromium --no-sandbox --user-data-dir=/root/.config/chromium > /tmp/chromium.log 2>&1 &
根治:交给 supervisor 托管,写进配置(与上一篇远程桌面的配置合并管理):
bash
sudo tee /etc/supervisor/conf.d/chromium.conf > /dev/null <<'EOF'
[program:chromium]
command=/bin/bash -c "sleep 10; exec chromium --no-sandbox --user-data-dir=/root/.config/chromium"
environment=DISPLAY=":99",HOME="/root"
autorestart=true
startsecs=15
startretries=10
priority=40
stdout_logfile=/var/log/supervisor/chromium.log
stderr_logfile=/var/log/supervisor/chromium.err
EOF
sudo supervisorctl reread
sudo supervisorctl update
几个参数的讲究:
sleep 10:等 Xvfb 和 XFCE 先就绪。浏览器比桌面先启动的话,会因为找不到可用的显示而退出,然后 supervisor 重试几次就 FATAL 了priority=40:排在虚拟屏幕、桌面、VNC 之后启动startsecs=15:Chromium 启动慢(ARM 板子上尤甚),默认 1 秒的"存活判定"会把它误判为启动失败autorestart=true:浏览器崩了自动拉起
加载完看状态:
bash
sudo supervisorctl status chromium
显示 RUNNING 即可。
六、第四个坑:中文乱码
浏览器能打开了,但页面中文全是方块------不是编码问题,是系统没有中文字体:
bash
sudo apt install -y fonts-noto-cjk
fc-cache -fv
sudo supervisorctl restart chromium
刷新 noVNC 页面,网页中文就正常了。
七、验证全链路
sudo supervisorctl status→ chromium 显示 RUNNING- 手机浏览器打开
http://nps地址:6080/vnc.html,输密码进入桌面 - 桌面上应该有 Chromium 窗口,点击地址栏能输入网址(打不出字的话,用 noVNC 侧边栏的键盘按钮,或者按上篇装 matchbox-keyboard)
- 打开任意网页,滚动、点击正常
八、常用启动参数备忘
跑在低配 ARM 板上,这几个参数能明显改善体验:
bash
chromium --no-sandbox \
--user-data-dir=/root/.config/chromium \
--disable-gpu \
--start-maximized \
--disable-dev-shm-usage
| 参数 | 作用 |
|---|---|
--no-sandbox |
root 用户必需 |
--user-data-dir=... |
指定数据目录,避免权限问题 |
--disable-gpu |
板子没有可用 GPU 加速时,禁掉省得崩 |
--start-maximized |
启动即最大化,虚拟屏幕 720p 寸土寸金 |
--disable-dev-shm-usage |
内存小的板子建议加,避免 /dev/shm 不足导致标签页崩溃 |
如果内存实在吃紧(1GB 以下的板子),还可以加 --single-process,牺牲稳定性换内存。 |
九、踩坑总结表
| 坑 | 报错/现象 | 解法 |
|---|---|---|
| 包名不对 | Unable to locate package chromium | 换 chromium-browser,或确认源配置 |
| root 启动失败 | Permission denied / sandbox 报错 | --no-sandbox + --user-data-dir |
| 找不到屏幕 | cannot open display | 显式 DISPLAY=:99 |
| SSH 断线被杀 | 进程莫名消失 | nohup 应急,supervisor 根治 |
| 启动比桌面快 | supervisor FATAL | 配置里 sleep + priority |
| 中文乱码 | 方块字 | 装 fonts-noto-cjk + fc-cache |
结语
在 ARM 板子上装 Chromium,命令本身不难,难的是它跑在 root、无屏、被守护进程托管 这三重特殊环境下,每一条常规启动方式都会踩到对应的坑。核心就三件套记牢:DISPLAY=:99、--no-sandbox --user-data-dir、交给 supervisor。配好之后就一劳永逸了------现在我的板子重启后,浏览器总是安安静静地等在虚拟桌面上,手机连上就能用。
有问题欢迎评论区交流。