linux 开机、关机与重启篇

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核心来进行侦测并加载适当的驱动程序,真个流程如下:

linux 开机、关机与重启篇_第1张图片

核心加载完成之后,主机就应该开始正常运作了,下面要执行系统的第一个程序:/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的用户级程序,完成引导进程。
二、 运行级别(run level)
   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 设定为这三个值 , 否则系统就会不断的自动关机或自动重新开机....
三、 /etc/rc.d/与/etc/rc.d/init.d的关系
   写到这里,应该差不多要进入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键完成修改
  按bbooting进入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 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密码:

linux 开机、关机与重启篇_第2张图片linux 开机、关机与重启篇_第3张图片linux 开机、关机与重启篇_第4张图片linux 开机、关机与重启篇_第5张图片linux 开机、关机与重启篇_第6张图片linux 开机、关机与重启篇_第7张图片linux 开机、关机与重启篇_第8张图片

输入:passwd   回车,然后输入两次新密码;

输入:reboot   回车,重启后完成



你可能感兴趣的:(linux 开机、关机与重启篇)