1.什么是linux系统故障?
2.什么是grub?
3.grub坏了我们怎么恢复?
4.grub恢复的具体方法?
本次实验由于需要多次重启虚拟机,我们就不选择用xshell远程连接了。
VMware Workstation
centos7
https://baike.baidu.com/item/LINUX%E7%B3%BB%E7%BB%9F%E6%95%85%E9%9A%9C%E8%AF%8A%E6%96%AD%E4%B8%8E%E6%8E%92%E9%99%A4/7044754?fr=aladdin
GRUB
GNU GRUB是一个非常强大的引导加载程序,是计算机启动时运行的第一个程序,它负责将控制加载转移到操作系统内核软件。
GRUB起源于1995年,当时Erich Boleyn试图用犹他大学的Mach 4微内核(现在称为GNU Mach)启动GNU Hurd。埃里希和布莱恩·福特设计了多重引导规范,因为他们决定不加入大量的互不兼容的PC的启动方式。
在接下来的几年里,GRUB被扩展以满足许多需求,但很快就发现它的设计没有跟上它所做的扩展,我们已经达到了如果没有进行任何进一步改变就很难破坏现有功能。
GRUB2
大约在2002年,Yoshinori K. Okuji开始研究PUPA(GNU GRUB的初步通用编程架构),旨在重写GRUB的核心,使其更清洁,更安全,更强大,更强大。
PUPA最终被重命名为GRUB 2,GRUB的原始版本被重命名为GRUB Legacy。
GRUB Legacy继续进行少量维护,但最后一个版本(0.97)是在2005年完成的,在撰写本文时,似乎不太可能会有另一个版本。
到2007年左右,GNU / Linux发行版开始将GRUB 2用于有限的范围,到2009年底,默认情况下会安装多个主要发行版。
GRUB功能
GRUB主要实现目标:
1、对用户来说,基本功能要简单明了;
2、功能丰富,要支持内核的各种参数定制配置;
3、用于启动FreeBSD,NetBSD,OpenBSD和Linux的向后兼容性。通过链加载功能支持专有内核(如DOS,Windows NT和OS / 2)。
除了特定的兼容模式(链式加载和Linux 搭载格式)之外,所有内核都将以与多引导规范中相同的状态启动。
GRUB具有以下功能:
1、识别多种可执行格式:支持许多a.out变体和ELF。符号表也会加载。
2、支持非多引导内核:支持许多缺少多引导兼容性的免费32位内核(主要是FreeBSD,NetBSD 2,OpenBSD和Linux)。还支持其他引导加载程序的链加载。
3、加载多个模块:完全支持加载多个模块的多重引导功能。
4、加载配置文件:支持具有预设引导命令的人类可读文本配置文件。您还可以动态加载另一个配置文件,并将预设配置文件嵌入GRUB映像文件中。命令列表(请参阅命令)是命令行支持的超集。一个示例配置文件中提供 的配置。
5、提供菜单界面:可以使用菜单界面列出具有可编程超时的预设引导命令。引导条目的数量没有固定限制,当前实现有几百个空间。
6、拥有灵活的命令行界面:可从菜单访问的相当灵活的命令行界面可用于编辑任何预设命令,或从头开始编写新的启动命令集。如果没有配置文件,GRUB将退回到命令行;命令列表是配置文件支持的子集。编辑命令非常类似于bash命令行(见命令行编辑在bash特性),用TAB命令,设备,分区和文件的完井中根据上下文的目录。
7、支持多种文件系统类型:透明地支持多种文件系统类型,以及有用的显示阻止列表表示法。目前支持的文件系统类型是Amiga Fast FileSystem(AFFS),AtheOS fs,BeFS, BtrFS(包括raid0,raid1,raid10,gzip和lzo), cpio(小端和大端bin,odc和newc变体), Linux ext2 / ext3 / ext4,DOS FAT12 / FAT16 / FAT32,exFAT,HFS, HFS +,ISO9660(包括Joliet,Rock-ridge和多块文件), JFS,Minix fs(版本1,2和3),nilfs2, NTFS(包括压缩),ReiserFS,ROMFS, Amiga智能文件系统(SFS),Squash4,tar,UDF, BSD UFS / UFS2,XFS和ZFS(包括lzjb,gzip,zle,镜像,条带,raidz1 / 2/3和加密)在AES-CCM和AES-GCM中)。
8、支持自动减压:可以解压缩gzip或 xz3压缩的文件。该功能对用户来说是自动且透明的(即所有功能都对指定文件的未压缩内容进行操作)。这大大减少了文件大小和加载时间,对于软盘来说是一个特别大的好处。某些内核模块应该以压缩状态加载,因此可以指定不同的模块加载命令以避免解压缩模块。
9、访问任何已安装设备上的数据:支持从BIOS识别的任何或所有软盘或硬盘读取数据,与根设备的设置无关。
10、独立于驱动器几何转换:与许多其他引导加载程序不同,GRUB使特定的驱动器转换无关紧要。安装并运行一个转换的驱动器可以转换为另一个转换,而不会对GRUB的配置产生任何不利影响或更改。
11、检测所有已安装的RAM:GRUB通常可以在PC兼容的机器上找到所有已安装的RAM。它使用先进的BIOS查询技术来查找所有内存区域。由于在多重引导规范(见描述动机在多重引导规范),不是所有的内核利用这些信息,但是GRUB提供它那些谁做。
12、支持逻辑块地址模式:在传统的磁盘调用(称为CHS模式)中,存在几何转换问题,即BIOS无法访问1024个柱面,因此可访问空间限制为至少508 MB且最多为8 GB。GRUB不能普遍解决这个问题,因为所有机器都没有使用标准接口。但是,一些较新的机器具有新的接口,即逻辑块地址(LBA)模式。GRUB会自动检测LBA模式是否可用,并在可用时使用它。在LBA模式下,GRUB可以访问整个磁盘。
13、支持网络启动:GRUB基本上是基于磁盘的引导加载程序,但也具有网络支持。您可以使用TFTP 协议从网络加载操作系统映像。
14、支持远程终端:为了支持没有控制台的计算机,GRUB提供远程终端支持,以便您可以从远程主机控制GRUB。目前仅实现串行终端支持。
GRUB2改进
1、在GRUB可以手动直接编辑/boot/grub/menu.lst文件,来编辑启动文件;在GRUB2中有一个grub的配置文件/etc/default/grub,编辑对应的选项再使用grub-mkconfig来生成grub.cfg文件。
2、GRUB2引导菜单启动项是从/boot自动生成的,不是有menu.lst配置的。
3、分区编号发生变化:第一个分区现在是1而不是0,但第一个设备仍然以0开始计数,如hd0。
4、界面的定制更加灵活,在GRUB2有主题支持。
5、自动搜索可用的内核和硬盘中的可用系统。
首先,当grub坏了的时候,我们重启虚拟机,会发现进入到grub>这个界面,这个界面是告诉我们我们可以手写grub的启动配置文件,这是方法一。然后就是我们今天的实验了,从启动菜单中通过镜像来重写grub里面的配置文件,这是方法二。
首先我们来说一下方法一:
方法一:
在虚拟机完好的时候,我们找到grub2里面,查看里面的grub.cfg文件
[root@localhost ~]# cat /boot/grub2/grub.cfg
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub2-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
### BEGIN /etc/grub.d/00_header ###
set pager=1
if [ -s $prefix/grubenv ]; then
load_env
fi
if [ "${next_entry}" ] ; then
set default="${next_entry}"
set next_entry=
save_env next_entry
set boot_once=true
else
set default="${saved_entry}"
fi
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
else
menuentry_id_option=""
fi
export menuentry_id_option
if [ "${prev_saved_entry}" ]; then
set saved_entry="${prev_saved_entry}"
save_env saved_entry
set prev_saved_entry=
save_env prev_saved_entry
set boot_once=true
fi
function savedefault {
if [ -z "${boot_once}" ]; then
saved_entry="${chosen}"
save_env saved_entry
fi
}
function load_video {
if [ x$feature_all_video_module = xy ]; then
insmod all_video
else
insmod efi_gop
insmod efi_uga
insmod ieee1275_fb
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
fi
}
terminal_output console
if [ x$feature_timeout_style = xy ] ; then
set timeout_style=menu
set timeout=5
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
set timeout=5
fi
### END /etc/grub.d/00_header ###
### BEGIN /etc/grub.d/00_tuned ###
set tuned_params=""
set tuned_initrd=""
### END /etc/grub.d/00_tuned ###
### BEGIN /etc/grub.d/01_users ###
if [ -f ${prefix}/user.cfg ]; then
source ${prefix}/user.cfg
if [ -n "${GRUB2_PASSWORD}" ]; then
set superusers="root"
export superusers
password_pbkdf2 root ${GRUB2_PASSWORD}
fi
fi
### END /etc/grub.d/01_users ###
### BEGIN /etc/grub.d/10_linux ###
menuentry 'CentOS Linux (3.10.0-693.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-693.el7.x86_64-advanced-5cfaac82-4194-4195-af05-7d40616118b7' {
load_video
set gfxpayload=keep
insmod gzio
insmod part_msdos
insmod xfs
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1' 1592aaf3-4910-4fca-baaa-53d8eb1e6262
else
search --no-floppy --fs-uuid --set=root 1592aaf3-4910-4fca-baaa-53d8eb1e6262
fi
linux16 /vmlinuz-3.10.0-693.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
initrd16 /initramfs-3.10.0-693.el7.x86_64.img
}
menuentry 'CentOS Linux (0-rescue-39f75f8b9d404d8eb776a1608f548431) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-39f75f8b9d404d8eb776a1608f548431-advanced-5cfaac82-4194-4195-af05-7d40616118b7' {
load_video
insmod gzio
insmod part_msdos
insmod xfs
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1' 1592aaf3-4910-4fca-baaa-53d8eb1e6262
else
search --no-floppy --fs-uuid --set=root 1592aaf3-4910-4fca-baaa-53d8eb1e6262
fi
linux16 /vmlinuz-0-rescue-39f75f8b9d404d8eb776a1608f548431 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet
initrd16 /initramfs-0-rescue-39f75f8b9d404d8eb776a1608f548431.img
}
### END /etc/grub.d/10_linux ###
### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###
### BEGIN /etc/grub.d/20_ppc_terminfo ###
### END /etc/grub.d/20_ppc_terminfo ###
### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###
### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###
### BEGIN /etc/grub.d/41_custom ###
if [ -f ${config_directory}/custom.cfg ]; then
source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then
source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###
然后,我们删除这个文件并重启。
[root@localhost ~]# rm -rf /boot/grub2/grub.cfg
[root@localhost ~]# init 6
重启后,我们会发现这种情况。
这个是什么意思?这个的意思就是让我们手写grub的启动菜单(个人建议:非大佬不要尝试)
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub2-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
### BEGIN /etc/grub.d/00_header ###
set pager=1
if [ -s $prefix/grubenv ]; then
load_env
fi
if [ "${next_entry}" ] ; then
set default="${next_entry}"
set next_entry=
save_env next_entry
set boot_once=true
else
set default="${saved_entry}"
fi
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
else
menuentry_id_option=""
fi
export menuentry_id_option
if [ "${prev_saved_entry}" ]; then
set saved_entry="${prev_saved_entry}"
save_env saved_entry
set prev_saved_entry=
save_env prev_saved_entry
set boot_once=true
fi
function savedefault {
if [ -z "${boot_once}" ]; then
saved_entry="${chosen}"
save_env saved_entry
fi
}
function load_video {
if [ x$feature_all_video_module = xy ]; then
insmod all_video
else
insmod efi_gop
insmod efi_uga
insmod ieee1275_fb
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
fi
}
terminal_output console
if [ x$feature_timeout_style = xy ] ; then
set timeout_style=menu
set timeout=5
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
set timeout=5
fi
### END /etc/grub.d/00_header ###
### BEGIN /etc/grub.d/00_tuned ###
set tuned_params=""
set tuned_initrd=""
### END /etc/grub.d/00_tuned ###
### BEGIN /etc/grub.d/01_users ###
if [ -f ${prefix}/user.cfg ]; then
source ${prefix}/user.cfg
if [ -n "${GRUB2_PASSWORD}" ]; then
set superusers="root"
export superusers
password_pbkdf2 root ${GRUB2_PASSWORD}
fi
fi
### END /etc/grub.d/01_users ###
### BEGIN /etc/grub.d/10_linux ###
menuentry 'CentOS Linux (3.10.0-693.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-693.el7.x86_64-advanced-5cfaac82-4194-4195-af05-7d40616118b7' {
load_video
set gfxpayload=keep
insmod gzio
insmod part_msdos
insmod xfs
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1' 1592aaf3-4910-4fca-baaa-53d8eb1e6262
else
search --no-floppy --fs-uuid --set=root 1592aaf3-4910-4fca-baaa-53d8eb1e6262
fi
linux16 /vmlinuz-3.10.0-693.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
initrd16 /initramfs-3.10.0-693.el7.x86_64.img
}
menuentry 'CentOS Linux (0-rescue-39f75f8b9d404d8eb776a1608f548431) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-39f75f8b9d404d8eb776a1608f548431-advanced-5cfaac82-4194-4195-af05-7d40616118b7' {
load_video
insmod gzio
insmod part_msdos
insmod xfs
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1' 1592aaf3-4910-4fca-baaa-53d8eb1e6262
else
search --no-floppy --fs-uuid --set=root 1592aaf3-4910-4fca-baaa-53d8eb1e6262
fi
linux16 /vmlinuz-0-rescue-39f75f8b9d404d8eb776a1608f548431 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet
initrd16 /initramfs-0-rescue-39f75f8b9d404d8eb776a1608f548431.img
}
### END /etc/grub.d/10_linux ###
### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###
### BEGIN /etc/grub.d/20_ppc_terminfo ###
### END /etc/grub.d/20_ppc_terminfo ###
### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###
### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###
### BEGIN /etc/grub.d/41_custom ###
if [ -f ${config_directory}/custom.cfg ]; then
source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then
source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###
输完重启即可。(这是小编复制原来的文件,非手打)
方法二:
重建grub分区
刚刚那个界面我们重新启动,这个时候我们要眼疾手快,在出现加载进度条的时候,按“ESC”。
我们选择第三个,进入到我们刚装系统的界面,选择最下面的那个。
然后我们选择第三个,进入命令模式。
选择1去连接
第一步,引导急救模式,加载系统镜像。
chroot /mnt/sysimage/
第二步,重新建立加载sda分区。
grub2-install /dev/sda
第三步,重新构建grup菜单配置文件。
grub2-mkconfig -o /boot/grub2/grub.cfg
第四步,退出bash环境。
exit
第五步,重启。
reboot
三个,进入到我们刚装系统的界面,选择最下面的那个。
[外链图片转存中…(img-za0HsFQB-1573782133754)]
然后我们选择第三个,进入命令模式。
[外链图片转存中…(img-UB1FzFDf-1573782133755)]
选择1去连接
[外链图片转存中…(img-0jTEH26f-1573782133756)]
第一步,引导急救模式,加载系统镜像。
chroot /mnt/sysimage/
第二步,重新建立加载sda分区。
grub2-install /dev/sda
第三步,重新构建grup菜单配置文件。
grub2-mkconfig -o /boot/grub2/grub.cfg
第四步,退出bash环境。
exit
第五步,重启。
reboot