Как настроить Podman на Ubuntu Server 22 для предоставления общего хранилища образов среди пользователей без прав root?

Вопрос или проблема

Я задавал этот вопрос в обсуждении podman на Github (смотрите пост здесь), но не удачно получить ответ. Поэтому я копирую содержимое и обращаюсь за помощью на ask Ubuntu. Надеюсь, что на более общем сайте с большим количеством пользователей комментарии и ответы могут решить мою проблему или привести меня к чему-то более близкому к цели.

Я хочу настроить podman для обеспечения общего хранилища изображений между пользователями без прав суперпользователя на хосте, но не смог. Мне все равно, работает ли пользователь root.

user0 – пользователь с правами sudo, user1 и user2 – пользователи без прав суперпользователя. Все шеллы подключены по ssh с соответствующим именем пользователя напрямую (т.е. не через su).

  • вывод user1
user1@test:~$ podman images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE
user1@test:~$ podman pull busybox
Resolving "busybox" using unqualified-search registries (/etc/containers/registries.conf)
Trying to pull gitea.cn:666/busybox:latest...
Getting image source signatures
Copying blob a10d77880eaf done
Copying config 87ff76f62d done
Writing manifest to image destination
Storing signatures
87ff76f62d367950186bde563642e39208c0e2b4afc833b4b3b01b8fef60ae9e

user1@test:~$ podman images --log-level=debug
INFO[0000] podman filtering at log level debug
DEBU[0000] Called images.PersistentPreRunE(podman images --log-level=debug)
DEBU[0000] overlay storage already configured with a mount-program
DEBU[0000] Merged system config "/usr/share/containers/containers.conf"
DEBU[0000] overlay storage already configured with a mount-program
DEBU[0000] Using conmon: "/usr/bin/conmon"
DEBU[0000] Initializing boltdb state at /var/lib/sharedimages/libpod/bolt_state.db
DEBU[0000] Overriding run root "/run/user/1001" with "/run/user/1001/containers" from database
DEBU[0000] systemd-logind: Unknown object "https://askubuntu.com/".
DEBU[0000] Using graph driver overlay
DEBU[0000] Using graph root /var/lib/sharedimages
DEBU[0000] Using run root /run/user/1001/containers
DEBU[0000] Using static dir /var/lib/sharedimages/libpod
DEBU[0000] Using tmp dir /run/user/1001/libpod/tmp
DEBU[0000] Using volume path /var/lib/sharedimages/volumes
DEBU[0000] overlay storage already configured with a mount-program
DEBU[0000] Set libpod namespace to ""
DEBU[0000] [graphdriver] trying provided driver "overlay"
DEBU[0000] cached value indicated that overlay is supported
DEBU[0000] cached value indicated that metacopy is not being used
DEBU[0000] cached value indicated that native-diff is usable
DEBU[0000] backingFs=extfs, projectQuotaSupported=false, useNativeDiff=true, usingMetacopy=false
DEBU[0000] Initializing event backend journald
DEBU[0000] configured OCI runtime runc initialization failed: no valid executable found for OCI runtime runc: invalid argument
DEBU[0000] configured OCI runtime kata initialization failed: no valid executable found for OCI runtime kata: invalid argument
DEBU[0000] configured OCI runtime runsc initialization failed: no valid executable found for OCI runtime runsc: invalid argument
DEBU[0000] Using OCI runtime "/usr/bin/crun"
INFO[0000] Found CNI network podman (type=bridge) at /home/user1/.config/cni/net.d/87-podman.conflist
DEBU[0000] Default CNI network name podman is unchangeable
INFO[0000] Setting parallel job count to 37
DEBU[0000] parsed reference into "[overlay@/var/lib/sharedimages+/run/user/1001/containers]@87ff76f62d367950186bde563642e39208c0e2b4afc833b4b3b01b8fef60ae9e"
DEBU[0000] exporting opaque data as blob "sha256:87ff76f62d367950186bde563642e39208c0e2b4afc833b4b3b01b8fef60ae9e"
DEBU[0000] exporting opaque data as blob "sha256:87ff76f62d367950186bde563642e39208c0e2b4afc833b4b3b01b8fef60ae9e"
REPOSITORY                                TAG         IMAGE ID      CREATED        SIZE
gitea.cn:666/busybox  latest      87ff76f62d36  16 months ago  4.5 MB
DEBU[0000] Called images.PersistentPostRunE(podman images --log-level=debug)

user1@test:~$
  • вывод user2

user2@test:~$ podman images --log-level=debug
INFO[0000] podman filtering at log level debug
DEBU[0000] Called images.PersistentPreRunE(podman images --log-level=debug)
DEBU[0000] Merged system config "/usr/share/containers/containers.conf"
DEBU[0000] Using conmon: "/usr/bin/conmon"
DEBU[0000] Initializing boltdb state at /var/lib/sharedimages/libpod/bolt_state.db
DEBU[0000] Overriding run root "/run/user/1002" with "/run/user/1001/containers" from database
DEBU[0000] Overriding tmp dir "/run/user/1002/libpod/tmp" with "/run/user/1001/libpod/tmp" from database
DEBU[0000] systemd-logind: Unknown object "https://askubuntu.com/".
WARN[0000] XDG_RUNTIME_DIR is pointing to a path which is not writable. Most likely podman will fail.
DEBU[0000] Using graph driver overlay
DEBU[0000] Using graph root /var/lib/sharedimages
DEBU[0000] Using run root /run/user/1001/containers
DEBU[0000] Using static dir /var/lib/sharedimages/libpod
DEBU[0000] Using tmp dir /run/user/1001/libpod/tmp
DEBU[0000] Using volume path /var/lib/sharedimages/volumes
DEBU[0000] Set libpod namespace to ""
DEBU[0000] Not configuring container store
DEBU[0000] Initializing event backend journald
Error: error creating tmpdir: mkdir /run/user/1001/libpod: permission denied
user2@test:~$

Конфигурации:

  • user1
user1@test:~$ more /home/user1/.config/containers/storage.conf
[storage]
driver = "overlay"
runroot = "/run/user/1001"
graphroot = "/var/lib/sharedimages"

user1@test:~$ id
uid=1001(user1) gid=1001(user1) groups=1001(user1)
user1@test:~$
  • user2
user2@test:~$ more /home/user2/.config/containers/storage.conf
[storage]
driver = "overlay"
runroot = "/run/user/1002"
graphroot = "/var/lib/sharedimages"
[storage.options]
mount_program = "/bin/fuse-overlayfs"
user2@test:~$ id
uid=1002(user2) gid=1002(user2) groups=1002(user2)
  • user0: без конфигурации
user0@test:/home/user1$ cd /etc/containers/
user0@test:/etc/containers$ ls
libpod.conf  policy.json  registries.conf  registries.conf.d
user0@test:/etc/containers$
user0@test:/etc/containers$ id
uid=1000(user0) gid=1000(user0) groups=1000(user0),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),110(lxd)
user0@test:/etc/containers$
  • Версия podman
user1@test:~$ podman version
Version:      3.4.4
API Version:  3.4.4
Go Version:   go1.18.1
Built:        Thu Jan  1 00:00:00 1970
OS/Arch:      linux/amd64
  • Информация о podman

user1@test:~$ podman info
host:
  arch: amd64
  buildahVersion: 1.23.1
  cgroupControllers:
  - memory
  - pids
  cgroupManager: systemd
  cgroupVersion: v2
  conmon:
    package: 'conmon: /usr/bin/conmon'
    path: /usr/bin/conmon
    version: 'conmon version 2.0.25, commit: unknown'
  cpus: 12
  distribution:
    codename: jammy
    distribution: ubuntu
    version: "22.04"
  eventLogger: journald
  hostname: test
  idMappings:
    gidmap:
    - container_id: 0
      host_id: 1001
      size: 1
    - container_id: 1
      host_id: 165536
      size: 65536
    uidmap:
    - container_id: 0
      host_id: 1001
      size: 1
    - container_id: 1
      host_id: 165536
      size: 65536
  kernel: 5.15.0-122-generic
  linkmode: dynamic
  logDriver: journald
  memFree: 19415232512
  memTotal: 20680478720
  ociRuntime:
    name: crun
    package: 'crun: /usr/bin/crun'
    path: /usr/bin/crun
    version: |-
      crun version 0.17
      commit: 0e9229ae34caaebcb86f1fde18de3acaf18c6d9a
      spec: 1.0.0
      +SYSTEMD +SELINUX +APPARMOR +CAP +SECCOMP +EBPF +YAJL
  os: linux
  remoteSocket:
    exists: true
    path: /run/user/1001/podman/podman.sock
  security:
    apparmorEnabled: false
    capabilities: CAP_CHOWN,CAP_DAC_OVERRIDE,CAP_FOWNER,CAP_FSETID,CAP_KILL,CAP_NET_BIND_SERVICE,CAP_SETFCAP,CAP_SETGID,CAP_SETPCAP,CAP_SETUID,CAP_SYS_CHROOT
    rootless: true
    seccompEnabled: true
    seccompProfilePath: /usr/share/containers/seccomp.json
    selinuxEnabled: false
  serviceIsRemote: false
  slirp4netns:
    executable: /usr/bin/slirp4netns
    package: 'slirp4netns: /usr/bin/slirp4netns'
    version: |-
      slirp4netns version 1.0.1
      commit: 6a7b16babc95b6a3056b33fb45b74a6f62262dd4
      liuser0irp: 4.6.1
  swapFree: 8589930496
  swapTotal: 8589930496
  uptime: 13h 8m 55.68s (Approximately 0.54 days)
plugins:
  log:
  - k8s-file
  - none
  - journald
  network:
  - bridge
  - macvlan
  volume:
  - local
registries:
  search:
  - gitea.cn:666
store:
  configFile: /home/user1/.config/containers/storage.conf
  containerStore:
    number: 0
    paused: 0
    running: 0
    stopped: 0
  graphDriverName: overlay
  graphOptions: {}
  graphRoot: /var/lib/sharedimages
  graphStatus:
    Backing Filesystem: extfs
    Native Overlay Diff: "true"
    Supports d_type: "true"
    Using metacopy: "false"
  imageStore:
    number: 1
  runRoot: /run/user/1001/containers
  volumePath: /var/lib/sharedimages/volumes
version:
  APIVersion: 3.4.4
  Built: 0
  BuiltTime: Thu Jan  1 00:00:00 1970
  GitCommit: ""
  GoVersion: go1.18.1
  OsArch: linux/amd64
  Version: 3.4.4
  • ОС
user1@test:~$ uname -a
Linux test 5.15.0-122-generic #132-Ubuntu SMP Thu Aug 29 13:45:52 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

Похоже, что в отладочном логе говорится о том, что конфигурация user2 не вступила в силу

DEBU[0000] Initializing boltdb state at /var/lib/sharedimages/libpod/bolt_state.db
DEBU[0000] Overriding run root "/run/user/1002" with "/run/user/1001/containers" from database
DEBU[0000] Overriding tmp dir "/run/user/1002/libpod/tmp" with "/run/user/1001/libpod/tmp" from database

Так какие ожидаемые конфигурации для этой задачи?

Большое спасибо!

Правка 29 сентября.

Я удалил podman -> удалил /var/lib/sharedimages -> удалил /var/lib/containers -> удалил /home/user1/.config/containers/storage.conf -> удалил /home/user2/.config/container/stoarge.conf -> перезагрузил хост -> переустановил podman -> воссоздал /var/lib/sharedimages и /var/lib/container

  • сначала попробуйте user2
user2@test:~$ podman images --log-level=debug
INFO[0000] podman filtering at log level debug
DEBU[0000] Called images.PersistentPreRunE(podman images --log-level=debug)
DEBU[0000] overlay storage already configured with a mount-program
DEBU[0000] Merged system config "/usr/share/containers/containers.conf"
DEBU[0000] overlay storage already configured with a mount-program
DEBU[0000] Using conmon: "/usr/bin/conmon"
DEBU[0000] Initializing boltdb state at /home/user2/.local/share/containers/storage/libpod/bolt_state.db
DEBU[0000] systemd-logind: Unknown object "https://askubuntu.com/".
DEBU[0000] Using graph driver overlay
DEBU[0000] Using graph root /home/user2/.local/share/containers/storage
DEBU[0000] Using run root /run/user/1002/containers
DEBU[0000] Using static dir /home/user2/.local/share/containers/storage/libpod
DEBU[0000] Using tmp dir /run/user/1002/libpod/tmp
DEBU[0000] Using volume path /home/user2/.local/share/containers/storage/volumes
DEBU[0000] overlay storage already configured with a mount-program
DEBU[0000] Set libpod namespace to ""
DEBU[0000] [graphdriver] trying provided driver "overlay"
DEBU[0000] overlay: mount_program=/usr/bin/fuse-overlayfs
DEBU[0000] backingFs=extfs, projectQuotaSupported=false, useNativeDiff=false, usingMetacopy=false
DEBU[0000] Initializing event backend journald
DEBU[0000] configured OCI runtime runc initialization failed: no valid executable found for OCI runtime runc: invalid argument
DEBU[0000] configured OCI runtime kata initialization failed: no valid executable found for OCI runtime kata: invalid argument
DEBU[0000] configured OCI runtime runsc initialization failed: no valid executable found for OCI runtime runsc: invalid argument
DEBU[0000] Using OCI runtime "/usr/bin/crun"
INFO[0000] Found CNI network podman (type=bridge) at /home/user2/.config/cni/net.d/87-podman.conflist
DEBU[0000] Default CNI network name podman is unchangeable
INFO[0000] Setting parallel job count to 37
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE
DEBU[0000] Called images.PersistentPostRunE(podman images --log-level=debug)
user2@test:~$

Теперь user1

user1@test:~$ podman images --log-level=debug
INFO[0000] podman filtering at log level debug
DEBU[0000] Called images.PersistentPreRunE(podman images --log-level=debug)
DEBU[0000] Merged system config "/usr/share/containers/containers.conf"
DEBU[0000] Using conmon: "/usr/bin/conmon"
Error: error creating runtime static files directory: mkdir /var/lib/sharedimages/libpod: permission denied
user1@test:~$
user1@test:~$
user1@test:~$ more .config/c
cni/        containers/
user1@test:~$ more .config/containers/storage.conf
[storage]
driver = "overlay"
runroot = "/run/user/1001"
graphroot = "/var/lib/sharedimages"
[storage.options]
mount_program = "/bin/fuse-overlayfs"

Ответ или решение

Для настройки Podman на сервере Ubuntu 22 с целью обеспечения совместного хранения образов между пользователями без прав суперпользователя, необходимо выполнить несколько шагов. Следующая инструкция поможет вам правильно сконфигурировать Podman для этой задачи.

Шаги по настройке:

  1. Создание директории для общего хранения образов:
    Убедитесь, что у вас есть директория, доступная для чтения и записи всеми пользователями. В данном примере мы создадим директорию /var/lib/sharedimages и установим нужные права.

    sudo mkdir /var/lib/sharedimages
    sudo chown root:users /var/lib/sharedimages
    sudo chmod 775 /var/lib/sharedimages
  2. Настройка конфигурации для пользователей:
    Каждому пользователю необходимо создать файл конфигурации storage.conf в его домашнем каталоге.

    Конфигурация для User1 (user1):

    mkdir -p /home/user1/.config/containers
    echo "[storage]" > /home/user1/.config/containers/storage.conf
    echo "driver = \"overlay\"" >> /home/user1/.config/containers/storage.conf
    echo "runroot = \"/run/user/$(id -u user1)\"" >> /home/user1/.config/containers/storage.conf
    echo "graphroot = \"/var/lib/sharedimages\"" >> /home/user1/.config/containers/storage.conf

    Конфигурация для User2 (user2):

    mkdir -p /home/user2/.config/containers
    echo "[storage]" > /home/user2/.config/containers/storage.conf
    echo "driver = \"overlay\"" >> /home/user2/.config/containers/storage.conf
    echo "runroot = \"/run/user/$(id -u user2)\"" >> /home/user2/.config/containers/storage.conf
    echo "graphroot = \"/var/lib/sharedimages\"" >> /home/user2/.config/containers/storage.conf
  3. Установка fuse-overlayfs:
    Убедитесь, что пакет fuse-overlayfs установлен, поскольку он необходим для работы с overlay-файловыми системами в режиме без прав суперпользователя.

    sudo apt update
    sudo apt install fuse-overlayfs
  4. Перезапуск системного демона (при необходимости):
    После внесения изменений в конфигурации рекомендуется перезапустить любые активные сеансы, чтобы изменения вступили в силу. Также можно перезагрузить сервер.

  5. Проверка конфигурации:
    Попробуйте вытащить образ Docker от имени обоих пользователей и посмотрите, видите ли вы созданные образы.

    podman pull busybox

    Убедитесь, что оба пользователя могут видеть образы.

Проверка и отладка:

Если у вас возникнут проблемы, проверьте следующее:

  • Права доступа: Убедитесь, что у всех пользователей правильные права доступа к /var/lib/sharedimages.

  • Ошибки Podman: Используйте флаг --log-level=debug для получения дополнительной информации об ошибках, если они возникают, например:

    podman images --log-level=debug
  • Проверка окружения: Убедитесь, что переменная окружения XDG_RUNTIME_DIR, указывающая на runroot, существует и доступна для записи пользователям.

Заключение:

Следуя приведенным шагам, вы сможете настроить Podman для обеспечения совместного использования образов между пользователями без прав суперпользователя на Ubuntu 22. Не стесняйтесь задавать дополнительные вопросы или искать помощь, если возникнут трудности в процессе настройки.

Оцените материал
Добавить комментарий

Капча загружается...