系统启动原理
linux系统启动的时候,会读取磁盘的第一个块(512字节)到内存,然后跳转到一个固定地址开始执行这个不超过512字节的程序,这个简短的程序被称为boot loader,一般是汇编代码写成。这个bootloader可以实现将操作系统代码加载到内存,切换cpu的模式,建立内存映射表等,然后跳转到操作系统的第一条代码运行。但是这个boot loader也可以加载另外一个bootloader,然后由另外一个boot loader将操作系统从磁盘加载到内存运行。第一阶段的boot loader有bios和uefi两种,现在主流的第二阶段的boot loader是grub2。grub2支持通过菜单选择一个操作系统进行启动,编辑操作系统启动参数。
系统启动模式可以使用UEFI模式或者BIOS模式,UEFI的全称是统一可扩展固件接口,特点是标准化,开放统一和开源。UEFI模式启动的时候会在磁盘上寻找ESP( EFI system partition,一种文件系统)(往往就是文件系统/boot/efi),挂载ESP,执行EFI程序(redhat上就是/boot/efi/EFI/redhat/grub.efi,boot loader程序)。
区分bios和uefi
uefi启动的系统会存在/sys/firmware/efi文件夹,grep efi /var/log/boot.log可以看到efi的信息
grub配置
grub2-mkconfig可以通过读取/etc/default/grub和/etc/grub.d/*生成新的配置文件
#修改启动的时候在grub菜单界面等待的时间,默认5秒
#在配置文件/etc/default/grub里面设置
GRUB_TIMEOUT=10
#使用grub2-mkconfig生成新的grub.cfg
#uefi模式的配置文件路径为/boot/efi/EFI/redhat/grub.cfg
#bios模式的配置文件路径为/boot/grub2/grub.cfg
grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
#重启验证配置,启动的时候在grub菜单界面会有10s倒计时
reboot
#如果系统安装了多个版本的内核,可以修改默认启动的内核
#查看所有内核
grubby --info=ALL #可以看到每个内核都有一个编号
#查看默认启动内核
grubby --default-kernel
grubby --default-index
#设置默认内核
grubby --set-default-index=N #N是内核编号
#重启验证配置
reboot
swap分区删除后无法启动
- 现象:在启动的过程中看到找不到swap分区对应的lv的报错。
- 处理:可以挂载系统镜像,选择troubleshooting,选择rescue,按照提示chroot切换根目录,删除/etc/default/grub里面的内核启动参数resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/swap,使用grub2-mkconfig重新生成grub.cfg即可。
- 解释:linux操作系统镜像提供的troubleshooting功能可以通过启动一个较小的系统,然后找到磁盘上安装的操作系统并且将根目录挂载到/mnt/sysimage下面,然后就可以修改/mnt/sysimage下面的文件来恢复系统。
系统故障而且无法进入grub界面
- 现象:在浪潮私有云环境,,有个服务器的基础so(ssl,crypt)文件被篡改,导致系统无法ssh连接,图形界面无反应
- 处理:第一解决思路是进入单用户模式,尝试使用sftp传输so文件进行恢复,但是grub默认是5秒等待,连进去的时候已经跳过了grub界面。第二个方案是将系统的云硬盘克隆一份,挂载到其他系统,恢复文件,新建虚拟机,使用克隆盘启动进入系统。第二个方案成功了。因为都是相同的虚拟机镜像安装的虚拟机,会碰到uuid冲突的情况,关键命令vgimportclone,mount -o nouuid,xfs_admin。
- 经验教训:cp a b的时候,如果b是链接,就会使用文件a覆盖链接b指向的文件;当应用需要使用和系统版本不符的so文件,还是应该通过建立单独的lib文件,然后通过修改LD_LIBRARY_PATH来添加lib。