如果一台 Linux 电脑上装了多个桌面环境,比如 GNOME、KDE、niri,有时候我不太想让它们都挤在同一个用户下面。
原因很简单:桌面环境会往 ~/.config、~/.local、~/.cache 里写很多自己的配置。多个桌面环境共用同一个用户时,这些配置可能互相影响,轻一点是主题、快捷键、默认应用有点乱,重一点就是某些组件状态不对,排查起来很烦。
更稳一点的做法是:不同桌面环境用不同 Linux 用户,让配置文件各管各的;但是日常资料目录共享一套,比如下载、文档、图片、视频、音乐这些。
也就是:
- 配置隔离
- 资料共享
这样既不会让几个桌面环境互相打架,也不用每个用户都维护一份文件。
基本思路
假设我有几个用户:
cbowencbowen-kdecbowen-niri
它们分别用不同桌面环境登录。然后创建一个共享用户组 shared,再创建一个共享目录 /data/shared,让这些用户都属于 shared 组。
之后每个用户自己的 ~/Downloads、~/Documents、~/Pictures 等目录,都软链接到 /data/shared 下面对应的目录。
创建共享组和共享目录
先创建共享组:
1 | sudo groupadd shared |
把几个用户加入这个组:
1 | sudo usermod -aG shared cbowen |
创建共享目录和常用子目录:
1 | sudo mkdir -p /data/shared/{Downloads,Documents,Pictures,Videos,Music} |
设置目录所属组和权限:
1 | sudo chown -R root:shared /data/shared |
这里用 /data/shared 只是一个例子。如果自己的数据盘挂载在别的位置,比如 /mnt/data/shared,也可以按实际路径改。
修改用户组之后,需要重新登录才会生效。如果只是当前 shell 想临时识别新组,可以执行:
1 | newgrp shared |
每个用户创建软链接
每个用户登录后,把自己的资料目录链接到共享目录。
如果原来的目录里已经有文件,先移动或备份,不要直接删。确认里面没有需要保留的内容之后,再处理原目录:
1 | rm -rf ~/Downloads ~/Documents ~/Pictures ~/Videos ~/Music |
然后创建软链接:
1 | ln -s /data/shared/Downloads ~/Downloads |
这样几个用户看到的下载、文档、图片目录,其实都指向同一套真实目录。
如果系统使用中文用户目录,也可以这样对应:
1 | ln -s /data/shared/Downloads ~/下载 |
英文目录和中文目录选一套就行,主要看自己的桌面环境和 xdg-user-dirs 当前怎么配置。
2775 里的 2 是什么
这里的权限是:
1 | sudo chmod -R 2775 /data/shared |
2775 前面的 2 是 setgid,不是 sticky bit。
它的作用是:在 /data/shared 下面新建的文件或目录,会自动继承父目录的组,也就是 shared。
如果没有 setgid,可能会出现这种情况:
1 | user1 创建的文件属于 user1:user1 |
而加了 setgid 后,新建内容会更倾向于保持在 shared 组下面,几个属于 shared 组的用户就更容易一起访问和修改。
sticky bit 又是什么
sticky bit 是 1,比如:
1 | sudo chmod 3775 /data/shared |
它的作用是:别人不能删除不属于自己的文件。
最典型的例子是 /tmp。大家都能往里面写东西,但不能随便删除别人的文件。
所以如果你希望:
- 大家都能写
- 但不能随便删别人的文件
可以考虑 3775。
但如果这几个桌面用户本质上都是自己,只是为了隔离不同桌面环境的配置,那么我更推荐:
1 | sudo chmod -R 2775 /data/shared |
这种情况下,几个用户之间可以互相修改、互相删除文件,用起来更像同一个人的不同登录身份。
不建议共享的目录
这个方案的重点是共享资料目录,不是共享整个 home。
我不建议共享这些目录:
1 | ~/.config |
这些目录正是桌面环境、应用程序、主题、输入法、启动项最容易写配置的地方。把它们共享起来,就又回到了多个桌面环境互相影响的问题。
比较适合共享的是:
1 | Downloads |
也就是日常文件、项目文件、素材文件这些。配置归配置,资料归资料,边界清楚一点,后面维护会舒服很多。
会不会一直需要 root 权限
不会。
sudo 只在这些步骤里需要:
- 创建用户组
- 把用户加入组
- 创建
/data/shared - 修改目录所属组和权限
日常使用时,只要用户已经在 shared 组里,就不需要 root。正常下载文件、保存文档、移动图片,都和使用普通用户目录差不多。
如果刚执行完 usermod -aG shared 用户名,但是当前登录会话里还是没有权限,一般就是组信息还没刷新。重新登录一次最稳,或者在当前 shell 里临时执行:
1 | newgrp shared |
小结
多桌面环境不一定非要共用同一个 Linux 用户。对我来说,更清楚的方案是:每个桌面环境一个用户,用来隔离配置;再用一个共享目录保存日常资料。
核心命令其实就几步:
1 | sudo groupadd shared |
然后每个用户把自己的资料目录软链接过去。
这种方式解决的是一个很具体的问题:多桌面环境下配置文件不要打架,但日常文件还要放在一起。不要共享整个 home,也不要共享 ~/.config,只共享资料目录就够了。