一:实验环境
1):虚拟机
2):linux系统环境
二:实验目标
1):理解Linux启动过程详解
2):理解影响启动的配置文件
3):常见的启动故障排除
4):救援模式的使用
三:实验步骤
第一块
Linux启动过程详解
1. 加载 BIOS 的硬件信息,跟据设定取得第一个可开机引导设置,如:光驱,硬盘,网络,USB; 如果是硬盘为第一引导。
2. 读取硬盘中 MBR 的 bootLoader (亦即是 grub,Lilo 等程序);
硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR)。它由三个部分组成,主引导程序、硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA)。
16*4+446+2=512
注:磁盘默认一个扇区大小为:512字节。 在总共512字节的主引导扇区里 第一部分是:主引导程序(boot loader)占446个字节。主引导程序,它负责从活动分区中装载,并运行系统引导程序。 第二部分是Partition table区(分区表),即DPT,占64个字节,硬盘中分区有多少以及每一分区的大小都记在其中。每个分区表项长16个字节,共64字节为分区项1、分区项2、分区项3、分区项4。 第三部分是MBR有效标识位,占2个字节,固定为55AA。如果这个标志位0xAA55,就认为这个是MBR。
GRUB(GRand Unified Bootloader简称“GRUB”)是一个来自GNU项目的多操作系统启动程序。
3. 依据 boot loader 的设定,到引导分区加载 Kernel ,Kernel 会开始侦测硬件并加载驱劢程序;
4. 在硬件驱动成功后,Kernel 会主动执行 init 程序,而 init 会取得run-level 信息,之后读取init下的/etc/inittab的脚本,在此脚本下有其他三个脚本。分别是/etc/rc.d/rc.sysinit脚本,/etc/rc.d/rc脚本和mingetty脚本进程。
5. init 执行 /etc/rc.d/rc.sysinit 文件来准备软件执行的作业环境 (如网络、时区等);
6. init 执行 run-level 下各个服务并启动 (script 方式);
7. init 执行开机后自动运行脚本 /etc/rc.d/rc.local 文件;
8. init 执行虚拟终端机控制程序 mingetty 来启动 login 程序,最后就等待用户登入啦;
如图:
第二块
Linux启动相关的配置文件
系统启动EL6
BIOS
bootloader(GRUB或 lilo) <--- /boot/grub/grub.conf
执行GRUB和GRUB下的内核kernel
[iyunv@localhost~]# vim /boot/grub/grub.conf
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux (2.6.32-220.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-220.el6.x86_64ro
#在GRUB下中,有内核,,default=0指执行第一块内核。这也就说明了启动步骤,执行GRUB之后执行GRUB下的内核。
执行内核kernel下的init,判断启动级别。
[iyunv@localhost~]# vim /etc/inittab
#Default runlevel. The runlevels used are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3,if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault:
#id:5表示默认的启动级别为5,也可以修改,在这里直接修改就行了。
执行/etc/inittab下的rc.d/rc.sysinit
[iyunv@localhost~]# vim /etc/rc.d/rc.sysinit
if[ -f /etc/sysconfig/network ]; then
./etc/sysconfig/network # First try to mountscratch storage from /etc/fstab, then any #在这里网络服务和开机自动启动的服务/etc/rc.d/rc.sysinit(系统初始化:像:主机名 和/etc/fstab 都在这里指定了...)执行rc.sysinit 完成了包括mount分区 激活swap 加载modules等重要的工作.
启动对应级别下的服务如: init3 级别
/etc/rc.d/rc3.d/(这里的程序/服务S开头的全部开机执行;K开头的开机不执行)
[iyunv@localhost ~]# ls /etc/rc.d/rc3.d
K01certmonger K80sssd S24rpcgssd
K01matahari-host K84wpa_supplicant S24rpcidmapd
K01matahari-network K86cgred S25cups
#rcn.d (n为1到6) 是对应于不同的runlevel下起不同的服务.这些目录下都
是一些符号连接, 连接到/etc/rc.d /init.d下的一些文件.以S开头的表示要启动, 以K开头的不启动.
第一个字母后面的数值是一个优先级.
例:
[iyunv@xuegod63 rc3.d]# vim /etc/init.d/network
#! /bin/bash
# network Bringup/down networking
# chkconfig: 2345 10 90
#看有chkconfig的那一行, 2345表示在runlevel 2 3 4 5下被启动, 10是为此服务的启动顺序, 80为关机时闭此服务的顺序。
[root@xuegod64rc3.d]# ls *network*
K01matahari-network S10network
#看到是以S开头的,即开机是启动,且顺序为第十个。
[root@xuegod64rc3.d]# chkconfig network off #将网络服务关掉
[root@xuegod64rc3.d]# chkconfig --list network #列出网络服务的开关情况
network 0:off 1:off 2:off 3:off 4:off 5:off 6:off
#看到0—6的服务都已经关掉了
[root@xuegod64rc3.d]# ls *network*
K01matahari-network K90network
#再次查看,是以K开头,表示开机不启动。顺序为90
所有服务都运行成功后,
设置开机自动执行某个命令: /etc/rc.local
[iyunv@localhost~]# vim /etc/rc.local
#want to do the full Sys V style init stuff.
touch/var/lock/subsys/local
service httpdstart
#在此目录下写入命令,让阿帕奇 服务器在每次开机启动的时候都自动启动
[iyunv@localhost~]# ll !$
ll/etc/rc.local
lrwxrwxrwx.1 root root 13 7月 2502:18 /etc/rc.local -> rc.d/rc.local
#可以看到的都是指向rc.d,且是一个软连接。实质上/etc/rc.local 与 rc.d/rc.local是一样的。
实验一下。
[iyunv@localhost~]# ll /etc//rc.d/rc.local
-rwxr-xr-x.1 root root 240 7月 2809:13 /etc//rc.d/rc.local
[iyunv@localhost~]# vim !$
#want to do the full Sys V style init stuff.
touch/var/lock/subsys/local
service httpdstart
#在rc.d下看到了刚才写的命令,实验结论正确
运行mingetty,打开tty1-6
[iyunv@localhost~]# ps -axu | grep ming
Warning:bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 2500 0.0 0.0 4116 544 tty2 Ss+ 07:50 0:00 /sbin/mingetty /dev/tty2
root 2504 0.0 0.0 4116 548 tty4 Ss+ 07:50 0:00 /sbin/mingetty /dev/tty4
root 2506 0.0 0.0 4116 544 tty5 Ss+ 07:50 0:00 /sbin/mingetty /dev/tty5
root 2508 0.0 0.0 4116 544 tty6 Ss+ 07:50 0:00 /sbin/mingetty /dev/tty6
root 4981 0.0 0.0 103312 868 pts/0 S+ 09:22 0:00 grep ming
#为什么没有tty1呢?
tty1是没有图像界面的,所以没有tty1
[iyunv@localhost~]# runlevel
N5
第三块—linux下的故障排除
1:预防暴力破解root用户的密码
我们知道进入单用户模式,是可以破解root密码。那么如果防止破解root密码?
只需要加密grub,不让别人破解root密码:
[iyunv@localhost~]# grub-md5-crypt
Password:123456
Retypepassword: 123456
$1$NqF/M$/NbfcyUvA4/1sYg1d9QcE.
#黑体字是密码的密文,是会变动的。
在grub下修改
[iyunv@localhostinit]# vim /boot/grub/grub.conf
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
password--md5 $1$NqF/M$/NbfcyUvA4/1sYg1d9QcE.
titleRed Hat Enterprise Linux (2.6.32-220.el6.x86_64)
root (hd0,0)
#红体子是后加的命令
重启测试:
以前的时候想要编辑grub是只需要按下e就OK的
现在编辑grub时,需要按下p键,然后输入密码:123456
#这个时候我们就进入的单用户模式了,当然是需要具有root用户的密码的。
2:进入救援模式:
例:系统坏了,进不去了:,这个时候该怎么办呢?
进入救援模式拷贝数据
以光盘引导:
#问你是否想要启动网络,在这里是不需要的
#说现在的系统需要挂载到/mnt/sysimage下,点击继续continue
#告诉你现在的系统需要挂载到/mnt/sysimage下,
#点击OK,同一挂载到/mnt/sysimagedirectory下
#现在已经挂载上了,第一个shell start shell 是要用shell脚本的。按回车键之后,下面就可以输入命令 的提示符了,这个时候,就进入了救援模式。
#在这个时候的shadow并 是我们自己的shadow
ramfs : 内存文件系统
chroot /mnt/sysimage # 切换文件系统根
#这个时候进入就是我们自己的shadow了,就可以拷贝文件了。
注:在拷贝完文件之后,怎么退出呢?
1:exit #这是先退出当前的地方,即chroot
2:reboot #这个时候就可以重新启动了
3:救援模式
例:这个时候root用户的密码已经加密了,别人就破解不开了,但是如果自己忘记密码了呢?
系统故障,忘记root用户的密码
解决方法:重启系统进入单用户模式,然后重设密码
1:grub界面按任意键,干预启动过程。
2:e按键,编辑启动时内核接收的选项,增加“1”。
3:enter和b按键,按照修改过的选项启动操作系统。
4:把下图中的x去掉,然后reboot就可以,再次使用root进入密码,就不需要输入密码。
#进入系统之后,输入passwd就可以修改root用户的密码了。
4:磁盘资源
例:磁盘资源耗尽故障
1、:无法写入新的文件,提示“… :设备上没有空间”
2、:部分程序无法运行,甚至系统无法启动
故障原因:
1:磁盘空间已被大量的数据占满,空间耗尽
2:虽然还有可用空间,但文件数i节点耗尽
解决方案:
1. 清理磁盘空间,删除无用、冗余的文件
2 .转移或删除占用大量i节点的琐碎文件
3. 进 入单用户模式、救援模式进行修复或删除文件
5:双系统下的主引导记录变更
例:双系统启动修复
当我们安装双系统环境,先安装Linux再安装Windows;;或者已经安装好双系统环境的Windows损坏,在重新安装Windows后,保存 GRUB的MBR(Master BootRecord,主引导记录)会被Windows系统的自举程序NTLDR所覆盖,造成Linux系统无法引导。 1、如果要恢复双系统引导,首先用上述方法进入救援模式,执行chroot命令如下: sh-4.1#chroot /mnt/sysimage 2、将根目录切换到硬盘系统的根目录中,然后执行grub-install命令重新安装GRUB: sh-4.1#grub-install /dev/sda
3、然后依次执行exit命令,退出chroot模式及救援模式(执行两次exit命令): sh-4.1#exit sh-4.1#reboot #系统重启后,将恢复GRUB引导的双系统启动。
四:实验结束
|