Raspberry Pi 4BにインストールしたAlmaLinux 8.4がUASドライバの問題でUSBブートしない場合の対応
目次
概要
Raspberry Pi 4 model B 8GBモデル(以下、ラズパイ4と略記)のmicroSDカードからOSを起動するのでは I/Oがかなり遅く、メディア自体の耐久性も気になるため、USBメモリにLinuxをインストールして利用していました。 それでかなり快適に利用できていましたが、今後ラズパイ4をKVMを利用した仮想化環境として利用しようと考えたので、 ストレージに更なる高速化と耐久性を目指してUSB接続のSSDに変更しました。 ラズパイ4で既にUSBブートの実績はあるのでSSDに変更しただけで問題が発生するとは考えていませんでしたが、 Linuxの起動処理が完了しない状態になってしまったので発生した事象と対応策を残しておきます。
構成
サーバ構成
ハードウェア
ハードウェアはRaspberry Pi 4 Model Bのメモリ8GBモデルを使用しました。 ハードウェアスペックは以下のとおりです。
項目 | 内容 |
---|---|
SoC | Broadcom BCM2711 |
CPU | ARM Cortex-A72 1.5GHz |
GPU | Broadcom VideoCore VI Dual Core 500MHz |
メモリ | LPDDR4 SDRAM 8GB |
有線ネットワーク | Gigabit Ethernet |
SSD(システム用) | SanDisk SDSSDHII-480G |
SATA USB変換アダプタ | Uuger |
ディスプレイ | LG 24ML600S-W |
キーボード | FILCO FKBC91MRL/JB2 |
マウス | Logicool M325 |
OS
AlmaLinux 8.4 (Electric Cheetah) aarch64
インストールで利用したOSイメージ
- AlmaLinux-8-aarch64-RaspberryPI-Minimal-4-sda.raw.xz
発生した問題
環境状態
ラズパイ4向けのAlmaLinux 8.4 OSイメージ(AlmaLinux-8-aarch64-RaspberryPI-Minimal-4-sda.raw.xz)をrufus 3.11を利用してSSDに書き込みました。 このSSDをSATA USB変換アダプタを経由してラズパイ4のUSB3.0ポートへ接続しました。 ラズパイ4のブートローダ(EEPROM)はUSBブート可能な2020年12月以降のバージョンにアップデートしてあります。 microSDカードスロットは空の状態です。
Linux起動で陥った状態
準備としては間違っていないと思っていたので、電源を入れればUSB接続のSSDからAlmaLinux 8.4が起動するはずでした。 ・・・が、以下の画面のように「scsi host0: uas_eh_device_reset_handler success」というメッセージが一定間隔で繰り返し表示されて AlmaLinux 8.4の起動が完了しませんでした。
今回はこの問題の解決方法を紹介します。
解決した方法
結論
UAS(USB Attached SCSI)ドライバを無効化することで問題が解消しました。 UASP対応のSATA USB変換アダプタを利用してSSDをラズパイ4に接続しているためだと思いますが、標準でUASドライバが読み込まれていました。 UASドライバを利用した方がディスクアクセスが高速になるため対応しているなら利用した方がいいのですが、 一部ストレージコントローラと相性問題が発生するという事例があり、今回もそれに該当したのかなと思います。 なお、AlmaLinux起動時のコンソールには明示的にエラーメッセージは出ていなかったと思いますが、 UASドライバを無効化したことで正常に起動するようになったので問題箇所としては合っていると考えています。
デバイスIDの確認
Raspberry Pi OSをインストール済みのmicroSDカードでラズパイ4を起動した後に 今回問題となっているSSDをSATA USB変換アダプタ経由でUSB3.0ポートに接続します。 その後 lsusb コマンドでUSBデバイスの一覧を表示します。 一覧の中で対象のUSBデバイスを探して、デバイスIDをメモします。 以下の例ではバス2のデバイス2が該当しているので「ID」に続く「152d:0578」の部分です。 後続の手順で設定する際に必要となります。
pi@raspberrypi:~ $ lsusb
Bus 002 Device 002: ID 152d:0578 JMicron Technology Corp. / JMicron USA Technology Corp. JMS567 SATA 6Gb/s bridge ←「152d:0578」部分がデバイスIDなのでメモする
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 0c45:7403 Microdia Foot Switch
Bus 001 Device 003: ID 1a40:0101 Terminus Technology Inc. Hub
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
ドライバの確認
lsusb コマンドに -t オプションを付けて実行すると、バスとデバイスがツリー構造で表示され、 その中にドライバも表示されます。 以下のようにバス2のデバイス2は「Mass Storage(記憶装置)」で「Driver=uas(UASドライバ)」ということが分かります。
pi@raspberrypi:~ $ lsusb -t
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M
|__ Port 2: Dev 2, If 0, Class=Mass Storage, Driver=uas, 5000M ←UASドライバが読み込まれている
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 4: Dev 3, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 2: Dev 4, If 0, Class=Human Interface Device, Driver=usbhid, 12M
|__ Port 2: Dev 4, If 1, Class=Human Interface Device, Driver=usbhid, 12M
カーネルの起動オプションの設定
カーネルの起動オプションでUASドライバを読み込まず、通常のUSBドライバを利用するよう指定します。 上の手順の続きでRaspberry Pi OSから /boot/cmdline.txt ファイルを編集しようとしたらエラーになったので、 取り外してWindows PCでファイルを編集しました。 「usb-storage.quirks=」に続けて指定するのは、上の手順で確認したデバイスIDに「:u」を付けたものです。
※以下、赤字部分を追記※
usb-storage.quirks=152d:0578:u console=ttyAMA0,115200 console=tty1 root=PARTUUID=a4b401f3-03 rootfstype=ext4 elevator=deadline rootwait
USB接続のSSDからラズパイ4を起動
ラズパイ4からmicroSDカードを取り外して、SATA USB変換アダプタ経由でSSDをUSB3.0ポートに接続し、ラズパイ4の電源を入れます。 これで正常にAlmaLinux 8.4が起動しました。 起動後に dmesg を表示して確認すると、UASが無視されて通常のUSBドライバ usb-storage が代わりに使われていることが分かります。
# dmesg (========== 前略 ==========) ↓カーネルの起動オプションに変更が反映されている [ 0.000000] Kernel command line: coherent_pool=1M 8250.nr_uarts=0 snd_bcm2835.enable_compat_alsa=0 snd_bcm2835.enable_hdmi=1 bcm2708_fb.fbwidth=1824 bcm2708_fb.fbheight=984 bcm2708_fb.fbswap=1 smsc95xx.macaddr=DC:A6:32:C7:AA:92 vc_mem.mem_base=0x3eb00000 vc_mem.mem_size=0x3ff00000 usb-storage.quirks=152d:0578:u console=ttyAMA0,115200 console=tty1 root=PARTUUID=a4b401f3-03 rootfstype=ext4 elevator=deadline rootwait (========== 中略 ==========) [ 1.702194] usb 2-2: new SuperSpeed Gen 1 USB device number 2 using xhci_hcd [ 1.705986] printk: console [ttyAMA0] enabled [ 1.731957] usb 2-2: New USB device found, idVendor=152d, idProduct=0578, bcdDevice=32.02 [ 1.745584] bcm2835-power bcm2835-power: Broadcom BCM2835 power domains driver [ 1.752108] usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 1.752123] usb 2-2: Product: External Disk 3.0 [ 1.758334] mmc-bcm2835 fe300000.mmcnr: mmc_debug:0 mmc_debug2:0 [ 1.763821] usb 2-2: Manufacturer: JMicron [ 1.767825] mmc-bcm2835 fe300000.mmcnr: DMA channel allocated [ 1.772273] usb 2-2: SerialNumber: 155112402089 [ 1.805865] of_cfs_init [ 1.831865] usb 2-2: UAS is ignored for this device, using usb-storage instead ←UASが無視されている [ 1.840928] of_cfs_init: OK [ 1.848934] usb 2-2: UAS is ignored for this device, using usb-storage instead ←UASが無視されている (========== 後略 ==========)
なお、lsusb コマンドで読み込まれたドライバを確認しようとしたところ、 AlmaLinux 8.4の初期状態では lsusb コマンド自体がインストールされていなかったので dmesg で確認しました。