第五部分 linux系统管理员 开机流程 模组管理 与loader

第五部分   linux系统管理员  开机流程  模组管理  与loaderlinux

 
开机流程分析
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  sector      扇区    
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等磁盘装置的驱动程序一般都是以模组的方式来存在的。

 

  bios    ----boot loader ----kernel    ---检测硬件挂在根目录取得驱动程序
可是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来创建开机的配置文件
相关文章
相关标签/搜索