C 文件系统-ext4:应用程序损坏超级块

C 文件系统-ext4:应用程序损坏超级块,c,filesystems,ext4,superblock,C,Filesystems,Ext4,Superblock,我发现了很多链接,但几乎都指向修复而不是原因 我在通过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, tryi

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

我在通过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.
文件系统块大小为4K。 备份超级块:32768、98304、163840、229376、294912、819200、884736、1605632 如果需要更多信息,请告诉我。我需要了解可能导致这种损坏的原因,因为我非常肯定应用程序代码可能有问题

编辑: 我可以看到主超块从0开始,写之前的lseek调用也将SEEK_设置为0,这将覆盖超块信息。在写之前,我将尝试远离超级块的lseek

编辑: 我已经按照我上面提到的方法解决了这个问题。根据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
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

所以在写这篇文章之前,我对8593*4096进行了lseek测试。现在文件系统没有损坏。

我已经按照上面提到的方法修复了这个问题。根据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
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

所以在写之前,我对8593*4096进行了lseek检查。现在文件系统没有损坏。

您的问题有点不清楚:您是在向驻留在从/dev/sdc2装入的ext4文件系统上的文件写入10488576字节,还是实际直接打开/dev/sdc2并写入do?因为如果是第二个,根据定义,这将损坏文件系统…将原始数据写入分区会破坏分区,因为您正在覆盖所有开销,包括装载软件明显拾取的幻数。@6eqj5是的,应用程序正在打开/dev/sdc2,然后在检索到的fd上执行写操作。所以根据你的评论,这就是问题所在。mmap有什么帮助吗?你能推荐一个更好的方法吗?挂载文件系统,然后写入它?!