Armadilloフォーラム

SDへの書き込み競合について

saw

2017年4月24日 21時02分

SDカードへの書き込みを考えています。

プロセスAから、SDカードへの読み書きを定期的に行っている(/mnt/sdcard1/Aとする)中で、
別のプロセスBからSDへの読み書きを同時に行った(/mnt/sdcart1/Bとする)場合、
競合してファイルの書き込みが失敗したりすることは起こり得るのでしょうか。

もしくは、Linuxのファイルシステムが、競合せずに順番に書き込みをしてくれるのでしょうか。
(もしくは、SDIOドライバが順番に処理してくれる?)

コメント

kes-konishi

2017年4月25日 0時20分

KES)小西です。

> プロセスAから、SDカードへの読み書きを定期的に行っている(/mnt/sdcard1/Aとする)中で、
> 別のプロセスBからSDへの読み書きを同時に行った(/mnt/sdcart1/Bとする)場合、
> 競合してファイルの書き込みが失敗したりすることは起こり得るのでしょうか。
/mnt/sdcard1/A
/mnt/sdcard1/B
とのことで、別ファイルへのアクセスとのことでしょうか?

> もしくは、Linuxのファイルシステムが、競合せずに順番に書き込みをしてくれるのでしょうか。
> (もしくは、SDIOドライバが順番に処理してくれる?)
Linux一般的な話として
別ファイルとのことであれば、競合することはありません。
競合しているのであれば、どのLinux(サーバも含め)動作していないです。

800 EVAなので、2.6系を使用されており、
SDカードなのでフォーマットはFAT32を使用していると思いますが、
ファイルシステムのブロック単位で排他がかかると思います。
SDカードなので、デフォルトは4K単位だと思います。

800 EVAのSD(eMMC含む)ドライバでもそのような不具合は
こちらでも発生したことは無いです。
また、800 EVAの場合はルートFSもeMMCなので、
syslog、dmseg等も書き込みしてますから、
eMMCでファイルが壊れることになると思いますよ。

unmountせずにSDを抜いたりした場合はFATのキャッシュがフラッシュアウトする前に
抜かれるため、管理領域 or データ領域が壊れる可能性はあります。
管理領域が壊れて不一致が起きると、同一のデータ領域に対して
管理領域が参照した場合は起き得るかもしれません。
(FATがジャーナリングしてないので、ファイルへのアクセスの仕方で
データ領域が再利用される可能性があります。)

saw

2017年5月8日 19時40分

KES)小西様
ご返信ありがとうございます。

> /mnt/sdcard1/A
> /mnt/sdcard1/B
> とのことで、別ファイルへのアクセスとのことでしょうか?
⇒はい、別ファイルへのアクセスになります。

> Linux一般的な話として別ファイルとのことであれば、競合することはありません。
> 競合しているのであれば、どのLinux(サーバも含め)動作していないです。
> 800 EVAなので、2.6系を使用されており、SDカードなのでフォーマットはFAT32を使用していると思いますが、
> ファイルシステムのブロック単位で排他がかかると思います。SDカードなので、デフォルトは4K単位だと思います。
> 800 EVAのSD(eMMC含む)ドライバでもそのような不具合はこちらでも発生したことは無いです。
> また、800 EVAの場合はルートFSもeMMCなので、
> syslog、dmseg等も書き込みしてますから、eMMCでファイルが壊れることになると思いますよ。
⇒ファイルシステムがブロック単位で、排他で書き込む様な動きをするということですね。
 であれば、誰がタイミングを考慮せずに書き込もうが、問題になることはなさそうですね。

> unmountせずにSDを抜いたりした場合はFATのキャッシュがフラッシュアウトする前に抜かれるため、管理領域 or データ領域が壊れる可能性はあります。
> 管理領域が壊れて不一致が起きると、同一のデータ領域に対して管理領域が参照した場合は起き得るかもしれません。
> (FATがジャーナリングしてないので、ファイルへのアクセスの仕方でデータ領域が再利用される可能性があります。)
⇒書き込み中にSDカードを抜いたりする様な場合は、壊れる可能性があるということですね。(一般的なことかもしれませんが)
 動きも合わせてご教示頂きありがとうございます。