linux的开机流程图:(当中的操作部分图片见上传附件)
在grub命令行手动启动系统:
前提:在系统启动时无法正常进入界面,但根据提示错误判断引导程序并没有损坏的情况下可以手动进入grub命令行来进行启动系统。
在grub引导时进入grub命令行界面(就是在系统启动读秒的时候按c键进入grub命令行界面)
第一步:先设定grub所在的根路径在哪个设备上。然后看当前系统上的/boot/下的目录是否完整,使用find命令查找
第二步:指定kernel的位置及其参数和initrd的位置并使用boot命令重启。
修复grub的三种方式
第一种:grub损坏后没有重启系统。可以使用grub命令来修复(此方法必须保证在当前系统存在boot/grub目录及其个极端的文件,而且不能损坏)
grub> root (hd0,0)
root (hd0,0)
Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
setup (hd0)
Checking if "/boot/grub/stage1" exists... no
Checking if "/grub/stage1" exists... yes
Checking if "/grub/stage2" exists... yes
Checking if "/grub/e2fs_stage1_5" exists... yes
Running "embed /grub/e2fs_stage1_5 (hd0)"... 27 sectors are embedded.
succeeded
Running "install /grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.
grub>
修复完成,退出即可
第二种:重新安装grub(此方法会检查boot/grub目录及其各阶段文件,如果没有,则之间自动创建之)
[root@localhost grub]# grub-install --root-directory=/ dev/sda
--root-directory :用来指定grub的根目录,就是是boot所在的目录
/dev/sda :表示grub就创建在当前磁盘的中
第三种方法:进入紧急救援模式修复
当grub在损坏的时候,我们可以进入救援模式来修复geub或者将硬盘拆下来到其他主机上修复grub。
首先,我们模拟grub损坏的场景.执行
dd if=/dev/zero of=/dev/sda bs=200 conut
这个表示我们将sda磁盘的前200个字节用特殊设备/dev/zero破坏,即破坏了MBR中的前200个字节
开始修复过程:
第一步:由于硬盘的grub已经损坏,所以此时从硬盘引导启动是不可能的。因此我需要从其他具有安装grub引导管理器的设备上来引导启动此系统,可以是光盘、u盘等启动盘。所以我们需要进入biso界面选择以光盘镜像启动。
第二步:在grub引导的时候选择
根据步骤选择
选择装有完整grub的设备(就是修复要用到的镜像)
下一步网络选择,因为我们这里不需要使用网络来引导,因此可以不设置网络
下一步,很重要,提示我们修复环境会寻找磁盘上的可安装程序并将其挂载到/mnt/sysimage目录下,如果不是对这个过程特别熟悉,能做到自动挂载的话就选择continue
下一步提示我们找到磁盘上的第一个可安装引导程序
提示挂载系统系统,接下来进入救援模式
接下来更改系统路径
使用grub-install命令进行修复,并制定修复的grub所在的磁盘设备,一切都会自动生成
然后重启系统,进入biso修改启动项为硬盘启动,系统就可以正常启动了
手动安装制作grub.
前提:有时候根据需要将bootloader替换掉,或者将LILO更换为grub。或者新增一个bootloader。比如将一个操作系统已复制方式备份到另一个分区是,MBR中的的数据就没有备份,此时就需要在备份的那一边新建bootloader。
第一步:首选确定系统是否安装grub软件。在centos5或6上使用grub 0.x的版本,就叫做grub,而在centos7上使用的是grub 1.x版本,被称为grub2.可使用rpm查看是否安装。我的实验环境是centos6。模拟情景是在一块新硬盘上手动创建grub
[root@localhost grub]# rpm -q grub
grub-0.97-93.el6.x86_64
第二步:给系统添加一个新硬盘,显示为/dev/sdb(添加过程不在写)。然后对其进行分区。并使内核重读分区表(注意如果是新添加的空白磁盘,partx 命令使内核重读分区表可以在/proc/partitions文件中立即查看到,如果磁盘此前有过分区,可能需要重启系统才能在/proc/partitions文件中查看到新的分区情况)
[root@localhost ~]# cat /proc/partitions
major minor #blocks name
8 0 104857600 sda
8 1 204800 sda1
8 2 62914560 sda2
8 16 10485760 sdb
8 17 6425968 sdb1
8 18 4056412 sdb2
253 0 20971520 dm-0
253 1 2097152 dm-1
253 2 10485760 dm-2
253 3 20971520 dm-3
然后格式化文件系统类型为ext4类型
[root@localhost ~]# mke2fs -t ext4 /dev/sdb1
[root@localhost ~]# blkid /dev/sdb1
/dev/sdb1: UUID="eed16606-c4ed-4f00-b8fb-925898b6e102" TYPE="ext4"
[root@localhost ~]# mke2fs -t ext4 /dev/sdb2
[root@localhost ~]# blkid /dev/sdb2
/dev/sdb2: UUID="6c2c0c61-a7ea-46be-8f74-82ab73396970" TYPE="ext4"
因为创建的grub必须要找到boot目录,而当前boot目录正在使用,所有我们在/mnt下创建boot目录,而后将/dev/sdb1挂载至/mnt/boot目录下
[root@localhost mnt]# mkdir boot
[root@localhost mnt]# mount /dev/sdb1 /mnt/boot
[root@localhost mnt]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/vg0-root 20511356 3196124 16266656 17% /
tmpfs 506144 0 506144 0% /dev/shm
/dev/sda1 194241 27923 156078 16% /boot
/dev/mapper/vg0-usr 10190136 1957908 7707940 21% /usr
/dev/mapper/vg0-var 20511356 331624 19131156 2% /var
/dev/sdb1 5039592 10268 4766664 1% /mnt/boot
然后就可以使用grub-install命令在/dev/sdb1上安装grub了
[root@localhost grub]# grub-install --root-directory=/mnt /dev/sdb
这里必须使用--root-directory指定grub的根目录,因为grub必须从boot目录下查找grub目录及其相关文件,如果没有,grub-install则会在boot目录下创建grub目录及其子相关文件。但是默认不会创建grub.conf文件,因此需要手动编辑。/dev/sdb1则是指定的grub将要安装的磁盘,
但是要想做启动盘必须有内核文件vmlinus和initrd文件,因此复制这两个文件到这个boot目录下
[root@localhost ~]# cp /boot/vmlinuz-2.6.32-504.el6.x86_64 /mnt/boot/
[root@localhost ~]# cp /boot/initramfs-2.6.32-504.el6.x86_64.img /mnt/boot
然后编辑grub.conf配置文件
由于我们是打算将/dev/sdb3作为一个根文件系统来使用,因此需要再其上创建一些文件和目录。
在/mnt/下创建aa目录
[root@localhost mnt]# mkdir aa
挂载/dev/sdb3至/mnt/aa
[root@localhost mnt]# mount /dev/sdb3 /mnt/aa
进入此目录,在其上创建根文件系统需要的基本目录
[root@localhost aa]# mkdir -pv etc bin sbin lib lib64 tmp usr dev proc sys var home root
复制二进制程序/bin/bash及其依赖的库文件到创建的bin目录下
[root@localhost aa]# cp /bin/bash ./bin
[root@localhost aa]# ldd /bin/bash
linux-vdso.so.1 => (0x00007fff3a9fd000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00000036f7c00000)
libdl.so.2 => /lib64/libdl.so.2 (0x00000036ecc00000)
libc.so.6 => /lib64/libc.so.6 (0x00000036ed000000)
/lib64/ld-linux-x86-64.so.2 (0x00000036ec800000)
[root@localhost aa]# cp /lib64/libtinfo.so.5 ./lib64
[root@localhost aa]# cp /lib64/libdl.so.2 ./lib64
[root@localhost aa]# cp /lib64/libc.so.6 ./lib64
[root@localhost aa]# cp /lib64/ld-linux-x86-64.so.2 ./lib64
切换根目录
[root@localhost aa]# chroot /mnt/aa
bash-4.1#
这表示bash已经可以正常运行,只是作为启动程序的话还需要复制/sbin/init程序及其相关库。但是也可以设定内核启动后的程序不是/sbin/init,而设置为/bin/bash
修改grub.conf配置文件中内核参数init=/bin/bash
[root@localhost grub]# cat grub.conf
default=0
timeout=5
hiddenmenu
title redhat (my linux)
root (hd0,0)
kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=/dev/sda3 selinux=0 init=/bin/bash
initrd /initramfs-2.6.32-504.el6.x86_64.img
然后新建虚拟机,选择新安装的磁盘作为第一块磁盘,启动成功够能够直接进入bash界面
这样一个简易的启动盘就做好了。