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 太重要了()

评论