温馨提示×

为啥centos context丢失了

小樊
40
2026-09-27 07:52:03
栏目: 智能运维

在 CentOS(以及 RHEL 系列)里常说的 “context 丢失”,一般指 SELinux 安全上下文(security context)丢失或不正确,常见表现有:

  • 文件本来应该是 httpd_sys_content_t,结果变成了 default_t 或 unlabeled_t
  • 服务起不来, audit 日志里报 avc: denied
  • ls -Z 看到的 context 不对
  • 从其他系统 / 备份 / 容器拷贝文件后 context 没了

下面按常见原因 + 解决办法说明。


一、最常见原因

1. 用不支持 SELinux 的方式复制 / 移动文件

例如:

cp file /var/www/html/
mv file /var/www/html/
  • cp 默认不会保留原 context
  • mv 在不同文件系统时会丢失 context

✅ 正确做法:

cp -Z file /var/www/html/
# 或复制后修复
restorecon -Rv /var/www/html

2. 从 tar / 备份 / 镜像恢复文件

tar xf backup.tar
  • tar 默认不带 SELinux context
  • 恢复后文件变成 default_t

✅ 解决:

restorecon -Rv /path

3. 文件系统不支持 SELinux(或没挂载)

例如:

  • U 盘(vfat / ntfs)
  • 某些 Docker volume
  • NFS(没开 context 或 seclabel)

结果:

  • 文件显示 unlabeled_t
  • 或 context 完全丢失

✅ 检查:

mount | grep selinux
sestatus

4. SELinux 被禁用过(disabled → enforcing)

如果你曾经:

SELINUX=disabled

然后又改回 enforcing,已经创建的文件不会自动恢复 context。

✅ 修复:

# 1. 确保 SELinux 是 enforcing / permissive
# 2. 重新打标
fixfiles onboot
reboot
# 或
restorecon -Rv /

5. 用了 --no-selinux 或容器/工具忽略 context

比如:

  • Docker :Z / :z 用错
  • rsync 没加 --xattrs
  • 某些 CI / 脚本强制忽略

二、怎么确认 context 丢了

ls -Z /var/www/html/index.html

异常示例:

unlabeled_t
default_t

查看 SELinux 状态:

sestatus

看拒绝日志:

ausearch -m avc -ts recent

三、标准修复方法(通用)

✅ 方法 1:restorecon(最常用)

restorecon -Rv /var/www/html

✅ 方法 2:根据策略重打标

fixfiles restore

✅ 方法 3:整系统重打标(谨慎)

touch /.autorelabel
reboot

四、如何避免以后再丢

  • 复制用:
    cp --preserve=context
    rsync -X
    
  • 挂载支持 SELinux 的文件系统
  • 备份用支持 xattr 的工具(tar 加 --selinux)
  • 容器挂载加 :Z

如果你能说一下 具体场景(比如:哪个目录、什么操作之后、CentOS 几、是不是容器/Docker),我可以直接告诉你是哪一步导致 context 丢的。

0 踩