LXC容器rsync迁移后MySQL目录权限归属异常排查求助
LXC容器迁移后MySQL目录属主异常问题解答
1. 问题成因及责任归属
这是LXC用户ID(UID)/组ID(GID)映射规则不一致导致的,和rsync、MariaDB无关:
- rsync只是忠实地同步了文件在宿主机层面的UID/GID值,未做任何修改;
- 原容器内
mysql用户对应某个UID,在原宿主机的LXC映射规则下,这个容器UID会被转换为宿主机的某个UID; - 新宿主机拉取数据时,同步过来的文件保留了原宿主机的UID值;
- 新宿主机的LXC映射规则与原宿主机不同,导致该宿主机UID在新容器内被解析为另一个用户的UID(即996,对应
polkitd); - 你确认两个容器
/etc/passwd一致,说明容器内用户配置无问题,问题出在宿主机的LXC映射层。
2. 解决方案
步骤1:统一LXC映射规则
- 停止新服务器上的目标容器:
lxc-stop -n myRsyncedContainer - 同步原宿主机的ID映射配置:
- 查看原容器配置文件(通常在
/var/lib/lxc/myOriginalContainer/config),找到lxc.idmap相关行,例如:lxc.idmap = u 0 100000 65536 lxc.idmap = g 0 100000 65536 - 将上述配置复制到新宿主机对应容器的config文件中;
- 确保新宿主机
/etc/subuid和/etc/subgid包含相同的映射范围,例如添加:root:100000:65536
- 查看原容器配置文件(通常在
步骤2:修正文件属主
两种可选方式:
- 宿主机层面操作(容器未启动时):
假设容器内mysql用户的UID为Y,映射规则为容器UID对应宿主机UID100000+Y,执行:chown -R $((100000+Y)):$((100000+Y)) /var/lib/lxc/myRsyncedContainer/rootfs/var/lib/mysql chown -R $((100000+Y)):$((100000+Y)) /var/lib/lxc/myRsyncedContainer/rootfs/var/lib/mysql-files - 容器内操作(映射规则修正后启动容器):
启动容器后进入内部重置属主:lxc-start -n myRsyncedContainer lxc-attach -n myRsyncedContainer chown -R mysql:mysql /var/lib/mysql /var/lib/mysql-files exit
步骤3:验证结果
重新进入容器,执行ls -ld /var/lib/mysql /var/lib/mysql-files确认属主已恢复为mysql:mysql。
3. 受影响文件范围及全局检查方法
受影响文件
所有容器内由非root用户/组拥有的文件都可能受影响,例如:
- Web服务的
www-data用户文件; - PostgreSQL、Redis等数据库服务的用户文件;
systemd-journald、ntp等系统服务的专用用户文件。
全局检查方法
容器内直接排查异常属主:
列出所有非root属主且UID未正确解析为用户名的文件:find / -not -user root -not -group root -exec ls -ld {} \; | grep -E '^[^ ]+ +[0-9]+ [0-9]+ '(输出中显示数字UID/GID的即为解析异常的文件)
对比原容器属主列表:
- 在原容器内导出所有文件的属主信息:
find / -printf "%u:%g %p\n" > original_owners.txt - 将
original_owners.txt传到新容器,导出当前属主信息:find / -printf "%u:%g %p\n" > new_owners.txt - 对比差异:
diff original_owners.txt new_owners.txt
- 在原容器内导出所有文件的属主信息:
宿主机层面验证映射匹配:
查看容器rootfs目录下文件的宿主机UID,对照LXC映射规则,确认是否对应容器内的正确用户。例如映射规则为u 0 100000 65536,则容器内UIDX对应宿主机UID100000+X,若文件的宿主机UID不符合该规则,说明存在异常。
内容的提问来源于stack exchange,提问作者Kiv
相关产品推荐
相关产品推荐

