Не осталось свободного места на устройстве?

Согласно df на устройстве осталось достаточно места (около 50G).

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

Почему этот код может указывать иначе?

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 может обрабатывать в одном каталоге? / 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

Это, вероятно, не важно, но устройство представляет собой SD-карту 64G, а mmcblk0p1 и mmcblk0p2 используются для загрузки и rootfs.

Проверка inode, как предложил Бармар в комментариях, приводит к

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

Есть ли другой способ проверить иноды?

Обновление [11-15-2012]: Я думал, что проблема может быть в слишком большом количестве файлов в папке, поэтому я изменил код, чтобы открывать новую папку ежечасно, а не ежедневно, но он все еще не работал после сохранения 44354 изображений, равномерно распределенных в 7 папках с использованием 16,7 64 ГБ SD-карты.

1 ответ

Решение

У df есть только -i в busybox, если FEATURE_DF_FANCY включен при его компиляции.

Для томов FAT32 максимальное количество файлов, которые можно сохранить в папке, составляет 65 534.

Каталог FAT32 может иметь 65 536 записей каталога.

FAT32 не имеет inode, вместо этого они нестабильно генерируются / эмулируются ядром и кэшируются.

После кода и сообщения об ошибке предоставляется.

Во-первых, ошибка, связанная с сообщением, которое вы видите, ENOSPC No space left on device согласно здесь.

FileUtils.set_data вызывает функцию glib 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,

Из другой части вашего сообщения об ошибке (Failed to create file) мы знаем, что вызов функции, которая вызывает ошибку g_mkstemp_full так как именно это отвечает за установку начального значения файлового дескриптора fd.

Это звонки get_tmp_file, который называет wrap_g_openэто GTmpFileCallback, который используется для определения значения дескриптора файла fd,

wrap_g_open звонки g_open (который живет в gstdio.c) верный своему имени.

g_open звонки open который задокументирован здесь и где ENOSPC описывается как pathname was to be created but the device containing pathname has no room for the new file,

В исходном коде ядра для FAT есть только два исходных файла, которые возвращают ENOSPC, /source/fs/fat/dir.c а также /source/fs/fat/fatent.c,

В /source/fs/fat/dir.c функция, которая возвращает ENOSPC находясь в определенном состоянии ошибки fat_add_entries, он делает это, когда число записей каталога превышает максимальный размер каталога, который для FAT32 оценивается как 2097152.

В /source/fs/fat/fatent.c функция, которая возвращает ENOSPC прямо fat_alloc_clustersон делает это, когда количество свободных кластеров в соответствии с информацией о суперблоке меньше количества кластеров, запрошенных для выделения.

Максимально возможное количество кластеров на томе, использующем файловую систему FAT32, составляет 268 435 445, как здесь.

Отправленная вами команда форматирования использует значение по умолчанию mkdosfs 2 сектора на кластер. Задание различных параметров, в том числе -s, -R, может изменить количество доступных кластеров, хотя единственное использование, которое я видел, это выравнивание с блоками 128 КБ для увеличения пропускной способности диска.

Я не знаю, сколько секторов имеет ваша SD-карта, поэтому я не могу подсчитать общее количество кластеров.

Я не верю, что вы превысили максимальный размер каталога (хотя я не уверен), поэтому я считаю, что это связано с количеством свободных кластеров на SD-карте.

Либо ваша SD-карта законно вне кластеров, либо файловая система просто думает, что она вне кластеров. Запуск fsck (проверка файловой системы) в файловой системе может помочь.

Разве другая SD-карта ведет себя так же?

Другие вопросы по тегам