このスクリプトがユーザーとして実行されると正常に動作しますが、rc.localで実行すると失敗するのはなぜですか?

このスクリプトがユーザーとして実行されると正常に動作しますが、rc.localで実行すると失敗するのはなぜですか?

Debian で lxc 権限のないコンテナを使用する際に問題があります。私は次のアプローチに従います。

a) /var/lxcunpriv に権限のないユーザーホームを作成します。

useradd -m -d /var/lxcunpriv lxcunpriv

b) 必要なパッケージをインストールします。

apt -y install lxc libvirt0 libpam-cgroup libpam-cgfs bridge-utils cgroupfs-mount

c) lxc-net vim /etc/default/lxc-net ファイルを変更します。

USE_LXC_BRIDGE="true"

d) lxc-net を再起動します。

systemctl restart lxc-net

e) OK、すべて緑色(正しく機能)

lxc-checkconfig

f) 私はこれを適用する

sh -c 'echo "kernel.unprivileged_userns_clone=1" > /etc/sysctl.d/80-lxc-userns.conf'
sysctl -w -p --system

g)私はroot以外のユーザーとしてこれをしました。

cat /etc/s*id|grep $USER

h)100000-165536を返すので...

usermod --add-subuids 100000-165536 lxcunpriv
usermod --add-subgids 100000-165536 lxcunpriv

i) /var/lxcunpriv にいくつかの権限を与えた。

cd /var/lxcunpriv
setfacl -m u:100000:x . .local .local/share

l) ユーザネットワークを設定します。 bridge1は私のブリッジ名です。

echo "lxcunpriv veth bridge1 10"| tee -i /etc/lxc/lxc-usernet

m) ディレクトリを作成する

su - lxcunpriv
mkdir -p .config/lxc

n)それから...

echo \
'lxc.include = /etc/lxc/default.conf
# Subuids and subgids mapping
lxc.id_map = u 0 100000 65536
lxc.id_map = g 0 100000 65536
# "Secure" mounting
lxc.mount.auto = proc:mixed sys:ro cgroup:mixed
lxc.apparmor.profile = unconfined
 
# Network configuration
lxc.network.type = veth
lxc.network.link = bridge1
lxc.network.flags = up
lxc.network.hwaddr = 00:FF:xx:xx:xx:xx'>.config/lxc/default.conf

o) /etc/lxc/default.conf を編集します。

lxc.network.type = veth
lxc.network.link = bridge1

p) .config/lxc/default.conf アップデート

lxc-update-config -c .config/lxc/default.conf

q) 最初のコンテナを作成します。

lxc-create --name mylinux -t download
lxc-start --name mylinux
lxc-attach --name mylinux

今問題は、コンテナを起動すると...

lxc-start --name mylinux
lxc-start: mylinux: lxccontainer.c: wait_on_daemonized_start: 833 No such file or directory - Failed to receive the container state
lxc-start: mylinux: tools/lxc_start.c: main: 330 The container failed to start
lxc-start: mylinux: tools/lxc_start.c: main: 333 To get more details, run the container in foreground mode
lxc-start: mylinux: tools/lxc_start.c: main: 336 Additional information can be obtained by setting the --logfile and --logpriority options

フォーラムで検索してみると、解決策が表示されます。

#!/bin/sh
printf '\n\033[42mCreating cgroup hierarchy\033[m\n\n' &&
for d in /sys/fs/cgroup/*; do
        f=$(basename $d)
        echo "looking at $f"
        if [ "$f" = "cpuset" ]; then
                echo 1 | sudo tee -a $d/cgroup.clone_children;
        elif [ "$f" = "memory" ]; then
                echo 1 | sudo tee -a $d/memory.use_hierarchy;
        fi
        sudo mkdir -p $d/$USER
        sudo chown -R $USER $d/$USER
        # add current process to cgroup
       echo $PPID > $d/$USER/tasks
done

sh workaround.sh

オンラインでは、「許可拒否」というメッセージが表示されますが、機能します echo $PPID > $d/$USER/tasks

lxc-start -n mylinux
echo $?
0

これで問題が発生します。コンテナが起動時に起動したいので(許可なし)、lxc-autostartは機能しません。 /etc/rc.local ファイルを生成しましたが失敗しました。このようにしてみました。

#!/bin/bash
# Action at boot

start() {
su - lxcunpriv -c "lxc-start -n mylinux"
su - lxcunpriv -c "lxc-start -n myothercontainer"
....
}

この場合、エラーで失敗します。

  lxc-start: mylinux: lxccontainer.c: wait_on_daemonized_start: 833 No such file or directory - Failed to receive the container state
    lxc-start: mylinux: tools/lxc_start.c: main: 330 The container failed to start
    lxc-start: mylinux: tools/lxc_start.c: main: 333 To get more details, run the container in foreground mode
    lxc-start: mylinux: tools/lxc_start.c: main: 336 Additional information can be obtained by setting the --logfile and --logpriority options

また、rc.localの「解決方法」スクリプトも実行します。

su - lxcunpriv <<EOF
sh workaround.sh
lxc-start -n myothercontainer
EOF

この場合、回避策は機能しますが、同じエラーが原因でlxc-startコマンドが失敗します。

 lxc-start --name mylinux
    lxc-start: mylinux: lxccontainer.c: wait_on_daemonized_start: 833 No such file or directory - Failed to receive the container state...

もちろん、私がそうするなら

su - lxcunpriv
sh workaround.sh
lxc-start -n mylinux

動作するのになぜrc-localではないのですか?

ベストアンサー1

rc.localを編集したソリューションが見つかりました。

その行の代わりに

su - lxcunpriv <<EOF
sh workaround.sh
lxc-start -n myothercontainer
EOF

正しい行は何ですか?

start() {
su - lxcunpriv <<EOF
/var/lxcunpriv/workaround.sh
lxc-start --name mycontainer
lxc-start --name myothercontainer
...
EOF    
}

コンテナが起動します。問題はスクリプトの前にある単語「sh」です。この単語は別のサブシェルを起動し、解決スクリプトの効果を無効にします。

おすすめ記事