如何恢复Linux上删除的文件


文件系统故障的恢复

回想一下,在超级块中保存了有关文件系统本身的一些数据,在 ext2 文件系统中,还使用块组描述符保存了有关块组的信息;另外,索引节点位图、块位图中分别保存了索引节点和磁盘上数据块的使用情况,而文件本身的索引节点信息(即文件的元数据)则保存在索引节点表中。这些数据对于文件系统来说都是至关重要的,它们是存取文件的基础。如果超级块和块组描述符的信息一旦出错,则会造成文件系统无法正常挂载的情况出现。造成这些信息出错的原因有:

系统管理员操作失误。
设备驱动程序或第三方软件(例如mke2fs之类的)有 bug。
电源意外断电。
内核有 bug。
如果出现这种问题,可能造成的后果有:

文件系统无法挂载。
操作系统挂起。
即使文件系统能够成功挂载,在系统重启时也可能会看到一些错误,或者目录列表中出现乱字符的情况等。
下面让我们来模拟一个出现这种错误的情况。我们知道,超级块信息就保存在分区中的第一个块中,现在我们来试验一下清空这个块中数据的后果:
清单9. 清空超级块信息的后果
               
# dd if=/dev/zero of=/dev/sda2 bs=4096 count=1
 

# mount /dev/sda2 /tmp/test -t ext2
mount: wrong fs type, bad option, bad superblock on /dev/sda2,
       missing codepage or helper program, or other error
       In some cases useful info is found in syslog - try
       dmesg | tail  or so
 
由于无法从磁盘上读取到有效的超级块信息,mount 命令已经无法挂载 /dev/sda2 设备上的文件系统了。

为了防止这个问题会造成严重的后果,ext2 文件系统会在每个块组中保存一份超级块的拷贝。当然,这会造成一定的空间浪费,因此在最新的 ext2 文件系统中,只是在特定的块组中保存一份超级块的拷贝。具体来说,是在第 0、1 个块组和第 3、5、7 的整数次幂个块组中保存一份超级块的拷贝,而其他块组中的空间都可以节省出来了。下面来看一个 20GB 大小的文件系统的实际例子:
清单10. ext2 文件系统中超级块拷贝的位置
               
# dumpe2fs /dev/sdb6 | grep -i superblock
dumpe2fs 1.39 (29-May-2006)
  Primary superblock at 0, Group descriptors at 1-2
  Backup superblock at 32768, Group descriptors at 32769-32770
  Backup superblock at 98304, Group descriptors at 98305-98306
  Backup superblock at 163840, Group descriptors at 163841-163842
  Backup superblock at 229376, Group descriptors at 229377-229378
  Backup superblock at 294912, Group descriptors at 294913-294914
  Backup superblock at 819200, Group descriptors at 819201-819202
  Backup superblock at 884736, Group descriptors at 884737-884738
  Backup superblock at 1605632, Group descriptors at 1605633-1605634
  Backup superblock at 2654208, Group descriptors at 2654209-2654210
  Backup superblock at 4096000, Group descriptors at 4096001-4096002
 
这是一个 20GB 大的 ext2 文件系统,每个块组的大小是 32768 个块,超级块一共有 11 个拷贝,分别存储在第 0、1、3、5、7、9、25、27、49、81 和 125 个块组中。默认情况下,内核只会使用第一个超级块中的信息来对磁盘进行操作。在出现故障的情况下,就可以使用这些超级块的备份来恢复数据了。具体说来,有两种方法:首先 mount 命令可以使用 sb 选项指定备用超级块信息来挂载文件系统:
清单11. 使用超级块拷贝挂载文件系统
               
# mount -o sb=131072 /dev/sda2 /tmp/test -t ext2
 
需要注意的是,mount 命令中块大小是以 1024 字节为单位计算的,而这个文件系统则采用的是 4096 字节为单位的块,因此 sb 的值应该是 32768*4=131072。

尽管 mount 命令可以使用备用超级块来挂载文件系统,但却无法修复主超级块的问题,这需要使用 e2fsck 这个工具来完成:
清单12. 利用 e2fsck 工具修复 ext2 文件系统中主超级块的问题
               
# e2fsck /dev/sda2
e2fsck 1.40.2 (12-Jul-2007)
Couldn’t find ext2 superblock, trying backup blocks…
/dev/sda2 was not cleanly unmounted, check forced.
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information

/dev/sda2: ***** FILE SYSTEM WAS MODIFIED *****
/dev/sda2: 11/489600 files (9.1% non-contiguous), 17286/977956 blocks

# mount /dev/sda2 /tmp/test -t ext2
 
e2fsck 工具可以检查出主超级块的问题,然后从其他超级块拷贝中读取数据,并使用它来恢复主超级块中的数据(在 ext2 文件系统中,超级块信息保存在一个 ext2_super_block 的数据结构中,详细信息请参考内核源代码)。修复主超级块的问题之后,mount 命令就可以成功挂载原来的文件系统了。

重建文件系统的解决办法

在日常使用过程中,可能碰到的另外一个问题是管理员可能错误地执行了某些命令,例如使用mke2fs 重建了文件系统,从而造成数据的丢失。实际上,在 mke2fs 创建文件系统的过程中,并不会真正去清空原有文件系统中存储的文件的数据,但却会重新生成超级块、块组描述符之类的信息,并清空索引节点位图和块位图中的数据,最为关键的是,它还会清空索引节点表中的数据。因此尽管文件数据依然存储在磁盘上,但是由于索引节点中存储的文件元数据已经丢失了,要想完整地恢复原有文件,已经变得非常困难了。

然而,这个问题也并非完全无法解决。在 e2fsprogs 包中还提供了一个名为 e2image 的工具,可以用来将 ext2 文件系统中的元数据保存到一个文件中,下面是一个例子:
清单13. 使用超级块拷贝挂载文件系统
               
# e2image -r /dev/sda2 sda2.e2image
 
这会生成一个与文件系统大小相同的文件,其中包含了文件系统的元数据,包括索引节点中的间接块数据以及目录数据。另外,其中所有数据的位置均与磁盘上存储的位置完全相同,因此可以使用 debugfs、dumpe2fs 之类的工具直接查看:
清单14. 使用 debugfs 查看 e2image 映像文件的信息
               
# debugfs sda2.e2image.raw
debugfs 1.40.2 (12-Jul-2007)
debugfs:  ls -l
      2   40755 (2)      0      0    4096 31-Dec-2007 15:56 .
      2   40755 (2)      0      0    4096 31-Dec-2007 15:56 ..
     11   40700 (2)      0      0   16384 31-Dec-2007 15:54 lost+found
     12  100644 (1)      0      0   10485760 31-Dec-2007 15:56 testfile.10M
     13  100644 (1)      0      0   35840 31-Dec-2007 15:56 testfile.35K
 
为了节省空间,这些映像文件以稀疏文件的形式保存在磁盘上,在一个 4GB 的文件系统中,如果 55 万个索引节点中已经使用了 1 万 5 千个,使用 bizp2 压缩后的文件大概只有 3MB左右。

当然,这些映像文件中并没有包含实际文件的数据,不过文件数据依然保存在磁盘上,因此只要及时备份相关信息,在发生意外的情况下是有可能恢复大部分数据的。

磁盘坏道情况的处理

随着磁盘使用的时间越来越长,难免会出现磁盘上出现一些物理故障,比如产生物理坏道。根据物理损坏的严重程度,可能会造成文件丢失、文件系统无法加载甚至整个磁盘都无法识别的情况出现。因此要想将损失控制在最小范围内,除了经常备份数据,在发现问题的第一时间采取及时地应对措施也非常重要。

物理故障一旦出现,极有可能会有加剧趋势,因此应该在恢复数据的同时,尽量减少对磁盘的使用,dd 命令可以用来创建磁盘的完美映像。应该使用的命令如下:
清单15. 使用 dd 命令创建磁盘映像
               
# dd if=/dev/sdb of=/images/sdb.image bs=4096 conv=noerror,sync
 
noerror 参数告诉 dd 在碰到读写错(可能是由于坏道引起的)时继续向下操作,而不是停止退出。sync 参数说明对于从源设备无法正常读取的块,就使用NULL填充。默认情况下,dd 使用 512 字节作为一个块的单位来读写 I/O 设备,指定 bs 为 4096 字节可以在一定程度上加速 I/O 操作,但同时也会造成一个问题:如果所读取的这个 4096 字节为单位的数据块中某一部分出现问题,则整个 4096 字节的就全部被清空了,这样会造成数据的丢失。为了解决这种问题,我们可以使用 dd_rescue 这个工具(可以从 http://www.garloff.de/kurt/linux/ddrescue/ 上下载),其用法如下:
清单16. 使用 dd_rescue 命令创建磁盘映像
               
# dd_rescue /dev/sdb /images/sdb.image –b 65536 –B 512
 
与 dd 相比,dd_rescue 强大之处在于在碰到错误时,可以以更小的数据块为单位重新读取这段数据,从而确保能够读出尽量多的数据。上面命令中的参数指明正常操作时以 64KB 为单位读取磁盘数据,一旦出错,则以 512 字节为单位重新读取这段数据,直至整个硬盘被完整读出为止。

获得磁盘映像之后,就可以将其当作普通磁盘一样进行操作了。应用本系列文章中介绍的技术,应该能从中恢复出尽可能多的数据。当然,对于那些刚好处于坏道位置的数据,那就实在回天乏力了。

恢复文件策略

截至到现在,本系列文章中介绍的都是在删除文件或出现意外情况之后如何恢复文件,实际上,对于保证数据可用性的目的来讲,这些方法都无非是亡羊补牢而已。制定恰当地数据备份策略,并及时备份重要数据才是真正的解决之道。

不过即使有良好的数据备份策略,也难免会出现有部分数据没有备份的情况。因此,一旦出现误删文件的情况,应该立即执行相应的对策,防止文件数据被覆盖:

断开所有对文件系统的访问。fuser 命令可以用来帮助查看和杀死相关进程,详细用法请参看 fuser 的手册。
如果业务无法停顿,就将文件系统以只读方式重新加载,命令格式为:mount -r -n -o remount mountpoint
应用本系列文章介绍的技术恢复文件。
当然,在进行数据备份的同时,也需要考虑本文中介绍的一些技术本身的要求,例如 e2image映像文件、e2undel 的日志文件等,都非常重要,值得及时备份。

小结

本文介绍了一个功能非常强大的工具 e2undel,可以用来方便地恢复已删除的文件。然后讨论了文件系统故障、文件系统重建、磁盘物理损坏等情况下应该如何恢复数据。随着文件系统的不断发展,Linux 上常用的文件系统也越来越多,例如 ext3/ext4/reiserfs/jfs 等,这些文件系统上删除的文件能否成功恢复呢?有哪些工具可以用来辅助恢复文件呢?本系列后续文章将继续探讨这个问题。



扩展Linux的swap分区


1:使用文件来扩展Linux的swap分区

  和Windows一样Linux也有虚拟内存,不过术语称之为swap分区而已。其实swap和虚拟内存就是一回事,设计原理和作用都没有太大的区别,典型的不同就是Linux的swap默认是使用独立的硬盘分区的,而Windows中虚拟内存则是使用系统分区中的特定文件的,还有就是在Linux中可以通过把swap划分到单独的硬盘[可不仅是单独的分区噢!]或划分到硬盘中靠前的磁道中来提高系统性能。

    通常我们在划分swap空间时基本上都是划分到独立的硬盘分区中,但是当系统负担较重时,我们也可以通过扩展swap分区来缓解系统压力。下面就简单演示一下如何使用文件作为swap分区:

    1、首先创建一个全是0的文件
          [root@rhel5 ~]# dd=/dev/zero  of=/swap  bs=1024  count=131072
            131072+0   records   in  
            131072+0   records   out
          [root@rhel5 ~]#
         上面的命令创建了一个位于/下名称为swap,大小为128MB的swap文件,其中输出文件的位置和名称可以自己设定,count的值就是文件的大小乘以字节数,即131072=128*1024

    2、使用mkswap命令创建swap
         [root@rhel5 ~]#mkswap /swap
          Setting   up   swapspace   version   1,   size   =   131072   kB
         [root@rhel5 ~]#

    3、将新增加的swap信息追加到文件系统表/etc/fstab
         [root@rhel5 ~]#echo  “/swap         swap             swap          defaults    0  0″>>/etc/fstab
         [root@rhel5 ~]#

    4、使用swapon命令加a选项激活所有swap分区
         [root@rhel5 ~]#swapon -a
         [root@rhel5 ~]#

    5、确认新增加的swap已经正常工作
         [root@rhel5 ~]#cat  /proc/swaps 或者
         [root@rhel5 ~]#swapon -s 或者
         [root@rhel5 ~]#free

         以上三条命令都可以查看swap的相关信息,并能够判断新增加的swap是否已经正常工作。
   如果不再需要这些swap分区时,可以先使用swapoff关闭相应的swap,然后删除该文件即文件系统表中的记录即可。

2:用磁盘分区扩展linux的 swap分区

SWAP分区是LINUX暂时存储数据的交换分区,它主要是把主内存上暂时不用得数据存起来,在需要的时候再调进内存内,且作为SWAP使用的分区不用指定“Mout Point”(载入点)它至少要等于系统上实际内存的量,一般来说它的大小是内存的两倍,如果你是 16MB的内存,那么SWAP分区的大小是32MB左右,以此类推。如果增加了内存,但是swap分区不够大了,在要重新划分一下。具体方法如下:
可以先执行一下fdisk -l查看一下设备名称和分区状况

1、执行swapoff  swap分区的设备名 关闭交换文件。

2、看到swap的设备名删除原来的swap分区,在新建一个swap分区。可以使用fdisk做此操作

如果对/dev/sda设备进行分区操作:
fdisk /dev/sda
屏幕提示:
Command (m for help):
键入p
屏幕会列出当前所有的分区设备号、大小、文件格式等参数;
下面进行删除分区的操作:
屏幕提示:
Command (m for help):
键入d
屏幕提示:
Partition number (1-x):
x是您现有的分区数量,有两个分区的话x就是2;删除分区时从最后一个分区开始,键入2:
屏幕提示:
Command (m for help):
键入p
列出当前分区情况,发现sda2被删除了;
继续键入d,然后是1,再键入p,发现sda的分区都被删除了;
屏幕提示:
Command (m for help):
键入w
保存当前删除的操作,回到主界面,如果/dev/sdb上也有分区,按照上面的方法删除。

下面进行创建分区的操作:
fdisk /dev/sda
屏幕提示:
Command (m for help):
键入p
此时硬盘上应该没有任何分区;
键入n
屏幕提示:
First cylinder (abcd-efgh, default abcd):
abcd和efgh都是数字,表示新分区起始的 柱面数,直接键入回车即可;
屏幕提示:
Last cylinder or +size or +sizeM or +sizeK (abcd-ijkl, default ijkl):
abcd和 ijkl也都是数字,这里是要求定义分区的大小,如果要建立2G的空间,键入+2000M,如果要将后面所有空间都分出来,直接键入回车即可;注意分区大
小的单位M和K一定要大写!
屏幕提示:
Command (m for help):
键入p
发现已经建立了分区sda1,大小是2G
仿照上面的方法建立更多分区,可以用p查看,最后键入w保存操作。

3、这样重建swap之后,可以使用mkswap /dev/sda[x],其中的[x]代表的是你的第几个分区。

4、激活交换分区 swapon /dev/sda[x]

5、 想要在系统启动时自动激活此交换文件,应该在 /etc/fstab 中加入如下一行:
 /dev/sda[x] swap swap defaults 0 0
添加交换文件并启用它后,用 cat /proc/swaps 或 free 命令查看交换文件是否
被成功启用。



PBA3.4+plesk8.4+virtuozzo4.0的备份/恢复操作


一:Hspc 3.3 备份/恢复可以使用系统自带的备份工具hspc-mn-backup 来进行完整的数据库备份和恢复。如果安装在vps内可以通过vzcc/vzmc来进行备份。备份的目录包括 

目录 描述

1HSPC3.3备份:

[root@frsky ~]#hspc-mn-backup –b

[INFO ] Script (/usr/sbin/hspc-mn-backup) version ‘1.1′. Initializing…[INFO ] [Backup] Using ‘./hspc-mn-backup_2008.07.16.tar.bz2′ as backup file.[INFO ] [Backup] Processing ‘PRE’ actions.Killing mysqld with pid 4237Wait for mysqld to exit… done[INFO ] [Backup] System check result:       [Parallels Business Automation - Standard] ‘3.3.3′ version detected.       [MySQL] ‘4.1.10′ version detected.[INFO ] [Backup] Backuping management node…[INFO ] [Backup] Processing ‘POST’ actions.[INFO ] Operation completed sucessfully.

2 HSPC3.3恢复:

[root@frsky ~]#hspc-mn-backup –r

[INFO ] Script (/usr/sbin/hspc-mn-backup) version ‘1.1′. Initializing…[INFO ] [Backup] Using ‘./hspc-mn-backup_2008.07.16.tar.bz2′ as backup file.[INFO ] [Backup] Processing ‘PRE’ actions.Killing mysqld with pid 5005Wait for mysqld to exit.. done[INFO ] [Backup] System check result:       [Parallels Business Automation - Standard] ‘3.3.3′ version detected.       [MySQL] ‘4.1.10′ version detected.[INFO ] [Backup] Restoring management node from backup…[INFO ] [Backup] Processing ‘POST’ actions.[INFO ] Operation completed sucessfully.

相关命令选项: –C 指定备份的目录  –p 备份的时候不停止运行的服务

设置备份计划任务:0 2 * * 6 root /usr/sbin/hspc-mn-backup -b -p -C /var/backup/ 2>&1每周六晚上两点执行一次备份。  二:对于plesk的备份/恢复

1plesk的备份

1windows的备份主要使用acronis true image 来进行对系统和文件的备份,对C盘进行每月周5进行一次完整备份, 每周日进行一次增量备份 。对D盘进行每月周2完整备份一次 ,每周六进行一次增量备份。对mssql 使用计划备份任务3天一次2linux的备份:使用备份脚本对 

目录 描述

没周进行一次完整备份。使用脚本对mysql进行三天一次的备份 2plesk的恢复

一:针对linux系统的恢复

首先 操作系统安装,磁盘挂载,数据转移,修复数据,启动服务[root@plesk ~]# mkdir /mnt/sdb1执行mount命令挂载数据。
[root@plesk ~]# mount /dev/sdb1 /mnt/sdb1
停止正在运行的Plesk服务。
[root@vz ~]# /etc/init.d/psa stop
要先设置cp命令参数,否则下边的复制中会反复提示文件重复。
[root@plesk ~]# alias cp=’cp’
复制原数据磁盘上的数据到当前系统上
[root@plesk~]# cp -prf /mnt/sdb1/etc/  /etc

网站配置信息和系统用户信息

[root@plesk~]# cp -prf /mnt/sdb1/var/lib/mysql /var/lib/mysql网站数据库数据[root@plesk~]# cp -prf /mnt/sdb1/var/www/vhost /var/www/vhost网站数据[root@plesk~]# cp -prf /mnt/sdb1/usr/local/psa  /usr/local/psaPlesk配置信息[root@plesk~]# cp -prf /mnt/sdb1/var/qmail  /var/qmail邮局信息和邮件[root@plesk~]/usr/local/psa/admin/sbin/websrvmng –reconfigure-all修复所有的站点配置信息然后登录plesk后台查看站点是否都已经正常显示

二:针对windows系统的恢复

首先 操作系统安装,磁盘挂载,数据转移,修复数据,启动服务

1:停止psa 上的所有服务

2:对数据进行恢复

D:\mssql\data          sql server 的数据库信息

D:\inetpub\vhost     用户站点信息

D:\swsoft\plesk\mysql  用户的数据库

D:\swsoft\plesk\database  psa 的数据库

D:\swsoft\plesk\mailenable   邮件信息

3:然后通过websrvmng执行修复

4:启动所有服务

Virtuozzo备份/恢复1:对于Virtuozzo的备份:可以针对文件备份,可以针对系统备份,也可以针对vps的备份(可通过vzcc来进行设置备份计划任务,也可以通过vzmc来进行备份。注:目前只有vps4.0才可以使用备份任务)2:针对Virtuozzo的恢复

一:针对linux系统的恢复

灾难恢复:首先 操作系统安装,磁盘挂载,数据转移,启动服务 这几个步骤1.操作系统安装。
在原服务器损坏后,首先更换硬件并新装系统。新装系统的全部过程,请参考相应的安装手册。安装过程中请注意操作系统版本、安装方式、分区大小、系统参数尽可能和原服务器保持一致
2.Virtuozzo for Linux安装。
在新系统上,安装Virtuozzo for Linux 。请注意,安装的版本需要与原系统一致,例如原系统是3.x版本,则新服务器也需要安装3.x版本,不可安装2.64.0等其他版本。
3.挂载磁盘在服务器上建立一个新的目录以便挂载。
[root@vz ~]# mkdir /mnt/sdb1
执行mount命令挂载数据。
[root@vz ~]# mount /dev/sdb1 /mnt/sdb1
停止正在运行的Virtuozzo服务。
[root@vz ~]# /etc/init.d/vz stop
要先设置cp命令参数,否则下边的复制中会反复提示文件重复。
[root@vz ~]# alias cp=’cp’
复制原数据磁盘上的/etc/vz*到当前系统上
[root@vz3 ~]# cp -prf /mnt/sdb1/etc/vz* /etc
复制原数据磁盘上的/etc/sysconfig/vz*到当前系统上
[root@vz ~]# cp -prf /mnt/sdb1/etc/sysconfig/vz* /etc/sysconfig
使用cp -af 命令复制数据目录。注意,必须用-af参数。
[root@vz ~]# cp -af /mnt/sdb1/vz /
复制完毕后,取消对磁盘的挂载。
[root@vz ~]# umount /mnt/sdb1
5.启动服务。
启动Virtuozzo服务。
Starting Virtuozzo: [ OK ]
Bringing up interface venet0: [ OK ]
Configuring interface venet0: [ OK ]
Loading Virtuozzo license: [ OK ]
Set vzprivrange: [ OK ]
Configuring Virtuozzo accounting: [ OK ]
Starting VE 1: [ OK ]
Setup offline management for VE 101: [ OK ]
Setup offline management for VE 102: [ OK ]
Setup offline management for VE 103: [ OK ]
Setup offline management for VE 104: [ OK ]
Setup offline management for VE 105: [ OK ]
Setup offline management for VE 106: [ OK ]
Setup offline management for VE 107: [ OK ]
Setup offline management for VE 108: [ OK ]
Setup offline management for VE 109: [ OK ]
Setup offline management for VE 110: [ OK ]
[root@vz ~]#
至此恢复完成。二:、Virtuozzo for Windows恢复在针对Virtuozzo for Windows服务器做灾难恢复时候,可以简单的采用系统盘重新安装,数据盘保留原位的方法。1.前提在安装Virtuozzo for Windows的过程中,根据安装文档及其他教程所述,一般将Virtuozzo的程序目录安装在“D: \SWsoft” ,将数据目录安装在“D:\vz”目录,将数据的备份目录安装在“D:\vz\backups”目录下。程序目录安装位置对数据恢复没有影响,但数据目录和备份目录需要特别记录原安装路径,然后按照本文操作。2.操作系统重装。
首先重新安装Windows系统,在安装过程中,选择删除C盘系统盘,并重新格式化整个C盘。如果程序目录在“D: \SWsoft”,即便删除了C盘也没有关系,新安装Virtuozzo会补充程序目录下所有丢失的文件。存放数据和备份的D盘不要修改,并请注意操作前要再三确认,以免误操作删除了数据。
3.原路径安装Virtuozzo for Windows
在安装Virtuozzo for Windows的过程中,会要求选择程序目录、数据目录、备份目录。此时程序目录选择在C盘或者D盘或者其他地方没有关系,和原系统路径不一直也没关系,但数据目录和备份目录必须和磁盘上原路径一致。
4.识别VPS
安装Virtuozzo for Windows 完成后,即可看到原来的VPS已经被列出。
5. 其余工作
为了确保Virtuozzo基础平台和原服务器一致,请更新Windows补丁(Windows会自动提示安装),即可完成整体的数据恢复。


Frsky’s blog . is proudly powered by WordPress and themed by Mukkamu