2012-11-12 8 views
2

df에 따르면 기기에 충분한 공간 (약 50G)이 있습니다.장치에 남은 공간이 없습니까?

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

왜이 밸 러스 코드가 다른 것을 나타낼 수 있습니까? 수 GLib.FileUtils 하나의 디렉토리에 처리 할 수있는 파일에

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 

한계가 출력한다? /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. Barmar는 의견 제안이이 BusyBox docs에 따라, DF -i는

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

아이 노드를 확인하는 또 다른 방법이 있나요 유효하기 때문에 홀수

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

의 원인처럼

아이 노드를 확인?

업데이트 [11-15-2012] : 폴더 당 파일 수가 너무 많아서 매일보다는 새 폴더를 열도록 코드가 수정되었지만 저장 후 여전히 죽어 버렸다고 생각했습니다. 44354 균등하게 분포 된 이미지 64GB SD 카드 중 16.7을 사용하는 7 개의 폴더

+1

'df -i db'로 inode가 부족한 지 확인하십시오. – Barmar

+0

임베디드 시스템이라면 어쩌면 읽기 전용으로 마운트되어 있을까요?/etc/fstab –

+0

'bmp.length'의 크기는 얼마나됩니까? – apmasell

답변

4

df는 컴파일 할 때 FEATURE_DF_FANCY이 활성화 된 경우 busybox에만 -i가 있습니다.

FAT32 볼륨의 경우 폴더에 저장할 수있는 최대 파일 수는 65,534 개입니다.

FAT32 디렉토리는 65,536 개의 디렉토리 항목을 가질 수 있습니다.

FAT32는 inode가없고 대신 커널에 의해 불안정하게 생성/에뮬레이트되어 캐싱됩니다.

제공된 코드 및 오류 메시지를 따르십시오.

먼저 표시된 메시지와 관련된 오류는 here에 따라 ENOSPC No space left on device입니다.

FileUtils.set_data은 입심 fileutils에 속하는 명령어는 함수를 호출 g_file_set_contents

g_file_set_contents이 같은에서 다음 함수를 호출 (Windows가 IFDEF에 따라 다음에 추가 논리가) Linux에서

(소스를 발라 메시지 here 커밋 here에 위치) 소스 파일 gfileutils.귀하의 오류 메시지로 C

  • write_to_temp_file
  • rename_file
  • g_unlink

/db/20121112/165206.0.bmp하지 db/20121112/165206.0.bmp.9X8PNW, ENOSPCwrite_to_temp_file입니다 반환하는 기능을 언급하고있다.

오류 메시지의 다른 부분 (Failed to create file)에서 오류를 발생시키는 함수 호출은 g_mkstemp_full이므로 파일 설명자 fd의 초기 값 설정에 해당하는 것으로 알고 있습니다.

이 파일은 의 값을 결정하는 데 사용되는 GTmpFileCallback 인 wrap_g_open을 호출하는 get_tmp_file을 호출합니다.

wrap_g_open (해당 전화 번호는 gstdio.c)이 해당 이름에 해당합니다.

g_openhere으로 문서화되어 있으며, 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을 반환하는 소스 파일이 2 개뿐입니다.

/source/fs/fat/dir.c의 특정 오류 상태 됨으로써 ENOSPC를 반환하는 함수는 디렉토리 엔트리 수가 는 FAT32위한 2097152.

로 평가되는 최대 디렉토리의 크기보다 큰 경우는이 작업을 수행하는, fat_add_entries이고 /source/fs/fat/fatent.c에서 ENOSPC을 직접적으로 반환하는 함수는 fat_alloc_clusters이며, 수퍼 블록 정보에 따라 사용 가능한 클러스터의 수가 인 경우 할당 할 클러스터 수보다 적을 때 수행합니다.

FAT32 파일 시스템을 사용하는 볼륨에서 가능한 최대 클러스터 수는 here에 따라 268,435,445입니다.

게시 한 format 명령은 mkdosfs 기본값 인 클러스터 당 2 섹터를 사용합니다. -s, -R을 비롯한 다양한 옵션을 지정하면 사용 가능한 클러스터 수를 변경할 수 있지만 디스크 처리량을 높이기 위해 128KB 블록을 정렬하는 용도로만 사용됩니다.

SD 카드가 얼마나 많은 섹터인지 알 수 없으므로 총 클러스터 수를 계산할 수 없습니다.

최대 디렉토리 크기 (내가 확신 할 수는 없지만)를 초과했다고 생각하지 않으므로 SD 카드의 사용 가능한 클러스터 수와 관련 있다고 생각됩니다.

SD 카드가 정상적으로 클러스터에서 분리되었거나 파일 시스템이 클러스터 외부에 있다고 생각합니다. 파일 시스템에서 fsck (파일 시스템 검사)를 실행하면 도움이 될 수 있습니다.

다른 SD 카드가 동일한 방식으로 작동합니까?

+0

+1, 멋진 추적 – drahnr

+0

아직 수리 할 기회가 없었지만 유효 기간이 만료되기 전에 현상금을 수여하고 싶었습니다. – jacknad

관련 문제