Не осталось свободного места на устройстве?
Согласно 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-карта ведет себя так же?