Raspberry Pi OSインストール時の初期設定はまだまだ簡単にできる

このブログ、RaspberryPiのネタを書くときに少なくとも2回ぐらいは再インストールしていることが多いです。そんな中、少し前にネットでZennをみていたらソラコムのMAXさんの以下のような記事を見つけました。

zenn.dev

自分もRaspberryPiをよくインストールしては削除するといったことをやっていますが、設定に関しては結構短縮できるように努力はしていましたが、そこまでの省力化はできておらず、手作業がかなり残っていました。そんな中、先程の情報からraspi-configコマンドに-nonintオプションを使用することでメニュー操作をすることなく設定できることを知りました。

通常は以下のようなことを毎回やっていました。

  1. SDカードメモリへRaspberryPi OSのイメージを書き込み
  2. SDカードの/bootへ``ssh```という名前の空ファイルをコピー
  3. SDカードの/bootへ無線LANの設定ファイルwpa_supplicant.confをコピー
  4. SDカードを挿してRaspberryPiを起動
  5. raspi-configでの設定(ここで再起動される)
  6. apt関連のパッケージの設定

ここで一番面倒だったのは、ユーザ操作が必要なraspi-configでの設定でした。この部分がかなり省力化できるのであれば、aptでのパッケージ設定に関してもスクリプト化してしようかなと思ったわけです。

設定をスクリプト化してみた

上記の手順の5と6の処理部分をスクリプトにしています。以下のファイルを作成して、SDカードの/bootの領域にコピーすればOKです。

RaspberryPiSetup.sh

#!/bin/bash
sudo raspi-config nonint do_change_locale ja_JP.UTF-8
sudo raspi-config nonint do_change_timezone Asia/Tokyo
sudo raspi-config nonint do_wifi_country JP
sudo raspi-config nonint do_vnc 0
sudo apt update && \
sudo apt install -y xrdp vim && \
sudo apt -y upgrade && \
sudo systemctl reboot

スクリプトの実行方法

SDカードからRaspberryPiを起動後に、以下のように実行すれば自動的に設定を行い再起動を行ってくれます。

設定スクリプトの起動方法

$ sudo bash /boot/RaspberryPiSetup.sh

実行時の注意点

このスクリプトを実行するとlocale設定の部分でperlのWARNINGが発生しています。

f:id:ueponx:20210314191903p:plain

ただ、再起動すると特に問題はなくなりますので、そのままにしていても問題はないようです。(スクリプトの処理が正常終了すると再起動がかかります)

raspi-configから設定できる項目

raspi-configの設定できるものとしては以下のようなものがあります。大まかにget系とdo系の2種類があります。get系は現在の情報を取得し、do系は設定の変更を行います。設定項目の有効化は0、無効化は1になるのが注意点です。

参考

github.com

設定値一覧

# 1|0 -> 1=false/off 0=true/on
raspi-config nonint get_can_expand
raspi-config nonint do_expand_rootfs
raspi-config nonint get_hostname
raspi-config nonint do_hostname "yourhostname"
raspi-config nonint get_boot_cli
raspi-config nonint get_autologin
raspi-config nonint do_boot_behaviour B1
raspi-config nonint do_boot_behaviour B2
raspi-config nonint do_boot_behaviour B3
raspi-config nonint do_boot_behaviour B4
raspi-config nonint get_boot_wait
raspi-config nonint do_boot_wait 1|0
raspi-config nonint get_boot_splash
raspi-config nonint do_boot_splash 1|0
raspi-config nonint get_overscan
raspi-config nonint do_overscan 1|0
raspi-config nonint get_pixdub
raspi-config nonint do_pixdub 1|0
raspi-config nonint get_camera
raspi-config nonint do_camera 1|0
raspi-config nonint get_ssh
raspi-config nonint do_ssh 1|0
raspi-config nonint get_vnc
raspi-config nonint do_vnc 1|0
raspi-config nonint get_spi
raspi-config nonint do_spi 1|0
raspi-config nonint get_i2c
raspi-config nonint do_i2c 1|0
raspi-config nonint get_serial
raspi-config nonint get_serial_hw
raspi-config nonint do_serial 1|0
raspi-config nonint get_onewire
raspi-config nonint do_onewire 1|0
raspi-config nonint get_rgpio
raspi-config nonint do_rgpio 1|0
raspi-config nonint get_blanking
raspi-config nonint do_blanking 1|0
raspi-config nonint get_pi_type
raspi-config nonint is_pi
raspi-config nonint is_pifour
raspi-config nonint is_fkms
raspi-config nonint get_config_var arm_freq /boot/config.txt
raspi-config nonint do_overclock None|Modest|Medium|High|Turbo
raspi-config nonint get_config_var gpu_mem /boot/config.txt
raspi-config nonint get_config_var gpu_mem_256 /boot/config.txt
raspi-config nonint get_config_var gpu_mem_512 /boot/config.txt
raspi-config nonint get_config_var gpu_mem_1024 /boot/config.txt
raspi-config nonint do_memory_split 16|32|64|128|256
raspi-config nonint get_config_var hdmi_group /boot/config.txt
raspi-config nonint get_config_var hdmi_mode /boot/config.txt
raspi-config nonint get_wifi_country
# find wifi countries here /usr/share/zoneinfo/iso3166.tab
raspi-config nonint do_wifi_country "yourcountry"
raspi-config nonint do_pi4video V1
raspi-config nonint do_pi4video V2
raspi-config nonint do_pi4video V3
raspi-config nonint get_pi4video
raspi-config nonint get_overlay_now
raspi-config nonint get_overlay_conf
raspi-config nonint get_bootro_conf
raspi-config nonint enable_overlayfs
raspi-config nonint disable_overlayfs
raspi-config nonint enable_bootro
raspi-config nonint disable_bootro
raspi-config nonint is_uname_current
raspi-config nonint list_wlan_interfaces
raspi-config nonint is_installed realvnc-vnc-server
raspi-config nonint is_installed xscreensaver
vcgencmd get_mem gpu | cut -d = -f 2 | cut -d M -f 1
echo \"$SUDO_USER:%s\" | chpasswd

おわりに

これでRaspberryPiにおける手作業をかなり減らすことに成功しました。今後はこれを改良しながら設定を行っていきたいと思います。 情報を公開してくれたMAX さんありがとうございます。

以下のGitHubに先程のこのスクリプトファイルをおいておきました。

github.com