Armadilloフォーラム

Armadillo-X1におけるリードオンリー、リードライトモードの切り替えについて

sho_oikawa

2020年10月30日 18時01分

お世話になっております。
及川と申します。

eMMCブートにおいて、リードオンリー(ro)⇒リードライト(rw)へと
切り替える方法を探しております。

以前は常時roのシステムにて、書き込み時のみrwにするという切替を
mount, umountコマンドを用いて行っておりました。

現状ではeMMCブートにおいて常時rwとなっているため、試しに以前用いたro⇒rwへと
切り替える方法でrw⇒roへと切り替えるために
[mount --bind /home/atmark/sample /home/atmark/sample]
[mount -o ro,remount /home/atmark/sample]
のようなコマンドを実行してみました。
しかし、mount後のファイルがbusyとなり
リマウントに失敗する(rwのまま)という動作となりました。

起動時にリードオンリーにするためにはブートローダのソース
"mmcroot", "/dev/mmcblk2p2 rootwait rw"
においてrw⇒roと
変更することで実現できると踏んでいますが、
上記のmountコマンド実行時にrw⇒roへと変更できなかったことから、
起動時動作をroとしたとしても
mountコマンドによってリードライトモードへと切替ができないのではないかと
懸念しております。

デフォルトでリードオンリーとし、
必要な時のみリードライトへと切り替える方法についてご存じでしたら
ご教授いただけませんでしょうか。

以上、よろしくお願いいたします。

コメント

at_akihito.irie

2020年11月2日 11時49分

入江です。

デフォルトでリードオンリーとする方法に付きましては、U-bootで

=> setenv mmcroot /dev/mmcblk2p2 rootwait ro
=> saveenv

とすることで実現できます。

rw→roに切り替えられないのは対象のディレクトリ(内のファイル)を書き込み
モードで開いているプロセスが存在しているためだと思われます。

当方のArmadillo-X1の/dev/mmcblk2p2を例としますと、

[armadillo]# mount -t ext4
/dev/mmcblk2p2 on / type ext4 (rw,relatime,data=ordered) //rwでマウントされている
[armadillo]# mount -o ro,remount /
mount: /: mount point is busy.

のように、rw→roに切り替えることができません。
これは、マウント先である/(ルートディレクトリ)を書き込みモードで開いて
いるプロセスが存在しているためです。
そのプロセスを見つけるために以下のコマンドを実行します。

[armadillo]# apt install -y lsof
[armadillo]# lsof / | awk '$4 ~ /[0-9].*w/'
rsyslogd  2776       root    7w   REG 179,26     6287    152 /var/log/syslog
rsyslogd  2776       root    8w   REG 179,26    25914     24 /var/log/daemon.log
rsyslogd  2776       root    9w   REG 179,26    41442   2849 /var/log/messages

実行結果からrsyslogがルートディレクトリを書き込みモードで開いているこ
とが分かりました。
そこで以下のコマンドを実行し、rsyslogを停止させます。

[armadillo]# service rsyslog stop
[armadillo]# lsof / | awk '$4 ~ /[0-9].*w/'
//ルートディレクトリを書き込みモードで開いているプロセスがないことを確認

環境によってはrsyslog以外にもルートディレクトリを書き込みモードで開い
ているプロセスがある場合がありますので、それらも全て停止させてください。
その後、roに切り替えます。

[armadillo]# mount -o ro,remount /
EXT4-fs (mmcblk2p2): re-mounted. Opts: data=ordered
[armadillo]# mount -t ext4
/dev/mmcblk2p2 on / type ext4 (ro,relatime,data=ordered) //roでマウントされている

入江様

お世話になります。
及川です。

返答いただきありがとうございます。

お教えいただいた情報を基に
1.起動時にリードオンリーの状態とする
2.リードオンリーモード⇒ライトモード、ライトモード⇒リードオンリーモード
  への切り替えを実施する。
上記2点について試したいと思います。

及川です。

お教えいただいた情報で試してみたのですが、
[lsof]コマンドのインストールがうまくいきませんでした。
実行時に下記のようなログが出力されます。

root@armadillo:~# apt install -y lsof
Reading package lists... Done
Building dependency tree
Reading state information... Done
You might want to run 'apt --fix-broken install' to correct these.
The following packages have unmet dependencies:
dpkg : Conflicts: dpkg:none
dpkg:none : Conflicts: dpkg but 1.18.25 is to be installed
E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).

[apt-get update]コマンドで外部とのやり取りを行っていたため、
外に出ていけていないというわけではなさそうでした。
また、記載にあった[apt --fix-broken install]コマンドなども試しましたが、
特にうまくいきませんでした。

直接のインストールでうまくいかなかったため、
[x1-debian-builder]ディレクトリでの[ax1_resources]>[resources]>[packages]へと[lsof]の追加を行い、
イメージファイル作成⇒SD経由でのアップデート、という手順を行ってみましたが、
それでもコマンドが追加されませんでした。

他に[lsof]パッケージを導入する方法などありませんでしょうか。。。

at_akihito.irie

2020年11月5日 18時30分

入江です。

Armadilloフォーラムの仕様上一部ログが乱れている様に見えます。。。

申し訳ございませんが、以下のコマンドを実行し、出力されたtxtファイルを
添付いただけますでしょうか。

[armadillo]# apt install -y lsof > apt.txt
[armadillo]# dpkg -l > dpkg.txt
[armadillo]# ls
apt.txt   dpkg.txt  // この2つを添付してください

お手数おかけしますがよろしくお願いいたします。

及川です。

ログを添付いたします。
要望いただいた他にエラー出力をテキスト化したものも
追加で添付させていただきました。

お手数をおかけしますが、
ご確認いただければ幸いです。

よろしくお願いいたします。

ファイル ファイルの説明
apt.txt
apt_error.txt
dpkg.txt
dpkg_error.txt

at_akihito.irie

2020年11月9日 13時58分

入江です。

/var/lib/dpkg/status を添付して送っていただけますでしょうか。

よろしくお願いいたします。

及川です。
/var/lib/dpkg/status
を添付いたします。拡張子ではじかれるため、.txtとしています。

以上、よろしくお願いいたします。

ファイル ファイルの説明
status.txt

入江です。

/var/lib/dpkg/statusの末尾の以下の箇所を削除していただけますでしょうか。

Package: dpkg
Version: 1.18.25
Maintainer: unknown
Status: install ok installed

ちなみにviで編集する場合、コマンドモード時に shift+g でファイルの末尾
にカーソルを移動させることができます。

削除後、以下のコマンドを実行していただき、lsofがインストールできるかお
試しください。

[armadillo]# apt update
[armadillo]# apt upgrade
[armadillo]# apt install -y lsof

以上、よろしくお願いいたします。

及川です。

ご教授いただいた手順でアップデート⇒lsofのインストール⇒マウントを阻害しているサービスの特定
の手順を踏んでからマウントを実行したつもりですが、やはりbusyと表示されてしまい、
書込みモード⇒リードオンリーモードへの切り替えがうまくいきませんでした。。。

一連の流れをteralermのログにて取得しました。
実際にコマンドを打って確認をし始めたのはログの1013行目あたりから最後までとなります。
それまではアップデートなどを行った手順となります。
タブキーや矢印キーで過去のコマンドを表示しているところもあり、
ログ内のコマンドには一部整合性がとれておりませんが、
お教えいただいた手順にて実行しております。

rootのマウントを阻害しているものとして、[rsyslog][lighttpd][dhclient]が表示されました。
サービスに対して終了を行ったのは前者2つで、
[dhclient]はサービスでの止め方がよくわかりませんでしたので、
プロセスkillにて動作を停止した次第です。
その後に再度サービスの確認を行い、無くなっていることを確認した上で
マウントを試みましたが、同様にbusy扱いとなりました。

以上、よろしくお願いいたします。

ファイル ファイルの説明
teraterm.log

入江です。

手順中の、

[armadillo]# lsof / | awk '$4 ~ /[0-9].*[w]/'

を、

[armadillo]# lsof / | awk '$4 ~ /[0-9].*[wu]/'

に変更してお試しいただけますでしょうか。

お手数おかけしますがよろしくお願いいたします。

及川です。

教えていただいたコマンドで試したところ、
cronのプロセスIDファイルが表示されました。
[/var/run/crond.pid]

そのため、cronを停止(service cron stop)してマウントを行ったところ、
読み取り専用のモードにてマウントすることができました。

まだ細かい点は試していないですが、
リードオンリーで起動した後、必要なディレクトリをマウントして書き込み可能とする、
という流れはこれでできそうです。
ありがとうございます。

もう一つ質問なのですが、
[/var/run/crond.pid]ファイルなどはcronを動作させると作成されるファイルと思われますが、
リードオンリーの状態ではcronやlighttpdの起動は不可となってしまうのでしょうか。
それとも履歴やPIDファイル出力ができない、というエラーのみにとどまり、
動作自体は可能なのでしょうか。

入江です。

> もう一つ質問なのですが、
> [/var/run/crond.pid]ファイルなどはcronを動作させると作成されるファイルと思われますが、
> リードオンリーの状態ではcronやlighttpdの起動は不可となってしまうのでしょうか。
> それとも履歴やPIDファイル出力ができない、というエラーのみにとどまり、
> 動作自体は可能なのでしょうか。

各アプリケーションの実装に依りますので、起動しないものもあれば起動する
ものもあるかと思われます。

以上、よろしくお願いいたします。

及川です。

アプリケーション毎の実装に依る件、承知いたしました。
実際に入れてみて、どうしてもリードライトにする必要があるファイルのみ、
特定のディレクトリへとリンクを張るなどして管理しやすくしてみようと思います。

ご教授いただきありがとうございました。