2014-06-10 136 views
0

我發現很多鏈接,但幾乎所有的都指向修復不是原因。Filesystem-ext4:應用程序破壞超級塊

我在通過USB讀卡器連接到PC的SD卡上創建了一個7GB的ext4分區。我有一個應用程序正在寫入10488576字節到提到的分區(/ dev/sdc2)。該應用程序後運行文件系統正在損壞:

#fsck.ext4 -v /dev/sdc2 
e2fsck 1.42.8 (20-Jun-2013) 
ext2fs_open2: Bad magic number in super-block 
fsck.ext4: Superblock invalid, trying backup blocks... 
Superblock has an invalid journal (inode 8). 
Clear<y>? no 
fsck.ext4: Illegal inode number while checking ext3 journal for /dev/sdc2 

/dev/sdc2: ***** FILE SYSTEM WAS MODIFIED ***** 

/dev/sdc2: ********** WARNING: Filesystem still has errors ********** 



#dumpe2fs /dev/sdc2 
dumpe2fs 1.42.8 (20-Jun-2013) 
dumpe2fs: Bad magic number in super-block while trying to open /dev/sdc2 
Couldn't find valid filesystem superblock. 

該應用程序是簡單地使用類似下面(我不能發佈確切的代碼):

char *write_buf; //declared in header 
    write_buf = (char *) malloc(size) // where size = 10488576. This allocation is happening in function a() called from main 
    char *buf; // declared locally in function b() 
    buf = write_buf; // in function b() 
    write(fd,buf,size); // in function b() 

文件系統的塊大小爲4K。 備份超級塊在32768,98304,163840,229376,294912,819200,884736,1605632 讓我知道是否需要更多信息。我需要了解可能導致這種腐敗的原因,因爲我非常肯定應用程序代碼可能有問題。

EDIT: 我可以看到,主超級從0開始,並write()前lseek的()調用也做SEEK_SET爲0,這將覆蓋超級塊的信息。我將在write()之前嘗試遠離超大塊的lseek。

EDIT 我已經通過這樣做了,正如我上面提到的那樣。按照dumpe2fs O/P我有以下組0:

Group 0: (Blocks 0-32767) 
    Checksum 0x8bba, unused inodes 8069 
    Primary superblock at 0, Group descriptors at 1-1 
    Reserved GDT blocks at 2-474 
    Block bitmap at 475 (+475), Inode bitmap at 491 (+491) 
    Inode table at 507-1011 (+507) 
    24175 free blocks, 8069 free inodes, 2 directories, 8069 unused inodes 
    Free blocks: 8593-32767 
    Free inodes: 12-8080 

所以寫之前我做了lseek的到8593 * 4096。現在的文件系統是沒有得到損壞。

+0

你的問題有點不清楚: 你是在寫一個10488576字節到一個駐留在從'/ dev/sdc2'掛載的ext4文件系統上的文件,還是直接打開'/ dev/sdc2'? ? – 6EQUJ5

+1

因爲如果它是第二個,根據定義,這將破壞文件系統... – 6EQUJ5

+0

將原始數據寫入分區會毀壞分區,因爲您正在覆蓋所有的開銷內容(包括幻數,您的安裝軟件清楚) – Happington

回答

0

我已經通過這樣做了,正如我上面提到的。按照dumpe2fs O/P我有以下組0:

Group 0: (Blocks 0-32767) 
    Checksum 0x8bba, unused inodes 8069 
    Primary superblock at 0, Group descriptors at 1-1 
    Reserved GDT blocks at 2-474 
    Block bitmap at 475 (+475), Inode bitmap at 491 (+491) 
    Inode table at 507-1011 (+507) 
    24175 free blocks, 8069 free inodes, 2 directories, 8069 unused inodes 
    Free blocks: 8593-32767 
    Free inodes: 12-8080 

所以寫之前我做了lseek到8593 * 4096.Now文件系統沒有得到損壞。

+0

在此處回答,以便我可以接受答案,並且標記已關閉。 –