使用 podman 附加映像存储时如何解决 /etc/mtab 符号链接权限错误?

使用 podman 附加映像存储时如何解决 /etc/mtab 符号链接权限错误?

概括:我尝试在podmanUbuntu 服务器上使用其他映像存储,但遇到权限问题。运行时确实会显示共享图像podman images。当我尝试运行它时,我得到了Error: creating /etc/mtab symlink: permission denied。当我使用sudo, 作为 sudoer 时,它会尝试拉取远程映像而不是使用本地共享映像。其他用户也无法运行共享映像。

我的方法基于两个博客:

探索 Podman 中的其他图像存储

立即尝试 5 个未充分利用的 Podman 功能

目标:作为一名“服务器管理员”(实际上是一位计算机科学老师,几乎没有使用容器进行教育目的的系统管理经验),我想创建一个单身的共享映像并允许多个用户运行该共享映像。这样,我们就不会得到许多相同的副本(想想数百个学生图像副本作为替代)相同的为每个用户提供镜像,但每个用户都可以轻松使用相同的容器化设置。

我的尝试:

我相信我已经走到了那里的大部分路。然而,最终,帐户serveradmin和典型用户(例如user01)都无法运行共享映像。

这是全新安装 Ubuntu Server 时发生的情况。

首先,登录时serveradmin,典型的更新内容

serveradmin@testserver> sudo apt update 
serveradmin@testserver> sudo apt dist-upgrade

接下来,安装podman并测试它是否有效

serveradmin@testserver> sudo apt install podman
serveradmin@testserver> podman run hello-world # worked perfectly 

期望只看到 hello-world 图像。是的,有效。

serveradmin@testserver> podman images
REPOSITORY                     TAG         IMAGE ID      CREATED        SIZE
docker.io/library/hello-world  latest      feb5d9fea6a5  13 months ago  19.9 kB

创建共享存储位置供所有用户访问图像

serveradmin@testserver> sudo mkdir /var/lib/shared-storage

拉我的pmtest(“podman 测试”)图像从 DockerHub 拉入共享地点

serveradmin@testserver> podman --root /var/lib/shared-storage pull docker.io/<my_dockerhub>/pmtest

寻找拉取的图像,它还不可见,正如预期的那样

serveradmin@testserver> podman images
REPOSITORY                     TAG         IMAGE ID      CREATED        SIZE
docker.io/library/hello-world  latest      feb5d9fea6a5  13 months ago  19.9 kB

为以下内容创建存储配置serveradmin

serveradmin@testserver> mkdir ~/.config/containers/
serveradmin@testserver> vim .config/containers/storage.conf
serveradmin@testserver> cat ~/.config/containers/storage.conf 
[storage]
driver = "overlay"
[storage.options]
additionalimagestores = [ "/var/lib/shared-storage"]

serveradmin用户无法阅读/var/lib/shared-storage/*以列出图像

serveradmin@testserver> podman images
Error: error opening "/var/lib/shared-storage/overlay-images/images.lock": permission denied

使用sudo,看不到任何图像,甚至看不到之前可见的hello-world图像

serveradmin@testserver> sudo podman images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE

那么,让/var/lib/shared-storage世界可读、世界可执行,这样可以吗?

serveradmin@testserver> sudo chmod +r -R /var/lib/shared-storage/
serveradmin@testserver> sudo chmod +x -R /var/lib/shared-storage/

现在图像确实对用户serveradmin可见

serveradmin@testserver> podman images
REPOSITORY                     TAG         IMAGE ID      CREATED         SIZE        R/O
docker.io/<my_dockerhub>/pmtest     latest      824fec7db82a  16 minutes ago  262 MB      true
docker.io/library/hello-world  latest      feb5d9fea6a5  13 months ago   19.9 kB     false

但是,无法运行图像,多次尝试

serveradmin@testserver> podman run pmtest
Error: creating /etc/mtab symlink: permission denied
serveradmin@testserver> podman run docker.io/<my_dockerhub>/pmtest:latest 
Error: creating /etc/mtab symlink: permission denied

sudo使用任一时都无法运行

serveradmin@testserver> sudo podman run pmtest
Error: short-name "pmtest" did not resolve to an alias and no unqualified-search registries are defined in "/etc/containers/registries.conf"

使用sudo podman run拉取映像而不是运行共享映像。这不是我想要的。

serveradmin@testserver> sudo podman run docker.io/<my_dockerhub>/pmtest:latest 
Trying to pull docker.io/<my_dockerhub>/pmtest:latest...
Getting image source signatures
Copying blob cf92e523b49e done  
Copying blob d59e8b19e2b2 [====================>-----------------] 37.2MiB / 68.6MiB

那么另一个用户呢?无论如何,这就是最终目标,因此创建另一个标准用户

serveradmin@testserver> sudo useradd user01
serveradmin@testserver> sudo passwd user01
New password: 
Retype new password: 
passwd: password updated successfully

登录为user01,看不到任何图像

user01@testserver> podman images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE

为 ,创建附加图像存储配置user01,就像以前一样

user01@testserver> micro .config/containers/storage.conf
user01@testserver> cat ~/.config/containers/storage.conf 
[storage]
driver = "overlay"
[storage.options]
additionalimagestores = [ "/var/lib/shared-storage"]

现在,user01确实可以看到共享图像了

user01@testserver> podman images
REPOSITORY                  TAG         IMAGE ID      CREATED      SIZE        R/O
docker.io/<my_dockerhub>/pmtest  latest      824fec7db82a  5 hours ago  262 MB      true

但是,user01仍然无法运行图像,与 相同的问题serveradmin,除了甚至无法使用sudo

user01@testserver> podman run pmtest
Error: creating /etc/mtab symlink: permission denied
user01@testserver> podman run docker.io/<my_dockerhub>/pmtest:latest
Error: creating /etc/mtab symlink: permission denied
user01@pmtestserver:~$ 

答案1

我认为您可能错过了几个关键步骤。我将在我自己的 Ubuntu 22.04.1 系统上逐步完成该过程,让我们看看最终结果如何。

我将在安装后立即开始podman。首先,让我们看看我们得到了什么版本:

root@ubuntu:~# podman version
Version:      3.4.4
API Version:  3.4.4
Go Version:   go1.17.3
Built:        Thu Jan  1 00:00:00 1970
OS/Arch:      linux/amd64

嗯,这令人失望。 Podman 4 于 2021 年 8 月发布。我们可能会遇到此版本中未实现的功能(尽管您链接的第一篇文章于 2020 年发布,所以我们应该没问题)或 bug已在较新的版本中修复,但我们还是尝试一下吧!

创建共享图像存储

这将看起来引人注目地与您尝试过的类似:)。

  1. 我们需要一个用于共享存储的目录:

    mkdir /var/lib/shared-storage
    
  2. 让我们用图像填充它:

    podman --root /var/lib/shared-storage pull docker.io/alpine:latest
    
  3. 我们知道之所以有效,是因为我们在使用该选项时可以看到图像--root

    root@ubuntu:~# podman --root /var/lib/shared-storage/ image ls
    REPOSITORY                TAG         IMAGE ID      CREATED       SIZE
    docker.io/library/alpine  latest      9c6f07244728  2 months ago  5.83 MB
    
  4. 现在我们需要配置以下additionalimagestores选项/etc/containers/storage.conf

    [storage]
    driver = "overlay"
    graphroot = "/var/lib/containers/storage"
    
    [storage.options]
    additionalimagestores = ["/var/lib/shared-storage"]
    

    (该graphroot选项之所以存在,是因为如果没有它,它podman会不断地大喊它未设置。)

  5. 有了这个配置——并且没有其他变化-- 我们看到它可以podman运行为root

    root@ubuntu:~# podman image ls
    REPOSITORY                TAG         IMAGE ID      CREATED       SIZE        R/O
    docker.io/library/alpine  latest      9c6f07244728  2 months ago  5.83 MB     true
    

    R/O请注意,我们在该输出中看到了附加列,表明正在podman从我们的additionalimagestores.

  6. 仍然运行root,我们可以从该镜像启动一个容器:

    root@ubuntu:~# podman run --rm docker.io/alpine:latest cat /etc/os-release
    NAME="Alpine Linux"
    ID=alpine
    VERSION_ID=3.16.2
    PRETTY_NAME="Alpine Linux v3.16"
    HOME_URL="https://alpinelinux.org/"
    BUG_REPORT_URL="https://gitlab.alpinelinux.org/alpine/aports/-/issues"
    

    您可以看到它不需要拉取图像,因为它已经存在于共享位置。

以非特权用户身份访问共享映像存储

现在我们已经可以为 工作了root,让我们让它为非特权用户工作。我创建了一个这样的测试用户:

useradd -m -c "Test User 001" user001
  1. 成为测试用户1

    su - user001
    
  2. 创建$HOME/.config/containers/storage.conf为:

    mkdir ~/.config/containers
    cat > ~/.config/containers/storage.conf <<EOF
    [storage]
    driver = "overlay"
    
    [storage.options]
    additionalimagestores = ["/var/lib/shared-storage"]
    
    [storage.options.overlay]
    mount_program = "/usr/bin/fuse-overlayfs"
    EOF
    

    最后一点——设置storage.options.overlay.mount_program——至关重要(直接来自您链接的第一篇文章)。

  3. 尝试访问新的图像存储...

    podman image ls
    

    ...然后看着它失败:

    Error: error opening "/var/lib/shared-storage/overlay-images/images.lock": permission denied
    
  4. 授予对所有内容的读取权限(以及对目录的执行权限)/var/lib/shared-storage.作为root, 跑步:

    chmod -R a+rX /var/lib/shared-storage/
    
  5. 返回帐户user001并重新尝试我们的podman命令:

    user001@ubuntu:~$ podman image ls
    REPOSITORY                TAG         IMAGE ID      CREATED       SIZE        R/O
    docker.io/library/alpine  latest      9c6f07244728  2 months ago  5.83 MB     true
    
  6. 通过运行容器来验证一切正常:

    user001@ubuntu:~$ podman run --rm docker.io/alpine:latest cat /etc/os-release
    NAME="Alpine Linux"
    ID=alpine
    VERSION_ID=3.16.2
    PRETTY_NAME="Alpine Linux v3.16"
    HOME_URL="https://alpinelinux.org/"
    BUG_REPORT_URL="https://gitlab.alpinelinux.org/alpine/aports/-/issues"
    

就是这样!如果您在此过程中的任何时候看到不同的行为,请告诉我,我会看看我们能找出什么。


1请注意,为了使这一步发挥作用并停止podman抱怨,我必须loginctl enable-linger 1000和。这只是必要的,因为我们正在使用;如果我们通过本地控制台登录,则没有必要。systemctl start [email protected]sussh

相关内容