ASUSルーターに接続した2TBのHDDのスキャンがエラーになる

 ASUSルーター(RT-AC56S)を利用していますが、以下の投稿に記載したように複数のHDDを接続してNAS機能を活用しています。
wave.hatenablog.com

 USB3.0ハブを経由して2TBのHDDを追加したのですが、Web管理画面からディスクのスキャンを実行すると、今回追加した2TBのHDDのみエラーが発生することに気付きました。

 本体のUSB3.0ポートにハブを経由して既存の2台のHDDに加えて今回の2TBのHDDと、本体のUSB2.0ポートに1台の合計4台のHDDがルーターに繋がった状態であり、メーカー的には想定していないであろう使われ方であるが故に発生したエラーかと思いきや、そうではありませんでした。

 以下に、本エラーの発生から解消方法までを記載します。
 

発生事象

 ルーターの管理画面から2TBのHDDに対してスキャンを実行したところ、以下のスクリーンショットのようにエラー表示となりました*1
ASUSWRT disk scan error
 
 この時のスキャン結果として表示されているログは以下の通りです。

ntfsck 3014.5.21
Checking NTFS Superblock ...
Device name        : /dev/sdb
NTFS volume version: 3.1
Cluster size       : 4096 bytes
Current volume size: 2000398930432 bytes (2000399 MB)
Current device size: 2000398933504 bytes (2000399 MB)
Checking for bad sectors ...
Scanning $MFT ...
Checking directory structure ...
Checking for orphaned files ...
  0.00 percent completed
  6.90 percent completed
 13.80 percent completed
 20.70 percent completed
 27.61 percent completed
 34.51 percent completed
 41.41 percent completed
 48.31 percent completed
 55.21 percent completed
 62.11 percent completed
 69.01 percent completed
 75.91 percent completed
 82.82 percent completed
 89.72 percent completed
 96.62 percent completed
100.00 percent completed
Scanning orphaned files completed.
Checking attributes ...
  0.00 percent completed
  6.90 percent completed
 13.80 percent completed
 20.70 percent completed
 27.61 percent completed
 34.51 percent completed
 41.41 percent completed
 48.31 percent completed
 55.21 percent completed
 62.11 percent completed
 69.01 percent completed
 75.91 percent completed
 82.82 percent completed
 89.72 percent completed
 96.62 percent completed
100.00 percent completed
Failed to calloc 61047331 bytes: Cannot allocate memory
Checking cluster allocation ...
ERROR(12): Failed to setup allocation bitmap: Cannot allocate memory
Syncing device ...

 

原因分析

ログ

 上記ログにはDISK自体のエラーを示す情報は出力されておらず、末尾に出力されている以下のエラーメッセージが問題と考えられます。

Failed to calloc 61047331 bytes: Cannot allocate memory
Checking cluster allocation ...
ERROR(12): Failed to setup allocation bitmap: Cannot allocate memory

 callocのエラーということで、端的にはメモリ確保に失敗しているだけのように見えます。
 ルーター再起動や、他のHDDのマウントを解除してからスキャンを再試行しても同様のエラーメッセージが表示されるため、一時的なメモリ不足の類では無さそうです。
 すなわち、ルーターの搭載メモリが2TBのDISKに対するスキャン(ntfsck)を遂行するのに十分な容量が無いのでしょう*2
 ASUSルータは強力ですが、RT-AC56Sは既に型落ちで当時のローエンドモデルですので必要最小限なスペックに削られているため、致し方ないのかもしれません。
 

実機調査・対応

 多くのASUSWRT系のファームウェアを搭載したASUSルータにはTelnet又はSSHでログイン可能な機能が標準で搭載されています。
 RT-AC56Sではデフォルトでは無効化されているので、Web管理画面からSSHログインをLAN側からのみ有効にしてログオンして調査してみます。

********@RT-AC56S:/tmp/home/root# free
              total         used         free       shared      buffers
  Mem:       125960        50220        75740            0          588
 Swap:            0            0            0
Total:       125960        50220        75740

 とういわけで、RT-AC56Sには約128MBのメモリが実装されているようです。これを増やしてやれば良さそうですが、一般のPCやサーバと違ってメモリを増設可能なようには作られていません。
 一方でSwap領域が確保されていないことも上記freeコマンドの結果から判ります。念のため /proc/swaps を確認してみます。

********@RT-AC56S:/tmp/home/root# cat /proc/swaps
Filename                                Type            Size    Used    Priority

 Swap領域は確保されていないことが再確認できました。ユーザが繋いだUSBストレージ系デバイスに、勝手にSwap領域を確保するのもおかしな挙動でしょうから、これはこれで普通な挙動なのでしょう。
 とは言え、今はメモリアロケーションでエラーが発生しているので、Swap領域を作ってしまおうと思います。

 私の環境では前述のように4台のHDDが接続されていますが、それぞれは以下のようにマウントされています。

********@RT-AC56S:/tmp/home/root# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root                33.0M     33.0M         0 100% /
devtmpfs                 61.4M         0     61.4M   0% /dev
tmpfs                    61.5M      1.3M     60.2M   2% /tmp
/dev/mtdblock4           62.8M      1.7M     61.0M   3% /jffs
/dev/sda1               298.1G    130.0G    168.0G  44% /tmp/mnt/sda1
/dev/sdd2               148.9G    115.3G     33.7G  77% /tmp/mnt/sdd2
/dev/sdb                  1.8T    392.4G      1.4T  21% /tmp/mnt/SEAGATE_HDD
/dev/sdc1               931.5G    769.9G    161.7G  83% /tmp/mnt/IODATA

 スキャンに失敗しているのは /dev/sdb ですので、それ以外のDISKにSwap領域を作成します。今回は最も使用率が低く、USB3.0接続の /dev/sda1 にSwapファイルを作成することにします。
 既存の1TBのHDDのスキャンは正常に行えていることから、2TBのスキャンには単純に考えて2倍のメモリが確保できれば問題ないであろうということで、オンボードの約128MBと同程度のサイズのSwapファイルを作成します。

********@RT-AC56S:/tmp/home/root# dd if=/dev/zero of=/tmp/mnt/sda1/swap bs=1M count=128
128+0 records in
128+0 records out
********@RT-AC56S:/tmp/home/root# mkswap /tmp/mnt/sda1/swap
Setting up swapspace version 1, size = 134213632 bytes
UUID=09b46e4b-49ac-4bfb-9c18-0e5968e20820
********@RT-AC56S:/tmp/home/root# swapon /tmp/mnt/sda1/swap

 正常にSwap領域が確保できたか確認します。

********@RT-AC56S:/tmp/home/root# cat /proc/swaps
Filename                                Type            Size    Used    Priority
/tmp/mnt/sda1/swap                      file            131068  0       -1
********@RT-AC56S:/tmp/home/root# free
              total         used         free       shared      buffers
  Mem:       125960        95768        30192            0          444
 Swap:       131068            0       131068
Total:       257028        95768       161260

 totalが125960 → 257028に、freeが75740→161260に増加し、2倍以上の空き領域が確保できたのでスキャンを遂行するには(パフォーマンスは定かではありませんが、)十分なはずです。
 

再試行

 Web管理画面から当該DISKのスキャンを試行したところ、以下のスクリーンショットのように、正常に完了しました。
ASUSWRT disk scan success

 ログを確認すると、従来はメモリアロケーションに失敗して行えていなかった、cluster allocation以降のチェックも正常に完了していることが判ります。

ntfsck 3014.5.21
Checking NTFS Superblock ...
Device name        : /dev/sdb
NTFS volume version: 3.1
Cluster size       : 4096 bytes
Current volume size: 2000398930432 bytes (2000399 MB)
Current device size: 2000398933504 bytes (2000399 MB)
Checking for bad sectors ...
Scanning $MFT ...
Checking directory structure ...
Checking for orphaned files ...
  0.00 percent completed
  6.90 percent completed
 13.80 percent completed
 20.70 percent completed
 27.61 percent completed
 34.51 percent completed
 41.41 percent completed
 48.31 percent completed
 55.21 percent completed
 62.11 percent completed
 69.01 percent completed
 75.91 percent completed
 82.82 percent completed
 89.72 percent completed
 96.62 percent completed
100.00 percent completed
Scanning orphaned files completed.
Checking attributes ...
  0.00 percent completed
  6.90 percent completed
 13.80 percent completed
 20.70 percent completed
 27.61 percent completed
 34.51 percent completed
 41.41 percent completed
 48.31 percent completed
 55.21 percent completed
 62.11 percent completed
 69.01 percent completed
 75.91 percent completed
 82.82 percent completed
 89.72 percent completed
 96.62 percent completed
100.00 percent completed
Checking cluster allocation ...
  0.00 percent completed
  6.90 percent completed
 13.80 percent completed
 20.70 percent completed
 27.61 percent completed
 34.51 percent completed
 41.41 percent completed
 48.31 percent completed
 55.21 percent completed
 62.11 percent completed
 69.01 percent completed
 75.91 percent completed
 82.82 percent completed
 89.72 percent completed
 96.62 percent completed
100.00 percent completed
Checking cluster allocation bitmap ...
Checking $MFT bitmap ...
  0.00 percent completed
  6.90 percent completed
 13.80 percent completed
 20.70 percent completed
 27.61 percent completed
 34.51 percent completed
 41.41 percent completed
 48.31 percent completed
 55.21 percent completed
 62.11 percent completed
 69.01 percent completed
 75.91 percent completed
 82.82 percent completed
 89.72 percent completed
 96.62 percent completed
100.00 percent completed
Checking directory structure second time ...
Space in use       : 421290 MB (21.1%)
Done NTFS checking and repair on device '/dev/sdb'.
Syncing device ...

 

備考

 上記対応で、貧弱なメモリ搭載量の機器でもSwap領域を追加してやることで問題無く大容量HDDのスキャンを行うことができました。
 なお、Swap領域は永続的に確保されているわけではありませんので、ルータの再起動後に大容量HDDのスキャンを行う必要があれば、再度Swap領域を割り当てる必要があります。
 



以上。

*1:USB3.0アイコンが赤く表示されているが、その右上の"3"はエラーの数ではなく当該ポートに接続されているデバイスの数。

*2:搭載メモリは公開されていない。 RT-AC56S | Wi-Fi | ASUS 日本