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