Linux 的开机流程

  1. 载入 BIOS 的硬件信息与进行自我测试,并依据设置取得第一个可开机的设备;
  2. 读取并执行第一个开机设备内 MBR 的 boot Loader (亦即是 grub2, spfdisk 等程序);
  3. 依据 boot loader 的设置载入 Kernel ,Kernel 会开始侦测硬件与载入驱动程序;
  4. 在硬件驱动成功后,Kernel 会主动调用 systemd 程序,并以 default.target 流程开机;
  • systemd 执行 sysinit.target 初始化系统及 basic.target 准备操作系统;
  • systemd 启动 multi-user.target 下的本机与服务器服务;
  • systemd 执行 multi-user.target 下的 /etc/rc.d/rc.local 文件;
  • systemd 执行 multi-user.target 下的 getty.target 及登陆服务;
  • systemd 执行 graphical 需要的服务。

一、核心与核心模块

在整个开机的过程当中,是否能够成功的驱动我们 主机的硬件配备, 是核心 (kernel) 的工作。

另外,为了应付日新月异的硬件,目前的核心都是具有“可读取模块化驱动程序”的功能, 亦 即是所谓的“ modules (模块化)”的功能。

1、核心模块与相依性

基本上, 核心模块的放置处是在 /lib/modules/$(uname -r)/kernel 当中,里面主要还分成几个目录:

arch :与硬件平台有关的项目,例如 CPU 的等级等等;

crypto :核心所支持的加密的技术,例如 md5 或者是 des 等等;

drivers :一些硬件的驱动程序,例如显卡、网卡、PCI 相关硬件等等;

fs :核心所支持的 filesystems ,例如 vfat, reiserfs, nfs 等等;

lib :一些函数库;

net :与网络有关的各项协定数据,还有防火墙模块 (net/ipv4/netfilter/*) 等等;

sound :与音效有关的各项模块;

语法格式:depmod [-Ane]

选项与参数: -A :不加任何参数时, depmod 会主动的去分析目前核心的模块,并且重新写入 /lib/modules/$(uname -r)/modules.dep 当中。若加入 -A 参数时,则 depmod 会去搜寻比 modules.dep 内还要新的模块,如果真找到新模块,才会更新。

-n :不写入 modules.dep ,而是将结果输出到屏幕上(standard out);

-e :显示出目前已载入的不可执行的模块名称

2、核心模块的观察

查询模块信息:语法格式:modinfo [-adln] [module_name|filename]

选项与参数:

-a :仅列出作者名称;

-d :仅列出该 modules 的说明 (description);

-l :仅列出授权 (license);

-n :仅列出该模块的详细路径。

这个 modinfo 除了可以“查阅在核心内的模块”之外,还可以检查“某个模块文件”。

3、核心模块的载入和移除

我想要自行手动载入模块,最简单而且建议的, 是使用 modprobe 这个指令来载入模块, 这是因为 modprobe 会主动的去搜寻 modules.dep 的内容,先克服了模块的相依性后, 才决定需要载入的模块有哪些,很方便。至于 insmod 则完全由使用者自行载入一个完整文件名的模块, 并不会主动的分析模块相依性

eg1:请尝试载入 cifs.ko 这个“文件系统”模块

移除语法:rmmod [-fw] module_name

选项与参数:

-f :强制将该模块移除掉,不论是否正被使用;

eg1:将刚刚载入的 fat 模块移除

使用 insmod 与 rmmod 的问题就是,你必须要自行找到模块的完整文件名才行, 万一模块有相依属性的问题时,你将无法直接载入或移除该模块。

所以,近年来建议直接使用 modprobe 来处理模块载入。

语法格式:modprobe [-cfr] module_name

选项与参数:

-c :列出目前系统所有的模块!(更详细的代号对应表)

-f :强制载入该模块;

-r :类似 rmmod ,就是移除某个模块

eg1:载入移除 vfat 模块

二、Boot Loader: Grub2

boot loader 是载入核心的重要工具!没有 boot loader 的话,那么 kernel 根本就没有 办法被系统载入的。然后再讲一讲现阶段 Linux 里头最主流的 grub2 这个 boot loader。

1、boot loader 的两个 stage。

我们的 loader 功能 这么强,光是程序码与设置数据不可能只占这么一点点的容量吧?那如何安装? 为了解决这个问题,所以 Linux 将 boot loader 的程序码执行与设置值载入分成两个阶段:

  • Stage 1:执行 boot loader 主程序: 第一阶段为执行 boot loader 的主程序,这个主程序必须要被安装在开机区,亦即是 MBR 或者是 boot sector 。但因为 MBR 实在太小了,所以,MBR 或 boot sector 通常仅安装 boot loader 的最小主程序, 并没有安装 loader 的相关配置文件;
  • Stage 2:主程序载入配置文件: 第二阶段为通过 boot loader 载入所有配置文件与相关的环境参数文件 (包括文件系统定义与主要配置文件 grub.cfg), 一般来说,配置文件都在 /boot 下面。

这些与 grub2 有关的文件都放置到 /boot/grub2 中那我们 就来看看有哪些文件。

2、grub2 的配置文件 /boot/grub2/grub.cfg 初探

grub2 的优点挺多的,包括有:

  • 认识与支持较多的文件系统,并且可以使用 grub2 的主程序直接在文件系统中搜寻核心文件名;
  • 开机的时候,可以“自行编辑与修改开机设置项目”,类似 bash 的指令模式;
  • 可以动态搜寻配置文件,而不需要在修改配置文件后重新安装 grub2 。亦即是我们只要 修改完 /boot/grub2/grub.cfg 里头的设置后,下次开机就生效了!

上面第三点其实就是 Stage 1, Stage 2 分别安装在 MBR (主程序) 与文件系统当中 (配置 文件与定义文件) 的原因。

磁盘与分区在 grub2 中的代号

  • 硬盘代号以小括号 ( ) 包起来;
  • 硬盘以 hd 表示,后面会接一组数字;
  • 以“搜寻顺序”做为硬盘的编号!(这个重要!)
  • 第一个搜寻到的硬盘为 0 号,第二个为 1 号,以此类推;
  • 每颗硬盘的第一个 partition 代号为 1 ,依序类推。

3、grub2 配置文件维护 、/etc/default/grub 与 /etc/grub.d

grub2 的主配置文件 grub.cfg 约略的内容,但是因为该文件的内容 太过复杂,数据量非常庞大,grub2 官方说明不建议我们手动修改! 而是应该要通过 /etc/default/grub 这个主要环境配置文件与 /etc/grub.d/ 目录内的相关配置文件来处理比较妥当。

  • /etc/default/grub 主要环境配置文件

eg1:假设你需要 (1)开机菜单等待 40 秒钟、 (2)默认用第一个菜单开机、 (3)菜单请 显示出来不要隐藏、 (4)核心外带“elevator=deadline”的参数值, 那应该要如何处理 grub.cfg 呢?答:直接编辑主要环境配置文件后,再以 grub2-mkconfig 来重建 grub.cfg 。

  • 菜单创建的脚本 /etc/grub.d/*

4、initramfs 的重要性与创建新 initramfs 文件

需要 initramfs 的时刻为:

  • 根目录所在磁盘为 SATA、USB 或 SCSI 等连接接口;
  • 根目录所在文件系统为 LVM, RAID 等特殊格式;
  • 根目录所在文件系统为非传统 Linux 认识的文件系统时;
  • 其他必须要在核心载入时提供的模块。

你有特殊需要所以想重制 initramfs 文件的话, 可以使用 dracut / mkinitrd 来处理的

语法格式:dracut [-fv] [--add-drivers 列表] initramfs文件名 核心版本

选项与参数:

-f :强迫编译出 initramfs ,如果 initramfs 文件已经存在,则覆盖掉旧文件

-f :显示 dracut 的运行过程

--add-drivers 列表:在原本的默认核心模块中,增加某些你想要的模块!模块位于核心所在目录 /lib/modules/$(uname -r)/kernel/*

initramfs文件名 :就是你需要的文件名!开头最好就是 initramfs,后面接版本与功能 核心版本 :默认当然是目前运行中的核心版本,不过你也可以手动输入其他不同版本! 其实 dracut 还有很多功能,例如下面的几个参数也可以参考看看:

--modules :将 dracut 所提供的开机所需模块 (核心核模块) 载入,可用模块在下面的目录内 /usr/lib/dracut/modules.d/

--gzip|--bzip2|--xz:尝试使用哪一种压缩方式来进行 initramfs 压缩。默认使用 gzip 喔!

--filesystems :加入某些额外的文件系统支持!

eg1:以 dracut 的默认功能创建一个 initramfs 虚拟磁盘文件。

eg2:额外加入 e1000e 网卡驱动与 ext4/nfs 文件系统在新的 initramfs 内

三、开机过程的问题解决

1、忘记 root 密码

新版的 systemd 的管理机制中,默认的 rescue 模式是无法直接取得 root 权限的!还是得要使用 root 的密码才能够登陆 rescure 环境! 那怎办?没关系,通过一个名为“ rd.break ”的核心参数来处理即可。

(1)按下 systemctl reboot 来重新开机,(2)进入到开机画 面,在可以开机的菜单上按下 e 来进入编辑模式, 然后就在 linux16 的那个核心项目上面使 用这个参数来处理:

0

改完之后按下 [crtl]+x 开始开机,开机完成后屏幕会出现如下的类似画面,此时请注意,你应 该是在 RAM Disk 的环境,并不是原本的环境, 因此根目录下面的东西跟你原本的系统无关 喔!而且,你的系统应该会被挂载到 /sysroot 目录下

2、因文件系统错误而无法开机

如果因为设置错误导致无法开机时,要怎么办啊?这就更简单了!最容易出错的设置而导致 无法顺利开机的步骤,通常就是 /etc/fstab 这个文件了,尤其是使用者在实作 Quota/LVM/RAID 时,最容易写错参数, 又没有经过 mount -a 来测试挂载,就立刻直接重新 开机,真要命!无法开机成功怎么办?这种情况的问题大多如下面的画面所示:

看到最后两行,他说可以输入 root 的密码继续加以救援喔!那请输入 root 的密码来取得 bash 并以 mount -o remount,rw / 将根目录挂载成可读写后,继续处理吧!其实会造成上述画 面可能的原因除了 /etc/fstab 编辑错误之外,如果你曾经不正常关机后,也可能导致文件系统 不一致 (Inconsistent) 的情况, 也有可能会出现相同的问题啊!如果是扇区错乱的情况, 请看到上图中的第二行处, fsck 告知其实是 /dev/md0 出错, 此时你就应该要利用 fsck.ext3 去检测 /dev/md0 才是!等到系统发现错误,并且出现“clear [Y/N]”时,输入“ y ”吧。

当然啦,如果是 XFS 文件系统的话,可能就得要使用 xfs_repair 这个指令来处理。这个 fsck/xfs_repair 的过程可能会很长,而且如果你的 partition 上面的 filesystem 有过多的数据损 毁时,即使 fsck/xfs_repair 完成后,可能因为伤到系统盘,导致某些关键系统文件数据的损 毁,那么依旧是无法进入 Linux 的。此时,就好就是将系统当中的重要数据复制出来,然后 重新安装,并且检验一下,是否实体硬盘有损伤的现象才好!不过一般来说,不太可能会这 样。通常都是文件系统处理完毕后,就能够顺利再次进入 Linux 了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值