用了好几年麒麟桌面系统,从V10早期版本一路用到现在V10-SP1 2503,日常给同事处理得最多的,除了软件装不上,就是各种权限说人话。报个“权限不足”,查来查去,十有八九是用户没进对用户组。这篇文章就把麒麟桌面系统V10-SP1 2503里常见的用户组一次性讲清楚,顺带把我踩过的坑和能直接抄的排查命令都放出来。刚接触麒麟系统的运维、开发,还有自己折腾桌面机的用户,都能从这里找到适合自己的用法。
1. 先搞清楚:用户组在麒麟系统里到底管什么
很多入门用户对用户组的理解就一句话“一个组的成员共享某些权限”,这个理解方向对,但在严谨配置时不够用。用户组本质上是系统对多个用户进行分类授权的基础单元。把用户加入某个组,相当于给这个用户发了一张对应权限集合的门禁卡。比如你在cdrom组,就能使用光驱设备节点;你在sudo组,就能通过sudo命令临时提升执行权限。
麒麟V10-SP1 2503虽然是面向桌面场景的发行版,但它延续的是Linux多年沉淀的标准用户组模型,这一点和上游社区版基本保持一致。所以网上关于Debian系或Ubuntu的用户组资料,在麒麟上大部分都适用。真正需要留意的是版本差异——有的版本默认sudo组,有的版本预配置了wheel组,麒麟的桌面发行版还额外加入了一些与应用场景绑定的组,比如外设访问、打印管理、日志读取等。判断一个组在系统里到底有没有实际作用,最权威的依据是/etc/group、/etc/gshadow这两个文件,而不是文档上怎么写。
有人会问,那我直接用root不就行了吗?这恰恰是用户组管理最想避免的局面。root拥有系统全部权限,误操作、被木马利用、面对恶意输入时连“撤销”的机会都没有。桌面系统日常跑着浏览器、办公软件、即时通讯工具,安全面比纯服务器更杂,合理分配用户组成员资格,比一股脑给所有人root权限要稳妥得多。
2. 常见用户组逐个拆解:别以为只有root和sudo
2.1 系统核心管理组
root组永远排在最前面。它的组ID是0,组成员拥有系统完全控制权。你打开终端执行sudo -i切换到root,本质上并没有换组,因为sudo的规则允许该用户获得临时root能力。真正把某个普通账户直接加入root组,是一种很强的授权,日常运维中应该避免。
bin组和daemon组在很多新安装的麒麟系统里已经很少直接使用了,它们属于历史遗留的权限分组,分别管理系统二进制文件执行与某些后台进程的公共目录访问。平时用不到不奇怪,但如果你的环境里跑着务负载和很老的自编译软件,这些组的属主可能落在某个特定目录下,修改组成员时需要额外小心。
sys组涉及设备节点管理,一般桌面用户几乎不需要关注。adm组值得多说两句,它允许成员读取/var/log目录下的日志文件。排查开机问题、软件崩溃、系统服务异常时,普通用户想看日志没权限,把自己加到adm组就能临时解决。注意这只是提升日志审计能力,并没有赋予修改服务的能力,比较适合桌面用户和信息管理员角色。
2.2 硬件与外设访问组
这类组和桌面系统日常结合最紧,也是我处理工单时最常碰到的一类组问题。
cdrom组控制光驱和挂载光盘相关设备节点的访问权限。虽然现在用光盘的人不多了,但很多政企环境还用光盘安装驱动、发放资料,偶尔也要刻录。如果用户插了外置光驱却看不到设备,或者软件提示无权限访问/media下的挂载点,第一反应就是检查他是否在cdrom组里。
lp与lpadmin组对应打印服务。lp组允许成员使用本地打印机执行打印任务,lpadmin组则允许管理工作:添加打印机、删除打印机、调整默认打印机设置。麒麟系统对国产打印机的兼容已经做得比以前好,但不少同事遇到“能装驱动但打印队列无权操作”的怪问题,最后发现就是用户少加了lpadmin组。
audio组和video组分别控制声卡设备和视频设备的访问。远程桌面接入、虚拟机里跑麒麟、或者用USB声卡时,经常出现音频设备被占用的提示,除了进程抢占,另一种可能就是组成员资格缺失。值得注意,PulseAudio/PipeWire音频栈在麒麟桌面环境里通常会以用户级共享方式运行,不像老式系统那样每个用户必须加audio组,但保留audio组对多用户切换场景仍然有价值。
dialout组管理串口和调制解调器设备。写嵌入式、连接开发板、烧录单片机固件,用户必须在这个组里,否则即使插入USB转串口,程序打开/dev/ttyUSB0也会报Permission denied。做硬件相关开发的人,这一条是新手最常见劝退点。
2.3 服务与高级权限组
sudo组是最常用的提权组。普通用户加入sudo组后,终端执行sudo命令就能临时获得root权限。麒麟桌面系统通常预配置了sudo组为提权入口,但某些定制镜像也保留了wheel组,RHEL系操作习惯的人天然适应后者。判断系统支持哪个组,看/etc/sudoers里%sudo和%wheel这两行,保留哪个就是哪个。需要注意的是,把用户加进sudo组只是一半工作,用户执行第一条sudo命令时,系统会要求输入该用户自己的密码,这个密码不是root密码。
sshd组的机制和很多人想的不一样:它对常规SSH登录没有直接作用,更多用于配合sshd服务的严格访问控制。当sshd_config里配置了AllowGroups,则只有对应组内的用户才能远程登录。麒麟系统远程桌面和SSH管理场景经常遇到“本地能登录、远程就是被拒”的情况,排查思路之一就是查看sshd_config是否启用了组限制。
kvm组面向虚拟化场景,成员可以访问/dev/kvm设备节点。用麒麟的虚拟机管理器运行Win系统或者开QEMU测试,用户必须在kvm组,否则创建虚拟机时会提示“不支持虚拟化”或“无法打开kvm设备”。有些用户已经能在图形界面创建虚拟机了,结果启动直接失败,十有八九是忘了这一步。
systemd-journal组与日志管理相关。如果系统拒绝普通用户查看journalctl日志,将它加入systemd-journal组即可。和adm的区别在于,这个组职责更聚焦在systemd日志体系,适合单个应用排错时使用。
3. 实操:用户组的查看、添加、移除、创建与删除
3.1 查看当前用户属于哪些组
打开终端,直接输入groups,输出会显示当前用户所属的全部组。这个命令输出顺序与发布时间有关,不一定代表主组。想看得更严格,用id命令:
id # uid=1000(kylin) gid=1000(kylin) 组=1000(kylin),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),122(lpadmin),134(lp),135(sambashare)注意gid是主组ID,组含义后面的全是附加组。主组决定新建文件默认属组,附加组决定额外权限。
查看当前系统里有哪些组:
cat /etc/group输出格式是“组名:x:组ID:成员列表”,以冒号分隔。比如:
sudo:x:27:kylin,zhangsan说明sudo组的GID是27,组成员是kylin和zhangsan。
只要某个组里什么都没有,成员列表就是空的,但别以为这个组没存在意义,很多服务在启动时才动态加入。
3.2 把用户加入或移出指定组
最常用且推荐加参数的命令:
sudo usermod -aG sudo zhangsan关键就是-aG,G指定把用户加入某个附加组,a表示追加而不是覆盖。少了a,用户会被直接踢出原有附加组,再只保留现在指定的这个组,属于新手高危操作。实际运维中,我见过有人执行sudo usermod -G sudo zhangsan,把用户从cdrom、adm这些组全部移除,导致光驱、日志查看权限同时丢失。
移除用户从某个组:
sudo gpasswd -d zhangsan sudo这个命令会把zhangsan从sudo组移除,但不会影响其他组。比直接编辑/etc/group文件更安全,因为gpasswd会处理并发锁,防止编辑过程中与其他服务冲突。
修改用户的主组用:
sudo usermod -g staff zhangsan注意这里是-g,且不能同时与-G使用含义会错乱。修改主组后,用户之后新建文件的默认属组就变了,已经存在的文件属组不会自动跟着改变。
3.3 创建和删除用户组
创建新组:
sudo groupadd devteam指定GID创建:
sudo groupadd -g 2010 devteam删除组:
sudo groupdel devteam删除组有两个我踩过的坑:第一,已经作为某用户主组的组不能直接删除,会报错,需要先把用户主组改成其他组;第二,被某目录当作属组的组,删除后该目录的属组显示会变成数字ID,比如2010,看起来像乱码,需要用chown或chgrp重新修正。比如:
sudo chgrp devteam /srv/shared把这个目录的属组重新指给devteam。如果你已经删掉了组,那只能重建相同GID的组或者改用其他组。
3.4 图形化:麒麟桌面系统里的用户管理入口
如果你是桌面用户,不想每次敲命令,可以直接打开“开始菜单—设置—系统管理—用户和组”,在图形界面里给已有用户勾选附加组,也可以新建用户时直接指定主组和附加组。这个工具等价于执行useradd和usermod,但界面更直观,适合在别人电脑上指导操作。
不过要注意,图形工具修改组时同样存在“覆盖”陷阱,某些版本在编辑用户属性的界面里,如果只勾选当前需要的组,会把其他已勾选的组一并提交,实际上等于移除了旧有组。我在帮同事处理打印机权限时遇到过,他在图形界面勾选lpadmin组后,sudo组被意外取消,后面装软件更新系统时一路提示无权限。图形工具方便归方便,改完最好用id重新核对一次。
4. sudo组不是万能的:提权配置与组策略要点
加入sudo组后执行sudo报错,这个问题出现频率极高。常见原因之一是用户在sudoers里被设置了NOPASSWD,但系统仍提示输入密码,原因可能是用户处于多个组,而sudoers中的限制规则优先级不一致。先看规则:
sudo visudo安全做法是只对单个组设置允许提权,并强制要求密码。不建议直接把某一行改成ALL = (ALL) NOPASSWD: ALL,除非这是专门的自动化测试机。桌面办公环境下,每次sudo输入密码是值得保留的确认环节。
如果自定义了一个组,比如developers,想让该组所有成员都能运行某个指定命令而不必每次输密码,可以这样配置:
%developers ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx这个规则表示developers组成员执行systemctl restart nginx时免密,其他systemctl操作仍需要密码。这样的颗粒度比全部放行明智能得多。
最小权限原则在桌面系统上同样适用。很多人喜欢把用户同时加入sudo、adm、cdrom、lpadmin,看起来一劳永逸。但这意味着任何Web漏洞、恶意脚本拿到该用户会话后,能访问日志、操作打印服务、挂载设备,安全面很广。合理做法是只给用户当前工作场景需要的组,需要新权限时再加,不需要的及时收回。我自己习惯给办公用户只保留sudo和cdrom,给开发人员额外加kvm和dialout,给运维人员加adm和systemd-journal。
5. 典型事故复盘:组被误删、权限刷不出来、属主变成数字ID
5.1 误删用户组导致属主变数字ID
在清理系统时执行groupdel删除了一个看似闲置的组,比如oldftp,结果/opt/ftpdata目录是root:oldftp属主。组一删,再执行ls -l,属主显示可能还是oldftp,也可能直接显示为2009这样的数字。这是因为系统找不到对应的组名,只能退回显示GID。
修复思路是重建同GID的组:
sudo groupadd -g 2009 oldftp重建后,目录属组会重新对应到oldftp,不用逐一chown。如果GID早已被其他组占用,那只能新建一个不同GID的组,再chgrp目录过去。
这里引用一条热搜词“sfc scannow能不能修复删掉的用户组”,这是Windows命令,和麒麟无关,不用去试。麒麟有自己的修复机制,下面讲。
5.2 改了组权限但当前会话不生效
把用户加入某组后,终端里执行id却看不到新组。原因是当前登录会话携带的组凭证已经缓存,新加入的组需要重开终端或重新登录才识别。桌面环境里尤其明显,因为图形会话自登录时就建立,新加的组要注销重登才生效。
不用重启机器,注销再登录一次或者新开终端验证即可。如果测试过程中反复确认没有生效,先检查命令是否落到了正确目标组:
sudo getent group kvm这行命令会输出kvm组的当前成员,比翻/etc/group更可靠。
5.3 用麒麟系统修复助手处理组件级异常
少数情况下,用户组配置本身没有改错,但系统组织数据库出现异常,getent输出结果与/etc/group不一致。这通常属于系统组件损坏,不是普通权限问题。麒麟系统自带的“系统修复助手”可以扫描系统关键文件与配置一致性,包括用户、组信息。操作路径是“开始菜单—系统管理—系统修复助手”,执行扫描后按提示修复,然后再重启验证。
针对本文场景,修复完成后无需重复把所有用户重新加组,正常登录用户附加组成员信息会被系统重新读取。如果修复后发现某个组消失了,再按前面提到的groupadd重建即可。
5.4 添加组成员后无权限访问共享打印机
打印机权限问题有几种混淆情况:系统已经安装了打印机,但另一名用户看不到打印队列,或点击打印提示“拒绝访问”。这通常是该用户不在lpadmin组。排查时顺序如下,第一确认打印机服务在运行:
systemctl status cups第二查看当前用户所属组:
groups 用户名第三确认该用户有没有进lpadmin,没进就追加:
sudo usermod -aG lpadmin 用户名然后让用户退出登录重新进入。如果仍然提示无权限,再检查打印机是否设置为“仅限管理员使用”,这个选项在不同品牌驱动管理工具里展示不同,必要时把访问权限改为“所有人”。
6. 常用用户组速查表与一条龙命令清单
我整理了一份麒麟V10-SP1桌面系统里最常接触的用户组速查表,方便大家对照使用。
| 组名 | 核心用途 | 普通用户是否需要 | 典型补充场景 |
|---|---|---|---|
| root | 系统完全控制 | 不需要 | 仅建议作为保留项 |
| bin | 管理系统二进制文件历史组 | 不需要 | 基本不用 |
| daemon | 部分系统进程公共目录 | 不需要 | 基本不用 |
| sys | 设备节点管理 | 不需要 | 极少用到 |
| adm | 读取/var/log日志 | 建议按人按需加 | 日志排查 |
| cdrom | 访问光驱和光盘挂载 | 经常需要 | 外置光驱、刻录 |
| lp | 使用本地打印任务 | 经常需要 | 普通打印 |
| lpadmin | 管理打印机、队列 | 管理员需要 | 装驱动、设置队列 |
| dialout | 串口和调制解调器 | 开发调试需要 | 嵌入式开发板 |
| audio | 声卡设备访问 | 通常不需要但保留无害 | 多用户音频 |
| video | 视频设备访问 | 通常不需要 | 视频采集、GPU直通 |
| sudo | 执行sudo提权 | 绝大多数用户需要 | 日常安装、修改系统 |
| wheel | 老式系统提权组 | 看系统配置 | 兼容定制镜像 |
| systemd-journal | journal日志读取 | 按需添加 | 服务排错 |
| kvm | 访问/dev/kvm虚拟化节点 | 虚拟机用户需要 | 开虚拟机 |
| sshd | 配合AllowGroups限制SSH登录 | 一般不直接用 | 远程管理白名单 |
最后给一套一条龙命令。假设要给用户zhangsan配置一个开发人员常用环境,让他能sudo、使用串口、访问光驱、开虚拟机:
sudo usermod -aG sudo,dialout,cdrom,kvm,adm zhangsan # 验证 id zhangsan # 让组成员立即生效,让他重新登录 sudo systemctl restart systemd-logindsystemd-logind重启会强制当前图形会话做一次重新识别,部分桌面版本切换时个别应用可能卡顿,更稳妥的仍是注销再登录。这套命令组合在我日常配置中命中率很高,省掉了一个一个加的麻烦。
还有一个容易被忽略的细节,修改组成员后,该用户目录下的历史文件属组不会自动改变。如果发现某个目录要共享给一个组协作访问,除了把用户加组,还得处理目录属组与权限位:
sudo chown -R zhangsan:devteam /srv/project sudo chmod -R 2770 /srv/project数字2表示对目录启用了setgid位,新建文件自动继承目录的属组,避免协作时文件属主组错乱。这一段是我在处理多用户协作目录时最推荐的配置,能省掉后续很多“文件为什么属于别人”的疑问。
我个人在实际操作中的体会是,麒麟V10-SP1的用户组模型并不复杂,真正麻烦的是版本差异和桌面环境缓存机制。遇到权限问题先别急着赋root,先id看一下用户在哪些组,比对一下需求场景,往往几分钟就能定位。平时多用usermod -aG补充组,少用-G覆盖组,能避开绝大多数权限回退事故。这套经验在我维护的几台麒麟工作站上反复验证过,稳定性和可控性都很不错,推荐给大家直接采纳。