免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1321 | 回复: 0
打印 上一主题 下一主题

系统初始化与服务 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-25 09:21 |只看该作者 |倒序浏览
System Initialization And Service
                                                  01/25/09
by:yifengzhang21c
学习linux维护,有必要了解linux的开机流程,这对排除启动故障有很大的帮助,也是RHCE/RHCT考试Troubleshooting部分必考科目.
基本概括下redhat linux的启动流程:
一.BIOS (basic input output system)Initialization,这部分主要做以下三件事:

  • 外设监测(peripheral detected).做POST(power on self test)动作,该动作主要用于进行自我检测.

  • 设置开机设备,如我们通常在BIOS中设置boot选项,那么系统是打算先从cdrom还是floop还是disk启动.

  • 读取开机设备的first sector.一旦读取成功,则BIOS任务完成,接下来任务转交boot loader.
    二.Bootloder Components,这主要就是介绍grub(the GRand Unified Bootloader)
    那么bootloader通常可以被安装在MBR(Master Boot Record)或者分区的boot sector.


    MBR大小为446+64+2=512bytes,其中446bytes用来安装IPL(inital program loader),64bytes用来记录分区表信息,每个分区表信息占用16bytes,64/16=4.所以一块硬盘最多可以划分4个主分区,超过4个分区时,将会把第四个主分区转变为扩展分区.(关于分区的详细信息,将在文件系统管理和系统安装部分详细讨论.)
    在redhat下IPL使用的是grub.这个时候boot loader将进行两部分工作.
  • 运行存储在MBR或者boot sector下的grub程序.
  • 通过grub,选择要加载的引导分区.
    这部分就是我们通常看到的,开机后的grub画面

    让我们选择是加载redhat还是windows 2003 SP1的kernel.下面是当我们选择启动RHEL和WIN2k3的流程.

    这个为grub加载RHEL的流程
    下面这个为grub加载win2k3的流程



    接下来,介绍grub引导装载程序的配置文件/boot/grub/grub.conf.
    [root@server ~]# cat /boot/grub/grub.conf
    # 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/VG0/root
    #          initrd /initrd-version.img
    #boot=/dev/sda
    default=0
    timeout=5
    splashimage=(hd0,0)/grub/splash.xpm.gz
    #hiddenmenu
    title Red Hat Enterprise Linux Server (2.6.18-53.el5)
            root (hd0,0)
    #       kernel /vmlinuz-2.6.18-53.el5 ro root=/dev/VG0/root rhgb quiet
            kernel /vmlinuz-2.6.18-53.el5 ro root=/dev/VG0/root quiet
            initrd /initrd-2.6.18-53.el5.img
    这里以#号开头的都被当做注释部分.
    default指令定义从哪个title启动,如果你有多个title,那么第一个title
    为0,第二个为1,依次类推.当设为0,表示默认以第一个title为启动对象.

    timeout=5指令,当开机进入grub引导画面时,5s内没有选择,则自动启动default预设的系统.

    splashimage指令定义grub的开机画面.如果你看腻了RHEL的背景,那换换你老婆的照片也不错哦!这样以后当她埋怨你时间都用在电脑上,而不抽时间陪她的时候你就可以告诉她,其实你的电脑里都是她,从来都是形影不离哈哈.我说笑.

    hiddenmenu指令,如果有设定过,则必须在开机时键入任意一个键后才出现开机
    选单.(即会隐藏开机选单)

    title指令为选单标题名称,如RHEL或者win2k3.
    root (hd0,0)即指hda0
    kernel /vmlinuz-2.6.18-53.el5 ro root=/dev/VG0/root rhgb quiet
    这里的
    kernel指定kenerl image的位置
    ro代表readonly,就是说将kernel以只读的形式载入
    rhgb代表redhat graphical boot,引导画面以图形方式进入
    quiet代表不显示错误信息

    grub的另一个优点是安全,它可以在开机时设置密码,这样就可以防止别人以single mode登录,绕过root password进入系统,对系统造成威胁.
    实现方法:
    在/boot/grub/grub.conf文件中添加password指令,
    格式:password 密码
    e.g.
    password Pamela
    保存退出,那么再进入grub界面,想要进行edit操作,就需要提供password了.
    尽管grub.conf文件的权限为600,但是为了安全起见,还是对password字段进行加密好,我们使用grub-md5-crypt进行MD5加密.
    在command-line typing
    [root@server ~]# grub-md5-crypt
    Password:
    Retype password:
    $1$WhR4L$bhJWrpyOed/BB.IEQzV5H0
    经过两次密码确认后,生成了一个字符序列.这个字符序列以$1$开头,表示有设定该密码,后面字段为加密序列.

    下面再举个例子,我把我的grub引导画面设置为图片Pamela.过程如下:
    [root@server tmp]# ls
    Pamela.jpg
    [root@server tmp]# convert Pamela.jpg -resize 640x480 -colors 14 Pamela.xpm
    [root@server tmp]# ls
    Pamela.jpg  Pamela.xpm
    [root@server tmp]# gzip Pamela.xpm
    [root@server tmp]# ls
    Pamela.jpg  Pamela.xpm.gz
    [root@server tmp]# cp Pamela.xpm.gz /boot/grub/
    [root@server tmp]# vi /boot/grub/grub.conf
    修改splashimage=(hd0,0)/grub/Pamela.xpm.gz保存退出,重启即可.
    (还要补充一点:我在测试过程中,持续花屏,估计是colors14渲染问题,谁解决的回个帖子啊,谢谢.)

    如果由于某种原因你的MBR损坏,那么你有必要手动安装grub,可以使用命令:
    /sbin/grub-install boot-device
    来进行安装.
    如果这种方式安装不了,那么也可以使用这种方式:
    #grub
    #root (hd0,0)
    #setup (hd0)
    #quit
    这两种方法都可以作为恢复MBR中的grub损坏问题的.
    典型例子,当你装过双系统后,重新安装windows的时候,windows将会重写MBR中的信息,这个时候将导致windows可以正常启动,原有linux无法正常启动,可以通过上面的方式,使用RHEL disk1进入linux rescue mode修复.
    三.Kernel Initialization
    kernel启动时的只能主要包括:
  • 设备检测
  • 设备驱动初始化
  • 挂载根文件系统为只读模式
  • 加载init进程
    详细关于kernel的介绍,将作为单独学习.
    四.Init Initialization
    这个过程中主要会涉及以下几个文件:
  • /etc/inittab
  • /etc/rc.d/rc.sysinit
  • /etc/rc.d/rc
  • /etc/rc.d/rc?.d
  • /etc/rc.d/rc.local
  • X Display Manager if appropriate
    通过命令pstree可以发现,init是所有进程的父进程(init is the parent of all processes).因为它是第一个启动的进程,所以它的pid为1.如:
    [root@server ~]# pstree
    init─┬─acpid
         ├─anacron
         ├─atd
         ├─auditd─┬─python
         │        └─{auditd}
         ├─automount───4*[{automount}]
         ├─avahi-daemon───avahi-daemon
         ├─crond
         ├─cupsd
         ├─dbus-daemon───{dbus-daemon}
         ├─events/0
    init的配置文件,为/etc/inittab,它包括了以下内容:
  • 系统启动级别
  • 系统初始化脚本
  • 运行级对应的脚本目录
  • 组合键的设定
  • UPS断电与恢复脚本
  • 常用tty虚拟终端
    下面看看/etc/inittab文件内容,/etc/inittab同样是以#号开头的行为注释行.那么我通过如下命令过滤掉所有以#号开头的行,就是init实际要执行的语句.
    [root@server ~]# awk '$0 !~ /^#/' /etc/inittab
    id:3:initdefault:
    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
    l5:5:wait:/etc/rc.d/rc 5
    l6:6:wait:/etc/rc.d/rc 6
    ca::ctrlaltdel:/sbin/shutdown -t3 -r now
    pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
    pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
    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:5:respawn:/etc/X11/prefdm -nodaemon
    参数id:3:initdefault:代表run level为3的是默认启动级别.如果要以图形方式登录,将3修改为5即可.注释中列出了linux运行级的描述,内容如下:
    # 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)
    千万不要将默认的run level设定为0或者是6.不然,就舒服了.
    参数si::sysinit:/etc/rc.d/rc.sysinit指定了系统的启动脚本,也就是说/etc/rc.d/rc.sysinit脚本控制着linux系统的启动行为,包括了N多系统启动时的定义.该脚本是使用bash写的,有兴趣的朋友可以看下.
    参数l3:3:wait:/etc/rc.d/rc 3将根据上面的id:3:initdefault:所设置的值来读取对应的目录.如果值设置为3,那么/etc/rc.d/rc这个script将3作为参数读取,并启动/etc/rc.d/rc3.d下需要启动的脚本.
    那么如何判断/etc/rc.d/rc3.d下的脚本在run level3时是否需要启动呢?我们来看下这个目录下的scripts.
    [root@server rc3.d]# ls
    K02avahi-dnsconfd            K89rdisc            S22messagebus
    K02dhcdbd                    K91capi             S25bluetooth
    K02NetworkManager            K99readahead_later  S25netfs
    K02NetworkManagerDispatcher  S00microcode_ctl    S25pcscd
    K05conman                    S02lvm2-monitor     S26apmd
    K05saslauthd                 S03sysstat          S26hidd
    K10psacct                    S04readahead_early  S28autofs
    那么这里面的文件中,包括K和S打头的文件.所谓K就是指kill,S就是指start.那么start就是在系统启动时需要运行的脚本.kill的就是不需要运行的脚本.通常执行顺序为,先关闭不需要启动的脚本,即以K开头的脚本,再启动S开头的脚本.
    同理,如果run level为5,那么开机的时候将运行/etc/rc.d/rc5.d/下的scripts.
    参数ca::ctrlaltdel:/sbin/shutdown -t3 -r now用来设定快捷键.该指令表示当同时按住ctrl+alt+del时将运行/sbin/shutdown -t3 -r now的指令.也就是重启系统.如果你不喜欢它的设置,那就#掉它吧~~linux最大的优点就是可以自定义很多东西,只要你想.
    pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
    pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
    这两条指令是针对UPS power的,就是不断电系统.那么当断电情况来临,UPS会持续供电短暂时间,直到UPS电量殆尽,这个时候UPS会发送信号给linux主机,linux主机将根据这个设定执行应急动作.由于电压不稳造成的断电,系统将执行shutdown -c来取关机.
    指令1:2345:respawn:/sbin/mingetty tty1是用于设置终端.通过指令/sbin/mingetty启动tty1~6虚拟控制台.
    指令x:5:respawn:/etc/X11/prefdm -nodaemon表示,如果run level为5,就是初始化X windows的环境.
    在command-line中改变当前运行级的命令为init new_runlevel
    查看当前运行级的命令为/sbin/runlevel

    这个图说明了整个运行过程.
    /etc/rc.d/rc.sysinit文件是开机的启动脚本,主要包括如下内容.
  • 激活udev和selinux
  • 设置/etc/sysctl.conf下的kernel选项
  • 设置系统时钟
  • 加载键盘
  • 启用swap分区
  • 设置主机名称
  • 检查并重新挂载文件系统
  • 激活RAID和LVM设备
  • 启用磁盘配额
  • 检查和挂载文件系统
  • 清理临时文件

  • /etc/rc.d/rc文件用于判断run level属于哪个级别.并启动和停用相应目录下的脚本,如启动级为5,则执行/etc/rc.d/rc5.d/*全部文件.
    /etc/rc.d/init.d存放着所有system V的启动脚本,/etc/rc.d/rc?.d/下的脚本其实都是/etc/rc.d/init.d/下脚本的链接.
    /etc/rc.d/rc.local在系统启动后要执行的脚本,那么你打算在开机时执行的额外任务,都可以写到这个文件里.这是system V初始化的最后一步.
    控制服务的几个常用命令:
    system-config-services图形界面的配置工具,超级友好.
    ntsysv命令行的图形配置工具,界面友好些
    chkconfig命令行工具,这个功能强大些,我喜欢
    service命令行工具,但是建议不要使用,因为别的版本linux不一定支持,我只知道suse和redhat都支持这个命令.最好使用绝对路径的方式来访问,如/etc/rc.d/init.d/servicename start/stop.......









    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/27173/showart_471051.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP