raspi 用にArchLinuxインストールスクリプトを作ってみた

1.はじめに

何台も運用しがちなラズパイだからこそ、同じ作業を繰り返すことになる。だったらインストールスクリプトがあったら便利ではないかと!

もち、いちいちインストールすることは勉強になりますから、決して無駄にはなりませんが。

fdiskによる領域確保のところが、sgdsikのように自動化できればよいのだろうけど、うまく行かないのでここだけ対話型の処理を行っている。sgdiskコマンドはGPTパーティションにしか対応していないようだから。したがって、以下のスクリプトは領域を確保した後の実行になる

MicroSDカードの種類にもよるが、最短で10分くらいでできるようだ。

2022/07/06 追記

  • raspberry pi os並に、一発で無線LANを使用できるよう、スクリプトに修正を加えた。
  • 従来dhcpcdを利用していましたが、default で起動するsystemd-networkdを利用して、無線LANの設定をする仕様に変更しました。

2022/08/20 追記

  • SDカードの認識形式には、 mmcblk0 型(ノートPC型)と sdx 型(デスクトップ型)があり、いちいち複数ヶ所を修正する面倒をなくした。
  • 無線LANを、DHCPでも設定できるようにした。

2022/09/24 追記

  • コードの一部に誤りがありましたので、修正しました。誤っていたのは/etc/fstabを強制的に書き換える部分で、1〜2行目をコメントしました。

留意点

  • 修正エリアは、各人の使用環境に応じて、必ず修正すること。
  • 以下の例は、 SDcardを/dev/mmcblk0 認識されている場合の例であり、すでに/download/app/linuxにダウンロードしていることを前提にしています。なお、/dev/sdb 型で認識する場合は、途中のマウントフォーマットの部分も修正すること
  • 各人の責任で使用すること。

2.スクリプトの内容

#!/bin/bash
#-------modify area-----------------------------------------------
disk_case=1  # ターゲットドライブの形式 1:mmcblk0 2:sdx
drive=/dev/mmcblk0 #ターゲットドライブの名称
# ターゲットドライブ /dev/sdb型の場合は /dev/sdb となる。またフォーマット、マウントを修正する必要がある。
dir=/home/usr/download/app/linux # full path ダウンロード先 /で終了しないこと。
aarch=ArchLinuxARM-rpi-aarch64-latest.tar.gz # file name
#aarch=ArchLinuxARM-rpi-armv7-latest.tar.gz # ファイル名(32ビットの場合)
SSID_A=Buffalo-A-xxxx
SSID_G=Buffalo-G-xxxx
passphrase=xxxxxxxxxxxxx
static=1 # static adress:1 dhcp:2
iface=wlan0 # interface
ip_a=xxx.xxx.xxx.xxx # static ip_address
gway=xxx.xxx.xxx.xxx  # gateway
dns=$gway 8.8.8.8 # dns server
# その他----
# 途中 bsdtar コマンドを使用するが、ubuntuでは標準でインストールされていないので 
# sudo apt install libarchive-toolsでインストールしておくこと。
#-------------------------------------------------------------

set -e
lsblk
read -p "インストール先${drive}は正しいですか?インストールを開始しますか?(Y/n): " yn
case "$yn" in [yY]*) ;; *) echo "abort." ; exit ;; esac

#-- format & mount file system
#fdisk $drive # https://archlinuxarm.org/platforms/armv8/broadcom/raspberry-pi-4 参照
if [ $disk_case -eq 1 ]; then 
	mkfs.vfat ${drive}p1
	mkfs.ext4 ${drive}p2
#-- disk mount
	mount ${drive}p2 /mnt
	mkdir /mnt/boot
	mount ${drive}p1 /mnt/boot
else
	mkfs.vfat  ${drive}1
	mkfs.ext4  ${drive}2
#-- disk mount
	mount ${drive}2 /mnt
	mkdir /mnt/boot
	mount ${drive}1 /mnt/boot
fi

#-- install
lsblk
read -p "確認:領域確保・マウントポイントは正しいですか?インストールを続行しますか?(Y/n): " yn
case "$yn" in [yY]*) ;; *) echo "abort." ; exit ;; esac

bsdtar xpf $dir/$aarch -C  /mnt

#--modify fstab
rm /mnt/etc/fstab
cat << EOS >> /mnt/etc/fstab
# Static information about the filesystems.
# See fstab(5) for details.

# <file system> <dir> <type> <options> <dump> <pass>
/dev/mmcblk1p1	/boot	vfat	defaults	0	0
/dev/mmcblk1p2	/	ext4	defaults	0	0
EOS

# wlan0 & systemd-netwarkd setting
if [ $static -eq 2 ]; then
cat << EOS >> /mnt/etc/systemd/network/20-wireless.network
[Match]
Name=$iface

[Network]
DHCP=yes
IgnoreCarrierLoss=3s
EOS
else
# wlan0 $ systemd-wirelessnetworkd setting
cat << EOS >> /mnt/etc/systemd/network/20-wireless.network
[Match]
Name=$iface

[Network]
Address=$ip_a/24
Gateway=$gway
DNS=$dns
EOS
fi

# wlan0 $ systemd-wirelessnetworkd setting
wpa_passphrase $SSID_A $passphrase > /mnt/etc/wpa_supplicant/wpa_supplicant-$iface.conf
wpa_passphrase $SSID_G $passphrase >> /mnt/etc/wpa_supplicant/wpa_supplicant-$iface.conf
cd /mnt/etc/systemd/system/multi-user.target.wants
ln -s /usr/lib/systemd/system/wpa_supplicant@.service wpa_supplicant@$iface.service

cd $HOME


#-- umount filesystem
umount -r /mnt/boot/ /mnt

ファイルを保存したら実行権限を与え、それを実行するだけです。

$ sudo chmod +x aarch-install.sh
# ファイル名をaarch-install.shとした場合

$ sudo aarch-install.sh

終了後は、raspiにSDカードをさして、起動するだけ。最初から無線LANを通じて、SSH接続できます。

余談・・・驚くことに ArchLinuzならば2GBのカードにも作成できる

正確には1.9GBのようだが。

$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
mmcblk1 179:0 0 1.9G 0 disk
|-mmcblk1p1 179:1 0 200M 0 part /boot
`-mmcblk1p2 179:2 0 1.7G 0 part /

以下は最新版に更新後のカード使用状況だ。流石にこれ以上小さなカードでは無理のようだ。何しろ/は85%使用しているので

$ uname -a
Linux alarm 5.16.2-2-aarch64-ARCH #1 SMP Fri Jan 21 19:56:06 MST 2022 aarch64 GNU/Linux

$ df -h
Filesystem Size Used Avail Use% Mounted on
dev 1.9G 0 1.9G 0% /dev
run 1.9G 668K 1.9G 1% /run
/dev/mmcblk1p2 1.7G 1.3G 245M 85% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 0 1.9G 0% /tmp
/dev/mmcblk1p1 200M 115M 86M 58% /boot
tmpfs 378M 0 378M 0% /run/user/0
tmpfs 378M 0 378M 0% /run/user/1000

これだけ小さいMicroSDカードに作成しておけば、今流通しているほとんどのカードに dd コマンドで複写できるので、昔のカードの利用、今後のカードの利用に非常に役立つのではなかろうか。

参考

以下の記事を参考にさせていただきました。

https://qiita.com/yoshiki9636/items/21d37ac6f6593c880efa

コメント

タイトルとURLをコピーしました