linux 的安装和启动流程

标签: linux | 发表时间:2012-08-01 10:29 | 作者:ping1214
出处:http://blog.csdn.net

自己整理的linux的安装和启动

1. Linux安装流程

1.1 安装过程总览

1. BIOS加电自检

2. 运行isolinux目录下面的isolinux.bin文件,这个isolinux.bin文件根据isolinux.cfg文件的选项来加载内核vmlinuz和initrd.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 

1.3 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,mode

les,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和se linux
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文件,就执行它,在这些文件中又可能调用了其它配置文件,所有的配置文件执行后后,各种环境变量也设好了,这时会出现大家熟悉的命令行提示符,到此整个启动过程就结束了。


作者:ping1214 发表于2012-8-1 10:29:45 原文链接
阅读:1 评论:0 查看评论

相关 [linux] 推荐:

Javascript 里跑Linux

- rockmaple - Shellex&#39;s Blog
牛逼到暴的大拿 Fabrice Bellard,用Javascript实现了一个x86 PC 模拟器,然后成功在这个模拟器里面跑Linux(请用Firefox 4 / Google Chrome 11打开,Chome 12有BUG). 关于这个东西… 伊说 “I did it for fun“,大大啊大大啊….

Linux Ksplice,MySQL and Oracle

- Syn - DBA Notes
Oracle 在 7 月份收购了 Ksplice. 使用了 Ksplice 的 Linux 系统,为 Kernel 打补丁无需重启动,做系统维护的朋友应该明白这是一个杀手级特性. 现在该产品已经合并到 Oracle Linux 中. 目前已经有超过 700 家客户,超过 10 万套系统使用了 Ksplice (不知道国内是否已经有用户了.

linux makefile编写

- hl - C++博客-首页原创精华区
在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则. target也就是一个目标文件,可以是Object File,也可以是执行文件. prerequisites就是,要生成那个target所需要的文件或是目标. command也就是make需要执行的命令. 这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在 command中.

Linux下的VDSO

- 圣斌 - Adam&#39;s
VDSO(Virtual Dynamically-linked Shared Object)是个很有意思的东西, 它将内核态的调用映射到用户态的地址空间中, 使得调用开销更小, 路径更好.. 开销更小比较容易理解, 那么路径更好指的是什么呢. 拿x86下的系统调用举例, 传统的int 0×80有点慢, Intel和AMD分别实现了sysenter, sysexit和syscall, sysret, 即所谓的快速系统调用指令, 使用它们更快, 但是也带来了兼容性的问题.

Linux wget命令

- - CSDN博客推荐文章
wget是linux最常用的下载命令, 一般的使用方法是: wget + 空格 + 要下载文件的url路径. 例如: # wget  http://www.linuxsense.org/xxxx/xxx.tar.gz. 简单说一下-c参数, 这个也非常常见, 可以断点续传, 如果不小心终止了, 可以继续使用命令接着下载.

linux 小技巧

- - DBA Blog
2:如何限制用户的最小密码长度. 修改/etc/login.defs里面的PASS_MIN_LEN的值. 比如限制用户最小密码长度是8:. 3:如何使新用户首次登陆后强制修改密码. 4:更改Linux启动时用图形界面还是字符界面. 将id:5:initdefault: 其中5表示默认图形界面. 改id:3: initdefault: 3表示字符界面.

Linux iostat命令

- - CSDN博客系统运维推荐文章
iostat用于输出CPU和磁盘I/O相关的统计信息. . iostat [ -c | -d ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ device [. iostat各个参数说明:. -c 仅显示CPU统计信息.与-d选项互斥. -d 仅显示磁盘统计信息.与-c选项互斥.

Linux的架构

- - 博客园_首页
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明. 我们以下图为基础,说明Linux的架构(architecture). (该图参考《 Advanced Programming in Unix Environment》). 最内层是我们的硬件,最外层是我们常用的各种应用,比如说使用firefox浏览器,打开evolution查看邮件,运行一个计算流体模型等等.

linux命令locate

- - 操作系统 - ITeye博客
    locate命令其实是"find -name"的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息. Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件.

Linux Namespace 浅析

- - IT瘾-dev
目前Linux内核总共支持以下6种Namespace:. IPC:隔离System V IPC和POSIX消息队列. Network:隔离网络资源. Mount:隔离文件系统挂载点. User:隔离用户ID和组ID. 如果想要给已存在进程设置新的namespace,可通过unshare函数( long unshare(unsigned long flags))完成设置,其入参flags表示新的namespace.