设备上没有剩余空间?

jac*_*nad 5 glib vala embedded-linux fileutils

根据df,设备上有足够的空间(约50G).

/ # df db
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mmcblk0p3        61812032  11308736  50503296  18% /db
Run Code Online (Sandbox Code Playgroud)

为什么这个vala代码会另外表示?

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

当然,代码打印出来

Error! FileUtils.set_data /db/20121112/165206.0.bmp
Failed to create file '/db/20121112/165206.0.bmp.9X8PNW': No space left on device
Run Code Online (Sandbox Code Playgroud)

GLib.FileUtils可以在一个目录中处理的数量文件是否有限制?/ db/20121112包含27220个文件(半个jpeg和半个bmp).

mmcblk0p3是这样创建的

echo -e "n\np\n3\n66\n\nt\n3\nc\nw" | fdisk /dev/mmcblk0
Run Code Online (Sandbox Code Playgroud)

并格式化如下

mkfs.vfat -n DB -F 32 /dev/mmcblk0p3
Run Code Online (Sandbox Code Playgroud)

这可能是一个不在乎但设备是64G SD卡和mmcblk0p1和mmcblk0p2用于启动和rootfs.

在这样的评论中建议将inode检查为Barmar

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

这是奇怪的,因为根据BusyBox文档,df -i是有效的

df [-Pkmhai] [-B SIZE] [FILESYSTEM...]
-i Inodes
Run Code Online (Sandbox Code Playgroud)

有没有其他方法来检查inode?

更新[2012年11月15日]:我认为问题可能是每个文件夹的文件太多,所以我修改了代码,每小时而不是每天打开一个新文件夹但是在使用16.7保存44354个图像均匀分布在7个文件夹中之后它仍然死亡一张64 GB的SD卡.

App*_*234 7

df在busybox中只有-i,如果FEATURE_DF_FANCY在编译时启用了.

对于FAT32卷,可以存储在文件夹中的最大文件数为65,534.

FAT32目录可以有65,536个目录条目.

FAT32没有inode,而是由内核在运行中不稳定地生成/模拟并缓存.

下面是代码和提供的错误消息.

首先你看到的消息相关联的错误是 ENOSPC No space left on device这里.

FileUtils.set_data调用油嘴文件实用程序功能g_file_set_contents(源位于此处,伐拉提交消息此处)

在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,返回的函数ENOSPCwrite_to_temp_file.

从错误消息(Failed to create file)的另一部分我们知道导致错误的函数调用g_mkstemp_full就是响应设置文件描述符fd的初始值的那个.

这个调用get_tmp_file调用了wrap_g_openGTmpFileCallback,它用于确定文件描述符的值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 返回的函数中,当目录条目的数量大于FAT32的最大目录大小时,它会执行此操作,因为它被评估为2097152.ENOSPCfat_add_entries

在直接/source/fs/fat/fatent.c返回的函数中,当根据超级块信息的空闲簇的数量小于请求分配的簇的数量时,它执行此操作.ENOSPCfat_alloc_clusters

使用FAT32文件系统的卷上的最大可能簇数为268,435,445(此处为).

您发布的format命令使用mkdosfs默认值为每个群集2个扇区.指定各种选项(包括-s,-R)可能会更改可用的群集数量,但我所看到的唯一用途是与128KB块对齐以增加磁盘吞吐量.

我不知道你的SD卡有多少扇区,我无法计算集群总数.

我不相信你已超过最大目录大小(虽然我不能确定),所以我认为它与SD卡上的免费群集数量有关.

您的SD卡合法地不在群集中,或者文件系统只是认为它不在群集中.在文件系统上运行fsck(文件系统检查)可能会有所帮助.

不同的SD卡的行为方式是否相同?