登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

飞哥的技术博客

世上无难事,只怕有心人!

 
 
 

日志

 
 
 
 

e2fsck: Bad magic number in super-block_Linux学习  

2009-07-13 23:23:18|  分类: Linux |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
e2fsck: Bad magic number in super-block
2008年01月10日 星期四 下午 04:38
在vmware里 导入数据库 空间不够 随加了快虚拟盘 然后
fdisk /dev/hdb
e2fsck /dev/hdb1
结果提示 bad magic number in super-block
执行mke2fs /dev/hdb1
mount /dev/hdb1 /mnt

是自己没搞清楚命令和磁盘组织形式
man e2fsck
e2fsck is used to check a Linux second extended file system (ext2fs).
man mke2fs
mke2fs is used to create an ext2/ext3 filesystem (usually in a disk partition).
man tune2fs
tune2fs allows the system administrator to adjust various tunable filesystem parameters on Linux ext2/ext3 filesystems.

自:http://cache.baidu.com/c?word=bad%2Cmagic%2Cnumber%2Cin%2Csuper%3B%2D%3Bblock&url=http%3A//www%2Eblogcn%2Ecom/user26/bb%5Fsun/blog/5757840%2Ehtml&p=8b2a944791d015f208e297757f5985&user=baidu
先熟悉一下文件系统吧.

ext2/3最重要应该要算超级块了.超级块存储在文件系统的块1(从0开始编号)中,包含了编档系统配置的所有信息,而且用mount命令装载文件系统时,是要检查超级块的,如果不符合要求则会装载失败.

至于mkswap的实现可以在util-linux包的disk-utils目录下找到(开源的好处呵呵).
看 一下代码可知mkswap调用init_signature_page()和write_signature()函数处理signature_page指 针指向的内存区,然后把该内存区的内容通过write系统调用写回磁盘分区的前1536-4096(version 1)或512-4096(version 0)处, 而该处正是分区超级块的位置.
难怪mkswap后文件系统就mount不上去了

超级块都被覆盖了,难道只能束手待毙吗?
不,文件系统的设计者早就留了一手后招

看一下ext2fs的结构图:
代码:
---------------------------------------
|引导扇区 | 块组0 |...... | 块组N-1 | 块组N | <== 分区结构
---------------------------------------
/ \
/ \
/ \
/ \
/ \
|----------------------------------------------------|
| 超级块 | 组描 | 块位图 | 信息节点 | 信息节|数据 |
| |述符 | | 位图 |点表 | | <== 块组结构
|----------------------------------------------------|
磁 盘上块与块之间并不是孤立的,为了访问的效率,许多相邻的块又被组织成块组.基于超级块的重要性,它的备份副本存储在整个文件系统的块组中(啊,早就知道 天无绝人之路^_^).我看的资料上说每个块组都会保留一份副本,但以我的实践来看,并不全然,也许是为了节省空间吧.
代码:
# mke2fs -n /dev/hda5
mke2fs 1.35 (28-Feb-2004)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
647680 inodes, 1293224 blocks
64661 blocks (5.00%) reserved for the super user
First data block=0
40 block groups
32768 blocks per group, 32768 fragments per group
16192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736

注意,-n使mke2fs不真正格式化分区,而只打印分区后的信息.
留意一下最后两行以及每个块组中包含的块的数目,就可算出到底哪几个块组中存在备份的超级块了
其次,分区中超级块的副本数目也是和块大小息息相关的
代码:
# mke2fs -n /dev/hda5 -b 1024
mke2fs 1.35 (28-Feb-2004)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
647168 inodes, 5172896 blocks
258644 blocks (5.00%) reserved for the super user
First data block=1
632 block groups
8192 blocks per group, 8192 fragments per group
1024 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409, 663553,
1024001, 1990657, 2809857, 5120001
可以看出,前者的块大小是4k,而后者是1k,块越小,每个块组包含的块数也会减少,超级块的副本数会增加.

虽然文件系统中超级块存在不止一份,但在装载文件系统时,通常只读取块组0中的超级块.如果超级块损坏,则装载出错,并且提示运行e2fsck.
e2fsck默认也是读取块组0中的超级块,但这一行为会受-b参数的影响.
代码:
# mount /dev/hda5 /mnt
/dev/hda9 looks like swapspace - not mounted
mount: you must specify the filesystem type

# e2fsck /dev/hda5
e2fsck 1.35 (28-Feb-2004)
e2fsck: Badmagicnumberinsuper-block while trying to open /dev/hda5

The superblock could not be read or does not describe a correct ext2
filesystem. If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
e2fsck -b 8193

# e2fsck /dev/hda5 -b 8139 <==看到了吧,8139块上并不一定有超级块的备份
e2fsck 1.35 (28-Feb-2004)
e2fsck: Badmagicnumberinsuper-block while trying to open /dev/hda5

The superblock could not be read or does not describe a correct ext2
filesystem. If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
e2fsck -b 8193
由 此可知8193块中并不一定有超级块的副本,这是由块组中块的数目决定的,而归根结底又取决于块的大小.如果你创建分区时用了默认的块大小,则可用 mke2fs -n命令打印出超级块副本所在块的块号,然后以所得块号为参数,运行e2fsck,系统会自动修复块组0中的超级块. 修复完后就可以成功挂载了.

2.修复

步骤很简单
因为我创建分区时用的是默认参数,现在只要用mke2fs -n找出超级块备份的位置,然后用e2fsck修复就行了
代码:
# mke2fs -n /dev/hda5
mke2fs 1.35 (28-Feb-2004)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
611648 inodes, 1222940 blocks
61147 blocks (5.00%) reserved for the super user
First data block=0
38 block groups
32768 blocks per group, 32768 fragments per group
16096 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736

#e2fsck -b 32768 /dev/hda5
接下来只要一路按y,系统就会自动把超级块修好



©2009 Baidu



引文来源  e2fsck: Bad magic number in super-block_Linux学习
  评论这张
 
阅读(3077)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018