boot loader 读取核心 linux将核心解压到内存中 并且利用核心的功能,开始测试驱动和周边的装置,linux核心会议自己的功能重新检测一次硬件,而不一定会使用BIOS检测的硬件信息 此时核心已经接管bios后的工作了
但是kernel不认识sata硬盘 所以需要载入sata的驱动程序 否则无法挂在根目录 但是驱动程序在/lib/modules内 无法挂在根目录的情况下如何读取/lib/modules/内的驱动呢? 此时就需要通过虚拟的文件系统 来挂在目录
虚拟文件系统 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来建立开机的配置文件