刚刚开始学习linux,最近和鸟哥学了不少东西,下面是我转的,和大家一起学习。
1.开机关机流程与Loader
a> 载入BIOS的硬件信息,并取得第一个开机装置的代号
b> 读取第一个开机装置的MBR的boot Loader(也就是LILO,grub,spfdisk等)的开机信息
c> 载入kernel核心信息,kernel开始解压缩并尝试驱动所有硬件
d> kernel执行init程序并取得run-level信息
e> init执行/etc/rc.d/rc.sysinit
f> 启动kernel的外挂模块(/etc/modprobe.conf)
g> init执行run-level的各个批次档(Scripts)
h> init执行/etc/rc.d/rc.local
i> 执行/bin/login程序,并等待使用者登入
j> 登入之后开始以shell控制主机。
2.linux开机的一个简单流程:
Kernel (/boot/vmlinuz)
BIOS -> MBR(硬盘启动) -> Boot Loader -> initrd -> -> ... -> init ->
system init(/etc/rc.d/rc.sysinit) -> 启动系统服务与相关启动设定文件(/etc/rc.d/rc.n 或 /etc/sysconfig)
-> 用户自订开机启动程序(/etc/rc.d/rc.local)
-> 根据/etc/inittab的设定,载入终端或X-Window
boot loader要具有两个功能:
a> menu
b> pointer
3.第一个程序:init
linux系统当中第一个被执行的程序为/sbin/init,也就是我们在用ps aux 查看进程信息时所看到的PID=1的那个进程,我的系统为:root 1 0.0 0.4 2888 560 ? S Jan10 0:02 init [5]
4.init的功能:
a> 利用设定文件/etc/inittab来取得开机的等级:run level
b> 再由run level的设定来进行不同的开机服务项目的启动
5.什么是run level?
linux就是根据run level来规定系统使用不同的服务来启动的,让linux的使用环境不同。
6.run level的等级
根据有无网络以及有无X Windos可将run level分为六个等级:
0——halt (系统直接关机)
1——single user mode (单用户模式,用在系统出问题时的维护)
2——Multi User,Without NFS
3——Full multi-user(完整的,含有网络功能的纯文字模式)
4——Unused (系统保留的)
5——X11 (与run level 3类似,不同的是使用了X Window)
6——reboot
7.开机时,如何取得系统的run level
从/etc/inittab中取得。
8./etc/inittab的语法:
这个档案的语法是这样的:
[设定项目]:[run level]:[init 的动作行为]:[指令项目]
a. 设定项目:
最多四个字符,代表 init 的主要工作项目,只是一个简单的代表说明。
b. run level:
该项目在哪些 run level 底下进行的意思。如果是 35 则代表 runlevel 3 与
5 都会执行。
c. init 的动作项目:
主要可以进行的动作项目意义有:
initdefault :代表预设的 run level 设定值;
sysinit :代表系统初始化的动作项目;
ctrlaltdel :代表 [ctrl]+[alt]+[del] 三个按键是否可以重新开机的设定;
wait :代表后面接的指令项目必须要执行完毕才能继续后面的动作;
respawn :代表后面接的, init 仍会主动的『重新』启动。
更多的设定项目请参考 man inittab 的说明。
d. 指令项目:
亦即应该可以进行的指令,通常是一些 script 啰。
一个例子:
----------------------------------------------------------------------------------------------------
[root@linux ~]# vi /etc/inittab
# 设定系统开机预设的 run level 设定项目:
id:3:initdefault:
# 开始进行 run level 的服务启动前,使用来侦测与初始化系统环境的设定文件:
si::sysinit:/etc/rc.d/rc.sysinit
# 7 个不同 run level 的,需要启动的服务的 scripts 放置路径:
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
# 是否允许按下 [ctrl]+[alt]+[del] 就重新开机的设定项目:
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
# 本机端终端机启动的个数:
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 Window (run level 5) 环境下的启动 script 设定项目:
x:5:once:/etc/X11/prefdm -nodaemon
----------------------------------------------------------------------------------------------------
9.系统初始化(system initialization)程序为?
linux 系统初始化程序为: /etc/rc.d/rc.sysinit
----------------------------------------------------------------------------------------------------
10. /etc/rc.d/rc.sysinit主要做哪些工作?
a> 取得网络环境与主机类型:/etc/sysconfig/network
a> 测试与挂载内存设备/proc与USB设备/sys
a> 决定是否启动SELinux
a> 外围设备的检测与PNP参数的测试
核心在开机时检测结果保存在/proc/sys/kernel modprobe中,主要检测ide/scsi/网络/音效等
a> 用户自订模块的载入
用户可以在/etc/sysconfig/modules/*.modules中加入自订模块
a> 载入核心的相关设定:/etc/sysctl.conf
a> 设定系统时间 clock
a> 设定终端字符
a> 设定RAID与LVM等硬盘功能
a> 以fck检查磁盘文件系统
a> 进行磁盘quota的转换
a> 重新以可读取模式挂载系统磁盘
a> 启动quota
a> 启动随机数装置
a> 清除开机过程中暂存文件
a> 将开机相关信息载入/var/log/dmesg当中。
11.启动系统服务与相关启动设定文件:
----------------------------------------------------------------------------------------------------
linux启动时与系统服务有关的设定文件为:
/etc/rc.d/rc.n 以及 /etc/sysconfig
12.其他开机相关事项:
a> 关于模块:/etc/modprobe.conf
b> /etc/sysconfig/*
这里要注意几个authconfig,clock,desktop,i18n,keyboard&mouse,network,network-scripts
----------------------------------------------------------------------------------------------------
13.run level
a> 查看当前run level
# runlevel
b> 切换run level
◆要每次开机都执行某个run level,则需修改/etc/inittab中:
id:3:initdefault:
中的数字。
◆如果临时变更系统run level,则以根用户运行init [0-6]来运行。
c> 假设由init 5改到init 3,则更改run level时系统做了什么?
◆对比/etc/rc.d/rc3.d及/etc/rc.d/rc5.d内K与S开头的档案:
◆关闭/etc/rc.d/rc5.d中不存在于/etc/rc.d/rc3.d中的服务
◆启动/etc/rc.d/rc3.d中不存在于/etc/rc.d/rc5.d中的服务。
13.核心与核心模块
(1)目前的核心都是模块化(modules)的。
(2)核心的模块位置
a> 核心:/boot/vmlinuz 或 /boot/vmlinuz-version
b> 核心解压缩所需RAM Disk:/boot/initrd( /boot/initrd-version)
c> 核心模块:/lib/modules/version/kernel 或 /lib/modules/`uname -r`/kernel
d> 核心原代码: /usr/src/linux (需要另外安装)
(3) 如果核心被顺利载入系统中,那么会有几个信息记录下来:
a> 核心版本: /proc/version
b> 核心功能: /proc/sys/lernel
(4) 如果有新硬件,系统不支持,则可以有这样两种访求:
a> 加入最新的硬件驱动程序原始码,重新编译内核;
b> 将该硬件的驱动程序编译为模块,并在开机时载入该模块。
----------------------------------------------------------------------------------------------------
14.核心模块放置处:
/lib/modules/`uname -r`/kernel中,里面又分这样几个目录:
-----------------------------------------------------------------------------------
arch :与硬件平台有关的项目,例如 CPU 的等级等等;
crypto :核心所支持的加密的技术,例如 md5 或者是 des 等等;
drivers :一些硬件的驱动程序,例如显示卡、网络卡、PCI 相关硬件等等;
fs :核心所支持的 filesystems ,例如 vfat, reiserfs, nfs 等等;
lib :一些函式库;
net :与网络有关的各项协议数据,还有防火墙模块 (net/ipv4/netfilter/*) 等等;
sound :与音效有关的各项模块;
-----------------------------------------------------------------------------------
15.核心模块的相关性
保存在/lib/modules/`uname -r`/modules.dep中
16.modules.dep可以用depmod来建立
-----------------------------------------------------------------------------------
depmod [-Ane]
参数:
-A :不加任何参数时, depmod 会主动的去分析目前核心的模块,并且重新写入
/lib/modules/`uname -r`/modules.dep 当中。若加入 -A 参数时,则 depmod
会去搜寻比 modules.dep 还要新的模块,如果真找到新模块,才会更新。
-n :不写入 modules.dep ,而是将结果输出到屏幕上(standard out);
-e :显示出目前已加载的不可执行的模块名称
范例:
范例一:若我已经做好一个网络卡驱动程序,假设文件名为 a.ko,该如何更新核心相依性?
[root@linux ~]# cp /full/path/a.ko /lib/modules/`uname -r`/kernel/drivers/net
[root@linux ~]# depmod
-----------------------------------------------------------------------------------
17.核心模块的察看
a> 显示系统已加载的模块 lsmod
列出模块名称、模块大小以及是否其他模块所使用
b> 查阅模块信息 modinfo
18.核心模块的加载与移除
a> 老的做法:
insmod 加载模块
rmmod 移除模块
b> 常用方法:
modprobe [-cflr] module_name
-c 列出目前系统中所有模块
-f 强制加载
-l 列出 /lib/modules/`uname -r`/kernel 当中的所有的模块完整名称
-r 移除modules
19.核心模块的额外参数设定:
/etc/modprobe.cof
20.Boot Loader
a> MBR是整个硬盘的第一个sector,其大小不会超过512bytes;
Super Block,可以想像成每个分区partition的第一个扇区first sector。
b> Boot Loader可以指定核心文件来开机,也可以指定某个super block当中boot loader接管开机的核心载入。
c> linux 可以选择将boot loader安装在MBR或者是super block当中,但windows系统则几乎默认会同时安装在MBR与Super block当中。
d> 在安装多重系统时,最好先安装windows后安装linux,因为先安装linux,然后再安装windows,则windows会强制将MBR的boot loader覆盖掉,这样,就无法用windows的boot loader来启动linux了。
21.Boot Loader--Grub:
(1)Grub的优点:
grub是较新的boot loader,它的优点很多,包括:
a> 认识与支持较多的filesystem,并且可以使用grub的主程序直接在filesystem当中搜寻核心;
b> 开机的时候,可以‘自行编辑与修改开机设定项目’,类似bash的指令模式;
c> 可以动态搜寻设定文件,而不需要在修改设定文件后重新安装grub。亦即我们只需修改/boo/grub/menu.lst的设定,下次开机就生效了。
(2)Grub的设定文件: /boot/grub/menu.lst
(3)Grub中硬盘的表示:
grub中的硬盘表示,有点类似
(hd0,0)
第一个搜索到的硬盘,代号为(hd0),该硬盘的第一个分区为(hd0,0)
22.Boot Loader --LILO:
(1) LILO的设定文件为:/etc/lilo.conf
(2) 与Grub的设定文件/boot/grub/menu.lst同样分为两部分:
a> 整体环境设定
b> 每个开机设定