1、linux系统启动流程详解
2、grub配置使用详解
3、linux启动流程及过程演示
4、bash编程之函数
一、linux系统启动流程详解
1、kernel的功能:进程管理、文件系统、硬件驱动、内存管理、安全功能:SELinux、网络子系统
内核设计流派:单内核体系:Linux支持模块化、模块还可以动态装载或卸载
Linux内核:核心 + 外围模块
核心:/boot/vmlinux-VERSION-release
模块:/lib/modules/VERSION-release
.ko: kernel object
ramdisk: /boot/initramfs-VERSION-release.img
在内核启动过程中装载根文件系统时有用;
微内核体系:Windows、Solaris
2、Linux系统启动流程:X86(PC)
(1)POST:加电自检、ROM+RAM、ROM:CMOS (BIOS)、RAM:、EFI()
引导次序:按次序找引导设备,第一个有引导程序的设备即为启动PC server所用到的设备;
1st boot:
2nd boot:
3rd boot:
(2)MBR:Master Boot Record 在第一个扇区共512bytes(446: bootloader、64:分区表、2: 5A)
由于MBR较小,故在bootloader上存放了启动内核的部分代码来引导GRUB.
(3)bootloader: 选择要启动的内核(在当前磁盘的某或某些分区上)
LILO: LInux LOader:0-1023范围内的柱面构成的分区的内核文件
GRUB: GRand Unified Bootloader(CentOS 5\6:Grub 0.97、 CentOS 7:Grub2 1.96)
(4)kernel:自身初始化\探测所有能识别的硬件\装载驱动程序\只读方式装载根文件系(rootfs)
(5)init /sbin/init
CentOS 5: SysV, init
CentOS 6: upstart, init
CentOS 7: systemd, init
CentOS 5 SysV, init, /etc/inittab --> /etc/rc.d/rc.sysinit
CentOS 6 Upstart, /etc/init/*.conf (/etc/inittab)--> /etc/rc.d/rc.sysinit
chkconfig
CentOS 7 Systemd, /usr/lib/systemd/system/
CentOS 5: init
kernel ==> /sbin/init (/etc/inittab)
(6)run-level设定系统默认运行级别
0-6: 7个级别
0:关机
1: single user mode, s, S, single
2: multi user mode, 不支持NFS功能
3:完全多用户模式,文本接口
4:未使用,预留级别
5:完全多用户械,图形接口
6: 重启
切换级别:init #
进一步初始化系统
/etc/rc.d/rc.sysinit
启动指定的默认级别的默认为启动的服务,停止指定的级别下默认为关闭的服务;
/etc/rc.d/rc#.d
S##: 启动的服务
K##:停止的服务
##:01-99,数字越小,越优先启动或关闭;
脚本如果期望能够被chkconfig命令使用,要在脚本中添加如下行
# chkconfig: - 85 15
-:当此脚本由chkconfig控制时,默认哪些级别就是开启的,
85:启动优先级
15: 关闭优先级
# chkconfig --add SRV_SCRIPT
# chkconfig --del SRV_SCRIPT
# chkconfig SRV_SCRIPT {on|off}
默认为2345级别;
--level ######
/etc/rc.d/rc.local (/etc/rc.local): 是一个脚本,通常为系统启动完成的最后运行一个脚本;
定义一些组合键的功能:通常是Ctrl+Alt+Delete
初始化字符终端
如果有需要,启动图形终端
二、GRUB配置文件详解:
centos 5:/etc/inittab 每行定义一种action和对应的程序:
id:runlevels:action:process
如:si::sysinit:/etc/rc.d/rc.sysinit
si表示ID号, runlevel省律表示所有级别,
sysinit表示系统初始脚本/etc/rc.d/rc.sysinit:表示打算系统初始化执行什么脚本
CentOS 6: /etc/inittab
由/etc/init/*.conf 一类的配置文件定义init的初始化动作
由upstart调用,程序为/sbin/init
/etc/rc.d/rc.sysinit: 系统初始化脚本
设定主机名:读取/etc/sysconfig/network文件中的HOSTNAME参数,并以之设定主机名
打印文本欢迎信息
激活SELinux和udev
挂载/etc/fstab文件中定义的其它文件系统
激活swap
检测根文件系统,并以读写方式重新挂载;
设置系统时钟
根据/etc/sysctl.conf设置内核参数
激活LVM和RAID设备;
加载额外设备的驱动程序;
清理操作
初始化流程:POST --> (BIOS)boot sequence --> MBR(bootloader) --> kernel + ramdisk(initrd, initramfs) --> mount rootfs (ro) --> /sbin/init (CentOS 5: /etc/inittab, CentOS6 /etc/init/*.conf)
设定默认运行级别 --> 使用/etc/rc.d/rc.sysinit初始化系统 --> 分别启动并关闭指定服务 --> Ctrl+Alt+Delete组合键 --> 启动字符终端 --> 启动图形终端
GRUB: GRand Unified Bootloader
grub程序由两段组成:
stage1: MBR (0柱面 0磁道 1扇区)
stage1_5: MBR随后的扇区
stage2: 读取grub.conf配置文件,并实现引导功能的扩展
grub的功能:
1、提供菜单,并提供交互式接口
e: 进入编辑模式
2、选择要启动的内核或系统
允许传递引导参数给内核
选择界面可隐藏
3、为编辑功能提供保护机制
启用内核文件:
选择运行指定的内核得先输入密码
传递参数:
使用e命令得先输入密码
grub命令行接口:
root:指定哪个分区为接下来要启动的系统或内核文件所在的分区
root (DEVICE)
所有硬盘都识别为hd
不同的硬盘基于数字标识:如hd0, hd1等
同一个硬盘上的不同分区,也使用数字标识,如hd0,0 hd1,5
root (hd0,0)
find (DEVICE)/path/to/file 用于查看kernel的位子
kernel: 指定要运行的内核文件
initrd: 为要运行的内核指定其可用的ramdisk文件
boot: 启动此前配置好的内核或系统
grub.conf:参数:
default=: 选择第几个title配置的内核或系统,各title从0开始编号
timeout=#: 菜单显示的超时时长;
splashimage=/path/to/some_image_file:指定菜单的背景图片;
此图片只能为14bits色,xpm格式,gzip压缩;
hiddenmenu: 隐藏菜单
title TILTE STRING:显示于菜单中的标题
root
kernel
initrd
grub保护机制:
1、生成密码:
# grub-md5-crypt
2、保护编辑功能,则需要title之外的添加
password --md5 密码串
3、保护使用某内核,则需要内核对应的title之下添加
password --md5 密码串
安装grub的方式:
1、使用grub-install命令
# grub-install [--root-directory=/path/to/somewhere] DEVICE
--root-directory=/path/to/somewhere
/path/to/somewhere:内核及initrd文件所在的分区的挂载点的父目录且此挂载点必须叫boot
例如:/dev/sdb1: /mnt/boot
# grub-install --root-directory=/mnt /dev/sdb