相信很多尝鲜过桌面 Linux 系统的朋友,对它一个很深刻的印象就是稳定性差:不知道怎么就把系统搞崩了,又找不到问题的具体原因和解决方法,只能尝试重装,直到心力交瘁地回到了 Windows 或 macOS。但另一方面,Linux 系统在服务器领域得到大规模应用,可以几个月甚至几年不用重启而照样稳定运行。
那么,桌面 Linux 稳定性差的根本原因究竟是什么呢?一方面,虽然 Linux 内核十分稳定,但架不住 Linux 系统的图形界面稳定性确实比较差,很多时候瞎折腾确实会搞崩桌面,但内核还是好好的;另一方面,Windows 确实驯化了绝大多数普通用户,很多用户又将在 Windows 上不好的使用习惯带到 Linux 系统上,确确实实会搞崩 Linux 系统。
所以在这篇文章中,我会浅谈一下自己在将 Linux 作为主力桌面系统使用的这几年来,踩过的一些坑和积累的经验,以便让更多的 Linux 初学者免于搞崩系统,同时还有一些小技巧,可以让桌面 Linux 的使用体验更加优秀。
大多数电脑的核心硬件如 CPU、GPU 等,在发布之初甚至发布之前就已经得到了 Windows 很好的支持。相比之下,Linux 内核对于新硬件的支持总是会晚于发布日期一段时间。所以在使用桌面 Linux 时,硬件的选择需要仔细斟酌。
对于台式 PC,除非是追求绝对的自由,不希望安装任何非自由固件和软件,一般情况下其实不需要特别担心硬件的兼容性。因为台式 PC 的绝大多数配件都是通用的,很多时候装上 Linux 都可以开箱即用。如果使用较新的硬件,可能需要较新版本的内核才可以支持,除此之外问题应该不大。
可能比较需要关心的是 NVIDIA 的显卡。在 Linux 平台 N 卡的驱动是出了名的难搞,因为 NVIDIA 一直不愿意开源自家的显卡驱动。Linux 内核中自带的开源 N 卡驱动
Nouveau 是逆向工程开发的,性能差,硬件适配也比较惨,最多只可当作亮机使用。而 NVIDIA 的专有驱动虽然性能较好,但由于其是闭源的,当桌面出现问题,开发者会更难排查故障,更不用提很多 Linux 功能在使用 NVIDIA 专有驱动时直接不可用。
N 卡的 Wayland 支持到如今还只是将将可用的状态,以至于诞生了 Linus 的名场面,以及著名 Wayland 窗口管理器
sway 曾经有个启动选项是
--my-next-gpu-wont-be-nvidia。
不过在去年 NVIDIA
开源了自家显卡驱动的内核模块,Linux 平台上的 N 卡适配似乎向着好的方向发展,至于最终会如何,也只有时间能告诉我们答案了。
如果想在笔记本电脑上面安装 Linux,情况可能会更棘手一些。笔记本厂商可能会使用较多的专有硬件与软件,所以在往笔记本电脑上安装 Linux 之前,我更推荐先在网络上搜索一下自己的型号 Linux 支持情况如何:
可能比较需要注意的是:
如果不想麻烦折腾这些东西,可以考虑一些针对游戏优化的发行版如
Pop! OS 和
Nobara,这两个发行版在安装时一般会自动配置好显卡驱动,无需过多设置。但除此之外,很多型号的特色功能,比如解锁更多的功耗与性能,独显直连,调整风扇转速,自定义灯光等等,往往都不可用,在安装前需要三思。
还有一些已知的 Linux 支持比较好的笔记本型号,例如:
Linux 的外设支持也是一言难尽。比如外接鼠标键盘等,大部分都只能保证基本功能的使用;而对于高级的自定义功能,需要用到厂家提供的驱动控制软件,是自然没办法在 Linux 系统里面使用的。我已知的一些开源的解决方案有 piper(
支持很多品牌的游戏鼠标)和
Solaar(罗技外设专用),以及某些客制化键盘使用的
QMK 固件。
其他设备在购买之前,也最好调查一下其 Linux 兼容性。
很多首次尝试 Linux 的用户,在安装软件时也经常会按照 Windows 的使用习惯从网上寻找软件的安装包,往往是 deb 包或 rpm 包,然后安装。
这在 Linux 上其实是一种十分不好的使用习惯,轻则软件无法安装或安装后无法打开,重则使整个系统崩溃造成灾难性后果。Linux 系统的软件包管理机制是和 Windows 完全不同的,在 Linux 系统中安装软件往往需要解决依赖问题,如果依赖问题处理不得当,将很有可能造成
依赖地狱。
一般情况下,如果只使用系统原生的包管理器来管理软件包,是基本不会遇见依赖性问题的因为这些问题已经交给了包管理器来解决。但如果跳过包管理器,手动安装软件,可能会引入未知的依赖,可能导致包管理器在下次需要解决依赖时不知道该干什么,从而引发未知的后果。最为人称道的名场面就是知名油管主 Linus 在他的 Linux 日用挑战
中,只是想安装 steam 打游戏,但是却莫名其妙地干掉了整个桌面环境1,我个人在刚接触 Linux 时也遇到过因为软件包版本问题导致莫名其妙卸载掉了系统核心组件。
Linux 系统安装软件包时,我个人比较倾向于尽量使用包管理器安装软件,这样软件包及其依赖的版本都由包管理器控制,不容易出现问题,而且安装、更新与卸载都更为方便。原生包管理器是 Linux 安装软件包时的首选途径,不同的发行版自带的包管理器可能不同,但用法都大同小异,用法也不难,一般几分钟都能掌握基本的命令行用法。
如果官方的软件源中没有需要的软件,或是软件源中的软件包版本太低,可以看看开发者是否提供了适用于主流发行版第三方的软件源,例如 Docker 和 VSCode 就有。添加第三方软件源后,便可以使用原生包管理器来安装与更新目标软件。
某些发行版还会有自己特殊的方式来安装官方源以外的软件,比如 Ubnutu 的
PPA 和 ArchLinux 的 AUR
。
如果要安装的软件不在官方源中,也没有第三方源,那么可以考虑一些通用的第三方包管理器,如
flatpak 和 Nix
。(还有软件会提供 AppImage 包,也是各个发行版都通用的,但严格来说它不算是个包管理器,而是有点类似于 Windows 下的便携式应用程序,无需安装,单文件直接双击运行即可。)
如果以上的途径还是找不到想要的软件包,那就只能考虑手动安装了。具体的安装方式要参考各个软件提供的文档。但手动安装时,还是要记得尽量遵守 Linux 的 FHS 标准,以防搞乱文件系统,具体参考下一节内容。
整体上来说,Linux 的软件生态,对开源软件的安装一般比较友好。绝大部分常用开源软件已经内置进发行版软件源中,不在软件源中的软件,在自己的文档中一般也会提供适用于不同发行版的安装方法。
专有软件安装则可能会比较麻烦。一方面,一般情况下发行版软件源中几乎只包含开源软件,另一方面,很多公司对自己软件的 Linux 版本并不上心。不过,近些年随着一些通用软件包管理器如 Flatpak 的发展,包括很多专有软件,例如 Chrome、Spotify,以及国内常用的 QQ、WPS,也可以找到。2
对于我个人来说,ArchLinux 的官方源加上 AUR 就可以满足我几乎所有的软件安装需求了,实在没有的软件也可以很方便地在 AUR 上维护自己的版本,这大概是我将 ArchLinux 作为自己的主力发行版的重要原因之一吧。
发行版的维护与软件包更新总是免不了出现一些或是重大变动,这些变动会在更新说明中通知。为了尽可能避免出现问题,最好多关注一下自己主用的发行版和常用软件的更新说明。
比如前段时间,ArchLinux 宣布要将自己的版本管理从 SVN 迁移到 Git,同时软件包仓库也将进行一些改动,比如 commnuity 仓库与 extra 仓库要合并为一个 extra 仓库,所以 /etc/pacman.conf
中 commnuity 仓库可以删掉了。还有一次 grub 更新会破坏系统引导,ArchLinux 在官方公告中说明了,但我没看到,结果发现更新后引导没了,最后不得不想办法修复引导。
我个人主要用 RSS 订阅来关注发行版和常用软件的更新。一般发行版和软件都会在自己的官网中放上 RSS 订阅链接。另外两个关于 RSS 的冷知识:一是但凡用 Discourse 搭建的论坛,例如 Manjaro 官方论坛,都可以在话题的 URL 后添加一个 .rss
后缀变成订阅链接。二是 Github 上项目一些页面(如 releases 和 commits 页面),也可以在 URL 后面添加一个 .atom
后缀也可以当作订阅链接。
Linux 的 root 用户所拥有的权限十分强大,正因如此也带来了潜在的危险性。所以在实际使用中,常常是使用一个权限较少的普通用户,等需要使用 root 权限时再使用 sudo 或 su 提权。
但是,很多半吊子 Linux 教程动不动就会让你使用 root 权限,修改一些不能修改的东西,让很多 Linux 新手深受其害。在本节中,我总结了一些经验,关于何时需要 root 权限,以及如何更安全地使用 root 权限。
首先,为了防止干蠢事,可以选择禁用 root 用户登录。平时只使用普通用户登录,等需要使用 root 权限时再用 sudo 提权。
在禁用 root 用户登录前,要先确保已经配置好了一个拥有使用 sudo 权限的普通用户。之后,运行 sudo passwd -l root
,这条命令会锁定 root 用户。
此后,即使输入了正确的用户密码,也无法登陆 root 账户。如果之后有什么特殊情况真的需要登陆 root 账户,也只需运行 sudo passwd -u root
就可解锁 root 账户。
第二,在执行命令时,先判断是否真的需要 sudo。我有个朋友,他折腾 Linux 时,估计是不清楚什么命令需要 root 权限,就简单粗暴地在运行所有命令时都加上了 sudo,然后搞出了很多玄学问题。这其实是一种很不好的行为。
我倒有个很简单的方法,那就是如果不清楚该不该使用 root 权限,那就先不用 sudo,如果正常运行,那就说明这个命令不需要 root 权限;如果运行失败并出现了 'Permission denied' 的报错,那就说明需要 root 权限,就再加上 sudo 运行一遍。
这在运行来路不明的脚本或程序时格外有用,能在一定程度上防止潜在的恶意程序获取较高的权限损坏系统。(另外一个终端下的小技巧,在终端中运行 sudo !!
就可以将上一条命令加上 sudo 运行。)
第三,要了解 Linux 系统文件结构的常识。Linux 的一个特点就是「一切皆文件」,很多系统设置都可以通过修改特定文件来完成安装软件实际是将指定文件复制到特定的路径,卸载软件也是将特定路径下的文件删除。
所以在修改 Linux 系统里的文件时,也需要特别注意路径的含义。大多发行版的文件结构都遵循
FHS 标准,这个标准规定了 Linux 系统各个目录的作用与内容。
例如,普通用户家目录中的文件,一般都是用户的个人数据,其归属权也属于对应的用户,用户一般可以随便修改,也不需要 root 权限。而对于根目录下的文件,在修改时除了要小心不要搞坏了核心组件导致不开机,也需要注意文件是否被自动覆盖,导致修改失效。例如,根目录下大多数的文件都是由包管理器来控制的,修改后的文件也许会在软件更新后被包管理器自动覆盖掉。又如
/etc/resolv.conf,它决定了系统的默认 DNS 服务器,修改 DNS 后可以立即起效,但一般情况下其在系统重启后都会被网络管理器自动覆盖,所以要想永久性地修改系统 DNS,需要在对应的网络管理器中设置。
哪些目录是用户可以自行修改且不会被自动覆盖的呢?根据 FHS,主要是 /etc/
和 /usr/local/
。
/etc/
目录保存的是大多数程序的配置文件。大多数发行版的包管理器默认都不会覆盖这个目录下被修改过的文件,毕竟谁也不想更新个系统结果软件的配置变回默认了。比如 Archlinux 的 pacman 包管理器在更新时会将新版本的配置文件备份为后缀为 pacnew
的新文件,而 Debian 的 apt 包管理器会在大版本更新时询问是保留当前配置文件还是使用新版配置文件。另外 systemd 也会优先读取此目录下的服务文件,所以如果要是想添加或修改一个 systemd 的服务文件,可以将文件放在 /etc/systemd/system/
而不是包管理器默认的服务文件安装位置,比如 Archlinux 是 /usr/lib/systemd/system/
。当然,配置文件修改前也需要仔细阅读相关软件的文档,不然也可能造成问题。/usr/local/
目录的 FHS 定义是「本地数据的第三层次, 具体到本台主机。通常而言有进一步的子目录, 例如:bin/、lib/、share/」。我个人的理解是,/usr/local/
下的子目录分别对应 /usr/
目录下的其他目录,如 /usr/local/bin/
对应 /usr/bin/
,/usr/local/share/
对应 /usr/share
。区别在于,/usr/
目录下的文件是由包管理器控制的,如果修改就会被覆盖掉,而 /usr/local/
目录下的文件允许用户自行管理。比如包管理器默认的字体安装路径在 /usr/share/fonts/
,自行安装字体就可以放在 /usr/local/share/fonts/
,或是二进制文件默认在 /usr/bin/
,自行安装就可以放在 /usr/local/bin/
。另外还有个用 root 权限编辑文件的小技巧。比如使用 vim 编辑器修改 /etc/pacman.conf
,很多人会运行 sudo vim /etc/pacman.conf
;但如果你有一套比较舒服的 vim 配置,会发现这样做时 vim 并不会读取你的 vim 配置,因为存放在自己家目录的 vim 配置并不会全局生效。
相比之下,一个更好的方式是使用 sudoedit
或 sudo -e
命令,比如 sudoedit /etc/pacman.conf
。这是 sudo 软件包自带的命令,会将需要编辑的文件复制到一个临时目录,使用当前用户的权限打开并编辑,保存后再以 root 权限复制回去。这样,编辑器就会读取当前用户的配置文件,也增加了一层保护,在一定程度上防止改坏重要文件。(记得要提前把环境变量 EDITOR
指定为自己喜欢的编辑器。)
我是一个只用窗口管理器、不用桌面环境的用户。因为相比于完整的桌面环境,窗口管理器往往占用资源更少,自定义程度更高。但我接触到窗口管理器后发现其相比于完整的桌面环境也缺少了很多功能,或是一些程序界面并不跟随全局主题。在本节中我总结了一些经验,关于如何在窗口管理器环境中补全缺失的功能。
polkit 是 Linux 系统的一个认证组件。当以普通用户运行一个需要 root 权限的软件,如 GParted,界面会自动弹出认证页面,输入密码后就可以使软件暂时获得 root 权限,这个过程就是由 polkit 完成的。绝大部分完整的桌面环境都集成了 polkit 所以无需配置,而大多窗口管理器默认配置并没有集成 polkit,所以 GParted 这类软件无法正确获得权限。
配置 polkit 也相对简单,需要安装 polkit 本体以及前端的
身份认证组件,至于安装哪一个就取决于个人喜好了。我个人安装的是
polkit-gnome,之后将对应的二进制文件加入自启动(ArchLinux 下 polkit-gnome 的文件是 /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1
)。重启即可。
xdg-desktop-portal 是 Flatpak 团队开发的一个组件,可以简单理解为不同程序之间数据共享的中转站。它不止适用于 Flatpak 程序,其他场景,比如文件选择器,屏幕截图和屏幕共享都用得到它。尤其是在 wayland 环境下,xdg-desktop-portal 是 OBS 等程序实现屏幕录制重要的组件。
在大部分桌面环境,xdg-desktop-portal 是默认配置好的,而单独的窗口管理器环境就需要自己配置了。配置 xdg-desktop-portal 只需安装其程序本体和至少一个
后端组件,比如 xdg-desktop-portal-wlr 适用于大部分 Wayland 环境,xdg-desktop-portal-hyprland 为 Hyprland 环境提供了更多功能,另外还有一些通用的后端实现可供选择,比如 xdg-desktop-portal-gtk。安装好后服务会自动启用,无需过多配置。
在开始用窗口管理器之后,我安装了 xfce 桌面环境配套的文件管理器 thunar 用来进行简单的文件管理。但是我发现,文件管理器不能自动识别插入的 U 盘或其他设备,不能快速挂载和弹出,缺乏比较方便的浏览网络共享文件的方法,也没有集成文件压缩解压,回收站等等功能——而这些功能在完整的桌面环境中都是配置好的。
以我在用的 thunar 为例,首先安装 gvfs 从而让文件管理器支持回收站,显示可移动存储媒介等等功能,安装 gvfs 的一系列扩展以支持更多功能,如 gvfs-smb 支持浏览 smb 共享,gvfs-mtp 支持安卓设备连接等等。
还可以安装 thunar 的一系列
扩展,如 Thunar Media Tags Plugin 配合解压缩软件如 Xarchiver 实现右键菜单集成解压缩功能,Thunar Shares Plugin 实现快速创建文件共享。
如果你需要挂载 smb 共享,但发现即使选择了记住密码,每次挂载还是提示需要密码,可以安装 gnome-keyring 来存储密码,以及安装 seahorse 来方便地管理密码。
如果在一些程序中选择在文件夹中打开文件,但是发现并没有用文件管理器打开,而是其他程序,如 vscode 之类的,可能是系统没有正确设置默认的文件管理器。
为了解决这个问题,可以运行以下命令:
xdg-mime default my_file_manager.desktop inode/directory
其中 my_file_manager.desktop
是对应文件管理器的 desktop 文件,一般可在 /usr/share/applications/
路径下找到,比如 thunar 就是:
xdg-mime default thunar.desktop inode/directory
当花了大功夫配置好了窗口管理器,状态栏、终端模拟器、窗口还有壁纸都是一致的深色主题,相同的 nerdfonts 图标字体,一股成就感油然而生。正想打开几个窗口截个图在网上分享,结果发现有一部分软件并不遵守全局的主题配置,闪瞎眼的亮色主题和不和谐的字体将你拉回了现实,难免有些挫败感。所以,为了使程序的外观看起来尽可能一致,还需要一些配置。
字体
很多人为了在终端中使用图标字体,会安装打了 nerdfonts 补丁的字体,然后在对应程序的配置文件中指定所需的字体。但这样在不同的程序中所用的字体很可能不一致,导致在不同程序中界面显示比较割裂。
更不用提 CJK 语言中的异体字问题,会导致相同的字在不同的语言中字形不同,配置不好的话也可能会使汉字显示异常。
不过好在 Linux 存在一个 fontconfig 字体匹配机制,大多数程序都会遵守,可以在一定程度上解决以上的问题。我在网上看到了
这篇文章,对 Linux 下 fontconfig 字体匹配机制做了比较详细的解读。我按照文章作者放在 Github 上的
配置文件修改了一份属于我自己的
配置文件,也放在了 Github 上,感兴趣的朋友可以参考一下。
我的配置文件中使用到的字体有 noto-fonts、更纱黑体、nerdfonts 的纯图标字体还有苹果 emoji 字体,配置文件分别为宋体、黑体和等宽字体指定了默认使用字体和 Fallback 字体,还有在一些特殊场景下的字体替换规则。使用时,无需为字体打上 nerdfonts 补丁,只需安装需要的字体就行了。如果想在终端中使用带图标的等宽字体,只需指定字体为 monospace,想要在其他程序中使用黑体字体,就指定字体为 sans-serif,想要使用宋体,就指定字体为 serif。
另外也可安装 nwg-look、qt5ct 和 qt6ct 来分别为 GTK 程序和 QT 程序全局指定字体,具体内容可参考下一个小节,这样在大部分的程序中字体显示就都是一致的了。
全局主题
在 Linux 上大部分程序都使用 GTK 或 QT 来构建图形界面,而这些程序都可以遵守用户设定的全局主题,从而使程序拥有一致的外观与配色。这在大多数的完整桌面环境中都是默认配置好的,而且有比较直观的图形配置界面,但在使用窗口管理器时就需要一些手动配置了。
首先从 GTK 程序下手。GTK 程序默认从配置文件读取全局主题的配置,没有配置文件的话就默认会使用一套名为 Adwaita 的配色和图标主题,不算好看也不算丑。想要修改的话可以使用一些图形化的配置软件,如 lxappearance 和 nwg-look,一般可以配置配色、图标、字体以及光标等等。GTK 的主题一般可以从软件源中下载安装。
需要注意的是,一些 GTK 程序在 sway 等 Wayland 环境下并不会读取配置文件中的主题配置,一个
解决方法是新建一个如下的 bash 脚本,添加可执行权限后将其加入自启动。
#!/bin/sh
# usage: import-gsettings
config="${XDG_CONFIG_HOME:-$HOME/.config}/gtk-3.0/settings.ini"
if [ ! -f "$config" ]; then exit 1; fi
gnome_schema="org.gnome.desktop.interface"
gtk_theme="$(grep 'gtk-theme-name' "$config" | sed 's/.*\s*=\s*//')"
icon_theme="$(grep 'gtk-icon-theme-name' "$config" | sed 's/.*\s*=\s*//')"
cursor_theme="$(grep 'gtk-cursor-theme-name' "$config" | sed 's/.*\s*=\s*//')"
font_name="$(grep 'gtk-font-name' "$config" | sed 's/.*\s*=\s*//')"
gsettings set "$gnome_schema" gtk-theme "$gtk_theme"
gsettings set "$gnome_schema" icon-theme "$icon_theme"
gsettings set "$gnome_schema" cursor-theme "$cursor_theme"
gsettings set "$gnome_schema" font-name "$font_name"
接下来是 QT 程序了。在 KDE Plasma 桌面环境以外,QT 程序都很难与 GTK 程序保持外观一致;而且与 GTK 程序不同,QT 程序是从环境变量中读取主题配置的,如果环境变量没有指定,QT 程序就会使用非常丑且辣眼睛的白色界面。
为了配置 QT 程序的主题,需要安装 qt5ct 和 qt6ct 来分别为使用了 QT5 和 QT6 版本的程序配置主题,同时还要指定
环境变量:QT_QPA_PLATFORMTHEME=qt5ct
。之后安装主题引擎
kvantum 和
kvantum 主题,然后在 qt5ct 和 qt6ct 中指定自己安装的主题即可。
如果想要让 GTK 程序 和 QT 程序
保持一致的外观,则可以不安装 kvantum,而是安装
qt5gtk2 和
qt6gtk2,然后在 qt5ct 和 qt6ct 中分别指定主题为 qt5gtk2 和 qt6gtk2,这样 GTK 和 QT 就能有相对一致的外观了。
还有一点需要注意,就是在每次 qt5-base 和 qt6-base 软件包更新后,都需要将 qt5gtk2 和 qt6gtk2 重新编译安装,不然就有可能导致 QT 程序无法打开。
还有些程序比较特殊:gimp 和 libreoffice 需要在软件配置中将主题指定为 system 才会遵从全局主题;OBS-Studio 虽然是 QT 程序,但在设置中将主题指定为 system 并不会使用 QT 主题配色,只能手动导入
主题配色。
没有使用 GTK 或 QT 构建的软件包是不会读取全局主题配置的,最多只可以遵从全局暗色主题,比如 electron 软件。这类软件如果在设置中可以指定不同的配色方案,倒也可以选择一个和全局主题相近的配色方案,如果没有这类设置的话,就无能为力了。使用 Flatpak 安装的软件包也不能读取全局主题配置。
最后展示一下我的 Hyprland 配置,分别是 GTK 程序 Thunar,QT 程序 prismlanucher,electron 程序 Heroic Games Launcher,终端 foot,还有状态栏 waybar,都使用的
Gruvbox 配色方案。