5

dfによると、デバイスには十分な(約50G)スペースが残っています。

/ # df db
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mmcblk0p3        61812032  11308736  50503296  18% /db

このvalaコードが別のことを示しているのはなぜですか?

try 
{
    FileUtils.set_data(bmp_path, bmp);
} 
catch (Error e)
{
    printf("Error! FileUtils.set_data %s\n%s\n", bmp_path, e.message);
}                             

もちろん、コードは出力されます

Error! FileUtils.set_data /db/20121112/165206.0.bmp
Failed to create file '/db/20121112/165206.0.bmp.9X8PNW': No space left on device

GLib.FileUtilsが1つのディレクトリで処理できるファイルの数に制限はありますか?/ db / 20121112には、27220ファイル(半分のjpegと半分のbmp)が含まれています。

mmcblk0p3はこのように作成されました

echo -e "n\np\n3\n66\n\nt\n3\nc\nw" | fdisk /dev/mmcblk0

このようにフォーマットされています

mkfs.vfat -n DB -F 32 /dev/mmcblk0p3

これはおそらく気にしないでしょうが、デバイスは64G SDカードであり、mmcblk0p1とmmcblk0p2がブートとrootfsに使用されます。

Barmarがこのようなコメントで示唆したようにiノードをチェックすると、

df: invalid option -- 'i'
BusyBox v1.18.2 (2012-11-09 13:08:26 EST) multi-call binary.

BusyBoxのドキュメントによると、df -iが有効であるため、これは奇妙なことです。

df [-Pkmhai] [-B SIZE] [FILESYSTEM...]
-i Inodes

iノードをチェックする別の方法はありますか?

更新[11-15-2012]:問題はフォルダーあたりのファイル数が多すぎる可能性があると考えたため、コードを変更して、毎日ではなく1時間ごとに新しいフォルダーを開くようにしましたが、16.7を使用して7つのフォルダーに均等に分散された44354枚の画像を保存した後も停止しました64GBSDカードの。

4

1 に答える 1

8

dfは、コンパイル時に有効になっている場合、busyboxに-iしかありませんFEATURE_DF_FANCY

FAT32ボリュームの場合、フォルダーに保存できるファイルの最大数は65,534です。

FAT32ディレクトリには、65,536個のディレクトリエントリを含めることができます。

FAT32にはiノードがありません。代わりに、カーネルによってオンザフライで不安定に生成/エミュレートされ、キャッシュされます。

提供されたコードとエラーメッセージに従います。

まず、表示されるメッセージに関連するエラーは、次の ENOSPC No space left on deviceとおりです

FileUtils.set_dataglib fileutils関数を呼び出しますg_file_set_contents(ソースはここにあり、Valaコミットメッセージはここにあります)

Linuxの場合(Windowsには、ifdefに基づいて従う追加のロジックがあります)

g_file_set_contents同じソースファイルgfileutils.cで次の関数を呼び出します

  • write_to_temp_file
  • rename_file
  • g_unlink

エラーメッセージにどちらがそうでdb/20121112/165206.0.bmp.9X8PNWないかが記載されている/db/20121112/165206.0.bmpように、返される関数はENOSPCですwrite_to_temp_file

エラーメッセージの他の部分( )から、エラーの原因となる関数呼び出しは、ファイル記述子fdの初期値を設定するために応答しているものであることがFailed to create fileわかります。g_mkstemp_full

これはget_tmp_file、を呼び出します。これwrap_g_openは、ファイル記述子の値を決定するために使用されるGTmpFileCallbackですfd

wrap_g_openg_opengstdio.cにある)その名前に忠実な呼び出し。

g_openここopenに記載されている呼び出しと、ENOSPCがとして記述されている場所。pathname was to be created but the device containing pathname has no room for the new file

ENOSPCFATのカーネルソースコードには、/source/fs/fat/dir.cとを返す2つのソースファイルしかありません/source/fs/fat/fatent.c

あるエラー状態で/source/fs/fat/dir.c 戻る関数では、ディレクトリエントリの数がFAT32で2097152と評価される最大ディレクトリサイズよりも大きい場合にこれを行います。ENOSPCfat_add_entries

を直接/source/fs/fat/fatent.c返す関数では、スーパーブロック情報による空きクラスターの数が、割り当てを要求されたクラスターの数より少ない場合にこれを行います。ENOSPCfat_alloc_clusters

FAT32ファイルシステムを使用するボリューム上のクラスターの可能な最大数は、ここに示すように268,435,445です。

投稿したformatコマンドは、クラスターごとに2セクターのデフォルトのmkdosfsを使用します。-s、-Rなどのさまざまなオプションを指定すると、使用可能なクラスターの数が変わる可能性がありますが、私が見た唯一の使用法は、ディスクスループットを向上させるための128KBブロックとの調整です。

SDカードのセクター数がわからないため、クラスターの総数を計算できません。

ディレクトリの最大サイズを超えているとは思いませんが(確かではありませんが)、SDカードの空きクラスタの数に関係していると思います。

SDカードが正当にクラスターから外れているか、ファイルシステムがSDカードがクラスターから外れていると見なしているだけです。ファイルシステムでfsck(ファイルシステムチェック)を実行すると役立つ場合があります。

別のSDカードも同じように動作しますか?

于 2012-11-29T20:43:56.720 に答える