下面我来讲下grub,grub在编辑的时候可以进入一种模式就是单用户模式,就是当grub.conf文件未写入密码时,普通用户将直接忽略系统密码进入系统,所以这可以称为一个捷径,也可以成为一个漏洞,当然linux的前辈们不可能连这个都想不到,他们也有自己的办法,这就是我们grub的两层加密机制,在选定登陆界面之前可以设置一次,启动内核时也可以设置一次,密码也可以采取加密算法,这样就可以为我们系统提供双层保险。好了说了那么多,让我么你做一个简单的练习。
-
破解root口令,并为grub设置保护功能
这个问题再简单不过了,在登陆选定内核界面按e进入grub的编辑界面,然后按‘b’登陆即‘boot’之意,这样就破解了root的密码了。
-
破坏本机grub stage1,而后在救援模式下修复之
下面我来讲下stage1这个步骤是存在MBR前512字节里的,将之破坏的方式可以是这样:dd if=/dev/zero of=/dev/sd# ,#表示grub所在磁盘,这里假设我们已经将MBR进行破坏,我们只需在进入RESCUE模式时重新安装grub即可。grub-install –root-directory /dev/sd# 当然我这是切根后的安装,不然救援模式下是没有grub-install这个命令的。
-
删除vmlinuz和initramfs文件,无法启动,恢复之
下面我来讲下这两个文件一个是内核文件,一个是虚拟文件系统文件,都是grub的核心文件,我们在编写grub.conf这个配置文件的时候其他的都可以不写,但是这两个文件却不能省略。initramfs 文件可以在救援模式使用
mkinitrd命令进行生成,mkinitrd initramfs-`uname -r`.img `uname -r`
下面我来讲下几种解决上述问题的方法。
1、有网络时,因为一般公司里的主机里的内核文件及文件系统文件的版本都是同一种,所以我们可以联通上特定的主机,使用scp这个命令将缺失的文件拷贝过来,前提是得有这个主机的密码。
2、当没有网络时我们可以进入救援模式,安装内核文件中的/boot目录,当然如果不嫌麻烦可以将内核全部重新安装一遍,不过命令是这样的
rpm -ivh ~kernel…. +路径 –force,内核会自己判断哪些缺失文件,这样也节省了不少时间。
3.这种方法就是挂载光盘文件找到 isolinux目录找到vmlinuz、initramfs文件进行复制到、boot目录即可。
好的如果你觉得这些还不够,后面还有猛料哦
-
删除/etc/fstab和/boot 目录的所有文件,并恢复之
其实这个也不复杂,就是进入救援模式重新安装内核,前提是得先挂载光盘
chroot=/mnt/sysimage rpm -ivh ~Packages/kernel~ --force| replacepkgs然后进而重新安装grub文件。 grub-install --root-directory=/ /dev/sd#安装完成后重新编辑grub.conf文件。 启动后对/etc/fstab文件进行修复。
-
增加新硬盘,在其上制作能单独运行kernel和bash的系统
这里假设我们原来的硬盘在/dev/sda上面,我们这里新加一块/dev/sdb 接下来我们对其进行分区及格式化、fdisk /dev/sdb 分出200M大的一块/dev/sdb1磁盘 然后在对其进行格式化,mkfs.ext3 /dev/sdb1 完成后我们在/mnt目录里新建/sysroot 来模拟一个根文件系统, 我们在/sysroot里新建根目录的那些文件夹,这里使用如下脚本调入我们需要引入的命令,在执行的时候我们将根写为/mnt/sysroot即可。 ``` shell#!/bin/bashRead -p ‘ Please input your root dirname’ rootdir ch_root="$rootdir"[ ! -d $ch_root ] && mkdir $ch_rootbincopy() {if which $1 &>/dev/null; then local cmd_path=`which --skip-alias $1` local bin_dir=`dirname $cmd_path` [ -d ${ch_root}${bin_dir} ] || mkdir -p ${ch_root}${bin_dir} [ -f ${ch_root}${cmd_path} ] || cp $cmd_path ${ch_root}${bin_dir} return 0 else echo "Command not found." return 1 fi}libcopy() { local lib_list=$(ldd `which --skip-alias $1` | grep -Eo '/[^[:space:]]+') for loop in $lib_list;do local lib_dir=`dirname $loop` [ -d ${ch_root}${lib_dir} ] || mkdir -p ${ch_root}${lib_dir} [ -f ${ch_root}${loop} ] || cp $loop ${ch_root}${lib_dir} done} read -p "Please input a command or quit: " command while [ "$command" != "quit" ];do if bincopy $command ;then libcopy $command fi read -p "Please input a command or quit: " commanddone
执行完成后我们将/bin/bash 拷贝到/mnt/sysroot/bin目录中作为我们系统启动后的第一个初始化程序运行,然后我们将/boot目录整个复制到/mnt/sysroot目录中,这里我们重新编写一下/mnt/sysroot/boot/grub/grub.conf文件,我们注意更改一些grub的根和文件系统的根即可。好了,小伙伴们准备好了吗,赶紧去试一试吧,这里我就不贴图了。
-
6、 下面我这里对上述问题再深化了一下,因为就是喜欢折腾,根本停不下来,原来我们的boot目录是在根文件系统下面,我们这里新加一块硬盘,读入
echo '—-' /sys/class/scic_host/host2/scan 将它进行重新分区,假设我们这边的根文件系统的磁盘是/dev/sda,我们这里新加的磁盘是/dev/sdb,我们将之新加一个分区/dev/sdb1,格式化为ext3,,这里我们将/boot文件目录下的文件先已到/tmp目录下,然后将它解挂载到/dev/sdb1,这里我们进入救援模式,在输入chroot =/mnt/sysimage后,我们输入捕获1.PNG
注意这里的安装目录写原来的根文件系统所在目录,这里我们容易混淆,接下来我们重启进入硬件启动,我们输入
捕获2.PNG
然后我们继续输入
捕获3.PNG
然后输入
捕获4.PNG
进入文件系统后重新编写/boot/grub/grub.conf文件即可。
-
下面我们做个实验
-
实验目的:
-
使用linux recuse模式修复Linux系统
-
实验步骤:
-
一、人为删除系统关键文件
-
登陆linux系统之后,依次执行以下命令人为破坏当前linux系统:
-
#cd /#umount /boot ---卸载/boot分区#rm -rf /boot ---删除/boot目录(boot目录下包含所有GRUB有关的文件)#rm -rf /etc/inittab ---删除init表(此文件定义了系统运行级别和脚本)#rm -rf/etc/rc.d/rc.sysinit ---删除init运行级别脚本文件#rm -rf/etc/rc.d/rc.local ---删除开机脚本文件#mv /etc/fstab/etc/fstab.bak ---备份系统挂载表fstab文件(此文件记录了linux分区信息)
-
sync —将系统缓冲区的内容写入硬盘(在Linux系统中,当数据需要存入磁盘时,通常会先放到缓冲区内,等到适当的时刻再写入磁盘,如此可提高系统的执行效率)
-
reboot
-
经过这一番蹂躏之后,系统肯定是挂了的。。。。。最后一条reboot命令已经无法正常执行了。。。手动重启系统也是无法进入系统了的。。。。。。但是,只要根分区没有被格式化,就可以进入linux修复模式恢复该linux系统。
二、修复linux系统 -
思路:恢复fstab文件找到分区à修复引导里的内核文件à修复grub –>还原init相关文件
1.进入修复模式 -
通过RHEL5光盘引导进入安装会话,输入linux rescue或按F5键进入rescue修复模式。
-
进入修复模式之后,系统会提示选择语言Language和键盘类型Keyboard,直接回车就行了。
系统会再次询问是否配置网络,选择No,因为修复系统不需要用到网络。。然后会提示如下: -
Rescue程序将查找当前硬盘上是否有已安装的linux系统,如果找到了的话,就自动挂载到/mnt/sysimage下。选择”Continue”继续,rescue程序会搜索硬盘是否存在已安装过的linux和硬盘分区,最终结果如下图:
-
搜索结果显示,找不到Linux分区,因为/etc/fstab文件被删除了,所以导致系统无法读取Linux分区,但是如果找到了,就将它挂到/mnt/sysimage里面,可以读写。选择”OK”确定之后,系统会进入到修复模式的shell下。
-
2.还原fstab文件
-
根据上面步骤得知,rescue程序无法找到硬盘分区,所以现在要做的事情就是恢复linux分区——也就是fstab文件(这个fstab文件在删除之前,有做过备份/etc/fstab.bak)。
-
fdisk -l 查看磁盘分区
-
根据fdisk –l输出,得到系统分区有两个/dev/sda1和/dev/sda2。可使用e2label命令查看这两个分区的卷标,
-
由上图可得知/dev/sda1是/boot分区,而/dev/sda2无法查看,因为sda2是LVM分区。
使用命令激活LVM分区#lvm vgchange-ay 这个命令的作用就是告诉系统建立相关的device-mapper,这样就可以看到/dev下建立了/dev/mapper/VGname-LVname和/dev/VGname/LVname的设备文件和链接文件. -
使用ls /dev/mapper命令可以看到VolGroup00-LogVol00(就是/根分区)和VolGroup00-LogVol01(就是swap分区)
接下来,要挂载/根分区,并恢复fstab文件。 -
mkdir test —建立一个空目录用于挂载分区
-
mount -t ext3 /dev/VolGroup00/LogVol00 /test —挂载包含根分区的LVM分区到test目录下
-
将系统原来的/根分区挂载到/test目录之后,就可以还原fstab.bak到fstab了!
-
#cp /test/etc/fstab.bak /test/etc/fstab ----还原fstab文件#reboot ----重启系统
-
3.修复内核和grub
-
重启之后,按ESC键选择CDROM引导,输入linux rescue再次进入到修复模式。
此时再次进入到修复模式时,rescue程序将会找到fstab文件,也就是会找到linux分区!并且把损坏的原linux系统挂载到/mnt/sysimage下。并且rescue程序会提示你,可以使用#chroot(changeroot修改根目录)修改根目录,进入到原系统中。如下图所示: -
选择OK之后,系统已经全部挂载到了/mnt/sysimage,如果想进去,敲入#chroot/mnt/sysimage,修改根目录为/mnt/sysimage,使用ls命令可以查看原系统里的文件和目录。使用exit可以退回rescue程序下,再次使用ls命令可以比较一下区别。
-
一般把处于resuce模式的系统称为伪系统,把#chroot/mnt/sysimage后看到的称为真正的系统。
接下来要修复内核文件: -
#exit ---退回到resecu模式下#mount /dev/hdc /mnt/source ---挂载光驱cdrom到/mnt/source目录#rpm -ivh /mnt/source/Server/kernel-2.6.18-164.e15.i686.rpm--root=/mnt/sysimage/ --force
-
(需要修复的三个内核文件在系统盘server目录下kernel-2.6.18.rpm软件包里,所以要挂载光盘之后并安装kernel软件包)
-
此时,内核已修复完成!再继续修复grub程序。。。
-
#chroot /mnt/sysimage 进入到已损坏的linux系统中#grub-install /dev/sda 安装grub程序到/dev/sda#ls /boot/grub 查看grub目录下是否存在grub.conf文件。如果没有就手动编辑一个。#vim /boot/grub/grub.conf
-
手动编辑grub.conf配置文件内容如下:
-
保存退出。。。grub修复完成!
-
4、修复/etc/inittab等文件
-
#rpm -qf /etc/inittab 查询包含inittab文件的软件包#rpm -qf /etc/rc.d/rc.sysinit 查询包含rc.sysinit文件的软件包#rpm -qf /etc/rc.d/rc.local 查询包含rc.local文件的软件包
-
经过rpm –qf查询命令可得知,要修复的文件都包含在initscripts-8.45.rpm这个软件包里面。
下一步,要把文件从这个RPM里面分离出来,并还原到/etc目录下. -
#exit#cp /mnt/source/Server/initscripts-8.45.30-2.el5.i386.rpm /mnt/sysimage/tmp#chroot /mnt/sysimage#cd tmp/#ls#rpm2cpio initscripts-8.45.30-2.el5.i386.rpm |cpio -imd 解压软件包到当前目录#ls 两个ls命令注意比较区别#cd etc/#ls#cp inittab /etc/#cp rc.sysinit /etc/rc.d/#cp rc.local /etc/rc.d/
-
最后只需要reboot就可以正常进入到linux系统了!!!! OVER!
原创文章,作者:sjfbjs,如若转载,请注明出处:http://www.178linux.com/45277