2012-11-12 122 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

相關問題