Podman을 사용하여 이미지 저장소를 연결할 때 /etc/mtab 심볼릭 링크 권한 오류를 해결하는 방법은 무엇입니까?

Podman을 사용하여 이미지 저장소를 연결할 때 /etc/mtab 심볼릭 링크 권한 오류를 해결하는 방법은 무엇입니까?

요약:podmanUbuntu 서버에서 다른 이미지 저장소를 사용해 보았지만 권한 문제가 발생했습니다. 실행하면 공유 이미지가 나타납니다 podman images. 실행하려고 하면 Error: creating /etc/mtab symlink: permission denied. sudoer로 사용하면 sudo로컬 공유 이미지를 사용하는 대신 원격 이미지를 가져오려고 합니다. 다른 사용자도 공유 이미지를 실행할 수 없습니다.

내 접근 방식은 두 개의 블로그를 기반으로 합니다.

Podman의 다른 이미지 스토어 탐색

지금 사용해 볼 만한 자주 사용되지 않는 Podman 기능 5가지

표적:"서버 관리자"(실제로는 교육 목적으로 컨테이너를 사용하는 시스템 관리 경험이 거의 없는 컴퓨터 과학 교사)로서하나의이미지를 공유하고 여러 사용자가 공유 이미지를 실행할 수 있도록 허용합니다. 이렇게 하면 우리는 동일한 복사본을 많이 만들지 않게 됩니다(수백 명의 학생을 생각해보세요).당기다이미지 카피로 대체)동일한각 사용자에게 이미지가 제공되지만 각 사용자는 동일한 컨테이너화된 설정을 쉽게 사용할 수 있습니다.

내 시도:

나는 거기까지 대부분의 길을 걸었다고 믿는다. 그러나 궁극적으로 계정 이나 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

DockerHub에서 내 pmtest("podman 테스트") 이미지 가져오기공유됨장소

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년에 게시되었으므로 괜찮습니다)이나 최신 버전에서 수정된 버그가 발생할 수 있지만 어쨌든 시도해 보겠습니다!

공유 이미지 저장소 만들기

이것은 다음과 같을 것이다놀랍게도당신이 시도한 것과 비슷합니다 :).

  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/Opodman이 출력에는 에서 데이터를 가져오고 있음을 나타내는 추가 열이 표시됩니다 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

관련 정보