2012-11-12 120 views
2

根据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可以在一个目录里? /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。

检查的inode的Barmar的意见提出这样使

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

这是奇怪的,因为根据BusyBox docs,DF -i有效

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

有另一种方式来检查的inode?

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

+1

检查您是否用尽了inode与'df -i db'。 – Barmar

+0

如果它是嵌入式系统,也许它是以只读方式挂载的?/etc/fstab –

+0

'bmp.length'有多大? – apmasell

回答

4

DF只有-i在busybox的,如果FEATURE_DF_FANCY编译时被启用。

对于FAT32卷可以存储在一个文件夹 文件的最大数量为65,534。

一个FAT32目录可以有65536个目录条目。

FAT32没有索引节点,而不是他们产生不稳定/内核模拟的飞行和缓存。

继代码和提供的错误信息。

首先你看到的消息相关联的错误是ENOSPC No space left on devicehere

FileUtils.set_data调用油嘴fileutils中起作用g_file_set_contents(源位于here,伐拉提交消息here

在Linux(Windows有一个基于IFDEF跟着附加逻辑)

g_file_set_contents调用相同的以下功能源文件gfileutils。ç

  • 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_open,即它被用来确定文件描述符fd的值GTmpFileCallback。

wrap_g_open致电g_open(住在gstdio.c)与其名称相同。

g_open调用open其被记录here并且其中ENOSPC被describled作为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,当根据超级块信息的空闲群集数量 小于请求分配的群集数量时,它执行此操作。

根据here,使用FAT32文件系统的卷上的最大可能群集数为268,435,445。

您发布的format命令使用每个群集2个扇区的mkdosfs默认值。指定包括-s,-R在内的各种选项可能会改变可用集群的数量,尽管我已经看到它的唯一用途是与128KB块对齐以增加磁盘吞吐量。

我不知道SD卡有多少扇区,所以我无法计算出簇的总数。

我不相信你已经超过了最大目录大小(虽然我不能确定),所以我相信它与SD卡上的空闲簇的数量有关。

您的SD卡合法地脱离了群集,或者文件系统认为它没有群集。在文件系统上运行fsck(文件系统检查)可能会有所帮助。

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

+0

+1,漂亮的追踪 – drahnr

+0

尚未有机会修复此问题,但想在奖励过期之前授予赏金。 – jacknad

相关问题