第五部分 linux系统管理员 开机流程 模组管理 与loader
开机流程分析
cmos保存电脑硬件的参数
bios 基本的输入输出系统 读取硬件的软件
MBR master boot record 主要的开机记录扇区 里面可以安装开机管理程序 例如grub pfdisk等有446字节
partition table 分区表 记录硬盘分割的状态64字节
其中上面的mbr和分区表都记录在硬盘的第一个扇区 大小为512字节
主分区最多4个p1-p4 primary
扩展分区最多一个 扩展分区要占据1个主分区的盘号的位置 扩展分区中可以建立多个逻辑分区 并口硬盘逻辑分区(63)多余串口硬盘的逻辑分区数量(15个)
windows和linux操作系统又有所不同
mbr 无法安装2.2t以上的容量 分区表只有16个字节
GPT GUID partition table 磁盘分区表
MBR为512字节大小 而 GPT为4k大小的块大小 为了兼容磁盘 所以定义上gpt将区块易LBA 512字节来规划 最前面的34个LBA 组成分区磁块的信息记录 最后面的33个LBA作为备份
boot loader 每个分区的第一个部分都会预留一块给系统引导程序
MBR中可以安装引导程序 windows默认安装 linux可手动安装 所以先安装windows 再装linux
1.BIOS读取cmos的设置 进行自我检测 并依据设置取得第一个可开机的装置
2.读取并执行第一个开机装置内的MBR的boot loader 也就是grub2 spfdisk等程序
3.根据boot loader的设置 载入操作系统的kernel 内核会检测硬件并且加入驱动程序
4.驱动完成之后 kernel会主动呼叫 systemd程序 并且以default.target流程开机
systemd执行syssinit.target初始化系统以及basic.target准备系统 系统初始化包括运行环境
systemd启动multi-user.target下的本机与服务器服务 操作系统的基本服务和网络服务
systemd执行multi-user.target下的/etc/rc.d/rc.local文件 自定义本机自启服务
systemd执行multi-user.target下的getty.target及登录服务 终端环境
systemd执行graphical需要的服务 图形界面服务
BIOS boot loader 与kernel载入
boot loader 的功能 认识操作系统的文件格式并且将核心加载到内存中去执行,由于不同的操作系统的文件格式不同 ,所以每种操作系统都有自己的boot loader
boot loader程序安装到此扇区或者mbr中
·此程序提供如下功能
a 菜单 多重开机选项
b 载入核心文件 直接指向可开机的程序区段来开始操作系统
c 转交给其他的loader 将开机管理功能转交给其他的loader负责
需要注意的是windows的loader默认没有控制权转交的功能,所以不能使用windows的loader来载入linux的loader
菜单一 MBR grub2----kernel file----booting
menu2 MBR grub2----boot sector(Windows loader)----Windows kernel----booting
menu3 MBR grub2----boot sector(grub2)----kernel file(linux)----booting
载入的核心kernel侦测硬件与initramfs的功能
boot loader 读取核心 linux将核心解压到内存中 并且利用核心的功能,开始测试驱动和周边的装置,linux核心会议自己的功能重新检测一次硬件,而不一定会使用BIOS检测的硬件信息 此时核心已经接管bios后的工作了
核心文件的位置:/boot 取名为/boot/vmlinuz
核心模块放在/lib/modules/目录当中 因为模组要放到磁盘的根目录内所以分区时要注意 /和/lib在同一个分区
一般的非必要的功能且可以编译为模块的核心功能 所以usb sata scsi等磁盘装置的驱动程序通常都是以模组的方式来存在的。
但是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来建立开机的配置文件