lsコマンドを実行するとエラーや「?」が大量に表示されるときの対処録→故障ではなかった

サーバー

lsコマンドを実行すると以下のように?マークが大量に表示される問題に直面しました。

lsコマンドを実行すると、ファイル名以外の情報が表示されず「?」が表示されています。

また、「<ファイル名>にアクセスできません:そのようなファイルやディレクトリはありません」というエラーも大量に表示されます。

Samba経由で表示してみると、一部のファイルが表示されなくなっていました。ファイルにアクセスできない状況となっているようです。

ディスクはSeagate 3.5インチ1TBハードディスク。USB接続のHDDケース(ロジテック LHR-EKWU3BK)に入れて、ラズベリーパイ3Bに接続しています。

一般的にはディスクやファイルシステムの破損が考えられる症状ですが、今回のケースではHDDケースに原因があるみたいです。

スポンサーリンク

原因探索

原因を探るべく行った作業を記録していきます。

文字化けではないことの確認

lsコマンドの出力に?など変な文字が出てくるとき、最初に考えるべきは文字化けです。

LANG環境変数が正しく設定されていることを確認します。

とはいえ、状況的に英数字の箇所が「?」になっていることから文字化けは否定的です。また、コンソールの日本語の表示に問題はないことからも否定的と考えてよいでしょう。

再マウントしてみる

一度アンマウントしてみて、再度マウントしてみます。

sudo umount /mnt/hdd01
sudo mount -t ext4 /dev/sdb1 /mnt/hdd01

lsコマンドを実行し、ファイルが表示されるか確認しました。

結果
→正常に表示されました。

なお、partedコマンドの表示に異常なし。

ファイルシステムのエラーをチェックする

e2fsckコマンドでファイルシステムのエラーチェックを実行します。

sudo e2fsck -n /dev/sdb1

ディスクをアンマウントしてから実行します。

-nオプションをつけるとチェックのみ行われます。とりあえず-nオプションをつけて実行し、問題がないか確認します。

-pオプションをつけると、エラーがある場合は修復が行われます。

→実際にやってみましたが、以下のようなエラーが大量に出た

Entry ‘hogehoge.mp4’ in <29491201>/<29360129> (29360129) has deleted/unused inode 29491311.

Pass 5: Checking group summary information
Block bitmap differences: -(70916096–71174827) –

pオプションをつけて修復してみたところ、正常にアクセスできるようになりました。

スポンサーリンク

再発

しばらくすると再び症状が再発。以下のようなエラーも出るようになりました。

「ls: ‘/mnt/hdd01/hogehoge’ にアクセスできません: 構造体を内容消去する必要があります」

マウントし直すだけでは治らず。

HDDケースのUSBを抜き差しすると治る。

一般的にはディスク故障の症状。だが・・・

  • lsコマンドで?が表示される
  • 一部のファイルが表示されない
  • ファイルにアクセスできない
  • エラーチェックで異常あり

こういった症状で一番考えられるのはディスクの破損と思われます。

ファイルシステムが破損していることが考えられ、ディスクに異常がある可能性が高いです。不良セクタの状況などをsmartctlなどで見てみることをおすすめします。

しかし、このディスクは今まで他のマシンで使用していましたが、まったく正常に動作していました。何ら異常はありませんでしたし、smart情報でもすべて正常でしたので、本当にディスクが悪いのか疑問なところです。

結論→HDDケースの省電力機能が原因っぽい

冒頭で記した通り、HDDはUSB接続のケース(ロジテック LHR-EKWU3BK)に入れて、ラズベリーパイ3Bに接続しています。

実はこのHDDケースには省電力機能が搭載されており、自動的にスピンダウンする仕様になっています。状況を確認したところ、省電力機能が作動した後にlsコマンドの表示に異常が起こっていることがわかりました。ファイルシステムのエラーもスピンアップ後に起こっており、USBを抜き差しすると復旧することもわかりました。

Linuxのファイルシステムにはキャッシュ機能があります。lsの表示を一度行うとキャッシュが生成されますが、HDDのスピンアップに時間がかかる影響で、ファイルシステムのキャッシュからの読み出しと実際のディスクへの問い合わせがうまく行かなくなっているのが原因かなと思います。

おそらくですが、以下のような感じでしょうか。

  1. lsを実行する
  2. メモリキャッシュ(pagecache,dentry,inode)に問い合わせが発生
  3. キャッシュされているファイルが表示される
  4. キャッシュされていないファイルについてはディスクに問い合わせが発生
  5. しかし、スピンアップに時間がかかりリストを取得できない

結果的に「?」が表示されたり、一部のファイルが表示されない、ファイルシステムのエラーに引っかかるなどのトラブルが起こっているのかなと思います。

一部のファイルが表示されるのは、キャッシュされているファイルが表示されているからみたいです。

ロジテックのHDDケース(LHR-EKWU3BK)

使用しているロジテックのHDDケース(LHR-EKWU3BK)ですが、作りはいいです。金属製なので放熱も良さそうですし、アクセスLEDも眩しくなく実用的な設計になっています。しかし、機能面はイマイチな印象。SMART情報がとれず、vendorにlogitecと表示されてしまったり、HDDの電源管理系コマンド(hdparm)もほぼ使用不可です。HDDケースってどれもこんなものなのでしょうかね。ノーブランド品の2.5インチケース(千円もしないやつ)はちゃんとSMART情報もhdparmも動作してくれるのに、ロジテックのケースももうちょっとどうにかならんかなと思ってしまう。

とりあえずキャッシュを削除したり、ディスクを使う前にマウントしなおして、あらかじめスピンアップさせたりすることで様子見することにしました。

ちなみにキャッシュ削除は以下のコマンドでできます。

# echo 3 > /proc/sys/vm/drop_caches

スピンアップはcronで定期的にddを動かしたりでもいけそうです。いろいろ考えてみます。

コメント

タイトルとURLをコピーしました