PVE宿主机炸了
晚上登 1panel,直接甩我一脸
服务内部错误: attempt to write a readonly database (8)
什么也没干呀 第一反应:被黑了?
先找到 1panel 在哪
ssh 上去,落地主机名是 pve 哦对,这是 PVE 宿主机,1panel 在里面某个角落跑着
qm list 看虚拟机,只有 104 和 106,还都是 stopped 没有叫 1panel 的
ps aux | grep 1panel,倒是抓到了
100000 ... /usr/bin/1panel-agent
100000 ... /usr/bin/1panel-core
UID 100000,非特权 LXC 的味儿 pct list 一看,破案了,102 容器 Anran 就是它
第一次误判:权限
进容器看 db 文件
-rw------- 1 root root core.db
文件属主 root,进程却跑在 100000 下面 怎么看都是权限问题嘛,chown 一下就能活
结果宿主机上 pct exec 102 -- chown,直接报 Invalid argument
非特权容器的 uid 映射,从外面改里面的属主就是不行(
行⑧,pct enter 102 进去改
这回报错换了个花样
chown: changing ownership ... Read-only file system
假只读
Read-only?mount | grep " ro," 一看,空的
容器自己觉得它是 rw 的(思考)
journalctl 翻日志,1panel 在无限 panic
panic: open /opt/1panel/log/1Panel-Core.log: read-only file system
写不进去是真的,但它说它没只读 LXC 里的 mount 看不到宿主机层面的 ro 标志,纯假只读
想 pct stop 102 重启容器,好家伙
unable to create file '/var/log/pve/tasks/...' - Read-only file system
宿主机自己写 /var/log 都失败了 炸的其实是宿主机的 /
吓哭了
排除法
df -h:/ 才用 38% vgs:VFree 还有 16g,thin 池 14.48% 不是磁盘满
smartctl -a:PASSED,重映射 0,pending 0 ATA 倒是有俩 error,一看时间,78 天前的旧账 不是硬盘坏
那就是文件系统某次抖动,内核 errors=remount-ro 机制直接把 / 锁了保护数据 顺便容器跟着一起陪葬
抢救
mount -o remount,rw / 没报错,宿主机活了
赶紧想备份数据库,容器里 cp 一下
cp: cannot create directory ... Read-only file system
容器还是只读的,底层锁没完全解开 算了,直接 reboot
重启完,pct start 102,1panel 正常登录 一切平安
复盘
这套结构是四层的:1panel → LXC 容器 → PVE 宿主机 → 磁盘 报错发生在最上层,病根在最底层
1panel 报 readonly database,看着像权限,像被黑 其实是宿主机的 / 被内核 remount 成了 ro,容器跟着锁死 而容器里的 mount 还显示 rw,这种假只读最有迷惑性
另外第一次的权限误判也是错觉 容器里的 root,在外面看就是 100000,属主从来就没问题 查了半天唯一的问题只有那一个只读
以后再见到 sqlite readonly,先上宿主机 dmesg 看一眼 如果 journald 全是 Failed to write entry,别修应用了,先救母机
万幸 ups 太重要了()
评论