권한이없는 lxc 컨테이너를 자동으로 시작하는 방법?


9

Ubuntu 14.04에서 수동으로 시작하고 중지 할 수있는 권한이없는 컨테이너를 만들었습니다.

그러나 나는 이것을 시스템과 함께 시작하고 멈추고 싶습니다.

컨테이너 구성에 다음을 추가했습니다. lxc.start.auto = 1 lxc.start.delay = 5

그러나 시스템 스크립트는 권한이없는 컨테이너를 선택하지 않는 것 같습니다.

linuxcontainers.org에는 이와 관련된 스레드 가 있지만 솔루션은 root사용자 로 제한 된 것 같습니다 .

루트 사용자가 아닌 사용자 (루트 사용자의 동의)에 대해이를 수행 할 수있는 확실한 방법이 있습니까?

답변:


3

나는 현재 여기에 제시된 것보다 더 나은 해결책을 찾았다 고 생각합니다. 내가 cgmanager가 죽었다고 말할 수있는 한 부분적으로 내 솔루션이 해킹 된 해결책처럼 느껴지지 않기 때문에 대부분이 문제에 대한 해결책을 찾을 때이 토론이 여전히 나타나기 때문입니다. 실제로는 매우 간단합니다 : systemd user mode 사용하십시오 .

systemd를 사용하지 않으면이 솔루션이 도움이되지 않습니다. 이 경우 init 시스템에 권한이없는 사용자가 부팅시 서비스를 실행하고이를 시작점으로 사용할 수있는 방법이 있는지 알아볼 것을 권합니다.

권한이없는 lxc 컨테이너를 자동 시작하기 위해 시스템 사용자 모드 사용

권한이없는 lxc 컨테이너가 올바르게 작동하고 lxc-autostart컨테이너 사용자가 작업 하면서 실행 되는 것으로 가정 합니다. 그렇다면 다음을 수행하십시오.

  1. ~/.config/systemd/user/lxc-autostart.servicelxc 컨테이너가있는 사용자의 홈에 파일 을 작성하십시오 .
[Unit]
Description="Lxc-autostart for lxc user"

[Service]
Type=oneshot
ExecStart=/usr/bin/lxc-autostart
ExecStop=/usr/bin/lxc-autostart -s
RemainAfterExit=1

[Install]
WantedBy=default.target
  1. 그런 다음 해당 사용자가 실행하면
systemctl --user enable lxc-autostart

(이 --user옵션은 systemctl에게 사용자 모드에서 사용하고 있음을 알려줍니다. 일반적으로 systemctl, start, stop, statuc, enable 등으로하는 모든 작업은 --user와 함께 작동합니다.)

  1. 그런 다음 $userlxc 컨테이너가있는 사용자 이름 인 다음을 실행하십시오 .
sudo loginctl enable-linger $user

$user부팅시 systemd가 시스템 사용자 인스턴스를 시작하는 데 필요합니다 . 그렇지 않으면 $user로그인 할 때 하나만 시작 됩니다.

자세한 내용은 archlinux wiki systemd / timer 페이지 및 systemd 매뉴얼 페이지를 권장합니다 .

루트로 사용자의 시스템 인스턴스에 액세스

실제로 사용자의 시스템 서비스를 루트로 시작 / 중지 / 할 수 있지만 XDG_RUNTIME_DIR환경 변수 를 설정해야 합니다. $user 인스턴스에 액세스하려는 사용자이고 $uiduid라고 가정 하면 위에서 정의한 lxc-autostart.service를 시작하는 방법입니다.

sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemctl --user start lxc-autostart

systemd-runlxc를 손상시키지 않는 방식으로 사용자로서 임의의 명령을 실행 하는 데 사용할 수도 있습니다 . 다음 명령을 사용하여 백업 전 / 후에 컨테이너를 중지 / 시작합니다. 여기서 백업 $name중인 lxc 컨테이너의 이름은 다음과 같습니다.

sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemd-run --user --wait lxc-stop -n $name
sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemd-run --user --scope lxc-start -n $name

(주없이 그 --wait컨테이너가 중지 될 때까지 systemd-실행이 차단되지 않습니다.)


7

나는 편리한 사용을 권장 줄 @reboot에 별칭을 우분투의 크론 실행 lxc-autostart.

권한이없는 컨테이너를 소유 한 사용자로서 crontab -e다음 행을 실행 하고 추가하십시오.

@reboot lxc-autostart


이거 좋은데 그러나 종료시 (cron을 통해) 명령을 실행하는 방법이없는 것 같습니다. 어떤 아이디어?
HRJ

종료시 작업을 실행하는 간단한 방법을 알지 못합니다. 루트 권한으로 컨테이너를 소유 한 각 사용자의 컨테이너를 종료 하려면 시작 작업 을 추가 해야합니다. /etc/init/lxc.conf포인터를 볼 수 있습니다. 권한있는 컨테이너를 시작하는 것은 시작 작업입니다. 권한이없는 컨테이너를 종료하기 위해 파일을 복사하고 수정하기도 어렵지 않아야합니다.
인코딩

1
컨테이너의 각 프로세스가 호스트에서 표시되므로 컨테이너를 종료하는 데 특별한 것이 필요하지 않을 수 있으므로 각 프로세스는 호스트에서 TERM 신호를 수신해야합니다. 종료시 특별한 작업을 수행 할 필요가 없습니다. 시스템 종료시 일부 스크립트 또는 다른 작업을 실행하려는 경우에는 다릅니다. 그러나 대부분의 프로세스는 정상적으로 종료 될 수 있습니다.
인코딩

crontab 접근 방식이 작동합니까? Ubuntu 14.04에서 PAM, 즉 libpam-systemd가 사용자 변경 프로세스에 관여하지 않기 때문에 발생하는 "cgmanager_move_pid_sync 호출에 실패했습니다 : 잘못된 요청"오류가 발생합니다. 당신은에서 볼 수있는 /proc/self/cgroup이 같은 시퀀스를 포함 /user/0.user/1.session하는 대신/user/1000.user/1.session
다니엘 알더

3

누구든지 권한이없는 LXC 컨테이너 자동 시작에 대한 답변을 위해이 Q & A를 우연히 발견 한 경우 (여기서 많이 다시 확인하십시오), 다음은 잘 작동하고 서버에서 작동하도록 따르는 솔루션입니다.

http://blog.lifebloodnetworks.com/?p=2118 Nicholas J Ingrassellino.

간단히 말해서, 두 개의 스크립트를 작성하는 것과 관련이 있으며, 시작시 LXC가 사용자 계정에 실제로 로그인하지 않고도 나열된 각 사용자의 권한이없는 컨테이너를 시작할 수 있도록 함께 작동합니다. 즉, 모든 CGroups 매직을 그대로 유지하면서 사용자로 명령을 실행합니다. SO 모범 사례를 유지하면서 여기에 뼈를 인용하지만 그의 원래 기사를 읽는 것이 좋습니다.

사용자 계정이 브리지를 사용하도록 허용합니다…

echo "$USER veth lxcbr0 1024" | sudo tee -a /etc/lxc/lxc-usernet

Upstart 스크립트 생성… /etc/init/lxc-unprivileged.conf추가…

description "LXC Unprivileged Containers"
author "Mike Bernson <mike@mlb.org>"

start on started lxc

script
    USERS="[user]"

    for u in $USERS; do
        cgm create all lxc$u
        cgm chown all lxc$u $(id -u $u) $(id -g $u)
        lxc-autostart -L -P /home/$u/.local/share/lxc | while read line;
        do
            set -- $line
            /usr/local/bin/startunprivlxc lxc$u $u $1
            sleep $2
        done
    done
end script

[user]를 사용자 계정으로 바꾸십시오.

컨테이너 시작 스크립트 생성… /usr/local/bin/startunprivlxc 추가…

#!/bin/sh

cgm movepid all $1 $$
sudo -iH -u $2 -- lxc-start -n $3 -d

… 실행 가능하게하십시오…

sudo chmod +x /usr/local/bin/startunprivlxc

나는 그것이 안전하고 올바르게 작동하는 것처럼 보이며 다른 사용자 계정으로 SSH하기 위해 루트가 필요하지 않다는 것을 강조하고 싶습니다.

https://gist.github.com/julianlam/4e2bd91d8dedee21ca6f 주제에 대한 자세한 내용은 여기에 있습니다.



0

죄송합니다 : 너무 빨리 대답했습니다. lxc-ls에 "AUTOSTART"가 "YES"로 표시 되어도 작동하지 않습니다.

여기에 훨씬 더 유용한 정보가있는 링크가 있으며 누군가가이 정보를 활용할 수 있습니다. http://www.geeklee.co.uk/unprivileged-privileged-containers-ubuntu-14-04-lxc/

같은 문제로 인해이 페이지에 방문했습니다. 이 스레드를 읽은 후, lxc-create가 sudo로 실행되지 않으면 일반적인 "/ var / lib / lxc /"디렉토리에 쓸 수 없다는 것을 깨달았습니다.

"~ / .local / share / lxc"에서 권한이없는 컨테이너의 rootfs를 둘러보고 질문의 두 줄을 해당 디렉토리의 구성에 넣었습니다.

내가 사용한 템플릿 인 "lxc-download"를 힌트로 보았지만 "lxc-download"가 호출 될 때 경로가 전달되었다고 생각합니다. 부팅하는 동안 시스템이 권한이없는 컨테이너를 찾는 방법을 보지 못했습니다.


0

더 나은 격리를 위해 동일한 명명 된 사용자로 각 권한없는 컨테이너를 실행하고 있으며 이것이 내가하는 방법입니다.

#!/bin/bash

LXC_CONTAINERS="container1 container2"

for LXC_CONTAINER in $LXC_CONTAINERS; do
 su - $LXC_CONTAINER -c "lxc-start -n $LXC_CONTAINER --logfile /home/$LXC_CONTAINER/.local/share/lxc/lxc-$LXC_CONTAINER.log --logpriority DEBUG"
done

-1

(사물을 망칠 수있는 모든 방법의 어머니) 가정하면 권한이없는 lxc 컨테이너를 "소유"하는 사용자로 로그인 한 다음 다음 명령으로 찾고있는 것을 처리해야합니다 ...

$ echo "lxc-start -n LXC-CONTAINER-NAME -d" >> .bashrc

이것은 bash를 통해 로그인 할 때 단순히 위의 명령을 실행합니다. 이것은 또한 bash가 로그인 쉘이라고 가정합니다. 이름 : LXC-CONTAINER-NAME을 시작하려는 LXC 컨테이너의 이름으로 바꾸십시오 .


-1

나는 다른 접근 방식을 사용했으며 작동 중입니다.

1º 컨테이너 설정 파일에 다음 항목 추가

자동 시작 구성

lxc.start.auto = 1 lxc.start.delay = 5

2º 같은 서버에서 컨테이너 사용자와 자신간에 신뢰 관계를 만듭니다.

userlxc @ GEST-4 : ~ $ ssh-keygen -t rsa 공개 / 개인 rsa 키 쌍 생성. 키를 저장할 파일을 입력하십시오 (/home/userlxc/.ssh/id_rsa) : 암호 입력 (암호가 없으면 비어 있음) : 동일한 암호를 다시 입력하십시오. 식별은 /home/userlxc/.ssh/id_rsa에 저장되었습니다. 공개 키가 /home/userlxc/.ssh/id_rsa.pub에 저장되었습니다. 키 지문은 다음과 같습니다. c9 : b4 : e1 : f3 : bf : a3 : 25 : cc : f8 : bc : be : b6 : 80 : 39 : 59 : 98 userlxc @ GEST-AMENCIA-4 키의 randomart 이미지는 다음과 같습니다. + -[RSA 2048] ---- + | | | | | o | | * + | | ES | | = * | | = o =. | | . +. +. | | oO = oo | + ----------------- +

userlxc @ GEST-4 : ~ $ cat .ssh / id_rsa.pub >> .ssh / authorized_keys userlxc @ GEST-4 : ~ $ ls -lrt .ssh / authorized_keys -rw-rw-r-- 1 userlxc userlxc 404 11 월 19 일 17:23 .ssh / authorized_keys

ssh 연결을 확인하십시오. 비밀번호없이 사용할 수 있어야합니다. userlxc @ GEST-4 : ~ $ ssh userlxc @ localhost "lxc-ls --fancy"

이름 상태 IPV4 IPV6 AUTOSTART

EXTLXCCONT01 중지--예
UBUSER1404USERCONT01 테스트 중지--아니오
UBUSER1404USERLXCCONT01 중지--아니오

3º 컨테이너 소유자에서 crontab 항목 생성

@reboot ssh userlxc @ localhost "lxc-autostart"

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.