一、基本概念
GRUB(boot loader): GRand Unified Bootloader
两个版本:
grub 0.x: grup legacy grub 1.x: grub2
grub legacy:
运行阶段:
stage1: mbr
stage1_5: mbr之后的扇区,让stage1中的bootloader能识别stage2所在分区上的文件系统
stage2: 磁盘分区(/boot/grub/)
配置文件:/boot/grub/grub.conf <-- /etc/grub.conf
stage2及内核通常放置于一个基础磁盘分区
功用: 1. 提供菜单,并提供交互接口 e:编辑模式,用于编辑菜单 c:命令模式,交互式接口 2. 加载用户选择的内核或操作系统 允许传递参数给内核 可隐藏此菜单 3. 为菜单提供了保护机制 为编辑菜单进行认证 为启用内核或操作系统进行认证
如何识别设备:
(hd#,#): 第#块磁盘第#个分区,#为从0开始编号,grub2从1开始编号
grub的命令行接口 help:获取帮助列表 help KEYWORK:详细帮助信息 find (hd#,#)/PATH/TO/SOMEFILE root (hd#,#): 将哪个磁盘设为根 kernel /PATH/TO/KERNEL_FILE: 设定本地启动时用到的内核文件,额外还可以添加许多内核支持使用的cmdline参数 例如: init=/path/to/init,selinux=0 initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdisk boot:引导启动选定的内核
例如: grub> root (hd0,0) grub>kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/mapper/vg0-root quiet grub>initrd /initramfs-2.6.32-754.el6.x86_64.img grub>boot
配置文件:/boot/grub/grub.conf (/etc/grub.conf) 配置项: default #: 设定默认启动的菜单项,菜单项编号从0开始 timeout=#: 指定菜单项等待用户选择的等待时长 splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE: 指明菜单背景图片路径 hidemenu: 隐藏菜单 password [--md5] STRING:菜单编辑认证 title TILE: 定义菜单项的标题,可出现多次 root (hd#,#): grub查找stage2及kernel文件所在设备分区,为grub的“根” kernel /PATH/TO/BMLINUZ_FILE [PARAMETERS]:启动的内核 initrd /PATH/TO/INITRAMFS_FILE:内核匹配的ramfs文件 password [--md5] STRING:启动选定的内核或操作系统时进行认证
grub-md5-crypt命令:
二、grub应用
进入单用户模式: 1.编辑grub菜单(选定要编辑的title,使用e命令) 2.在选定的kernel后附加 1、s、S或single 3.在kernel所在行,键入“b”命令
grub如果损坏:dd if=/dev/zero of=/dev/sda count=1 bs=300 //用0覆盖mbr前446个字节中的一部分数据,让grub损坏 1. grub-install grub-install --root-directory=ROOT /dev/DISK
2. grub grub> root (hd#,#) //必须指明有个文件有stage1,stage1_5,stage2 srub> setup (hd#)
3. 紧急救援功能
连接CD/DVD原装光盘,选择rescue system...直到start shell,然后执行chroot /mnt/sysimage或者grub-install --root-directory=/ /dev/sda,exit后执行reboot重启
4.新加硬盘,提供直接单独运行bash系统 [root@alen ~]# fdisk /dev/sdc //分区 sdc1 sdc2 sdc3
[root@alen ~]# mke2fs -t ext4 /dev/sdc1 //格式化sdc1和sdc3为ext4格式
[root@alen ~]# mke2fs -t ext4 /dev/sdc3
[root@alen ~]# mkswap /dev/sdc2 //格式化sdc2为swap格式
[root@alen ~]# mkdir /mnt/boot //mnt下创建boot目录 [root@alen ~]# mount /dev/sdc1 /mnt/boot //sdc1挂载到/mnt/boot,作为sdc磁盘的boot分区
[root@alen ~]# grub-install --root-directory=/mnt /dev/sdc //在boot分区上安装grub,安装grub会根据给出的指定目录寻找/boot目录 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 (hd2) /dev/sdc [root@alen ~]# ls /mnt/boot grub lost+found
[root@alen ~]# ls /mnt/boot/grub device.map iso9660_stage1_5 stage1 xfs_stage1_5 e2fs_stage1_5 jfs_stage1_5 stage2 fat_stage1_5 minix_stage1_5 ufs2_stage1_5 ffs_stage1_5 reiserfs_stage1_5 vstafs_stage1_5
[root@alen ~]# cp /boot/vmlinuz-2.6.32-754.el6.x86_64 /mnt/boot/vmlinuz //为了测试方便,复制现在系统上的内核重命名为vmlinuz到/mnt/boot下
[root@alen ~]# cp /boot/initramfs-2.6.32-754.el6.x86_64.img /mnt/boot/initramfs.img //同上,复制initrafs到/mnt/boot/下
[root@alen ~]# vim /mnt/boot/grub/grub.conf //在/mnt/boot/grub下创建grub.conf文件,编辑简单配置
default=0
timeout=5
tile=CentOS(Express)
root (hd0,0)
kernel /vmlinuz ro root=/dev/sda3 init=/bin/bash //测试/bin/bash能否开机运行
initrd /initramfs.img
[root@alen ~]# mkdir /mnt/sysroot //mnt下创建sysroot目录作为根文件
[root@alen ~]# mount /dev/sdc3 /mnt/sysroot //sdc3挂在到sysroot目录下
[root@alen ~]# cd /mnt/sysroot
[root@alen sysroot]# ls
lost+found
[root@alen sysroot]# mkdir -pv etc bin sbin lib lib64 dev proc sys tmp var usr home mnt media //sysroot作为根目录,增加一些常用目录
[root@alen sysroot]# cp /bin/bash /mnt/sysroot/bin //复制当前系统/boot/bash到/mnt/sysroot.bin下,用作测试
[root@alen sysroot]# ldd /bin/bash //查看bash的依赖文件
linux-vdso.so.1 => (0x00007ffd56d5d000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x0000003ac7000000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003ab7000000)
libc.so.6 => /lib64/libc.so.6 (0x0000003ab7400000)
/lib64/ld-linux-x86-64.so.2 (0x0000559a9c9de000)
[root@alen sysroot]# cp /lib64/libdl.so.2 /mnt/sysroot/lib64 //复制bash的依赖文件到/mnt/sysroot指定目录下
[root@alen sysroot]# cp /lib64/libtinfo.so.5 /mnt/sysroot/lib64
[root@alen sysroot]# cp /lib64/libc.so.6 /mnt/sysroot/lib64
[root@alen sysroot]# cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64
最后新建一个新的虚拟机,使用sdc这个虚拟磁盘开机启动,bash可以开机运行了