Chinaunix首页 | 论坛 | 博客
  • 博客访问: 670556
  • 博文数量: 168
  • 博客积分: 2928
  • 博客等级: 中校
  • 技术积分: 1904
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-04 09:56
文章分类

全部博文(168)

文章存档

2010年(168)

我的朋友

分类: LINUX

2010-04-12 22:35:24

【Linux 基础】Linux开机流程及重要系统文件

linux基础 2010-03-24 20:39:42 阅读24 评论0 字号:

一,linux开机流程.... 1

下图演示了系统启动过程中各个程序工作的顺序... 1

思考:是否没有 initrd 就无法顺利开机?... 1

二,开机后以下几个配置文件非常重要,请务必搞清楚。.... 1

1/etc/inittab. 2

2, /etc/rc.d/rc.sysinit. 2

3,加载自定义模块 /etc/modprobe.conf. 3

4, 相关服务的设定档 /etc/sysconfig/*. 3

,常见问题FAQ.. 3

 

正文:

开机流程

 

如上图所示,boot loader 可以载入 kernel initrd (这两个几乎是同时加载的!) ,然后在内存中让 initrd 解压缩成为根目录, kernel 就能够借此载入适当的驱动程序,最终释放虚拟文件系统,并挂载实际的根目录文件系统, 就能够开始后续的正常开机流程

 

就无法顺利开机?

答: 不见得的!需要 initrd 最重要的原因是,当开机时无法挂载根目录的情况下, 此时就一定需要 initrd ,例如你的根目录在特殊的磁盘介面 (USB, SATA, SCSI) 或者是你的文件系统较为特殊 (LVM, RAID) 等等,才会需要 initrd

 

如果你的 Linux 是安装在 IDE 介面的磁盘上,并且使用预设的 ext2/ext3 文件系统, 那么不需要 initrd 也能够顺利的开机进入 Linux 的!

 

注意:第一支程序 init

/etc/inittab

[root@www ~]# vim /etc/inittab    <==所有的设定都是在这里定义的。所有一定要搞清楚这个文件!!!

id:5:initdefault:                 <==预设的 runlevel 设定, runlevel 5

 

si::sysinit:/etc/rc.d/rc.sysinit  <==准备系统软体执行的环境的脚本执行档

 

# 7 个不同 run level 的,需要启动的服务的 scripts 放置路径:

l0:0:wait:/etc/rc.d/rc 0    <==runlevel 0 /etc/rc.d/rc0.d/

l1:1:wait:/etc/rc.d/rc 1    <==runlevel 1 /etc/rc.d/rc1.d/

l2:2:wait:/etc/rc.d/rc 2    <==runlevel 2 /etc/rc.d/rc2.d/

l3:3:wait:/etc/rc.d/rc 3    <==runlevel 3 /etc/rc.d/rc3.d/

l4:4:wait:/etc/rc.d/rc 4    <==runlevel 4 /etc/rc.d/rc4.d/

l5:5:wait:/etc/rc.d/rc 5    <==runlevel 5 /etc/rc.d/rc5.d/

l6:6:wait:/etc/rc.d/rc 6    <==runlevel 6 /etc/rc.d/rc6.d/

 

# 是否允许按下 [ctrl]+[alt]+[del] 就重新开机的设定项目:

ca::ctrlaltdel:/sbin/shutdown -t3 -r now

 

# 底下两个设定则是关于不断电系统的 (UPS),一个是没电力时的关机,一个是复电的处理

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       <==其实 tty1~tty6 是由底下这六行决定的。

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   <==X window 则是这行决定的!

 

 

如果你使用 vim 去查阅过 /etc/rc.d/rc.sysinit 的话,那么可以发现他主要的工作大抵有这几项:

2.1.  取得网络环境与主机类型:

读取网络设定档 /etc/sysconfig/network ,取得主机名称与预设通讯闸 (gateway) 等网络环境。

2.2.  测试与挂载内存装置 /proc USB 装置 /sys

除挂载内存装置 /proc 之外,还会主动侦测系统上是否具有 usb 的装置, 若有则会主动载入 usb 的驱动程序,并且尝试挂载 usb 的文件系统。

2.3.  决定是否启动 SELinux

我们在第十七章谈到的 SELinux 在此时进行一些检测, 并且检测是否需要帮所有的文件重新编写标准的 SELinux 类型 (auto relabel)

2.4.  启动系统的乱数产生器

乱数产生器可以帮助系统进行一些密码加密演算的功能,在此需要启动两次乱数产生器。

2.5.  设定终端机 (console) 字形:

2.6.  设定显示于开机过程中的欢迎画面 (text banner)

2.7.  设定系统时间 (clock) 与时区设定:需读入 /etc/sysconfig/clock 设定值

2.8.  周边设备的侦测与 Plug and Play (PnP) 参数的测试:

根据核心在开机时侦测的结果 (/proc/sys/kernel/modprobe ) 开始进行 ide / scsi / 网络 / 音效 等周边设备的侦测,以及利用以载入的核心模块进行 PnP 装置的参数测试。

2.9.  使用者自订模块的载入

使用者可以在 /etc/sysconfig/modules/*.modules 加入自订的模块,则此时会被载入到系统当中

2.10.       载入核心的相关设定:

系统会主动去读取 /etc/sysctl.conf 这个文件的设定值,使核心功能成为我们想要的样子。

2.11.       设定主机名称与初始化电源管理模块 (ACPI)

2.12.       初始化软体磁盘阵列:主要是透过 /etc/mdadm.conf 来设定好的。

2.13.       初始化 LVM 的文件系统功能

2.14.       fsck 检验磁盘文件系统:会进行 filesystem check

2.15.       进行磁盘配额 quota 的转换 (非必要)

2.16.       重新以可读写模式挂载系统磁盘:

2.17.       启动 quota 功能:所以我们不需要自订 quotaon 的动作

2.18.       启动系统虚拟乱数产生器 (pseudo-random)

2.19.       清除开机过程当中的暂存文件:

2.20.       将开机相关信息载入 /var/log/dmesg 文件中。

 

,加载自定义模块 /etc/modprobe.conf

还记得我们在 /etc/rc.d/rc.sysinit 当中谈到的载入使用者自订模块的地方吗?就是在 /etc/sysconfig/modules/ 目录下啊! 虽然核心提供的预设模块已经很足够我们使用了,但是,某些条件下我们还是得对模块进行一些参数的规划, 此时就得要使用到 /etc/modprobe.conf 啰!

[root@www ~]# cat /etc/modprobe.conf

alias eth0 8139too               <== eth0 使用 8139too 的模块

alias scsi_hostadapter pata_sis

alias snd-card-0 snd-trident

options snd-card-0 index=0       <==额外指定 snd-card-0 的参数功能

options snd-trident index=0

 

相关服务的设定档 /etc/sysconfig/*

不说您也知道,整个开机的过程当中,老是读取的一些服务的相关设定档都是记录在 /etc/sysconfig 目录下的!那么该目录底下有些啥玩意儿?我们找几个重要的文件来谈谈:

?     authconfig

这个文件主要在规范使用者的身份认证的机制,包括是否使用本机的 /etc/passwd, /etc/shadow 等, 以及 /etc/shadow 密码记录使用何种加密演算法,还有是否使用外部密码伺服器提供的帐号验证 (NIS, LDAP) 等。 系统预设使用 MD5 加密演算法,并且不使用外部的身份验证机制;

?     clock

此文件在设定 Linux 主机的时区,可以使用格林威治时间(GMT),也可以使用台湾的本地时间 (local)。基本上,在 clock 文件内的设定项目’ ZONE ‘所参考的时区位于 /usr/share/zoneinfo 目录下的相对路径中。而且要修改时区的话,还得将 /usr/share/zoneinfo/Asia/Taipei 这个文件复制成为 /etc/localtime 才行!

?     i18n

i18n 在设定一些语系的使用方面,例如最麻烦的文字介面下的日期显示问题! 如果你是以中文安装的,那么预设语系会被选择 zh_TW.UTF8 ,所以在纯文字介面之下, 你的文件日期显示可能就会呈现乱码!这个时候就需要更改一下这里啦!更动这个 i18n 的文件,将里面的 LC_TIME 改成 en 即可!

?     keyboard & mouse

keyboard mouse 就是在设定键盘与滑鼠的形式;

?     network

network 可以设定是否要启动网络,以及设定主机名称还有通讯闸 (GATEWAY) 这两个重要信息呢!

?     network-scripts/

至于 network-scripts 里面的文件,则是主要用在设定网络卡~ 这部份我们在伺服器架设篇才会提到!

总而言之一句话,这个目录下的文件很重要的啦!开机过程里面常常会读取到的!

 

Q:如何察看与修改 runlevel 呢?

      察看很简单,只要输入’ runlevel ‘就可以得知。而如果要修改目前的 runlevel 可以直接输入 init [level] 例如要去到 runlevel 3 可以:’ init 3 ‘即可。 如果想要每次开机都设定固定的 runlevel ,那么可以修改 /etc/inittab 这个文件! 将里面这一行改成:’id:3:initdefault:’即可。

 

Q:让一个程序在 Linux 系统下一开机就启动,但是在关机前会自动的先结束该程序,怎么做?

      由于 /etc/rc.d/rc[0-6].d 里面有的 Sxxname Kxxname 可以设定开机启动与关机结束的事项!所以我就可以轻易的写一个 script 放在 /etc/rc.d/init.d 里面,并连结到我的 run-level 里头,就可以让他自由自在的启动与结束了!

 

Q:万一不幸,我的一些模块没有办法让 Linux 的核心捉到,但是偏偏这个核心明明就有支援该模块, 我要让该模块在开机的时候就被载入,那么应该写入那个文件?

      应该写入 /etc/modprobe.conf (kernel 2.6.x) 或者是 /etc/modules.conf (kernel 2.4.x) 这个文件,他是模块载入相关的地方呢!当然,也可以写入 /etc/sysconfig/modules/* 里面。

 

Q:如何在 grub 开机过程当中,指定以’ run level 1 ‘来开机?

      在开机进入 boot loader 之后,利用 grub shell 的功能,亦即输入’ e ‘进入编辑模式, 然后在 kernel 后面增加:

      kernel (hd0,0)/boot/vmlinuz ro root=/dev/hda1 .... single

      那个 single 也可以改成 1 ,就能够进入。同样的,若使用 lilo 时,按下 tab 按键后, 输入

      label_name -s

      就能够进入 run level 1 啰!

 

Q:由于一些无心之过,导致系统开机时,只要执行 init 就会产生错误而无法继续开机, 我们知道可以在开机的时候,不要以 init 载入系统,可以转换第一支执行程序, 假设我第一支执行程序想要改为 /bin/bash ,好让我自行维护系统(不同于 run level 1 喔!) 该如何进行此一工作?

      在开机的过程当中,进入 lilo grub 的画面后,在 kernel 的参数环境下,加入 init=/bin/bash 来取代 /sbin/init ,则可略过 init /etc/inittab 的设定项目,不过,您必须相当熟悉 grub lilo 的设定才行喔!

 

Q:在 CentOS 当中,我们如何自动可载入的模块?

      可以经由设定 /etc/modprobe.conf 或者是将自行做好的设定档写入到 /etc/sysconfig/modules/ 目录中, 并且将档名取为 filename.modules ,注意喔,文件结果务必是 .modules 才行。 相关信息可以参考 /etc/rc.d/rc.sysinit 喔!

 

Q:如果你不小心先安装 Linux 再安装 Windows 导致 boot loader 无法找到 Linux 的开机选单,该如何挽救?

      方法有很多,例如:

      (1)借助第三方软体,安装类似 spfdisk 的软体在 MBR 里面,因为他同时认识 Linux Windows ,所以就可以用他来进入 Linux 啦!

      (2)或者使用类似 KNOPPIX Live CD 以光碟开机进入 Linux 之后,再以 chroot 软体切换根目录 (/),然后重新安装 grub boot loader ,同样也可以重新让两个作业系统存在啦!

      总之,只要你知道 MBR / Super block / boot loader 之间的相关性,怎么切换都可能啊

阅读(808) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~