boot loader 读取核心 linux将核心解压到内存中 而且利用核心的功能,开始测试驱动和周边的装置,linux核心会议本身的功能从新检测一次硬件,而不必定会使用BIOS检测的硬件信息 此时核心已经接管bios后的工做了
虚拟文件系统 initial ram disk或者initial ram filesystem 通常会使用的文件名称为/boot/initrd或者/boot/initramfs
经过bootloader载入到内存当中 而且执行其中的程序来载入开机过程当中所须要的核心模块 一般就是磁盘等文件系统的驱动 载入完成以后 会调用systemd来开始后续的正常开机流程 如上图所示
如图中所示 boot loader 可以载入kernel和initramfs ---initramfs解压缩成为根目录 ----kernel用此目录来载入适当的驱动程序,最终释放虚拟文件系统,并挂在实际的根目录文件系统,而后开始正常的开机流程。
1.查看initramfs里面的文件内容
lsinitrd /boot/initramfs-3.10.0-299.e17.x86_64.img
其中包括一条重要的信息
lrwxrwxrwx 1 root 时间 init-->usr/lib/systemd/systemd
包含两大部分 一个是事先宣告一些文件
另外一个是核心回去读取的重要文件
2.去掉上面宣告的文件
a: mkdir /tmp/initramfs 建立一个解压的目录
cd /tmp/initramfs
dd if=/boot/initramfs-3.10.0-229.e17.x86_64.img of=initramfs.gz bs=11264 skip=1 删除前面宣告的部分
ll initramfs.gz;fileinitramfs.gz 显示文件权限;文件类型
b: gzip -d initramfs.gz 解压缩文件
file intramfs 查看文件类型
c: cpio -i -d -H --no-absolute-filenames < initramfs 用cpio的命令解压 不要绝对路径
ll
从结果中能够看出一个小型的根目录文件系统 此时kernel就能够挂载了
d: 查看此小型的文件系统中 systemd是以哪一个target来执行开机的
ll /usr/lib/systemd/system/default.target
显示结果指向 --->initrd.target
e: 查看内设的initrd.target相依的全部服务信息
systemctl list-dependencies initrd.target
结论:initramfs是一个小型的根目录 这个小型根目录经过systemd来进行管理 经过initrd.target来开机 此环境依赖于basic.target sysinit.target等等硬件检测、核心功能启用的流程 而后开始让系统顺利运行,最后卸载initramfs 实际挂载系统的根目录。
第一程序systemd及使用default.target进入开机流程分析
当核心载入完毕 硬件驱动加载以后 此时主机硬件已经准备就绪了 此时核心会主动调用systemd这个程序,此程序准备软件执行的环境 包括主机名 网络 语言环境 文件格式及其余服务的启动等。
默认的操做系统的环境为default.target 主要项目 有multi-user.target 以及 graphical.target 还包括比较特殊的额rescue.target emergency.target shutdown.target等等 以及包括虚拟文件系统initramfs中的initrd.target
runlevel于systemd中的target对应关系
/usr/lib/systemd/system/runlevel0.target--------->poweroff.target
runlevel1.target--------->rescue.target
runlevel2.target--------->multi-user.target
multi-user.target
multi-user.target
5 graphical.target
6 reboot.target
systemd的处理流程
1.local-fs.target + swap.target 主要挂载本机/etc/fstab里面所规范的文件系统与相关的内存置换空间
2.sysinit.target 这个主要检测硬件 载入所须要的核心模块等动做。
3.basic.target 载入主要的周边硬件驱动程序与防火墙相关任务
4.multi-user.target下面的其余通常系统或网络服务的载入
5.图形界面相关服务如 gdm.service 等其余服务的载入
systemd执行sysinit.target初始化系统 basic.target准备系统
systemctl list-dependencies sysinit.target 查看依赖关系
大体的分类
此过程为初始化系统
a: dev-hugepages.mount dev-mqueue.mount等的挂载服务 主要挂载和内存分页与信息队列 挂载后会出 现
/dev下的相应的目录
b: 磁盘阵列 网络磁盘 LVM文件系统 文件系统对照服务等等
c: 开机过程的信息传递与动画执行 plymouthd服务搭配plymouth指令
d: 日志式文件的使用 systemd-journald这个服务的启用
e: 额外的核心模块的载入 经过/etc/modules-load.d/*.conf 配置文件的设置
f: 额外的核心参数设置 包括/etc/sysctl.conf 以及/etc/sysctl.d/*.conf内部设置
g: 设置终端的文字显示格式 console
h: 启动动态设备管理员 就是udevd 用在动态对应实际设备存取与设备文件名对应的一个服务
basic.target 启动系统服务
a 音频驱动
b 防火墙
c 载入cpu微指令
d selinux
e 将开机过程 写入/var/log/dmesg
f 加载管理员指定的模块 /etc/sysconfig/modules/*.modules 及/etc/rc.modules
g timer 定时任务
multi-user.target下的服务
上面提到的初始化和基本的两项流程结束后 要进入主机服务和网络服务的功能了
multi-user.target将会启动
/etc/systemd/system/multi-user.target.wants/下须要启动的服务
若是用户想将主机的服务和网那个罗服务的各个unit enable ,就将它放到/etc/systemd/system/multi-user.target.wants/ 这个目录下作个连接 如此就能够在开机的时候去启动它 若是是设置为disable的话 就是在上个目录中删除掉相应服务的连接文件。大多数的哦服务都是同时启动 而不是依序启动 这就是systemd的功能。
与systemV的rc.local.service
systemV的状况 若是想让系统额外执行程序 须要将程序或脚本的绝对路径写入到/etc/rc.d/rc.loacl这个文件中去,
systemd的状况下 须要将脚本设定文件到/etc/systemd/system下 而后使用systemctl enable的方式来启动它 而不是直接使用rc.local这个文件
rc.local.service 此服务的功能 不须要启动 会本身判断/etc/rc.d/rc.loacal 是否具备
可执行的权限来判断是否要启动此服务
增长可执行的权限 chmod a+x /etc/rc.d/rc.local
systemctl daemon-reload
systemctl list-dependencies multi-user.target | grep rc-local
会发现有rc-local.service 出现了
提供tty界面与登入的服务
multi-user.target 底下还有getty.target的操做界面 包括systemd-logind.service systemd-user-sessions.service
不必定哪一个服务先启动 若是systemd-logind.service或者systemd-user-sessions.service服务还没有执行完毕的话 那么仍是没法登录的 因此会出现如下状况 刚开机时出现tty1屏幕提示符 立刻输入用户名和密码并不能登陆 可是稍微等一会以后就会顺利登陆了
graphical.target下的服务
若是default.target为图形界面 那么在multi-user.target执行完毕以后会执行此项服务
先查看以来关系
systemctl list-dependencies graphical.target
会出现不少的服务 其中比较重要的是图形界面方面的gdm.service
开机流程中会用到的主要配置文件
与systemV兼容 不少服务脚本设置仍是会读取/etc/sysconfig/下面的环境设置文件
1.
关于模块:/etc/modprobe.d/*.conf及/etc/modules-load.d/*.conf
加载用户自定义模块
/etc/modules-load.d/*.comf 仅核心载入模块的位置
/etc/modprobe.d/*.conf 能够加上模块参数的位置
systemd默认将须要的驱动都加载了 尽可能不动 可是若是有特定的参数 须要处理 应该在这里进行,
举例:
vsftpd这个服务 端口该为555 就须要修改防火墙设定 其中针对ftp的防火墙设定中有一个模块为
nf_conntrack_ftp 因此须要将此模块写入系统开机流程中
a vim /etc/modules-load.d/
vbird.conf 此为自定义的模块配置文件
一个驱动模块写一行
b vim /etc/modprobe.d/vbird.conf 模块额外的参数设置位置
options nf_conntrack_ftp ports=555
将原来的21端口改成555
c lsmod | grep nf_conntrack_ftp 验证
无显示 须要载入此模块
d systmctl restart systemd-modules-load.service 载入模块
lsmod | grep nf_conntarck_ftp
2.常规的设定文件
/etc/sysconfig/*
authconfig:使用本机的/etc/passwd, /etc/shadow 等 以及/etc/shadow 密码记录使用何种加密算法 身份登陆机制
cpupower linux核心如何操做cpu 对应的服务为 cpupower.service
firewalld ipatables-config ebtables-config
防火墙服务启动的额外参数
network-scripts
网卡驱动
核心与核心模块
kernel的重要性 不言而喻
文件位置
核心:/boot/vmlinuz 或者 /boot/vmlinuz-version
核心解压缩所须要的RAM DISK:/boot/initramfs (/boot/initramfs-version)
核心模块:/lib/modules/version/kernel或者/lib/modules/$(unmae -r)/kernel
核心原始代码:/usr/src/linux或者/usr/src/kernels/ 须要用户安装 默认不安装
系统的信息记录:/proc/version 核心版本
/proc/sys/kernel/ 系统核心功能
遇到新硬件的解决办法
a 从新编译核心 加入最新的硬件驱动程序源码
b 将该硬件的驱动程序编译成为模块 在开机的时候加载该模块
核心模块与依赖关系
相依赖性文件 /lib/modules/$(uname -r)/modules.dep 这个文件 记录在核心支持的模块的各项相依性
创建此文件的命令 depmod
A 搜寻比此.dep文件内更新的模块 找到新模块才会更新
n 不写入.dep文件 而是将结果输出到屏幕上
e 显示出当前已经载入的 可是不可执行的模块名称
举例
cp a.ko /lib/modules/$(uname -r)/kernel/drivers/net
depmod
核心模块的观察
lsmod 列出模块的列表 包括名称 大小 是否被其余模块使用
modinfo 单个模块的详细信息
核心模块的加载与移除 手动加载模组
modprobe 比较简单 解决依赖性问题 会主动的去搜寻moduels.dep的内容 建议
insmod 不会分析相依性 insmod 绝对路径 参数
rmmod [-fw] module_name
f:强制
w:等待使用完成后 再删除
核心模块的额外参数设置 /etc/modprobe.d/*conf
针对模块的特殊要求
Boot Loader : Grub2
此为boot loader的程序
bootloader 的两个stage 阶段
在第一个开机装置的MBR去读取boot loader 446字节 第一个sector
stage1:执行boot Loader 主程序
必需要安装在开机区 最小主程序
stage2:主程序加载配置文件
经过boot loader加载配置与相关的环境参数文件 包括系统定义与主要设定的文件grub.cfg 通常配置文件在/boot 下面
grub.cfg 是主要的配置文件 grub2认识的文件系统格式很是多
i386-pc x86架构的pc 所须要的grub2的相关模块文件夹
grub2的配置文件 grub.cfg介绍
认识较多的文件系统 能够利用grub2的主程序直接在文件系统中查找核心文件名
开机时 能够自行编辑与修改开机设定的项目 相似bash的指令
动态查找配置文件,不须要再修改配置文件后从新安装grub2 重启便可生效
a 分区代号
三种模式
(hd0,1) 默认使用的语法 由grub2自动判断分割格式
(hd0,msdos1) 磁盘分割为传统的MBR模式
(hd0,gpt1) 磁盘分割为GPT模式
说明:小括号 hd表示 搜索顺序为硬盘的编号 第一个为0 顺延 每一个硬盘的第一个分区为1 顺延
硬盘从0开始 分区从1开始
注意与grub1版本是有区别的
b 配置文件
不建议自行修改配置文件的内容 可是能够用grub2-mkconfig指令来产生新的grub.cfg文件
配置文件中的内容 比较重要的
set root='hd0,gpt2' 配置文件所在位置 /与/boot在不一样的分区 因此hd0,2 又由于gpt的分区格式 因此使用(hd0,gpt2)
linux16 /vmlinuz-... root=/dev/mapper/centos-root ...
由于/与/boot不在同一个分区 因此会显示/boot/vmlinuz-xxx--->(/boot)/vmlinuz-xxx--->(hd0,msdos1)/vmlinuz-xxx 用迭代的方式
initrd16 /initramfs-3.10...
此为initramfs所在的文件名 与linux16那个vmlinuz-xxx相同 文件名须要搭配 set root=xxx 那个项目的装置 才会获得正确的位置。
grub2配置文件的维护 /etc/default/grub 与 /etc/grub.d
不建议手动修改 应该要透过/etc/default/grub 这个主要环境配置文件与/etc/grub.d/目录内的相关配置文件来处理
/etc/default/grub 主要环境配置文件
grub_timeout grub_timeout_style grub_terminal_output grub_default grub_cmdline_linux
举例:
1
.vim /etc/default/grub
grub_timeout=40
grub_default=0
2.开始从新创建 grub.cfg
grub2-mkconfig -o /boot/grub2/grub.cfg
3.检查是否真的改变
grep timeout /boot/grub2/grub.cfg
菜单创建的脚本 /etc/grub.d/*
grub2-mkconfig 会分析/etc/grub.d/*下面的文件 而后执行该文件来创建grub.cfg
grub.d/下面的文件包括:
00_header 创建初始的显示项目 包括须要载入的模块分析 tty的格式 秒数 菜单是否隐藏
10_linux 根据分析/boot底下的文件 尝试找到正确的linux核心与读取这个核心须要文件模块与参数
30_os-prober 默认到系统上找到其余的partition里面可能含有的操做系统
40_custom 有其余本身手动加上的菜单项目
直接指定核心开机
先到cfg配置文件中取得须要制做的核心菜单 而后将它复制的奥40_custom
再到40_custom当中根据需求修改便可
经过chainloader的方式移交Loader控制权
将控制权交给下一个boot loader而已 两个参数 一个是前往的boot sector所在的分区代号 另外一个是设定chainloader在分区的boot sector上
举例 假设系统分区在/dev/sda1 有且仅有一个硬盘 那么要grub将控制权交给 windows的loader 只须要
menuentry "windows"{
insmod chain 载入chainloader的模块
insmod ntfs 加载windows的文件系统模块
set root=(hd0,1) 指定启动的分区
chainloader +1 到boot sector 将loader软件读取出来
}
initramfs的重要性与创建新的initramfs文件
须要initramfs的时刻为
根目录所在的磁盘为sata usb 或者 scsi等
根目录所在文件系统为lvm raid等特殊格式
根目录所在文件系统为非传统linux认识的文件系统时候
其余必需要在核心载入时提供的模块
通常发行版提供initramfs文件 可是若是有特殊的须要重作initramfs文件,可使用
dracut / mkinitrd来处理
语法:dracut [-fv] [--add-drivers 列表] initramfs文件名 核心版本
测试与安装grub2
grub2-install [--boot-directory=DIR] INSTALL_DEVICE
DIR为实际的目录 grub2-install会默认将全部的文件都复制的奥/boot/grub2/* 若是想要复制到其余目录与装置区 就要用到后面的参数
举例 grub2-install /dev/vda
df -T | grep -i xfs
查看系统中是否有xfs文件系统
grub2-install
--skip-fs-probe /dev/vda4
强制安装
grub2-install
--force --recheck --skip-fs-probe /dev/vda4
如此就将grub2这个主程序安装到/dev/vda4以及MBR中
总结
a 若是从其余的boot loader转成grub2的时候 得先使用grub2-install 来安装grub2
b 若是安装到分区 须要加上额外的参数才能顺利安装上
c 开始编辑/etc/default/grub以及/etc/grub.d/* 这几个重要的配置文件
d 使用grub2-mkconfig -o /boot/grub2/grub.cfg来创建开机的配置文件