非特権lxcコンテナを自動起動するにはどうすればよいですか?


9

Ubuntu 14.04では、手動で開始および停止できる非特権コンテナーを作成しました。

しかし、私はこれをシステムとともに開始および停止したいと思います。

コンテナの構成に以下を追加しました: lxc.start.auto = 1 lxc.start.delay = 5

ただし、システムスクリプトは非特権コンテナを選択するようには見えません。

linuxcontainers.orgにこれに関連するスレッドありますが、解決策はrootユーザーに制限されているようです。

(rootユーザーの同意を得て)非rootユーザーに対してこれを行うためのクリーンな方法はありますか?

回答:


3

私はここで現在提示されているものよりも良い解決策を見つけたと思います。私の知る限り、cgmanagerが停止していること、一部は私の解決策がハッキーな回避策のように感じられないことが原因ですが、ほとんどの場合、問題の解決策を探すときにこの議論が依然として表示されるためです。実際には非常に簡単です。systemdユーザーモードを使用します

systemdを使用しない場合、このソリューションは役に立ちません。その場合、あなたのinitシステムに、権限のないユーザーが起動時にサービスを実行し、それを開始点として使用できるようにする方法があるかどうかを調べることをお勧めします。

systemdユーザーモードを使用して非特権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. 次に、以下を実行します。$userは、lxcコンテナーを持つユーザーの名前です。
sudo loginctl enable-linger $user

これは、systemdが$userブート時にsystemdユーザーインスタンスを起動するために必要です。それ以外の場合は、$userログインしたときに1つだけ開始されます。

詳細については、archlinux wikiのsystemd / timerページとsystemdのマニュアルページをお勧めします

rootとしてユーザーのsystemdインスタンスにアクセスする

ユーザーのsystemdサービスをrootとして実際に開始/停止/何でもできますが、これにはXDG_RUNTIME_DIR環境変数を設定する必要があります。$user インスタンスにアクセスしたいユーザーと$uidそれがuidであると仮定すると、上記で定義したlxc-autostart.serviceを開始する方法は次のようになります。

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

systemd-runを使用して、lxcを壊さない方法でそのユーザーとして任意のコマンドを実行することもできます。次のコマンドを使用して、バックアップの前後にコンテナーを停止/開始します。ここで、$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

--waitsystemd-runがないと、コンテナーが停止するまでブロックされないことに注意してください。)


7

Ubuntuのcron@rebootで便利なエイリアスを使用して実行することをお勧めします。lxc-autostart

非特権コンテナーを所有するユーザーとして、crontab -e次の行を実行して追加します。

@reboot lxc-autostart


これは素晴らしいですね。ただし、シャットダウン時に(cronを介して)コマンドを実行する方法はないようです。何か案は?
HRJ 2015年

シャットダウン時にジョブを実行する簡単な方法は知りません。おそらく、ルートとして、コンテナーを所有する各ユーザーのコンテナーをシャットダウンするためのupstartジョブを追加する必要があります。/etc/init/lxc.confポインタを見ることができます。特権付きコンテナを開始するのはupstartジョブです。それをコピーして、権限のないコンテナをシャットダウンするように変更することも難しくありません。
2015年

1
コンテナー内の各プロセスはホストから見えるため、コンテナーはシャットダウンするために特別なものを必要としない可能性が高く、各プロセスはホストからTERMシグナルを受信する必要があります。おそらく、シャットダウン時に特別なことをする必要はありません。シャットダウン時にスクリプトなどを実行する場合は異なりますが、ほとんどのプロセスで正常にシャットダウンする可能性があります。
2015年

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 by Nicholas J Ingrassellino

簡単に言えば、2つのスクリプトを作成する必要があり、それらは起動時に連携して、ユーザーアカウントに実際にログインしなくても、LXCがリストされた各ユーザーの非特権コンテナを起動できるようにします。言い換えれば、すべてのCGroupsマジックをそのままにして、ユーザーとしてコマンドを実行します。SOのベストプラクティスに従って、ここではその骨子を引用しますが、彼の元の記事を読む価値があります。

ユーザーアカウントがブリッジを使用できるようにします…

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

アップスタートスクリプトを作成…さらに/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で接続するためにrootを必要としないことを強調したいだけです。

この件に関する詳細(関連する問題に触れること)もここにあります:https ://gist.github.com/julianlam/4e2bd91d8dedee21ca6f これは、なぜこれがそうであるのかを理解するのに役立ちます。



0

申し訳ありません:答えが早すぎます。lxc-lsに "AUTOSTART"が "YES"と表示されていても機能しませんでした。

これは、もっと役立つ情報へのリンクです。おそらく誰かがそれを利用することができますhttp : //www.geeklee.co.uk/unprivileged-privileged-containers-ubuntu-14-04-lxc/

同じ問題が発生したため、このページにアクセスしました。このスレッドを読んだ後、sudoで実行しないとlxc-createが通常の「/ var / lib / lxc /」ディレクトリに書き込めないことに気付きました。

権限のないコンテナのrootfsを探して「〜/ .local / share / lxc」に配置し、質問の2行をそのディレクトリのconfigに入れました。

手がかりとして「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):パスフレーズを入力(パスフレーズがない場合は空):同じパスフレーズをもう一度入力:IDは/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キーのランダムアートイメージは次のとおりです:+ -[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 STOPPED--YES
UBUSER1404USERCONT01-test STOPPED--NO
UBUSER1404USERLXCCONT01 STOPPED--NO

3ºコンテナー所有者でcrontabエントリーを作成する

@reboot ssh userlxc @ localhost "lxc-autostart"

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.