Skip to content

Instantly share code, notes, and snippets.

@jiacai2050
Last active June 13, 2026 11:33
Show Gist options
  • Select an option

  • Save jiacai2050/734d186074e683805d61f8353d6cc0fb to your computer and use it in GitHub Desktop.

Select an option

Save jiacai2050/734d186074e683805d61f8353d6cc0fb to your computer and use it in GitHub Desktop.
Ubuntu 24.04 升级 26.04 后 Chrome 无法弹出文件选择框(上传文件卡死)排查与完美解决

终极指南:解决 Ubuntu 从 24 升级到 26 后壁纸变黑与 Chrome 无法上传文件的问题

当 Linux 系统跨大版本升级时,底层的安全框架往往会发生剧烈的变动。一个典型的例子就是从 Ubuntu 24.04 升级到 26.04 (开发/预览版)。升级后,用户经常会遇到两个表面上毫无关联、但极为恶心的 Bug:

  1. 桌面壁纸变纯黑:在系统设置里选择任何 JPG/PNG 图片,桌面都会瞬间变黑。
  2. 浏览器无法上传文件:在 Google Chrome 或 Brave 浏览器中点击“上传文件”或“选择文件”按钮,没有任何反应,文件选择弹窗死活出不来。

本文将深入分析其背后的核心原因,并提供**“快速权宜方案”“官方原生高安全方案”**两种完整的修复教程。


1. 核心原因分析:沙盒死锁与 AppArmor 误杀

如果你运行以下命令检查 GNOME 桌面的用户日志:

journalctl --user -b 0 | grep -E "background|mutter|gnome-shell" | tail -n 15

会发现密密麻麻的同一种报错: Failed to load background ... Loader process exited early with status '1'

为什么会这样?

在新版的 Ubuntu 和 GNOME 桌面架构中,系统为了极致的安全性,将许多原本可以直接运行的后台组件进行了隔离沙盒化(Sandboxing),其底层的核心容器工具叫 Bubblewrap (bwrap)

  • 系统壁纸:新版 GNOME 采用了基于 Rust 的 glycin 图像解码框架。每次更换壁纸时,系统都会拉起一个独立的 bwrap 沙盒来解码图片,防止恶意图片利用库漏洞攻击内核。
  • 浏览器文件弹窗:Chrome 会将文件选择请求发送给 xdg-desktop-portal 服务,该服务同样会在沙盒内部拉起原生的文件选择器窗口。

升级带来的冲突

从 Ubuntu 24.04 开始,内核默认严厉限制了非特权用户创建沙盒命名空间的权限。 当你大版本升级系统时(而不是全新纯净安装),旧系统残留在 /etc/apparmor.d/ 中的安全规则与 26.04 的新规则发生了冲突。内核错误地将壁纸助手和弹窗服务当成了恶意行为,直接在初始化阶段将 bwrap 沙盒进程拍死闪退(Exit Status 1)。沙盒管道一断,壁纸无法渲染( fallback 回黑色),浏览器弹窗也跟着静默失败。


2. 方案 A:快速且务实的“权宜方案”

如果你想立刻解决问题,不想折腾复杂的安全规则,可以通过以下步骤放宽沙盒权限约束

步骤 1:允许内核中的非特权用户沙盒命名空间

打开终端,运行以下命令让内核永久放行沙盒克隆权限:

echo "kernel.unprivileged_userns_clone=1" | sudo tee -a /etc/sysctl.d/99-disable-bwrap-restriction.conf
sudo sysctl --system

步骤 2:将 AppArmor 的限制设为宽松模式

这会通知 AppArmor 规则:对 bwrap 容器工具只警告、不拦截:

sudo apt update && sudo apt install -y apparmor-utils
sudo aa-complain /usr/bin/bwrap

步骤 3:强行刷新桌面和弹窗服务

杀掉之前卡死的僵尸图形进程,让新权限立刻生效:

systemctl --user restart xdg-desktop-portal
killall -3 gnome-shell

执行完毕后,你的壁纸更换功能和 Chrome 上传文件弹窗将瞬间恢复正常。


3. 方案 B:官方原生的“高安全白名单方案”

方案 A 在系统层面上降低了防御级别。如果你希望使用 Ubuntu 26.04 原生的解决思路——即“既保留最严格的沙盒防御,又精准放行桌面组件”,请使用本方案修复升级导致的配置断层。

步骤 1:恢复内核的严格沙盒限制

首先,移除方案 A 中手动添加的内核覆盖配置,恢复严格防线:

sudo rm -f /etc/sysctl.d/99-disable-bwrap-restriction.conf
sudo sysctl --system

步骤 2:强制覆盖并重装 26.04 的安全配置文件

这一步非常关键。我们要强制包管理器用全新的 26.04 官方白名单配置,去覆盖掉你旧系统(24.04)升级残留的冲突文件

sudo apt update
sudo apt install -o Dpkg::Options::="--force-confnew" --reinstall apparmor apparmor-utils bubblewrap

步骤 3:启用官方专属的 bwrap 限制白名单配置文件

Ubuntu 26.04 引入了一个专门为桌面组件量身定制的例外放行文件。运行以下命令强制激活它:

sudo aa-enforce /etc/apparmor.d/bwrap-userns-restrict
sudo systemctl restart apparmor

步骤 4:重启你的图形服务栈

systemctl --user restart xdg-desktop-portal
killall -3 gnome-shell

使用此方案后,你的电脑依然处于“军工级”的最高防范状态,同时系统也能正确识别并允许自己的壁纸助手和文件弹窗正常工作。


4. 总结:我该用哪一个?

  • 推荐使用方案 A:如果你这台电脑是个人开发机、娱乐日常机,不想被后续系统微更新频繁折腾,方案 A 足够稳定高效(其安全级别相当于以前的 Ubuntu 22.04)。
  • 推荐使用方案 B:如果你这台电脑是企业级工作站、核心生产环境,或者你对系统安全有极度的强迫症,请选择方案 B。

本文为原创踩坑记录,如果你在升级 Ubuntu 26.04 时也遇到了相同的困扰,欢迎在评论区点赞、留言交流!

Ubuntu 24.04 升级 26.04 后 Chrome 无法弹出文件选择框(上传文件卡死)排查与完美解决

1. 现象描述

系统从 Ubuntu 24.04 升级到 26.04 后,在使用 Google Chrome 浏览器进行文件上传或下载时,点击“选择文件”按钮没有任何反应,文件选择框完全无法弹出

如果尝试在终端(Terminal)中启动 Chrome 并复现该操作,会看到类似如下的 D-Bus 通信报错:

[ERROR:components/dbus/xdg/request.cc:173] Request ended (non-user cancelled).

2. 排查心路历程(避坑指南)

在解决这个问题的过程中,我们经历了一番深入的排查,以下是踩坑与验证的过程:

❌ 尝试一:通过环境变量/启动参数屏蔽 Portal(失败)

最初怀疑是 Wayland 环境下的安全限制导致。我们尝试通过显式关闭 UseXdgDesktopPortal 特性,或强制指定 X11 兼容模式启动 Chrome:

google-chrome-stable --ozone-platform=x11 --disable-features=UseXdgDesktopPortal,GtkFileChooserPortal

结果: 依然报相同的错误。这说明新版 Chrome 在 Ubuntu 26.04 下已经硬编码了文件选择器逻辑,无论怎么加参数,它都必须通过 D-Bus 向系统的门禁服务(Portal)发起请求。

🔍 尝试二:定位系统级服务日志(关键突破)

既然无法绕过 Portal,我们决定深入查看系统底层服务的运行状态:

systemctl --user status xdg-desktop-portal* --no-pager

在抛出的日志中,发现了导致死锁的罪魁祸首

xdg-desktop-portal-gnome: Delegated FileChooser call failed: Object does not exist at path…esktop”

原因分析: 由于大版本升级,GNOME 桌面的底层 D-Bus 接口发生了破坏性变更。当 Chrome 发出弹窗请求后,GNOME 的门禁后端(xdg-desktop-portal-gnome)试图将任务进一步委托给 GNOME 壳层(Shell)的内部对象。由于升级后的兼容性冲突,该对象在总线上“失踪”了,导致请求直接被系统掐断(非用户取消)。


3. 终极解决方案(一行配置完美修复)

既然 GNOME 自己的原生委派后端卡死,最快且最稳妥的解决办法就是夺取其控制权,强制系统在需要文件弹窗时,改用无委托依赖的、更稳定的标准 GTK 后端

步骤一:修改或创建 Portal 配置文件

在终端中执行以下命令,编辑当前用户的 Portal 优先级配置文件:

mkdir -p ~/.config/xdg-desktop-portal/
nano ~/.config/xdg-desktop-portal/portals.conf

步骤二:写入强制降级配置

将文件内容修改为以下配置,显式指定 FileChooser 的提供者为 gtk

[preferred]
default=gnome;gtk;
org.freedesktop.impl.portal.FileChooser=gtk

(注:在 Nano 编辑器中,按 Ctrl + O 回车保存,Ctrl + X 退出)

步骤三:重启服务生效

运行以下命令,让 Systemd 重新加载配置并重启相关的门禁服务:

systemctl --user daemon-reload
systemctl --user restart xdg-desktop-portal-gtk.service
systemctl --user restart xdg-desktop-portal.service

步骤四:验证

完全关闭 Chrome 并重新打开,点击上传按钮,标准的文件选择框瞬间弹出,问题完美解决!


4. 总结与反思

Linux 滚动升级或跨版本大升级(尤其是涉及 GNOME 桌面环境和 Wayland/D-Bus 核心架构时),经常会残留旧版本的环境缓存或带来接口命名不匹配的问题。

遇到类似应用与系统交互卡死的情况,不要盲目重装应用,学会使用 systemctl --user status 配合终端日志去追踪 D-Bus 总线上的错误,往往能一针见室地找到重定向配置的根源。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment