Linux 灾难恢复.docx
《Linux 灾难恢复.docx》由会员分享,可在线阅读,更多相关《Linux 灾难恢复.docx(23页珍藏版)》请在冰豆网上搜索。
Linux灾难恢复
Linux灾难恢复
Linux发行版本众多,现如今也得到了越来越广泛的应用,同时也面临着系统出现故障的潜在风险,本文将以发行版本RHEL6为例详细介绍几种Linux灾难恢复技术和方法,以确保Linux系统的安全恢复。
在介绍Linux灾难恢复方法之前,我们先来了解下MBR,其全称为MasterBootRecord,即硬盘的主引导记录。
它由三个部分组成,主引导程序、硬盘分区表和硬盘有效标志。
在总共512字节的主引导扇区里主引导程序(Bootloader)占446个字节,第二部分是硬盘分区表,占64个字节,硬盘有多少分区以及每一分区的大小都记录在其中。
第三部分是硬盘有效标志,占2个字节。
具体如图示:
图1.MBR
系统硬盘分区表破坏
生产环境中的Linux服务器可能会因为病毒或者意外断电而引起硬盘分区表被破坏,通常恢复硬盘分区表需要之前我们先备份其分区表的信息,一般我们使用USB外接设备来备份主机硬盘的分区表。
在主机上挂载USB设备后我们查看系统当前磁盘设备:
[root@FCoE~]#fdisk-l
Disk/dev/sda:
43.0GB,42991616000bytes
255heads,63sectors/track,5226cylinders
Units=cylindersof16065*512=8225280bytes
Sectorsize(logical/physical):
512bytes/512bytes
I/Osize(minimum/optimal):
512bytes/512bytes
Diskidentifier:
0x00032735
DeviceBootStartEndBlocksIdSystem
/dev/sda1*11713107283Linux
Partition1doesnotendoncylinderboundary.
/dev/sda217147104857682Linuxswap/Solaris
Partition2doesnotendoncylinderboundary.
/dev/sda314752274080332883Linux
Disk/dev/sdb:
2147MB,2147483648bytes
255heads,63sectors/track,261cylinders
Units=cylindersof16065*512=8225280bytes
Sectorsize(logical/physical):
512bytes/512bytes
I/Osize(minimum/optimal):
512bytes/512bytes
Diskidentifier:
0x00000000
Disk/dev/sdbdoesn'tcontainavalidpartitiontable
现在我们在sdb这个设备上创建一个新的分区:
[root@FCoE~]#fdisk/dev/sdb
DevicecontainsneitheravalidDOSpartitiontable,norSun,SGIorOSFdisklabel
BuildinganewDOSdisklabelwithdiskidentifier0xcdd48395.
Changeswillremaininmemoryonly,untilyoudecidetowritethem.
Afterthat,ofcourse,thepreviouscontentwon'tberecoverable.
Warning:
invalidflag0x0000ofpartitiontable4willbecorrectedbyw(rite)
WARNING:
DOS-compatiblemodeisdeprecated.It'sstronglyrecommendedto
switchoffthemode(command'c')andchangedisplayunitsto
sectors(command'u').
Command(mforhelp):
n
Commandaction
eextended
pprimarypartition(1-4)
p
Partitionnumber(1-4):
1
Firstcylinder(1-261,default1):
Usingdefaultvalue1
Lastcylinder,+cylindersor+size{K,M,G}(1-261,default261):
Usingdefaultvalue261
Command(mforhelp):
p
Disk/dev/sdb:
2147MB,2147483648bytes
255heads,63sectors/track,261cylinders
Units=cylindersof16065*512=8225280bytes
Sectorsize(logical/physical):
512bytes/512bytes
I/Osize(minimum/optimal):
512bytes/512bytes
Diskidentifier:
0xcdd48395
DeviceBootStartEndBlocksIdSystem
/dev/sdb11261209645183Linux
Command(mforhelp):
w
Thepartitiontablehasbeenaltered!
Callingioctl()tore-readpartitiontable.
Syncingdisks.
在新分区sdb1上创建文件系统:
[root@FCoE~]#mkfs.ext3/dev/sdb1
mke2fs1.41.12(17-May-2010)
Filesystemlabel=
OStype:
Linux
Blocksize=4096(log=2)
Fragmentsize=4096(log=2)
Stride=0blocks,Stripewidth=0blocks
131072inodes,524112blocks
26205blocks(5.00%)reservedforthesuperuser
Firstdatablock=0
Maximumfilesystemblocks=536870912
16blockgroups
32768blockspergroup,32768fragmentspergroup
8192inodespergroup
Superblockbackupsstoredonblocks:
32768,98304,163840,229376,294912
Writinginodetables:
done
Creatingjournal(8192blocks):
done
Writingsuperblocksandfilesystemaccountinginformation:
done
Thisfilesystemwillbeautomaticallycheckedevery24mountsor
180days,whichevercomesfirst.Usetune2fs-cor-itooverride.
挂载新的文件系统:
[root@FCoE~]#mount/dev/sdb1/mnt/
通常我们通过备份硬盘的MBR来备份硬盘分区表:
[root@FCoE~]#ddif=/dev/sdaof=/mnt/sda.mbrbs=512count=1
1+0recordsin
1+0recordsout
512bytes(512B)copied,0.000777948s,658kB/s
现在我们来写零硬盘分区表来实现类似分区表被破坏的结果:
[root@FCoE~]#ddif=/dev/zeroof=/dev/sdabs=1count=64skip=446seek=446
64+0recordsin
64+0recordsout
64bytes(64B)copied,0.00160668s,39.8kB/s
查询硬盘sda上的分区信息,发现其已不包含任何分区:
[root@FCoE~]#fdisk-l
Disk/dev/sda:
43.0GB,42991616000bytes
255heads,63sectors/track,5226cylinders
Units=cylindersof16065*512=8225280bytes
Sectorsize(logical/physical):
512bytes/512bytes
I/Osize(minimum/optimal):
512bytes/512bytes
Diskidentifier:
0x00032735
DeviceBootStartEndBlocksIdSystem
Disk/dev/sdb:
2147MB,2147483648bytes
255heads,63sectors/track,261cylinders
Units=cylindersof16065*512=8225280bytes
Sectorsize(logical/physical):
512bytes/512bytes
I/Osize(minimum/optimal):
512bytes/512bytes
Diskidentifier:
0xcdd48395
DeviceBootStartEndBlocksIdSystem
/dev/sdb11261209645183Linux
当主机硬盘分区表丢失了之后,再次启动后GRUB会因找不到配置文件而进入命令行模式:
图2.分区表丢失
接下来我们挂载RHEL6的安装盘,同时也接入我们之前备份的USB设备,然后重启主机,选择CD-ROM为第一引导设备,启动后选择“Rescueinstalledsystem”。
图3.选择援救
按照提示,最终我们选择一个shell。
图4.选择shell
我们查询系统磁盘信息,发现硬盘设备sda没有包含任何分区。
bash-4.1#fdik–l
Disk/dev/sda:
43.0GB,42991616000bytes
255heads,63sectors/track,5226cylinders
Units=cylindersof16065*512=8225280bytes
Sectorsize(logical/physical):
512bytes/512bytes
I/Osize(minimum/optimal):
512bytes/512bytes
Diskidentifier:
0x00032735
DeviceBootStartEndBlocksIdSystem
Disk/dev/sdb:
2147MB,2147483648bytes
255heads,63sectors/track,261cylinders
Units=cylindersof16065*512=8225280bytes
Sectorsize(logical/physical):
512bytes/512bytes
I/Osize(minimum/optimal):
512bytes/512bytes
Diskidentifier:
0xcdd48395
DeviceBootStartEndBlocksIdSystem
/dev/sdb11261209645183Linux
我们来恢复它的硬盘分区表,创建一个目录并且挂载之前备份的USB设备,我们看到它的设备名是/dev/sdb。
bash-4.1#mount/dev/sdb1/usb
bash-4.1#ls/usb
lost+foundsda.mbr
通过原来备份的sda.mbr文件来恢复硬盘设备sda的硬盘分区表:
bash-4.1#ddif=/usb/sda.mbrof=/dev/sdabs=1count=64skip=446seek=446
64+0recordsin
64+0recordsout
64bytes(64B)copied,0.038358s,4.6kB/s
再次查询系统磁盘信息:
bash-4.1#fdisk-l
Disk/dev/sda:
43.0GB,42991616000bytes
255heads,63sectors/track,5226cylinders
Units=cylindersof16065*512=8225280bytes
Sectorsize(logical/physical):
512bytes/512bytes
I/Osize(minimum/optimal):
512bytes/512bytes
Diskidentifier:
0x00032735
DeviceBootStartEndBlocksIdSystem
/dev/sda1*11713107283Linux
Partition1doesnotendoncylinderboundary.
/dev/sda217147104857682Linuxswap/Solaris
Partition2doesnotendoncylinderboundary.
/dev/sda314752274080332883Linux
Disk/dev/sdb:
2147MB,2147483648bytes
255heads,63sectors/track,261cylinders
Units=cylindersof16065*512=8225280bytes
Sectorsize(logical/physical):
512bytes/512bytes
I/Osize(minimum/optimal):
512bytes/512bytes
Diskidentifier:
0xcdd48395
DeviceBootStartEndBlocksIdSystem
/dev/sdb11261209645183Linux
硬盘设备sda的分区表已经恢复,重启后系统便可正常引导。
系统GRUB损坏
类似得我们可以来写零Bootloader来实现GRUB被破坏的结果:
[root@FCoEgrub]#ddif=/dev/zeroof=/dev/sdabs=446count=1
1+0recordsin
1+0recordsout
446bytes(446B)copied,0.0017583s,254kB/s
重启后系统会因找不到GRUB而卡在“BootingfromHardDisk…”
挂载系统安装光盘然后选择进入Rescue模式,然后恢复GRUB:
bash-4.1#chroot/mnt/sysimage
sh-4.1#grub
grub>roothd(0,0)
grub>setup(hd0)
grub>quit
图5.恢复GRUB
重启主机后,系统可正常引导。
系统内核文件丢失
系统丢失内核kernel文件,再次启动后会提示找不到文件。
图6.内核丢失
挂载系统安装盘进入援救模式,检查/boot目录下发现没有kernel文件。
bash-4.1#chroot/mnt/sysimage
bash-4.1#ls/boot
ls
config-2.6.32-71.el6.x86_64lost+found
efisymvers-2.6.32-71.el6.x86_64.gz
grubSystem.map-2.6.32-71.el6.x86_64
initramfs-2.6.32-71.el6.x86_64.img
从挂载的系统安装盘强制重新安装内核:
sh-4.1#mount–oloop/dev/sr0/media
sh-4.1#cd/media/Server/Packages
sh-4.1#rpm-ivh--forcekernel-2.6.32-71.el6.x86_64.rpm
warning:
kernel-2.6.32-71.el6.x86_64.rpm:
HeaderV3RSA/SHA256Signature,\
keyIDfd431d51:
NOKEY
Preparing...###########################################[100%]
1:
kernel###########################################[100%]
在/boot目录下已经生成新的kernel文件vmlinuz-2.6.32-71.el6.x86_64
sh-4.1##ls/boot
config-2.6.32-71.el6.x86_64lost+found
efisymvers-2.6.32-71.el6.x86_64.gz
grubSystem.map-2.6.32-71.el6.x86_64
initramfs-2.6.32-71.el6.x86_64.imgvmlinuz-2.6.32-71.el6.x86_64
重启主机后,系统可正常引导。
系统镜像文件丢失
系统丢失镜像文件,主机启动后黑屏。
图7.镜像丢失
挂载系统安装盘进入援救模式,检查/boot目录下发现没有镜像文件。
bash-4.1#chroot/mnt/sysimage
sh-4.1#ls/boot
config-2.6.32-71.el6.x86_64symvers-2.6.32-71.el6.x86_64.gz
efiSystem.map-2.6.32-71.el6.x86_64
grubvmlinuz-2.6.32-71.el6.x86_64
lost+found
重新生成镜像文件initramfs-2.6.32-71.el6.x86_64.img。
sh-4.1#cd/boot
sh-4.1#mkinit
sh-4.1#ls
config-2.6.32-71.el6.x86_64lost+found
efisymvers-2.6.32-71.el6.x86_64.gz
grubSystem.map-2.6.32-71.el6.x86_64
initramfs-2.6.32-71.el6.x86_64.imgvmlinuz-2.6.32-71.el6.x86_64
重启主机后,系统可正常引导。
系统/boot分区损坏
一般来说系统/boot分区损坏,我们会先尝试修复文件系统。
如果文件系统损坏不能修复,那么我们可以参照前述的方法来依次新建/boot分区,重新安装内核和镜像,然后安装GURB再手工编辑引导菜单,以最终来恢复系统可正常引导。
通常我们需要按照如下的步骤来恢复。
创建分区
碰到比较严重的情况就是/boot分区已经完全损坏,启动时会提示找不到引导设备。
图8.引导分区损坏
挂载安装盘后进入援救模式,查看分区情况,发现分区/dev/sda1不存在。
bash-4.1#
Disk/dev/sda:
43.0GB,42991616000bytes
255heads,63sectors/track,5226cylinders
Units=cylindersof16065*512=8225280bytes
Sectorsize(logical/physical):
512bytes/512bytes
I/Osize(minimum/optimal):
512bytes/512bytes
Diskidentifier:
0x00000000
DeviceBootStartEndBlocksIdSystem
/dev/sda217147104857682Linuxswap/Solaris
Partition2doesnotendoncylinderboundary.
/dev/sda314752274080332883Linux
Disk/dev/sdb:
2147MB,214748