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/sysp_w_picpath目錄下,如果不是對這個過程特別熟悉,能做到自動掛載的話就選擇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界面
這樣一個簡易的啓動盤就做好了。