多方面修复linux系统

在这篇文章,您将看到以下方面的修复方法:

●内核文件和虚拟

●grub.conf

●grub目录

●boot分区

●fstab文件

●root密码破解

 

首先,要想很愉快的修复linux启动的各种问题,就必然要把linux的启动流程搞清楚。

1. 加载 BIOS 的硬件信息和进行自我测试,并依据设定取得第一个可开机的装置;

2. 读取并执行第一个开机装置内 MBR 的 boot Loader (grub等程序);

3. 依据 boot loader 的设定加载 Kernel ,Kernel 会开始侦测硬件并加载驱劢程序;

4. 在硬件驱动成功后,Kernel 会主动呼叫 init 程序,而 init 会取得 run-level 信息;

5. init 执行 /etc/rc.d/rc.sysinit 档案来准备软件执行的作业环境 (如网络、时区等);

6. init 执行 run-level 的各个服务的启动 (script 方法);

7. init 执行 /etc/rc.d/rc.local ;

8. init 执行终端机仿真程序 mingetty 来启动 login 程序,最后就等待用户登入;

 

boot loader中grub有两个阶段(stage),其中,stage1是引导boot所在的分区,因为我们的kernel在这里面,又因这个分区可能是由不同文件系统格式化的,例如,xfs,ext等,单单MBR的446个bytes不可能存放这么多的东西,所以还要有stage1_5阶段来加载boot分区的驱动,当然是什么驱动那就由你安装操作系统时由什么文件系统格式化决定了,因此在这里我们可以认为为stage1_5的数据在mbr以后。

最终,通过stage1_5识别boot分区,然后加载vmlinuz开头的内核文件。当然,识别boot分区以后,并不是上来就读取内核,而是当识别好boot分区后,它会进入boot/grub/目录的,这个目录存放有stage2阶段的文件,并且有个grub.conf文件,这个文件里记录了linux启动的很多重要启动内容,比如刚才说的了内核文件在哪,根文件系统(rootfs)也就是“/”在哪,但我们知道,rootfs也会有自己的文件系统,它有可能与boot分区都不是同一个文件系统,那么/boot下还要存有rootfs的驱动,也就是以initramfs开头的文件,我们称为虚拟文件系统 (Initial RAM Disk 或 Initial RAM Filesystem) (centOS5x是initrd…)。这里注意,初始默认是ro(只读)挂载。

根挂载完了,就开始加载系统第一个进程——init。首先读取/etc/inittab 文件,它定义了默认的启动模式(defaultrunlevel),然后,在进入相应的启动模式之前,读取/etc/rc.d/rc.sysinit 初始化系统的各项配置,包括/etc/fstab (主机名,swap分区,raid,lvm等),随后再进入例如3模式:/etc/rc.d/rc3.d/K*,S*,然后执行/etc/rc.d/rc.local,最后是mingetty的tty1-6。

既然启动的各项流程都明了的话,接下来开始我们的主题大破坏!!!

首先,解读一下/boot/grub/grub.conf的这个可以调整内核参数的文件:

default=0

timeout=5

splashimage=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title CentOS Linux 6 (2.6.32-642.el6.x86_64)

        root (hd0,0)

        kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=aa1e2a6c-5e45-4da4-9429-b33d23861411 rd_NO_LUKS rd_NO_LVM.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet selinux=0 max_loop=100

        initrd /initramfs-2.6.32-642.el6.x86_64.img

●default :grub菜单默认启动的内核,相对于下一个title(启动菜单描述)

●timeout :默认等待时长

●splashimage :grub菜单背景图片位置。

●kernel /vmlinuz- 这个是修复的必要字段,这个“/”意味着相它的根(存放位置)是boot分区,也 就是上面的root(hd0,0),而/boot这个分区又是相对主机的第一块硬盘的第一个分区,即 /dev/sda1。所以我们也可以这样写:kernel(hd0,0)/vmlinuz

●root=UUID:这个是操作系统的根分区,必不可少,也可以写设备名:/dev/sda2

●ro : 只读挂载根分区,可不加。为了安全考虑,默认是加上的。

●initrd /initramfs: 虚拟文件系统文件,必要!

●rhgb :centOS6启动时的图形界面,不写就变成字符模式。

●quiet:不显示内核启动时等其它一些加载的信息,不写就显示。

可以在quiet后加算定的内核参数,如selinux,max_loop等。

可以在/var/log/boot.log查看启动相关信息,CentOS字样显示之后的过程,没有内核信息。


/etc/rc.d/rc.sysinit 被破坏/删除


默认情况下,系统会按照init进程中的顺序执行,但是如果你把rc.sysinit这个文件删了的话,后续的进程与服务就启动不了,停住不动了。这时,我们可以不运行init,把它指定到别的shell里。

例如:init=/bin/bash

这样的话,我们至少可以执行一些基本的命令或工具来进行修复。


/boot/grub/中的一个或多个或所有文件被破坏/删除  


情况一:grub.conf内容有错误

若单单是grub.conf的内容出问题,例如,title下的kernel或initrd,没了等,我们可以:

重启–>倒计时按任意键–> 进入相应的内核菜单选项按e或c键编辑对应的kernel或initrd–>回车完成。

最简单的可以这样写(initrd同下):

kernel (hd0,0)/vmlinuz-(版本号) root=/dev/sda2

情况二:grub.conf文件被删除

●方法一(重启,grub命令):

重启后会出现以下画面:

图像 002.png 

输入以下命令,包括指定内核与虚拟文件位置。

图像 001.png 

然后会有一段较长的修复时间,修复完成后还要再输一次,方可登入。但因为grub.conf文件并未生成,如果不写一个下次重启还要指定。

●方法二:

光盘启动–>救援模式(recuse)–>start shell(前面选项略)–>cd /mnt/sysimage/boot/grub。vim一个grub.conf。

        情况三:stage系文件被删除

    ●方法一(全面)

MBR主引导446bytes被擦除(dd if=/dev/zero of=/dev/sda bs=10 count=1)。

光盘启动–>救援模式(recuse)–>start shell(前面选项略)–>cd /mnt/sysimage–>grub install /dev/sda

这个命令会在/boot下,创建grub目录,恢复里面的所有除grub.conf文件。

这里因为已经切到了根目录,且boot分区所在的父目录就是根目录。所以就无需再指定 –root-directory=/了。

    ●方法二(依赖grub目录下的stage备份文件)

grub命令–>root(hd0,0)–>setup (hd0)


root密码被破解


我们都知道grub菜单默认是任何人都可以对内核参数修改,从而进入单用户模式(添加init 1参数),最终破解root用户密码。这是很不安全的,所以要对其加密。方法是在grub.conf的timeout

后添加password xxx。如果加在initrd后,则启动都需要密码(对于那个内核)。


内核,虚拟文件系统被删除


vmlinuz-和iniramfs文件没了怎么办呢?当然这时靠grub是不可能的了,我们可以用光盘:

光盘启动–>救援模式(recuse)–>start shell(前面选项略)–>挂载光盘–>复制光盘里的isolinux下的vmlinuz到/boot下,改名称vmlinuz-`uname -r`–>mkinitrd initramfs-`uname -r`.img (有空格)`uname -r`

 

网络救援引导模式

用光盘模拟:

光盘启动–>救援模式(recuse)–>Setup Networking窗口选择“Yes”–>此时用Ctrl+Alt+f2可切换一下,看看是否有IP地址,如果没有回到原终端,即可手动指定,也可DHCP自动获取–>shell–>lftp


/boot所有内容被删除

终极大法,一下解决所有问题:

光盘启动–>救援模式(recuse)–>shell–>rpm -ivh /mnt/cdrom/Packages/kernel…rpm  –root=/mnt/sysimage –replacepkgs |forcegrub目录除外,都恢复了)–> grub-install /dev/sda–>vim grub.conf


/etc/fstab被删除


若这个文件没了则意味着,根分区和boot分区没挂载上,我们需要手动挂载。用df命令看一下分区信息,我们姑且可以先从分区大小大概猜出哪个是boot,哪个是根,然后,临时建一个目录,把觉得有可能的分区挂到这个目录下,进入查看一下内容,发现是目标再vim /etc/fstab 写进去。  

原创文章,作者:菩提本无树,如若转载,请注明出处:http://www.178linux.com/45432

评论列表(1条)

  • 马哥教育
    马哥教育 2016-09-20 14:06

    理论部分写的很详细,后面实际操作简单带过?注重理论也要注重实践哦。