我發現很多鏈接,但幾乎所有的都指向修復不是原因。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。現在的文件系統是沒有得到損壞。
你的問題有點不清楚: 你是在寫一個10488576字節到一個駐留在從'/ dev/sdc2'掛載的ext4文件系統上的文件,還是直接打開'/ dev/sdc2'? ? – 6EQUJ5
因爲如果它是第二個,根據定義,這將破壞文件系統... – 6EQUJ5
將原始數據寫入分區會毀壞分區,因爲您正在覆蓋所有的開銷內容(包括幻數,您的安裝軟件清楚) – Happington