linux学习记录
分类:
2010-08-25 15:29:06
关于linux系统的启动过程和troubleshooting实验的讨论,
Linux系统启动过程大致安装按照如下步骤进行(这是一个简述)
第一阶段: BIOS启动引导阶段(BIOS的初始化)
在该过程中实现硬件的初始化以及查找启动介质
选择引导设备,读取和执行引导设备的第一个扇区(MBR)
MBR = bootloder(启动设备) + 分区表 + 结束位
512B 446B(grub) 16*4B 2B
第二阶段: GRUB启动引导阶段
Grub的配置文件在/boot/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/sda3
# initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Server (
root (hd0,0)
kernel /vmlinuz-
initrd /initrd-
~
~
"/boot/grub/grub.conf"
这个就是grub.conf文件的配置内容
读取grub的配置文件
关于grub.conf的配置说明
Default=0
默认情况下从第一个操作系统启动(0为第一个)
Timeout=5
如果在5s不做任何选择,则按默认系统启动
Splashimage=(hd0,6)/grup/splash.xpm.gz
系统启动时候的彩色图片
Hiddenmenu
隐藏菜单
Title Red hat enterprise linux Server (
描述
Root (hd0,0)
boot分区所在的位置
Kernel /vmlinuz-
加载kernel 以只读的方式挂载根分区
参数 rhgb:使用图形化启动 quiet:提示报错
Initrd /initrd -
加载RAM DISK文件,他会加载所有系统启动时候需要的模块
第三阶段: 内核初始化
启动init进程,一切进程的“祖父”,读取/etc/inittab文件。
1. /etc/inittab
初始化允许级别
系统初始化脚本
对应允许级别的脚本目录
关于init的级别
0 关机
1 单用户模式
2 多用户模式
3 字符界面
4 保留给开发人员
5 图形界面
6 重启
S s single 备用的单用户模式
Emergency 紧急模式(绕过rc.sysinit.sulogin)
2. /etc/rc.d/rc.sysinit
(1) /etc/fstab 检查并挂载其他的文件系统
(2) 启用交换分区
(3) 启用磁盘配额
(4) 检查并重新挂载根文件系统
(5) 等等,还有很多。
3. /etc/rc.d/rc.X.d
X 代表运行级别
运行在/etc/rc.d/rc.X.d中定义的不同运行级别的服务初始化脚本
启动服务==è链接在/etc/init.d/
K: kill S:Start
4. /etc/rc.d/rc.local/
开机脚本
关于linux的troubleshooting试验
一. 破解linux系统管理员的密码
首先重启计算机,进入grub选择界面
现在我们给内核传了一个“1”的参数,表示下次启动进入单用户模式
这个时候将进入单用户模式
二. 加密grub
破linux系统的密码很简单,因此要加密grup,让用户不能够轻易的破解密码。
因为GRUB支持md5的密码保护。可以生成md5的加密
用Grub-md5-crypt 来生成一个md5加密
[root@localhost ~]#
[root@localhost ~]# grub-md5-crypt
Password:
Retype password:
$1$H/acS/$1IO4fc3Kw75LMLZIH5Md8.
[root@localhost ~]#
然后将一个md5的值导入/boot/grub/grub.conf这个文件中
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/sda3
# initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
password --md5 $1$H/acS/$1IO4fc3Kw75LMLZIH5Md8.
title Red Hat Enterprise Linux Server (
root (hd0,0)
kernel /vmlinuz-
initrd /initrd-
~
~
"/boot/grub/grub.conf"
我们已经在hiddenmenu下面加上了一行password –md5 xxxxxxxxxxxxxxxxxxx(md5值)
现在我们重启计算机,
再来尝试破解linux管理员的密码,
可以看到,现在我们进入了grub的选择界面,但是我们并不可以想刚才那样直接进去编辑grub,而是提示我们这里需输入密码,才可以编辑grub。这个密码就是我们刚才设置的,而且是经过MD5的加密,现在输入“p”,然后输入密码。
三. 修复grub配置文件
我们知道/boot/grub/grub.conf这个文件是Grub的配置文件,这个文件是linux系统启动的核心文件,如果这个文件不小心被用户给损坏了,那么如何去修复grub的配置文件呢。
首先我把系统中的/boot/grub/grub.conf这个文件删除
[root@localhost ~]# cd /boot/grub/
[root@localhost grub]#
[root@localhost grub]# rm -rf grub.conf
[root@localhost grub]# ls
device.map iso9660_stage1_5 reiserfs_stage1_5 ufs2_stage1_5
e2fs_stage1_5 jfs_stage1_5 splash.xpm.gz vstafs_stage1_5
fat_stage1_5 menu.lst stage1 xfs_stage1_5
ffs_stage1_5 minix_stage1_5 stage2
[root@localhost grub]#
现在我们重启计算机,
我们已经手动敲出grub.conf文件,系统正常启动。但是,进入系统后。一定要把grub.conf文件在手动写出来。不然每次重启时,你都将手动敲出grub.conf。
四.修复/boot分区下面所有文件
我们知道/boot分区下面有内核文件,RAM DISK文件,还有grub目录,这些文件都是系统启动时候的重要文件,如果这些文件全部都丢失,我们将如何去修复系统呢,如果是这样,我们只能够进入修复模式来修复系统。
首先我们将/boot分区下面的所有文件给删除,
[root@localhost ~]#
[root@localhost ~]# rm -rf /boot/*
[root@localhost ~]# cd /boot/
[root@localhost boot]# ls
[root@localhost boot]#
已经删除了/boot下面的所有文件,只能够进入救援模式来修复系统了。
我们可以通过光盘来进入修复系统,当然也可以通过网络来引导进入修复模式,这里我从网络引导进入(由网络引导必须事先配置好服务器)。
现在我将系统设置成网络引导,
然后输入linux rescue 进入救援模式,
然后依次选择,语言,键盘布局,
它提示我们系统的所有分区都已经被挂载到/mnt/sysimage里,
如果/etc/fstab文件丢失了,所有分区都不会被读取到。
现在我们就已经进入了救援模式,
首先我们使用df -h命令来查看一下分区的状况,
可以看到,这里面所有的东西都是有光盘提供的,并不是真实的系统,而真是的分区全部被挂载到/mnt/sysimage。而且我们的网络资源在修复模式下面也是可以被读取到的。
现在我们进入/mnt/sysimage
可以使用chroot /mnt/sysimage 来进入真实的系统,
(可以把由光盘引导进入的系统叫做假系统,通过chroot /mnt/sysimage这个命令得到的是真实的环境)
进入到的真系统了,/boot分区里面什么东西都没有了,被我们刚才全部给删除了。
现在我们就开始修复系统,
由于/boot分区中的文件被全部删除了,
首先要恢复内核文件,然后再去恢复grub文件,
因为在chroot环境中,读不到光盘中的文件。只能够退出chroot环境。回到的假系统中。
利用网络资源来修复系统,
现在我们将内核的软件包复制到/tmp目录下去,然后重新安装内核。
可以看到,重新安装完内核,/boot分区下面的内核文件和RAM DISK文件全部就都恢复回来了。
现在还要来恢复grub目录,我们需要重写grub。
OK,grub目录就恢复成功了,
现在我们需要做的事情就是恢复grub.conf文件,
现在/boot下面所有的文件都已经修复回来了,
现在在reboot重启系统,系统应该可以正常工作了。
五. 修复init脚本
刚才我们只是将/boot分区下面的所有东西给删除了,现在我们将/etc/inittab和/etc/rc.d/rc.sysinit和/etc/rc.d/rc.loacl给删除,然后将/etc/fstab文件给重名,这些文件都是系统在启动的时候需要读取到的脚本文件,如果将这些文件给删除,那么我们将如何修复系统呢,同样的,我们也只能够通过救援模式来修复系统。
[root@station20 ~]#
[root@station20 ~]# rm -rf /etc/inittab
[root@station20 ~]#
[root@station20 ~]# rm -rf /etc/rc.d/rc.sysinit
[root@station20 ~]#
[root@station20 ~]# rm -rf /etc/rc.d/rc.local
[root@station20 ~]#
[root@station20 ~]# mv /etc/fstab /etc/fstab.bak
[root@station20 ~]#
看到这个提示与上面不同,上面还可以读取到分区,而且还挂载在/mnt/sysimage下面。由于/etc/fstab文件丢失,将读取不到任何分区。所有要做的第一件事情,就是要恢复/etc/fstab文件,这个是最基本的。
由于/etc/fstab文件的丢失,我们不知道根分区在哪里,我们使用fdisk -l命令来查看一下分区情况,并用e2lable命令来找到根分区。
现在我们已经知道/dev/sda3就是根分区了,创建一个目录,并挂载根分区。
现在根分区已经挂载到/tmp/redhat目录下面了。进入这个目录,将/etc/fstab文件给该回来。
这个时候已经把/etc/fstab文件给改回来了,在重启看一下。当然系统肯定还是起不来的
再次进入救援模式,
这个时候,看到的界面已经和上面不一样了。系统的所有分区都已经被挂载到/mnt/sysimage下面去了,因为我们的/etc/fstab这个文件刚才被修复了。
下面在来恢复/etc/inittab文件,
首先要查询一下/etc/inittab这个文件是属于哪个包,然后在去安装这个包。从而恢复/etc/inittab这个文件。
我们现在到/etc/目录下面去看看,那几个文件是否被恢复回来了。
OK。这几个文件就全部都恢复回来了。
现在系统就应该可以正常工作了。
六.关于紧急模式
现在我们改变/etc/fstab这个文件里面的/home分区的卷标。
然后重启计算机,
系统将自动进入紧急模式,
在紧急模式下面,需要输入密码。
在紧急模式下面,系统将绕过/etc/rc.d/rc.sysinit这个脚本,在这个模式里,根文件系
统将是只读的。
OK,将/etc/fstab文件中的/home卷标改回来了。
系统就可以正常启动了。
关于linux系统的启动和troubleshooting试验就是这么多了。