Armadilloフォーラム

A6E(AG6271)にて、コンテナ内からOSの再起動をする方法

uesugi

2023年11月1日 10時13分

お世話になっております。
コンテナ内からホストOSの再起動を実行する手順を確認させてください。

https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p…
 章:6.8.9. コンテナからのpoweroff及びreboot より、

”--pid=host” をコンテナのrun時に入れて実行しようとすると、下記エラーにより、コンテナが起動しませんでした。
Couldn't find an alternative telinit implementation to spawn.

”--pid=host”有効条件・方法等はありますでしょうか?

現在の環境は以下になります。
・コンテナイメージ:docker.io/arm32v7/debian:bullseye
・--entrypoint /sbin/init app
 ⇒ /sbin/init -> /lib/systemd/systemd(busyboxなし)
・追加引数:--privileged、--net=host

コメント

at_dominique.m…

2023年11月1日 11時23分

uesugiさん

お世話になっています、
マルティネです。

> ・https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p…
>  章:6.8.9. コンテナからのpoweroff及びreboot より、
>
> ”--pid=host” をコンテナのrun時に入れて実行しようとすると、下記エラーにより、コンテナが起動しませんでした。
> Couldn't find an alternative telinit implementation to spawn.
>
> ”--pid=host”有効条件・方法等はありますでしょうか?

このエラーは systemd のエラーです。
コンテナの systemd は pid=1 で起動されてない場合は別の処理を行うため、--pid=host で失敗します。

systemd が必要な場合にこの poweroff/reboot 方法は向いてないですね、申し訳ございません。

大変お手数ですが、ABOS で使用している busybox init は他の再起動を起こす方法はありませんので、コンテナ外(か別の --pid=host コンテナ)でサービスを追加して reboot/poweroff を対応するしかないです。
例えば、add_volumes で共有する fifo を使って以下の様に対応できます:

armadillo:~# cat /var/app/volumes/reboot_server.sh
#!/bin/sh
 
rm -f /shared/fifo
mkfifo /shared/fifo
while read -r action; do
	case "$action" in
	shutdown) shutdown;;
	reboot) reboot;;
	*) echo "unhandled action $action"
	esac
done < /shared/fifo
 
armadillo:~# cat /etc/atmark/containers/reboot.conf
set_image docker.io/alpine
add_volumes /run/reboot_server:/shared
add_args --pid=host
add_volumes /var/app/volumes/reboot_server.sh:/reboot_server.sh
set_command /reboot_server.sh

で、制御するコンテナからおなじく 「add_volumes /run/reboot_server:/reboot_server:ro」 を共有して 「echo reboot > /reboot_server/fifo」で再起動できます。

いずれは abos-web 経由でこういう制御をできるようにしたいですが、それまではこういうワークアラウンドで対応していただければと思います。

よろしくお願いします。

マルティネ様
お世話になっております。

ご提示いただいた方法でコンテナ上からOSの再起動を実行することができました。
ご回答ありがとうございました。

マルティネ様
お世話になっております。

所持しているArmadillo3台の内、1台だけに起こっている事象です。
再起動用のコンテナを起動しようとすると、
下記エラーが表示されてしまい、起動できない状態です。

何か解決方法等は無いでしょうか?


podman-atmark |Starting 'reboot'
local | * local: waiting for podman-atmark (50 seconds)
podman-atmark |Error: crun: open executable: Operation not permitted: OCI permission denied
podman-atmark |error: Could not start reboot
podman-atmark | * Could not start all containers
podman-atmark | [ !! ]
podman-atmark | * ERROR: podman-atmark failed to start>

at_dominique.m…

2023年11月20日 11時57分

uesugiさん

お世話になっています、
マルティネです。

> podman-atmark            |Error: crun: open executable: Operation not permitted: OCI permission denied

分かりにくいエラーですが、おそらく実行しっているコマンドに execute permission (実行制限)がないです。

前回の例では、「ls -l /var/app/volumes/reboot_server.sh」を実行すると 「-rwxr-xr-x    1 root     root           196 Nov  1 11:18 /var/app/volumes/reboot_server.sh」として表示されるはずですが、エラーが発生している armadillo では最初の制限の部分が「-rw-r--r--」になっていると思われます。

chmod +x で実行可能にするか、set_command を「sh /reboot_server.sh」に変更しましたらコンテナを起動できるようになると思いますが、いかがでしょうか。

よろしくお願いします。

> uesugiさん
>
> お世話になっています、
> マルティネです。
>
>

> > podman-atmark            |Error: crun: open executable: Operation not permitted: OCI permission denied
> 

>
> 分かりにくいエラーですが、おそらく実行しっているコマンドに execute permission (実行制限)がないです。
>
> 前回の例では、「ls -l /var/app/volumes/reboot_server.sh」を実行すると 「-rwxr-xr-x    1 root     root           196 Nov  1 11:18 /var/app/volumes/reboot_server.sh」として表示されるはずですが、エラーが発生している armadillo では最初の制限の部分が「-rw-r--r--」になっていると思われます。
>
> chmod +x で実行可能にするか、set_command を「sh /reboot_server.sh」に変更しましたらコンテナを起動できるようになると思いますが、いかがでしょうか。
>
> よろしくお願いします。

ご回答ありがとうございます。
お手数をお掛けしまい、申し訳ありません。

ご指摘の通り、「reboot_server.sh 」の実行権限が無い状態でした。
修正したところ、問題なくコンテナを起動できました。

以上になります。