本篇学习目标
了解Linux系统的启动原里。
了解Linux系统的终端。
熟悉Linux的登录和注销;关机、重启、系统基本操作。
熟悉Linux系统中用户的切换,和查看系统中和登录用户有关的其他操作。
正文:
了解Linux系统的启动原里。
Linux的启动过程简介:
当用户打开计算机的电源的时候,首先会进行BIOS自检,根据BIOS中设置的启动设备进行启动。接着计算机读取硬盘上的MBR记录冰启动设备上安装的引导程序GRUB或者LILO,引导程序接着开始引导Linux系统。此时,BIOS会将CPU的控制权交给Linux系统,Linux系统重新进行硬件自检让后引导内核,接下来执行init父进程,系统会根据/etc/inittab文件选择系统的启动级别并调用rc.sysinit和/etc/rc目录中的脚步。最后到达用户的登录界面,用户输入正确的凭据后,就进入系统。到此,Linux启动启动完成。
上面只是简单的介绍了Linux系统启动过程,下面让我们对Linux系统的启动过程进行详细的讲解。
Linux系统的整个启动需要经过多个步骤,我们逐一的对其进行分析。
1.BIOS开机自检
计算机在接通电源之后首先由BIOS进行POST(Power On Self Testing)开机自检,接着安装BIOS设置的引导顺序从网络、软盘、硬盘、或光驱中读入引导程序。Linux系统通常都是从硬盘上引导的,其中分区中的主引导记录(MBR)包含主引导加载程序(GRUB或者LILO)。MBR是一个512字节大小的扇区,位于磁盘上的第一个扇区(0磁道0柱面1扇区)。当MBR被加载到内存之后,BIOS就会将控制权交给MBR。Linux系统是从BIOS中的地址0xFFFF0处开始引导的。BIOS的第1个步骤是加电进行POST自检。POST的工作是对硬件进行检测。BIOS的第2个步骤是进行本地设备的枚举和初始化。BIOS由两部分组成:POST代码和运行时的服务。当POST在内存中完成自检之后,POST代码将从内存中清理出来,但是BIOS运行时服务依然保留在内存中,这些服务可以提供给目标操作系统使用。
2.启动GRUB/LILO引导加载程序
GRUB和LILO都是引导加载程序,但是LILO现在很少用了。引导加载程序用于引导操作系统启动。当机器引导它的操作系统时,BIOS会读取引导介质上最前面的512字节(主引导记录)。在单一的MBR中只能存储一个操作系统的引导记录,所以当安装了多个操作系统时引导就会出现问题,所以就需要更灵活的引导加载程序。
所有引导加载程序都以类似的方式工作,满足共同的目的,但LILO现在已经很少用了,因为l LILO没有交互式命令界面、并且不支持从网络引导。所以现在大部分的系统引导加载程序都用GRUB。GRUB包含许多特性,这使得GRUB比其他可用的引导加载程序更加优越,下面列出一些比较重要的特性:
(1)GRUB在x86机器上提供一个真正基于命令行的、先于操作系统启动的环境。
(2)GRUB支持逻辑块寻址(LBA)方式。
LBA的主要作用是寻找驱动器上文件的地址并将其置于驱动器的硬件中,它被用在许多IDE和SCSI硬盘中。在使用LBA之前,硬盘驱动器遇到一个1024柱面的限制,即BIOS不能找到在1024柱面后的文件(比如一个引导加载程序或是内核文件)。只要系统BIOS能支持LBA模式(大多数都支持),那么LBA就允许GRUB超越1024柱面的限制,引导操作系统。
(3)GRUB的配置能在每次系统引导时被读取。
这就避免了用户每次改变引导选项时都要重写一次主引导记录。大多数的引导加载程序都不能读取配置文件,并使用它们来设置引导选项。比如,用户必需改变一个LILO的配置文件,然后执行一个命令将新的配置数据重写回系统的主引导记录。这种方法比GRUB所采用的方法更加危险,因为一个错误配置的主引导记录将使系统无法引导。在使用GRUB中,如果配置文件被错误配置并且引导,那它也仅仅简单地转到一个默认的命令行,允许用户手工输入命令来运行操作系统。
下面对GRUB配置文件进行讲解:
GRUB的配置是通过位于/boot/grub/grub.conf的一个配置文件来完成的。下面给出了一个示例配置,示例中安装了双系统,支持Linux和Windows的双重引导。
# 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/hda2 # initrd /initrd-version.img #boot=/dev/hda default=0 timeout=10 splashimage=(hd1,3)/grub/splash.xpm.gz password –md5 $opeVt0$Y.br.18LyAasRsGdSKLYlp1 title RHEL AS4 (2.6.9-22.EL) password –md5 peVt0$Y.br.18LyAasRsGdSKLYlp1 root (hd1,3) kernel / vmlinuz-2.6.9-22.EL ro root=LABEL=/ rhgb quiet initrd / initrd-2.6.9-22.EL.img title Windows XP password –md5 peVt0$Y.br.18LyAasRsGdSKLYlp1 rootnoverify (hd0,0) chainloader +1
default=0表示引导第一个映像所指定的系统,default=1表示引导第二个映像所指定的系统,依次类推。如果没有在配置文件指定此选项,那么它将引导文件中指定的第一个映像。
“timeout=”:在自动引导默认操作系统(在本例中是RHEL 4)之前引导提示会等待多少秒。
“splashimage=”:GRUB GUI背景的图片所在的位置。
“password”:指定了使用MD5加密的口令。
“title”:标明了在运行期间能够从用户界面引导的具体操作系统。
“root”:GRUB操作系统文件系统的实际位置。GRUB引用介质的方式与LILO不同。在LILO示例中,/dev/hdb3是第二块硬盘中的第三个分区。GRUB将此硬盘引用为(hd1,3),即第二块硬盘的第三个分区(disk 0是第一块硬盘)。
“kernel”:vmlinuz-2.6.9-22.EL是root目录中默认引导映像的名称。
“initrd”:initrd-2.6.9-22.EL.img是root目录中默认initrd映像的名称。
“rootnoverify”:告诉GRUB不要尝试去改变操作系统的root。这样,当文件系统不被GRUB所支持时,不会出现引导错误。
“chainloader +1”:告诉GRUB使用一个链式加载程序来加载这个操作系统,加载Windows时需要这个选项。
与LILO的配置文件不同,grub.conf会在引导时被读取,当被修改时不必去更新MBR。
3.加载内核
接下来的步骤就是加载内核映像到内存中,内核映像并不是一个可执行的内核,而是一个压缩过的内核映像。通常它是一个zImage(压缩映像,小于512KB)或是一个bzImage(较大的压缩映像,大于512KB),它是提前使用zlib压缩过的。负责内核镜像的解压和运行的是一个例程,它可以利用少量硬的件设置,对内核映像中包含的内核进行解压缩,然后将解压缩后的镜像其放入高端内存中。如果有初始内存磁盘映像,系统就会将它移动到内存中,并标明以后使用。然后该例程会调用内核,并开始启动内核引导的过程。
4.执行init进程
init进程是系统所有进程的起点,内核在完成核内引导以后,即在本进程空间内加载init程序,它的进程号是1。init进程是所有进程的发起者和控制者。因为在任何基于Linux的系统中,它都是第一个在运行的进程,所以init进程的编号(PID)永远是1。
init进程有以下两个作用:
init进程的第一个作用是扮演终结父进程的角色。因为init进程永远不会被终止,所以系统总是可以确信它的存在,并在必要的时候以它为参照。如果某个进程在它衍生出来的全部子进程结束之前被终止,就会出现必须以init为参照的情况。此时那些失去了父进程的子进程就都会以init作为它们的父进程。
init的第二个作用是在进入某个特定的运行级别时运行相应的程序,以此对各种运行级别进行管理。它的这个作用是由/etc/inittab文件定义的。可以在该文件中定义系统运行级别,级别编号从0到6和S/s,修改/etc/inittab文件,找到id:5:initdefault:这一行,把“5”改成相应的数字id的运行级别即可。以下是/etc/inittab文件的内容:
inittab是一个不可执行的文本文件,它由若干行命令所组成。在RHEL 5系统中,inittab配置文件的内容如下所示。
# # inittab This file describes how the INIT process should set up # the system in a certain run-level. # # Author: Miquel van Smoorenburg, # Modified for RHS Linux by Marc Ewing and Donnie Barnes # # 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) # //表示当前缺省运行级别为5,启动系统进入图形化界面 id:5:initdefault: //启动时自动执行/etc/rc.d/rc.sysinit脚本 # System initialization. si::sysinit:/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 //当运行级别为5时,以5为参数运行/etc/rc.d/rc脚本,init将等待其返回 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 //在启动过程中允许按[CTRL+ALT+DELETE]重启系统 # Trap CTRL-ALT-DELETE ca::ctrlaltdel:/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” # If power was restored before the shutdown kicked in, cancel it. pr:12345:powerokwait:/sbin/shutdown -c “Power Restored; Shutdown Cancelled” //在运行级别2、3、4、5上以ttyX为参数执行/sbin/mingetty程序,打开ttyX终端用于用户登录, 如果进程退出则再次运行mingetty程序 # 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 //在级别5上运行xdm程序,提供xdm图形方式登录界面,并在退出时重新执行 # Run xdm in runlevel 5 x:5:respawn:/etc/X11/prefdm -nodaemon
inittab配置文件每行的基本格式如下。
id:runlevels:action:process
其中某些部分可以为空,下面我们逐一介绍。
1.id:1~2个字符,配置行的惟一标识,在配置文件中不能重复。
2.runlevels :配置行适用的运行级别,在这里可填入多个运行级别,比如12345或者35等。 Linux有7个运行级别,下面分别对各个级别进行讲解:
开机运行级别0:用来关闭系统。(建议不要把/etc/inittab文件的initdefault值设置为0)
开机运行级别1:用来进行单一使用者模式(字符界面)。
开机运行级别2:用来运行不带网络功能的多用户使用模式(字符界面)。
开机运行级别3:用来运行带网络功能的多用户户使用模式(字符界面)。
开机运行级别4:用来运行用户指定义的使用模式(保留不用)。
开机运行级别5:用来运行进入具有网络功能的X windows时的模式,也就是我们所说的图行界面。
开机运行级别6:用来重启系统。(建议不要把/etc/inittab文件的initdefault值设置为6)
S/s不是用来直接使用的,配合开机运行级别1使用,当加上S/s后,表示开机后不不参考/etc/inittab文件。
如果不想更改系统的默认开机运行级别,而是想临时却换的话,可以在终端中输入init +相应的开机运行级别命令进行临时却换。如在文本终端模式下,输入init 5则可以临时进入x windows图形界面。
3.action :Init有如下几种行为。
respawn :启动并监视第4项指定的process,若process终止则重启它
wait :执行第4项指定的process,并等待它执行完备
once: 执行第4项指定的process
boot :不论在哪个执行等级,系统启动时都会运行第4项指定的process
bootwait :不论在哪个执行等级,系统启动时都会运行第4项指定的process,且一直等它执行完备
off :关闭任何动作,相当于忽略该配置行
ondemand :进入ondemand执行等级时,执行第4项指定的process
initdefault :系统启动后进入的执行等级,该行不需要指定process
sysinit :不论在哪个执行等级,系统会在执行boot及bootwait之前执行第4项指定的process
powerwait :当系统的供电不足时执行第4项指定的process,且一直等它执行完备
powerokwait :当系统的供电恢复正常时执行第4项指定的process,且一直等它执行完备
powerfailnow :当系统的供电严重不足时执行第4项指定的process
ctrlaltdel :当用户按下【Ctrl+Alt+Del】时执行的操作
kbrequest :当用户按下特殊的组合键时执行第4项指定的process,此组合键需在keymaps文件定义。
5./etc/inittab文件进行初始化
init的工作是根据/etc/inittab来执行相应的脚本,进行系统初始化,如设置键盘、字体、装载模块,设置网络等。
etc/rc.d/rc.sysinit
在init的配置文件中有如下一行:
si::sysinit:/etc/rc.d/rc.sysinit
rc.sysinit是由init执行的第一个脚本,它主要完成一些系统初始化的工作。rc.sysinit是每一个运行级别都要首先运行的重要脚本,它主要完成的工作有:激活交换分区、检查磁盘、加载硬件模块以及其他一些需要优先执行的任务。/etc/rc.d/rc.sysinit主要完成各个运行模式中相同的初始化工作,包括:
设置初始的$PATH变量;
配置网络;
为虚拟内存启动交换;
设置系统的主机名;
检查root文件系统,以进行必要的修复;
检查root文件系统的配额;
为root文件系统打开用户和组的配额;
以读/写的方式重新装载root文件系统;
清除被装载的文件系统表/etc/mtab;
把root文件系统输入到mtab;
使系统为装入模块做准备;
查找模块的相关文件;
检查文件系统,以进行必要的修复;
加载所有其他文件系统;
清除/etc/mtab、/etc/fastboot和/etc/nologin;
删除UUCP的lock文件;
删除过时的子系统文件;
删除过时的pid文件;
设置系统时钟;
激活交换分区;
初始化串行端口;
装入模块。
6.执行etc/rc.d/rcX.d/
在rc.sysinit执行后,将返回init,继续执行/etc/rc.d/rc程序。以运行级别5为例,init将执行配置文件inittab中的以下内容:
l5:5:wait:/etc/rc.d/rc 5
这一行表示以5为参数运行/etc/rc.d/rc,/etc/rc.d/rc是一个shell脚本,它接受5作为参数,去执行/etc/rc.d/rc5.d/目录下的所有的rc启动脚本,/etc/rc.d/rc5.d/目录中的启动脚本实际上都是一些链接文件,而不是真正的rc启动脚本,真正的rc启动脚本实际上都在/etc/rc.d/init.d/目录下。而这些rc启动脚本有着类似的用法,它们一般能接受 start、stop、restart、status等参数。
/etc/rc.d/rc5.d/中的rc启动脚本通常是以K或S开头的链接文件,以S开头的启动脚本将以start参数来运行。如果发现相应的脚本也存在K打头的链接,而且已经处于运行态了(以/var/lock/subsys/下的文件作为标志),则将首先以stop为参数停止这些已经启动了的守护进程,然后再重新运行。这样做是为了保证当init改变运行级别时,所有相关的守护进程都将重启。
这个目录下的程序可通过chkconfig程序进行管理,当然这个目录下的程序需要符合一定规范,如果了解shell编程,可以查看这些符号链接所指向的程序的源码。
init也是一个进程,和普通的进程具有一样的属性。比如修改了/etc/inittab,想让修改马上生效,可通过运行“kill -SIGHUP 1”来实现,也可通过运行“init q”来实现。
7.执行/etc/ec.d/rc.local
RHEL 4中的运行模式2、3、5都把/etc/rc.d/rc.local做为初始化脚本中的最后一个,所以用户可以自己在这个文件中添加一些需要在其他初始化工作之后、登录之前执行的命令。在维护Linux系统时一般会遇到需要系统管理员对开机或者关机命令脚本进行修改的情况。如果所做的修改只在引导开机的时候起作用,并且改动不大的话,可以考虑简单地编辑一下/etc/rc.d/rc.local脚本。这个命令脚本程序是在引导过程的最后一步被执行的。
8.执行/bin/login程序
login程序会提示使用者输入账号及密码,接着编码并确认密码的正确性,如果账号与密码相符,则为使用者初始化环境,并将控制权交给shell,即等待用户登录。
login会接收mingetty传来的用户名作为用户名参数,然后login会对用户名进行分析。如果用户名不是root,且存在/etc/nologin文件,login将输出nologin文件的内容,然后退出。这通常用来在系统维护时防止非root用户登录。只有在/etc/securetty中登记了的终端才允许root用户登录,如果不存在这个文件,则root可以在任何终端上登录。/etc/usertty文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。
在分析完用户名后,login将搜索/etc/passwd以及/etc/shadow来验证密码以及设置账户的其他信息,比如:主目录是什么、使用何种shell。如果没有指定主目录,则将主目录默认设置为根目录;如果没有指定shell,则将shell类型默认设置为/bin/bash。
login程序成功后,会向对应的终端再输出最近一次登录的信息(在/var/log/lastlog中有记录),并检查用户是否有新邮件(在/usr/spool/mail/的对应用户名目录下),然后开始设置各种环境变量。对于bash来说,系统首先寻找/etc/profile脚本文件并执行它;然后如果用户的主目录中存在.bash_profile文件,就执行它,在这些文件中又可能调用了其他配置文件,所有的配置文件执行后,各种环境变量也设好了,这时会出现大家熟悉的命令行提示符,至此整个启动过程就结束了。
登录到Linux系统
1.首先先让我们了解一下登录到Linux的基础知识:
虚拟控制台:RHEL在电脑为用户提供了6个可以使用的虚拟控制台(Virtual Console)拟当Unix的”哑终端“。我们可以用CTRL+ALT+F1~F6这6个组合键来访问对应的VC,每个VC对应6个组合键中的一个,在图形界面时可以用组合键CTRL+ALT+F7回到图形环境。
X图形环境(X-server),当它启动时,它会找到”第一个可以用”的VC。因为通常有6个VC用于文本终端,X-Server一般会使用第7个VC。如果正在使用VC,并且知道X-Server在机器上运行,通常可以用CTRL+ALT+F7却换到X-Server。
图形环境中的终端:和VC相似。
可以用who命令判断谁在系统上,其中显示的TTY1、TTY2……表示VC1、VC2…….。0指X-Server本身,PTS/0表示在X-Server中打开的第一个终端。
可以通过网络登录一台机器:可以使用SSH(Security Shell),Telnet等工具轻易地登录到远程机器上,不过要求远程机器配置为”运行远程登录“而且用户在此台机器上必须有账号存在,那么登录远程机器就像登录VC一样容易。
2.识别终端类型:
TTYN:虚拟控制台
TTYSN:串口端口设备
PTS/N:作为终端(一个模拟的终端,常被X图形环境中的终端窗口或者始于网络的SHELL(如SSH霍总Telnet)使用),伪终端不能直接与物理设备相连。
:0:X-Server:并不是真正的终端,当用户使用X图形界面环境的登录管理器登录时,其终端经常被视为X-Server。
3.管理终端:
在终端中可以用以下快捷键进行管理:
CTRL+C:非常规终端,中断前台进程。
CTRL+H:删除一个字符
CTRL+U:删除当前行
CTRL+S:锁住终端
CTRL+Q:解锁终端
CTRL+L:bash清屏
CTRL+Z:挂起前台显示
CTRL+J:换行
Linux系统终端下的关机和重启和注销
Linux系统启动后,屏幕上将快速闪过一串串启动内容的文字提示,在各服务正常启动之后,系统会显示
linux login:
提示用户登录。如果用户想要以超级用户的身份登录,在”login:”后面输入”root”,然后回车,系统提示
Password:
该提示提醒用户输入安装时设定的系统管理员密码并按Enter键,如果密码正确,系统将完成登录。
一般情况下,为了安全考虑不推荐使用root账号登录系统。因为root账号权限太大,很容易由于误操作导致系统崩溃,一般情况下都以普通用户账号登录系统。
在使用普通账号的过程中如果要完成某些只有root账号才能执行的操作,要临时以root账号登录,或者想要以其他账号临时登录系统,Linux系统提供了su命令。su命令格式如下:
su 用户名,如从普通账户切换到root账户可以用SU -或者SU root。
如果要退出某个用户的登录,可以使用exit命令注销系统。
Linux提供了三种关机/重启系统的命令:shutdown、halt和reboot。这三个命令在一般情况下只有系统的超级用户(一般是指root)才可以执行。输入没有参数的shutdown命令,两分钟之后即可关闭系统。在这段时间,Linux将提示所有已经登录系统的用户系统将要退出。
该命令的一般格式为
shutdown [选项] [时间] [警告信息]。
其中,命令中[选项]的含义为
k:并不真正关机,只是发出警告信息给所有用户;
r:关机后立即重新启动;
h:关机后不重新启动;
f:快速关机,重新启动时跳过fsck;
n:快速关机,不经过init程序;
c:取消一个已经运行的shutdown。
如果要设定等待的时间,可以使用[时间]的选项。
now:立即退出系统;
+mins:在指定的分钟之后退出系统;
hh:ss:在指定的时间退出系统。
在关掉系统之前,系统会自动产生一个/etc/nologin文件,用于说明系统即将关闭,用户不能登录进入。在这段时间中,只有系统管理员可以进入。如果用户要获得有关shutdown命令的更详细的帮助,可以使用man shutdown命令。
halt命令相当于shutdown -h now,表示立刻关机。reboot命令相当于shutown -r now,表示立刻重新启动。