HAVRMの空空活動誌

「空空」は「うつらうつら」と読むらしいです.まぁ常に寝不足なもんで...

Rock Pi 4A v1.4+Penta SATA HATによるNAS構築 Vol. 5 ~システム破損からの再セットアップ+OSアップデート~

こんにちは,HAVRMです.

前回,「Ubuntu Server 18.04」でインストールしたところHDDを認識でき,NASのセットアップを行ったところまで記事を書いていました.
havrm.hatenablog.com

その後,自動起動のcronを使って,いろいろプログラムを走らせていましたが,気づいたらシステムが強制終了しており,さらに再起動もできなくなっていました.
ということでシステムの復旧とついでにOSを「Ubuntu Server 20.04」,さらには「Ubuntu Server 22.04」へのアップデートを行います.

なお経験的に年度末にPCが壊れやすく,3年間使い倒したデザイナー用PC(性能はゲーミングPCと同じ)も壊れました.こちらはSSDの破損っぽいのでSSDを換装します(記事にするかもしれません).皆さんも年度末のこの忙しい時期ではありますが,データ等のバックアップをしっかりととるようにしてください.

再OSインストール

前々回の記事でも書いたように「Ubuntu Server 20.04」を直接インストールするとHDDを認識できません.
そのため,改めて「Ubuntu Server 18.04」を再インストールし,「do-release-upgrade」を使って「Ubuntu Server 20.04/22.04」にアップデートします.
Rock PiのようなSBCの場合,OSが破損した際に原因によってはOSが入っているSDカードにアクセスできなくなる事例があります.自分はこれまでRaspberry Pi 2で2枚,Raspberry Pi 3で1枚,Raspberry Pi 4で1枚それぞれ壊しています(泣).
まずはSDカードが生きているか確認します.Windowsに刺したところ,SDカードの認識とドライブの認識(Rock Piの場合4つにパーティションを区切っています)はできました.なので前回と同様に「balenaEtcher」で書き込みしようとしたところ,「Starting...」から全然進みません...
ということでSDカードは破損(詳しく言うと書き込み不可の状態で固定)したと考え,新しいSDカードに書き込むこととします.

SDカードの再選定

ちょうど破損した際,Amazonのタイムセールがあり,それなりに性能のいいSDカードも割引されていました.ということでBAFFALOのUHS-1対応の32GBのmicroSDHCのRMSD-032U11HA/Nを570円で購入しました.

これにインストールを行います.
インストール手順は前回と同じなので省略します.

初期設定

前回と同様にHDDを認識するのを確認し,初期設定を行っていきます.なお結果は前回と同じなので書かないです.また実行順番も少し変えています.

# HDDを認識しているか確認
$ sudo fdisk -l

# アップデートとアップグレード
$ sudo apt update
$ sudo apt -y upgrade

# 削除されているパッケージのインストール
$ sudo unminimize

# SSHサーバーのインストール
$ sudo apt install openssh-server

# SSHサーバーが起動しているか確認
$ sudo systemctl status ssh

Ubuntu Server 20.04」へのアップデート

「do-release-upgrade」の実行

ということで最低限の準備ができたので,OSのアップデートをやってみます.なおここではSSHでログインして行ってみました.

# OSのアップデート
$ sudo do-release-upgrade
Checking for a new Ubuntu release
...
Reading cache

Checking package manager

Continue running under SSH?

This session appears to be running under ssh. It is not recommended
to perform a upgrade over ssh currently because in case of failure it
is harder to recover.

If you continue, an additional ssh daemon will be started at port
'1022'.
Do you want to continue?

Continue [yN]

という感じで「SSHでやるのはお勧めしないよ~」と言われたのでおとなしくローカルでアクセスしてやります.
ということで一度SSHからログアウトし,ローカルでログインしなおしてから改めて行います.
ローカルでログインし,同様に「sudo do-release-upgrade」を実行します.自分の場合は約30分かかりました.途中で色々聞かれますが,基本「y」か適切なものを選択すれば大丈夫です.画面を動画で撮っているので,気が向いたら文字起こしして,本記事に貼っておきます.
最後に「rebootしてください」ときたら「y」で許可し,再起動を待てばいいです.ここでは結構待ちました...

何よりもまずHDDの確認

ともかくHDDを認識できないと話が進まないので確認します.SSHでログインしなおして...

# 母艦側でログイン
$ ssh rock@xxx.xxx.xxx.xxx
...

#ログイン成功,以下SSHのウインドウ
$ sudo fdisk -l
Disk /dev/ram0: 4 MiB, 4194304 bytes, 8192 sectors
...

Disk /dev/sda: 5.47 TiB, ...
Disk model: WDC WD60EZAZ-00S
...

ということで認識されました!!

また,「Ubuntu Server 22.04」へのアップデートも言われているのでついでにやっちゃいましょう(出てから1年近くたっているのでバグとかないよね...).
一度NASを構築するとHDDの認識に失敗したときにOSの起動ができなくなるのでNASの構築が終わる前にやっちゃいます.

Ubuntu Server 22.04」へのアップデート

「do-release-upgrade」の実行→失敗

改めてSSHからログアウトし,ローカルでログインしなおします.
また最初なのでアップデート・アップグレードを行っておきます.

# アップデートとアップグレード
$ sudo apt update
...

$ sudo apt -y upgrade
...

# OSのアップデート
$ sudo do-release-upgrade
...
Not enough free disk space

The upgrade has aborted. The upgrade needs a total of 193 M free
space on disk '/boot'. Please free at least an additional 128 M of
disk space on '/boot'. You can remove old kernels using 'sudo apt
autoremove' and you could also set COMPRESS=xz in
/etc/initramfs-tools/initramfs.conf to reduce the size of your
initramfs.

...

となり,「/boot」の容量不足でアップデートできませんでした
あらためて容量を確認してみるとそもそも「/boot」には193MB必要なのに100MBしか用意されてないです...

$ sudo df -lh
Filesystem      Size  Used Avail Use% Mounted on
...
/dev/mmcblk0p4  100M   38M  62M  38% /boot
...

ということで詰みです...
この後デバイス上で容量拡大できないかとfdiskを使っていろいろやってみたところOSが起動しなくなりました(泣).
ということで「Ubuntu Server 18.04」のインストールから再試行です...

パーティションの確認

とりあえず,「Ubutnu Server 18.04」を再インストールし,SDカードのパーティションを確認すると次のようになっています.

$ sudo fdisk -l /dev/mmcblk0
...

Device           Start      End  Sectors  Size Type
/dev/mmcblk0p1      64     8063     8000  3.9M Linux filesystem
/dev/mmcblk0p2   16384    24575     8192    4M Linux filesystem
/dev/mmcblk0p3   24576    32767     8192    4M Linux filesystem
/dev/mmcblk0p4   32768   262143   229376  112M EFI System
/dev/mmcblk0p5  262144 xxxxxxx xxxxxxx xxxxG Linux filesystem

問題となる「/boot」は「/dev/mmcblk0p4」なので両側がパーティションで挟まれています.これだと「/dev/mmcblk0p4」を拡大するためには先に「/dev/mmcblk0p5」の前に空き容量を作る必要があります.

実際に拡張する方法

こういったパーティションの移動やサイズ変更等はUbuntuGUIアプリであるGPartedを使うのが簡単です(というよりパーティションの移動ができるのはこれだけ?).またOSをインストールしたSDカードをRock Piに刺して起動すると,「/dev/mmcblk0p5」が最後まで拡張されていました.そのためOSインストールした後,Rock Piに刺す前に別のUbuntuでSDカードを読み込み,GPartedで編集しようと考えました.この状態では「/dev/mmcblk0p5」は2GB程度しかありません.
しかし,「/dev/mmcblk0p5」の移動はできたものの,「/dev/mmcblk0p4」の拡張がうまくできず,増加分はそのままunallocatedとなり,Rock Pi側での認識でも容量は増えていませんでした.要するにパーティションの範囲は広がったけど,ファイル容量としては使えない状態のようです.
この後様々な試行錯誤とOSの再インストールを繰り返した結果,うまくいく方法を見つけたのでそれを記述します.
なおここでは「/boot」領域は112MBから512MBに拡張します.
また以下のサイトを参考にしました.
forum.odroid.com

成功した方法

まずは大まかな流れを書きます.

  1. Ubuntu Server 18.04」のSDカードへのインストール
  2. 別のUbuntu PCでGparted を使って「/dev/mmcblk0p5」を400MB分後ろに移動
  3. GPartedで「/dev/mmcblk0p4」の領域を増やす
  4. SDカードをRock Piに刺してアップデートと,フルインストールを行う
  5. SDカードをRock Piから抜き,改めて別のUbuntu PCに刺す
  6. SDカードの「/boot」に相当するデータをのバックアップを取る
  7. SDカードの「/dev/mmcblk0p4」をFAT16からFAT32でフォーマットする
  8. 「/dev/mmcblk0p4」にバックアップした「/boot」のデータを入れなおす
  9. SDカードをRock Piに刺しなおし,再起動する

ということで細かく見ていきます.

1. 「Ubuntu Server 18.04」のSDカードへのインストール

これはいつも通りにすればいいので省略します

2. 別のUbuntu PCでGparted を使って「/dev/mmcblk0p5」を400MB分後ろに移動

これについても方法は調べれば出てくるのでここでは省略します.というのも画面を動画で撮ってはいるものの画角や明るさが悪いため,掲載できないレベルだからです.また後程用意できたら掲載します.

3. GPartedで「/dev/mmcblk0p4」の領域を増やす

これについても通常通り後半にできた未フォーマット領域を「/dev/mmcblk0p4」に統合すればいいですが,この時GPartedはエラーを吐きます(なおエラー内容はよくわからないです...なんかサポートに連絡しろ的な感じ?).その結果,パーティションの範囲としては512MBあるものの,実際に使える範囲は112MBのままとなります.この時点ではこのままで大丈夫なので次に進みます.

4. SDカードをRock Piに刺してアップデートと,フルインストールを行う

これは前回に言ったことですが,「Ubuntu Server 18.04」のRock Pi 4用のイメージは最低限のソフトしか入っていない状態です.そのためそれをインストールする必要があります.

# アップデートとアップグレード
$ sudo apt update
$ sudo apt -y upgrade

# 削除されているパッケージのインストール
$ sudo unminimize

ここまで出来たら一度Rock Piをシャットダウンします.シャットダウンのコマンドは次の通りです.

$ sudo shutdown now

# or

$ sudo halt

下のは強制終了のものだったような気もしなくもないですが,シャットダウンできます.ただ,どちらでも様々なLEDやUSB機器へは電源が供給されっぱなしなので,しばらく時間をおいてから電源ごと引っこ抜きましょう.

5. SDカードをRock Piから抜き,改めて別のUbuntu PCに刺す

ここで改めでSDカードを抜き,別のUbuntu PCに刺します.

6. SDカードの「/boot」に相当するデータをのバックアップを取る

まずは「/boot」に当たる部分をマウントする必要があります.
GPartedでも何でもいいのでSDカードの認識名(「/dev/mmcblk0」等)を確認し,その4番目のパーティション(「/dev/mmcblk0p4」や「/dev/sdc4」等)を適当な箇所にマウントします.自分は「/media/<ユーザ名>/boot」にしました.
いかに実際のコマンドを書きます.なお自分は「Ubuntu 18.04.05 LTS」のLive USBで作業していたのでユーザ名は「ubuntu」となります.

# まずはマウントするフォルダを作ります
$ sudo mkdir /media/ubuntu/boot

# 対象のパーティションをマウントします.自分はUSB変換器を使ってつなげていたので「/dev/sdc4」となっていました
$ sudo mount /dev/sdc4 /media/ubuntu/boot

# 中身を.tar形式で保存します.おそらくオプションが大事ですが,追いきれてないです...
# なお参考にしたサイトの最後にあったほうを使っています
# これを実行すると実行している階層に「boot.tar」ファイルができ,これがバックアップとなります
$ find /media/ubuntu/boot -type f -printf "%P\n" | xargs tar cf boot.tar -C /media/ubuntu/boot
7. SDカードの「/dev/mmcblk0p4」をFAT16からFAT32でフォーマットする

参考ページにも書いてありますが,FAT16の場合制限がきつめなのでFAT32にフォーマットします.しかしそれによってデータが全部なくなります.

# 先にSDカードをアンマウントします
$ sudo umount /media/ubuntu/boot

# 実際にフォーマットします
# オプションは確認していませんが,パーティションの設定をきちんと保持していました
$ sudo mkfs.fat -F32 -v -I -n "boot" /dev/sdc4
8. 「/dev/mmcblk0p4」にバックアップした「/boot」のデータを入れなおす

改めてパーティションをマウントしなおし,データを改めて書き込みます.

# マウントします
$ sudo mount /dev/sdc4 /media/ubuntu/boot

# バックアップを展開し,貼り付けます
$ sudo tar -xvf boot.tar -C /media/joel/boot

# 作業が終わったら改めてアンマウントし,SDカードを取り出します
$ sudo umount /media/ubuntu/boot
9. SDカードをRock Piに刺しなおし,再起動する

SDカードをRock Piに刺しなおし,再起動します.起動後実際に領域が増えたか確認します.

# ファイル容量が増えたか確認
$ sudo df -lh
Filesystem      Size  Used Avail Use% Mounted on
...
/dev/mmcblk0p4  511M   39M  473M   8% /boot
...

ということで容量が増えていることを確認できます.

上の順番の理由+失敗した方法

だいぶ複雑な方法になっているのは次の理由があります.

Rock Piに刺す前に「/dev/mmcblk0p4」をフォーマットをしない理由

先にフォーマットしてしまうと起動時に「/boot」が見つからず,また最初のアップグレードから「rockchip-fstab」がインストールできず,パーティションが見つからないとエラーを吐くためです.
領域を拡張しただけではこのエラーは起きないので,まずは拡張した領域を認識してもらって,後でその中身を書き換える方法になっています.

改めて「do-release-upgrade」の実行→成功

領域も拡張できたので改めて「do-release-upgrade」を実行します.今回は15分ほどで終わりました.

# OSのアップデート
$ sudo do-release-upgrade
...
# 何度か聞かれるので基本「y」で進めます

終わった後再起動していいか聞かれるのでそのまま再起動しましょう

HDDの確認

ということで改めでHDDを認識できるか確認します

$ sudo fdisk -l
Disk /dev/ram0: 4 MiB, 4194304 bytes, 8192 sectors
...

Disk /dev/sda: 5.46 TiB, ...
Disk model: WDC WD60EZAZ-00S
...

ということで認識できています!!

まとめ

とりあえずここで気力が尽きたのでここまでとします.
あとは前回と同様にNASのセットアップをしていくだけです.
「/boot」の容量不足の問題だけでせっかくの休日が丸一日潰れました(泣).
誰もやってないことをやるとこういうことが多々あります...
なお,Radxa(Rock Piのブランド名)のWikiには「Debianでこのバグは修正されているからDebianにしたら?」という回答しかなかったです(なおRock Pi 4ではなかったです)...