-
基本概念
1.1 CMOS & BIOS
CMOS: 记录各项硬件参数,且嵌入主板的存储器
BIOS:写入主板上的一个内置程序,计算机运行的第一个程序
MBR: -
启动流程
2.1 启动流程:BIOS–>MBR–>-->boot loader–>核心文件
- 加载BIOS,硬件自检,读取配置获得第一个启动设备
- 读取并执行第一个启动设备内MBR的Boot Loader(grub等)
- 根据boot loader配置加载kernel,kernel检测硬件并加载驱动
- kernel调用init进程,init取得run-level信息
- init运行/etc/rc.d/rc.sysint,准备软件运行环境(网络,时区)
- init运行run-level对应的各个服务启动
- init运行/etc/rc.d/rc.local(开机启动的程序)
- init运行终端模拟程序mingetty来启动login程序,等待用户登录
2.2 Boot loader
安装在启动设备的第一个扇区内(sector),即MBR(Master Boot Record)。BIOS通过硬件的INT 13中断功能来读取MBR
Boot loader: 提供菜单、加载核心、转交控制权给其他loader
- 提供菜单: 使用着可选择不同的启动项目,多重系统有用
- 加载核心文件:直接指向可启动程序区来开始操作系统
- 转交其他boot loader:将启动管理移交其他boot loader
Boot loader可以安装的地点有两个,分别是 MBR 与 boot sector
多操作系统,先装Windows,后Linux的原因: Windows的loader默认不支持控制权转交功能
2.3 加载Kernel
boot loader读取kernel文件,并将其压缩到主内存中,此时kernel开始测试和驱动周边设备(硬盘,CPU,网卡等)
kernel会以自己的功能重新侦测一次硬件,不一定适应BIOS侦测到的硬件信息,此时kernel接管BIOS后续工作
kernel文件位置:
ls --format=single-column /boot
initrd-2.6.16.60-0.42.54.1-smp --> 虚拟文件系统
vmlinuz-2.6.16.60-0.42.54.1-smp --> kernel文件
/lib/modules: 动态核心模块(即驱动程序):/lib和/必须在同一个分区,因此系统启动时,必须挂载根分区,以便核心模块加载驱动程序。模块参数配置/etc/modprobe.conf
/boot/initrd: 虚拟文件系统(Initial RAM Disk): 它能够通过boot loader加载到内存中,该文件被解压到内存中模拟成一个根目录,此模拟在内存中的文件系统能够提供一个可运行的程序,通过该程序加载启动中需要的核心模块
boot loader加载kernel和initrd,然后在内存中让initrd解压成为根目录,kernel以此加载适当的驱动程序,最终释放虚拟文件系统,并挂载实际根目录文件系统
2.4 分析initrd文件:
mkdir -p /tmp/initrd
cp /boot/initrd-2.6.16.60-0.42.54.1-smp /tmp/initrd
cd /tmp/initrd
mv initrd-2.6.16.60-0.42.54.1-smp initrd-2.6.16.60-0.42.54.1-smp.gz
gzip -d initrd-2.6.16.60-0.42.54.1-smp.gz
file initrd-2.6.16.60-0.42.54.1-smp # ASCII cpio archive
cpio -ivcdu initrd-2.6.16.60-0.42.54.1-smp # 根目录,包含/lib, /dev等
没有initrd能否启动?
不一定。
需要initrd最重要的原因是,启动无法挂载根目录,例如根目录上有特殊存储设备,U盘,SCSI,SATA,RAID,LVM等
如果Linux安装在IDE磁盘上,并且使用ext2/ext3文件系统,不需要initrd也能正常启动系统
2.5 系统运行的第一个程序
程序名:/sbin/init
PID: 1
配置:/etc/inittab
2.6 运行级别run-level
0: halt
1: single user mode
2: multi-user, without NFS
3: full multi-user mode
4: unused
5: X11
6: reboot
系统初始化:
/etc/rc.d/rc.sysinit (CentOS)
/etc/rc.d/boot (Suse ?)
启动系统服务:/etc/rc.d/rc N
启动配置文件: /etc/sysconfig
run-level 5运行实例:
/etc/rc.d/rc 5
/etc/rc.d/rc5.d/K??* stop
/etc/rc.d/rc5.d/S??* start
??为顺序数字,K和S的值相反
K21mytest -> …/mytest
S01mytest -> …/mytest
stand alone服务启动目录/etc/init.d
chkconfig 会创建上面的symbolic link
用户自定义的启动程序:/etc/rc.d/rc.local
2.7 /etc/sysconfig配置目录
authconfig: 身份认证,/etc/shadow密文加密算法等
clock: 时区 ZONE=“Asia/Shanghai”,cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
network: 主机名&网关
network.script/: 网卡配置
2.8 切换运行级别
runlevel
init 3
init 0 -> shutdown
init 6 -> reboot
2.9 核心与核心模块
kernel: /boot/vmlinuz
kernel解压所需RAM Disk: /boot/initrd
核心模块: /lib/modules/$(uname -r)/kernel
核心源码: /usr/src/linux或/usr/src/kernel
kernel版本信息: cat /proc/version
系统kernel参数: cd /proc/sys/kernel
kernel加载的module: lsmod
module相信信息:modinfo ext3
增加module: modprobe ext3
删除module:modprobe -r ext3
lsmod | grep vfat
modprobe vfat
lsmod | grep vfat
modprobe -r vfat
- Grub
3.1 boot loader的两个stage:
stage 1:运行boot loader主程序。该主程序被安装在启动区,即MBR或boot sector,因为MBR太小,仅安装boot loader最小程序,不包括配置
stage 2: 主程序加载配置文件(/boot)
3.2 grub配置:/etc/grub/menu.lst
硬盘和分区在grub中的代号:
root (hd0,0) 第一块磁盘的第一个分区
系统仅一块SATA硬盘,该磁盘的第一个逻辑分区在Linux和grub中的代号是什么?
第一块SATA磁盘,第一个逻辑分区,在Linux系统中的代号为/dev/sda5,在grub中的代号为(hd0,4)