Raspberry Pi SDカード長寿命化+システム状態表示ソフト導入+OSイメージ縮小


・SDカードには書き換え可能な寿命があります。
Raspberry PiはストレージとしてmicroSDを使いますので
なるべくSDカードへのアクセスを減らし長寿命化させます。


ついでに、
・ブラウザでグラフィカルにシステムの状態・負荷が見れる
netdataというソフトの導入


・同じ32GBのmicroSDカードでも
微妙に容量の小さいSDカードにイメージが書き込めない場合の
OSイメージの縮小方法も記載します。



・SDカード延命化

・スワップを無効化

sudo swapoff --all
sudo systemctl stop dphys-swapfile
sudo systemctl disable dphys-swapfile

確認

systemctl status dphys-swapfile

inactiveになってればOK



・fstab
ファイルアクセス日時の書き込みを制限

sudo nano /etc/fstab

nodiratimeを追記(PARTUUIDは環境によって違います。-02に追記)

PARTUUID=********-02 / ext4 defaults,noatime,nodiratime 0 1


一番下に追記

tmpfs /tmp tmpfs defaults,noatime,nodiratime,mode=1777 0 0
tmpfs /run/user/1000 tmpfs defaults,noatime,nodiratime,mode=1777 0 0
tmpfs /run/dump1090-fa tmpfs defaults,noatime,nodiratime,mode=1777 0 0
tmpfs /run/piaware tmpfs defaults,noatime,nodiratime,mode=1777 0 0
tmpfs /home/pi/.cache/lxsession/LXDE-pi tmpfs defaults,noatime,nodiratime,mode=1777 0 0

Ctrl+o、リターンで保存
Ctrl+xで終了

再起動

sudo reboot

確認

df -h

こんな感じならOK



・systemctl
不要なサービスの停止

確認

systemctl list-unit-files -t service|grep enabled

rsyslog停止

sudo systemctl stop rsyslog.service
sudo systemctl disable rsyslog.service
戻すなら
sudo systemctl enable rsyslog.service



bluetooth停止

sudo systemctl stop hciuart.service
sudo systemctl stop bluetooth.service
sudo systemctl disable hciuart.service
sudo systemctl disable bluetooth.service
戻すなら
sudo systemctl enable hciuart.service
sudo systemctl enable bluetooth.service

再起動

sudo reboot

確認
有効のサービス一覧

systemctl list-unit-files -t service

無効のサービス一覧

systemctl list-unit-files -t service|grep disabled



・folder2ram
RAMディスク化

sudo wget -O /sbin/folder2ram https://raw.githubusercontent.com/bobafetthotmail/folder2ram/master/debian_package/sbin/folder2ram
sudo chmod +x /sbin/folder2ram
sudo folder2ram -configure
sudo nano /etc/folder2ram/folder2ram.conf

一番下に追記

tmpfs /var/log
tmpfs /var/tmp
tmpfs /var/spool
tmpfs /var/cache/samba

Ctrl+o、リターンで保存
Ctrl+xで終了

マウント、自動起動化

sudo folder2ram -mountall
sudo folder2ram -enablesystemd

再起動

sudo reboot

確認

df -h

になってればOK



・journald
ジャーナルを保存させない。

sudo nano /etc/systemd/journald.conf

一番下に追記

Storage=none

Ctrl+o、リターンで保存
Ctrl+xで終了

再起動

sudo reboot

以上でSDカード長寿命化は終了です。




・システムの状態表示をするnetdataのインストール

この様な感じでブラウザから
Raspberry Piの動作状態・負荷などを確認できます。
グラフィカルに見れるので面白いです。

sudo apt-get install zlib1g-dev uuid-dev libmnl-dev gcc make git autoconf autogen automake pkg-config cmake libuv1-dev
git clone https://github.com/firehol/netdata.git --depth=1
cd netdata
sudo ./netdata-installer.sh




画像のようになっていればOK

失敗する場合は、エラーメッセージで
必要なパッケージが入っているかチェック
します。

sudo apt-get install (パッケージ名)

でインストール

インストール後、
以下にアクセスするとRaspberry Piの
CPU、メモリ、ストレージ使用率などが表示されます。
http://192.168.1.100:19999/




・イメージファイルの縮小と展開

耐久性が高いカードに換えようと
同じ32GBの別メーカーのSDカードに
既存のバックアップイメージを書き込もうとしたところエラー発生。

同じ32GBでもメーカー・商品によって
厳密な容量は違っていて
大きいイメージを小さいSDカードには書き込めない
らしい。

Raspberry Pi上で動くイメージの縮小スクリプトがあるので
手順を順に書いていきます。

1、WindowsでUSBメモリ
(32GBのイメージなら、USBメモリは64GB~)を
exFATでフォーマット

2、圧縮する元のイメージファイルと
下記のresizeimage.plをUSBメモリにコピー

resizeimage.pl

#!/usr/bin/perl

use utf8;
use 5.010;
use strict;
#use autodie;
use warnings;
#use diagnostics;

my $who = `whoami`;

if ($who !~ /root/)
{
   print "This should be run as root or with the sudo command.\n";
   exit 1;
}

if (!$ARGV[0])
{
   print "No image file given.\n";
   exit 1;
}

my $image = $ARGV[0];

if ($image !~ /^\//)
{
   print "Please enter full path to image file.\n";
   exit 1;
}

if (! -e $image)
{
   print "$image does not exist.\n";
   exit 1;
}

my @name = split (/\//, $image);
print "\n$name[(scalar @name) - 1]:\n";
print "=" x (length ($name[(scalar @name) - 1]) + 1) . "\n";

my $info = `parted -m $image unit B print | grep ext4`;

(my $num, my $start, my $old, my $dummy) = split (':', $info, 4);
chop $start;
chop $old;
printf "Old size - %d MB (%1.2f GB)\n", int ($old / 1048576), ($old / 1073741824);

my $loopback = `losetup -f --show -o $start $image`;
chop $loopback;

`e2fsck -p -f $loopback`;

if ($? != 0)
{
   print "There was an error in the file system that can't be automatically fixed... aborting.\n";
   `losetup -d $loopback`;
   exit 1;
}

$info = `resize2fs -P $loopback 2>&1`;

($dummy, my $size) = split (': ', $info, 2);
chop $size;
$size = $size + 1024;

`sudo resize2fs -p $loopback $size 2>&1`;
sleep 1;
`losetup -d $loopback`;

$size = ($size * 4096) + $start;

`parted $image rm $num`;
`parted -s $image unit B mkpart primary $start $size`;

$size = $size + 58720257;
printf "New size - %d MB (%1.2f GB)\n", int ($size / 1048576), ($size / 1073741824);

`truncate -s $size $image`;

my $diff = $old - $size;
printf "Image file was reduced by %d MB (%1.2f GB)\n", int ($diff / 1048576), ($diff / 1073741824);

exit 0;

TeraPad等を使い、UTF-8 改行LFで保存してください)


3、Raspberry PiでexFATを扱えるようにする

sudo apt-get -y install exfat-fuse exfat-utils


4、USBメモリを接続後Raspberry Pi起動
  デバイス名(パス)の確認、マウント

sudo fdisk -l

(USBメモリの容量でデバイスを確認、/dev/sda1のようになっているはず)

マウント先のディレクトリ作成

sudo mkdir -p /mnt/hdd/usbmem

マウント

sudo mount /dev/sda1 /mnt/hdd/usbmem

(USBメモリを使う場合は /mnt/hdd/usbmem にアクセスする)

確認

df -h


(必要なら)
今後もこのUSBを差したときに自動でマウントされるように設定

UUID確認、メモする

sudo blkid

****-****のような形式、自分は789E-D39Fでした)

sudo nano /etc/fstab

一番下に1行追加

UUID="789E-D39F" /mnt/hdd/usbmem exfat-fuse async,auto,dev,exec,gid=65534,rw,uid=65534,umask=000 0 0

Ctrl+o、リターンで保存
Ctrl+xで終了

再起動

sudo reboot

確認

df -h


5、スクリプトを使ってイメージ縮小

cd /mnt/hdd/usbmem
sudo perl ./resizeimage.pl /mnt/hdd/usbmem/200406.img

(200406.imgの部分はご自身のイメージ名を指定)

私の場合、何故か一度失敗しましたが
二度目で成功しました。
成功すると同名で上書きで作成されています。


6、USBメモリの取り外し

sudo umount /mnt/hdd/usbmem

7、WindowsでUSBメモリから縮小されたイメージをコピー

8、Win32DiskImagerで縮小されたイメージを新SDカードに書き込み

9、新SDカードを差してRaspberry Pi起動

10、イメージ拡張

sudo raspi-config

7.Advanced Options
EXPAND FILESYSTEM (次回起動時に拡張されます。)

これで小さいSDカードにも
そのまま環境をコピーできます。


以上、Raspberry PiのちょっとしたTipsでした。



今回参考にさせていただいたサイト
https://dz.plala.jp/wiki/index.php/RaspberryPi%E3%81%A8DVB-T%E3%81%A7ADS-B
https://raspi.ryo.sc/netdata_install/
http://denshikousaku.net/reduce-raspberry-pi-img-file-to-write-on-smaller-micro-sd-card
https://turtlechan.hatenablog.com/entry/2019/06/08/235327

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です