死蔵していたRaspberry Piを起動できるようにしBullseyeにアップデートする

## 1. はじめに

[Raspberry Pi 3 Model B](https://ja.wikipedia.org/wiki/Raspberry_Pi#%E4%B8%BB%E3%81%AA%E4%BB%95%E6%A7%98)が死蔵状態にあり、これを活用するために、まずは起動できるところまでもっていき、最新のOSを導入します。

## 2. 用意するもの

- Raspberry Pi 本体
- 2.4A以上供給可能なUSB電源
- 抵抗値の少ない電源供給用USBケーブル
- 下記いずれかの起動メディア
  - microSD(Pi2,3でUSB起動への設定変更をしていない場合と初代では必須)
  - USBメモリ
  - ハードディスクとUSB接続ケース
  - SSDとUSB接続ケース

## 3. Raspberry Pi 起動メディアの準備

長らく使われていなかったせいでmicroSDカードが装着されていない状態だったので、起動メディアの作成から始めます。

### 3.1. メディアの種類

Raspberry Piの起動メディアですが、通常はmicroSDです。しかし長期運用を行う場合、書き込み回数に対する耐性の低さから、いつのまにか動作しなくなっている場合がよくあります。このため、起動メディアはUSBメモリやUSB接続のハードディスク、理想的にはUSB接続のSSDにするのがいいと思います。

### 3.2. メディアは32GBを超えていてもOK

Raspberry Pi Imagerは、VFATフォーマットの上限である32GBを超える容量のメディアも扱えます。起動用にVFAT領域が小さく確保され、残りの領域はすべてext4で確保されます。

microSDやUSBメモリを使用する場合、容量が大きい方が、同じ量のデータ書き込みに対して寿命が向上するかもしれませんが、特定領域だけに書き込みが集中する場合は、容量の大きさが寿命に寄与することはないでしょう。[知らんけど。](https://www.weblio.jp/content/%E7%9F%A5%E3%82%89%E3%82%93%E3%81%91%E3%81%A9)

### 3.3. USB起動の注意点

- USB接続のHDDケースを使用する場合、電流不足で適切に動作しないことがあります。
- Raspberry Pi 初代はmicroSDからしか起動できません。
- Raspberry Pi 4はファームウェアが正式対応したそうです。

> USB MSD boot also requires the firmware from Raspberry Pi OS 2020-08-20 or newer.
> <https://github.com/raspberrypi/rpi-eeprom/blob/09f77ad9fa8655a28de754640e82ca67aabe6c33/firmware/release-notes.md>

- Raspberry Pi 2,3は設定の変更が必要です。私はこちらの記事を参考にさせていただきました。

<https://jyn.jp/raspberrypi-usb-only-boot/>

## 4. 起動メディアの作成

以前はNoobsというものを使っていた記憶がありますが、今は[Raspberry Pi Imager](https://www.raspberrypi.org/software/)のおかげで、ずいぶん楽になりました。メディアを選ばず、消去もできます。

デスクトップ環境は不要なので、`CHOOSE OS`から`Raspberry Pi OS (other)`を選択し、`Raspberry Pi OS Lite(32-bit)`を選択します。64bitないの？と思う方、私もそう思いました。調べるとあるようなので、それを使うことにしました。次の節へどうぞ。

`CHOOSE STORAGE`からメディアを選択し、`WRITE`すれば、程なくして起動メディアが作成されます。ダメになったmicroSDや不良セクタの多いHDDなど、メディアに問題がある場合は時間がかかります。その場合は思い切って捨て、新しいものを使いましょう。

### 4.1. Raspberry Pi OS Lite (64-bit)

Raspberry Pi Imager には表示されませんが、下記サイトに日付別に用意されていますので、最新のzipファイルをダウンロードします。
初代をはじめとした`Broadcom BCM2835`採用機種は64bit(`arm64`)に対応しません。

<https://downloads.raspberrypi.org/raspios_lite_arm64/images/>

記事作成時点では`2021-05-07-raspios-buster-arm64-lite.zip`が最新でした。

Raspberry Pi Imagerで扱うことができ、一番下の`Use custom`から起動メディアを作成できます。

## 5. 起動する前に

初期設定の一部は起動メディアを編集することでも可能です。無線LAN、SSHを有効にできるので、モニタやキーボードをつなぐことなく、LANケーブルがなくても作業ができるため、やることにします。

作成した起動メディアをパソコンから取り外し、再度取り付けると、`boot`という200MB程の領域が認識されますので、それを開き、設定を加えていきます。

### 5.1. 無線LANの事前設定

`wpa_supplicant.conf`というファイル名で、UTF-8形式のテキストファイルを作成します。

```bash
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="SSIDを入力します"
    psk="パスワードを入力します"
}
```

パスワードは後でハッシュ化しましょう。
`wpa_passphrase`コマンドが使える環境があれば、ハッシュ化済みのファイルを生成できます。

```bash
touch wpa_supplicant.conf
echo 'country=JP' | sudo tee -a wpa_supplicant.conf
echo 'ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev' | sudo tee -a wpa_supplicant.conf
sudo wpa_passphrase "SSIDを入力します" "パスワードを入力します" | sudo tee -a wpa_supplicant.conf
```

結果を確認し、内容をコピペするか、ファイルをコピーします。

```bash
$ cat wpa_supplicant.conf 
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
network={
        ssid="SSIDを入力します"
        #psk="パスワードを入力します"
        psk=d16ef9220f4c0ff9a2573b53757e19fad33e45cdf89c731253973c57f83d8706 #ハッシュ化された"パスワードを入力します"
}
```

### 5.2. SSHの事前設定

`ssh`というファイル名で、中身がないファイルを作成します。

以上で起動前の設定は終わりです。

## 6. Raspberry Pi の起動

作成した起動メディアを取り付け、電源を接続し、無事起動するのを待ちます。

私は起動メディアをSSDで作成したのですが、最初の起動で領域の大きさを拡大するらしく、メッセージが表示された後に自動的に再起動されました。しかし、その後うんともすんとも言いません。電源を確認すると、5V400mA程度流れているのですが、SSDを収めたHDDケースのアクセスランプは沈黙したままです。仕方がないので、電源を抜き差ししたところ、無事起動しました。

## 7. 低電圧対策

起動はするものの低電圧警告が出まくる場合、対策が必要です。

- [スイッチサイエンス様の分析(PDF)](http://doc.switch-science.com/support/RaspberryPi3/raspi3power.pdf)が参考になります

<http://doc.switch-science.com/support/RaspberryPi3/raspi3power.pdf>

- ACアダプタは5V2.4A以上、できれば5V3Aのものを使いましょう
- USBケーブルは抵抗値の低いもの(3A対応や急速充電対応などをうたうもの)を使いましょう
- どうしても給電が追い付かない場合はGPIOからの給電を検討しましょう

## 8. 起動してからの設定

無事起動したら、パソコンからSSHで、おなじみのユーザー名とパスワードを使いログインし、設定コマンドを実行します。IPアドレスが分からない場合は、こちらが参考になると思います。

<https://iot-plus.net/make/raspi/ssh-connect-using-mdns/>

### 8.1. raspi-config

raspi-configコマンドで初期設定を行います。

```bash
sudo raspi-config
```

私の場合は以下の項目について設定を変更しました。

`System Options` `Hostname` から、ホスト名の設定
`Localisation Options` `Locale` から、ロケールの設定(en_US.UTF-8 UTF-8、ja_JP.UTF-8 UTF-8を追加、デフォルトをC.UTF-8に)
`Localisation Options` `Timezone` から、タイムゾーンの設定(Asia,Tokyo)
`Localisation Options` `Keyboard` から、キーボードの設定(`Generic 105-key PC (intl.)` `Other` `Japanese` `Japanese` `The default for the keyboard layout` `No compose key`)
`Advanced Options` `Network Interface Names` から、インターフェース名の設定(いいえにすると長い名前ではなくeth0などの短い名前になる)

- 途中で画面遷移がおかしくなったら、再起動しましょう。
- パスワードはLocalisation Options、特にキーボードの設定変更を反映させた後に行うようにしています。キーボードの見た目通りに記号が入力されず、ログインできなくなるのが怖いので・・・。
- デフォルトのロケールはCにしておいて、必要があればユーザーごとに`export LANG=ja_JP.UTF-8`することにしています。たまにコンソール画面が必要になり、日本語部分が`■`で表示されて困るからです。

設定後、最新の環境にします。

```bash
sudo apt update
sudo apt upgrade
```

`Bullseye`にしないのであれば、ここまで。

## 9. BusterからBullseyeへ

```bash
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 10 (buster)
Release:        10
Codename:       buster
```

手順はこちらを拝見し、ほぼそのまま実行しました。

<https://qiita.com/kakinaguru_zo/items/78aa8ba3912a131fd078>

今回使っているOSはRaspberry Pi OS Liteの64bit版なので、`/etc/apt/sources.list`には`deb http://deb.debian.org/debian bullseye main contrib non-free`を追加しています。

```bash
echo 'deb http://deb.debian.org/debian bullseye main contrib non-free' | sudo tee -a /etc/apt/sources.list
```

Liteも含め、Raspberry Pi OSの32bit版を使った場合、実行するコマンドは下記のようになります。

```bash
echo 'deb http://raspbian.raspberrypi.org/raspbian/ bullseye main contrib non-free rpi' | sudo tee -a /etc/apt/sources.list
```

以降、続けて以下のコマンドを実行します。

```bash
sudo apt update
sudo apt --with-new-pkgs upgrade
sudo apt --autoremove purge libgcc-8-dev gcc-8-base
sudo apt --purge dist-upgrade
sudo sync
sudo reboot
```

確認してみます。

```bash
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
Codename:       bullseye
```

Bullseyeになりました。

今日はここまで。