Raspberry Pi 備忘録 / Mbedもあるよ!

Raspberry Pi であれこれやった事の記録

Raspberry pi リードオンリー化のテスト

Raspberry pi Busbet OS での、microsd read only 化に挑戦します。

Andreas さんのやり方をそのまんま真似してみます。

Make your Raspberry Pi file system read-only (Raspbian Buster)

私は、Raspberry pi zero w を使用します。
はたして、うまくいくかな?

コマンドメモ

コピペで繰り返す用

$ sudo apt-get update && sudo apt-get upgrade
$ sudo apt-get remove --purge triggerhappy logrotate dphys-swapfile
$ sudo apt-get autoremove --purge

/boot/cmdline.txt の行末に追加

fastboot noswap ro

ロガーの変更

$ sudo apt-get install busybox-syslogd
$ sudo apt-get remove --purge rsyslog

今後は sudo logread を使用してね! とのこと。

/etc/fstab 改変。

roが追加されている。
tmpfsが、3行追加されている。

proc                  /proc     proc    defaults             0     0
PARTUUID=fb0d460e-01  /boot     vfat    defaults,ro          0     2
PARTUUID=fb0d460e-02  /         ext4    defaults,noatime,ro  0     1
#Also add the entries for the temporary file system at the end of the file:
tmpfs        /tmp            tmpfs   nosuid,nodev         0       0
tmpfs        /var/log        tmpfs   nosuid,nodev         0       0
tmpfs        /var/tmp        tmpfs   nosuid,nodev         0       0

いろいろ移動する

$ sudo rm -rf /var/lib/dhcp /var/lib/dhcpcd5 /var/spool /etc/resolv.conf
$ sudo ln -s /tmp /var/lib/dhcp
$ sudo ln -s /tmp /var/lib/dhcpcd5
$ sudo ln -s /tmp /var/spool
$ sudo touch /tmp/dhcpcd.resolv.conf
$ sudo ln -s /tmp/dhcpcd.resolv.conf /etc/resolv.conf

$ sudo rm /var/lib/systemd/random-seed
$ sudo ln -s /tmp/random-seed /var/lib/systemd/random-seed

/lib/systemd/system/systemd-random-seed.service 改変

ExecStartPre=/bin/echo "" >/tmp/random-seed を、Serviceセクションに追加する。
こんな感じになるはず。

3行目?に追加している。

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/bin/echo "" >/tmp/random-seed
ExecStart=/lib/systemd/systemd-random-seed load
ExecStop=/lib/systemd/systemd-random-seed save
TimeoutSec=30s

おまけ機能

optional としてあるところですが、実に便利なので、ぜひ導入しましょう。

設定すると、$ ro で、 Read Only mode となり、 $ rw で、 Read and Write mode になります。

また、ログインシェルに (ro):~$のように、現状の mode を表記してくれます。

/etc/bash.bashrc を編集する。

set_bash_prompt() {
    fs_mode=$(mount | sed -n -e "s/^\/dev\/.* on \/ .*(\(r[w|o]\).*/\1/p")
    PS1='\[\033[01;32m\]\u@\h${fs_mode:+($fs_mode)}\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
}
alias ro='sudo mount -o remount,ro / ; sudo mount -o remount,ro /boot'
alias rw='sudo mount -o remount,rw / ; sudo mount -o remount,rw /boot'
PROMPT_COMMAND=set_bash_prompt

やってみたら、何がおきた?

crontab が消えた

/etc/crontab に書き込む

時刻が狂った

etc/crontab に、@reboot root ntpdate -v ntp.nict.jp を入れた。

ファイルを保存できなくなった

これはちょっと意外でした。

/home/user/ に、ファイルを書き出そうとしたら、書き出せなかった。

「書き出せるけれども、再起動したら消える」のかと、なんとなく勘違いしておりました。

タイムラプス専用のマシンを作りたくて挑戦したのですが、ファイルを保存できなくなってしまった。

なので、撮影&転送コマンドを書き換える必要が出ました。

ビフォー
#!/bin/bash
today=`date "+%Y%m%d"`
t_stamp=`date "+%Y%m%d%H%M%S"`
ssh iot_ssh@_IP_ADDR_ "mkdir -p ./zero_w/`echo $today`"
raspistill -o ./out.png
scp ./out.png iot_ssh@_IP_ADDR_:./zero_w/`echo $today`/`echo $t_stamp`.png

ファイルを作成し、spc で転送していた。

アフター
#!/bin/bash
today=`date "+%Y%m%d"`
t_stamp=`date "+%Y%m%d%H%M%S"`
ssh iot_ssh@_IP_ADDR_ "mkdir -p ./zero_w/`echo $today`"
raspistill -o - | ssh iot_ssh@_IP_ADDR_ "cat > ./zero_w/`echo $today`/`echo $t_stamp`.png"

ファイルを作成する代わりに、標準出力に出して、SSHで標準入力から読み込むようにしました。

ポイントは、raspistill の -o で - を指定すると、標準出力に出せる点と、
scpではなく、ssh を使用している点でしょうか。

f:id:pongsuke:20200113154842j:plain フリスクネオの缶に収まった zero w
ピンヘッダー給電にしたので、縦長に収まりました。

カメラマウントがブサイクに大きいけれど、別に構わない。