次のようなLinuxディストリビューションが必要です。
通常のLinuxディストリビューションを読み取り専用モードに変更する方法に関するいくつかのドキュメントを探すことができました。組み込み環境で実行するように設計されたディストリビューションがすでに構築されていることを期待していました。
PiをUSB /イーサネットで動作させるのに十分なだけのパッケージやドライバーは必要ありません。 GUIインターフェースなどは必要ありません。これは、Cで構築されたカスタムサービスを実行するだけです。
誰かが合うディストリビューションを知っていますか?
ほとんどの組み込みシステムは、カスタムビルドのカーネルを使用します。それを容易にする1つのツールは Buildroot 、GNU gccツールチェーン、(巨大な)GNU libc、Linuxカーネル、BusyBox、および組み込みボードのルートファイルシステム用の他のユーティリティ/パッケージ。RaspberryPiは比較的新しいボードであるため、Buildrootでのサポートはまだ開発中ですが、明らかに- project 、 another project and individual's work 。RPの製造が増加し、流通が改善されるにつれて、おそらくもっと多くなるでしょう。
Buildrootを使用すると、質問で説明したとおりにLinuxカーネルとルートファイルシステムを構築できます。インターネット接続速度と開発用PCの機能によっては、1〜4時間以上でバイナリが作成される場合があります。欠点は、結果のバイナリがテストされず、正常に起動および実行されることが保証されないことです。ブートシーケンスのデバッグには、システムコンソールが必須です。 モニターなしでイーサネット/ Wi-Fi経由でミニPC(RaspberryPi/MK802/Mele A1000/VIA APC)にアクセスするにはどうすればよいですか? RaspberryPiはunbrickableになるように設計されています。この欠点は、カスタムカーネルとRFSの構築を妨げるものではありません。
「電力損失に耐える」について:ファイルシステムを適切に選択することで、通常、この懸念を軽減できます。 MTDデバイスレイヤーとジャーナリングファイルシステム(jffs2など)は、経験から非常に堅牢であることが示されています。ほぼ絶対的な保護のために、R/Wファイルシステムへのスイッチオーバーなしでramfs
(固定サイズのRAMディスクではない)を使用するinitramfsがあります。
Buildrootの機能に関する30スライドの紹介は ここ
最後(#27)に、組み込みシステムを構築するためのいくつかの類似した代替ツールについての言及があります。
TinyCoreLinuxはデフォルトで読み取り専用です(永続性はオプションです): http://www.tinycorelinux.net/ports.html
私が正しく覚えていれば、読み取り専用ファイルシステムはSDカードを「保護」しません。私は、電力が期待/期待するほど安定していない顧客で10台のPiを実行しています(現在の稼働時間は80日を超えています)。しばらくの間、Piを数日以上稼働させ続けることができる電源(定格3Aの安価な充電器と「高価な」iPad充電器)を見つけるのに時間がかかりました。その前に、あらゆる種類のSD破損の問題が発生しました。 、読み取り専用IIRCのみが使用されたものを含む。
私の問題は(新しい供給のために)現在ほとんど解決されていますが、将来のプロジェクトのために、NFSルートファイルシステムを実行することを検討しています。これについてはすでに多くのチュートリアルがあり、ほとんどが通常のPi fsイメージを中心に解決されていますが、最小限のデブートストラップを実行して、NFS経由で読み取り専用のルートファイルシステムに変更するのはかなり簡単です。これをPi用のubootおよびスマートubootスクリプトと組み合わせると、SDカードに数メガ分のRPiファームウェア、ubootイメージ、およびubootスクリプトが含まれます。
コンソールにアクセスできるSeagateDockstarを持っていたので、Debiansqueezeをインストールしました。読み取り専用ルートで実行するための開始点として、Jeff Doozanによるこの優れた記事 1 を使用しました。基本的な戦略には、起動するたびに、必要な書き込み可能なディレクトリをtmpfsとしてマウントするスクリプトを作成することが含まれます。私はジェフによるスクリプトを引用します 2 ここに(ジェフへのkudos!)
#!/bin/bash
DIRS="/tmp /var/log /var/run /var/lock /var/tmp /var/lib/urandom /var/lib/dhcp /etc/network/run"
for DIR in $DIRS; do
echo "Mounting $DIR as tmpfs"
mount -n -t tmpfs tmpfs $DIR
if [ -d "$DIR-saved" ]; then
echo "Restoring $DIR-saved to $DIR"
tar -C "$DIR-saved" -cf - ./ | tar -C "$DIR" -xpf -
fi
done
echo "nameserver 4.2.2.1" > /var/tmp/resolv.conf
touch /var/lib/dhcp/dhcpd.leases
exec /sbin/init
上記の行を/ sbin/init-roというスクリプトとしてターゲットrootfsに保存し、実行可能にします。
chmod 755 /sbin/init-ro
起動時にこのスクリプトを使用するには、システムrootfsを少し準備する必要があります(すべてJeffのスクリプトから引用 2 ($ROOT
をマウントされたrootfsの実際の場所に適合させます) 。
# Configure dhcp-client to write resolv.conf to /tmp instead of /etc
sed -i 's/\/etc\/resolv.conf/\/var\/tmp\/resolv.conf/' $ROOT/sbin/dhclient-script > /dev/null 2>&1
rm $ROOT/etc/resolv.conf
ln -s /var/tmp/resolv.conf $ROOT/etc/resolv.conf
# make /etc/network/run/ a symlink to /tmp/network/
rm -rf $ROOT/etc/network/run
ln -s /var/tmp/network $ROOT/etc/network/run
# Fixes from http://wiki.debian.org/ReadonlyRoot
rm $ROOT/etc/blkid.tab > /dev/null 2>&1
ln -s /dev/null $ROOT/etc/blkid.tab
rm $ROOT/etc/mtab > /dev/null 2>&1
ln -s /proc/mounts $ROOT/etc/mtab
rm $ROOT/etc/rcS.d/S12udev-mtab
rm -rf $ROOT/var/log/*
上記のようにrootfsを準備した後、rootfsを読み取り専用で/ etc/fstabにマウントできます(ext2を使用しているファイルシステムに置き換えるか、代わりにrootfsを使用してください)。
/dev/root / ext2 noatime,ro 0 1
最後に、スクリプトを実行する前に、カーネルパラメータに以下を追加する必要があります(つまり、Raspiの/ boot/cmdline.txt)実際/ sbin/init。 (以下は、rootおよびrootdelayパラメーターの単なる例です。 cmdline.txtの行に追加する必要がある重要な部分はinit=/sbin/init-ro
です。)
root=/dev/mmcblk0p2 rootdelay=2 init=/sbin/init-ro
ただし、rootfsへの書き込みアクセスが必要なソフトウェアの場合は、適切なtmpfsの場所をマウントするか、外部ストレージに書き込む必要があることに注意してください。
私の2セントは、読み取り専用OSを使用するよりも、Piの信頼性の高いバッテリーバックアップを作成する方がはるかに簡単です(そして最終的にはより良いです)。もちろん、それはあなたが電子の非常に基本的な知識を必要とすることを意味します(そして私はBASICを意味します;私たちは3-4のコンポーネントを話している)。この男はもう少しだけで派手なものを作りました: https://raspberrypi.stackexchange.com/questions/1360/how-do-i-build-a-ups-like-battery-backup-system
これを行う場合は、LiPoを使用しないでください。 NiCadはあなたが望むものです。 LiPoは充電を一定に保つことはできません。あなたは警告されました。
また、あなたは私の経験では非常に小さな問題である何かについて非常に心配しているようです。私はいつもLinuxボックスをぶち壊しているのですが、突然の予定外のシャットダウンは当然のことです。ログを無効にすると、それを行うことについて苦情を受け取ることはめったにありません。
すべてのログを無効にするには、/ etc /rsyslog.confの最初のルールとして次の行を追加します。
*.* ~
問題が発生した場合でも、99.9999%の確率で(つまり、個人的な経験ではほぼ毎回)、ディスクが次にスキャンされるときにその問題が処理されます。それがいつ起こるかは、主に天気に依存します(奇妙なことに、OSはあなたが何をしたかに気づきました)。 PiはSDカードを使用しているので、これは私のPCよりもPiで発生することがさらに少ないと思います。
Puppy Linux について良いことを聞いたことがあります。私はそれを試したことがないことを認めなければなりませんが。
SDカードに書き戻さないように設定できます。