Bootlaoder:
BIOS 启动之后,把存在硬盘上的系统"搬到"内存中
<1>为内核传递参数,管理多个操作系统启动
<2> 查看硬件信息,设别分区,操作磁盘
<3> 加载操作系统,加载额外的模块
<4> 常见的两种, Grub(X86系统)和U-Boot(MIPS系统中)
Linux 系统启动的三个元素:
<1>Bootloader
<2>Kernel
(1)根文件系统
(2)initrd
<3>文件系统
UEI bios:可扩展固件接口, 用来做各种主板硬件识别,配置,管理的固件,以后可能把搬操作系统的活儿都缆过去(bootloader)
linux 最小系统制作和启动
1 dd 制作一个磁盘
dd if=/dev/zero of=disk ibs=4096 count=4096
2 磁盘上创建文件系统
mkfs.ext4 disk
3 创建的磁盘文件挂载到目录
mkdir mnt
mount disk mnt/
4 创建文件系统的一些目录
mkdir sbin bin etc var root
5 卸载文件系统
umount mnt
dd if=disk bs=1k | gzip -v9 > rootfs.gz
mount osImage
fdisk /dev/loop1
mkfs /dev/loop1
6 安装 Bootloader
grub-install /dev/loop1
# 拷贝 bzImage (arch/x86/boot/下) 到/boot, 再生成initrd
# 启动时,指定 Grub 和initrd, 传递适当的参数 boot
安装grub
truncate -s32M rootfs
fdisk roots
grub-install rootfs
inintrd 文件系统
cd /boot/
mkdir initrd_fs
cp initrd.img-4.4.0-57-generic initrd_fs/initrd.gz
cd initrd_fs
gunzip initrd.gz
lsinitrtamfs 命令来查看 initrd里面内容
内核启动过程 (initrd 第一个程序/init)
<1> 建立 sysroot根目录,挂载真实的文件系统
<2> 设置命令的环境变量
<3> mount proc 文件系统到 /proc, Linux 内核动态状态的一个表现和设置入口
<4> mount sysfs 到/sys , Linux 内核资源有组织的表现和设置入口
<5> mount devtmps 到 /dev, 临时表征当时设备节点的文件系统,加速系统启动(/dev目录对当前用户程序运行置关重要)
<6> 准备/dev 目录一些节点 ( stdin, stdout, stderr, 等fd)fd 文件描述符
<7> 为内核输入额外参数的机会
<8> 解析内核启动参数并执行( udev 开始之前执行一些准备 )
<9> 启动 systemd-udevd, 配置其要响应的行为
<10> 循环处理$hookdir/initqueue下任务
<11> mount 根文件系统
<12> 找到根文件系统的init 程序
<13> 停止 systemd-udevd 服务程序
<14> 一些清理操作
<15> 切换到根文件系统的init程序 启动完成
EFI启动桩
EFI 强大的功能,将来可能会吞并 Bootloader
init之后 启动管理程序
开始初始化整个系统的应用程序或者服务器------》 linuxrc 脚本
常用的Linux 启动脚本:
/initxrc
/etc/rcS
/etc/rc.local
/etc/profile
systemd 启动管理系统
rcN.d 目录( 不同的一套完整的所有系统启动服务 ) rc1.d rc2.d ...rc6.d
网络服务
一个超级进程监控全部端口: 哪个端口有数据就启动哪个, xinetd 守护进程
/etc/ininttab 存放 runlevel 等级
runlevel 0 关机
runlevel 1 单用户无图行
runlevel 3 多用户无图形
runlevel 5 多用户有图形
runlevel 6 重新启动
读取完成执行对应的启动目录 如 /etc/rc3.d
init 同步顺序启动效率低下, upstat实现异步事件驱动的启动模式
systemd
起源于 Tizen Linux 系统
传统init 开机启动进程是顺序的,systemd 将启动尽可能的并行化,形成了程序集
systemd 调度执行取代 cron
systemd device hotplugging 取代udev
systemd 封装 Domain Socket 和 D-Bus
systemd 用统一的原语实现了几乎整个 linux 系统服务
systemd 进程是系统第一个启动进程,也是最后一个结束进程,用户端进程根进程
systemd 定义了整套脚本语义
systemd是守护进程
systemctl 定义服务和行为
system-analyze 分析启动效率
systemd 用内核的 cgroup接口开发
systemd 重要服务:
consoled: 取代传统的虚拟终端
journald: 取代 syslog, syslog-ng, rsyslog
logind: 取代传统用户登陆服务
networkd:取代传统网络配置( network manager)
timedated:所有于时间有关的操作
udevd: udev 代码被 systemd 完成吸收合并
linux 内核启动顺序:
1 内核加载到内存
2 内核移动到指定内存位置
3 开始检查CPU ID, machine ID
4 初始化页表
5 设置C语言代码运行环境
6 内核第一个C函数 startkernel
7 大内核锁锁住内核
8 初始化页表,MMU,中断,内存区域,计时器,Slab,VFS等
9 跳到init 内核进程
10 内核端init进程自身替换为用户端的init进程