0

我发现了很多链接,但几乎所有链接都指向修复而不是原因。

我在通过 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 开始,并且之前的 lseek() 调用write()也执行SEEK_SET到 0,这将覆盖超级块信息。我将在远离超级块之前尝试 lseek write()

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 。现在文件系统没有损坏。

4

1 回答 1

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 文件系统没有损坏。

于 2014-06-12T06:31:00.300 回答