疑难解答

Silverblue 应用了全新的桌面操作系统部署与管理技术,所以在你日常使用时难免会遇到各种问题。我们在这里摘录了一部分问题列举如下。

软件包替换被禁止

层叠软件包依赖于基本系统映像中的包时,有可能就会发生这种情况。层叠软件包需要更高版本的依赖软件包,基本系统映像中却无法提供。

大部分情况下,耐心等候新版本的 OSTree 构建就可以了,新的构建届时会提供正确版本的软件包,大多数情况下能解决问题。

如果你在更新到新版依然遇到相同的问题,你可以尝试使用 rpm-ostree cleanup -m 清理元数据信息然后重新 rpm-ostree install

你也可以在 cleanup 操作后尝试变基到任意 updates 分支,例如 fedora/30/updates/x86_64

安装软件包到 /opt/usr/local

/opt 安装软件包这个问题由一些尝试在 Silverblue 上安装 Google Chrome 的用户发起。尽管目前已经有了层叠 Google Chrome 的 临时解决方案,然而在 /opt 写入可变数据依然是个大难题。

使用 NVIDIA 驱动

很多用户希望在 Silverblue 上使用他们的 NVIDIA GPU。值得庆幸的是,https://twitter.com/gnomealex[Alex Larsson] 已经对 akmodskmodtools 软件包做出修改以允许用户安装 NVIDIA 驱动。

# rpm-ostree install kmod-nvidia xorg-x11-drv-nvidia

你可以在 Alex 的 博客 了解更多相关信息。

SELinux 相关问题

有些 Silverblue 用户可能希望临时修改默认的 SELinux 策略,以解决与 SELinux 相关的问题。如果在修改后又希望恢复到默认的 SELinux 策略,则可以尝试下面的操作。

  1. 查看当前的 SELinux 策略

    $ sudo ostree admin config-diff | grep policy
    M    selinux/targeted/active/policy.linked
    M    selinux/targeted/active/policy.kern
    M    selinux/targeted/policy/policy.31
    A    selinux/targeted/policy/policy.30

    如果执行这个命令有任何输出,那就意味着 SELinux 策略有被改动过。

  2. 复制 OSTree 构建提供的 SELinux 默认策略

    $ sudo cp -al /etc/selinux{,.bak}
    $ sudo rsync -rlv /usr/etc/selinux/ /etc/selinux/

    此时执行 ostree admin config-diff | grep policy 应该不会再有输出,也就意味着 SELinux 策略恢复成功。

    如果恢复没有成功,还可以尝试下面的方法。

  3. 移除已有 SELinux 策略;添加默认策略

    $ sudo rm -rf /etc/selinux
    $ sudo cp -aT /usr/etc/selinux /etc/selinux

    此时执行 ostree admin config-diff | grep policy 应该不会再有输出。

无法将用户添加到用户组

由于 rpm-ostree 的原因,usermod -a -G 是无法将用户添加到用户组的。在 rpm-ostree 使用 systemd sysusers 之前,用户必须先按照 /usr/lib/group 填写 /etc/group,然后才能将自己添加到组中。现在假设要将用户添加到 libvirt 组:

# grep -E '^libvirt:' /usr/lib/group >> /etc/group
# usermod -aG libvirt username
你需要注销并重新登录来应用这些更改。

ostree fsck 提示文件受损

当磁盘上有一个或多个文件损坏或丢失时, ostree fsck 就会报告错误。https://github.com/ostreedev/ostree/pull/345#issuecomment-262263824[解决方法] 则是将有关的 OSTree 提交标记为部分检索,然后重新拉取提交。

/boot/efi 只读导致所有更新被阻断

在苹果设备上 Silverblue 很有可能会出现这样的问题。苹果设备上的 /boot/efi 分区的文件系统是 HFS+,这一文件系统不一定能很好地处理各种电源事件。

Silverblue 映像中已经默认提供了 hfsplus-tools 软件包,所以处理起此类问题应该还是很容易的。

# umount /boot/efi
# fsck.hfsplus /dev/sda1
# mount -o rw /boot/efi

你可以查看与本节相关联的 Issue 以了解更多信息。

无法在 EFI 系统安装 Silverblue

当你的设备曾经安装过其它操作系统,在安装 Silverblue 的时候可能会得到下面的报错:

ostree ['admin', '--sysroot=/mnt/sysimage', 'deploy', '--os=fedora-workstation', 'fedora-workstation:fedora/28/x86_64/workstation'] exited with code -6`

解决方案有下面几个:

  • 安装的时候选择手动分区并划分一个额外的 EFI 分区并挂载到`/boot/efi`。这样子就可以使 Fedora Silverblue 与你之前安装的操作系统共存。如果这样做不奏效,那么还有另一种方法。

  • 安装的时候选择手动分区,挂载 /boot/efi 分区的时候勾选格式化选项以格式化 EFI 分区。

格式化 /boot/efi 可能会使以前安装的操作系统无法被引导。在使用此解决方法之前,请确认你已经备份一切重要数据。

toolbox: failed to list images with com.redhat.component=fedora-toolbox

如果 podman 版本大于或等于 1.4.0,下面的解决措施可能不是必要的。在尝试下面的方案前请通过 rpm-ostree upgrade 确认 podman 是最新的。

如果你的 podman 版本大于或等于 1.2.0,在执行 toolbox list 时可能会得到下面的报错:

toolbox: failed to list images with com.redhat.component=fedora-toolbox
下面的解决措施可能也适用于其它因 1.2.0 或更高版本的 toolbox 导致的 toolbox 报错。详见 Toolbox Github 仓库

作为一个解决措施,执行下面的命令替换 podman 软件包:

$ rpm-ostree override --remove=podman-manpages replace https://kojipkgs.fedoraproject.org//packages/podman/1.2.0/2.git3bd528e.fc30/x86_64/podman-1.2.0-2.git3bd528e.fc30.x86_64.rpm

重启系统使改动生效。

当然你可以遵循下面的步骤完成软件包的替换:

  1. Koji 下载 podman-1.2.0-2.git3bd528e.fc30.x86_64.rpm

  2. 移除 podman-manpagesrpm-ostree override remove podman-manpages

  3. 使用第一步下载的包替换当前已安装的 podmanrpm-ostree override replace podman-1.2.0-2.git3bd528e.fc30.x86_64.rpm

现在重启系统使改动生效。

要撤销上面的改动,执行:

$ rpm-ostree override reset podman; rpm-ostree override reset podman-manpages

因权限原因无法进入 Toolbox 容器

在某些版本的 podman 下,尝试进入 Toolbox 容器时可能会报错。你可以使用下面的命令修正权限问题。

$ sudo chown -R $USER ~/.local/share/containers/storage/overlay-containers

这会重置容器的权限设定以允许你重新进入容器。

执行 restorecon

你不应该在 Silverblue 执行 restorecon。请查看相关问题报告了解详情 - https://bugzilla.redhat.com/show_bug.cgi?id=1259018

不过即使你不小心执行了这个,也是可以挽救的。

  1. 引导系统时使用 enforcing=0 参数

  2. 在本地创建一个新的修复好的提交

  3. 部署这个提交

  4. 执行 restorecon

  5. 重启系统

  6. 执行清理工作

    $ rpm-ostree status -b | grep BaseCommit
                    BaseCommit: 696991d589980aeaef5eda352dd7ad3d33c444c789c209f793a84bc6e7269aee
    $ sudo ostree checkout -H 696991d589980aeaef5eda352dd7ad3d33c444c789c209f793a84bc6e7269aee /ostree/repo/tmp/selinux-fix
    $ sudo ostree fsck --delete
    $ sudo ostree commit --consume --link-checkout-speedup --orphan --selinux-policy=/ /ostree/repo/tmp/selinux-fix
    $ sudo restorecon -Rv /var
    $ sudo restorecon -Rv /etc
    $ sudo ostree admin deploy fedora-atomic:fedora/30/x86_64/silverblue
    $ sudo reboot

请注意在操作完成后,所有层叠的软件包会被删除;在恢复完成之后,你需要重新层叠它们。