Raspberry Pi Zero WにAlpine Linuxでファイルサーバー構築
スイッチサイエンスで500円引きのクーポンが配布されていたので、「Raspberry Pi zero w」を買いました! 前から気にはなっていてほしかったんですよね。 かといって、使うかと聞かれると微妙で悩んでいたんですよね。
「Alpine Linux」でファイルサーバーを構築したので、その時の備忘として残しておきます。(この記事を参考にして発生した、事象に対して一切責任は負えないので、自己責任でお願いします。)
ハード構成
もともと、「LIVA-C0-2G-64G-W」にWindowsを入れて、SSDを接続してファイルサーバーにしていましたが、消費電力も気になるし、最近なぜか自動スリープにもならなくて悩んでいたので、それの代替として「Raspberry Pi」を購入。なので構成的には以下になります。
Raspberry Pi zero w
SSD 120GB
Micro SDカード 32GB
せっかくの「W」版なので、通信はwifiで接続します。(もちろんUSBで有線LAN接続も可能ですが、それによってUSB接続するSSDの速度が低下するのは嫌だったので)
OSインストール
まずはOSをインストールします。普通であれば「Raspberry Imager」とか使って公式OSを入れるところですが、それよりも軽量そうな「Alpine Linux」を入れます。
「Alpine Linux」はdockerを使用したことのある人であれば、名前は聞いたことはあるかもしれません。dockerのコンテナサイズを小さくするために、軽量化されたLinuxになります。
そういった理由もあり、少し面倒な部分もありますが、常時に電源がONであることを考えると少しでも軽量なOSの方が良いのかなぁと。経緯はこの程度でインストールしていきたいと思います。
OSイメージの準備
イメージファイル準備
公式サイトから最新のイメージをダウンロードしてください。 ダウンロード
上記から「armhf」をダウンロードしてください。それ以外だと起動しないと思います。(自分はうっかり別のものをダウンロードしていて、起動しないという事に悪戦苦闘してしまっていました。。。)
作業フォルダ準備
任意の作業フォルダを作成し、そこに移動してください。 例:C:/work
SDカードに展開するためのフォルダ準備
作業フォルダに「zw」フォルダを作成してください。
1cd C:/work
2mkdir zw
イメージファイルの展開
そこにダウンロードした「tar.gz」を展開してください。
Linuxを使用している方や、WSL2を使用している方は以下のコマンドで展開可能です。(以降に記載するコマンドも同様です)
1tar xzf alpine-rpi-3.13.0-armhf.tar.gz -C zw
Windowsの方は「7-zip」などで展開して、配置してください。「zw」フォルダ直下は以下のようなフォルダ構造になります。
1├─apks
2│ └─armhf
3├─boot
4└─overlays
Alpine Linuxのバグ対応
原因は良く分かりませんが、バグがあるらしいので、以下のコマンドを実行して「usercfg.txt」ファイルを作成してください。
1echo enable_uart=1 >> zw/usercfg.txt
LinuxやWSL2が利用できない方は「zw」フォルダ直下に「usercfg.txt」を作成し、ファイルに以下を記述してください。
1enable_uart=1
Wifiドライバの準備
イメージファイルにはwifiドライバが無いらしいので、公式に記載されている通り、GitHubから必要なファイルを取得します。
1mkdir -p zw/firmware/brcm
2cd zw/firmware/brcm
3curl -LO https://raw.githubusercontent.com/RPi-Distro/firmware-nonfree/master/brcm/brcmfmac43430-sdio.bin
4curl -LO https://raw.githubusercontent.com/RPi-Distro/firmware-nonfree/master/brcm/brcmfmac43430-sdio.txt
5cd ../../
LinuxやWSL2が利用できない方は「zw/firmware/brcm」フォルダを作成して、上記のURLからダウンロードして配置してください。
ヘッドレス準備
今回はヘッドレスでインストールをしていきます。ヘッドレスとは「Raspberry Pi」にディスプレイを接続せずにインストールする方法です。
下記の方法で実行するとWifiへの接続とSSH接続設定まで自動的に行ってくれます。その為、ディスプレイに接続せずに、別端末でSSH接続でインストール作業が可能です。
ヘッドレスインストールするためのファイル「headless.apkovl.tar.gz」を以下のサイトからダウンロードして、作業フォルダにダウンロードしてください。 https://wiki.alpinelinux.org/wiki/Raspberry_Pi_-_Headless_Installation
以下のコマンドを実行して、ダウンロードしたファイルを「zw」フォルダ直下にコピーしてください。また、2行目の「ssid」と「password」は接続したいWifiの情報に書き換えてください。
1cp headless.apkovl.tar.gz zw
2echo "ssid WPA2-PSK password" >> zw/wifi.txt
LinuxやWSL2が利用できない方は、手動で「headless.apkovl.tar.gz」をコピーして、「wifi.txt」を作成しWifi接続情報を記載してください。
SDカード準備
「Raspberry Pi」で使用するSDカードをFAT32でフォーマットしてください。以下のツールを使うと良いらしいです。
SD Card Formatter https://www.sdcard.org/jp/downloads/formatter/
SDカードのフォーマットが完了したら、「zw」フォルダの中身をSDカードにコピーしてください。(「zw」フォルダごとコピーするのではありません)
電源接続
SDカードを「Raspberry Pi」に接続し、電源に接続してください。緑色のLEDが点滅していると思いますが、しばらく経つと点灯したままとなります。
DHCPサーバー(ルーターなど)を確認し、新しいIPアドレスの払い出しがあった場合、それが「Raspberry Pi」のアドレスになりますので、控えておいてください。
インストール作業
IPアドレスが判明しているので、SSH接続(TeraTermなど)で「Raspberry Pi」に接続してください。 「root」ユーザのパスワードなしで接続可能です。
通常であれば「setup-alpine」を実行しますが、ある程度のコマンドがすでに実行された後のため、以下のコマンド順次実行してください。(各種設定値は自分の環境に合わせて指定してください)
1setup-ntp
2setup-keymap
3setup-hostname
4setup-timezone
5setup-apkrepos
6setup-lbu
7setup-apkcache
ルートユーザのパスワードを設定します。
1passwd
あと、公式サイトでおすすめされているので、以下のコマンドも実行します。
1apk add rng-tools
2rc-update add rngd boot
3rc-update add wpa_supplicant boot
4rc-update add urandom boot
ヘッドレスインストール時のごみファイルを削除します。
1mount -o remount,rw /media/mmcblk0p1
2rm /media/mmcblk0p1/*.apkovl.tar.gz
3rm /media/mmcblk0p1/wifi.txt
4rc-update del local default
5rm /etc/local.d/headless.start
SSH環境設定
ここで再起動してしまうと、次回起動時にSSH接続出来なくなるので、SSH設定ファイルを編集します。
1apk add vim
2vi /mnt/etc/ssh/sshd_config
以下を追記します。vi使わずにechoで追記しても良いかもしれません。
1PermitRootLogin yes
ここまで出来たら、以下のコマンドで再起動します。
1lbu commit -d
2reboot
「Alpine Linux」は、UbuntuとかでよくあったLiveCDと同じような感じで起動しているようなので、再起動すると変更した内容が消えます。「lbu commit -d」を実行すると、現在の状態が保持(永続化)されます。
SSDの自動マウント
SSDを「Raspberry Pi」に接続してください。自分はバスパワーのみで接続可能でしたが、場合によっては電源供給ありのハブを使用するなどしてください。
接続後、「mount」コマンドなどでマウントすることは可能ですが、再起動した場合など、そのたびにマウントする必要があります。これを解決します。
autofsのインストール
他に方法(fstabとか)があるのかもしれませんが、情報が無かったので「autofs」を使用します。ネットで調べればわかりますが、testingのリポジトリに存在します。その為、デフォルトのままだと「apk add」で追加できません。
1vi /etc/apk/repositories
「repositories」の一番最後にあると思いますが、最後が「testing」で終わるURLの行のコメントアウトを削除して有効にしてください。
1apk add autofs
でインストール可能になっているはずです。
autofsの設定
正しい設定方法は分かりませんが、「/etc/autofs/auto.master」に自動マウントの設定を記載していきます。
1vi /etc/autofs/auto.master
以下を「/misc /etc/autofs/auto.misc」の下に追記します。
1/mnt /etc/autofs/auto.filesv --ghost
設定値の意味は「/mnt」をベースディレクトリにして、「/etc/autofs/auto.filesv」の設定値の通りにマウントします。
「/etc/autofs/auto.filesv」は以下のコマンドで作成します。(UUIDなどの変更が必要)
1echo "filesv -fstype=exfat,rw UUID=××○○" > /etc/autofs/auto.filesv
この設定値は、「/mnt/filesv」にUUIDが「××○○」で、ファイルシステムが「exfat」のデバイスをマウントします。
デバイスのファイルシステムやUUIDは色々な方法で確認可能ですが、自分は「blkid」で確認しました。
1apk add blkid
2blkid
SAMBAインストール&設定
ファイル共有をするので、sambaをインストールします。sambaの設定値を永続化するためには以下の2行目、3行目の実行が必要になります。 4行目では、ファイル共有で使用するrootユーザを追加しています。
1apk add samba
2lbu include /var/lib/samba/private/
3lbu exclude /var/lib/samba/private/msg.sock/
4pdbedit -a -u root
マウントしたフォルダをrootユーザで共有します。「/etc/samba/smb.conf」の最後に以下を追記してください。
1[root]
2comment = root
3path = /mnt/filesv/
4browseable = yes
5writeable = yes
6create mask = 0777
7directory mask = 0777
8guest ok = no
9guest only = no
10valid users = pi,root
11force user = root
以下のコマンドを実行して、設定を永続化してください。
1lbu commit -d
LEDを消す
別に必須ではありませんが、常に電源が入っているので、LEDが光っている必要性があまりないので、消灯しておきます。 以下のコマンドを実行してください。
1echo 0 /sys/class/leds/led0/brightness