Linux系统启动
1.系统启动流程大概
1)启动BIOS
2)MBR中的引导代码 BootCode
3)执行引导程序
Linux中用的最多的是GRUB;引导程序的主要作用是用来加载内核;
4)加载系统内核
5)执行init
6)runlevel
init根据当前默认的运行级别来启动相关的程序及设备;
2.BIOS (basic input output system)
BIOS称为基本输入输出系统,一般保存在主板中的BIOS芯片中;
计算机启动后,执行的第一个程序就是BIOS;
BIOS负责检查硬件并且查找可启动设备;
可以在BIOS中定义可启动设备;例如USB、CDROM、HD;
所谓的可启动设备,就是设备上具有引导信息;
3.MBR
MBR分区机制中;设备前512个字节为启动信息;其中最后4个字节为55AA的表示可启动;
设备的前446个字节为其引导代码;
BIOS找到可启动设备后执行其引导代码;
引导代码的功能是引导不同的系统;不同的系统有不同的引导代码,比如windows和linux的引导代码就不同;
引导代码用来查找当前的引导程序;因为MBR的字节数有限,只能去用来加载比较复杂的引导程序;
Linux中常用的引导程序是GRUB;
4.GRUB
grub几乎可以用来引导所有的操作系统;
grub的相关文件保存在 /boot/grub 目录中;
/boot目录一般保存与系统启动相关的文件,比如linux内核就保存在这里;
其中 /boot/grub/grub.cfg是启动时的配置文件;可以修改该文件来添加需要引导的设备;
5.内核 KENREL
MBR的引导代码负责找到并加载Linux内核;
Linux的内核保存在 /boot/vmlinuz-版本号 ;
Linux一般还需要加载内核模块的打包文件:/boot/initramfs-版本号.img
Linux为了保持内核的精简,将一些不常用的驱动、功能编译成模块,在需要的时候加载;这些模块被打包成一个 initramfs文件;比如键盘、u盘驱动等;
早期Linux使用的是initrd文件;而initramfs 是 initrd 的优化版本,更加灵活且节省空间;
命令dmesg可以查看本次启动时内核的输出信息;
dmesg
这些信息包括:内核在加载驱动、给内存进行区域划分、初始化主板硬盘u盘usb设备等等;
在出现内核级的故障时需要看这些信息,比如有些设备驱动不起来;
/var/log/dmesg 文件中也保存了这些信息;
总的来说就是说根据grub的配置,来启动内核;
6.INIT
内核启动完后,系统将启动第一个进程,即init;
用 top 命令可以看到一个 pid 为1的进程就是 init;
top
init的作用是调用 /etc/rc.d/rc.sysinit 脚本,负责对系统进行初始化,挂载文件系统,并根据运行级别启动相应服务;
Linux的运行级别:
0 ->关机
1 ->单用户模式
2 ->不带网络的多用户模式
3 ->多用户模式
4 ->未使用
5 ->图形化模式
6 ->重新启动
最常用的运行级别是3和5;它们之间的区别是一个有图形界面,一个只有命令行界面;
init的配置文件:
可以通过 /etc/inittab 修改默认的运行级别;
其它一些配置文件存放在 /etc/init 目录下;
每个启动级别对应的启动服务保存在 /etc/rc.d/rc[0123456].d中;
命令 runlevel 可显示当前及上一个运行级别;
切换运行级别可用init 命令;
例如切换到级别3:
init 3
7.单用户修改root密码
普通用户的密码忘记了,可以用root用户来修改;
如果root用户的密码忘了,可以进入单用户模式来修改;
单用户模式下登录是不需要密码的;即运行级别1;
可以在启动时引导内核时,传递参数 1 或者 single 来进入单用户模式;
单用户模式下不启动任何服务;
在单用户模式下通过命令 passwd 来修改密码;
具体操作:
在启动界面按 上 或 下 键 ,停住;
按 e 开始编辑;
选中内核 kernel 那一行,按e 编辑;
在最后加一个参数 1即可强制内核以级别1单用户模式启动;
按b开始启动;
用命令 passwd 修改密码;
exit 命令退出单用户模式;
但是这样有个隐患:任何人可以接近这台计算机都可以修改root密码;
8.GRUB加密
通过在 /etc/grub/grub.conf 中的启动配置中加入如下参数即可对grub加密:也就是在配置文件中加入一行
password --md5 加密后的密码
grub加密后想在引导时进行修改必需先输入 grub密码;
加密后的密码可通过 grub-md5-crypt 生成;
如果grub密码也忘了,只能将硬盘取下啦,挂载到另外一台linux系统的机器中,找到grub.conf,把加密配置删除掉;
这样还是有安全隐患,如果硬盘被偷走了,就没办法了;那么只能进行分区级别的加密对根分区进行加密;