Linux 開機流程及修復MBR
阿新 • • 發佈:2018-05-03
linux MBR
grub介紹
存放於MBR的前446字節中,grub分為stage1/stage1.5/stage2。
- stage1:主要負責BIOS和GRUB之間的交接,載入存放於各個分區中的開機文件
- stage1.5:讓stage1中的bootloader能識別stage2所在的分區上的文件系統;
- stage2:配置參數,加載內核,ramfs
grub模式下常用操作說明
e: 編輯模式,用於編輯菜單;
c: 命令模式,交互式接口;用戶查看命令獲取幫助
設置grub
1、設置臨時根 之後的文件查找都是在臨時根下面 可以自動補全 (這就是為什麽boot要分區的原因,簡單的文件系統)
把/boot當作臨時根 (hd#,#) hd#: 磁盤編號,用數字表示;從0開始編號 #: 分區編號,用數字表示; 從0開始編號
2、設置內核文件
設定本次啟動時用到的內核文件;額外還可以添加許多內核支持使用的cmdline參數;
最常用參數
只讀:ro
根:root=/device (這個root地址是真正的根指向的分區)
單用戶模式 1, s, S或single都可以,用來忘記密碼修改密碼
還有寫init=/sbin/init 之類很多
kernel /PATH/TO/KERNEL_FILE ro root=/dev.... quiet
3、設置initramfs
上述的配置都是從 /boot/grub/grub.conf 這裏讀取的
[root@node1 grub]# cat /boot/grub/grub.conf # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/mapper/vg0-LogVol01 # initrd /initrd-[generic-]version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.32-431.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/vg0-LogVol01 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=vg0/LogVol01 rd_LVM_LV=vg0/LogVol00 crashkernel=auto SYSFONT=latarcyrheb-sun16 rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-431.el6.x86_64.img #自己添加 title fortest-CentOS (2.6.32-431.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/vg0-LogVol01 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=vg0/LogVol01 rd_LVM_LV=vg0/LogVol00 crashkernel=auto SYSFONT=latarcyrheb-sun16 rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-431.el6.x86_64.img password --md5 $1$fQ1Hq/$otpD/NAH5fB/bCgmcqfl41 #密碼必須加在上面,不然進去grub可以刪除,沒有意義
定制 grub
實驗目的,一塊新硬盤能夠加載內核,開機
1、準備好新硬盤
Device Boot Start End Blocks Id System
/dev/sdb1 1 26 208813+ 83 Linux
/dev/sdb2 27 288 2104515 82 Linux swap / Solaris
/dev/sdb3 289 942 5253255 83 Linux
2、掛載新硬盤
[root@node1 boot]# pwd
/mnt/boot
[root@node1 mnt]# mount /dev/sdb1 /mnt/boot/
3、在新硬盤下創建grub
[root@node1 mnt]# grub-install --root-directory=/mnt /dev/sdb #指定boot所在的目錄, 安裝到sdb這個盤上
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
This is the contents of the device map /mnt/boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install‘.
(fd0) /dev/fd0
(hd0) /dev/sda
(hd1) /dev/sdb
4、復制內核,ramfs
[root@node1 boot]# ls
grub lost+found
[root@node1 grub]# cp /boot/vmlinuz-2.6.32-431.el6.x86_64 /mnt/boot/
[root@node1 boot]# mkinitrd /mnt/boot/initramfs-$(uname -r).img $(uname -r)
5、配置文件
[root@node1 grub]# vim /mnt/boot/grub/grub.conf
[root@node1 grub]# cat grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/mapper/vg0-LogVol01
# initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (test1)
root (hd0,0)
# root=/dev/sda3 這塊硬盤分區3是根
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/sda3 selinux=0 init=/bin/bash
initrd /initramfs-2.6.32-431.el6.x86_64.img
6、掛載根,copy一個bash腳本
[root@node1 grub]# mkdir /mnt/sysroot
[root@node1 grub]# mount /dev/sdb3 /mnt/sysroot/
[root@node1 sysroot]# mkdir -pv etc bin sbin lib lib64 dev proc tmp var home root mnt media
[root@node1 sysroot]# cp /bin/bash /mnt/sysroot/bin/
[root@node1 sysroot]# ldd /bin/bash
linux-vdso.so.1 => (0x00007fffd31ff000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f33c03fb000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f33c01f7000)
libc.so.6 => /lib64/libc.so.6 (0x00007f33bfe62000)
/lib64/ld-linux-x86-64.so.2 (0x00007f33c0626000)
[root@node1 sysroot]# cp /lib64/libtinfo.so.5 /mnt/sysroot/lib64/
[root@node1 sysroot]# cp /lib64/libdl.so.2 /mnt/sysroot/lib64/
[root@node1 sysroot]# cp /lib64/libc.so.6 /mnt/sysroot/lib64/
[root@node1 sysroot]# cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64/
#測試當前
[root@node1 sysroot]# chroot /mnt/sysroot/
bash-4.1#
7、在新的虛擬機中用這塊硬盤開機
bootloader修復
實驗目的只破壞前面446字節,修復grub,後面分區不動
破壞本機bootloader
[root@node1 mnt]# dd if=/dev/zero of=/dev/sda bs=200 count=1
[root@node1 grub]# sync
開機狀態下有多種修復方式
1、使用grub-install工具
[root@node1 mnt]# grub-install --root-directory=/ /dev/sda
2、 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
重啟狀態下修復,需要光盤的營救模式
1、破壞狀態下開機
2、加載光盤
3、選擇營救模式
Linux 開機流程及修復MBR