web-dev-qa-db-ja.com

sdcardの量がfat-fsを汚れたままにする

SDフラッシュカードをUSBカードリーダーにマウントしてからカードを抜くと、ファイルシステムが「ダーティ」のままになります。

システム:

  • RPiまたはxubuntu16.04.3
  • カードリーダーは超安価な中国製です。私はいくつかの異なるものを試しました
  • 私はたくさんの異なるSDカードを試しました。

再現方法:

  1. カードリーダーを接続する
  2. 最初のパーティションにvfat付きのSDカードを挿入します
  3. システムがSDカードを検出するのを待つ
  4. システムがファイルシステムを自動マウントするか、手動でマウントするのを待ちます
  5. ランダムファイルを更新します。_date >> /media/mogul/2E3E-AE54/d_
  6. アンマウント:_Sudo umount /dev/sdd1_
  7. (プレースホルダー、ここではまだ何もしません)
  8. カードリーダーからSDカードを引き出す

ステップ2から繰り返します。dmesgに注目してください。次のように表示されます。

[357207.805594] FAT-fs (sdd1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.

(新しいLinuxのサポート_dmesg -w_)

ここで、umountの後にアクションを追加すると

  1. 次のように、SDカードのランダムなバイトを読み取ります:_dd if=/dev/sdd1 skip=1000000 ibs=1 count=1 of=/dev/null_

ファイルシステムは存続しているようです。

これは私には少しハックなようですが、基本的なものが欠けていますか?

もっとエレガントな解決策はありますか?

私はejectを使用したくないのですが、_umount, since_ eject`だけがカードリーダーの電源を切ります。カードリーダーを再接続する前に、システムが新しいSDカードを検出しません。

3
mogul

ステップ7として、次のことを試してください。

echo 1 | Sudo tee /sys/block/sdd/device/delete

または、rootとして実行している場合は、

echo 1 > /sys/block/sdd/device/delete

これは、そのデバイスがカーネルに/dev/sddが削除されようとしており、ファイルシステムの破損を回避するために、カードへの残りの書き込みバッファの制御されたフラッシュをトリガーする必要があります。

これにより、リーダーはejectコマンドと同様に電源が切れる可能性があります。もしそうなら、別の方法は、差し迫ったデバイスの取り外しを意味することなく、バッファをフラッシュすることです。これは、blockdevコマンドで実行できます。

Sudo blockdev --flushbufs /dev/sdd

これで問題が解決しない場合は、カードリーダーがカードのホットプラグ解除をサポートしていない可能性があります。これは安価なリーダーで可能です。このようなリーダーを安全に使用する唯一の方法は、最初にリーダーをUSBポートから取り外してから、カードをリーダーから取り外すことです。

4
telcoM

手順7でコマンドsyncを発行すると、バッファキャッシュがSDカードに書き込まれ、ファイルシステムがクリーンになります。

0
Bernhard