惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threat Research - Cisco Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Register - Security
The Register - Security
A
About on SuperTechFans
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
L
LangChain Blog
N
Netflix TechBlog - Medium
量子位
博客园 - 三生石上(FineUI控件)
宝玉的分享
宝玉的分享
H
Help Net Security
D
Docker
D
DataBreaches.Net
T
Tailwind CSS Blog
阮一峰的网络日志
阮一峰的网络日志
B
Blog
博客园 - 聂微东
Apple Machine Learning Research
Apple Machine Learning Research
Google DeepMind News
Google DeepMind News
The Cloudflare Blog
F
Full Disclosure
GbyAI
GbyAI
F
Fortinet All Blogs
Last Week in AI
Last Week in AI
Y
Y Combinator Blog
人人都是产品经理
人人都是产品经理
Recent Announcements
Recent Announcements
博客园 - Franky
MongoDB | Blog
MongoDB | Blog
有赞技术团队
有赞技术团队
博客园 - 叶小钗
小众软件
小众软件
V
Visual Studio Blog
月光博客
月光博客
Stack Overflow Blog
Stack Overflow Blog
The GitHub Blog
The GitHub Blog
Recorded Future
Recorded Future
J
Java Code Geeks
雷峰网
雷峰网
P
Privacy & Cybersecurity Law Blog
C
Cisco Blogs
C
Cyber Attacks, Cyber Crime and Cyber Security
AWS News Blog
AWS News Blog
Webroot Blog
Webroot Blog
美团技术团队
N
News | PayPal Newsroom
G
Google Developers Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
博客园_首页
V
Vulnerabilities – Threatpost

陈陈菌博客

如何在 podman 容器内使用 systemd 在 podman 运行 GUI 应用的经验总结 管理 podman 容器与镜像的导入或导出 解决 VSCodium 或 Code-Server 无法安装 GitHub Copilot 问题 不可变发行版 Fedora Silverblue 的体验记录 解决 apt 或 dnf 无法 tab 补全的问题 对 (MPA) 多页面切换实现丝滑动画的探索 让服务在非 Root 权限下使用 80 或 443 端口 AppImage 应用打包快速上手 Flatpak 使用和应用打包快速上手 如何用 webSocket 实现一个实时聊天应用 Linux 内核编译 | 快速上手 | deb 使用 debootstrap 构建 Debian 系根文件系统 高度可定制的 KDE 窗口装饰器 klassy 有关 docker、podman、nspawn、bwrap 的 Linux 容器图形性能测试 创建任意 Linux 容器并支持 GUI 程序 (Docker) 创建任意 Linux 容器并支持 GUI 程序 (nspawn) 文件同步工具 rsync 的使用 玲珑 (Linyaps) 应用打包 RPM 打包指南 | 精简版 PBR 材质的各种贴图类型入门 APU | Stable-Diffusion 使用记录 如何在 Electron 上启用 WebGPU Grub 主题安装与配置 Fcitx5 主题安装与自定义 不使用 Nginx 的网站开发指南 如何自制一个简易的资源监控程序 SQL 常用 CRUD 语法记录 Debian 打包入门,与需要注意的问题 在 fedora 建立一个 Arch 容器 (bwrap) 在 fedora 上建立一个 debian 容器 (bwrap) i3wm | 自制一个极简的屏幕亮度调节器 在 Linux 下启用内存压缩技术 zram 搭建一个本地轻量级聊天 Ai 我又又又重新上线了博客 如何通过命令行管理 wine 容器 (包括 proton) Btrfs 文件系统创建 swap 文件的方法 如何创建适用于 Linux 桌面的程序启动文件 在 Linux 控制 intel CPU 调度的方法 Arch Linux 的基本安装
用 xdg-dbus-proxy 解决容器的文件选择器的问题
GlumiStudio@ · 2026-04-14 · via 陈陈菌博客

2026-04-14 23:54:31

分类: Linux 标签: 问题解决,容器


Linux 桌面有时候需要容器开 GUi,并且和系统深度集成(如:调用宿主输入法、桌面系统通知),需要给容器传这些文件(其中 -E 为环境变量,--bind 是挂载):

-E DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$UID/bus"
--bind="$XDG_RUNTIME_DIR"

但有个问题,文件选择器也会调用宿主的,没办法找容器自己的文件。所以我们需要定制 DBUS_SESSION_BUS_ADDRESS

我使用的是 xdg-dbus-proxy 去解决。

# 1. 在 XDG_RUNTIME_DIR 下生成一个代理 socket 路径
PROXY_SOCKET="$XDG_RUNTIME_DIR/nspawn-bus-proxy"

# 2. 启动 xdg-dbus-proxy,开启过滤:只放行 fcitx 相关的通信,拦截其他所有服务(如 Portal),容器一旦无法调用宿主的文件选择器则会开始调用内部的选择器。
xdg-dbus-proxy "unix:path=/run/user/$uid/bus" "$PROXY_SOCKET" \
    --filter \
    --own=org.fcitx.* \
    --talk=org.fcitx.* &
PROXY_PID=$!

# 3. 确保脚本退出(容器关闭)时,自动清理后台的代理进程和 socket
trap "kill $PROXY_PID; rm -f $PROXY_SOCKET" EXIT
#  传递的环境变量(这里是 systemd-nspawn 的参数)
-E DBUS_SESSION_BUS_ADDRESS="unix:path=$PROXY_SOCKET" \

我使用的是 systemd-nspawn 容器,完整的启动脚本:

#!/bin/bash

xhost +local:
uid=1000
gid=1000

# 1. 在 XDG_RUNTIME_DIR 下生成一个代理 socket 路径
PROXY_SOCKET="$XDG_RUNTIME_DIR/nspawn-bus-proxy-$"

# 2. 启动 xdg-dbus-proxy,开启过滤:只放行 fcitx 相关的通信,拦截其他所有服务(如 Portal)
xdg-dbus-proxy "unix:path=/run/user/$uid/bus" "$PROXY_SOCKET" \
    --filter \
    --own=org.fcitx.* \
    --talk=org.fcitx.* &
PROXY_PID=$!

# 3. 确保脚本退出(容器关闭)时,自动清理后台的代理进程和 socket
trap "kill $PROXY_PID; rm -f $PROXY_SOCKET" EXIT

# 4. 启动容器,将容器的 DBUS 地址指向这个“被过滤的”代理 Socket
sudo systemd-nspawn  \
    --hostname="$1" \
    --directory="$2" \
    -E DISPLAY="$DISPLAY"  \
    -E LANG="zh_CN.UTF-8" \
    -E PULSE_SERVER="unix:/run/user/$uid/pulse/native" \
    -E DBUS_SESSION_BUS_ADDRESS="unix:path=$PROXY_SOCKET" \
    -E XMODIFIERS="@im=fcitx" \
    -E QT_IM_MODULE="fcitx" \
    -E GTK_IM_MODULE="fcitx" \
    -E INPUT_METHOD="fcitx" \
    -E HSA_OVERRIDE_GFX_VERSION="11.5.1" \
    -E GLFW_IM_MODULE="fcitx" \
    -E SDL_IM_MODULE="fcitx" \
    -E XDG_RUNTIME_DIR="$XDG_RUNTIME_DIR" \
    -E WAYLAND_DISPLAY=$WAYLAND_DISPLAY \
    -E GTK_USE_PORTAL=0 \
    --property=AppArmorProfile=unconfined \
    --capability="all" \
    --bind-ro="/run/dbus/system_bus_socket" \
    --bind-ro="/dev/kfd" \
    --bind-ro="/dev/dri" \
    --bind-ro="/run/udev" \
    --bind="/dev/shm" \
    --bind-ro="/dev/input"  \
    --bind="$XDG_RUNTIME_DIR" \
    --bind-ro="/etc/resolv.conf" \
    -M "$1"