#118 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

#117 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: 权限不够)

#116 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 参数。

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

2026-05-19

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

#111 5 个 Systemd 加速的方法

2025-09-30

5 个提升 Linux 系统启动速度的 systemd 优化技巧,来自《5 systemd tweaks that really boost my boot time》。
不仅是减少启动秒数,更能提升系统响应速度,减少等待时间;通过分析、禁用、屏蔽和调优服务,可打造符合个人需求的流畅启动体验,且调整可逆,适合长期使用。

一、通过 systemd-analyze 定位启动慢的原因

  1. 工具作用
    • systemd-analyze:显示内核和用户空间初始化的总时间,提供启动时间的宏观概览。
    • systemd-analyze blame:按服务启动耗时排序,列出具体服务的耗时明细,定位低效服务(如配置错误或无用的守护进程)。
    • systemd-analyze critical-chain:展示服务依赖关系链,识别阻塞关键任务的服务,为调整启动顺序提供依据。
  2. 操作建议
    • 多次运行分析工具,区分偶发异常(如硬件检测延迟)和持续低效服务,优先优化问题最突出的服务;保存分析结果以便对比优化效果。

二、禁用不必要的后台服务

  1. 优化逻辑
    • 许多 Linux 发行版默认启用冗余服务(如无打印机时的打印守护进程、无蓝牙硬件时的蓝牙管理器),禁用这些服务可减少启动耗时。
  2. 操作方法
    • systemctl disable [服务名]:禁止服务随系统启动,需用时可手动启动;
    • systemctl mask [服务名]:彻底屏蔽服务(适用于确定完全不需要的服务),防止被意外启动。
  3. 注意事项
    • 避免盲目禁用服务,先确认服务功能及依赖关系;每次仅修改一项并测试,防止系统功能损坏。

三、利用 systemd 并行启动优化依赖关系

  1. 原理优势
    • systemd 支持服务并行启动(区别于传统 init 系统的串行启动),合理配置依赖可提升 CPU 和磁盘利用率。
  2. 优化方法
    • 通过systemctl list-dependencies或查看单元文件,检查服务依赖关系,移除不必要的依赖(如使用After=Requires=指令调整启动顺序);
    • 启用“套接字激活”(socket activation):仅在套接字被访问时启动服务,减少启动时的服务加载量。

四、屏蔽可能被重新启用的服务

  1. 适用场景
    • 部分服务可能因软件更新或依赖关系被重新启用,屏蔽(mask)可确保其持续禁用(如与现有网络管理器冲突的网络守护进程)。
  2. 操作命令
    • systemctl mask [服务名]:将服务绑定到/dev/null,阻止任何启动尝试;
    • systemctl unmask [服务名]:取消屏蔽。
  3. 注意点
    • 屏蔽前务必确认服务无间接依赖,避免影响其他功能。

五、优化桌面会话启动流程

  1. 显示管理器调整
    • 更换为轻量级显示管理器(如 LightDM 比 GDM 启动更快),或调整现有管理器的配置以减少启动耗时。
  2. 自动启动应用管理
    • 在桌面环境中禁用不必要的自动启动程序(如云同步工具、更新助手),仅保留必需应用,加快桌面加载速度。
  3. 启动目标优先级调整
    • 延迟非关键服务的启动,优先加载桌面环境,使系统更快进入可用状态。

#110 转载:Android 15 提供原生 Linux 终端

2025-03-16

Android 的 Linux 终端应用现已广泛适用于 Pixel 设备,获取方法如下

你需要一部 Pixel 设备、最新的软件更新,以及几分钟的时间。

作者:Andy Walker
2025 年 3 月 7 日

TL;DR(摘要)

  • Android 的 Linux 终端应用现已广泛适用于运行 2025 年 3 月更新的 Pixel 设备。
  • 该基于 Debian 的环境允许用户随身携带完整的 Linux 实例,尽管仍缺乏一些便捷功能。

去年年底,我们曾报道过,Google 正在开发一款原生的 Linux 终端应用,使智能手机用户能够随身携带桌面级 Linux 发行版。从那时起,我们已经看到该应用随着 Android 15 测试版推送。而现在,随着 2025 年 3 月的 Pixel 更新,这款应用的稳定版本已更广泛地适用于运行最新稳定版 Android 的 Google 手机用户。

“设置” > “系统” > “开发者选项” 中启用 Linux 开发环境后,Linux 终端应用的图标会自动出现。当我激活该功能并点击图标时,系统提示我下载 567MB 的文件。

尽管我在 Pixel 8 上首次尝试运行该终端时失败了,但第二次尝试成功了。越过这个小障碍后,我便可以通过应用列表中的快捷方式打开终端,并运行诸如 helpdffree -m 等基础命令。当然,你也可以执行更高级的命令。

值得注意的是,该 Linux 环境基于 Debian,这是最成熟的 Linux 发行版之一。与原生终端应用 Termux 不同,Linux 终端应用是通过 Android 虚拟化框架(AVF) 在虚拟机中运行的。

不过,该 Linux 终端应用仍然缺少一些功能。其中最大的缺陷可能是 不支持 GUI 应用,但正如我们之前进行的《Doom》演示所示,这项功能计划在 Android 16 中推出。

对大多数用户来说,Android 上的 Linux 终端应用或许并不算特别激动人心或具有颠覆性,但对于开发者和高级用户而言,这无疑是一个巨大的进步。它使用户能够在移动设备上运行桌面级 Linux 应用,为各种需求提供便利。