0

多くのリンクを見つけましたが、ほとんどすべてが理由ではなく修正を指しています。

USBカードリーダーを介してPCに接続されたSDカードに7GBのext4パーティションを作成しました。上記のパーティション (/dev/sdc2) に 10488576 バイトを書き込むアプリケーションがあります。アプリケーションの実行後、ファイル システムが破損しているように見えます。

#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()も0 に対して行われていることがわかりSEEK_SETます。これにより、スーパーブロック情報が上書きされます。スーパーブロックの前に 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

だから、書く前に、私は 8593*4096 に lseek しました。これで、ファイルシステムは壊れなくなりました。

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

だから、書く前に私はlseek8593 * 4096にしました.今、ファイルシステムは壊れていません.

于 2014-06-12T06:31:00.300 に答える