Linux学习笔记(boot)

简述:
  1. 硬件主动读取BIOS. BIOS会检测硬件并做自我测试.
  2. BIOS根据配置获取第一个可以启动的装置, 并读取运行第一个气动装置内MBR的boot loader(即grub)
  3. bootloader会把kernel解压并加载到内存中. kernel会检测硬件并安装驱动程序.
  4. 硬件驱动成功之后, kernel主动call init进程, init会获取run level
  5. init运行/etc/rc.d/rc.sysinit文件准备软件运行的作业环境(网络/时区等)
  6. init将run level的各个服务启动
  7. init运行/etc/rc.d/rc.local文件
  8. init运行终端模拟程序mingetty来启动login进程, 然后等待用户登陆.
    BIOS:
  • BIOS启动后, 会加载CMOS, 然后获取硬件配置. 例如: 硬盘的大小和类型, 系统时间, CPU与各硬件的沟通时脉等.
  • 然后进行自我检测(POST), 并配置PnP(plug and play), 再定义出可启动的装置顺序.
  • 开始启动装置的数据读取.
    MBR:
  • master boot record: 在可启动装置的第一个磁区.
  • BIOS是通过硬件的INT 13中断功能来读取MBR的. 也就是说只要BIOS能侦测到你的硬件, 就有办法通过INT13来读取硬件的MBR.
    bootloader:
  • 核心功能:
    • 提供菜单选择界面
    • 加载kernel
    • 转交给其他loader(MBR里的loader有可能转交给boot sector里的loader, 或直接启动linux)
  • 操作系统决定将bootloader装到MBR还是boot sector. windows两个地方都会装, windows的boot loader不具备转交功能.
  • 现在的boot loader都是用grub,grub的配置文件:/etc/grub/menu.lst
    加载kernel与initrd功能
  • bootloader会把kernel加载到内存中, 然后kernel会再次检测各个硬件并加载各个硬件的驱动, 包括存储设备/CPU/网卡/声卡等.
  • kernel的存放地址: /boot/vmlinuz-$version(/boot在硬盘中, 建议单独分区)
  • kernel动态加载kernel module, 后者放在/lib/molules/. /lib/不能在不同分区下, 启动过程中kernel必须挂载根目录, 否则会无法加载模块. 系统启动过程中根目录是只读模式
  • 如果kernel不能识别挂载根目录的文件系统, 就会用到initrd(init ram disk). 是一种伪文件系统, 实际上加载在内存中. 它也能被bootloader加载到内存中, 并解压然后在内存中模拟一个根目录, 用来加载启动过程中最需要的模块, 通常是文件系统和磁碟介面的驱动.
  • 加载完成后会call/sbin/init开始后续启动流程.
    init以及/etc/inittab配置文件与run level
  • /sbin/init是为软件运行准备环境. 包括分配主机名/网络配置/语系处理/文件系统格式以及其他服务.
  • runlevel分七个等级:

    • 0 - halt(系统直接关机)
    • 1 - single user mode(单人维护模式)
    • 2 - multi-user without nfs
    • 3 - full multi-user mode
    • 4 - unused(系统保留功能)
    • 5 - X11(与level3类似, 但加载使用X window)
    • 6 - reboot
  • runlevel通过/etc/inittab来获取

  • /etc/inittab内容:

    • 默认runlevel配置
    • 准备系统软件运行环境的脚本(/etc/rc.d/rc.sysinit)
    • 7个不同level所要启动服务的脚本放置路径
    • 是否允许ctrlaltdel重新启动
    • 不断电系统(UPS)的相关配置
    • 默认启动的tty(respawn方式, 即关掉后会被立即重启)
    • xwindow的启动相关
  • /etc/rc.d/rc.sysinit:

    • 通过读取/etc/sysconfig/network获取网络环境配置以及主机名称
    • 测试并且挂载内存装置/proc/sys.
    • 决定是否启动SELinux
    • 启动系统的RANDOM程序. 后者可以帮助系统进行密码加密.
    • 配备terminal的字体
    • 配置欢迎页面
    • 配置系统时间和时区
    • 根据kernel在启动时的检测结果检测网络/ide/scsi/音效等设备
    • 使用者自定义模块的加载. 使用者可以在/etc/sysconfig/modules/*.modules加入自定义的模块.
    • 加载kernel的相关配置. (/etc/sysctl.conf)
    • 重新以可读可写方式挂载各目录.
    • 启动quota功能
    • 清楚启动过程产生的缓存文件
    • 将启动相关操作记录在/var/log/dmesg里.
  • /etc/rc.d/rc n/etc/sysconfig

    • /etc/rc.d/rc $n: 启动runlevel为n的各项服务
      • 找到/etc/rc$n.d/K*,并进行stop动作.
      • 找到/etc/rc$n.d/S*, 并进行start动作.
      • /etc/rc$n.d/K*/etc/rc$n.d/S*都是一些连接, 指向standalone的/etc/init.d/*的各个shell脚本
      • chkconfig就是对这些shell脚本的控制
      • K和S后面的数字代表被执行的顺序, 最后一个是/etc/init.d/rc.local
      • 这个脚本可以执行用户自定义的一些行为, 如发email等.
    • /etc/sysconfig/存放这/etc/rc.d/sysinit/etc/rc.d/rc n的配置文件
      • authconfig
      • clock
      • i18n
      • keyboard & mouse
      • network
  • run level

    • 查看: runlevel
    • 修改: init $n
      • 会关闭多出来的/etc/rc$n.d/K*脚本
      • 会启动多出来的/etc/rc$n.d/S*脚本
  • kernel and kernel module

    • kernel源码存放位置/usr/src/kernels
    • kernel版本:/proc/version
    • kernel module存放的位置:/lib/modules/`uname -r`/kernel
    • 如果有本地module需要加直接copy到上述目录, 然后depmod添加依赖关系
    • lsmod: 列出所有module,并显示依赖关系。
    • module文件都以.ko结尾。
    • 查看module的详细信息:modinfo
    • 安装与删除module
      • insmod& rmmod:只是安装卸载,不解决模块依赖性, 并且需要完整的文件名。
      • modprobe & modprobe -r: 推荐使用, 解决依赖性,并不需要完整的文件名
    • /etc/modprobe.conf: 模块一些额外配置,比如网卡对各个网络的I/O和IRQ设置
  • initrd:
    • 需要initrd的情况:
      • 根目录挂载在特殊硬件上: 例如U盘等
      • 特殊的文件系统
      • 其他必须要在核心加载时提供的模块
    • mkinitrd来创建initrd