linux系統開機流程以及grub的配置

linux的開機流程圖:(當中的操作部分圖片見上傳附件)


wKiom1Xv51SDO1tYAARUl7ILl2w709.jpg



在grub命令行手動啓動系統:

前提:在系統啓動時無法正常進入界面,但根據提示錯誤判斷引導程序並沒有損壞的情況下可以手動進入grub命令行來進行啓動系統。

在grub引導時進入grub命令行界面(就是在系統啓動讀秒的時候按c鍵進入grub命令行界面)

第一步:先設定grub所在的根路徑在哪個設備上。然後看當前系統上的/boot/下的目錄是否完整,使用find命令查找

 wKiom1YCk57yB9CdAAFuYKvY_uc087.jpg

 

第二步:指定kernel的位置及其參數和initrd的位置並使用boot命令重啓。

 wKioL1YCk82BjC4NAAHFf6qank0216.jpg

 

 

修復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  

 wKioL1YClB6xLTYRAACNO-DfdE0585.jpg

這個表示我們將sda磁盤的前200個字節用特殊設備/dev/zero破壞,即破壞了MBR中的前200個字節

開始修復過程:

第一步:由於硬盤的grub已經損壞,所以此時從硬盤引導啓動是不可能的。因此我需要從其他具有安裝grub引導管理器的設備上來引導啓動此係統,可以是光盤、u盤等啓動盤。所以我們需要進入biso界面選擇以光盤鏡像啓動。

 wKioL1YClF6zRAuRAAFpfCUIbBI467.jpg

第二步:在grub引導的時候選擇

 wKiom1YClHbC3LlhAAHT-iloFyk746.jpg

根據步驟選擇

 wKiom1YClIuxLaeuAAHOUKZWWGo271.jpg

 wKioL1YClKrhvIPrAAGfrzvDQls149.jpg

選擇裝有完整grub的設備(就是修復要用到的鏡像)

 wKioL1YClNmg3ZjtAAFwVkEwEIc360.jpg

下一步網絡選擇,因爲我們這裏不需要使用網絡來引導,因此可以不設置網絡

 wKioL1YClP_DUon9AAE-lFhnbyU032.jpg

下一步,很重要,提示我們修復環境會尋找磁盤上的可安裝程序並將其掛載到/mnt/sysp_w_picpath目錄下,如果不是對這個過程特別熟悉,能做到自動掛載的話就選擇continue

 wKiom1YClRrSjtDUAAJpB2RInaM982.jpg

下一步提示我們找到磁盤上的第一個可安裝引導程序

 wKiom1YClUOiItdhAAF5zI-1TR4612.jpg

提示掛載系統系統,接下來進入救援模式

 wKiom1YClV6AIGsZAAD5EuwFMGk870.jpg

 wKiom1YClX-AYcWgAAEUKdxF_lw499.jpg

接下來更改系統路徑

 wKioL1YClabDsMeUAACJnJfhmhs261.jpg

使用grub-install命令進行修復,並制定修復的grub所在的磁盤設備,一切都會自動生成

 wKiom1YClcDTcePRAAFiC3-gg7s671.jpg

然後重啓系統,進入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界面

 wKiom1YClfjyvJS0AALYrq4mNmE265.jpg

這樣一個簡易的啓動盤就做好了。

 

 

 

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章