Linux 系统启动项修复
首先简单了解一下, linux 启动的过程
想要了解详细过程可移步 Linux 系统启动过程
简单来说,系统开机的经过可以汇整成下面的流程的:
1.载入 BIOS 的硬件信息与进行自我测试,并依据设置取得第一个可开机的设备;
2.读取并执行第一个开机设备内 MBR 的 boot Loader (亦即是 grub2, spfdisk 等程序);
3.依据 boot loader 的设置载入 Kernel ,Kernel 会开始侦测硬件与载入驱动程序;
4.在硬件驱动成功后,Kernel 会主动调用 systemd 程序,并以 default.target 流程开机;
- systemd 执行 sysinit.target 初始化系统及 basic.target 准备操作系统;
- systemd 启动 multi-user.target 下的本机与服务器服务;
- systemd 执行 multi-user.target 下的 /etc/rc.d/rc.local 文件;
- systemd 执行 multi-user.target 下的 getty.target 及登陆服务;
- systemd 执行 graphical 需要的服务
1. grup2 引导错误
mbr 的作用是为了记录/boot目录所在分区位置磁盘0磁道1扇区的前446字节
若是不小对这段信息进行了破坏将会导致系统无法启动
可在虚拟机
中执行 dd if=/dev/zero if=/dev/xda bs=446 count=1 进行模拟
1.1 对mbr破坏后未重启机器
直接在 shell 下执行 grub2-install /dev/vda 进行恢复
[root@localhost ~]# grub2-install /dev/vda
执行如下:
1.2 对 mbr 破坏后重启机器
对 mbr 破坏后重启机器会导致无法进行引导进而无法启动机器(如下:)
此时需要依靠外部设备进行帮助,这里我们借助一个与系统系统版本相符的镜像源文件对系统来进行修复
进行下述操作:
1.在真机执行 virt-manager 选择grub2出现错误的虚拟机
2.为 grub2 出现错误的虚拟机添加:storage IDE CDROM (必须关闭虚拟机)
3.添加镜像文件(与系统版本相符的镜像文件)
4.选择:Boot Options 将 IDE CDROM 选到第一个,使开机先识别 ID CDROM
5.打开虚拟机选择: Troubleshooting
6.选择:Rescue a Red Hat Enterprise Linux sustem
7.执行:chroot /mnt/sysimage
8.执行:grub2-install /dev/vda
9.执行:vim /etc/sysconfig/selinux
关闭 selinux 为了开机迅速
10.关闭机器,选择:Boot Options 将IDE CDROM选到最后
11.启动机器
具体执行如下:
1.在真机执行 virt-manager 选择grub2出现错误的虚拟机
2.为 grub2 出现错误的虚拟机添加: storage IDE CDROM (必须关闭虚拟机)
选择
添加 storage IDE CDROM
3.添加镜像文件
4.选择: Boot Options 将 IDE CDROM 选到第一个,使开机先识别 ID CDROM
5.打开虚拟机选择: Troubleshooting
6.选择: Rescue a Red Hat Enterprise Linux sustem
选择后,下面提示:你的系统将会在援助环境下,被挂载到援助环境下的 /mnt/sysimage,选择 continue 继续操作
提醒你,你的系统已经被挂载到援助环境下的 /mnt/sysimage,你可以通过执行 chroot /mnt/sysimage 切换到你真实的系统环境中,并写系统会在退出 shell 后进行重启,选择 ok 继续操作
‘再次提醒你,你的系统已经被挂载到援助环境下的 /mnt/sysimage
7.执行: chroot /mnt/sysimage
8.执行: grub2-install /dev/vda
9.执行: vim /etc/sysconfig/selinux ,关闭 selinux (为了开机迅速)
10.关闭机器,选择: Boot Options 将IDE CDROM选到最后
11.启动机器(可成功启动)
2. 自动引导文件 /boot/grub2/grub.cfg
/boot/grub2/grub.cfg.此文件属于 Linux 系统开启的自动引导文件,通过此文可以自动完成对系统根目录的挂载,linux 内核的初始化和初始化程序的引导,此文件若是缺失,系统则无法自动开启,需要进行手动引导。
若是系统 /boot/grub2/grub.cfg 文件缺失,则开机后需执行如下操作
set root='hd0,msdos1' #设置root读取第一块磁盘的第一个分区,md0表示第一块磁盘,
#msdos表示第一个分区
linux16 /boot/vmlinuz-3.10.0-123.el7.x86_64 ro root=/dev/vda1
#手动进行内核引导,并将根目录只读挂载到 /dev/vda1 上
initrd16 /boot/initramfs-3.10.0-123.el7.x86_64.img
#生动进行引导初始化程序
boot #启动机器
开机后进行 /boot/grub2/grub.cfg 文件的修复
执行:
[root@localhost ~]# grub2-mkconfig > /boot/grub2/grub.cfg
#生成自动引导文件
具体执行如下:
自动引导文件缺失后,开启系统将会进入下示环境:
执行以下操作进行手动引导
1.set root=’hd0,msdos1’
2.linux16 /boot/vmlinuz-3.10.0-123.el7.x86_64 ro root=/dev/vda1
3.initrd16 /boot/initramfs-3.10.0-123.el7.x86_64.img
4.boot
开机后生成自动引导文件
3. 内核程序 /boot/vmlinuz-3.10.0-123.e17.x86_64 缺失
若内核程序 /boot/vmlinuz-3.10.0-123.e17.x86_64 缺失,则系统会因为无法加载内核而无法启动。可以通过外加光盘,通过 Linux 补救程序为系统重新安装符合系统版本的内核程序
内核程序启动系统会显示如下:
先介绍一个命令,可以从安装包中提取文件及程序的命令
[root@localhost Desktop]# rpm2cpio #从RPM Package Manager (RPM)包中提取cpio归档文件
[root@localhost Desktop]# rpm2cpio kernel-3.10.0-123.el7.x86_64.rpm | cpio -id
#将内核安装包内的文件提取出来
cpio #从档案到档案的拷贝文件。
-i: #提取
-d: #在需要的地方创建引导目录。
执行如下:
将当前目录下内核程序安装包内的目录、文件提取出来:
想要重新安装内核程序,可进行如下操作
进行下述操作:
1.在真机执行virt-manager
2.为内核文件的缺失虚拟机添加:storage IDE CDROM
3.添加镜像文件(与系统版本相符的镜像文件)
4.选择:Boot Options 将IDE CDROM选到第一个,使开机先识别ID CDROM
5.打开虚拟机选择:Troubleshooting
6.选择:Rescue a Red Hat Enterprise Linux sustem
7 执行:df
可看到光盘挂载在当前的 /run/install/repo 下,切换到此目录下,可看到光盘内的文件,
安装包等,将Packages内的内核安装包(kernel-3.10.0-123.el7.x86_64.rpm)复制到
真实主机中(此处指虚拟机)的指定目录下目录下。
8.执行:chroot /mnt/sysimage 切换到真实主机根目录
9.切换到/mnt目录后
执行:rpm2cpio kernel-3.10.0-123.el7.x86_64.rpm | cpio -id
#将内核安装包内的文件提取出来
10.执行:cp boot/vmlinuz-3.10.0-327.el7.x86_64 /boot/
#第一个'boot/'是内核安装包内的东西,第二个/boot/是真实主机的根目录,将内核安装
#包内的对应内核程序移动到/boot/下,使机器可以正常运行。
11.关闭机器,选择:Boot Options 将IDE CDROM选到最后
12.启动机器
具体值执行如下:
1~6步与修复 mbr 相同
7. 进入挽救环境后执行:df
**将Packages内的内核安装包(kernel-3.10.0-123.el7.x86_64.rpm)复制到
真实主机中**
df
复制内核程序安装包到真实主机(此处指虚拟机)的指定目录下。
8.执行:chroot /mnt/sysimage/mnt 切换到真实主机根目录,并切换到 内核安装包所在目录
执行:rpm2cpio 命令 将内核安装包内的文件提取出来
执行:cp boot/vmlinuz-3.10.0-327.el7.x86_64 /boot/ 将内核程序拷贝到真实主机 /boot 目录下
第一个’boot/’是内核安装包内的东西,第二个/boot/是真实主机的根目录,将内核安装包内的对应内核程序移动到/boot/下,使机器可以正常运行。
11~12步与修复 mbr 最后两步亦同
4. initramfs 镜像缺失
若是系统的 initramfs-3.10.0-327.el7.x86_64.img 缺失,系统因为无法进行下一步的开机引导而不能启动。(如下:)
想要修复 initramfs 镜像,可进通过挽救程序,进入到系统真实目录对 initramfs 镜像修复
先介绍一个命令 ( mkinitird )
[root@localhost ~]# mkinitrd [选项...] [<initrd映像文件>] <内核版本>
#是一个compat包装器,它调用dracut来生成一个initramfs
执行如下命令进行修复 initramfs
[root@localhost ~]# mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
uname -r #显示内核版本号
在bash中,$( )与` `(反引号)都是用来作命令替换的。
命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,
再重组成新的命令行。
$( )的弊端是,并不是所有的类unix系统都支持这种方式,但反引号是肯定支持的。
上述指令等同于:
mkinitrd /boot/initramfs-3.10.0-123.el7.x86_64.img 3.10.0-123.el7.x86_64
示例如下:
修复 initramfs 镜像需要执行如下操作
进行下述操作:
1.在真机执行virt-manager
2.为内核文件的缺失虚拟机添加:storage IDE CDROM
3.添加镜像文件(与系统版本相符的镜像文件)
4.选择:Boot Options 将IDE CDROM选到第一个,使开机先识别ID CDROM
5.打开虚拟机选择:Troubleshooting
6.选择:Rescue a Red Hat Enterprise Linux sustem
7 执行:chroot /mnt/sysimage 切换到真实主机根目录
8.执行:mkinitrd /boot/initramfs-3.10.0-123.el7.x86_64.img 3.10.0-123.el7.x86_64
#恢复 initramfs 镜像
9.关闭机器,选择:Boot Options 将IDE CDROM选到最后
10.启动机器
具体执行如下
1~6步与修复 mbr 相同
7 执行:chroot /mnt/sysimage 切换到真实主机根目录
8.执行:mkinitrd /boot/initramfs-3.10.0-123.el7.x86_64.img 3.10.0-123.el7.x86_64
9~10步与修复 mbr 最后两步亦同
5. 系统启动级别发生错误
介绍一下 Linux 系统启动的级别
- Linux 启动级别分为六种 0-6
0 :为停机,机器关闭。
1 :为单用户模式,就像Win9x下的安全模式类似。
2 :为多用户模式,但是没有NFS支持。
3 :为完整的多用户模式,是标准的运行级。
4 :一般不用,在一些特殊情况下可以用它来做一些事情。例如在笔记本电脑的电池用尽时,可以切换到这个模式来做一些设置。
5 :就是X11,进到X Window系统了。
6 :为重启,运行init 6机器就会重启。
Linux 是可以通过通过 systemctl 指令来管理不同的操作环境 (target unit)而跟操作界面相关性比较高的 target 主要有下面几个:
graphical.target: 文字加上图形界面,这个项目已经包含了下面的 multi-user.target
项目!
multi-user.target: 纯文本模式!
rescue.target: 在无法使用 root 登陆的情况下,systemd 在开机时会多加一个额外的暂
时系统,与你原本的系统无关。这时你可以取得 root 的权限来维护你的系统。
emergency.target: 紧急处理系统的错误,还是需要使用 root 登陆的情况,在无法使用
rescue.target 时,可以尝试使用这种模式!
shutdown.target: 关机的流程。
getty.target: 可以设置你需要几个 tty 之类的,如果想要降低 tty 的项目,可以修改这个
东西的配置文件
如果不小心将开机启动级别改为了 shutdown.target
可以通过
[root@localhost ~]# systemctl set-default <target名>
来进行开机启动的设置
如是错误的将开机启动目标设置为了 shutdown.target 将会直接关闭系统而导致机器无法启动(如下:)
此时需要进行对开机启动级别的修复,首先先要进行正常的进入系统才行
1. 在上述界面下点击 Ctrl+Alt+Delete / Ctrl+Alt+End,进入系统选择界面
2. 出现上述界面后,快速点击键盘上下键,否则将又会进入最开始那无法进入系统的界面。再次界面点击 ‘E’ 键进入编辑界面
3. 在编辑界面 linux16 * 一行最后加上 ‘5’ ,后点击 Ctrl+x ,就可正常启动
4. 启动机器后在 shell 下执行 systemctl set-default graphical.target 将开机级别设置为图形界面,就完成了系统启动级别的修复