别人的Linux私房菜(20)启动流程、模块管理与Loader
系统启动时,首先加载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.target或graphical.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的更多相关文章
- 别人的Linux私房菜(17)进程管理与SELinux初探
程序在磁盘中,通过用户的执行触发.触发事件时,加载到内存,系统将它定义成进程,给予进程PID,根据触发的用户和属性,给予PID合适的权限. PID和登陆者的UID/GID有关.父进程衍生出来的进程为子 ...
- 别人的Linux私房菜(3)主机规划与磁盘分区
磁盘阵列:RAID.将数个硬盘整合成为在操作系统看来是一个硬盘. Linux对笔记本电脑的支持:https://www.linux-laptop.net/ 几乎所有硬件设备存放于/dev/目录. SC ...
- 别人的Linux私房菜(18)认识系统服务(daemon)
完成服务service的程序称为daemon.完成计划性的服务程序如crond是一个daemon. 早期的System V的init管理daemon操作中,系统内核首先调用init,然后init运行系 ...
- 别人的Linux私房菜(8)Linux磁盘与文件系统管理
虚拟机的磁盘通常为:/dev/vd[a-p] LVM和软件磁盘阵列 software RAID可以将一个分区格式化为多个文件系统或者多个分区格式化为一个文件系统. 索引式文件系统中:如ext2.ext ...
- 别人的Linux私房菜(19)认识与分析日志文件
日志文件通常只有root可以读取,解决系统和网络方面的问题. /var/log/boot.log本次开机系统检测和启动硬件,和内核支持的相关功能的信息记录. /var/log/cron计划任务有没有被 ...
- 别人的Linux私房菜(15)磁盘配额与高级文件系统管理
磁盘配额在网站.邮件.文件等服务器常见,主要有针对用户.用户组.限制某一目录的的最大磁盘配额. ext文件系统进能针对整个文件系统配额,xfs可以针对目录配额.配额和文件系统有关. 内核必须支持磁盘配 ...
- 别人的Linux私房菜(14)Linux账号管理和ACL权限设置
用户标识符UID.GID 用户的账号信息,主要是指UID对应.组和GID对应 检查系统中是否存在用户bin:id bin 登录shell验证账号密码的步骤:找到/etc/passwd核对是否存在账号, ...
- 别人的Linux私房菜(13)学习Shell脚本
CentOS6.x以前版本的系统服务启动接口在/etc/init.d/目录下,存放了脚本. Shell脚本因调用外部命令和bash 的一些默认工具,速度较慢,不适合处理大量运算. 执行方式有:直接命令 ...
- 别人的Linux私房菜(11)认识与学习BASH
Linux下使用BASH Bourne Again Shell 另外一种由用于Unix的伯克利大学的Bill Joy设计的C Shell 系统中合法的shell会写入到/etc/sh ...
随机推荐
- websocket的子协议stomp协议
stomp协议Spring实现 服务器注册EndPoint 用来与客户端建立websocket连接 websocket连接的建立应该与客户端与服务器之间的通道无关 jdk中 javax下的websoc ...
- mount命令和自动挂载实例
前言 介绍mount命令和一个实例. mount命令 作用 作用:挂载linux系统外的文件 命令格式 mount [-hV] mount -a [-fFnrsvw] [-t vfstype] mou ...
- Delphi 10.2 新特性之—TFDBatchMoveJSONWriter
RAD Studio 10.2.2 提供从 TDataSet 映射到 JSON ,增加了对JavaScript 客户端支持. RAD Studio 10.2.2 为 FireDAC BatchMove ...
- MyEclipse Web项目部署失败:Deployment failure on Tomcat 7.x.Could not copy all resources to XXX.
在做第一个MyEclipse web项目时,总是部署失败: Deployment failure on Tomcat 7.x.Could not copy all resources to XXX.I ...
- linux 环境变量 转
https://www.cnblogs.com/aaronLinux/p/5837702.html export PATH=/home/one/:$PATH export PATH=$PATH:/ho ...
- 【C++】C++中的string类的用法总结
相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯 ...
- API权限设计总结
最近在做API的权限设计这一块,做一次权限设计的总结. 1. 假设我们需要访问的API接口是这样的:http://xxxx.com/openapi/v1/get/user/?key=xxxxx& ...
- 初学c# -- 记录QQ键盘
扫描进程,如果QQ启动了,开始记录键盘,别的程序都不记录.记录到e:\log.txt里面,当然也可以修改为截屏+记录发送到邮箱或客户端 进程 Process[] p = Process.GetProc ...
- python3作业:模拟登录
__author__ = "bin007" customer = {}#存储用户信息#处理用户信息文件try: with open('login.txt','r',encoding ...
- 47 【golang】mysql操作
新做了个demo,可以简单了解下mysql的操作:https://github.com/helww/mylab/tree/master/go/mysql