web服务器运维笔记,DevOps故障排-linux服务器运维最佳实践---读书笔记

第三章:为什么系统无法启动?解决启动问题

(1)linux启动流程

(2)BIOS

(3)GRUB2 MBR

GRUB2配置文件/etc/default/grub,实际配置文件为/boot/grub/grub.cfg,但这个文件通常有脚本生成,所以修改了/etc/default/grub 后要运行/usr/sbin/update-grub这个脚本生成新的grub.cfg文件,如果手动修改/boot/grub/grub.cfg需要按照grub2的脚本语法来。

如果需要在MBR重新安装GRUB2,/sbin/grub-install /dev/sda 这里的sda需要替换成你的根分区设备,可以df 那个设备是/mnt/sysimage或者查看/boot/grub/grub.conf文件。如果是恢复光盘那么使用linux rescue启动选项启动系统,在执行前应该执行 chroot /mnt/sysimage挂载根分区。

GRUB启动内核传参有root=/dev/sda2; root=LABEL=/ ;或者root=UUID=234d3f83-34fe-3f44-h434-98df3f8f82f2这样的字符串,第一种方式在老式系统中常见,现在系统中一般使用了UUID,当新增加一块硬盘时之前的/dev/sda2可能变成了/dev/sdb2.相要解决设备名称更改的问题,所以引入了标识如把根分区可能用/或者root来标识,/home分区可能用home或者/home来标识,GRUB不使用root=这行来指定设备,而使用标识(如root=LABEL=/)来指定,就算更改了实际设备名称标签不会变,系统内容还是会找到根分区的。标签用来解决设备名称更改问题,但引入了一个新的问题,当两个标签相同时,如果新增的硬盘有自己的/和root标签,那么内核可能无法挂载你想要的标签,这样一些系统引入了UUID(通用唯一标识符)即root=UUID=234d3f83-34fe-3f44-h434-98df3f8f82f2。这里还有三个地方需要注意,一个是/etc/fstab,一个是e2label /dev/sda2 /这样给那个分区一个标签,另一个是blkid -s UUID /dev/sda2 查看待定分区的UUID值。有了这些就可以合理修改GRUB的启动配置。

(4)内核与初始化RAM磁盘

GRUB载入linux核心时会传入启动时配置的所有参数,通常GRUB也会随着内核载入一个初始RAM磁盘(Initial RAM Disk, Initrd),在现代linux系统中它通常是一个gzip格式压缩的备份文档,称为initramfs文件,一般包含一个基本的小型linux根文件系统,在这个文件系统中,有一些重要的配置文件,内核模块以及内核需要用来寻找并挂载真实的根文件系统的程序。

以前启动时的这些功能都直接构建在linux的内核中,但是随着硬件的开始支持很多不同的文件系统以及SCSI和IDE设,并带有一些额外特性(如RAID,LVM),内核变得越来越大。因此,这些特性被分拆到独立的模块中,这样就可以仅仅载入系统所需要的模块,因为硬件驱动器和文件系统支持都分拆到了模块中,所以你会面临鸡和蛋的问题,如果模块处于根文件系统中,而你又需要用这些模块来读取根文件系统,怎么才能完成持载?解决方法是把这些重要模块都放入初始化RAM磁盘中。

随着内核的启动,它会将initramfs文件解压到RAM中,然后利用initramfs文件的根目录中运行一段名为init的脚本,这仅仅是一个标准的shell,用来先检测硬件,然后创建挂载点,之后再挂载根文件系统,因为这个路径是由GRUB在它首次加载时传入的一个启动参数(root=),所以系统内核知道根文件系统在哪里。在挂载了真正的根文件系统之后,initramfs文件的最后一步是执行/sbin/init程序,后者会接管启动流程中的其它工作。

/sbin/init(System V Init)新的systemd另外再找资料

init有0-6共7个等级,会先读取/etc/inittab文件确定进入那个等级,一般0关机,1为单用户,6重启,是init定义好的,2-5为发行版使用,3一般为文本模式多用户,5为图形模式多用户。

/etc/init.d 该文件夹包含所有服务在各个运行等级中的全部启动脚本,一般说来都是标准shell,最少接收start和stop两个参数,有些还提供restart,status,reload,force-reload等。

/etc/rc0.d - /etc/rc6.d 这些文件夹包含每个运行等级的对应的init脚本,实际使用中一般都是通过符号链接到/etc/init.d文件夹下的实际文件,命名都是以S(start),K(kill)或D(disable)开头,后面跟一个数字。当init进入一个运行等级的时候,它会按照数字顺序运行以K开头的脚本并传入stop参数,除非对应的init脚本在前一个运行等级中没有启动。然后init按照数字顺序运行所有以S开头的脚本并传入start参数,任何以D开头的init脚本都会被忽略--这可以让你指定的等级禁止一个脚本。资料上还提到了/etc/rcS.d/该文件夹不过在centos6.5上是没有,不过有rc.sysinit脚本。最后系统一般会在init结束的时候运行rc.local脚本,所以要想启动点东西时可以来改这个文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值