Armadilloフォーラム

aptとwgetコマンド実行時にRead-only file systemというエラーが出て失敗してしまう。

ysugie

2024年7月19日 19時31分

Base OS以上でwgetやaptコマンドを実行すると以下にようなエラーが発生し、失敗してしまいます。
回避策を教えてください。
armadillo:/home/atmark# apt update
ERROR: Unable to lock database: Read-only file system
ERROR: Failed to open apk database: Read-only file system

尚、インターネットは問題なく接続できることを確認しています。

コメント

アットマークテクノの古賀(休日モード)です。

ysugieさん:
>Base OS以上でwgetやaptコマンドを実行すると以下にようなエラーが発生し、失敗してしまいます。
>回避策を教えてください。
>armadillo:/home/atmark# apt update
>ERROR: Unable to lock database: Read-only file system
>ERROR: Failed to open apk database: Read-only file system
>
>尚、インターネットは問題なく接続できることを確認しています。

上では、apt コマンドを実行した時の出力しか示されていませんが、wget を実行した場合は、どのようなエラーになるのでしょうか?
また、apt コマンドは Armadillo Base OS に存在していないのですが、ご自分でインストールされたのでしょうか?
さて、「回避策」について、以下に説明します。

Armadillo Base OS (ABOS) では、Debian や Ubuntu の apt に相当するパッケージマネージャは apk です。apk は、ABOS がベースにしている Alpine Linux のパッケージマネージャです:
 https://kleinblog.net/alpine-apk-cmd
 https://blog.stormcat.io/post/entry/alpine-entry-apk/
 https://blog.kasei-san.com/entry/2020/08/25/084430
 https://wiki.alpinelinux.org/wiki/Comparison_with_other_distros
以下のコマンドであればエラーしないはずですので、試してみてください:

armadillo:/home/atmark# apk update

さて、apt をお使いになろうとしていらっしゃるということは、何らかのパッケージをインストールしてお使いになりたいのだと思います。
ABOS では、提供していないパッケージを ABOS 上に直接インストールすることは推奨しておらず、追加パッケージやアプリケーション用のコンテナを作ってコンテナにインストールして使うことを推奨しています。
これは、セキュリティの向上とアプリケーション用のルートファイルシステムの可搬性向上のための方策です。
 https://armadillo.atmark-techno.com/guide/armadillo-base-os

apt を使ってパッケージをインストールしたい場合は、まず Debian のコンテナを作り、Debian コンテナで apt を実行してください。
Armadillo-IoT G4 用に Debian 11 (bullseye) のコンテナイメージを提供していますので、それをダウンロードして使うのが簡単です。
 https://armadillo.atmark-techno.com/resources/software/armadillo-iot-g4…
以下に、Debian 11 コンテナで bash を起動するまでの手順を示します:

(1) Debian 11 のコンテナイメージをダウンロードする

armadillo:~# cd /var/app/volumes
armadillo:/var/app/volumes# wget https://armadillo.atmark-techno.com/files/downloads/armadillo-iot-g4/container/at-debian-image-v1.0.11.tar

(2) ダウンロードしたコンテナイメージをコンテナエンジン(podman)にロードする

armadillo:/var/app/volumes# abos-ctrl podman-storage --disk
armadillo:/var/app/volumes# podman load -i at-debian-image-v1.0.11.tar
armadillo:/var/app/volumes# abos-ctrl podman-storage --tmpfs --cleanup=copy

(3) Debian 11 のコンテナを起動時に自動作成・起動する設定ファイルを作成する(設定ファイルのサンプルをコピーして永続化)

armadillo:/var/app/volumes# cd /etc/atmark/containers
armadillo:/etc/atmark/containers# cp at-debian-image.conf.example at-debian-image.conf
armadillo:/etc/atmark/containers# persist_file at-debian-image.conf

(4) Debian コンテナを作成・起動して bash を起動

armadillo:/etc/atmark/containers# podman_start at-debian-image
armadillo:/etc/atmark/containers# podman exec -it ad-debian-image /bin/bash

Debian コンテナの bash が起動したら、apt コマンドを実行してみてください。期待通りに動作するはずです。
なお、apt コマンドで Debian コンテナにインストールしたパッケージは、ABOS を再起動すると消えてしまいます。つまり、コンテナのルートファイルシステムに加えた変更は、再起動時に消えてしまいます。
コンテナのルートファイルシステムに加えた変更を保存するには、マニュアルの「コンテナの基本的な動作」の節にある、「コンテナの変更を保存する」で説明している podman commit コマンドを使います:
 https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…

以下に、apt コマンドで Debian コンテナにパッケージをインストールした後、コンテナのルートファイルシステムに加わった変更をコンテナイメージに保存する手順を示します:

(5) bash を終了して Debian コンテナを停止した後、コンテナの変更内容をコンテナイメージに保存する

root@0c2d3d2a757a:~# exit
armadillo:/etc/atmark/containers# podman stop at-debian-image
armadillo:/etc/atmark/containers# podman commit at-debian-image localhost/at-debian-image:latest

(6) コンテナイメージの保存内容を永続化する

armadillo:/etc/atmark/containers# abos-ctrl podman-storage --disk --cleanup=copy
armadillo:/etc/atmark/containers# abos-ctrl podman-storage --tmpfs --cleanup=copy

こうすれば、これ以後 ABOS を再起動しても apt でコンテナにインストールした内容が失われず、'podman exec -it ad-debian-image /bin/bash' でコンテナの bash を起動すれば、Debian コンテナにインストールしたパッケージを Debian コンテナ上で対話操作できます。

その他の使い方については、マニュアルの「コンテナ」をご覧になってみてください:
 https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…

以上、参考になりましたら幸いです。

> アットマークテクノの古賀(休日モード)です。
>
> ysugieさん:
> >Base OS以上でwgetやaptコマンドを実行すると以下にようなエラーが発生し、失敗してしまいます。
> >回避策を教えてください。
> >armadillo:/home/atmark# apt update
> >ERROR: Unable to lock database: Read-only file system
> >ERROR: Failed to open apk database: Read-only file system
> >
> >尚、インターネットは問題なく接続できることを確認しています。
>
> 上では、apt コマンドを実行した時の出力しか示されていませんが、wget を実行した場合は、どのようなエラーになるのでしょうか?
> また、apt コマンドは Armadillo Base OS に存在していないのですが、ご自分でインストールされたのでしょうか?
> さて、「回避策」について、以下に説明します。
>
> Armadillo Base OS (ABOS) では、Debian や Ubuntu の apt に相当するパッケージマネージャは apk です。apk は、ABOS がベースにしている Alpine Linux のパッケージマネージャです:
>  https://kleinblog.net/alpine-apk-cmd
>  https://blog.stormcat.io/post/entry/alpine-entry-apk/
>  https://blog.kasei-san.com/entry/2020/08/25/084430
>  https://wiki.alpinelinux.org/wiki/Comparison_with_other_distros
> 以下のコマンドであればエラーしないはずですので、試してみてください:
>

> armadillo:/home/atmark# apk update
> 

>
> さて、apt をお使いになろうとしていらっしゃるということは、何らかのパッケージをインストールしてお使いになりたいのだと思います。
> ABOS では、提供していないパッケージを ABOS 上に直接インストールすることは推奨しておらず、追加パッケージやアプリケーション用のコンテナを作ってコンテナにインストールして使うことを推奨しています。
> これは、セキュリティの向上とアプリケーション用のルートファイルシステムの可搬性向上のための方策です。
>  https://armadillo.atmark-techno.com/guide/armadillo-base-os
>
> apt を使ってパッケージをインストールしたい場合は、まず Debian のコンテナを作り、Debian コンテナで apt を実行してください。
> Armadillo-IoT G4 用に Debian 11 (bullseye) のコンテナイメージを提供していますので、それをダウンロードして使うのが簡単です。
>  https://armadillo.atmark-techno.com/resources/software/armadillo-iot-g4…
> 以下に、Debian 11 コンテナで bash を起動するまでの手順を示します:
>
> (1) Debian 11 のコンテナイメージをダウンロードする
>

> armadillo:~# cd /var/app/volumes
> armadillo:/var/app/volumes# wget https://armadillo.atmark-techno.com/files/downloads/armadillo-iot-g4/container/at-debian-image-v1.0.11.tar
> 

>
> (2) ダウンロードしたコンテナイメージをコンテナエンジン(podman)にロードする
>

> armadillo:/var/app/volumes# abos-ctrl podman-storage --disk
> armadillo:/var/app/volumes# podman load -i at-debian-image-v1.0.11.tar
> armadillo:/var/app/volumes# abos-ctrl podman-storage --tmpfs --cleanup=copy
> 

>
> (3) Debian 11 のコンテナを起動時に自動作成・起動する設定ファイルを作成する(設定ファイルのサンプルをコピーして永続化)
>

> armadillo:/var/app/volumes# cd /etc/atmark/containers
> armadillo:/etc/atmark/containers# cp at-debian-image.conf.example at-debian-image.conf
> armadillo:/etc/atmark/containers# persist_file at-debian-image.conf
> 

>
> (4) Debian コンテナを作成・起動して bash を起動
>

> armadillo:/etc/atmark/containers# podman_start at-debian-image
> armadillo:/etc/atmark/containers# podman exec -it ad-debian-image /bin/bash
> 

>
> Debian コンテナの bash が起動したら、apt コマンドを実行してみてください。期待通りに動作するはずです。
> なお、apt コマンドで Debian コンテナにインストールしたパッケージは、ABOS を再起動すると消えてしまいます。つまり、コンテナのルートファイルシステムに加えた変更は、再起動時に消えてしまいます。
> コンテナのルートファイルシステムに加えた変更を保存するには、マニュアルの「コンテナの基本的な動作」の節にある、「コンテナの変更を保存する」で説明している podman commit コマンドを使います:
>  https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…
>
> 以下に、apt コマンドで Debian コンテナにパッケージをインストールした後、コンテナのルートファイルシステムに加わった変更をコンテナイメージに保存する手順を示します:
>
> (5) bash を終了して Debian コンテナを停止した後、コンテナの変更内容をコンテナイメージに保存する
>

> root@0c2d3d2a757a:~# exit
> armadillo:/etc/atmark/containers# podman stop at-debian-image
> armadillo:/etc/atmark/containers# podman commit at-debian-image localhost/at-debian-image:latest
> 

>
> (6) コンテナイメージの保存内容を永続化する
>

> armadillo:/etc/atmark/containers# abos-ctrl podman-storage --disk --cleanup=copy
> armadillo:/etc/atmark/containers# abos-ctrl podman-storage --tmpfs --cleanup=copy
> 

>
> こうすれば、これ以後 ABOS を再起動しても apt でコンテナにインストールした内容が失われず、'podman exec -it ad-debian-image /bin/bash' でコンテナの bash を起動すれば、Debian コンテナにインストールしたパッケージを Debian コンテナ上で対話操作できます。
>
> その他の使い方については、マニュアルの「コンテナ」をご覧になってみてください:
>  https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…
>
>
> 以上、参考になりましたら幸いです。

アットマークテクノ 古賀様

お世話になっております。
ご回答ありがとうございます。

aptについては記載ミスになります。
apkとwgetで実行した結果を再度添付致しますのでご確認ください。
[apk]
armadillo:/home/atmark# apk update
ERROR: Unable to lock database: Read-only file system
ERROR: Failed to open apk database: Read-only file system

[wget]
armadillo:/home/atmark# wget -O - https://thin-edge.io/install.sh | sh -s
Connecting to thin-edge.io (104.198.14.52:443)
writing to stdout
- 100% |********************************| 32594 0:00:00 ETA
written to stdout
Thank you for trying thin-edge.io!

Fallback to installing from tarball as curl and bash were not found. curl and bash are required to install thin-edge.io using a package manager
Detected package manager: tarball
Detected init system: openrc
Adding init system/service manager package to the install list
ERROR: Unable to lock database: Read-only file system
ERROR: Failed to open apk database: Read-only file system

--------------- machine details ---------------------
date: Wed Jul 24 09:18:39 JST 2024
tedge:
Machine: Linux armadillo 5.10.52-1-at #2-Alpine SMP PREEMPT Thu Dec 2 00:04:57 UTC 2021 aarch64 GNU/Linux
Architecture:
Package Arch: aarch64
os-release details:
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.14.3
PRETTY_NAME="Alpine Linux v3.14"

--------------- error details ------------------------
Fallback to installing from tarball as curl and bash were not found. curl and bash are required to install thin-edge.io using a package manager
Detected package manager: tarball
Detected init system: openrc
Adding init system/service manager package to the install list
------------------------------------------------------
いずれもRead-only file systemとなっていることが原因で失敗しているように見受けられます。
また、基本的にはコンテナ運用を想定しておりますが一部ホスト側へのインストールが必要なものがあり
それを試しているところこのようなエラーが発生しております。

アットマークテクノの古賀です。

ysugieさん:
>ご回答ありがとうございます。
>
>aptについては記載ミスになります。

了解しました。

>apkとwgetで実行した結果を再度添付致しますのでご確認ください。
>[apk]
>armadillo:/home/atmark# apk update
>ERROR: Unable to lock database: Read-only file system
>ERROR: Failed to open apk database: Read-only file system
>
>[wget]
>armadillo:/home/atmark# wget -O - https://thin-edge.io/install.sh | sh -s
>Connecting to thin-edge.io (104.198.14.52:443)
>writing to stdout
>- 100% |********************************| 32594 0:00:00 ETA
>written to stdout
>Thank you for trying thin-edge.io!
>
>Fallback to installing from tarball as curl and bash were not found. curl and bash are required to install thin-edge.io using a package manager
>Detected package manager: tarball
>Detected init system: openrc
>Adding init system/service manager package to the install list
>ERROR: Unable to lock database: Read-only file system
>ERROR: Failed to open apk database: Read-only file system

>いずれもRead-only file systemとなっていることが原因で失敗しているように見受けられます。

そうですね。
原因が分からないのですが、以下を見ると、お使いの ABOS のバージョンが 3.14 と非常に古く、2021年12月の版のようです。

>--------------- machine details ---------------------
>date: Wed Jul 24 09:18:39 JST 2024
>tedge:
>Machine: Linux armadillo 5.10.52-1-at #2-Alpine SMP PREEMPT Thu Dec 2 00:04:57 UTC 2021 aarch64 GNU/Linux
>Architecture:
>Package Arch: aarch64
>os-release details:
>NAME="Alpine Linux"
>ID=alpine
>VERSION_ID=3.14.3
>PRETTY_NAME="Alpine Linux v3.14"

現在は 3.19 ですので、差し支えなければ、バージョンアップしてみて頂けますか。
バージョンアップの手順は、マニュアルの「 Armadillo のソフトウェアをアップデートする」の節と、その節から参照している「SWU イメージのインストール」に記載しています:
 https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…
 https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…

たとえば、6月の月例アップデートでリリースした 3.19.2-at.5 にアップデートする場合は、次のコマンドを実行してください:

[armadillo ~]# swupdate -d '-u https://armadillo.atmark-techno.com/files/downloads/armadillo-iot-g4/image/baseos-x2-3.19.2-at.5.swu'

都合によりアップデートできない場合や、アップデートに失敗する場合、またはアップデートしてもエラーが出る場合は、お知らせください。

アットマークテクノ 古賀様

お世話になっております。
ご回答ありがとうございます。

> 現在は 3.19 ですので、差し支えなければ、バージョンアップしてみて頂けますか。
> バージョンアップの手順は、マニュアルの「 Armadillo のソフトウェアをアップデートする」の節と、その節から参照している「SWU イメージのインストール」に記載しています:
>  https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…
>  https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…
>
> たとえば、6月の月例アップデートでリリースした 3.19.2-at.5 にアップデートする場合は、次のコマンドを実行してください:
>

> [armadillo ~]# swupdate -d '-u https://armadillo.atmark-techno.com/files/downloads/armadillo-iot-g4/image/baseos-x2-3.19.2-at.5.swu'
> 

>
> 都合によりアップデートできない場合や、アップデートに失敗する場合、またはアップデートしてもエラーが出る場合は、お知らせください。

3.19にファームウェアを上げることで現象は改善されました。
ありがとうございます。
ただ、まだ課題があり、wgetで以下の内容は成功するもののoverray化していないため、再起動時にセットアップしたものが消えてしまいます。
wget -O - https://thin-edge.io/install.sh | sh -s
shファイルからインストールしたものを永続化する方法はありますでしょうか?

以上、宜しくお願い致します。

アットマークテクノの古賀です。

ysugieさん;
>>現在は 3.19 ですので、差し支えなければ、バージョンアップしてみて頂けますか。

>>都合によりアップデートできない場合や、アップデートに失敗する場合、またはアップデートしてもエラーが出る場合は、お知らせください。
>
>3.19にファームウェアを上げることで現象は改善されました。
>ありがとうございます。

ご確認有り難うございます。安心しました。

>ただ、まだ課題があり、wgetで以下の内容は成功するもののoverray化していないため、再起動時にセットアップしたものが消えてしまいます。
>wget -O - https://thin-edge.io/install.sh | sh -s
>shファイルからインストールしたものを永続化する方法はありますでしょうか?

ABOS のルートファイルシステムに加えた変更は、マニュアルの「persist_file について」で説明している persist_file コマンドを使って永続化できます:
 https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p…

しかし、ABOS のルートファイルシステムのボリュームは容量が小さいですし(※意図的に、そうしています)、セキュリティの観点からは、ABOS に直接インストールするパッケージを増やさず、できるだけコンテナ内で動かすのが望ましいです。
7/24 に頂いたコメントで、以下のようにおっしゃっていましたが、「ホスト側へのインストールが必要なものがあり」というのは、具体的には、
どういう理由でしょうか?差し支えなければ教えてくださいませ:

ysugieさん(2024年7月24日 9時26分):
>また、基本的にはコンテナ運用を想定しておりますが一部ホスト側へのインストールが必要なものがあり
>それを試しているところこのようなエラーが発生しております。

https://thin-edge.io/install.sh の内容を見ると、systemd や openrc などのサービスマネージャが存在していないとエラーするようになっていますね。
「一部ホスト側へのインストールが必要なものがあり」という理由が、もし、このインストールスクリプトを Alpine コンテナや Debian コンテナで実行した時にエラーするから、ということであれば、コンテナに systemd や oepnrc をインストールして動かせばよいです。

たとえば、Debian コンテナに systemd をインストールして systemctl を使った運用を行う手順については、弊社ブログや、このフォーラムの過去の質問スレッドが参考になるかと思います:
 https://armadillo.atmark-techno.com/blog/10899/18234
 https://armadillo.atmark-techno.com/forum/armadillo/18066#comment-14941

以上、もし参考になりましたら幸いです。

アットマークテクノ 古賀様

お世話になっております。
ご回答ありがとうございます。

> ABOS のルートファイルシステムに加えた変更は、マニュアルの「persist_file について」で説明している persist_file コマンドを使って永続化できます:
>  https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p…

このやり方だとインストールによって追加されたファイルを特定する必要がありますか?
また、ファイル単位ではなくパッケージ単位で永続化することは可能でしょうか?

> 7/24 に頂いたコメントで、以下のようにおっしゃっていましたが、「ホスト側へのインストールが必要なものがあり」というのは、具体的には、
> どういう理由でしょうか?差し支えなければ教えてくださいませ:

ある案件で運用するエッジ端末が増えたときのことを想定して、将来的にクラウドから各エッジ端末の管理を行うこと検討しております。
エッジ端末の一環としてDockerのデプロイやDockerアプリ上のWebUIをリモートで起動する為に、ホスト側にthin-edge.ioをインストールする必要がございます。

> https://thin-edge.io/install.sh の内容を見ると、systemd や openrc などのサービスマネージャが存在していないとエラーするようになっていますね。
> 「一部ホスト側へのインストールが必要なものがあり」という理由が、もし、このインストールスクリプトを Alpine コンテナや Debian コンテナで実行した時にエラーするから、ということであれば、コンテナに systemd や oepnrc をインストールして動かせばよいです。

上記で回答したようにインストールスクリプトがエラーになることが原因ではありません。
systemd や oepnrcはArmadillo Base OS上にはデフォルトで存在するものになりますか?

アットマークテクノの古賀です。

ysugieさん:
>>ABOS のルートファイルシステムに加えた変更は、マニュアルの「persist_file について」で説明している persist_file コマンドを使って永続化できます:
>> https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p…
>
>このやり方だとインストールによって追加されたファイルを特定する必要がありますか?

はい、そうです。

>また、ファイル単位ではなくパッケージ単位で永続化することは可能でしょうか?

apk でインストールするパッケージについては、persist_file の -a/--apk オプションを使うことでパッケージ単位の永続化が可能ですが、それ以外のものはサポートしていません。

インストールによって追加されたファイルを特定する方法ですが、インストール前後の overlayfs の upper 層の内容を比較することで、特定できるでしょう。
つまり、インストール前後で /live/overlay_upper/ 配下の内容を 'ls -latR' で見て、インストール前後の出力の diff をとることで特定できると思います。

>>7/24 に頂いたコメントで、以下のようにおっしゃっていましたが、「ホスト側へのインストールが必要なものがあり」というのは、具体的には、
>>どういう理由でしょうか?差し支えなければ教えてくださいませ:
>
>ある案件で運用するエッジ端末が増えたときのことを想定して、将来的にクラウドから各エッジ端末の管理を行うこと検討しております。
>エッジ端末の一環としてDockerのデプロイやDockerアプリ上のWebUIをリモートで起動する為に、ホスト側にthin-edge.ioをインストールする必要がございます。

thin-edge.io は、これですね:
 https://thin-edge.io/
 https://thin-edge.github.io/thin-edge.io/

既にご存知かも知れませんが、当社で提供している Armadillo Twin サービスでも、ソフトウェアのデプロイや任意コマンドの実行に対応していますので、もし用途に合うようであれば、検討してみて頂けますと幸いです。
 https://armadillo.atmark-techno.com/guide/armadillo-twin

>>https://thin-edge.io/install.sh の内容を見ると、systemd や openrc などのサービスマネージャが存在していないとエラーするようになっていますね。
>>「一部ホスト側へのインストールが必要なものがあり」という理由が、もし、このインストールスクリプトを Alpine コンテナや Debian コンテナで実行した時にエラーするから、ということであれば、コンテナに systemd や oepnrc をインストールして動かせばよいです。
>
>上記で回答したようにインストールスクリプトがエラーになることが原因ではありません。

了解しました。

>systemd や oepnrcはArmadillo Base OS上にはデフォルトで存在するものになりますか?

openrc の方は、Base OS にデフォルトで存在しており、サービスマネージャとして使用しています。
 https://docs.alpinelinux.org/user-handbook/0.1a/Working/openrc.html