gdk-pixbuf2 2.44.1-4有潜在的不兼容变更,会影响大量gtk/gnome程序

该BUG会影响使用该库进行图像加载的程序,在我的设备上,暂时观察到rofi、firefox受到了影响。

表现:rofi -show drun加载不出来缩略图;firefox响应缓慢,在进行标签页相关操作时十分卡顿。

解决方案:降级到2.44.1-3就好了。可以从/var/cache/pacman/pkg/中找到旧包。如果找不到就从 archive.archlinux.org 上手动下载,链接为:https://archive.archlinux.org/packages/g/gdk-pixbuf2/gdk-pixbuf2-2.44.1-3-x86_64.pkg.tar.zst

看起来是加了 bwrap 沙盒, 但我这里没有问题。

确实,我在rofi的log中看到了bwrap。不过这个问题应该也不只我一个,因为我在英文bbs上也看到了有人反映这个问题。桌面组件Debug起来也比较麻烦,我就安心等后续更新了。

:joy: 我找到问题了,罪魁祸首就是:ln -svf /mnt/c/Windows/Fonts/ ~/.local/share/fonts/ms-fonts

我将C盘的字体文件夹挂载到了.local目录,导致bwrap挂载.local时发现字体文件夹权限不对劲,它拒绝挂载/mnt/c。

现在我改为挂载到根分区sudo ln -s /mnt/c/Windows/Fonts /usr/share/fonts/Windows

权限就没问题了。

怎么说呢,这很难叫做bug。但恐怕这次遇到这个问题的人不在少数。

没太明白这是怎么回事(

不太清楚 glycin 是如何使用 bubblewrap 的,以及报的是什么错

最终它采用的bwrap命令确实很奇怪,应该它是单独扫描了fonts目录,尝试将软链接指向的目录挂载到容器中(这样也确实是合理的,不这样做,字体肯定会缺失)。

最终命令的效果就很离谱:

bwrap \
    --unshare-all \
    --die-with-parent \
    --chdir / \
    --ro-bind /usr /usr \
    --dev /dev \
    --ro-bind-try /etc/ld.so.cache /etc/ld.so.cache \
    --ro-bind-try /nix/store /nix/store \
    --tmpfs /tmp-home \
    --tmpfs /tmp-run \
    --clearenv \
    --setenv HOME /tmp-home \
    --setenv XDG_RUNTIME_DIR /tmp-run \
    --setenv XDG_RUNTIME_DIR /run/user/1000 \
    --symlink /usr/lib /lib \
    --symlink /usr/lib /lib64 \
    --ro-bind-try /etc/fonts/conf.d /etc/fonts/conf.d \
    --ro-bind-try /etc/fonts/fonts.conf /etc/fonts/fonts.conf \
    --ro-bind-try /home/acd407/.cache/fontconfig /home/acd407/.cache/fontconfig \
    --ro-bind-try /home/acd407/.config/fontconfig/conf.d /home/acd407/.config/fontconfig/conf.d \
    --ro-bind-try /home/acd407/.config/fontconfig/fonts.conf /home/acd407/.config/fontconfig/fonts.conf \
    --ro-bind-try /home/acd407/.local/share/fonts /home/acd407/.local/share/fonts \
    --ro-bind-try /mnt/c/Windows/Fonts /home/acd407/.local/share/fonts/ms-fonts \
    --ro-bind-try /var/cache/fontconfig /var/cache/fontconfig \
    --bind-try /home/acd407/.cache/glycin/usr/lib/glycin-loaders/2+/glycin-svg /home/acd407/.cache/glycin/usr/lib/glycin-loaders/2+/glycin-svg \
    --setenv XDG_CACHE_HOME /home/acd407/.cache/glycin/usr/lib/glycin-loaders/2+/glycin-svg \
    --seccomp 14 \
    /usr/lib/glycin-loaders/2+/glycin-svg

注意

    --ro-bind-try /mnt/c/Windows/Fonts /home/acd407/.local/share/fonts/ms-fonts

符号链接确实没法作为挂载点,会报错这是符合预期的。但为什么改成 /usr/share/fonts/Windows 就好了呢,同样是符号链接应该也会报错吧(

bwrap \
    --unshare-all \
    --die-with-parent \
    --chdir / \
    --ro-bind /usr /usr \
    --dev /dev \
    --ro-bind-try /etc/ld.so.cache /etc/ld.so.cache \
    --ro-bind-try /nix/store /nix/store \
    --tmpfs /tmp-home \
    --tmpfs /tmp-run \
    --clearenv \
    --setenv HOME /tmp-home \
    --setenv XDG_RUNTIME_DIR /tmp-run \
    --setenv XDG_RUNTIME_DIR /run/user/1000 \
    --symlink /usr/lib /lib \
    --symlink /usr/lib /lib64 \
    --ro-bind-try /etc/fonts/conf.d /etc/fonts/conf.d \
    --ro-bind-try /etc/fonts/fonts.conf /etc/fonts/fonts.conf \
    --ro-bind-try /home/acd407/.cache/fontconfig /home/acd407/.cache/fontconfig \
    --ro-bind-try /home/acd407/.config/fontconfig/conf.d /home/acd407/.config/fontconfig/conf.d \
    --ro-bind-try /home/acd407/.config/fontconfig/fonts.conf /home/acd407/.config/fontconfig/fonts.conf \
    --ro-bind-try /home/acd407/.local/share/fonts /home/acd407/.local/share/fonts \
    --ro-bind-try /var/cache/fontconfig /var/cache/fontconfig \
    --bind-try /home/acd407/.cache/glycin/usr/lib/glycin-loaders/2+/glycin-svg /home/acd407/.cache/glycin/usr/lib/glycin-loaders/2+/glycin-svg \
    --setenv XDG_CACHE_HOME /home/acd407/.cache/glycin/usr/lib/glycin-loaders/2+/glycin-svg \
    --seccomp 20 \
    /usr/lib/glycin-loaders/2+/glycin-svg \
    --dbus-fd 1

这是它现在执行的命令,可以看到,它也不尝试处理/usr/share/fonts/Windows挂载了。

恐怕就是gdk-pixbuf2对于~/.local/share/fonts目录有着特殊的处理吧。

已经有错误报告了。

https://gitlab.gnome.org/GNOME/gdk-pixbuf/-/issues/273

还有解决方案,不过要到下一个release才能看见效果

1 个赞

不对啊,arch 打包已经 backport 这个 commit 了,但就是这个 commit 反而搞坏了(或者是还没修好),你上面列出的 bwrap 参数就是应用了这个 commit 之后才有的行为(

我觉得正确的行为不是 --ro-bind-try realpath(path) path,这样目标 path 是符号链接仍然不能作为挂载点(就像你遇到的问题),而应该是 --ro-bind-try path path --ro-bind-try reapath(path) realpath(path)

edit: 其实即使用 realpath,如果路径中间还有别的符号链接的话仍然有问题。符号链接确实挺难处理的

确实,就目前来看,它这个补丁能解决符号链接不是绝对路径的问题,不过和我的问题也没什么关系。crate::fontconfig::cached_paths()也不知道返回的是什么,真的只是fontconfig吗。估计就是~/.local/share/fonts在里面,但/usr/share/fonts/是不在里面的。也奇怪,字体文件夹关fontconfig什么事,它应该只关注.config/fontconfig/conf.d/呀。

我闲了看下 glycin 生成 bwrap 参数的代码。感觉这个帖子应该先不要标记成已解决,毕竟上游其实还没修明白。

另外 CC @kimiblock

我现在的直觉是这一行应该换成 tmp-overlayfs,然后删掉其中的符号链接并 mkdir 改成目录,然后再 --ro-bind-try realpath(path) path 挂载。但是这也要求用户的 ~/.local/share/fonts 下面没有其它挂载点

1 个赞

我也已经看迷糊了。我已经取消已解决了。现在已知的是,取消~/.local/share/fonts 里的目录的软链接确实能暂时解决问题。

另外我建议你到 archlinux.org 上的这个 issue 去反馈一下此问题仍然未解决(附上你在本贴中发现的信息,包括一楼的内容),建议维护者先 revert 掉 2.44.1-4 的更改

Due to an influx of spam, we have had to temporarily disable account registrations.

哎,只怕我现在还注册不了呢。

不是发邮件创建账号吗?横幅的后半部分应该有写。

build了一个不依赖glycin的版本,自取

Edit:
更新包,启用额外依赖支持
gdk-pixbuf2-docs-2.44.2-1-x86_64.pkg.tar.zst (2.3 MB)
gdk-pixbuf2-2.44.2-1-x86_64.pkg.tar.zst (651.7 KB)

1 个赞

我发了个邮件,到现在也没回复。不过应该也用不着我反馈了,和我同时就有人发现问题并准确定位到符号链接了。