|
現: 2020-12-26 (土) 16:07:35 yuji |
| + | * Raspberry PiでMicroSDカード寿命を延ばすためにRAMディスクを使う [#k42589ac] |
| | | |
| + | MicroSDカードやSDカードは,NANDフラッシュが使われていて,このNANDフラッシュには書き換え寿命が存在する。 |
| + | |
| + | Raspberry PiはOSをSDカードに書き込んで利用しているため,数ヶ月から1年程度でMicroSDカードやSDカードが寿命で使えなくなってしまう。 |
| + | |
| + | 対策で考えられるのは,~ |
| + | + swapを使わないようにする~ |
| + | + 頻繁に書き換えられる場所を,RAMディスクにする~ |
| + | + ルートファイルシステムをRAM上で運用する~ |
| + | + 別のメディア等に定期的にバックアップを取る~ |
| + | 壊れたらバックアップしたSDカードに入れ替える。~ |
| + | + Networkブートにし,ストレージとしてSD/MicroSDカードは使わない~ |
| + | + SDカードのファイルシステムをRead-Onlyな読み込み専用にする~ |
| + | |
| + | などが考えられます。 |
| + | |
| + | そこで,SD/MicroSDカードの寿命を伸ばすため,とりあえずswapを使わないようにし,ログファイルをRAM Disk化して,出来るだけSD/MicroSDカードへの書き込み回数を減らすようにしてみる。 |
| + | |
| + | 以下は,Raspbian Jessie/Stretchを使用している場合。 |
| + | |
| + | ** SWAPを使わないようにする [#b23577ee] |
| + | |
| + | freeコマンドでswapサイズを確認してみる。 |
| + | $ free |
| + | total used free shared buffers cached |
| + | Mem: 750632 523468 227164 5460 53252 361196 |
| + | -/+ buffers/cache: 109020 641612 |
| + | Swap: 102396 0 102396 |
| + | |
| + | と,スワップファイルとして100MBが確保されている。usedは0なんで,スワップは発生していないが・・・ |
| + | |
| + | まず,swapを無効化してみる。 |
| + | # dphys-swapfile swapoff |
| + | 確認してみると, |
| + | # free |
| + | total used free shared buffers cached |
| + | Mem: 750632 527064 223568 5460 53652 361688 |
| + | -/+ buffers/cache: 111724 638908 |
| + | Swap: 0 0 0 |
| + | 使用されなくなった。 |
| + | |
| + | 再度swapを有効化するには, |
| + | # dphys-swapfile swapon |
| + | でOK。 |
| + | |
| + | swapは使用しなくなったが,電源ONでswapが自動起動しないようにsystemctlで設定します。 |
| + | # systemctl stop dphys-swapfile |
| + | # systemctl disable dphys-swapfile |
| + | |
| + | Raspberry Piを再起動してswapが使用されていないか確認しておく。 |
| + | |
| + | ** RAMディスクの設定 [#obcfb496] |
| + | |
| + | メインRAMの一部をRAM Diskとして使用し,そこをテンポラリファイル保存場所に利用するようにする。~ |
| + | RAMディスクは,電源OFF-ONやブートしたりした場合消えてしまうが,テンポラリのログ等では消えてしまってもまあ問題ない。 |
| + | |
| + | /etc/fstabを編集して,/tmpと/var/tmpと/var/logを移動するようにしてみる。 |
| + | proc /proc proc defaults 0 0 |
| + | /dev/mmcblk0p1 /boot vfat defaults 0 2 |
| + | /dev/mmcblk0p2 / ext4 defaults,noatime 0 1 |
| + | # a swapfile is not a swap partition, no line here |
| + | # use dphys-swapfile swap[on|off] for that |
| + | これを, |
| + | proc /proc proc defaults 0 0 |
| + | /dev/mmcblk0p1 /boot vfat defaults 0 2 |
| + | /dev/mmcblk0p2 / ext4 defaults,noatime 0 1 |
| + | # a swapfile is not a swap partition, no line here |
| + | # use dphys-swapfile swap[on|off] for that |
| + | tmpfs /tmp tmpfs defaults,size=32m,noatime,mode=1777 0 0 |
| + | tmpfs /var/tmp tmpfs defaults,size=16m,noatime,mode=1777 0 0 |
| + | tmpfs /var/log tmpfs defaults,size=32m,noatime,mode=0755 0 0 |
| + | とtmpfsとして3個追加する。 |
| + | |
| + | 再起動して,マウント確認をする。 |
| + | # df -h |
| + | ファイルシス サイズ 使用 残り 使用% マウント位置 |
| + | /dev/root 15G 4.6G 8.9G 34% / |
| + | devtmpfs 363M 0 363M 0% /dev |
| + | tmpfs 367M 0 367M 0% /dev/shm |
| + | tmpfs 367M 5.1M 362M 2% /run |
| + | tmpfs 5.0M 4.0K 5.0M 1% /run/lock |
| + | tmpfs 367M 0 367M 0% /sys/fs/cgroup |
| + | tmpfs 32M 88K 32M 1% /var/log |
| + | tmpfs 16M 0 16M 0% /var/tmp |
| + | tmpfs 32M 0 32M 0% /tmp |
| + | /dev/mmcblk0p1 63M 21M 42M 34% /boot |
| + | tmpfs 74M 0 74M 0% /run/user/1001 |
| + | |
| + | ** 不要なログは作成しないようにする [#zacbd2e1] |
| + | |
| + | rsyslog.confを変更して,不要なログを作成しないようにする。~ |
| + | /etc/rsyslog.confファイルで,不要な行の頭をコメントアウトする。 |
| + | ############### |
| + | #### RULES #### |
| + | ############### |
| + | |
| + | # |
| + | # First some standard log files. Log by facility. |
| + | # |
| + | auth,authpriv.* /var/log/auth.log |
| + | *.*;auth,authpriv.none -/var/log/syslog |
| + | #cron.* /var/log/cron.log |
| + | #daemon.* -/var/log/daemon.log |
| + | #kern.* -/var/log/kern.log |
| + | #lpr.* -/var/log/lpr.log |
| + | #mail.* -/var/log/mail.log |
| + | #user.* -/var/log/user.log |
| + | |
| + | # |
| + | # Logging for the mail system. Split it up so that |
| + | # it is easy to write scripts to parse these files. |
| + | # |
| + | #mail.info -/var/log/mail.info |
| + | #mail.warn -/var/log/mail.warn |
| + | #mail.err /var/log/mail.err |
| + | |
| + | # |
| + | # Logging for INN news system. |
| + | # |
| + | #news.crit /var/log/news/news.crit |
| + | #news.err /var/log/news/news.err |
| + | #news.notice -/var/log/news/news.notice |
| + | |
| + | # |
| + | # Some "catch-all" log files. |
| + | # |
| + | #*.=debug;\ |
| + | # auth,authpriv.none;\ |
| + | # news.none;mail.none -/var/log/debug |
| + | *.=info;*.=notice;*.=warn;\ |
| + | auth,authpriv.none;\ |
| + | cron,daemon.none;\ |
| + | mail,news.none -/var/log/messages |
| + | |
| + | # |
| + | # Emergencies are sent to everybody logged in. |
| + | # |
| + | *.emerg :omusrmsg:* |
| + | |
| + | テンポラリ用のディレクトリが無いと困るプログラム用に,起動時にディレクトリを作っておく。 |
| + | /etc/rc.localで,これを行う。 |
| + | #!/bin/sh -e |
| + | # |
| + | # rc.local |
| + | # |
| + | # This script is executed at the end of each multiuser runlevel. |
| + | # Make sure that the script will "exit 0" on success or any other |
| + | # value on error. |
| + | # |
| + | # In order to enable or disable this script just change the execution |
| + | # bits. |
| + | # |
| + | # By default this script does nothing. |
| + | |
| + | # Print the IP address |
| + | _IP=$(hostname -I) || true |
| + | if [ "$_IP" ]; then |
| + | printf "My IP address is %s\n" "$_IP" |
| + | fi |
| + | |
| + | mkdir -p /var/log/ConsoleKit |
| + | mkdir -p /var/log/samba |
| + | mkdir -p /var/log/fsck |
| + | mkdir -p /var/log/apt |
| + | mkdir -p /var/log/ntpstats |
| + | chown root.adm /var/log/samba |
| + | |
| + | touch /var/log/lastlog |
| + | touch /var/log/wtmp |
| + | touch /var/log/btmp |
| + | chown root.utmp /var/log/lastlog |
| + | chown root.utmp /var/log/wtmp |
| + | chown root.utmp /var/log/btmp |
| + | |
| + | exit 0 |