OMVにてストレージマウントでquotacheckが失敗する（Command 'quotacheck' failed）

# 概要

OpenMediaVault(OMV)をラズパイ上で起動して運用しています。別のLinux機から持ってきたext4のストレージをOMVでマウントしようとしたところ、エラーのためストレージ管理ができませんでした。どうやらquotacheckコマンドの失敗が原因のようでした。いろいろ試した結果、OSのアップデートとアップグレードで解決しましたが、理由についてははっきりさせることはできませんでした。ここに試行錯誤したメモとして残しておきます。

## 環境

- Raspberry Pi 5 Model B Rev 1.0
- Raspberry Pi OS Lite (64-bit)（Debian GNU/Linux 12.2.0 (bookworm)）
- デスクトップ内蔵用の6TB HDDをSATA -> USB変換器に接続し、ラズパイに接続
- OpenMediaVault 7.4.8-1

## 症状

### 再現手順

ストレージを接続し、OMVにログイン後、下記のようにメニューから対象のストレージをマウントします。

- ストレージ > ファイルシステム
- 「マウント」ボタン押下で対象ストレージをマウント
- 「HTTP 500 ERROR」がトースト通知される
- 詳細を右上通知アイコン（ベルマーク）押下で確認
- エラー内容をクリップボードにコピー

下記にエラー内容を示します。

```txt

...(中略)

----------
          ID: quota_off_no_quotas_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    Function: cmd.run
        Name: quotaoff --group --user /dev/disk/by-uuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx || true
      Result: True
     Comment: Command "quotaoff --group --user /dev/disk/by-uuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx || true" run
     Started: 09:12:23.798013
    Duration: 89.49 ms
     Changes:
              ----------
              pid:
                  3637467
              retcode:
                  0
              stderr:
                  quotaoff: quotactl on /dev/sdd1 [/srv/dev-disk-by-uuid-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx]: File exists
                  quotaoff: quotactl on /dev/sdd1 [/srv/dev-disk-by-uuid-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx]: File exists
              stdout:
----------
          ID: quota_check_no_quotas_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    Function: cmd.run
        Name: quotacheck --user --group --create-files --no-remount --verbose /dev/disk/by-uuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
      Result: False
     Comment: Command "quotacheck --user --group --create-files --no-remount --verbose /dev/disk/by-uuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" run
     Started: 09:12:23.887682
    Duration: 23.039 ms
     Changes:
              ----------
              pid:
                  3637469
              retcode:
                  1
              stderr:
                  quotacheck: Cannot find filesystem to check or filesystem not mounted with quota option.
              stdout:
----------
          ID: disable_quota_service
    Function: service.disabled
        Name: quota
      Result: True
     Comment: Service quota is already disabled, and is in the desired state
     Started: 09:12:24.782316
    Duration: 24.895 ms
     Changes:

Summary for server
------------
Succeeded: 2 (changed=2)
Failed:    1
------------
Total states run:     3
Total run time: 137.424 ms
[ERROR   ] Command 'quotacheck' failed with return code: 1
[ERROR   ] stderr: quotacheck: Cannot find filesystem to check or filesystem not mounted with quota option.
[ERROR   ] retcode: 1
[ERROR   ] {'pid': 3637469, 'retcode': 1, 'stdout': '', 'stderr': 'quotacheck: Cannot find filesystem to check or filesystem not mounted with quota option.'} in /usr/share/php/openmediavault/system/process.inc:247
Stack trace:
#0 /usr/share/php/openmediavault/engine/module/serviceabstract.inc(62): OMV\System\Process->execute()
#1 /usr/share/openmediavault/engined/rpc/config.inc(186): OMV\Engine\Module\ServiceAbstract->deploy()
#2 [internal function]: Engined\Rpc\Config->applyChanges()
#3 /usr/share/php/openmediavault/rpc/serviceabstract.inc(122): call_user_func_array()
#4 /usr/share/php/openmediavault/rpc/serviceabstract.inc(149): OMV\Rpc\ServiceAbstract->callMethod()
#5 /usr/share/php/openmediavault/rpc/serviceabstract.inc(622): OMV\Rpc\ServiceAbstract->OMV\Rpc\{closure}()
#6 /usr/share/php/openmediavault/rpc/serviceabstract.inc(146): OMV\Rpc\ServiceAbstract->execBgProc()
#7 /usr/share/openmediavault/engined/rpc/config.inc(207): OMV\Rpc\ServiceAbstract->callMethodBg()
#8 [internal function]: Engined\Rpc\Config->applyChangesBg()
#9 /usr/share/php/openmediavault/rpc/serviceabstract.inc(122): call_user_func_array()
#10 /usr/share/php/openmediavault/rpc/rpc.inc(86): OMV\Rpc\ServiceAbstract->callMethod()
#11 /usr/sbin/omv-engined(544): OMV\Rpc\Rpc::call()
#12 {main}
```

### 補足事項

- この時点で、ストレージのマウント自体はされていました。
  - OMVを起動しているラズパイ内にて、`/srv/dev-disk-by-uuid-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/`配下のファイルへアクセスできることを確認
- ストレージはほかのLinuxマシンでフォーマットしたext4

### quotaoff, quotaon, quotacheck

エラーログを眺めていると、quotacheckコマンドが失敗していることが原因のようでした。とくにquota設定は行っていないのですが、OMVが自動的に有効にします。OMVがやろうとしていることを手元でも実行してみます。

```bash
# 対象のディレクトリのマウント設定があることを確認。どのようなオプションで起動しているか確認する。
cat /etc/fstab
```

下記の出力で、対象のストレージのマウント設定を確認できました。

```ini:/etc/fstab
proc            /proc           proc    defaults          0       0
PARTUUID=0000000b-01  /boot/firmware  vfat    defaults          0       2
PARTUUID=0000000b-02  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that
# >>> [openmediavault]
/dev/disk/by-uuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx          /srv/dev-disk-by-uuid-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx       ext4    defaults,nofail,user_xattr,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0,acl 0 2
# <<< [openmediavault]
```

以下のようにコマンドを入力してみて、同様のエラーが出力されるか試しました。

```bash
# いったんアンマウント
sudo umount /srv/dev-disk-by-uuid-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

# マウントしてみる
sudo mount -o 'defaults,nofail,user_xattr,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0,ac' /dev/disk/by-uuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /srv/dev-disk-by-uuid-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

# quotaをオンにしてみる
sudo quotaon -v /srv/dev-disk-by-uuid-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# /dev/sdb1 [/srv/dev-disk-by-uuid-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx]: group quotas turned on
# /dev/sdb1 [/srv/dev-disk-by-uuid-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx]: user quotas turned on

# 問題のコマンド
quotacheck -v /dev/disk/by-uuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# quotacheck: Cannot find filesystem to check or filesystem not mounted with quota option.

sudo quotaoff -v /dev/disk/by-uuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# /dev/sdb1 [/srv/dev-disk-by-uuid-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx]: group quotas turned off
# /dev/sdb1 [/srv/dev-disk-by-uuid-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx]: user quotas turned off
```

quotacheckで失敗します。OMVのエラーログとほぼ同様の状況なので、OMV自体に問題はなさそうです。

### マウントできるストレージとできないストレージ

マウントできるストレージにて同様に`quotaon`コマンドを実行してみると、下記のような非推奨機能に関する警告が出ていることに気づきました。

> quotacheck: Your kernel probably supports ext4 quota feature but you are using external quota files. Please switch your filesystem to use ext4 quota feature as external quota files on ext4 are deprecated.

確認してみると、ストレージの直下に、`aquota.user`、`aquota.group`ファイルがありました（これがexternal quota filesか）。一方で、マウントできなかったストレージには存在しませんでした。本環境では`ext4 quota`なストレージはquotacheckで失敗してしまう状況と思われます。この警告を解消する下記コマンドを試してみましたが、効果はありませんでした。

```bash
sudo umount /srv/dev-disk-by-uuid-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
sudo tune2fs -O quota /dev/sdd1
```

- quotaの警告解決についての参考
  - [22.04 - Deprecation Warning for Quota, how to fix? - Ask Ubuntu](https://askubuntu.com/questions/1492000/deprecation-warning-for-quota-how-to-fix)

## 解決方法

最終的にOSのアップデート＆アップグレードを行ったところ、解決しました。

### OSのアップデート＆アップグレード

```bash
sudo apt -y update
sudo apt -y full-upgrade
sudo reboot
```

以下にバージョン情報を示します。

```txt
Linux version 6.6.28+rpt-rpi-2712 (debian-kernel@lists.debian.org) (gcc-12 (Debian 12.2.0-14) 12.2.0, GNU ld (GNU Binutils for Debian) 2.40) #1 SMP PREEMPT Debian 1:6.6.28-1+rpt1 (2024-04-22)

↓

Linux version 6.6.51+rpt-rpi-2712 (serge@raspberrypi.com) (gcc-12 (Debian 12.2.0-14) 12.2.0, GNU ld (GNU Binutils for Debian) 2.40) #1 SMP PREEMPT Debian 1:6.6.51-1+rpt3 (2024-10-08)
```

### Firmwareのアップデート

Firmwareのアップデートも行います。

```bash
sudo raspi-config
```

CLIツールRaspberry Pi Software Configuration Toolが起動します。

- Advanced Options > Bootloader Version > Latest  Use the latest bootloader image

以下のメッセージが表示されたら「yes」を選択します。最初意味がうまく理解できず「no」を選択してしまいました（「Latest version bootloader」をdefaultに設定するか銅貨を聞かれていると思われる）。

> Latest version bootloader selected - will be loaded at next reboot.
> Reset bootloader to default configuration?

再起動を促されるので再起動します。バージョンアップされたか確認します。

```bash
sudo rpi-eeprom-update -a
```

以下に出力例を示します。

```txt
BOOTLOADER: up to date
   CURRENT: Tue Nov 12 16:10:44 UTC 2024 (1731427844)
    LATEST: Tue Nov 12 16:10:44 UTC 2024 (1731427844)
   RELEASE: latest (/lib/firmware/raspberrypi/bootloader-2712/latest)
            Use raspi-config to change the release.
```

「CURRENT」と「LATEST」が同じ値であればOK。

- ラズパイアップデートの参考
  - [How to update the Firmware on your Raspberry Pi 5 | Pineboards](https://pineboards.io/blogs/tutorials/how-to-update-the-firmware-on-your-raspberry-pi-5)
  - [(93) How to update Raspberry Pi 5 bootloader eeprom to latest stable version. Now has "network-install" - YouTube](https://www.youtube.com/watch?v=dqV0naK40gE)

以上です。