码迷,mamicode.com
首页 > 系统相关 > 详细

linux系统开机流程以及grub的配置

时间:2015-09-09 19:43:10      阅读:286      评论:0      收藏:0      [点我收藏+]

标签:linux开机流程 grub手动配置

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界面

 

 

 

 

 

 

 

 


本文出自 “七颗星” 博客,请务必保留此出处http://qikexing.blog.51cto.com/7948843/1693166

linux系统开机流程以及grub的配置

标签:linux开机流程 grub手动配置

原文地址:http://qikexing.blog.51cto.com/7948843/1693166

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!