1. GRUB相关

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:

  1. grub-install:非交互式

    • 安装grub stage1stage1_5/dev/DISK磁盘上,并复制GRUB相关文件到 DIR/boot目录下
    • 命令:grub-install [--root-directory=DIR] /dev/DISK
  2. grub:交互式

    grub> root (hd#,#) grub> setup (hd#)

1.2.2. grub legacy详细介绍

  1. 配置文件:/boot/grub/grub.conf <—— /etc/grub.conf
    stage2及内核等通常放置于一个基本磁盘分区
  • 功用:
    (1) 提供启动菜单、并提供交互式接口
     a:内核参数
     e: 编辑模式,用于编辑菜单
     c: 命令模式,交互式接口
    (2) 加载用户选择的内核或操作系统
     允许传递参数给内核
     可隐藏启动菜单
    (3) 为菜单提供了保护机制
     为编辑启动菜单进行认证
     为启用内核或操作系统进行认证
  1. 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: 引导启动选定的内核

  2. cat /proc/cmdline 内核参数
     内核参数文档:/usr/share/doc/kernel-doc-2.6.32/Documentation/kernelparameters.txt

  3. 识别硬盘设备  (hd#,#)
    hd#: 磁盘编号,用数字表示;从0开始编号
    #: 分区编号,用数字表示; 从0开始编号
    (hd0,0) 第一块硬盘,第一个分区

  4. 手动在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. 注意点:

  1. 如果grub1阶段找不到或者错误,BIOS会自动寻找下一个可以启动的硬盘引导设备(按照启动顺序设置一个一个找设备)。

  2. 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
  3. 重要注意点1:只有启动设备(比如第一个硬盘/dev/sda)的前446字节才会有bootloader,也就是grub的信息,它会在安装系统的时候自动写上grub的信息。而后面添加的新硬盘的MBR(比如/dev/sdb,sdc等)则前面446字节为0,只有后面64字节有分区信息。

    • 当然可以装多个grub,一个硬盘装一个,则这每一个硬盘都能够作为启动设备来使用并启动计算机。
  4. 重要注意点2:grub的作用只是引导启动操作系统内核,启动完内核它便会移交控制权,结束本身的工作。同时根据3中可以看出,如果硬盘MBR前446字节错误,只是说它不能作为启动引导设备,但是它的硬盘分区表64字节如果并未损害,仍然可以被识别分区并且挂载(挂载前里面的各个分区要有文件系统),注意分区表和bootloader的区别。

    • 因此,在光盘救援模式下,只要系统通过光盘引导并加载到内存中启动了一个小型LINUX系统,则损坏了446字节但64字节分区表没被损坏的硬盘就相当于3中后加的硬盘一样,直接挂载使用即可(然后就可以用光盘对其进行grub的安装和修复)
  5. 交互式安装grub时候,指定grub所需要的恢复文件的boot所在的目录位置时root(hd#,#),第一个代表硬盘,第二个代表此硬盘内的哪个分区。一般boot单独分离出来挂载一个分区的时候(系统安装时)会自动把它排在硬盘第一个分区。因此/dev/sda1 (boot的挂载目录),就是root(hd0,0)

    • 注意这个交互式安装时是按照/boot 所在的目录的stage1 1.5 2等备份文件来进行恢复的,如果没有这些备份文件则不能用交互式。
    • 交互式内还可以输入一些其他命令,比如help查看帮助
    • setup(hd0)指定安装MBR446字节的硬盘位置。由此可见/boot文件夹和启动设备硬盘可以不在一个硬盘上,也就是这个硬盘只用来引导启动而另外一个硬盘装内核和grub stage2来启动系统。
  6. **重要注意点3:**注意grub操作完毕的时候要用sync命令(多输入几次)让命令从缓冲区写入磁盘中,以免并没有保存。(也可以重新挂载硬盘设备让它直接写入磁盘的方式,在前面所学的mount中可见此命令)

  7. 在启动过程中boot目录grub下的grub.conf配置文件是最重要的必要文件,而其他的文件即使丢失或者不存在计算机也能够正常启动。

    • 它保存了grub第二阶段
      1. 操作系统内核位置
      2. 操作系统根相关的挂载配置设置
      3. 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硬盘启动但是无法挂载根)。
  8. 注意内核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一次只能识别一个分区和它相应的文件系统。
  9. 前面也提到过grub交互式只是恢复备份文件,如果没有这些文件则无法用这个命令。因此用grub-install命令更加常用:

    • grub-insatall /dev/sda :注意直接写硬盘不要写分区,因为grub就是在MBR中,它在硬盘的第一个扇区和分区无关。
    • 如果boot文件夹挂载点不直接在操作系统根目录下,则要加上boot挂载的文件夹目录--root-directory=DIR.
    • 这个命令不仅能修复grubstage1 ,还能修复grubstage1.5 以及grub文件夹下的各个备份文件(其实就是文件系统驱动等),但是不能修复grub.conf文件和图片文件
  10. 重要注意7:grub-install /dev/sda命令执行过之后,如果只留下grub.conf文件,机器这次不能像之前那样正常启动了,会出现error 15的错误。说明此命令和原装的系统grubstage2的文件还是略有区别的,虽然表面上看起来是修复成功了。此时只能光盘救援模式(想要用此命令必须切换根才可)

  11. 为了避免启动过程中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目录

  1. sysctl命令用于查看或设定此目录中诸多参数
    sysctl -w path.to.parameter=VALUE sysctl -w kernel.hostname=mail.magedu.com
  2. echo命令通过重定向方式也可以修改大多数参数的值
    echo "VALUE" > /proc/sys/path/to/parameter echo “websrv” > /proc/sys/kernel/hostname

3. sysctl命令—{sysctl}

默认配置文件:/etc/sysctl.conf

  1. 设置某参数
    sysctl -w parameter=VALUE
  2. 通过读取配置文件设置参数
    sysctl -p [/path/to/conf_file]
  3. 查看所有生效参数
    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相关注意点

  1. sysctl命令就是通过修改/etc/sysctl.conf文件来永久保存开机之后写入proc/sys文件夹中的各种配置。直接修改proc/sys的方式只能临时修改(比如echo 1修改网卡的数据转发)。
  2. 在这个配置文件中的每一项都省略了/proc/sys标头,这里面的每一项的/标志被换为了.符号
    • 修改之后不会立即生效,使用sysctl -p命令让它立即生效。
    • 如果文件中没有默认写入的配置,则可以手写进去,就比如禁止ping功能的项。不过要注意格式。
  3. 但是要注意如果生效的项被删除了,则用sysctl -p命令重新载入的时候不会修改被删除的这一项的值。因为它只是读入此文件并加载到内存中配置,如果不相同的设置才会覆盖掉。 删除掉某一项相当于没有配置,因此只能修改文件中每一项后面的值而不是删除这一项。
  4. 利用sysctl -a命令查看所有正在生效的配置,也可以利用sysctl -w 直接修改文件中的每一项的值。格式也是按照文件中的格式来写的,都是点.的符号
    • 注意用sysctl -w命令就相当于是echo 1 > 文件,它俩是等价的,不能保存修改后的参数
  5. Centos7中此文件为空,只能自己全部手写配置。可先用sysctl -a|grep来查询然后再书写。
  6. 利用man proc来查看各种设置的功能和选项,比如vm.drop_caches因为许多内核默认设置都比较保守,因此需要更改它
    • 更多关于网络的设置先通过man proc之后可以从中知道可以通过man 7 tcpman 7 ip 进行查看

5. 内核相关介绍

  • 单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制
  • 内核组成部分:
    kernel:内核核心,一般为bzImage,通常在/boot目录下名称为 vmlinuz-VERSION-RELEASE kernel object:内核对象,一般放置于/lib/modules/VERSION-RELEASE/ [ ]: N [M]: M [*]: Y
  • 辅助文件:ramdisk
    initrd 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. 附加知识点

  1. NTFS文件格式的支持在epel源中有包可以进行操作。会多一个mount.ntfs命令,对NTFS格式文件系统的分区进行挂载之后便可可读可写。
    yum search ntfs yum install ntfs-3g
最后修改日期: 2021年7月7日

作者

留言

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!

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。