文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>mkswap的挽救方法[转]

mkswap的挽救方法[转]

时间:2005-12-05  来源:山中无老虎

背景见此帖http://www.linuxsir.com/bbs/showthr...98&page=1&pp=15
如果系统提供什么unmkswap之类的命令,我就不必在此婆婆妈妈了.可惜一直没找到,我才有机会在此唠叨.
本方法的适用前提大概有一下几点
1.mkswap前的分区的文件系统必须是ext2/ext3
2.尚未swapon该分区
3.必须有另一个linux系统(有root权限)或livecd

其实,修复的步骤很简单,直须要一两个命令就行了.但最重要的是知其所以然.

1.原理

先熟悉一下文件系统吧.

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

 

[小插曲:在Linux里,各种设备和分区的命名方法完全不同于

Dos,软驱,硬盘以及硬盘分区都有各自的设备特殊文件,例如:

/dev/hda 表示第一个IDE硬盘(整个)

/dev/hda1 表示第一个硬盘的第一个主分区

/dev/hda2 表示第一个硬盘的第二个主分区

/dev/hda3 表示第一个硬盘的扩展分区

/dev/hda5 表示第一个硬盘的第一个逻辑分区

/dev/hda6 表示第一个硬盘的第二个逻辑分区

/dev/hdb 表示第二个硬盘(整个)

其中hda1对应着Windows里的C盘,而hda5一般对应着Windows的D盘。]


注意,-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: Bad magic number in super-block while trying to open /dev/hda5

相关阅读 更多 +
排行榜 更多 +
坦克冒险大师安卓版

坦克冒险大师安卓版

策略塔防 下载
自动防御

自动防御

策略塔防 下载
枪战大乱斗2

枪战大乱斗2

飞行射击 下载