最近要把一堆windows上的文件(包括word,ppt等其他的)迁移到麒麟上,诡异的是文件迁移过去后,所有文件都变成只读的了,WPS 顶部弹出一行灰字:「文件已以只读方式打开」。文件另存一份才能变成可读写。
看了看文件属性,权限是 644,属主是自己,还不放心,敲了一行 chmod 777,刷新,打开
——还是只读。重启也没用。百度了半天,要么说是文件被锁,要么让你重装 WPS。
问了联想服务器客服妹妹,给的方法也不得要领。后来和大模型聊了好多轮,才找到问题所在。原来是麒麟权限系统——KYSEC 安全模块在捣鬼。
本文把这件事说清楚:是什么、为什么、怎么查、怎么改。
chmod只是文件安全的第一道门
首先搞清楚 Linux 里权限的层次。
平时用的 chmod、chown,是 Linux 的自主访问控制(DAC),逻辑很简单:谁是文件的主人,主人说了算。你是文件属主,你有写权限,你就能写。
但麒麟 V10 在这之上叠加了第二套机制:KYSEC(Kylin Security Enhanced),底层基于 Linux 内核的 SMACK 框架(Simplified Mandatory Access Control Kernel)。
这套机制不看你是不是文件主人,它只看标签。
每个文件都有一个安全标签(Security Label),每个进程也有一个安全标签。当一个进程要写入一个文件时,内核会拦下来,检查:「这个进程的标签,有没有权限写这个文件的标签?」
如果没有——不管你 chmod 得多宽松,一律拒绝写入。应用程序感知到写不进去,就把文件标记为只读。
用一个生活比喻来说:
chmod 是「门锁」,钥匙在你手里,你能开门。KYSEC 是「门禁系统」,就算你有钥匙,没有刷对卡,门禁不放行,你还是进不去。

哪些情况会触发这个问题
主要有以下几种情况:
场景 1:从 U 盘或 Windows 共享盘拷过来的文件
这是最常见的情况。Windows 的文件系统不认识 SMACK 标签,文件拷过来要么没有标签,要么标签类型不对,KYSEC 不知道该用什么策略处理,就走保守路线——限制写入。
场景 2:用 root 身份创建的文件
有时候为了省事,用 sudo 建了一个文件,或者脚本里用 root 创建了文件。Root 进程的安全标签和普通用户进程的不同,文件继承了 root 的标签,普通用户的 WPS 或编辑器就写不进去。
场景 3:从网上下载的文件
浏览器下载的文件,安全上下文可能和你的工作目录不一致,打开时触发限制。
场景 4:从其他 Linux 发行版复制过来的文件
Ubuntu、CentOS 这些发行版要么不用 SMACK,要么标签体系不同。文件移过来,标签自然对不上。
场景 5:WPS 保存时生成了标签混乱的临时文件
WPS 某些版本在 KYSEC 严格模式下保存文件时,会先写临时文件再替换,这个过程中标签可能出问题,下次打开就变成只读了。
怎么查:3 个命令确认问题根源
遇到只读问题,先跑这三个命令,确认是不是 KYSEC 在搞鬼。
第一步:查文件的安全标签
getfattr -n security.SMACK64 你的文件名
如果输出为空,或者显示的标签你看不懂,大概率就是这个原因。
注意:getfattr 来自 attr 软件包,如果提示命令不存在,先安装:
sudo apt install attr
第二步:查当前进程的安全标签
cat /proc/self/attr/current
把这个输出和文件的标签对比。两者差异很大,说明不在同一个访问域。
第三步:看内核有没有 SMACK 拦截记录
dmesg | grep -i smack
如果看到带 smack denied 字样的日志,恭喜,确诊了——就是 KYSEC 在拦。
怎么修:从临时解决到一劳永逸
根据你的场景,选对应的方案。
方案 A:快速修复单个文件
把文件的 SMACK 标签改成 _(下划线)。这个特殊标签在 SMACK 里叫「地板标签」(Floor Label),意思是:所有进程都可以访问带这个标签的文件。
# 方法一:用 setfattrsetfattr -n security.SMACK64 -v "_" 你的文件名# 方法二:如果系统有 chsmack 工具chsmack -a "_" 你的文件名
改完之后不需要重启,重新用 WPS 打开文件,就能正常编辑了。
方案 B:批量修复一个目录下的所有文件
find /你的目录路径 -type f -exec setfattr -n security.SMACK64 -v "_" {} \;
比如你的工作文档都放在 ~/Documents,就把路径换成 ~/Documents,一次全部修复。
实际排查时,不要一上来就怀疑 KYSEC。建议按照以下顺序检查:
- • lsattr 查看是否存在不可变(immutable)属性;
预防:3 个习惯让你以后不再踩这个坑
知道原理之后,预防就很简单了:
习惯 1:外部文件拷进来先检查标签
拿到 U 盘文件或者下载的文档,先跑一下 getfattr,确认有没有正常的 SMACK 标签,有问题及时处理,不要等打开的时候才发现。
习惯 2:重要工作目录统一设好标签
比如 ~/Documents 这种常用目录,直接批量跑一次方案 B,把所有文件设成 _ 标签,以后拷进来的文件在这个目录下也会继承正确的属性(具体依赖目录的 SMACK 配置)。
习惯 3:不要用 root 在用户目录里建文件
这个是最容易忽略的。用 sudo vim、sudo cp 在自己的 home 目录创建文件,文件的安全上下文会继承 root 的标签,普通用户进程写不进去。改用普通用户身份操作,或者创建后立刻修标签。
小结
麒麟 KYSEC 不是 bug,它是为了满足政务和信创安全合规要求专门设计的,尤其在涉密或敏感级别的系统部署中,SMACK 强制访问控制是重要的防线。
理解它,你就不会在 chmod 777 上花冤枉时间了。
觉得有用的话,点个在看,让更多用遇到问题的人可以看到。