第五部分   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  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来建立开机的配置文件
 

第五部分 linux系统管理员 开机流程 模组管理 与loader的更多相关文章

  1. 鸟哥的linux私房菜学习记录之开机流程、模块管理与Loader

  2. Linux学习-Linux 的开机流程分析

    开机流程一览 系统开机的经过可以汇整成底下的流程的: 加载 BIOS 的硬件信息与进行自我测试,并依据设定取得第一个可开机的装置; 读取并执行第一个开机装置内 MBR 的 boot Loader (亦 ...

  3. liunx 开机流程与模块管理

    系统开机的经过可以汇整成底下的流程的: 加载 BIOS 的硬件信息与进行自我测试,并依据设定取得第一个可开机的装置: 读取并执行第一个开机装置内 MBR 的 boot Loader (亦即是 grub ...

  4. Linux系统用户与属组管理(3)

    好了,终于要到了管理 Linux 账号的时刻了,对于 Linux 有一定的熟悉度之后,再来就是要管理连上 Linux 的账号问题了,这个账号的问题可大可小,大到可以限制他使用 Linux 主机的各项资 ...

  5. linux系统开机流程详解

    今天,我们主要来谈谈计算机系统的启动流程 1.BIOS启动 BIOS是写入到主板上的一个韧体(韧体就是写入到硬件上的一个软件程序).开机的时候,BIOS是计算机系统会主动执行的第一个程序.BIOS主要 ...

  6. [Linux]第五部分-Linux系统管理员

    启动流程如下:1.加载BIOS信息,读取第一个启动设备代号2.读取第一个启动设备的Mbr引导程序的启动信息3.加载操作系统核心信息4.核心执行init程序并获取运行信息5.init执行 /etc/rc ...

  7. linux系统开机流程

    基本步骤:上电->bios->MBR引导->GRUB菜单->加载内核->运行init进程初始化->启动/etc/rc.d*脚本与相关配置文件->执行rc.lo ...

  8. 别人的Linux私房菜(20)启动流程、模块管理与Loader

    系统启动时,首先加载BIOS,通过BOIS读取COMS的硬件信息,进行自我检测,取得第一个可启动的设备(多个根据设置有关). 读取并执行设备内的MBR启动引导程序,引导程序调用boot sector中 ...

  9. 鸟哥的linux私房菜——第20章 启动流程、模块管理与loader

    20.1 Linux启动流程分析 Linux启动过程: 按下开机电源后计算机硬件主动读取BIOS来加载硬件信息以及硬件系统的自我测试,之后系统会主动读取第一个可启动的设备(由BIOS设置),此时就可以 ...

随机推荐

  1. 我的NopCommerce之旅(3): 系统代码结构分析

    一.概述 基于MVC 二.详细描述 \Libraries\Nop.Core 核心类,包括缓存.事件.帮助类.业务对象(订单.客户实体) \Libraries\Nop.Data 数据访问层,采用Enti ...

  2. IT兄弟连 JavaWeb教程 Servlet定义以及环境配置 BS程序和CS程序

    随着网络技术的不断发展,单机的软件程序已难以满足网络计算机的需求.为此,各种各样的网络程序开发体系结构应运而生.其中,运用最多的网络应用程序开发体系结构可以分为两种,一种是基于客户端/服务器的C/S结 ...

  3. 【javascript】2017-9-12 腾讯笔试小Q升序算法

    刚做完笔试,腾讯笔试系统真的不友好,作为一个前端,我只会用js写编程题,然而,然而腾讯笔试系统连js输入函数都没给,还不准跳出页面,那个调试结果一直显示错误,我一直找不到错误在哪,心累. 只做了一道笔 ...

  4. “Debug Assertion” Runtime Error on VS2008 VS2010 winhand.cpp

    I'm writing a C++ MFC program on VS2008 and I'm getting this "Debug Assertion Error" when ...

  5. 项目在cocos 2.23移植到cocos 3.1.0所出现的bug

    在建项目时一定要注意选择源代码!而不是预编译库 "extensions/ExtensionMacros.h”: No such file 项目右键-属性-配置属性-c/c++ - 常规-附加 ...

  6. C# 一维数组 二位数组 多维数组

    什么是数组? 数组是一组变量,就是把一些变量串在一起,放在一块. 数组的作用? 假设有一堆变量,每个变量都有一些程序,那么这堆程序放在一起  程序就会混乱,处理起来有些麻烦,那么数组就是把这些变量放在 ...

  7. Bootstrap 入门到精通

    介绍 Bootstrap,来自 Twitter,是目前最受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加快捷.Bootstr ...

  8. 洛谷 P1334 瑞瑞的木板==P2664 【题目待添加】

    题目描述 瑞瑞想要亲自修复在他的一个小牧场周围的围栏.他测量栅栏并发现他需要N(1≤N≤20,000)根木板,每根的长度为整数Li(1≤Li≤50,000).于是,他神奇地买了一根足够长的木板,长度为 ...

  9. Android计算器简单逻辑实现

    Android计算器简单逻辑实现 引言: 我的android计算器的实现方式是:按钮输入一次,就处理一次. 但是如果你学过数据结构(栈),就可以使用表达式解析(前缀,后缀)处理. 而这个方式已经很成熟 ...

  10. OCR/Vote disk 维护操作: (添加/删除/替换/移动) (文档 ID 1674859.1)

    适用于: Oracle Database - Enterprise Edition - 版本 10.2.0.1 到 11.2.0.1.0 [发行版 10.2 到 11.2]本文档所含信息适用于所有平台 ...