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

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

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

컨테이너 구성에 다음을 추가했습니다.

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

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

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

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



답변

나는 현재 여기에 제시된 것보다 더 나은 해결책을 찾았다 고 생각합니다. 내가 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-실행이 차단되지 않습니다.)


답변

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

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

@reboot lxc-autostart


답변

누구든지 권한이없는 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 주제에 대한 자세한 내용은 여기에 있습니다.


답변

이 문제를 해결하기 위해 작은 스크립트 를 작성 했으며 주석이 달린 지침을 따르십시오.


답변

죄송합니다 : 너무 빨리 대답했습니다. 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”가 호출 될 때 경로가 전달되었다고 생각합니다. 부팅하는 동안 시스템이 권한이없는 컨테이너를 찾는 방법을 보지 못했습니다.


답변

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

#!/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


답변

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

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

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