Armadilloフォーラム

USBコンソールに自動起動したコンテナの出力を表示する方法について

tokita.shinichi

2023年8月28日 15時14分

お世話になります。
自動起動したコンテナの出力をUSBコンソール(UART2)に表示したいのですが、うまくいきません。
以下のフォーラムにコンテナでttyを扱うように書かれていたため、コンフィグファイルで/dev/ttymxc1を渡すようにし、
起動したプログラムの出力をデバイスにリダイレクトしましたが、表示されませんでした。
https://armadillo.atmark-techno.com/forum/armadillo/11207

armadillo:/etc/atmark/containers# cat xxxx.conf
set_image [コンテナイメージ]
add_devices /dev/ttymxc1
set_command ./root/hello > /dev/ttymxc1

表示する方法についてご教授いただければ幸いです。
以上、宜しくお願いいたします。

コメント

at_dominique.m…

2023年8月28日 16時02分

tokita.shinichiさん、

お世話になっています、
アットマークテクノのマルティネです。

> 自動起動したコンテナの出力をUSBコンソール(UART2)に表示したいのですが、うまくいきません。
> 以下のフォーラムにコンテナでttyを扱うように書かれていたため、コンフィグファイルで/dev/ttymxc1を渡すようにし、
> 起動したプログラムの出力をデバイスにリダイレクトしましたが、表示されませんでした。
> https://armadillo.atmark-techno.com/forum/armadillo/11207

(すみません、質問とそのリンクとの関係がわかりませんでした。
出力だけでしたら、コンテナのコンフィグだけで充分です。
そのリンクを使えば、このコンフィグを使わないでコンソールを完全にコンテナのものにすることもできますが、
入力は不要でしたらコンテナコンフィグでの対応をおすすめします。)

> armadillo:/etc/atmark/containers# cat xxxx.conf
> set_image [コンテナイメージ]
> add_devices /dev/ttymxc1
> set_command ./root/hello > /dev/ttymxc1

>
> 表示する方法についてご教授いただければ幸いです。

コンテナのコンフィグは shell で読んでいますので、set_command foo > /dev/ttymxc1 を実行すると set_command の出力をコンソールに出力させることになって、コマンドを実行した時に出力になってません。
以下のように sh などをはさめて redirect をコンテナ内にすれば、出力はコンソールにでるようになります。

set_command sh -c './root/hello > /dev/ttymxc1'

よろしくお願いします。

tokita.shinichi

2023年8月28日 18時03分

マルティネ様
ご回答ありがとうございます。

> コンテナのコンフィグは shell で読んでいますので、set_command foo > /dev/ttymxc1 を実行すると set_command の出力をコンソールに出力させることになって、コマンドを実行した時に出力になってません。
> 以下のように sh などをはさめて redirect をコンテナ内にすれば、出力はコンソールにでるようになります。
>
>

> set_command sh -c './root/hello > /dev/ttymxc1'
> 

ご教授頂いた方法でUSBコンソールに出力を表示できました。
ありがとうございます。

> (すみません、質問とそのリンクとの関係がわかりませんでした。

こちらですが、リンクの以下の文面を見てコンテナにログインしなくても、自動起動したコンテナからコンソールに出力できるのではと試した次第でした。
> GUI かただのコマンドを表示したいだけであれば、コンテナから tty を扱えばそちらから画面を操れますので、/etc/atmark/containersのコンフィグファイルによって自動的に起動できます。

> 出力だけでしたら、コンテナのコンフィグだけで充分です。
> そのリンクを使えば、このコンフィグを使わないでコンソールを完全にコンテナのものにすることもできますが、
> 入力は不要でしたらコンテナコンフィグでの対応をおすすめします。)

現状では試すために表示だけでよかったのですが、結局入力も必要になるため、この件について合わせて質問させてください。
そのリンクを使えばとありますが、これは/etc/inittabを編集することを指しているのでしょうか?

::respawn:/sbin/getty -L 115200 -n -l sh ttymxc1 vt101

この内容ですと、ログインせずにシェルを起動するように見えますが、コンソールを完全にコンテナで扱うために必要なのでしょうか。
度々お手数ですが、ご教授いただければ幸いです

at_dominique.m…

2023年8月29日 9時54分

tokita.shinichiさん

マルティネです。

> 現状では試すために表示だけでよかったのですが、結局入力も必要になるため、この件について合わせて質問させてください。
> そのリンクを使えばとありますが、これは/etc/inittabを編集することを指しているのでしょうか?
>

> ::respawn:/sbin/getty -L 115200 -n -l sh ttymxc1 vt101

>
> この内容ですと、ログインせずにシェルを起動するように見えますが、コンソールを完全にコンテナで扱うために必要なのでしょうか。
> 度々お手数ですが、ご教授いただければ幸いです

getty の -l オプションで指定されているコマンドを自動実行しているだけなので、この例では確かにユーザーのシェルを直接に実行していますね。
残念ながら getty -l で引数まで渡すことはできませんので、getty を使うなら wrapper script が必要になりますが…今回はとくに getty を使うメリットもないので、直接に podman を実行できます。

手順を実行したら、シリアルコンソールからコンテナ外の Armadillo にアクセスできなくなりますので、予備のアクセス(sshd, HDMI+USBキーボード、SWU のインストール等)を確認した上で試してください。

# テストコンテナの準備します。テストとしては login コマンドを実行しますので、
# login を使える為に root のパスワードと root の login の許可を設定するだけです。
# (以下のパスワードは「test」です)
# ご自分のコンテナで自分のコマンドを実行する場合は不要なので、
# 無視していただいて構いません。あるコンテナで試してください。
armadillo:~# podman kill -a
armadillo:~# printf "%s\n" "FROM docker.io/alpine" \
   "RUN echo pts/0 >> /etc/securetty" \
   'RUN echo '\''root:$6$KwVRKjqC7KQrlv8g$U/sLbWrtKjqhMfdx7eurtxABdhXTC5cliTLQ4vLBuRaLfY17yIujpopwZzO2X/w8lnPK.hBm/rUPWiFFe6Q34.'\'' | chpasswd -e' \
   | abos-ctrl podman-rw build -t testlogin -
 
 
# コンテナ名を mycont とします。以下の mycont を置き換えてください。
armadillo:~# vi /etc/atmark/containers/mycont.conf
# add_device の ttymxc1 を外し、command からも > /dev/ttymxc1 を外します
# tty と入力を扱うので、add_args -ti を追加します。
set_image testlogin
add_args -ti
set_command login
 
 
armadillo:~# vi /etc/inittab
# getty ttymxc1 の行を外して、以下で置き換えます
::respawn:/usr/bin/podman attach mycont
 
 
# busybox init は SIGHUP で reload して、今のコンフィグを試します。
# ログインしてたらここで接続が切りますので、
# 残りの persist_file コマンドを別の手段で実行してください
armadillo:~# kill -HUP 1
 
# <enter>を入力する
983310841b20 login: root
Password: 
Welcome to Alpine!
<省略>
login[3]: root login on 'pts/0'
983310841b20:~# 
 
 
# 別のシェルで設定を保存します。
# /etc/inittab は BaseOS のアップデートの際に上書きされますので、
# persist_file の -P オプションで /etc/swupdate_preserve_files に追加します。
armadillo:~# persist_file -vP /etc/inittab
Added "POST /etc/inittab" to /etc/swupdate_preserve_files
'/etc/inittab' -> '/mnt/etc/inittab'
armadillo:~# persist_file -v /etc/atmark/containers/mycont.conf
'/etc/atmark/containers/mycont.conf' -> '/mnt/etc/atmark/containers/mycont.conf'
 
 
# ここで再起動して再び確認します。

以上の手順で問題あれば聞いてください。

tokita.shinichi

2023年8月30日 10時16分

マルティネ様

ご教授頂いた方法で自動起動したコンテナからコンソールを扱うことができました。
ひとまずはコンテナでシェルを起動してコンソールでの入出力が可能になりましたので、
これでアプリケーションの開発を進められそうです。
ご教授ありがとうございました。