回答:
私はここで現在提示されているものよりも良い解決策を見つけたと思います。私の知る限り、cgmanagerが停止していること、一部は私の解決策がハッキーな回避策のように感じられないことが原因ですが、ほとんどの場合、問題の解決策を探すときにこの議論が依然として表示されるためです。実際には非常に簡単です。systemdユーザーモードを使用します。
systemdを使用しない場合、このソリューションは役に立ちません。その場合、あなたのinitシステムに、権限のないユーザーが起動時にサービスを実行し、それを開始点として使用できるようにする方法があるかどうかを調べることをお勧めします。
権限のないlxcコンテナが正常に動作していlxc-autostart
て、コンテナのユーザーとして動作していると想定しています。その場合は、以下を実行します。
~/.config/systemd/user/lxc-autostart.service
lxcコンテナーを持つユーザーのホームにファイルを作成します。[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
systemctl --user enable lxc-autostart
(--user
オプションは、ユーザーモードで使用していることをsystemctlに通知します。通常、systemctl、start、stop、statuc、enableなどで行うすべてのことは、-userで動作します。)
$user
は、lxcコンテナーを持つユーザーの名前です。sudo loginctl enable-linger $user
これは、systemdが$user
ブート時にsystemdユーザーインスタンスを起動するために必要です。それ以外の場合は、$user
ログインしたときに1つだけ開始されます。
詳細については、archlinux wikiのsystemd / timerページと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
(--wait
systemd-runがないと、コンテナーが停止するまでブロックされないことに注意してください。)
Ubuntuのcron@reboot
で便利なエイリアスを使用して実行することをお勧めします。lxc-autostart
非特権コンテナーを所有するユーザーとして、crontab -e
次の行を実行して追加します。
@reboot lxc-autostart
/etc/init/lxc.conf
ポインタを見ることができます。特権付きコンテナを開始するのはupstartジョブです。それをコピーして、権限のないコンテナをシャットダウンするように変更することも難しくありません。
/proc/self/cgroup
、それはのような配列を含むことを/user/0.user/1.session
代わりに/user/1000.user/1.session
特権のない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 これは、なぜこれがそうであるのかを理解するのに役立ちます。
申し訳ありません:答えが早すぎます。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」を呼び出したときにパスが渡されたと思います。起動時にシステムが特権のないコンテナをどのように検索するかは確認していません。
私はより良い分離のために同じ名前のユーザーで各非特権コンテナーを実行していますが、これは私がそれを行う方法です:
#!/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コンテナーの名前に置き換えてください。
私は別のアプローチを使用しており、それは機能しています
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"
EXTLXCCONT01 STOPPED--YES
UBUSER1404USERCONT01-test STOPPED--NO
UBUSER1404USERLXCCONT01 STOPPED--NO
3ºコンテナー所有者でcrontabエントリーを作成する
@reboot ssh userlxc @ localhost "lxc-autostart"