1. GRUB相关
1.1. grub legacy
CentOS 6启动流程:
POST --> Boot Sequence(BIOS) --> Boot Loader --> Kernel(ramdisk) -->rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 设定默认运行级别 --> 系统初始化脚本rc.sysinit --> 关闭或启动对应级别的服务 --> 启动终端
参看:http://s4.51cto.com/wyfs02/M02/87/20/wKiom1fVBELjXsvaAAUkuL83t2Q304.jpg
grub: GRand Unified Bootloader
grub 0.97: grub legacy
grub 2.x: grub2
grub legacy:
- stage1: mbr
- stage1_5: mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统,从而能找到stage2中的grub文件夹以及内核,img文件
- stage2:磁盘分区(
/boot/grub/)
1.2. grub安装(修复)—{grub-install}
1.2.1. 安装grub:
grub-install:非交互式
- 安装
grub stage1和stage1_5到/dev/DISK磁盘上,并复制GRUB相关文件到DIR/boot目录下 - 命令:
grub-install [--root-directory=DIR] /dev/DISK
- 安装
grub:交互式
grub> root (hd#,#) grub> setup (hd#)
1.2.2. grub legacy详细介绍
- 配置文件:
/boot/grub/grub.conf <—— /etc/grub.conf
stage2及内核等通常放置于一个基本磁盘分区
- 功用:
(1) 提供启动菜单、并提供交互式接口
a:内核参数
e: 编辑模式,用于编辑菜单
c: 命令模式,交互式接口
(2) 加载用户选择的内核或操作系统
允许传递参数给内核
可隐藏启动菜单
(3) 为菜单提供了保护机制
为编辑启动菜单进行认证
为启用内核或操作系统进行认证
grub的命令行接口
help:获取帮助列表
help KEYWORD:详细帮助信息
find (hd#,#)/PATH/TO/SOMEFILE:
root (hd#,#)
kernel /PATH/TO/KERNEL_FILE: 设定本次启动时用到的内核文件;额外还可添加许多内核支持使用的cmdline参数
例如:max_loop=100 selinux=0 init=/path/to/init
initrd /PATH/TO/INITRAMFS_FILE:设定为选定的内核提供额外文件的ramdisk
boot:引导启动选定的内核cat /proc/cmdline内核参数
内核参数文档:/usr/share/doc/kernel-doc-2.6.32/Documentation/kernelparameters.txt识别硬盘设备
(hd#,#)
hd#: 磁盘编号,用数字表示;从0开始编号
#: 分区编号,用数字表示; 从0开始编号
(hd0,0)第一块硬盘,第一个分区手动在grub命令行接口启动系统
grub> root (hd#,#) grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE grub> initrd /initramfs-VERSION-RELEASE.img grub> boot
1.2.2.1. grub legacy配置文件
配置文件:/boot/grub/grub.conf
default=#: 设定默认启动的菜单项;落单项(title)编号从0开始
timeout=#:指定菜单项等待选项选择的时长
splashimage=(hd#,#)/PATH/XPM_FILE:菜单背景图片文件路径
password [--md5] STRING: 启动菜单编辑认证
hiddenmenu:隐藏菜单
title TITLE:定义菜单项“标题” , 可出现多次
root (hd#,#):查找stage2及kernel文件所在设备分区;为grub的根
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核
initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件
password [--md5|--encrypted ] STRING: 启动选定的内核或操作系统时进行认证
1.2.3. grub加密—{grub-crypt}
生成grub口令
- grub-md5-crypt
- grub-crypt
破解root口令:
- 启动系统时,设置其运行级别1
进入单用户模式: 1. 编辑grub菜单(选定要编辑的title,而后使用a 或 e 命令) 2. 在选定的kernel后附加1, s, S,single 都可以 3. 在kernel所在行,键入“b” 命令
1.3. 注意点:
如果grub1阶段找不到或者错误,BIOS会自动寻找下一个可以启动的硬盘引导设备(按照启动顺序设置一个一个找设备)。
grub-install命令,后面直接跟上想要修复的硬盘或者设备(比如/dev/sda)- 注意如果boot文件夹和不在根文件夹下面,也就是说boot不是/boot 而是在其他的文件夹下,则要写上boot文件夹所在的上级目录,如果就在根下面则不用写了。这一点别忘了.
- 更多的详细信息关于
--root-directory=DIR(grub1代参数,Centos6用)或--boot-directory=DRI(grub2代参数,Cneots7用)直接查看man帮助(6和7不同,7是2代grub,且可以GPT EUFI启动,man grub[2]-install)
重要注意点1:只有启动设备(比如第一个硬盘
/dev/sda)的前446字节才会有bootloader,也就是grub的信息,它会在安装系统的时候自动写上grub的信息。而后面添加的新硬盘的MBR(比如/dev/sdb,sdc等)则前面446字节为0,只有后面64字节有分区信息。- 当然可以装多个grub,一个硬盘装一个,则这每一个硬盘都能够作为启动设备来使用并启动计算机。
重要注意点2:grub的作用只是引导启动操作系统内核,启动完内核它便会移交控制权,结束本身的工作。同时根据3中可以看出,如果硬盘MBR前446字节错误,只是说它不能作为启动引导设备,但是它的硬盘分区表64字节如果并未损害,仍然可以被识别分区并且挂载(挂载前里面的各个分区要有文件系统),注意分区表和bootloader的区别。
- 因此,在光盘救援模式下,只要系统通过光盘引导并加载到内存中启动了一个小型LINUX系统,则损坏了446字节但64字节分区表没被损坏的硬盘就相当于3中后加的硬盘一样,直接挂载使用即可(然后就可以用光盘对其进行grub的安装和修复)
交互式安装grub时候,指定grub所需要的恢复文件的boot所在的目录位置时,
root(hd#,#),第一个代表硬盘,第二个代表此硬盘内的哪个分区。一般boot单独分离出来挂载一个分区的时候(系统安装时)会自动把它排在硬盘第一个分区。因此/dev/sda1(boot的挂载目录),就是root(hd0,0)- 注意这个交互式安装时是按照
/boot所在的目录的stage1 1.5 2等备份文件来进行恢复的,如果没有这些备份文件则不能用交互式。 - 交互式内还可以输入一些其他命令,比如help查看帮助
setup(hd0)指定安装MBR446字节的硬盘位置。由此可见/boot文件夹和启动设备硬盘可以不在一个硬盘上,也就是这个硬盘只用来引导启动而另外一个硬盘装内核和grub stage2来启动系统。
- 注意这个交互式安装时是按照
**重要注意点3:**注意grub操作完毕的时候要用
sync命令(多输入几次)让命令从缓冲区写入磁盘中,以免并没有保存。(也可以重新挂载硬盘设备让它直接写入磁盘的方式,在前面所学的mount中可见此命令)在启动过程中boot目录grub下的grub.conf配置文件是最重要的必要文件,而其他的文件即使丢失或者不存在计算机也能够正常启动。
- 它保存了grub第二阶段
- 操作系统内核位置
- 操作系统根相关的挂载配置设置
initramfs.img伪文件系统的位置。
# grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/sda2 # initrd /initrd-[generic-]version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu password --encrypt $6######## title CentOS 6 (2.6.32-754.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=UUID=d5db5e08-dc6d-4b6e-84fc-7e490e44ba0c rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-754.el6.x86_64.img- 由分析可知
root (hd#,#)就是代表了第几块硬盘的第几个分区,它是grub程序所找的根(狭义上可以理解为boot文件夹所在的硬盘分区,因为默认内核和img文件就装在这里,)在这里这个根就代表着boot这个文件夹,或者说代表root (hd#,#) 所指的分区的挂载的文件夹(因为它就是boot 所以 / 符号在这里就是代表/boot这个文件夹) - 而内核挂载后
root=/dev/sda2才是操作系统的根,对其进行各种挂载配置 - 此项也可不写,不过下面的kernel 和 initrd两项就要写成
(hd0,0)/#####的形式了 - 重要注意4: grub1阶段完成之后,因为446字节很小不可能放得下文件系统的驱动,虽然分区表能找到分区
/dev/sda1,但是grub程序是如何找到/boot目录以及它里面的grub.conf文件的?(寻找文件需要挂载时加载相应的文件系统驱动才可,只找到分区没有文件系统不行)。这里就是靠的1扇区后面的更多扇区的grub1.5阶段来实现的。 - grub 1.5阶段就记载了boot目录的文件系统驱动(且只记载了它的驱动,没有记载其他的),它的扇区数量不固定,根据文件系统驱动的大小和安装时的设定来动态分配的。经过grub1.5阶段,识别了boot分区的文件系统,才能找到
boot目录以及它的grub.conf文件 - 重要注意5:操作系统根分区的虚拟文件系统驱动(第一次只读挂载时),就是靠
grub.conf中写的initramfs.img文件来加载的(grub1.5只记载了boot的,不然这个img文件缺失了为何根就挂载不了了?,说明grub只管boot,img只管操作系统根,img缺失了机器能用grub硬盘启动但是无法挂载根)。
- 它保存了grub第二阶段
注意内核kernel和initrd两行顺序不能写反。title代表了标题栏选项,每一项就是一个选择内核的标题栏。
quiet表示内核安静模式启动,不显示内核启动的各种信息。这两项可以去掉。rhgb项代表图形界面显示(转圈等待的那个图形界面),在这个界面按esc键才能看到被它遮盖的启动信息;default代表默认启动选择哪一个菜单的内核,timeout就是相对应的多少秒内没有操作就会启动默认菜单的时长。hiddenmenu如果不敲任意键,则默认隐藏菜单splashimage(=(hd0,0)/grub/splash.xpm.gz)代表启动的时候后面的背景图片,可以自己更改。(大小就是640*480像素图片,后缀为xpm,并且要压缩为gz) 可在linux里安装ImageMagick包(yum install ImageMagick) ,然后用convert命令转换它:convert -resize 640x480 -colors 14 win.jpg win.xpm, 然后路径写上即可。- 之后再对其进行压缩,放到
/boot/grub目录中,在grub.conf中指定它即可更改启动时菜单栏的背景图片了(注意不是rhgb的那个,这个是菜单栏背景图) - **重要注意6:**当规定了
root (hd0,0)之后,经测试要把所有相关文件都放在这个分区内才可。可放在这个分区不同的文件夹,但是必须在这个分区内。原因就是因为grub一次只能识别一个分区和它相应的文件系统。
前面也提到过grub交互式只是恢复备份文件,如果没有这些文件则无法用这个命令。因此用
grub-install命令更加常用:grub-insatall /dev/sda:注意直接写硬盘不要写分区,因为grub就是在MBR中,它在硬盘的第一个扇区和分区无关。- 如果boot文件夹挂载点不直接在操作系统根目录下,则要加上boot挂载的文件夹目录
--root-directory=DIR. - 这个命令不仅能修复grubstage1 ,还能修复grubstage1.5 以及grub文件夹下的各个备份文件(其实就是文件系统驱动等),但是不能修复grub.conf文件和图片文件
重要注意7:
grub-install /dev/sda命令执行过之后,如果只留下grub.conf文件,机器这次不能像之前那样正常启动了,会出现error 15的错误。说明此命令和原装的系统grubstage2的文件还是略有区别的,虽然表面上看起来是修复成功了。此时只能光盘救援模式(想要用此命令必须切换根才可)为了避免启动过程中root口令被破解(按a切换1模式),因此可以在
grub.conf中加一行password=###来加口令,这样开机进入选择界面时就需要输入密码了。- 当然要用加密的方式进行书写,利用命令
grub-crypt或者grub-md5-crypt生成密码然后复制进去暗文即可。(最好用grub-crypt,它是$6加密)不过之后别忘了在/boot/grub/grub.conf文件中需要注意指明加密的方式 - 这里要注意,
password这样必须加在splashimage 和 title之间这段,否则不能生效。
- 当然要用加密的方式进行书写,利用命令
password --md5 $1#####
或者 password --encrypt $6######
2. /proc目录
/proc目录:
- 内核把自己内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出
帮助:man proc
参数:
- 只读:输出信息
- 可写:可接受用户指定“新值”来实现对内核某功能或特性的配置
/proc/sys目录
- sysctl命令用于查看或设定此目录中诸多参数sysctl -w path.to.parameter=VALUE sysctl -w kernel.hostname=mail.magedu.com
- echo命令通过重定向方式也可以修改大多数参数的值echo "VALUE" > /proc/sys/path/to/parameter echo “websrv” > /proc/sys/kernel/hostname
3. sysctl命令—{sysctl}
默认配置文件:/etc/sysctl.conf
- 设置某参数
sysctl -w parameter=VALUE - 通过读取配置文件设置参数
sysctl -p [/path/to/conf_file] - 查看所有生效参数
sysctl -a
常用的几个参数:
net.ipv4.ip_forward:数据包转发net.ipv4.icmp_echo_ignore_all:是否忽略icmp的请求,如果改为1则忽略,便禁止了ping本机的功能vm.drop_caches:清空buffer/cache,要设置为3
4. /sys目录
/sys目录:
- sysfs:为用户使用的伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息;有些参数是可以修改的,用于调整硬件工作特性
- udev通过此路径下输出的信息动态为各设备创建所需要设备文件,udev是运行用户空间程序
专用工具:udevadmin, hotplug
- udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d及/usr/lib/udev/rules.d目录下
4.1. sysctl相关注意点
- sysctl命令就是通过修改
/etc/sysctl.conf文件来永久保存开机之后写入proc/sys文件夹中的各种配置。直接修改proc/sys的方式只能临时修改(比如echo 1修改网卡的数据转发)。 - 在这个配置文件中的每一项都省略了
/proc/sys标头,这里面的每一项的/标志被换为了.符号- 修改之后不会立即生效,使用
sysctl -p命令让它立即生效。 - 如果文件中没有默认写入的配置,则可以手写进去,就比如禁止ping功能的项。不过要注意格式。
- 修改之后不会立即生效,使用
- 但是要注意如果生效的项被删除了,则用
sysctl -p命令重新载入的时候不会修改被删除的这一项的值。因为它只是读入此文件并加载到内存中配置,如果不相同的设置才会覆盖掉。 删除掉某一项相当于没有配置,因此只能修改文件中每一项后面的值而不是删除这一项。 - 利用
sysctl -a命令查看所有正在生效的配置,也可以利用sysctl -w直接修改文件中的每一项的值。格式也是按照文件中的格式来写的,都是点.的符号- 注意用
sysctl -w命令就相当于是echo 1 > 文件,它俩是等价的,不能保存修改后的参数
- 注意用
- Centos7中此文件为空,只能自己全部手写配置。可先用
sysctl -a|grep来查询然后再书写。 - 利用
man proc来查看各种设置的功能和选项,比如vm.drop_caches,因为许多内核默认设置都比较保守,因此需要更改它- 更多关于网络的设置先通过
man proc之后可以从中知道可以通过man 7 tcp和man 7 ip进行查看
- 更多关于网络的设置先通过
5. 内核相关介绍
- 单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制
- 内核组成部分:kernel:内核核心,一般为bzImage,通常在/boot目录下名称为 vmlinuz-VERSION-RELEASE kernel object:内核对象,一般放置于/lib/modules/VERSION-RELEASE/ [ ]: N [M]: M [*]: Y
- 辅助文件:
ramdiskinitrd initramfs
5.1. 内核版本—{uname}
- 运行中的内核:
uname命令:
uname - print system information
uname [OPTION]...
-n: 显示节点名称
-r: 显示VERSION-RELEASE
-a:显示所有信息
5.2. 内核模块命令—{lsmod,modinfo,modprobe,depmod,insmod,rmmod}
5.2.1. lsmod命令
显示由内存已经装载的驱动模块
显示的内容来自于: /proc/modules文件(cat /proc/modules)
- 其中各项代表模块名,大小(以K为单位),被使用的次数,以及当前模块被by下面的模块所依赖
5.2.2. modinfo命令:
显示模块的详细描述信息
modinfo [ -k kernel ] [ modulename|filename... ]
-n:只显示模块文件路径
-p:显示模块参数
-a:作者
-d:描述
示例:
lsmod |grep xfs
modinfo xfs
复习知识点:ethtool -i eth0
5.2.3. modprobe命令:
装载或卸载内核模块
modprobe [ -C config-file ] [ modulename ] [ module parame-ters... ]
modprobe [ -r ] modulename… :-r 卸载 不写-r 加载
- 配置文件:
/etc/modprobe.conf,或/etc/modprobe.d/*.conf - 有些模块需要某些参数设置,则就会在上面所写的配置文件中写入,modprobe装载模块时会自动装载对应的这些配置文件
- 此命令不需要写模块路径只需要写名字,同时也可以自动解决模块的依赖性,会把相关模块也同时加载
5.2.4. depmod命令:
内核模块依赖关系文件及系统信息映射文件的生成工具
5.2.5. insmod命令
装载指定模块文件,不自动解决依赖模块
(install mod)insmod必须指定模块的全路径且不能解决依赖性
insmod [ filename ] [ module options... ]
insmod `modinfo –n exportfs`
lnsmod `modinfo –n xfs`
5.2.6. rmmod命令
卸载模块,直接写模块名即可
rmmod [ modulename ]
rmmod xfs
rmmod exportfs
6. 附加知识点
- NTFS文件格式的支持在epel源中有包可以进行操作。会多一个mount.ntfs命令,对NTFS格式文件系统的分区进行挂载之后便可可读可写。yum search ntfs yum install ntfs-3g
留言
The deep dive into the boot sequence (GRUB to init) perfectly illustrates layered dependency management-a concept critical not just in OS design, but in any complex service architecture. Understanding these foundational steps is key to building resilient systems, whether it’s code or a robust digital platform like the one found at 8K8T link. Excellent breakdown!