#122 为什么 Linux 有优秀工程师,却缺少优秀的桌面产品?

2026-09-10

Linux 在服务器、云计算等领域无处不在,也拥有大量优秀工程师,但桌面产品长期难以与 Windows、macOS 竞争。问题未必是技术能力不足,而是:

  1. Linux 缺少一个真正对完整产品体验负责的主体。

    Windows 有微软,macOS 有苹果。界面不好用、软件体验不统一,最终都有人负责。

    Linux 则涉及内核、桌面环境、发行版、软件包和大量社区成员,常常是每个组件都有人维护,但整个产品没人负责。

  2. 开源社区擅长技术决策,却不一定擅长设计。

    技术问题可以讨论、测试甚至投票,但审美和产品体验往往需要取舍。优秀设计必须有人敢说:“这个功能不需要,这个设计不行。”

    但社区文化强调包容和尊重不同需求,结果容易形成“功能越来越多,默认体验却越来越平庸”的局面。

  3. Linux 有时会把技术路线放在产品体验之前。

    一个软件是否适合作为默认应用,讨论的不只是好不好用,还可能涉及许可证、Mono、微软等技术路线争议。

这也是 Omarchy 这类“强主张软件”受到关注的原因。像 Omarchy,由 DHH 直接决定默认桌面、快捷键和软件组合。用户当然可以修改,但默认答案只有一个。

Linux 桌面真正的问题不是民主,而是责任被稀释。可以广泛讨论,但产品最终必须有人拍板。

设计不是投票。Linux 擅长给用户选择,却不擅长替用户做决定。而优秀的消费级产品,往往不是提供最多选择,而是在无数选择中,坚持做出一个足够好的默认答案。

以上观点,根据微信公众号文章《Ubuntu设计团队往事:品味是如何死在投票箱里的?》整理。

#121 Linux 下为什么 /bin 与 /usr/bin 并存

2026-08-31

相信好多人学习 Linux 的时候都认为 usr 是 user 的简写,但是好多资料都会告诉我们 usr 是 Unix System Resource 的缩写(好几种不同说法),并不是 user 的简写。
然后 /bin & /usr/bin 以及 /sbin & /usr/sbin 的设计也是有一番道理(核心工具 & 普通工具)。

今天看到一篇技术博客告诉我,这一切没有这么多优雅设计,都是早期 Unix 开发时一块 1.5MB 磁盘容量不够,祖师爷们设计的一个临时补救措施,没想到一直沿用至今,之后其他所有的解释都是入关之后的大儒辩经。

1971 年 Ken Thompson 与 Dennis Ritchie 在 PDP-11 上写 Unix 时,第一块 1.5MB 的 RK05 根盘写满后的临时补漏:溢出命令顺手塞进原本挂 /usr(存用户文件,相当于早期 home 目录)的第二块盘,建了 /usr/bin、/usr/lib,并把 $PATH 改成 /bin:/usr/bin。

Fedora、Debian、Ubuntu、Arch 等近年推行 usrmerge,将 /bin、/sbin、/lib 软链到 /usr 下对应目录,承认两者本该合一。

-> % find / -maxdepth 1 -type l -ls
       13      0 lrwxrwxrwx   1 root     root            7 4月 22  2024 /lib -> usr/lib
       15      0 lrwxrwxrwx   1 root     root            8 4月 22  2024 /sbin -> usr/sbin
       12      0 lrwxrwxrwx   1 root     root            7 4月 22  2024 /bin -> usr/bin
       14      0 lrwxrwxrwx   1 root     root            9 4月 22  2024 /lib64 -> usr/lib64

#120 Ubuntu 上钉钉不能启动的问题

2026-07-10

从官网下载的钉钉 deb 文件,安装之后竟然无法启动。

-> % ll ~/Downloads/com.alibabainc.dingtalk_8.1.0.6021101_amd64.deb
-rw-rw-r-- 1 catroll catroll 387M 2026-07-10 21:39:31 /home/catroll/Downloads/com.alibabainc.dingtalk_8.1.0.6021101_amd64.deb

-> % apt install ~/Downloads/com.alibabainc.dingtalk_8.1.0.6021101_amd64.deb

一边查看日志(journalctl --user -f),一边点击钉钉图标,可以看到以下错误日志:

7月 10 21:49:27 eqr com.alibabainc.dingtalk.desktop[361857]: ubuntu
7月 10 21:49:27 eqr com.alibabainc.dingtalk.desktop[361857]: ubuntu branch
7月 10 21:49:27 eqr com.alibabainc.dingtalk.desktop[361857]: preload_libs=./libgbm.so ./plugins/dtwebview/libcef.so
7月 10 21:49:27 eqr com.alibabainc.dingtalk.desktop[361873]: ERROR: ld.so: object './libgbm.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
7月 10 21:49:27 eqr com.alibabainc.dingtalk.desktop[361873]: Run Main is_gpu=0 is_zygote=0 is_render=0 is_crashpad_handler=0 cmd : ./com.alibabainc.dingtalk
7月 10 21:49:27 eqr com.alibabainc.dingtalk.desktop[361873]: Load /opt/apps/com.alibabainc.dingtalk/files/8.1.0-Release.6021101//dingtalk_dll.so failed! Err=/opt/apps/com.alibabainc.dingtalk/files/8.1.0-Release.6021101//dingtalk_dll.so: cannot enable executable stack as shared object requires: Invalid argument
7月 10 21:49:27 eqr systemd[4607]: Started app-gnome-com.alibabainc.dingtalk-361857.scope - Application launched by gnome-shell.

经过 AI 的一番分析,结论是:

钉钉 deb 包依赖的 ELF 动态链接配置与当前系统环境不匹配。patchelf 修正了二进制的解释器、RPATH 或依赖库路径,使程序能正确加载运行时库之后就可以启动了。

sudo apt install -f patchelf
sudo patchelf --clear-execstack /opt/apps/com.alibabainc.dingtalk/files/8.1.0-Release.6021101/dingtalk_dll.so

#119 gdebi: Breaks existing package 'xxx' conflict

2026-07-07

我之前下载 deb 文件都用 gdebi 安装,但是今天升级 curosr 的时候报错:Breaks existing package 'cursor' conflict

-> % ll ~/Downloads/cursor_3.10.17_amd64.deb
-rw-rw-r-- 1 markjour markjour 187M 2026-07-07 03:35:12 /home/markjour/Downloads/cursor_3.10.17_amd64.deb

> % sudo gdebi ~/Downloads/cursor_3.10.17_amd64.deb
[sudo: authenticate] 密码:       
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Reading state information... Done
此软件包不可安装
Breaks existing package 'cursor' conflict: cursor ( )

因为 Cursor 打包的时候声明和已经安装的 cursor 冲突。

-> % apt info ~/Downloads/cursor_3.10.17_amd64.deb | cat
Package: cursor
Version: 3.10.17-1783235114
Priority: optional
Section: devel
Maintainer: Cursor <hi@cursor.com>
Installed-Size: 908 MB
Provides: cursor
Depends: ca-certificates, libasound2 (>= 1.0.17) | libasound2t64 (>= 1.0.17), libatk-bridge2.0-0 (>= 2.5.3) | libatk-bridge2.0-0t64 (>= 2.5.3), libatk1.0-0 (>= 2.11.90) | libatk1.0-0t64 (>= 2.11.90), libatspi2.0-0 (>= 2.9.90) | libatspi2.0-0t64 (>= 2.9.90), libc6 (>= 2.14), libc6 (>= 2.16), libc6 (>= 2.17), libc6 (>= 2.2.5), libc6 (>= 2.25), libc6 (>= 2.28), libcairo2 (>= 1.6.0) | libcairo2t64 (>= 1.6.0), libcups2 (>= 1.6.0) | libcups2t64 (>= 1.6.0), libcurl3-gnutls | libcurl3-nss | libcurl4 | libcurl3, libdbus-1-3 (>= 1.9.14) | libdbus-1-3t64 (>= 1.9.14), libexpat1 (>= 2.1~beta3) | libexpat1t64 (>= 2.1~beta3), libgbm1 (>= 17.1.0~rc2) | libgbm1t64 (>= 17.1.0~rc2), libglib2.0-0 (>= 2.39.4) | libglib2.0-0t64 (>= 2.39.4), libgtk-3-0 (>= 3.9.10) | libgtk-3-0t64 (>= 3.9.10), libgtk-3-0 (>= 3.9.10) | libgtk-3-0t64 (>= 3.9.10) | libgtk-4-1 | libgtk-4-1t64, libnspr4 (>= 2:4.9-2~) | libnspr4t64 (>= 2:4.9-2~), libnss3 (>= 2:3.30) | libnss3t64 (>= 2:3.30), libnss3 (>= 3.26) | libnss3t64 (>= 3.26), libpango-1.0-0 (>= 1.14.0) | libpango-1.0-0t64 (>= 1.14.0), libudev1 (>= 183), libx11-6 | libx11-6t64, libx11-6 (>= 2:1.4.99.1) | libx11-6t64 (>= 2:1.4.99.1), libxcb1 (>= 1.9.2) | libxcb1t64 (>= 1.9.2), libxcomposite1 (>= 1:0.4.4-1) | libxcomposite1t64 (>= 1:0.4.4-1), libxdamage1 (>= 1:1.1) | libxdamage1t64 (>= 1:1.1), libxext6 | libxext6t64, libxfixes3 | libxfixes3t64, libxkbcommon0 (>= 0.5.0) | libxkbcommon0t64 (>= 0.5.0), libxkbfile1 (>= 1:1.1.0) | libxkbfile1t64 (>= 1:1.1.0), libxrandr2 | libxrandr2t64, xdg-utils (>= 1.0.2)
Recommends: libvulkan1
Conflicts: cursor
Replaces: cursor
Homepage: https://cursor.com
Download-Size: 195 MB
APT-Manual-Installed: yes
APT-Sources: /home/markjour/Downloads/cursor_3.10.17_amd64.deb
Description: The AI Code Editor.

于是改用 apt 安装成功:

-> % sudo apt install ~/Downloads/cursor_3.10.17_amd64.deb
注意,选中 'cursor' 而非 '/home/markjour/Downloads/cursor_3.10.17_amd64.deb'
将被升级:                
  cursor

摘要:
  升级:1,安装:0,卸载:0,不升级:0
  下载大小:0 B / 195 MB
  所需的空间:16.5 MB / 625 GB 可用

获取:1 /home/markjour/Downloads/cursor_3.10.17_amd64.deb cursor amd64 3.10.17-1783235114 [195 MB]
正在预设定软件包 ...       
(正在读取数据库 ... 系统当前共安装有 381608 个文件和目录。)
准备解压 .../cursor_3.10.17_amd64.deb  ...
正在解压 cursor (3.10.17-1783235114) 并覆盖 (3.5.17-1779246638) ...
正在设置 cursor (3.10.17-1783235114) ...
正在处理用于 desktop-file-utils (0.28-1build1) 的触发器 ...
正在处理用于 gnome-menus (3.38.1-1ubuntu1) 的触发器 ...
正在处理用于 shared-mime-info (2.4-5build3) 的触发器 ...
注意: 由于文件'/home/markjour/Downloads/cursor_3.10.17_amd64.deb'无法被用户'_apt'访问,已脱离沙盒并提权为根用户来进行下载。 - pkgAcquire::Run (13: 权限不够)

#118 Ubuntu 26.04 上的 ls 变化(变成 Rust 版本)

2026-07-06
alias ll="LC_ALL=c ls -hlAF --group-directories-first"

ls 命令我经常会加上 --group-directories-first 参数,将文件夹排在前面。
PS:ls 默认就会按照字母顺序排序。
PS:ls 默认会忽略前导小数点,比如排序 a .b c 这样。我加上 LC_ALL=c 之后就会 .b a c 这样排序。

现在突然发现我的 ll 命令不按文件名称排序了,经过一番研究,原来是现在的 Ubuntu 26.04(我大概在两个月前从 25.04 升级过来)改用了 Rust 重构版本的 coreutils,也就是说一百多个命令都替换成了 Rust 版本。
然后这个版本在处理 --group-directories-first 参数的时候存在兼容问题,甚至可以说是 BUG:这个参数会导致排序规则失效(哪怕加上 Rust 版本新加的 --sort=name 也没有用)。

-> % apt-file search "/usr/bin/ls" | grep -E "bin/ls$"
coreutils-from-busybox: /usr/bin/ls
coreutils-from-gnu: /usr/bin/ls
coreutils-from-toybox: /usr/bin/ls
coreutils-from-uutils: /usr/bin/ls

-> % apt list --installed | grep coreutils
coreutils-from-uutils/resolute,now 0.0.0~ubuntu25 all [已安装,自动]
coreutils/resolute,now 9.5-1ubuntu2+0.0.0~ubuntu25 all [已安装,自动]
gnu-coreutils/resolute,now 9.7-3ubuntu2 amd64 [已安装,自动]
rust-coreutils/resolute,now 0.8.0-0ubuntu3 amd64 [已安装,自动]

关键是 coreutils-from-uutils 直接 Break coreutils-from-gnu,替换了相关文件,而不是通过软链接实现。
现在除非重新安装 coreutils 包覆盖回去,没有别的办法。
我不是 Linux 专家,所以要尊重社区的决定,没到万不得已,不能 Break 他们的设计。

那就只好这样了,暂时不用 --group-directories-first 参数。

#115 Ubuntu 系统在 IPv6 环境下的公网暴露排查与加固

2026-05-19

家用宽带默认启用了 IPv6,并且 Ubuntu 24.04 主机可以通过 IPv6 地址直接使用 SSH 登录。这意味着设备获得了全球可路由地址,不再依赖 IPv4 NAT 的“隐身”效果。
这种情况本身并不表示系统已经被攻击,但确实意味着主机上的监听服务可能直接暴露在公网,需要对当前安全状态进行审计,并建立基本的防护措施。

#113 国产 Linux 发行版乱象

2026-01-20

目前国内较有代表性的 Linux 发行版包括银河麒麟、统信 UOS、openEuler、龙蜥 Anolis OS、Deepin、中科方德、凝思磐石、中兴新支点、Loongnix 等。

这些系统在底层都以 Linux 为基础,但发行版并不只是内核的不同包装。各厂商通常会围绕不同的硬件平台、应用场景和客户需求,对内核、驱动、软件包、桌面环境、安全组件及系统工具进行集成和维护,并形成不同的生态体系。

例如,麒麟和统信覆盖政企桌面及服务器,openEuler 和龙蜥主要面向服务器及云计算,Deepin偏重桌面体验,Loongnix则与龙芯处理器生态结合较深。不同发行版的核心差异,更多体现在技术路线、兼容性、生态、服务能力和商业定位上,而不仅仅是操作系统功能层面的竞争。


国际市场这么大,真正形成规模的商业 Linux 发行版其实并不多:

  • Red Hat Enterprise Linux(RHEL) —— Red Hat / IBM
  • Ubuntu —— Canonical
  • SUSE Linux Enterprise(SLES) —— SUSE

当然,全球 Linux 发行版远不止这些,还有 Debian、Fedora、Arch、Alpine 等大量社区发行版,以及 Oracle Linux、Amazon Linux 等面向特定企业和云计算场景的产品。但如果看全球企业级商业市场,真正拥有广泛客户、成熟商业模式和长期服务体系的厂商,最终还是高度集中。

反观国内,生态就显得令人困惑。在各种开发者和信创相关的新闻中,经常能听到十几个 Linux 发行版的名字。有些发行版下面甚至还有针对不同地区、行业、硬件平台的定制版本。

那问题来了:Linux 内核本身是开源的,全球已经有如此成熟的发行版生态,为什么国内仍然有这么多企业可以推出自己的“国产操作系统”?它们究竟靠什么获得客户,又为什么能够长期活下来?


其实答案大家心里都有数。国产 Linux 所处的市场,并不是一个完全依靠产品竞争和用户选择进行淘汰的市场。

Linux 的开源属性降低了发行版的技术门槛,而国产化政策和政企采购又创造了相对稳定的市场需求。两者叠加,使不同厂商都有机会找到自己的细分市场。因此,国产 Linux 的繁荣,更像是政策需求、多供应商策略与市场机制共同作用的结果。

  1. 政策创造了一个相对稳定的市场

    海外 Linux 发行版虽然同样很多,但企业市场经过长期竞争,最终形成了 RHEL、SUSE、Ubuntu 等少数主流商业平台。发行版要长期生存,通常需要依靠稳定的产品能力、软件生态、企业客户和商业服务体系。

    国内则有所不同。国产操作系统的重要客户集中在政务、央国企以及金融、电力、能源、交通等关键行业。采购除了考虑产品能力,还涉及国产化要求、安全资质、行业认证、本地服务以及供应链安全(需要多个供应商)等因素。

    这意味着,一个发行版不一定需要在整个市场中做到最好,只要能够进入特定采购体系、服务特定行业,就可能获得自己的生存空间。市场淘汰机制自然也就没有那么强。

  2. 背后的产业体系并不容易整合

    银河麒麟、统信、openEuler、中科方德、凝思等项目背后涉及不同的国企、央企、科研机构和大型企业,各自拥有不同的股东背景、产业资源和战略目标。

    因此,它们并不是普通互联网公司之间简单的市场竞争。即使技术上存在重复,涉及股权、国资、客户和产业利益后,也很难通过市场化并购迅速整合。

  3. 大家也没有完全竞争同一个市场

    有的侧重政企桌面,有的侧重服务器和云计算,有的深耕电力、轨交、军工等行业,还有的与特定国产 CPU 深度绑定。

    对这些厂商而言,一个独立发行版本身就是进入特定行业、绑定特定硬件和服务客户的商业载体。

  4. Linux 开源降低了进入门槛

    Linux 内核和大量基础软件都是开源的。企业不需要从零开始开发一个操作系统,而是可以基于成熟的 Linux 生态进行内核、驱动、软件包、安全组件和桌面环境的定制。

    真正困难的是长期维护、生态建设和商业化。但在国产化需求推动下,厂商可以通过硬件适配、行业认证、技术服务和项目交付形成商业价值。

于是就形成了国内 Linux 发行版异常繁荣的特殊现象,国产发行版越来越多。

当然,这种模式也有明显代价:生态碎片化。软件厂商需要适配更多发行版,驱动、软件包、依赖库和系统接口也可能存在差异,最终增加整个产业链的维护成本。


国产 Linux 已经形成了一定规模,但发行版数量过多、重复建设和生态碎片化的问题也越来越明显。未来究竟会走向进一步整合,还是继续保持多家并存,目前仍值得观察。

从供应链安全角度看,保留多个厂商和技术路线有其合理性;但从产业效率看,重复投入大量资源开发相似的基础能力,也可能造成不必要的浪费。

目前尚不清楚国家层面对于国产操作系统的长期规划,是否会进一步推动技术标准、生态和产业资源整合。理想状态或许不是简单地“淘汰掉大多数厂商”,而是在保留多供应商竞争的同时,推动底层技术、应用接口和生态标准逐步统一。

未来国产 Linux 究竟是继续“百花齐放”,还是在竞争中逐渐收敛,最终仍取决于政策方向、市场机制和产业自身的发展。