1、开机篇
下面首先顺一遍开机的总体流程:
1、加载BIOS的硬件信息,获得第一个开机装置的代号。
2、读取第一个开机装置的MBR的boot loader(Lilo或者grub等)的开机信息。
3、加载kernel操作系统核心信息,kernel开始解压缩,并尝试驱动所有硬件装置。
4、kernel执行init程序并取得run—level的信息。
5、init执行/etc/rc.d/rc.sysinit文件。
6、启动核心的外挂模块(/etc/modprobe.conf)
7、init执行run-level的各个批次文件(Scripts)
8、init执行/etc/rc.d/rc.local文件。
9、执行/bin/login程序,并等待使用者登入。
10、登入之后开始以shell控管主机。
接下来,我们顺着这个大的顺序,一步一步的分析,首先我们来思考,为什么需要一个boot loader程序?而且这个程序还要装在BMR里面,而这个boot loader又有什么功能呢?
我们的操作系统核心必须要认识:磁盘的文件系统才能读取里面的数据,但是整个系统才刚刚到开机的地方,根本没法认识磁盘文件的格式,这就需要boot loader 来辅助。boot loader 有办法加载linux 的核心(kernel),这就是说我们必须选择一种能够支持linux 文件系统的boot loader。。所以grub或者lilo就被用做了boot loader了。。。
所以我们在用grub开机的时候,grub会显示好几个开机选项,比如有linux 也有windows,我们选择了对应的选项,系统就会跑到该扇区去读取操作系统的核心。
接下来,linux会将核心解压缩到存储器(内存)中,并且利用核心的功能,开始测试与驱动周边的装置包括存储装置、cpu、网卡、声卡等、那么这个核心文件,也就是boot loader所以指向的文件到底在哪?在我们安装操作系统的时候,这个文件会被放在/boot里面。并且取名:/boot/vmlinuz。
有一个重要的问题,在加载linux核心的过程中,系统只会 挂载根目录,而且还是只读的。但是这里有个问题,读取核心之后我们就会运行各种驱动,去读写执行各种驱动文件,这是需要磁盘空间读写的,怎么办?
操作系统会自己创建一个虚拟硬盘(RAM Disk)来辅助的,这就是initrd和linuxrc,在利用boot loader的功能加载核心vmlinuz的时候,一起加载initrc的映像文件(/boot/initrd-xxxx.img),linux会主动以initrd来进行虚拟磁盘的创建,并利用linuxrc(包含在initrd的映像文件中)来进行加载模块的动作。
在核心驱动周边硬件的工作完成之后,initrd所建立的虚拟磁盘就会被移除了。不要要注意的是,initrd并非必要的,是可有可无的。
总之,boot loader可以找到linux的核心档案并且将他加载到主存储器当中,通知可能可以借由initrd建立起虚拟硬盘(RAM Disk)辅助开机的进行,最后将读自bios的主机硬件数据交由linux核心来进行侦测并加载适当的驱动程序,真个流程如下:
核心加载完成之后,主机就应该开始正常运作了,下面要执行系统的第一个程序:/sbin/init
init 这支程序所做的工作相当的多, 他除了利用设定文件『 /etc/inittab 』来取得开机的等级 ( Run level ) 之外,还会经由这个 run level 的设定值来进行不同的开机服务项目的启动。(可以这样理解:init程序——通过读取/etc/inittab文件——获得run-level——根据run-level的设定值来选择开启对应的服务或者程序)
/etc/inittab
[root@linux ~]# vi /etc/inittab
id:3:initdefault: # 设定系统开机预设的 run level 设定项目:
si::sysinit:/etc/rc.d/rc.sysinit # 开始进行 run level 的服务启动前,使用来侦测与初始化系统环境的设定文件:
# 7 个不同 run level 的,需要启动的服务的 scripts 放置路径:
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
# 是否允许按下 [ctrl]+[alt]+[del] 就重新开机的设定项目:
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
# 本机端终端机启动的个数:
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
# 在 X Window (run level 5) 环境下的启动 script 设定项目:
x:5:once:/etc/X11/prefdm -nodaemon
/etc/rc.d/rc.sysinit:处理系统初始化流程
还记得上面提到 /etc/inittab 里头有这一句『 si::sysinit:/etc/rc.d/rc.sysinit 』吧? 这表示:『我开始加载各项系统服务之前,得先做好整个系统环境,我主要利用 /etc/rc.d/rc.sysinit 这个 shell script 来设定好我的系统环境的。 所以,我想要知道到底 FC4 开机的过程当中帮我进行了什么动作, 就得要仔细的分析 /etc/rc.d/rc.sysinit 啰。
这个/etc/rc.d/rc.sysinit主要的工作大致有如下几项:
1、取得网络环境与主机类型:首先读取网络设定文件/etc/sysconfig/network,取得主机名或网关等。
2、测试与挂载内存装置/proc 和USB装置 /sys
3、接口设备的侦测与plug and play参数测试:根据核心在开机时侦测的结果 (/proc/sys/kernel/modprobe ) 开始进行 ide / scsi / 网络 / 音效 等接口设备的侦测,以及利用以加载的核心模块进行 PnP 装置的参数测试。
7. 设定系统时间 (clock):
8. 设定终端机 (console) 字形:
9. 设定 RAID 与 LVM 等硬盘功能:
10. 以 fsck 检验磁盘档案系统:
11. 进行磁盘配额 quota 的转换 (非必要):
12. 重新以可读取模式挂载系统磁盘:
13. 启动 quota 功能:
14. 启动系统随机数装置 (产生随机数功能):
15. 清除开机过程当中的临时文件:
16. 将开机相关信息加载 /var/log/dmesg 档案中。
如此一来,在/etc/rc.d/rc.sysinit就已经将基本设定数据都写好了,也将系统的数据设定完整,如果你想知道系统在开机时到底发生了什么。就用dmesg就可以知道了。
init.d
/etc/init.d 是 /etc/rc.d/init.d 的软链接(soft link)。可以通过 ll 命令查看,如下:
/*********************************************************************************************************************
[root@Rex ~]# ll /etc/init.d
lrwxrwxrwx 1 root root 11 3?10 09:24 /etc/init.d -> rc.d/init.d
*********************************************************************************************************************/
init.d指的是/etc/rc.d/init.d目录。
本文包括3部分内容
1、 Linux的引导过程
2、 运行级别
3、 /etc/rc.d/ 与/etc/rc.d/init.d的关系
“/etc/rc.d/init.d/目录下的脚本就类似与windows中的注册表,在系统启动的时候某些指定脚本将被执行”。开始之前,先引用李善明经理昨天晚上总结时的一个理解,让大家先对init.d目录有个大概的印象。
在进入init.d之前,我们一起来做两个准备工作,linux的引导过程和运行级别的概念:
一、 Linux的引导过程
系统启动之后,在进入init.d之前,我们先来看看系统都做了什么工作。
系统加电之后,首先进行的硬件自检,然后是bootloader对系统的初始化,加载内核。内核被加载到内存中之后,就开始执行了。一旦内核启动运行,对硬件的检测就会决定需要对哪些设备驱动程序进行初始化。从这里开始,内核就能够挂装根文件系统(这个过程类似于Windows识别并存取C盘的过程)。内核挂装了根文件系统,并已初始化所有的设备驱动程序和数据结构等之后,就通过启动一个叫init的用户级程序,完成引导进程。
Init进程是系统启动之后的第一个用户进程,所以它的pid(进程编号)始终为1。init进程上来首先做的事是去读取/etc/目录下inittab文件中initdefault id值,这个值称为运行级别(run-level)。它决定了系统启动之后运行于什么级别。运行级别决定了系统启动的绝大部分行为和目的。这个级别从0到6 ,具有不同的功能。不同的运行级定义如下:
# 0 - 停机(千万别把initdefault设置为0,否则系统永远无法启动)
# 1 - 单用户模式
# 2 - 多用户,没有 NFS
# 3 - 完全多用户模式(标准的运行级)
# 4 – 系统保留的
# 5 - X11 (x window)
# 6 - 重新启动 (千万不要把initdefault 设置为6,否则将一直在重启 )
由于 run level 0, 4, 6 不是关机、重新开机就是系统保留的,所以:不能将预设的 run level 设定为这三个值 , 否则系统就会不断的自动关机或自动重新开机....
写到这里,应该差不多要进入init.d了,可是我觉得单写/etc/rc.d/init.d的话不一定能说得清楚明白,就拿它跟/etc/rc.d这个它上一级的目录一起来讨论,可能比较合适一些,因为他们之间有着千丝万缕的关系。 在这里先解释一下init.d里面放的都是什么东西。这个目录存放的是一些脚本,一般是linux以rpm包安装时设定的一些服务的启动脚本。系统在安装时装了好多rpm包,这里面就有很多对应的脚本。执行这些脚本可以用来启动,停止,重启这些服务。 前面说到,/etc/rc.d/init.d这个目录下的脚本就类似与windows中的注册表,在系统启动的时候执行。程序运行到这里(init进程读取了运行级别),相信从命名的角度大家也能猜到该运行/etc/rc.d/init.d里面的脚本了,不然它为什么也叫init(.d)呢是吧。没错,是该运行init.d里的脚本了,但是并不是直接运行,而是有选择的因为系统并不需要启动所有的服务。 那么,系统是如何选择哪些需要启动哪些不要呢?这时刚才说的运行级别就起作用了。在决定了系统启动的run level之后,/etc/rc.d/rc这个脚本先执行。在RH9和FC7的源码中它都是一上来就check_runlevel()(虽然实现的代码不一样,也大同小异),知道了运行级别之后,对于每一个运行级别,在rc.d下都有一个子目录分别是rc0.d,rc1.d ….. rc6.d。每个目录下都是到init.d目录的一部分脚本一些链接。每个级别要执行哪些服务就在相对应的目录下,比如级别5要启动的服务就都放在rc5.d下,但是放在这个rc5.d下的都是一些链接文件,链接到init.d中相对应的文件,真正干活到init.d里的脚本。 redhat9 ls fc7 ls -l 这样看的就很清楚了。
到这里,估计大家可能都比较清楚了,我开始也以为是这样的。可是后来我仔细看过和比较这些链接文件和init.d里真正被执行的脚本的文件名之后,一直有几个问题没弄明白。借着写这个文章的机会,我做了一些功课,总算是大概解开了那些疑惑。
1、这些链接文件前面为什么会带一个Kxx或者Sxx呢?
是这样的,带K的表示停止(Kill)一个服务,S表示开启(Start)的意思
2、K和S后面带的数字呢?干什么用的
这个我开始的时候还以为是排列起来好看或者数数用呢。后来发现不是的。它的作用是用来排序,就是决定这些脚本执行的顺序,数值小的先执行,数值大的后执行。很多时候这些执行顺序是很重要的,比如要启动Apache服务,就必须先配置网络接口,不然一个没有IP的机子来启动http服务那岂不是很搞笑。。。
3、无意中我发现同一个服务带S的和带K的链接到init.d之后是同一个脚本。我就纳闷了,为什么会是执行同一个脚本呢?
这个时候真是S和K的妙用了,原来S和K并不止是用来看起来分的清楚而已。S给和K还分别给init.d下面的脚本传递了start和stop的参数。哦,是这样的(焕然大悟的样子,呵呵)!这时我才想起来原来曾经无数用过的/etc/rc.d/init.d/network restart命令。原来传S时相当于执行了/etc/rc.d/init.d/xxx start这条命令,当然K就相当于/etc/rc.d/init.d/xxx stop了
GRUB引导下进Linux单用户模式的三种方式,修改root密码
首先,启动电脑,屏幕出现是GRUB的提示:
‘e’ 在booting前编辑启动命令行
‘a’ 在booting前编辑kernel的参数
‘c’进入grub命令行
由此按‘e’、a’、‘c’三个不同的键,进入三种不同的操作:
1.快速法:
选择FedoraCore (2.6.9-1.667)菜单,
按a键:
grubappend>,versacehandbags;ro root=/dev/VolGroup00/LogVol00 rhgb quiet
修改成:
grubappend>ro root=/dev/VolGroup00/LogVol00 single quiet
按ENTER键完成修改并booting进入Linux单用户模式
sh-3.00#passwd
这时就会让你输入新的root密码,输入后,还出来sh-3.00#就不用管了,好像一会就能进入下面的重启的,又输了下reboot,重启生效。
2.简便法:
选择FedoraCore (2.6.9-1.667)菜单,
按e键:
root(hd0,2)
kernel/vmlinuz-2.6.9-1.667 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
initrd/initrd-2.6.9-1.667.img
选择kernel/vmlinuz-2.6.9-1.667 ro root=/dev/VolGroup00/LogVol00 rhgb quiet命令行
按e键:
grubedit>kernel /vmlinuz-2.6.9-1.667 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
修改成:
grubedit>kernel /vmlinuz-2.6.9-1.667 ro root=/dev/VolGroup00/LogVol00 singlequiet
按ENTER键完成修改
按b键booting进入Linux单用户模式
sh-3.00#
3.手动法:
按c键进入grub命令行:
(在grub命令行下按TAB键可得到grub命令帮助与grub命令的可能选项)
grub>fstest(
grub>filesystemtracing is now on
grub>root(hd0,2) (
(指定保存有Linux内核的分区为第一个硬盘的第三个分区)
grub>filesystemtype is ext2fs,partition type 0x83
grub>kernel/vmlinuz-2.6.9-1.667 ro root=/dev/VolGroup00/LogVol00 single quiet (
(指定内核文件为/boot/vmlinuz-2.6.9-1.667,内核参数为ro―readonly,根分区为/dev/VolGroup00/LogVol00,rhgb―图形方式启动,quiet―不输出启动信息)
grub>initrd/initrd-2.6.9-1.667.img (
(在内核启动前加载支持系统硬件设备的内核模块---initrd镜像文件--/boot/initrd-2.6.9-1.667.img,并初始化RAM disk)
grub>boot(
如果系统的配置与脚本文件正确,以上三种方式在Booting command-list中都会出现:
remountingroot filesystem in read-write mode:[OK]
表示此时linux单用户模式下的根文件系统处于可读可写状态。
如果系统的配置与脚本文件出现错误,linux单用户模式下的根文件系统进入“read-only file system”既只读状态,此时,打入:
sh-3.00#mount?o remount rw ?t ext3 /
让根文件系统重新mount成可读写,你就可以自由编辑出现错误的系统文件了。
1,启动后按e键:
root (hd0,2)
kernel /vmlinuz-2.6.9-1.667ro root=/dev/VolGroup00/LogVol00 rhgb quiet
initrd /initrd-2.6.9-1.667.img
2,选择kernel /vmlinuz-2.6.9-1.667 roroot=/dev/VolGroup00/LogVol00 rhgb quiet命令行
3,按e键:
grub edit>kernel /vmlinuz-2.6.9-1.667 roroot=/dev/VolGroup00/LogVol00 rhgb quiet
修改成:
grub edit>kernel /vmlinuz-2.6.9-1.667 1 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
按ENTER键完成修改。就是加个“1”。见红色1。
4,按b键booting进入Linux单用户模式
shell#passwd root
输入root密码两次,reboot即可。
顺便提一下,Ubuntu的root密码是普通用户进入系统之后用passwd命令设置即可。
2、关机篇
在linux下一些常用的关机/重启命令有shutdown、halt、reboot、及init,它们都 可以达到重启系统的目的,但每个命令的内部工作过程是不同的,通过本文的介绍,希 望你可以更加灵活的运用各种关机命令。
1.shutdown
shutdown命令安全地将系统关机。 有些用户会使用直接断掉电源的方式来关闭linux, 这是十分危险的。因为linux与windows不同,其后台运行着许多进程,所以强制关机可能 会导致进程的数据丢失﹐使系统处于不稳定的状态﹐甚至在有的系统中会损坏硬件设备。
而在系统关机前使用shutdown命令﹐系统管理员会通知所有登录的用户系统将要关闭。 并且login指令会被冻结﹐即新的用户不能再登录。直接关机或者延迟一定的时间才关机 都是可能的﹐还可能重启。这是由所有进程〔process〕都会收到系统所送达的信号〔signal〕 决定的。这让像vi之类的程序有时间储存目前正在编辑的文档﹐而像处理邮件〔mail〕和 新闻〔news〕的程序则可以正常地离开等等。
shutdown执行它的工作是送信号〔signal〕给init程序﹐要求它改变runlevel。 Runlevel 0被用来停机〔halt〕﹐runlevel 6是用来重新激活〔reboot〕系统﹐ 而runlevel 1则是被用来让系统进入管理工作可以进行的状态﹔这是预设的﹐假定没有-h也 没有-r参数给shutdown。要想了解在停机〔halt〕或者重新开机〔reboot〕过程中做了哪些 动作﹐你可以在这个文件/etc/inittab里看到这些runlevels相关的资料。
shutdown 参数说明:
[-t]在改变到其它runlevel之前﹐告诉init多久以后关机。
[-r]重启计算器。
[-k]并不真正关机﹐只是送警告信号给每位登录者〔login〕。
[-h]关机后关闭电源〔halt〕。
[-n]不用init﹐而是自己来关机。不鼓励使用这个选项﹐而且该选项所产生的后果往 往不总是你所预期得到的。
[-c]cancel current process取消目前正在执行的关机程序。所以这个选项当然没有 时间参数﹐但是可以输入一个用来解释的讯息﹐而这信息将会送到每位使用者。
[-f]在重启计算器〔reboot〕时忽略fsck。
[-F]在重启计算器〔reboot〕时强迫fsck。
[-time] 设定关机〔shutdown〕前的时间。
2.halt
最简单的关机命令 其实halt就是调用shutdown-h , halt执行时﹐杀死应用进程﹐执行sync系统调用﹐ 文件系统写操作完成后就会停止内核。 参数说明:
[-n] 防止sync系统调用﹐它用在用fsck修补根分区之后﹐以阻止内核用老版本的超级块〔superblock〕覆盖修补过的超级块。
[-w] 并不是真正的重启或关机﹐只是写wtmp〔/var/log/wtmp〕纪录。
[-d] 不写wtmp纪录〔已包含在选项[-n]中〕。
[-f] 没有调用shutdown而强制关机或重启。
[-i] 关机〔或重启〕前﹐关掉所有的网络接口。
[-p] 该选项为缺省选项。就是关机时调用poweroff。 级块〔superblock〕覆盖修补过的超级块。
3.reboot reboot的工作过程差不多跟halt一样﹐不过它是引发主机重启﹐而halt是关机。它 的参数与halt相差不多。
4.init
init是所有进程的祖先﹐它的进程号始终为1﹐所以发送TERM信号给init会终止所有的用户进程﹑守护进程等。shutdown 就是使用这种机制。init定义了8个运行级别(runlevel),
init 0为关机﹐init 1为重启。关于init可以长篇大论﹐这里就不再叙述。另外还有
telinit命令可以改变init的运行级别﹐比如﹐telinit -iS可使系统进入单用户模式﹐
并且得不到使用shutdown时的信息和等待时间
3、重启篇
单用户模式修改root密码:
输入:passwd 回车,然后输入两次新密码;
输入:reboot 回车,重启后完成
3.2、RHEL/OEL 7.* 进单用户模式
Step 1: While booting you might see the splash screen like below, grub is counting the time to boot the default operating system as mentioned in /etc/grub2.cfg; this time press any key to interrupt the auto boot.
Step 2: It will list operating systems (in my case only CentOS installed) that you have installed on the machine, In below that you might find some information about booting the OS and editing the parameters of menu. If you want to enter into single user mode; select the operating system and press “e” edit arguments of kernel.
Step 3: Once you have pressed, you should see the information about the selected operating system. It gives you the information about the hard disk and partition where the OS installed, location of the kernel, language, video output, keyboard type, keyboard table, crash kernel and initrd (Initial ram disk).
To enter into single user mode; Go to second last line (Starts with linux 16 or linuxefi) using up and down arrow then modify the ro argument.
Step 5: Modify it to “rw init=/sysroot/bin/sh”. Once done, press “Ctrl+x”
Now you should be in command line mode with root privileges (without entering password). Now you can start to troubleshoot your system or can do maintenance of your system.
chroot to access your system.
chroot /sysroot |
That’s all, You must chroot to reset root password in CentOS 7 / RHEL 7