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

Linux的安装和启动流程详细解析

2013-08-09 17:26 295 查看
1. Linux安装流程  1.1 安装过程总览  1. BIOS加电自检  2. 运行isolinux目录下面的isolinux.bin文件,这个isolinux.bin文件根据isolinux.cfg文件的选项来加载内核vmlinuzinitrd.img文件,initrd.img文件会在内存中生成一个虚拟的linux操作系统,为安装过程提供一个安装环境。  3. initrd.img文件中的/sbin/loader文件会探测安装介质,如果探测到是cd安装,就会运行images目录中的stage2.img(安装过程需要的所有镜像)镜像文件,这个文件中最重要的就是anaconda程序,我们看到的安装过程中的向导图就是这个anaconda程序的作用。  4. 安装完成,重启系统。  文件的调用顺序为isolinux/vmlinuz--->isolinux/initrd.img--->/init--->/sbin/loader--->imagaes/install.img---  >/usr/bin/anaconda  光盘结构介绍  * isolinux 目录存放光盘启动时的安装界面信息  * images 目录包括了必要的启动映像文件,最重要的是引导第二阶段安装需要用到的镜像文件install.img(rhel 5中是stage2.img),anaconda程序就在这个镜像文件中。  * CentOS 目录存放安装软件包及信息  * .discinfo 文件是安装价质的识别信息 这个文件很重要  * lemp.tar.gz 文件存放系统初始化及其相关程序安装脚本。  * EFI目录:用于64位的基于EFI的系统引导。其中BOOT目录下BOOTX64.conf为grub的配置文件,用于显示引导菜单。  *TRANS.TBL文件:记录当前目录的列表,用mkisofs的-T参数重新生成,主要是为了长文件名称。  /isolinux/iso.cfg  在iso文件中的isolinux目录下面,isolinux.cfg这里面就是我们在安装的时候出现的第一个界面上面的信息,还指明了改加载的内核镜像和initrd镜像:  Install or upgrade an existing system  Install system with basic video driver  Rescue installed system  Boot from local drive  Memory test  /isolinux/boot.msg  这个文件信息只显示了一句  Press the <Enter> key to begin installation process.  /isolinux/splash.jpg  这张图片是我们安装界面的背景图片  1.2 vmlinuz  vmlinuz是可引导的、压缩的内核。"vm"代表"Virtual Memory".Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名"vm",vmlinuz是可执行的Linux内核。vmlinuz是可引导的、压缩的内核。"vm"代表"Virtual Memory".Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名"vm".vmlinuz是可执行的Linux内核,vmlinuz是可执行的Linux内核,它位于/boot/vmlinuz,vmlinuz的建立有两种方式。一是编译内核时通过"make zImage"创建,然后通过:  "cp /usr/src/linux-2.4/arch/i386/linux/boot/zImage /boot/vmlinuz"产生。  vmlinux不是压缩的内核,vmlinuz是压缩的内核。  一般来讲大家很容易理解的是这样的:系统内核 vmlinuz被加载到内存后开始提供底层支持,在内核的支持下各种模块,服务等被加载运行。这样当然是大家最容易接受的方式,曾经的linux就是这样的运行的。假设你的硬盘是scsi 接口而你的内核又不支持这种接口时,你的内核就没有办法访问硬盘,当然也没法加载硬盘上的文件系统,怎么办?好办!把内核加入scsi驱动源码然后重新编译出一个新的内核文件替换原来vmlinuz.需要改变标准内核默认提供支持的例子还有很多,如果每次都需要编译内核就太麻烦了。所以后来的linux就提供了一个灵活的方法来解决这些问题---initrd.img

ininrd.img是什么呢?
initrd 的含义是initialized ram disk. ramdisk是用一部分内存模拟成磁盘,让操作系统访问。我们可以通过下列的方式来解压initrd.img,来看看这个文件系统中有的文件:
#file initrd.img /*查看一下这个文件的格式,如果是gzip compressed data,那么可以用下面的方式来操作*/
#cp init.img /initrd (目录initrd是自己建立的)

#cd /initrd#mv initrd.img initrd.gz (改个名字)#gunzip initrd.gz (解压之后得到一个initrd的文件,用file命令可以看 到它是一个cpio格式的压缩档)#mkdir tmp#cd tmp#cpio -id < /initrd (通过这条命令可以将initrd提取出来,这样在当前的tmp目录下面可以看到文件:bin,dev,etc,firmware,init,lib,lib64,modeles,proc,sbin,selinux,sys,tmp,usr,var)。

  initrd的最初的目的是为了把kernel的启动分成两个阶段:在kernel中保留最少最基本的启动代码,然后把对各种各样硬件设备的支持以模块的方式放在initrd中,这样就在启动过程中可以从initrd中mount根文件系统中需要装载的模块。这样的一个好处就是在保持kernel不变的情况下,通过修改initrd中的内容就可以灵活的支持不同的硬件。在启动完成的最后阶段,根文件系统可以重新mount到其他设备上。我们常在编译核心的使用,使用make menuconfig,其中对某些而外的驱动,是可以选择以模块编译,还是<*>直接编译到核心里面。例如ext3文件系统驱动,如果核心需要放在该文件系统上,可以有两个方法:  引用  1、把其全都编译到内核中,则只需要一个内核文件系统即可启动;  2、把其编译为模块,然后通过initrd虚拟的内存系统加载;  也就是说由于initrd会在内存虚拟一个文件系统,然后可以根据不同的硬件加载不同的驱动,而不需要重新编译整个核心。所以,大部分的发行版都会通过这种方式对驱动进行加载。  1.4 anaconda  系统启动,加载启动映像,在内存中建立了linux系统环境后,解析安装程序映像文件,将安装程序载入内存,执行主执行程序anaconda,该程序是具体安装程序的一个口,负责启动具体的安转过程,完成linux系统的安装。 Anaconda安装程序支持两种安装方式:交互式安装和非交互式安装。  交互式安装:就是安装过程中提示用户设置一些网络、和分区设置。  非交互式:通过kickstart配置文件实现自动化安装。

  下面来查看anaconda文件内容:  首先进入安装盘镜像,将install.img挂载出来,执行以下命令:  Mount -o loop -squashfs(可要可不要) images/install.img /mnt/stage2  Cd /mnt/stage2  解析后,我们可以看到,安装程序的主执行体anaconda在。/usr/bin目录下,它是用python语言写的,其它安装脚本模块均在。/usr/lib/anaconda目录下,今后的行文中,除非是anaconda主执行体,其余均指。/usr/lib/anaconda目录下的模块,并将该目录简称为anaconda主目录。

  anaconda主目录的结构:  Installclasses:子目录中的各个模块定义了在安装过程中用户可选择的安装类型。redhat9.0下包含了四个文件workstation.py,server.py,custom.py和personal_desktop.py.其中,workstation.py描述了工作站安装类型,server.py描述了服务器安装类型,custom.py描述了用户自定义安装类型,personal_desktop.py描述了个人桌面安装类型。每个安装类型描述文件根据相应安装类型的特点,分别对安装步骤、分区策略以及安装包的取舍给出了不同的方案。  Iw子目录下包含所有安装图形界面类所在的模块,每个图形界面对应一个类,负责相应安装步骤图形界面的具体外观显示及与用户的交互,(可能)调用anaconda主目录下的相关安装行为模块完成具体的安装操作。  textw子目录和iw子目录含义是一致的,只是包含的是字符安装模式的前端字符用户界面类所在的模块,每个字符用户界面对应一个类,负责与用户的交互,字符界面的采用了python的snack库。  如果说用户界面类是处理安装程序外观的话,则anaconda主目录下的各python模块则执行每个安装界面背后具体的安装行为,包括那些无用户界面安装步骤的安装操作。  1.5 isolinux.cfg配置文件  default vesamenu.c32# 第一行,default vesamenu.c32,必须的,因为要用到菜单功能,必须有这个vesamenu.c32文件  #prompt 1  timeout 600  # 倒计时 600就是6秒  display boot.msg  #显示一条信息,这里可以修改  menu background splash.jpg  #显示菜单栏的安装界面背景图片  menu title Welcome to NeoKylin Linux Security OS V5!  #显示菜单栏标题  menu color border 0 #ffffffff #00000000  #菜单栏边框颜色  menu color sel 7 #ffffffff #ff000000  #选中文字颜色  menu color title #0000ff #0000ff  #标题颜色  menu color tabmsg 5 #ffffffff #00000000  menu color unsel #000000 #000000  #未选中颜色  menu color hotsel 6 #ff000000 #ffffffff  menu color hotkey 7 #ffffffff #ff000000  menu color scrollbar #fafac0 #fafac0  label install  #表示我们是要安装系统  #下面的是我们安装的时候看到的安装界面信息,如果我们安装时选择了某一项,相应的操作是通过这个文件来设置。  menu label Install system with ^basic video driver  kernel vmlinuz  append initrd=initrd.img ks=cdrom:/isolinux/ks.cfg xdriver=vesa nomodeset quiet  label install text  menu label Install system with ^basic video driver (text)  kernel vmlinuz  append initrd=initrd.img ks=cdrom:/isolinux/ks_text.cfg xdriver=vesa nomodeset quiet  label rescue  menu label ^Rescue installed system  kernel vmlinuz  append initrd=initrd.img rescue  label local  menu label Boot from ^local drive  localboot 0xffff  label memtest86  menu label ^Memory test  kernel memtest  append -  2. Linux系统启动概览




  图1 启动概览

3. 加载BIOS  当你打开计算机电源,计算机会首先加载BIOS(Basic Input Output System)。系统加电后会读取其中各项数据, BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。在 PC 中,引导 Linux 是从 BIOS 中的地址 0xFFFF0 处开始的。 在此之后,PC获得了第一启动设备代号。

4. Boot Loader  4.1 stage1  第一启动设备上面的第0磁道第一个扇区被称为MBR,也就是Master Boot Record,即主引导记录,它的大小是512字节,里面存放了预启动信息、分区表信息。当启动设备找到之后,加载MBR到RAM中执行。在linux系统中,这个阶段读取的文件是/boot/grub/stage1.一旦这个boot loader加载到RAM,BIOS就把计算机控制权交给它。  内存中运行的MBR包括了程序代码和分区表两个部分,如图2所示。512bytes中的前446bytes用来放bootloader,其中既有可执行代码也有错误消息文件。接下来的64bytes是四个分区表,每个16bytes.最后是两个bytes的magic number(其实就是0xAA55),主要是用来校验这个MBR是不是有效。stage1 bootloader的主要功能就是装载第二引导程序(stage2) ,这主要是归结于在主引导扇区中没有足够的空间用于其他操作。

  图2 MBR结构图  要查看 MBR 的内容,可下面的命令:  # dd if=/dev/sda of=mbr.bin bs=512 count=1  # od -xa mbr.bin  显示结果为:  0000000 ……  *  0001000  最左边表示的是文件的偏移量,用八进制表示的,(0001000)表示成十进制就是512,这个dd命令需要以root用户的身份运行,它从 /dev/sda上读取前 512 个字节的内容,并将其写入mbr.bin文件中。od命令会以十六进制和ASCII码格式打印这个二进制文件的内容。  4.2 stage1.5  在/boot/grub目录下面,有fat_stage_1.5 e2fs_stage_1.5 xfs_stage_1.5等等,stage1.5和文件系统有关系。有时候基本引导装载程序(stage1)不能识别stage2所在的文件系统分区,那么此时就需要stage1.5来连接stage1和stage2了。因此对于不同的文件系统就会有不同的stage1.5.  4.3 stage2  Stage2 Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备,并且加载内核。  我们常常把first-stage(stage1)和second-stage(stage2)的boot loaders合称为Linux Loader(LILO)或是x86 PC环境下的GRand Unified Bootloader (GRUB)。 在GRUB中,通过文件/boot/grub/grub.conf来显示一个菜单或是输入命令 .GRUB相对于LILO的最大的好处是它能够读懂各种linux的文件系统。实际上,GRUB是把前面说的两个stage的boot loader扩展到三个阶段,也就是在stage1之后,加入了stage1.5 boot loader,来完成对文件系统的认知的。比如reiserfs_stage1_5 (从一个 Reiser文件系统)或者e2fs_stage1_5 (从ext2或者ext3文件系统)加载。当这个stage 1.5 boot loader加载运行之后,stage 2 boot loader才加载。  grub是在grub.conf的支配下运行的 ,一旦grub从它的命令行或者配置文件中,接到开始操作系统的正确指令,它就寻找必要的引导文件,然后把机器的控制权移交给操作系统。  grub的功能:  1.能够实现启动哪个操作系统  2.grub的编辑模式可以直接向内核传递参数。  3.加密保护功能  在我系统/boot/grub/grub.conf文件中linux引导命令如下:  # grub.conf generated by anaconda  #  # Note that you do not have to rerun grub after making chan  ges to this file  # NOTICE: You do not have a /boot partition. This means that  # all kernel and initrd paths are relative to /, eg.  # root (hd0,0)  # kernel /boot/vmlinuz-version ro root=/dev/sda1  # initrd /boot/initrd-[generic-]version.img  #boot=/dev/sda  default=0  timeout=10 /*默认等待时间,可以设置的长一点*/  splashimage=(hd0,0)/boot/grub/splash.xpm.gz  Hiddenmenu /*这个将menu菜单隐藏了,如果你安装了多个系统,可以将这个注释掉,则系统启动时选择操作系统会变的更加方便*/  title Red Hat Enterprise Linux (2.6.32-131.0.15.el6.i686)  root (hd0,0)  kernel /boot/vmlinuz-2.6.32-131.0.15.el6.i686 ro root=UUID=  922f42cd-a6af-4784-a743-b43753054838 rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM LANG=zh_CN.UTF-8 KEYBOARDTYPE=pc KE  YTABLE=us crashkernel=auto rhgb quiet  initrd /boot/initramfs-2.6.32-131.0.15.el6.i686.img  root (hd0,0) ,root 表示用于定义你的grub的第二阶段用到的一些文件包配置文件和kernel文件所在的分区的,(hd0,0)表示的是第一块硬盘的第一个主分区。grub不管你是什么硬盘,都叫hd,第一块硬盘hd0,第一个分区0 ,表示为(hd0,0) .  文件中的kernel命令用来指定内核所在的位置,"/"代表(hd0,0),也就是grub的根目录。  这些信息记录在/var/log/dmesg,记录了初始化过程中的所有信息。  initrd命令用来指定初始化RAM的img文件所在位置。  对grub命令进行加密:  1)使用命令/sbin/grub-md5-crypt来产生grub使用的密码  /sbin/grub-md5-crypt  Password:  Retype password:  $1$3YbPF$FVKSKDFJKWJEKJF90XRkrl  2)修改/boot/grub.conf加入password --md5 $1$3YbPF$FVK  SKDFJKWJEKJF90XRkrl,这句话一定要加在title之前。这样在重启系统时在grub的启动grub菜单时,想按下e进入编译模式时,必须要先按下p输入grub密码。  当stage 2加载完毕,GRUB可以列出可用的kernel(在/boot/grub/grub.conf中定义)。你可以选择其中的一个,并且设置你选中的kernel的启动参数。  当stage 2 boot loader加载到内存后,默认的kernel映像和initrd映像会加载到内存中。这些映像加载完毕之后,stage 2 boot loader就会激活kernel映像。

  5. kernel  Stage 2 bootloader之后,内核已经加载到了内存中,控制权转移到了kernerl.这个kernel一般还不是一个可执行的kernel,而是压缩过的kernel映像。通常这个映像使用zlib压缩为zImage (compressed image,小于512KB) 或者是bzImage (big compressed image,大于512KB)。在这个映像的初始部分是一个小模块,进行一些基本的硬件初始化工作,然后把可执行的kernel部分解压出来,放到内存高位。接下来,这个模块就调用kernel,开始kernel引导工作。当解压缩内核完成后,屏幕输出"OK, booting the kernel".系统将解压后的内核放置在内存之中,kernel会立即初始化系统中各设备并做相关配置工作,其中包括CPU、I/O、存储设备等。在2.6内核中,支持两种格式的initrd,一种是2.4内核的文件系统镜像image-initrd,一种是cpio格式。以 cpio 格式为例,内核判断initrd为cpio的文件格式后,会将initrd中的内容释放到rootfs中。initrd一种基于内存的文件系统,启动过程中,系统在访问真正的根文件系统/时,会先访问initrd 文件系统。将initrd中的内容打开来看,会发现有bin、devetc、lib、procsys、sysroot、 init等文件(包含目录)。其中包含了一些设备的驱模拟块,比如scsi ata等设备驱动模块,同时还有几个基本的可执行程序 insmod, modprobe, lvm,nash.主要目的是加载一些存储介质的驱动模块,如上面所说的scsi ideusb等设备驱动模块,初始化LVM,把/根文件系统以只读方式挂载  initrd中的内容释放到rootfs中后,Kernel会执行其中的init文件,这里的init是一个nash脚本,由nash解释器执行。这个时候内核的控制权移交给init文件处理,我们查看init文件的内容,主要也是加载各种存储介质相关的设备驱动。

驱动加载后,会创建一个根设备,然后将根文件系统/以只读的方式挂载。这步结束后,执行switchroot,转换到真正的根/上面去,同时运行/sbin/init程序,这就是我们系统的1号进程,此后,系统启动的控制权移交给 init 进程。关于switchroot,这是在nash中定义的程序。  总结:在整个kernel的启动中,在stage 2的boot loader载入到内存中的initial-RAM disk (initrd) 会被拷贝到RAM中,并挂载起来。它以一个临时的文件系统的身份在RAM中工作,使得kernel在没有任何物理设备挂载的情况下也可以完整的启动起来。正是由于所有与外围设备相关的交互都可以放到initrd中,kernel本身虽然很小,但却支持范围极其广的硬件设备。在kernel的启动完成之后,root文件系统就会回滚(通过pivot_root),initrd的root文件系统被卸载,实际的root文件系统被挂载起来。  Initrd存在是因为Linux Kernel需要适应多种不同的硬件架构,但是将所有的硬件驱动编入Kernel又是不实际的,而且Kernel也不可能每新出一种硬件结构,就将该硬件的设备驱动写入内核。实际上LinuxKernel仅是包含了基本的硬件驱动,在系统安装过程中会检测系统硬件信息,根据安装信息和系统硬件信息将一部分设备驱动写入 initrd .这样在以后启动系统时,一部分设备驱动就放在 initrd 中来加载。  综上,kernel的主要操作包括:  1.Device探测  2.驱动程序初始化  3.以只读方式加载根文件系统  4.启动init进程  initrd是inital ram disk的宿写。  当存在initrd的时候,机器启动的过程大概是以下几个步骤(当initrd这一行用noinitrd 命令代替后,就不存在initrd了)  1)boot loader(grub)加载内核和initrd.img  2)内核将压缩的initrd.img解压成正常的ram disk并且释放initrd所占的内存空间  3)initrd作为根目录以读写方式被挂载  4)initrd里面的文件linuxrc被执行  5)linuxrc挂载新的文件系统  6)linuxrc使用pivot_root系统调用指定新的根目录并将现有的根目录place到指定位置。  7)在新的文件系统下正式init  8)initrd被卸载

  6. init进程  6.1 读取inittable  内核被加载运行完成之后,第一个运行的程序便是/sbin/init,这个程序会去读取/etc/inittab文件,并在其中找一行指定默认运行级别的代码,然后根据指定级别运行初始化服务。  /etc/inittab中的配置信息格式如下:  id:runlevel:action:process  id:标示符  runlevel:运行级别  action:对应运行级别所进行的操作  process:执行的命令  runlevel运行等级设定如下:  0:关机  1:单用户模式  2:无网络支持的多用户模式  3:有网络支持的多用户模式  4:保留,未使用  5:有网络支持有X-Window支持的多用户模式  6:重新引导系统,即重启  其中的action有如下选项:  respawn:表示init程序对此process进行监控,即使此进程被终止也立即被启动;  wait:表示init进程只调用一次此process,并等待其结束后再进行下一步操作;  initdefault:表示系统运行后默认进入的运行级别;由于进入某个级别会默认开始执行对应级别的各种进程,故此处不定义process,如果此条记录不存在,会直接进入文本模式;  sysinit:系统启动时准备运行的命令,此命令直接指向系统启动后运行的第一个初始化脚本/etc/rc.d/rc.sysinint;  powerfail:表示当电源被切断后(有ups时)运行后面的proces  ;  powerokwait:当电源监测发现电源恢复则执行后面的process  ;  ctrlaltdel:允许init在用户于控制台键盘上按下C t r l + A l t + D e l组合键时,重新启动系统。注意,如果该系统放在一个公共场所,系统管理员可将C t r l + A l t + D e l组合键配置为别的行为,比如忽略等。  6.2 在单用户模式下引导  一个重要的运行级别就是单用户模式(运行级别1),该模式中,只有一个系统管理员使用特定的机器,而且尽可能少地运行系统服务,其中包含登录。单用户模式对少数管理任务(比如在/usr分区上运行fsck)而言,是很有必要的,因为这需要卸载分区,但这是不可能的,除非所有的服务系统已被杀死。  一个正在运行的系统可以进入单用户模式,具体做法是利用init,请求运行级别1.内核启动时,在内核命令行指定single或emergency关键字,就可进入运行级别1了。内核同时也为init指定命令行,init从关键字得知自己不应该采用默认的运行级别(内核命令行的输入方式和你启动系统的方式有关)。  有时,以单用户模式进行启动是必要的,这样一来,用户在装入分区之前,或至少在装入分散的/usr分区之前,能手工运行fsck(在分散的文件系统上,任何活动都可能使其更为分散,所以应该尽可能地运行fsck)。  如果自动化的fsck在启动时失败了,启动脚本init的运行将自动进入单用户模式。这样做是为了防止系统使用不连贯的文件系统,这个文件系统是f s c k不能自动修复的。文件系统不连贯的现象极为少见,而且通常会导致硬盘的不连贯或实验性的内核释放,但最好能做到防患于未然。  由于安全上的考虑,在单用户模式下,启动外壳脚本之前,配置得当的系统会要求用户提供root密码。否则,它会简单地为L I L O输入合适的一行代码,以r o o t的身份登录(当然,如果/etc/passwd已经由于文件系统的问题而不连贯了,就不适合这里的原则了,为对付这种情况,你最好随时准备一张启动盘)。  不同的运行级有不同的用处,也应该根据自己的不同情形来设置。  6.3 执行rc.sysinit  在设定了运行等级后,Linux系统执行的初始化脚本文件/etc/rc.d/rc.sysinit对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统它做的工作有:  1. 激活udev和selinux;  2. 通过读取/etc/sysctl.conf设置内核参数  3. 设置系统时间  4. 加载键盘映射  5. 启用swap分区  6. 设置主机名  7. 检查根文件系统,并以读写方式重新挂载根文件系统  8. 激活LVM和RAID设备  9. 启动磁盘限额  10. 挂载其他文件系统  11. 清理过期文件锁和PID文件  在执行sysinit脚本中,默认调用/etc/sysconfig中的文件来进行设置系统的环境,若想看系统加载的信息可以利用dmesg来查看。  6.4 开启和关闭服务  开启和关闭和服务是按照文件/etc/rc.d/rcX.d/[KS]来执行的。  首先终止"K"开头的服务,然后启动"S"开头的服务。  对每一个运行级别来说,在/etc/rc.d子目录中都有一个对应的下级目录。这些运行级别的下级子目录的命名方法是rcX.d,其中的X就是代表运行级别的数字。比如说,运行级别3的全部命令脚本程序都保存在/etc/rc.d/rc3.d子目录中。在各个运行级别的子目录中,都建立有到/etc/rc.d/init.d子目录中命令脚本程序的符号链接,但是,这些符号链接并不使用命令脚本程序在 /etc/rc.d/init.d子目录中原来的名字。如果命令脚本程序是用来启动一个服务的,其符号链接的名字就以字母S打头;如果命令脚本程序是用来关闭一个服务的,其符号链接的名字就以字母K打头。许多情况下,这些命令脚本程序的执行顺序都很重要。为了安排它们的执行顺序,在字母S或者 K的后面紧跟着一个两位数字,数值小的在数值大的前面执行。比如:/etc/rc.d/rc3.d/S50inet就会在 /etc/rc.d/rc3.d/S55  named之前执行。  系统先运行以字母K打头的命令脚本程序,然后再运行以字母S打头的命令脚本程序。对以字母K打头的命令脚本程序来说,会传递Stop参数;类似地对以字母S打头的命令脚本程序来说,会传递 Start参数。  6.5 自定义脚本程序  执行/etc/rc.d/rc.local,Redhat Linux中的运行模式2、3、5都把/etc/rc.d/rc.lo  cal做为初始化脚本中的最后一个,Linux留给用户进行个性化的地方。你可以把你想设置和启动的东西放到这里。  7. 登陆  完成了系统所有的启动任务后,到了我们用户输入用户名和密码。Linux的账号验证程序是login ,login会对用户名进行分析:如果用户名不是root,且存在/etc/nologin文件,login将输出nologin文件的内容,然后退出。这通常用来系统维护时防止非root用户登录。只有/etc/securetty中登记了的终端才允许root用户登录,如果不存在这个文件,则root可以在任何终端上登录。/etc/usertty文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。  在分析完用户名后,login将搜索/etc/passwd以及/etc/shadow来验证密码以及设置账户的其它信息,比如:主目录是什么、使用何种shell.如果没有指定主目录,将默认为根目录;如果没有指定shell,将默认为/bin/bash.  login程序成功后,会向对应的终端在输出最近一次登录的信息(在/var/log/lastlog中有记录),并检查用户是否有新邮件(在/usr/spool/mail/的对应用户名目录下)。然后开始设置各种环境变量:对于bash来说,系统首先寻找/etc/profile脚本文件,并执行它;然后如果用户的主目录中存在。bash_profile文件,就执行它,在这些文件中又可能调用了其它配置文件,所有的配置文件执行后后,各种环境变量也设好了,这时会出现大家熟悉的命令行提示符,到此整个启动过程就结束了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: