1、开机启动过程

POST(开机自检)—>MBR(bootloader)—>kernel(initramfs)—>挂载rootfs(ro)—>运行systemd—>系统初始化—>启动终端

 

  • 加电自检,有任何硬件故障,会有警报声

  • 通过BIOS里的设置,找到引导盘,然后读取这个引导盘的第一个扇区(512字节)的前446字节,加载bootloader主程序

  • 注:第一个扇区的512字节,前446字节用于bootloader,中间64字节是分区表,最后2个字节是标识位,用来检验MBR扇区。通常所说的MBR,就是指这前446字节的空间,这个空间里,放了bootloader(开机引导程序,RHEL7以前用的bootloader叫grub,RHEL7用的是grub2)

  • 读取第2-27扇区,里面存放着/boot所在分区的驱动,这是在系统安装后,就确定好的。我们就可以找到/boot/grub2/grub.cfg,即grub2的配置文件。

  • 通过配置文件,加载系统内核,并将控制权交由内核

  • 内核需要去加载模块:/lib/modules,但内核自身并没有硬盘的驱动(linux内核自带IDE驱动,但现在的SATA硬盘,是用SCSI模块来驱动的),而驱动又在硬盘内,所以系统安装完成后,会创建一个伪文件系统来解决这个问题:/boot/initramfs,提供开机过程中所需的最重要核心模块。

  • 通过initramfs加载到磁盘驱动,并以只读方式挂载真正的根,加载驱动以及模块。

  • 以读写方式重新挂载根

  • 启动systemd进程及子进程

 

#查看initramfs里面内容

lsinitrd /boot/initramfs-3.10.0-229.el7.x86_64.img |more

 

#创建initramfs文件

mkinitrd /mnt/initramfs.img $(uname -r)

 

#同上,创建initramfs文件

dracut /mnt/initramfs2.img $(uname -r)

 

2、grub

  • stage1,它被安装在MBR扇区(0面0道第1扇区),它负责加载存放于0面0道第2扇区的start程序。

  • stage1_5,由start加载,位于0面0磁道的第3扇区开始到第N个扇区(由文件系统驱动大小而定),它负责识别文件系统和加载stage2,所以stage1_5往往有多个,以支持不同文件系统的读取。在安装GRUB的时候,GRUB会根据当前/boot/分区类型,加载相应的stage1_5到0面0磁道的第3扇区。

  • stage2,存放在文件系统:/boot/groub下,因为有了stage1_5,可以识别文件系统了,就可以直接读取文件系统内的文件了。它负责显示启动菜单和提供用户交互接口,并根据用户选择或默认配置加载操作系统内核。

  • menu.lst(/boot/grub/grub.conf的链接),grub.conf是一个基于脚本的文本文件,其中包含菜单显示的配置和各个操作系统的内核加载配置。GRUB根据grub.conf显示启动菜单,提供同用户交互界面。GRUB正是根据用户选择或默认配置和grub.conf的内核配置加载相应的内核程序,并把控制权交给内核程序,使得内核程序完成真正的操作系统的启动。

 

2.1、grub2配置文件

vim /boot/grub2/grub.cfg

#开机启动时菜单项,名字叫:CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)

menuentry 'CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menue

ntry_id_option 'gnulinux-3.10.0-957.el7.x86_64-advanced-b4074213-7053-41bd-bccf-52bca384058e'

--class,指定该菜单的主题样式

--unrestricted,允许所有用户访问此菜单

--id,为此菜单设置一个全局唯一标识符

{},里面的内容表示如果选中该项,将会执行的内容

 

set gfxpayload=keep

设置linux内核启动时的视频模式,值可为:keep,auto,宽*高,宽*高*色深

keep,继承gfxmode的值

auto,自动检测

宽*高,自定义分辨率

 

set root='hd0,msdos1'

指定grub的根在哪儿,也就是/boot目录在哪个分区

hd0,表示BIOS中设置的开机引导的第一个磁盘

msdos1,表示第一个分区

 

search --no-floppy --fs-uuid --set=root 41b0dafb-1efe-4df6-8169-b9c484fafcd4

通过文件[--file]、卷标[--label]、文件系统UUID[--fs-uuid]来查找设备。

--set,将第一个找到的设备设置为'root'。

--no-floppy,禁止查找软盘设备,因为这些设备非常慢。

 

linux16 /vmlinuz-3.10.0-957.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/

swap rhgb quiet LANG=en_US.UTF-8

加载一个linux内核,并将其余的字符作为内核的参数传入。

/vmlinuz,指定内核所在位置。这里的根指的是上面指定的分区,也就是在/boot,如果没有为boot单独分区,就在系统/下面,这里就会在前面加上/boot

root,这里的root,表示指定系统的根在哪儿

crashkernel=auto,当系统内存小于等于8G时,不会给kdump kernel保留内存,想当于关掉了kdump功能。(kdump,用于内核崩溃时,启动第二内核,捕获崩溃信息)

rd.lvm.lv,表示仅激活给定名称的逻辑卷。可以在内核命令行上多次指定rd.lvm.lv

rhgb,表示redhat graphics boot,使用图片来代替启动过程中显示的文本信息,这些信息在启动后用dmesg也可以看到

quiet,静默显示,在启动过程中只显示重要信息,类似硬件自检的消息不显示

 

initrd16 /initramfs-0-rescue-1932834215ba4fc3be769129b325364d.img

指定虚拟文件系统在哪儿

 

2.2、修改grub2配置文件

    /boot/grub2/grub.cfg这个文件不建议直接修改,而是应该通过/etc/default/grub和/etc/grub.d目录内的配置文件进行修改

/etc/grub.d,此目录下,是一些脚本来协助完成grub.cfg的自动创建

/etc/default/grub,此文件是为上面脚本提供变量的文件,我们要改的,也就是这个文件,修改变量的值。

 

vim /etc/default/grub

#设置倒计时,单位秒

GRUB_TIMEOUT=5

 

#设置默认开机选项

#默认为0,表示grub.cfg里排在最前面的哪个menuentry

#可用选项:saved,数字,titile名称,ID

GRUB_DEFAULT=saved

 

#是否隐藏次菜单

GRUB_DISABLE_SUBMENU=true

 

#开机过程显示终端

#选项有:console,serial,gfxterm,vga_text

GRUB_TERMINAL_OUTPUT="console"

 

#内核启动的时候,需要加入的额外参数

#也就是linux16后面的内容

GRUB_CMDLINE_LINUX="rd.lvm.lv=rhel/swap crashkernel=auto rd.lvm.lv=rhel/root rhgb quiet"

 

#取消救援模式的选项

GRUB_DISABLE_RECOVERY="true"

 

#重新生成grub.cfg

grub2-mkconfig -o /boot/grub2/grub.cfg

 

 

3、实验1

#破坏引导盘

dd if=/dev/zero of=/dev/sda bs=1 count=300

这时只能通过光盘或U盘启动,进入Troubleshooting,选择Rescure模式,continue,ok

 

#切换到真实的根

chroot /mnt/sysimage

 

#安装gurb2,会装到vda硬盘的第一个扇区

grub2-install /dev/vda 

exit

reboot

 

4、实验2

#备份第一个扇区

dd if=/dev/sda of=/tmp/sda bs=1 count=512

 

#拷贝到server

scp /tmp/sda root@server:/tmp

 

#这时不仅MBR没了,分区也没了

dd if=/dev/zero of=/dev/sda bs=1 count=500

 

重启出现:booting from hard disk.....

从光盘启动,进入rescure模式

只要将相同的分区的系统的前512字节,写过来就好了

 

#先配个IP,把远端的备份数据拷过来,或U盘也可以

ip addr addr 10.0.0.2/24 dev eth0 

 

#恢复

dd if=file of=/dev/sda

reboot

 

5、实验3

#删除grub配置文件

rm -f /boot/grub2/grub.cfg

 

#重启就会进入grub,因为没有配置文件,需要手动输入配置信息

insmod xfs

set root='hd0,msdos1'

linux16 /boot/vmlinuz-3.10.0-123.el7.x86_64 root=/dev/vda1

initrd16 /boot/initramfs-3.10.0-123.el7.x86_64.img

boot

 

#又可以进入系统了,但下次启动还是会这样,所以要重新创建这个文件

#这条命令是通过系统模板:/etc/grub.d这个目录下面的内容,重建grub.cfg

grub2-mkconfig > /boot/grub2/grub.cfg

 

6、内核模块

linux内核特点:

linux内核也汲取了微内核设计体系的优点,引入内核模块化机制。

支持模块的动态装载和卸载

 

linux内核组成部分:

核心文件:/boot/vmlinuz-3.10.0-327.el7.x86_64

模块文件:/lib/modules/3.10.0-327.el7.x86_64/

模块之间也是有依赖性的,关于依赖性已经写好在:/lib/modules/3.10.0-229.el7.x86_64/modules.dep

 

#内核模块所在位置

ls /lib/modules/$(uname -r)/kernel

arch,硬件平台相关

crypto,加密相关,如:md5,des等

drivers,驱动

fs,所支持的文件系统

lib,函数库

net,网络相关,及防火墙模块netfilter等

sound,与音频相关模块

 

6.1、查看内核模块

#查看当前已经加载的内核模块

lsmod

 

#查看一个模块的信息

modinfo drm

 

#只显示模块文件路径

modinfo -n drm

-p,显示模块参数

 

6.2、加载内核模块

#加载vfat模块

#modprobe命令会去查看modules.dep文件,自动解决依赖性

#modprobe命令加载模块,不要加后缀

modprobe vfat

 

#因为vfat要依赖fat模块,所以加载了vfat,fat模块也加载

#查看vfat的依赖关系

grep vfat /lib/modules/3.10.0-957.el7.x86_64/modules.dep

 

#验证

lsmod |grep fat

 

6.3、卸载内核模块

#卸载vfat

modprobe -r vfat

 

#依赖模块也会被同时卸载

lsmod |grep fat

 

6.4、永久加载模块

#启动时会从/etc/sysconfig/modules目录下,所有以.modules结尾的文件中加载模块。

vim /etc/sysconfig/modules/xx.modules

modprobe vfat

 

chmod 755 /etc/sysconfig/modules/*.modules

 

7、内核参数

内核参数分两类:

只读:输出信息

可写:可接受用户指定的新值,来实现对内核功能或特性的配置

 

/proc目录:

内核把自己内部状态信息及统计信息,以及可配置参数通过proc这个伪文件系统加以输出。

 

/sys目录:

输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息。有些参数可修改,用于调整配件工作特性

udv通过此路径下输出的信息,动态为各设备创建所需的设备文件。

 

7.1、查看

#查看所有内核参数

sysctl -a

 

#查看映射文件

cat /proc/sys/kernel/hostname

 

7.2、修改

#修改内核参数hostname的值

#此内核参数为设置主机名

#实际路径:/proc/sys/kernel/hostname

sysctl -w kernel.hostname=test

 

#同上

echo "desktop0.example.com" > /proc/sys/kernel/hostname

 

7.3、永久生效

#启动时会从/etc/sysctl.conf文件加载内核参数

vim /etc/sysctl.conf

kernel.hostname = node1.example.com

 

#读取上面配置文件中的配置,并生效

sysctl -p

 

7.4、例1 禁ping

ping localhost

cat /proc/sys/kernel/hostname

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

ping localhost

 

vim /etc/sysctl.conf

net.ipv4.icmp_echo_ignore_all = 1

 

sysctl -p

 

7.5、例2 打开转发功能

vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

 

sysctl -p

 

8、破解root密码

  • 开机,快速的按上下键,选择第一个

  • 按下字母e

  • 找到linux16开头的行

  • 到该行的最后,删除到ro

  • 把ro 改成 rw rd.break

  • ctrl+x

  • chroot /sysroot/

  • passwd root,修改root密码

  • touch /.autorelabel,让系统启动的时候,根据默认值,重写selinux安全上下文,因为在rd环境下,没有selinux,而上面改密码,也就是修改/etc/shadow文件,会将这个文件的selinux安全上下文取消,如果没这步,系统起不来

  • exit

  • reboot