您的位置:首页 > 运维架构 > Linux

linux系统的启动与关闭

2013-05-11 10:23 155 查看
一 linux启动

(一)系统引导流程
1.内核引导
打开系统电源,开始BIOS自检,系统按照BIOS里的设置启动设备(一般是硬盘启动), 接着进入linux引导程序,一般Linux系统提供两种引导方式: GRUB和LOLO,其中GRUB是大多数Linux系统的默认引导方式,而LILO则是根据一些特殊需求或个人喜好而准备的,一旦linux引导程序载入内存,它显示一个图形界面给用户,这个界面里包含了不同的内核选项,用户可以通过上下键去选择不同的内核引导,当引导程序成功完成引导后,linux接管了对CPU的控制权,接着CPU开始执行linux内核映像程序,加载内核, 在预定的地方找到initrd镜像的压缩包,对它进行解压和挂载,并载入所有必须的驱动, 然后,Kernel会创建root设备,以只读方式挂载root分区,并释放所有没有被使用的内存,此时,Kernel已经被装载到内存里运行起来了。但是,因为没有用户应用程序允许输入有意义的指令给系统,所以此时的系统不能做任何事情。
2.运行init
init进程是系统所有进程的起点, 紧接上面,Linux在完成核内引导以后,就开始运行init程序,init程序需要读取配置文件/etc/inittab,而inittab是一个不可执行的文本文件,关于这个文件,我们将在”系统运行级”一节详细讲述。
3.系统初始化
init程序启动后首先调用rc.sysinit和rc程序, rc.sysinit主要完成一些系统初始化的工作,它是系统每一个运行级别都要首先运行的重要脚本。它主要完成的工作有:检查磁盘,加载硬件模块, 激活交换分区,以及其它一些需要优先执行任务,当rc.sysinit程序执行完毕,引导返回到init程序。
4.启动运行级的守护进程
rc.sysinit程序执行完毕,接下来,rc程序启动, rc程序主要启动系统对应运行级别的守护进程, rc程序执行完毕,又将返回init程序继续下一步。
5.建立终端
此时系统基本环境已经设置好了,init程序接着会打开6个终端,以便用户登录。
6.登录系统
当我们看到mingetty的登录界面时,我们就可以输入用户名和密码登录系统了。Linux的账号验证程序是login,当login程序执行成功后,最后就进入了shell终端。
这样linux系统就完成了从开机到启动的整个过程。

(二)系统运行级别

windows系统有安全运行模式和正常运行模式,这是两个不同的运行级,同样,linux也有系统运行级别,并且linux系统的运行级别更加灵活,更加多样化。
在讲述运行级别前,先讲述下linux下的init程序,因为init程序直接和系统运行级别相关联, init程序是linux操作系统最主要的程序之一,是一个由系统内核启动的用户级进程,同时init进程也是所有其它系统进程的鼻祖,也就是说init进程是系统运行的第一个进程,它的进程号始终为1。
linux系统有7个运行级别,这些运行级别均在/etc/inittab文件中指定,下面讲述/etc/inittab文件的具体实现。
以redhat linux为例,下面是/etc/inittab的某段信息。
# Default runlevel. The runlevels used by RHS 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)
上面这段信息列出了linux系统的7个运行等级:
0-关机模式,
1-单用户模式,单用户只有系统管理员可以登录。
2-多用户模式,但是不支持文件共享,例如不支持NFS服务.这种模式不常用。
3-完全的多用户模式,支持NFS服务.最常用的用户模式,默认登录到系统的字符界面。
4-基本不用的用户模式,可以实现某些特定的登录请求。
5-完全多用户模式,默认登录到X-window系统,也就是登录到linux图形界面。
6-重启模式,也就是执行关闭所有运行的进程,然后重新启动系统。
这些运行级别和linux中的init程序相互对应,例如执行init 1系统就进入单用户模式,执行init 6系统将重新启动。

inittab(/etc/inittab)文件的剖析:
(1)运行级别的切换:
查看当前的运行级别:runlevel 注:未切换过为N;切换过为S。
运行级别的切换:init [0123456Ss] 或 telinit [0123456Ss]
(2)在inittab中,所有条目采取以下格式:

在inittab文件中以#开头的所有行都是注释行。注释行有助于用户理解inittab文件每项的具体含义,inittab文件中的值都有如下格式组成:
label:runlevel:action:process
1.label字段
label是有1~4个字符组成的标签,用来标示输入的值。一些系统只支持2个字符的标签。鉴于此原因,多数人都将标签字符的个数限制在2个以内。该标签可以是任意字符构成的字符串,在Red Hat Linux中使用的标签有:




2.runlevel字段
runlevel字段指定系统的运行级别。可以指定多个运行级别,也可以不为runlevel字段指定特定的值。
3. process字段
process字段包含了init执行的进程,也就是init程序具体要执行的命令,该进程采用的格式与在命令行下运行该进程的格式一样,因此process字段都以该进程的名字开头,后面是运行时要传递给该进程的参数。比如/sbin/shutdown -t3 -r now。
4.action字段
action字段定义了:当系统进入相应的运行级别后,init程序应该以何种方式运行process字段对应的命令,action字段常用的值如下表所示:



明白了inittab文件的格式以后,我们就知道每项的含义了, 接着看/etc/inittab下面的内容:
id:5:initdefault:
表示系统将默认启动到X-window界面下,如果我们想让系统默认开机启动到字符界面下,只需修改id:5:initdefault:为id:3:initdefault:即可。
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
该段告诉init程序,运行/etc/rc.d/rc.sysinit来进行系统初始化工作。
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
上面这段信息标明/etc/rc.d/rc可以运行在0~6各个运行级别,同时init程序等待/etc/rc.d/rc执行完毕才进入下一步操作。
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
上面这段指定了当Ctrl+Alt+Del三个键同时按下时,init程序将执行/sbin/shutdown -t3 -r now,即重启系统。
# When our UPS tells us power has failed, assume we have a few minutes
# of power left. Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
上面这段信息说明了:系统电源被切断时,UPS通知init程序,init程序发出"Power Failure;System Shutting Down"信号,然后执行关机操作。
# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
这段说明了:UPS接到电源恢复信号后,通知init进程,然后init程序发出"Power Restored; Shutdown Cancelled"信号,取消关机操作,这个过程在1~5运行级别上有效。
# Run gettys in standard runlevels
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
这段信息说明了:在2~5运行级别上,始终打开6个终端控制台,即使某个控制台被关闭,系统也会自动启动。
# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm –nodaemon
最后这段信息表明,在X-window桌面下始终运行的进程是/etc/X11/prefdm。

(三)系统启动服务管理
/etc/rc.d/init.d的目录下包含各个运行级别的服务程序脚本。

设置自启动程序:

有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务,主要用三种方式进行这一操作:
ln -s             在/etc/rc.d/rc*.d目录中建立/etc/init.d/服务的软链接(*代表0~6七个运行级别之一)

chkonfig          命令行运行级别设置

ntsysv            伪图形运行级别设置
注意:
这三种方式主要用于以redhat为基础的发行版

如果还不知道运行级别是什么,那么最好先看看相关资料再实验

第一种方式:ln -s 建立启动软连接
在Linux中有7种运行级别(可在/etc/inittab文件设置),每种运行级别分别对应着/etc/rc.d/rc[0~6].d这7个目录:


Tips:/etc/rc[0~6].d其实是/etc/rc.d/rc[0~6].d的软连接,主要是为了保持和Unix的兼容性才做此策。
这7个目录中,每个目录分别存放着对应运行级别加载时需要关闭或启动的服务,由详细信息可以知道,其实每个脚本文件都对应着/etc/init.d/目录下具体的服务。
K开头的脚本文件代表运行级别加载时需要关闭的,S开头的代表需要执行:


因此,当我们需要开机启动自己的脚本时,只需要将可执行脚本丢在/etc/init.d目录下,然后在/etc/rc.d/rc*.d中建立软链接即可:
[root@localhost ~]# ln -s /etc/init.d/sshd /etc/rc.d/rc3.d/S100ssh
此处sshd是具体服务的脚本文件,S100ssh是其软链接,S开头代表加载时自启动。
如果需要在多个运行级别下设置自启动,则需建立多个软链接,这种方式比较繁琐,适用于自定义的服务脚本。
如果系统中已经存在某些服务(比如安装apache时就会有httpd服务项),可以使用下面的两种方式:
第二种方式:chkconfig


如果需要自启动某些服务,只需使用chkconfig 服务名 on即可,若想关闭,将on改为off。
在默认情况下,chkconfig会自启动2345这四个级别,如果想自定义可以加上--level选项:


上面我们先将sshd服务的所有启动级别关闭,然后使用--level选项启动自定义级别;
Tips:--list选项可查看指定服务的启动状态,chkconfig不带任何选项则查看所有服务状态。
第三种方式:ntsysv 伪图形
ntsysv和chkconfig其实是一样的,只不过加上了图形而已;
启动ntsysv有两种方式,一是直接在命令行中输入ntsysv,二是使用setup命令,然后选择系统服务:


默认情况下,当前运行级别为多少,在ntsysv中设置的启动服务的级别便是多少,比如,我当前的运行级别是3,那么我在伪图形界面中选择启动服务后,它的运行级别也会是3。
如果想自定义运行级别可使用ntsysv --level方式:


以上三种操作需要保证服务脚本文件可执行,并且要有root权限,其中,第一种方式多用于自定义脚本,第二、三种多用于系统已存在的服务,比如ftp、samba、ssh、httpd等等,并且,要做相关设置需要弄清楚运行级别的问题。
Tips:如果想手动启动某服务,传统的方式是 /etc/init.d 服务名 start。
实际上还可以这样,service 服务名 start:




相关命令及日志:
(硬件检测)运行dmesg检查引导期间的错误

例:dmesg | grep 硬件名
(软件检测)检查系统日志/var/log/messages,查找可能被dmesg忽略的应用程序错误
例:grep syslogd /var/log/messages

(四)GRUB的配置与应用:
1、GRUB的配置文件默认为:
/boot/grub/grub.conf 它有个软链接文件存放在/etc/grub.conf下
#ls -l /etc/grub.conf



内核存放在/boot目录下vmlinuz-2.6.32-220.e16.i686



grub配置文件内容



(1)default定义缺省启动系统;0表示第一个系统
(2)timeout定义缺省等待时间
(3)splashimage定义grub界面图片
注意:grub表示硬盘的方法:(hd0,0)------表示第一块硬盘第一个分区;即表示/boot所在分区
正常硬盘表示方法: hda,0



(4)hiddemenu隐藏菜单
(5)title定义菜单项名称
(6)root设置grub的根设备即内核
root (hd0,0)将/boot指定为根目录
(7)kernel定义内核文件所在位置
(8)initrd 命令加载镜像文件
2、grub命令
功能键:
(1)e:编辑当前的启动菜单项
(2)c:进入grub的命令行模式
(3)b:启动当前的菜单项
(4)d:删除当前行
(5)ESC:返回grub启动菜单界面,取消对当前单项所做的任何修改
3、单用户模式的进入
如忘记root密码可以进入单用户模式进行重新设置
方法如下:开机进入grub界面,按e进入编辑行模式,


选中kernel行,再次按e键,







在新的界面的最后一行输入1或s,



然后按回车键,接着按b键即可进入启动单用户模式



启动完成后其界面如下:



而后用passwd 用户名 进行修改用户密码
从这可以看出若操作者可以随意接近服务器的话可以随意的更改此服务器,因为很容易就可以进入grub从而进入单用户模式获取服务器上所有的资料信息,为了避免此情况发生可以给grub设置一个密码
4、设置grub密码
(1)使用grub自带的grub-md5-crypt命令
#grub-md5-crypt





(2)使用grub 交换命令行界面中使用md5crypt命令
#grub



grub>md5crypt



输入:quit退出
将密文复制出来放到grub配置文件里头



然后进入grub进行相关配置
在grub配置文件中的hiddenmenu和title之间加入下面语句:
passwd --md5 密文内容

保存设置即成功
即:



复制密文内容
编辑grub.conf配置文件加入如下语句:
password --md5 $1$Mjlxj0$E5WLiqiz5m9knL7hHxElF.
注:--md5参数表示口令是md5加密的



配置好grub配置文件后重启reboot系统,按e或ESC进入grub菜单模式



这时候在按e键将没有任何反应,而应该改按p键要求输入密码解锁



输入正确密码后方可进行相关操作

5、GRUB修复模式
在使用Linux的过程中,大多初学者都遇到过系统启动到“grub>”提示符后就停止不前的问题,功夫不深的爱好者可能会束手无策,转而选择重装系统,其实这只是系统出现了一点小问题,既系统的GRUB配置文件出现了故障,此时可以采用以下两种方案来解决问题:
(1)存在GRUB配置文件备份
如果存在GRUB配置文件备份,则可以比较简单的进行恢复,可以按如下方法进行:
使用光盘引导机器,进入到“linux rescue”模式,即系统维护模式;在提示符”sh#”下执行cp命令,将备份文件拷贝到/boot/grub.conf即可
Sh#cp /backup/grub.conf.bak /mnt/sysimage/boot/grub/grub.conf
假设备份文件为/backup/grub.conf.bak,因为大多数Linux光盘修复模式中会将硬盘系统的”/”分区chroot到“/mnt/sysimage”处,所以拷贝的目标为“/mnt/sysimage/boot/grub/grub.conf”,而非“/boot/grub/grub.conf”。
完成后重新启动即可。内核文件、镜像文件、/boot目录等文件损坏或丢失,也可以使用此种方法修复。
(2)如果没有GRUB配置文件备份
如果没有备份文件时可以使用grub的交换功能,可以在”grub>”命令行下进行以下操作以手动启动系统:
查找/boot/grub/grub.conf分区所在的目录:
grub> find /boot/grub/grub.conf
(hd0,0)
需要注意的是,上述命令将得到的是grub.conf配置文件所在的系统的分区,(hd0,0)即表示它在分区hda1
查看grub.conf文件错误使用如下的命令:
grub> cat (hd0,0)/boot/grub/grub.conf
需要注意的是,可以查看配置文件到底什么地方出现了错误,以便进入后修改。
指定/boot分区使用命令:root (hd0,0)
从此步骤开始,即为本文前面提到的GRUB配置文件的主要引导步骤,只是一般都是系统读取GRUB配置文件,出现问题时我们可以使用手动启动。
指定内核加载的命令:kernel /boot/vmlinuz ro root=LABEL=/
指定镜像文件所在的位置可用如下命令:initrd /boot/initrd-2.6.24-1.3194.fc7
从/boot分区启动可以使用如下命令:boot (hd0,0)
此时系统即可正常启动,实际上以上步骤就是执行了GRUB引导期间加载grub.conf文件的步骤,当系统正常启动后将GRUB配置文件修改正确后即可。

三 linux系统关闭
在了解linux关机过程之前,我们先学习一下linux关机的一些常用命令,最常用的linux关机命令有如下几个:init ,shutdown, halt,reboot等,这些命令都可以达到关机重启的目的,但是每个命令的内部工作过程是不同的。我们通过对关机命令的讲述,详细了解linux安全关机的过程。
1.shutdown命令
使用shutdown命令可以安全的关闭linux系统,有些linux初学者会使用直接关闭电源的方法来关闭linux,这是十分危险的,因为linux与windows不同,在linux后台运行着很多进程,这些进程控制着linux对系统的各种操作,如果强制关机,可能会造成进程的混乱以至丢失数据,如果在系统工作负荷很高的情况下,突然断电,不但会丢失数据,甚至会损坏硬件设备。
shutdown命令是用shell编写的程序,必须由超级用户才能执行,shutdown命令执行后,会以广播的形式通知正在系统中工作的所有用户,系统将在指定的时间内关闭,请保存文件,停止作业,注销用户;此时login指令被冻结,新的用户不能登录;当所有的用户从系统中注销或者指定时间已到时,shutdown就发送信号给init程序,要求init程序改变系统运行级别,接着,init程序根据shutdown指令传递过来的参数,相应的改变运行级,例如,shutdown指定的参数是关机命令的话,init程序就执行init 0进行关机,如果shutdown指定的参数是要重启系统,那么init程序就执行init 6进行系统重启。
 shutdown命令的详细语法:
shutdown [-fFhknrc(参数名称)] [-t 秒数] 时间 [警告信息]
具体各参数功能:
-f 重新启动时不执行fsck(注:fsck是Linux下的一个检查和修复文件系统的程序,我们会在以后章节详细讲述)。
-F 重新启动时执行fsck。
-h 将系统关机,在某种程度上功能与halt命令相当。
-k 只是送出信息给所有用户,但并不会真正关机。
-n 不调用init程序关机,而是由shutdown自己进行(一般关机程序是由shutdown调用init来实现关机动作),使用此参数将加快关机速度,但是不建议用户使用此种关机方式。
-r shutdown之后重新启动系统。
-c 取消前一个shutdown命令。例如,当执行一个如“shutdown -h 15:30”的命令时,只要按“Ctrl+C”键就可以中断关机的命令。而执行如“shutdown -h 15:30 & ” 的 命 令 就将 shutdown转到后台运行了,此时,就需要使用shutdown -c将前一个shutdown命令取消。
-t<秒数> 送出警告信息和关机信号之间要延迟多少秒。警告信息将提醒用户保存当前进行的工作。
[时间] 设置多久时间后执行shutdown命令。时间参数有hh:mm或+m两种模式。
hh:mm格式表示在几点几分执行shutdown命令。例如 “shutdown 16:50”表示将在16:50执行shutdown, +m表示m分钟后执行shutdown, 比较特别的用法是以now表示立即执行shutdown, 值得注意的是这部分参数不能省略。
[警告信息] 要传送给所有登入用户的信息。
 应用举例:
立即关机重启:shutdown –r now
立即关机:shutdown –h now
设定5分钟后关机,同时发出警告信息给登录的linux用户:
shutdown +5 “System will shutdown after 5 minutes”
2.halt命令
halt是最简单的关机命令,相当于shutdown –h组合,halt执行时,kill掉多有应用程序,然后调用系统指令sync,sync将所有内存信息通过文件系统写入硬盘,然后停止内核。
halt命令的部分参数如下:
[-f] 没有调用shutdown而强制关机或重启。
[-i] 关机或重新启动之前,关掉所有的网络接口。
[-p] 关机时调用poweroff,此选项为缺省选项。
3.reboot命令
reboot命令的执行过程与halt基本类似,不同的是halt是用于关机,而reboot是关机后引发系统重启。
4.init命令
init进程是所有进程的鼻祖,其进程号始终为1,init程序主要用于系统不同运行级之间的切换,切换的工作是立即完成的,例如init 0就是将系统运行级切换到0,也就是关机,init 6命令用于将系统运行级别切换到6,也就是重启系统。

本文出自 “每天进步一点点” 博客,转载请与作者联系!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: