系统启动时,首先加载BIOS,通过BOIS读取COMS的硬件信息,进行自我检测,取得第一个可启动的设备(多个根据设置有关)。

读取并执行设备内的MBR启动引导程序,引导程序调用boot sector中的boot loader,通过boot loader加载Kernel调用systemd程序,并以default.target流程启动。

BOIS通过INT13中断功能读取MBR记录的引导程序,BootLoader可以让用户选择不同的启动选项,指向内核,或转交其它的loader。

在Windows安装完毕后安装的Linux使用Linux的MBR引导程序(grub2)。之后通过grub2引导到不同的BootLoader。

通过boot loader加载Kernel后,将内核文件解压到内存中,重新检测硬件设备信息。

内核文件在/boot/vmlinuz中,可以通过动态加载内核模块。内核模块存放在/lib/modules/目录下。启动过程中跟目录为只读方式挂载。

虚拟文件系统(Initial RAM Disk)一般使用的文件名为:/boot/initrd或/boot/initramfs。它加载到内存中,解压模拟成根目录,内核借此加载适当的驱动程序,最终释放虚拟文件系统。

通过lsinitrd命令显示initramfs的内容。initramfs这个小型的根目录,内核检测到后,使用initrd.target来启动,最后读入一批*.target,让系统顺利运行。

最终,卸载initramfs文件系统,挂载实际根目录,完成内核的完整加载,主机开始正确运行,之后内核调用程序systemd(PID:1)。

systemd默认启动的服务集合为default.target。可以作为default.target的项目有图形.target,命令行.target等,和SystemV对应。

取得了/etc/systemd/system/default.target后,链接到/usr/lib/systemd/system下的multi-user.targetgraphical.target之一,然后在

/etc/systemd/system/对应的.target.wants/加载用户设置的unit(service),在/usr/lib/systemd/system/对应的.target.wants/加载系统默认的unit。

systemctl list-dependencies sysinit.target,可以看到sysinit.target阶段的工作让系统可以读写,并可加载用户自定义模块,而basic.target让系统成为操作系统的基础。

之后的multi-user.target可以提供主机服务,网络服务等,在相应的两个文件夹的want中存在对应的unit功能。

新版的Linux执行自定义的额外程序写入到/etc/systemd/system下面,但保留了旧版/etc/rc.d/rc.local写入到该文件的自定义功能。

但需要启动该服务,并加入执行权限,可以在defaul.target下找到对应的依赖关系。

通过ll /usr/lib/systemd/system/runlevel*.target,可以找到运行级别的对应关系,调用过程使用init命令或systemctl isolate命令。

通过cat multi-user.target类命令查看相应的依赖项等。通过systemctl list-dependencies graphical.target查看对应的依赖关系。

根据sysinit.target的自定义模块,有两处:

 /etc/modules-load.d/*.conf单纯要内核加载的模块位置

/etc/modprobe.d/*.conf可以加上模块参数的位置

如在第一个位置建立文件,加入防火墙模块。在第二个位置加入五年级,建立合适的防火墙端口号。通过lsmod查看模块状态。

Systemd兼容SystemV,所以会读取/etc/sysconfig/*下的其他文件,如authconfig鉴权,cpupower操作cpu,firewalld防火墙等。

内核和内核模块的位置:

/lib/modules/$(uname -r)/modules.dep记录了内核支持模块的各项依赖性。

做好一个驱动程序.ko后放入位置,通过depmod命令,重新建立依赖性。lsmod查看模块,modinfo列出模块的相关信息。

insmod加载模块,rmmod删除模块。但二者无法解决模块依赖属性的问题。

通过modprobe加载模块,通过modprobe -v删除模块可以解决。

boot loader执行分两个步骤,执行主程序(在MBR启动扇区(GPT兼容)),执行加载配置文件(在/boot下)。

配置文件中/boot/grub2/grub.cfg为主配置文件。

grub2的主程序直接在文件系统中查找内核文件,自行编辑和修改启动设置,动态配置文件,修改grub.cfg后下次在步骤二中生效。

 grub2的标识硬盘方式为:用(),硬盘hd以查找顺序标记,0开始。区号标记以1开始,区分硬盘格式加入说明。如:(hd0,msdos1)

msdos为MBR,gpt为GPT分区形式。

grub.cfg文件强烈不建议修改。文件中,有设置启动选项(set default),预设的秒数(set timeout),

每一个选项的设置menuentry,设置了一些选项,和加载模块。set root设置grub2的配置文件根目录

在挂载过程中/先,/boot后,所以挂载设置为:set root='hd0,gpt2',为boot。

 linux16 /vmlinuz-... root=/dev/mapper/centos-root ...为内核文件与执行内核所带的参数。

grub2配置文件/etc/default/grub与/etc/grub.d目录的修改,来更新grub.cfg。

其中/etc/default/grub倒数时间参数: GRUB_TIMEOUT,是否隐藏选项:GRUB_TIMEOUT_STYLE(menu, countdown, hidden)

信息终端输出模式:GRUB_TERMINAL_OUTPUT(console, serial,gfxterm, vga_text等),

默认启动选项:GRUB_DEFAULT(可使用menuentry顺序号,ID,saved等),

核心的外加参数功能:GRUB_CMDLINE_LINUX,如GRUB_CMDLINE_LINUX="..... crashkernel=auto rhgb quiet elevator=deadline"

创建完毕后,使用grub2-mkconfig命令来重建grub.cfg。(grub2-mkconfig -o /boot/grub2/grub.cfg)

选项创建的脚本。/etc/grub.d/*

有00_header,创建初始项目,10_linux找到内核并读取模块,参数。

30_os-prober找到其他分区可能含有的操作系统。40_custom其它自定义要的选项。

通过chainloader 的方式移交loader 控制权交给下一个boot sector 或MBR 内的boot loader 而已

initramfs将/lib/modules内的必要模块打包成文件,在主机调用INT13硬件中断时,将文件解压缩。

重制作该文件可以通过dracut命令和mkinitrd完成。如dracut -v initramfs-test.img $(uname -r)

;dracut -v --add-drivers "e1000e" --filesystems "ext4 nfs"  initramfs-new.img $(uname -r)

测试安装grub2。使用grub2-install

如:grub2-install --force --recheck --skip-fs-probe /dev/vda4

将主程序写到启动扇区vda4上(一般只支持写入到整个文件系统vda)

关于启动项默认的问题,翻书或自行解决.....偷个懒,这个..等用到再说吧!

在启动界面e,编辑进入恢复模式,在内核信息参数后加入systemd.unit=rescue.target,ctrl x进入。

为个别grub2的启动选项设置密码。设立管理员账号和普通账号。

如下示例:

在/etc/grub.d/*下建立01_users的文件,然后写入账户数据:

 set superusers="vbird" # 这里是设定系统管理员的账号名称为啥的意思!
password vbird abcd1234 # 当然要给予这个账号密码啊!
password dmtsai dcba4321 # 没有输入 superuses 的其他账号,当然就是判定为一般账号
#有必要使用密文,采用cat echo方式显示出来等。这里只是思路举例 set superusers="vbird" # 这里是设定系统管理员的账号名称为啥的意思!
password vbird abcd1234 # 当然要给予这个账号密码啊!
password dmtsai dcba4321 # 没有输入 superuses 的其他账号,当然就是判定为一般账号 menuentry "大家都可以选择我来开机喔!" --unrestricted {
set root=(hd0,)
chainloader +
}
menuentry "只有管理员的密码才有办法使用" --users "" {
set root=(hd0,)
chainloader +
}
menuentry "只有管理员与 dmtsai 才有办法使用喔!" --users dmtsai {
set root=(hd0,)
chainloader +
}

/etc/grub.d/10_linux检测两个启动选项,/etc/grub.d/40_custom启动自定义的选项(上面代码后部分)

 忘记root密码时的恢复:使用rd.break。

在开机界面使用e,在linux16后加入rd.break启动。ctrl x。

进入后重新挂载,使能读写root。mount -o remount,rw /sysroot

切换挂载原先的根目录,取回环境:chroot /sysroot

修改密码:echo "your_root_new_pw" | passwd --stdin root

建立新文件:touch /.autorelabel #修复被取消的SELinux 安全本文的特性,否则无法启动

退出:exit,重启reboot

另一种修复被取消的SELinux 安全本文的特性的方案,先调整为宽容模式,然后再启动后恢复。

因文件系统错误无法启动,那么,按照提示输入,使用:mount -o remount,rw /。继续处理吧。修正/etc/fstab

xfs_repair等命令处理吧...

别人的Linux私房菜(20)启动流程、模块管理与Loader的更多相关文章

  1. 别人的Linux私房菜(17)进程管理与SELinux初探

    程序在磁盘中,通过用户的执行触发.触发事件时,加载到内存,系统将它定义成进程,给予进程PID,根据触发的用户和属性,给予PID合适的权限. PID和登陆者的UID/GID有关.父进程衍生出来的进程为子 ...

  2. 别人的Linux私房菜(3)主机规划与磁盘分区

    磁盘阵列:RAID.将数个硬盘整合成为在操作系统看来是一个硬盘. Linux对笔记本电脑的支持:https://www.linux-laptop.net/ 几乎所有硬件设备存放于/dev/目录. SC ...

  3. 别人的Linux私房菜(18)认识系统服务(daemon)

    完成服务service的程序称为daemon.完成计划性的服务程序如crond是一个daemon. 早期的System V的init管理daemon操作中,系统内核首先调用init,然后init运行系 ...

  4. 别人的Linux私房菜(8)Linux磁盘与文件系统管理

    虚拟机的磁盘通常为:/dev/vd[a-p] LVM和软件磁盘阵列 software RAID可以将一个分区格式化为多个文件系统或者多个分区格式化为一个文件系统. 索引式文件系统中:如ext2.ext ...

  5. 别人的Linux私房菜(19)认识与分析日志文件

    日志文件通常只有root可以读取,解决系统和网络方面的问题. /var/log/boot.log本次开机系统检测和启动硬件,和内核支持的相关功能的信息记录. /var/log/cron计划任务有没有被 ...

  6. 别人的Linux私房菜(15)磁盘配额与高级文件系统管理

    磁盘配额在网站.邮件.文件等服务器常见,主要有针对用户.用户组.限制某一目录的的最大磁盘配额. ext文件系统进能针对整个文件系统配额,xfs可以针对目录配额.配额和文件系统有关. 内核必须支持磁盘配 ...

  7. 别人的Linux私房菜(14)Linux账号管理和ACL权限设置

    用户标识符UID.GID 用户的账号信息,主要是指UID对应.组和GID对应 检查系统中是否存在用户bin:id bin 登录shell验证账号密码的步骤:找到/etc/passwd核对是否存在账号, ...

  8. 别人的Linux私房菜(13)学习Shell脚本

    CentOS6.x以前版本的系统服务启动接口在/etc/init.d/目录下,存放了脚本. Shell脚本因调用外部命令和bash 的一些默认工具,速度较慢,不适合处理大量运算. 执行方式有:直接命令 ...

  9. 别人的Linux私房菜(11)认识与学习BASH

    Linux下使用BASH   Bourne Again Shell        另外一种由用于Unix的伯克利大学的Bill Joy设计的C Shell 系统中合法的shell会写入到/etc/sh ...

随机推荐

  1. gridcontrol 根据某一列数据来控制其他列合并

    首先需要属性栏中设置这一列可以合并,再在CellMerge方法中写 private void gridView1_CellMerge(object sender, DevExpress.XtraGri ...

  2. SqlServer查询表名的备注(查询表名描述 MS_Description)

    查询表名描述 MS_Description ? 1 2 3 4 5 SELECT tbs.name 表名,ds.value 描述       FROM sys.extended_properties ...

  3. 从servlet规范说起

    servlet规范 1 servlet 3.1规范 1.1 What is servlet A servlet is a JavaTM technology-based Web component, ...

  4. python经典案例

    前言:初学者对python的流程语句有一定的了解,但是运用起来总会磕磕碰碰.本文总结了一些初学者在学习python时做的经典案例 一.名片管理系统(限单个名片) info = {'name':'jam ...

  5. MYSQL批量删除大量数据

    DELETE FROM '表' WHERE '字段'=1 会发现删除失败,因为lock wait timeout exceed的错误: 通过LIMIT参数分批删除,因为如果不用limit,删除大量数据 ...

  6. ASP.NET网站不能在VS中调试

    点击VS2010工具栏中绿色的小箭头运行网站没问题,按说运行后,应该处于正在运行状态,这个小箭头会变成灰色.但是没有变化,仍然是绿色的小箭头.所以设置断点根本没有截获.任务栏右下角显示的Develop ...

  7. 通过代码启动appium服务

    如果选择npm安装的最新版appium 1.8.0以上版本,启动appium的时候,你会发现无法使用Node.js命令 这里给出两种方法来启动appim: 方法一: /** * 使用AppiumSer ...

  8. [Spring实战笔记]4面向切面编程的Spring-代理

    代理 代理(Proxy)是一种设计模式,可以在目标对象实现的基础上,扩展目标对象的功能. 代理对象是对目标对象的扩展,并会调用目标对象. 三种代理模式 静态代理 100% 代理对象与目标对象要实现相同 ...

  9. ABP框架记录

    1.先在Core项目中建立模型Models>Model.cs/ModelManager.cs 2.在Application中建立接口和具体类:IModelAppService.csModelAp ...

  10. 如何用命令将本地项目上传到git[z]

    1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点 ...