Raspberry Pi OS (64-bit) Bullseye で openmediavault 6 を動かす 

# 背景
Raspberry Pi 4 に構築された Raspberry Pi OS(Buster) 環境上で OpenMediaVault 5 を運用するも、ストレージの btrfs が再起不能になり再構築が必要になる。再構築するなら以前から画策していた OpenMediaVault 6 への移行も一緒にやってしまおうと思うに至り、作業に着手。作業手順があまりにもたくさんになったので、将来の自分の為に備忘録を作成することにした。

# OS のインストール
OpenMediaVault 6 は、これまで使っていた Buster では動かないようで bullseye にしないと動かないらしい。面倒だけれどOS をインストールするところから始めることにした。

## 準備物 
OS はバージョン跨ぎになるので、コンソール上からお手軽アップグレード出来ないらしい。この際なのでバックアップの意味合いも込めて、一旦新しい環境を構築することにした。そのための準備物は以下の通り。

* Raspberry Pi に接続するキーボード
ネットワーク周りが動くまでは、これと後述する Quick Camera を使って直接 Raspberry Pi に入出力作業をする。もちろん使わずに設定する方法もあるとは思うけれど、設定の手間と失敗時のトライ＆エラーコストを考慮して、原始的な方法を採用。
* HDMI 出力を USB 信号に変換するアダプター
手元の Mac をモニタ代わりとするために利用
予め Raspberry Pi と Mac の間をこれを使って接続。Raspberry Pi の HDMI 端子に見合ったケーブルは [ここ](https://www.iodata.jp/product/pc/raspberrypi/ud-rpmhdmi/) とかから購入が可能。ここをいい加減にしてしまうと、自分のように数本惜しいケーブルを購入して、ストックかごのこやしを無駄に増やしてしまうことになる。 
* Quick Camera
上のUSB機器から取り込んだ信号を Mac 上で表示するために [Quick Camera](https://apps.apple.com/jp/app/quick-camera/id598853070)を予めインストール。
* SSD
こんな事もあろうかと以前準備した USB 接続 SSD 500GB を引っ張り出す。HDD だと Raspberry Pi からの給電では電力量が足りなくなるおそれがあるので SSD を今回は採用。 SSD が安価になって、こんなところでも気軽に使えるようになった時代には感謝するばかり。
* Raspberry Pi Imager
dd コマンドと戦うのは面倒すぎるので Raspberry Pi Imager を使うことにする。自分の環境は Mac だったので、 https://downloads.raspberrypi.org/imager/imager_latest.dmg を拾い事前にインストールしておく。
* OS イメージ
OpenMediaVault 6 から Desktop と共存するには Docker 上で Desktop 環境を動かすという工夫が必要になったらしい。作業そのものは後回しにするとして、 OpenMediaVault 導入時の面倒を防ぐために Desktop 環境を含まない [Raspberry Pi OS Lite](https://downloads.raspberrypi.org/raspios_lite_arm64/images/raspios_lite_arm64-2022-04-07/2022-04-04-raspios-bullseye-arm64-lite.img.xz) を拾う。

## イメージ転送
画面の指示に従って転送。何も考える必要が無いのは素晴らしい。昔々は大学の共用端末から anonymous ftp に接続して、そこで 1.25MB の 5" FD に ~.aa, ~.ab と言う感じに split されたものを一生懸命集めてという作業を淡々としていたことを考えるといい時代になったものと思う。結合しようとしたら ASCII モードで転送していたので全部作業やり直しとかいう心配も無いし。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201511/d17bd895-a7fc-831b-2a00-50562102585a.png)

Write / Verify が終わったらサクッと装置を外して、メディアの準備は完了。

## Raspberry Pi への SSD 接続と起動
一旦電源を落とした Raspberry Pi に SSD を接続。注意したのは従来使用していたメディアの内容破壊を防ぐため、イメージ転送した SSD だけを接続するようにしたことくらい。

以前に USB 接続機器から起動するように EEPROM 周りとかのアップデート、ブートシーケンスの設定をしていたのでなんということもなく SSD から起動。デフォルトのアカウントとそのパスワードを設定すると、あっという間に autologin して端末が使えるようになる。

昔は FD で起動できる小さいカーネルからシングルユーザーモードを起動して、disklabel 編集をした上で、 newfs を手動でかけて、そこからようやく kernel 群をコピーしてとかやっていたことを思い返すと、実にいい時代になったものと思う。 disklabel 編集時は、開始セクターと利用セクター数とかを記載する必要があって、容量からそれを逆算して電卓で検算してとかやっていたことを考えると、その進歩の大きさには驚くばかり。

# Raspberry Pi の初期設定
取り急ぎ、次の設定をする。
## raspi-config による設定
* Locale の設定( *5 Localisation Options > L1 Locale* )
 __ja_JP.UTF-8__ UTF8 を設定。Locale 設定は本当に楽になったものと思う。
* キーボードレイアウトの設定( *5 Localisation Options > L3 Keyboard* )
Locale の設定を ja_JP.* にした場合はスキップ可能。Locale が初期設定ままの UK になっていると UK キーボードレイアウトが割り当てられる。UKキーボードレイアウトは、US キーボードと全然違うところがあったりするので、Locale をUKにするなら、見栄をはらずに __Japanese キーボード__ に設定しておくのが無難。
* WiFiの設定( *5 Localisation Options > L4 WLAN Country* )
日本モード __JP Japan__ に設定。
* Hostname 設定( *1 System Options > S4 Hostname* ) 
以前から使っていたローカルの FQDN を設定。
* login 設定( *1 System Options> S5 Boot / Auto Login* )
初期設定は __B2 Console Autologin__ なので、 __B1 Console__ に設定。
* sshd の有効化( *3 Interface Options > I2 SSH* )
 __Enabled__ に設定。

## /etc/dhcpcd.conf の設定
LAN ケーブルでつないで OpenMediaVault でサーバーとして運用するので IP アドレスは Static にするのが無難なので、下記の Example 部分を参考に追加。自分の場合、一旦 IPv6 の設定はしないこととする。

```/etc/dhcpd.conf 抜粋
#Example static IP configuration:
#interface eth0
#static ip_address=192.168.0.10/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
#static routers=192.168.0.1
#static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1
```

自分は *ifconfig fxp0 192.168.1.1 netmask 0xfffff00* というように IP アドレスと netmask は分けて設定するのに慣れていたことと、192.168.1.0/24 というように netmask がかかっていないところは 0 になるように記載するものを見慣れていたという 2 つの理由で IP アドレス指定箇所で /32 以外の netmask とユニキャストアドレスを一括で記述する記法に、ちょっと新鮮な印象。

## reboot による設定の有効化
以上の設定がおわったらリブート。

## ssh の設定
### 手元の端末の known_hosts 編集
手元の端末には、以前ログイン時の情報が残っている。これが残っていると、ホスト側に不正があったと警告されログインできないので、これを消去。

### 手元の端末の .ssh/id_rsa.pub の必要部分表示
この一手間で、次の工程が簡単になる。

### Raspberry Pi 側の authorized_keys の作成、編集
```
cd ~/.ssh  && touch ./authorized_keys && chmod 600 autorized_keys 
```

として接続先側に接続元の公開鍵を格納するファイル authorized_keys を作成。次に
```
cat >> authorized_keys 
```
として、ひとつ上の工程で出力した id_rsa.pub の必要内容をコピー＆ペースト。ペースト後 ctrl-D で EOF を送出して、ファイルに出力。出力後、vi などで変なところに改行が入っていたりしないかを確認しておくと、後の手間が省ける。

コピー＆ペーストが難しい環境の場合は、
```
cat ~/.ssh/id_rsa.pub  | ssh username@hostname "cat - > ~/.ssh/authorized_keys" 
```
というように由緒正しい方法で対処することも可能。

### 手元の端末から ssh でログイン
パスワード要求がなくなれば、初期設定は完了。
ここまで来たらキーボードとか Quick Camera はお役目御免。

# Linux の kernel update と btrfs の構築
最初は何も考えずに apt から btrfs を install しようとしたけれど、最新版の btrfs を使ってみたいとか血迷ってしまった。以下は、その顛末メモ。

## btrfs の install(初回)
何も考えずに
```
sudo apt install btrfs-progs
```

を試してみたら、
>.../btrfs-progs_5.10.1-2_arm64.deb を展開する準備をしています ...

と出てきた。

調べてみると btrfs には 5.17 というのがあって performance が良いと話題。これはどうやって入れてみる？ Linux の世界はよくわからないけれど、 Linux kernel 5.17 というのが 2022 年にリリースされたらしい([Linux 5.17がリリース、「AMD P-State」新ドライバサポートなど](https://gihyo.jp/admin/clip/01/linux_dt/202203/25))。これにすると使えるようになるのか？ということで見様見真似で作業開始。

## Linux 5.17 のソース取得
```
sudo apt install git bc bison flex libssl-dev make
```
とおまじないを唱えた上で、
```
git clone --depth=1 https://github.com/raspberrypi/linux -b rpi-5.17.y
```
として、branch を 5.17 に指定し、ソースをもってくる。 Branch 指定は [リモートから特定のブランチを指定してcloneする](https://qiita.com/icoxfog417/items/5776e0f0f758f0f0e48a) を参照。
その後は、 https://www.raspberrypi.com/documentation/computers/linux_kernel.html の指示に従って
```
cd linux
KERNEL=kernel8
make bcm2711_defconfig
```
と
```
make -j4 Image.gz modules dtbs
sudo make modules_install
sudo cp arch/arm64/boot/dts/broadcom/*.dtb /boot/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm64/boot/dts/overlays/README /boot/overlays/
sudo cp arch/arm64/boot/Image.gz /boot/$KERNEL.img
```

を機械的に実行。昔の FreeBSD(98) はパッチを当ててからとかおまじないを一生懸命していたことを考えると楽になったものだとつくづく思う次第。

再起動したら
>Linux (hostname) __5.17.15__-v8+ #1 SMP PREEMPT Thu Aug 11 22:55:33 JST 2022 aarch64

と無事 5.17.15 になっている。

## btrfs のソース取得
```
git clone https://git.kernel.org/pub/scm/linux/kernel/git/kdave/btrfs-progs.git
```
でおしまい。

## btrfs の構築
作成された *make* をかけると
>Makefile:56: *** Makefile.inc not generated, please configure first.  中止.

と怒られる。

*./configure* としてみると
>-bash: ./configure: そのようなファイルやディレクトリはありません

となる。
ここで始めて INSTALL を眺めてみると
>To build from git sources you need to generate the configure script using the autotools:
>    $ ./autogen.sh
>
>To build from the released tarballs:
>    $ ./configure
>    $ make
>    $ make install

とある。試し *autogen.sh* をしてみる。
>You must have autoconf installed to generate btrfs-progs build system.
>
>You must have autoheader installed to generate btrfs-progs build system.
>The autoheader command is part of the GNU autoconf package.
>
>You must have automake installed to generate btrfs-progs build system.

と改めて怒られる。 autoconf については、 *sudo apt install autoconf* のおまじないを唱える。

>Generate build-system by:
>   aclocal:    aclocal (GNU automake) 1.16.3
>   autoconf:   autoconf (GNU Autoconf) 2.69
>   autoheader: autoheader (GNU Autoconf) 2.69
>   automake:   automake (GNU automake) 1.16.3
>
>Now type './configure' and 'make' to compile.

事態が進展した模様。あらためて *./configure* をしてみる。

>configure: error: cannot find sphinx-build, cannot build documentation

また怒られる。 Google 先生に泣きつくと親切にも [ここ](https://stackoverflow.com/questions/37757151/the-sphinx-build-command-was-not-found)を教えてくれた。試しに *sudo apt-get install python3-sphinx* のおまじないを唱える。

なんか、色々動いたようなので、あらためて *./confiugre* してみる。
こんどは
>configure: error: Package requirements (ext2fs) were not met:
>No package 'ext2fs' found

とでる。また Google 先生に *No package 'ext2fs' found btrfs* と泣きついてみたら、 [こんなもの](https://www.spinics.net/lists/linux-btrfs/msg124982.html) が見つかる。

それにそって source コード取得するように /etc/apt/sources.list の後ろ 3 行のコメントを外して以下のようにする。
```/etc/apt/sources.list
deb http://deb.debian.org/debian bullseye main contrib non-free
deb http://security.debian.org/debian-security bullseye-security main contrib non-free
deb http://deb.debian.org/debian bullseye-updates main contrib non-free
\# Uncomment deb-src lines below then 'apt-get update' to enable 'apt-get source'
**deb-src http://deb.debian.org/debian bullseye main contrib non-free**
**deb-src http://security.debian.org/debian-security bullseye-security main contrib non-free**
**deb-src http://deb.debian.org/debian bullseye-updates main contrib non-free**
```
引き続き指示にしたがって、次の命令を実施。
```
sudo apt update
sudo apt source btrfs-progs
cd btrfs-progs
sudo apt build-dep btrfs-progs
```
あらためて *./configure* すると、事態が進展して、
>No package 'libudev' found

と出る。また、Google 先生に *No package 'libudev' found* と泣きついてみたら、[ここ](https://stackoverflow.com/questions/55945023/libudev-development-package-not-found) が出てくる。
これに従って *sudo apt-get install libudev-dev* を実行して、あらためて *./configure* してみる。

今度は、次のように出てくる。事態は進展した模様。
>	Type 'make' to compile.

指示に従って *make* を実行。これはうまくいったようなので引き続き *make install* まで実行。

## /boot/cmdline.txt に書き加え
ここまで来たので、USB 接続 SSD に加えて USB 接続 HDD を HUB 経由でつないでみると、 Raspberry Pi が起動しなくなる。USB デバイスの確認順とかが影響している？と思って、Raspberry Pi4 に 2 つある USB3.0 端子の接続ポートを交換してみる。ブートプロセスに進んだので、Splash 画面が出たと思ったら Fatal Error になったさっきよりは状況改善。でも、起動できないことには変わりない。device の time out あたりが原因？と思って、usb.quirk 絡みのおまじないを /boot/cmdline.txt を追加。もともとある console 周りの記述
>console=serial0,115200 console=tty1 root=PARTUUID=fed628c6-02 rootfstype=ext4 fsck.repair=yes rootwait

の後ろに rootwait と storage の間はスペース 1 文字を挟んで
>usb-storage.quirks=056e:6a13:u,056e:6a0d:u,0bc2:3322:um,0bc2:331a:um,0bc2:ab38:um,0bc2:ab44:um,0bc2:ab45:um

を追記して、以下のようにする。
```/boot/cmdline.txt
console=serial0,115200 console=tty1 root=PARTUUID=fed628c6-02 rootfstype=ext4 fsck.repair=yes rootwait storage.quirks=056e:6a13:u,056e:6a0d:u,0bc2:3322:um,0bc2:331a:um,0bc2:ab38:um,0bc2:ab44:um,0bc2:ab45:um
```
このあたりは https://forums.raspberrypi.com/viewtopic.php?t=245931 や https://github.com/torvalds/linux/blob/master/drivers/usb/storage/usb.c#L568 を参照。一部に m が入っているのは SMART の情報を取得するためのおまじない。 Seagate 製の USB 接続 HDD では、これが必要になったので追加。複数台にまたがる場合は ","(カンマ) で区切り。ID 部分は *lsusb* で調べたものを利用。

## mkfs.btrfs 
ごろごろつながっている USB 接続 HDD 一式に *mkfs.btrfs* を実行。 Data と Meta Data は RAID6 に設定。識別のために Label も設定。前の残骸が残っているので -f を適用。
```
sudo mkfs.btrfs -L RaspberryPi -f -d RAID6 -m RAID6 /dev/sd[b-j]1 
```

# (やっと) openmediavault の install
https://openmediavault.readthedocs.io/en/stable/installation/on_debian.html を参考に進める。 
なお、以下はサイトや動作画面の表記に合わせ **o**pen**m**edia**v**ault で記述を統一。
```
sudo apt-get install --yes gnupg
wget -O "/etc/apt/trusted.gpg.d/openmediavault-archive-keyring.asc" https://packages.openmediavault.org/public/archive.key
sudo apt-key add "/etc/apt/trusted.gpg.d/openmediavault-archive-keyring.asc"
```
/etc/apt/sources.list に追記
``` /etc/apt/sources.list 追記部分
deb https://packages.openmediavault.org/public shaitan main
# deb https://downloads.sourceforge.net/project/openmediavault/packages shaitan main
## Uncomment the following line to add software from the proposed repository.
# deb https://packages.openmediavault.org/public shaitan-proposed main
# deb https://downloads.sourceforge.net/project/openmediavault/packages shaitan-proposed main
## This software is not part of OpenMediaVault, but is offered by third-party
## developers as a service to OpenMediaVault users.
# deb https://packages.openmediavault.org/public shaitan partner
# deb https://downloads.sourceforge.net/project/openmediavault/packages shaitan partner
```
openmediavault の package を install
```
export LANG=C.UTF-8
export DEBIAN_FRONTEND=noninteractive
export APT_LISTCHANGES_FRONTEND=none
sudo apt-get update
sudo apt-get --yes --auto-remove --show-upgraded \
    --allow-downgrades --allow-change-held-packages \
    --no-install-recommends \
    --option DPkg::Options::="--force-confdef" \
    --option DPkg::Options::="--force-confold" \
    install openmediavault-keyring openmediavault

sudo omv-confdbadm populate
```

/etc/group の openmediavault-admin のユーザー名から openmediavault を install する時に作られた admin を抜いて、公知のパスワードを使ってアクセスされる危険性を除去しておく。代わりに自分の account で openmediavault にlogin できることを確認。なんか、画面がレベルアップしている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201511/a65ea032-24c5-171a-0f28-3997033be5e7.png)

## openmediavault の設定
openmediavault-admin グループに属すユーザーでログインするといろいろな機能が使えるようになる。そこから、とりあえず次の設定をする。

1. 言語の設定
ひよって言語を日本語にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201511/3e169f15-4925-0776-ccb2-1a3b630d0628.png)

2. Storage の追加
**ストレージ > ファイルシステム** と移動し、青まるで囲まれたマークをクリックして、btrfs ファイルシステムを追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201511/39aefbe5-8166-17a7-c6bc-4574a938064a.png)

3. パスワード更新
Mac からファイル共有を試みるもアカウントがはねられる。昔々 samba をいじっていた時、そういえば別の認証用ファイルを作っていたなとかいう記憶が目の前に浮かび上がってきたので、openmediavault 側で再設定。 /etc/shadow のタイムスタンプは更新されたので問題なさそう。これでログインできるようになったし、深いところは問わずこれで良しとする。

4. ネットワークインターフェース
これも openmediavault 側で改めて設定。内容は上述と同じとする。これをすると *診断>Performance Statistics* でトラフィックのチャートが出力できるようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201511/fd3cf9aa-aa21-a2b7-6e1a-ecbe0fff84f2.png)
/etc/openmediavault/config.xml に記載される云々なのかなと推察はしているけれど、「動いているのでヨシ」で、そこまで検証はせず。



## 追伸 1
openmediavault を install した際、/etc/group の ssh から通常管理に使用している account が削除されていた。全ての端末を閉じる前に /etc/group を確認しておくことが無難そう。

## 追伸 2
再起動時に fatal error code 45 を出して止まってしまう事象が時々起きる。 https://nekokohouse.sakura.ne.jp/raspi/ や https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#raspberry-pi-4-bootloader-configuration を参考に */boot/config.txt* 最後に
```
boot_delay=5
USB_MSD_EXCLUDE_VID_PID=045b0210
USB_MSD_PWR_OFF_TIME=5
```
のおまじないを入れておく。まずは鰯の頭も信心からで臨む。

## 追伸 3
追伸 2 の調査がてら USB HUB に USB 接続 HDD を一つずつ追加接続していく、ポートを変えるとかを組み合わせながら、起動→様子見を繰り返す。10 ポートの USB3 HUB に 1 つ USB 接続 HDD を接続したら問題無く起動(もちろん btrfs は利用不可状態)したので、 2 つめの USB 接続 HDD 接続したら起動エラーが起きる、もう一回一つに戻しても起動エラーなどの怪現象を発見。HUB が呪われているかもしれないと、新しい 10 ポート HUB の御札にお布施する。早速接続してみたら btrfs で作成された共有フォルダに 50MB/s とか言うペースでデータを転送してくれる。LAN が 1Gbps であることを踏まえると、かなり御の字状態。戯言はともかくとして、USB3.0 のように通信速度が速くて色々シビアそうなものは、そこかしこに落とし穴があるんだなと思った次第。

## 追伸 4
Mini PC を ~~衝動買い~~ 購入してしまったので Raspberry Pi4 は一旦リタイア。Windows 11 Professional が動作するので、Hyper-V 上で Linux を構築してみるプロジェクトへの転換を模索中。