Linux笔记2---grub

GRUB(Boot Loader)
grub: GRand Unified Bootloader
grub 0.x: grub legacy
grub 1.x: grub2

grub legacy:
	stage1: mbr    // 第一阶段
	stage1_5: mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统   // 第1.5阶段
	stage2: 磁盘分区(/boot/grub)  // 第2阶段

	配置文件: /boot/grub/grub.conf  <-- /etc/grub.conf
		grub2中为/boot/grub/grub.cfg

	stage2及内核等通常防止一个基本磁盘分区
		功用: 
			(1) 提供菜单、并提供交互式接口
				e: 编辑命令,用于编辑菜单
				c: 命令模式,交互式接口
			(2) 加载用户选择的内核或者操作系统
				允许传递参数给内核
				可隐藏此菜单
			(3) 为菜单提供了保护机制
				为编辑菜单进行认证
				为启用内核或操作系统进行认证

关于boot是分区的说明:
1. grub的引导只能识别一些很基础的硬件驱动,像LVM这样的逻辑卷,grub是无法识别的。
2. boot不一定需要分区,如果不分区boot这个文件就跟根在一个磁盘下(当然实际上跟是不存在的,这句话的意思是boot跟bin, etc等等文件在一个磁盘下),这样当grub需要寻找grub.conf时,需要寻找的路径就是/boot/grub/grub.cfg,如图1所示:
在这里插入图片描述

  1. 如果boot分了区,那么boot下的所有文件就会单独在一块分区上,这样grub就可以以该分区为根,此时寻找grub.conf时,所需要寻找的路径就变成了
    /grub/grub.conf,如图2所示:

在这里插入图片描述

  1. 为什么建议给boot分一个区:
    此前已经说过grub只能识别很简单的硬件驱动,而我们通常会把根文件系统所在的分区给做成各种各样的逻辑卷,这样一来,如果/boot在根分区上,grub将找不到/boot,因为grub无法识别逻辑卷,因此建议把/boot单独放在一个启动分区,如此一来,无论想对根分区干什么就都与启动分区无关。当然如果你决定你的硬盘不打算做成逻辑卷这类设备,那么你是否在去给/boot一个分区都已经无所谓了,当然前提是你是固态硬盘,因为机械硬盘中,增加一定的分区可以提高磁盘读写的速率。

      grub的命令行接口:
     	grub1:
     		help: 获取帮助列表
     		help KEYWORD: 获取KEYWORD的帮助信息
     		root (hd#, ??): 将第#块磁盘,第??个分区作为grub的根分区
     		kernel /PATH/TO/KERNEL_FILE [selinux=0] [root=根分区]: 选择内核
     			selinux=0,表示不启动selinux
     		initrd /PATH/TO/INITRAMFS_FILE  设定为选定的内核提供额外文件的ramdisk
     		boot  引导启动
    
     	grub2: (相比grub1命令有一些差别)
     		help: 获取帮助列表
     		help KEYWORD: 获取KEYWORD的帮助信息
     		ls -l: 这里的ls不是列出目录,而是列出你所拥有的磁盘设备
     		set root=(hd#, ??): 将第#块磁盘,第??个分区作为grub的根分区
     		linux /PATH/TO/KERNEL_FILE [selinux=0] [root=根分区]: 选择内核
     			selinux=0,表示不启动selinux
     		initrd /PATH/TO/INITRAMFS_FILE  设定为选定的内核提供额外文件的ramdisk
     		boot  引导启动
    
     注意事项: initrd文件的版本必须跟内核一致,否则initrd文件将无法被内核所装载
     关于hd#, ??的说明:
     	hd#: 磁盘编号,用数字表示,通常从0开始编号(通常为hd开头,也有sd开头的)
     	??: 分区名,可以是纯数字,也可以是字符加数字,例如: gpt1
    
     	示例: (hd0, 0)表示第1块磁盘的第一个分区
    
     命令使用补充: ls -l虽然可以列出有什么磁盘设备,但比较推荐使用的是tab键补全,这样会比较方便,例如在输入set root=( 时,敲tab键就可以列出所有的磁盘设备。
    

    启动示例: (以grub2为例,因为centos7中采用的就是grub2,包括我自己使用的arch也是grub2)
    在这里插入图片描述
    在这里插入图片描述

------------------------------------------------我是分隔线----------------------------------------------

grub的配置文件: 
	grub1: /boot/grub/grub.conf
		配置项:
			default=#  设定默认启动的菜单项,落单项(title)编号从0开始,既: 第一个title就是0
			timeout=#  指定菜单项等待时长,单位秒
			splashimage=(hd#, #)/PATH/TO/XPM_PIC_FILE: 指明菜单图片文件路径,因为是xpm格式,该种图片只支持16种颜色,必人的视觉还少,所以小编觉得其实根本没啥用...
			hiddenmenu: 隐藏菜单
			password [--md5] STRING: 菜单编辑认证,可以防止免密码单用户登陆--md5表示该字符串是用md5加密的
			title TITLE: 定义菜单项“标题”,可以多次出现
				root (hd#, #)  指定grub的根
				kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS] 指定内核
				initrd /PATH/TI/INITRAMFS_FILE  指定ramfs文件
				password [--md5] STRING: 启用内核认证--md5表示该字符串是用md5加密的

		如何生成md5字符串:
			使用grub-md5-crypt命令,不需要任何参数,使用命令时会让你输入你想输入的密码(要加密的字符串),然后在最后一行就可以看到加密后的字符串:如下图

在这里插入图片描述
配置文件示例:

default=0
timeout=5
splashimage=(hd0,0)/grub/0.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Server (2.6.32-431.el6.x86_64)
	root (hd0,0)
	kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=6ee157ec-88ed-43c6-9cc7-b366c54e3354 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
	initrd /initramfs-2.6.32-431.el6.x86_64.img
title Red Hat Enterprise Linux (my Red Hat)
	root (hd0,0)
	kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=6ee157ec-88ed-43c6-9cc7-b366c54e3354 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
	initrd /initramfs-2.6.32-431.el6.x86_64.img
	password --md5 $1$Hsj/s0$n3W9uDH5QuPA4YN2tSsXz1
	如何进入单用户模式:
		1. 在grub读秒的时候,按e键
		2. 在选定的kernel后附加1, s, S, single都行(通常是最长的那个,按e键编辑,记得用空格分隔)
		3. 编辑完成返回到kernel选定界面后,按b键开始进入单用户模式


	grub2: /boot/grub/grub.cfg
		该文件已经变成了一个脚本文件,但是对应的项还是可以找到的,例如我想把grub的选择时长(timeout)改为0,只需要这么做:
		利用vim的搜索功能找到timeout字样,然后将其值修改为0即可:如下图

在这里插入图片描述
补充: 更好的修改方式
修改/etc/default/grub,然后使用grub-mkconfig -o重新生成grub

grub1:
centos6:
(1)grub-install
grub-install --root-directory=系统的根分区所挂载的目录 /dev/sdX 给/dev/sdX安装grub

grub2:
centos7:
(1)grub2-install
(2)grub2-mkconfig
centos7的grub除了名字外,选项与参数与arch相同,参考下方arch用法

arch系:
(1) grub-install
BIOS启动: grub-install --target=i386-pc /dev/sdX,给sdX安装grub
EFI启动: grub-install --target=x86_64-efi --efi-directory=efi所在分区的挂载目录 --bootloader-id=启动时的系统名称,自己随便驱

(2)grub-mkconfig -o /boot/grub/grub.cfg,生成grub脚本文件(grub2中配置文件已经变成了脚本,上面有说明)

救援你的操作系统: (如果当前系统的bootloader损坏,可以从光盘救援你的系统)

  1. 将BootLoader破坏掉,建议找一个不用的系统
    (╯#-_-)╯~ dd if=/dev/zero of=/dev/sda count=1 bs=200 // 注意: 破坏的大小不要超过256个字节,因为剩下的部分是分区表
  2. 连接光盘重启

1) 选择救援操作系统
在这里插入图片描述
2)接下来选择语言是否连接网络等等。
在这里插入图片描述
3) 选择继续,这段话的意思是操作系统会被挂载到/mnt/sysimage下
4) 一路默认OK来到这里: 选择启动一个shell,既默认那个
5) 然后就可以看到下方有出现了闪烁的光标了,在这里重新安装grub
5.1 切换根

# chroot /mnt/sysimage   // 之所以切换到这里,是因为我们刚才通过那段话了解的

5.2 安装grub,既BootLoader

# grub-install /dev/sda
# exit    // 退出当前根
  1. 接下来shutdown关机,然后重开电源即可
    小贴士: 1. grub安装时,注意看看是否安装成功。
    2.如果你无法启动成功,并且提示selinux等字样,请重启然后通过e键选定kernel,在该行的后面加上selinux=0,就可以进入系统(因为小编就碰到过这样的问题,哈哈)

小彩蛋: 把一块新硬盘制作成一个超干净的小红帽6,使用系统小红帽6

(#-_-)~ fdisk -l /dev/sd[a-z]		// 找出新硬盘
(#-_-)~ fdisk /dev/sdb  // 制作分区
分区状况如下:
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1          26      208813+  83  Linux                      ---> 用作boot分区
/dev/sdb2              27         158     1060290   82  Linux swap / Solaris       ---> 用作swap分区
/dev/sdb3             159        1305     9213277+  83  Linux                      ---> 用作根分区
(#-_-)╯mnt mkfs.vfat /dev/sdb1  // 格式化boot分区
(#-_-)╯mnt mkswap /dev/sdb2     // 制作swap
(#-_-)╯mnt swapon /dev/sdb2
(#-_-)╯mnt mkfs.ext4 /dev/sdb3  // 格式化根分区
(#-_-)~ sync   // 写入磁盘
(#-_-)~ partx -a /dev/sdb  // 重读/dev/sdb的分区信息

// 挂载
(#-_-)~ cd /mnt/
(#-_-)╯mnt ls
(#-_-)╯mnt mkdir sysroot  // 创建一个目录用来挂载sdb
(#-_-)╯mnt mount /dev/sdb3 sysroot/    // 注意先挂载好根目录,而后再去里面创建boot文件挂载
(#-_-)╯mnt cd sysroot/
(#-_-)╯sysroot mkdir -v etc bin sbin lib lib64 dev proc sys tmp var usr home boot  // 创建基本文件夹
(#-_-)╯sysroot cp /boot/vmlinuz-2.6.32-431.el6.x86_64 ./boot/
(#-_-)╯sysroot cp /bin/bash bin/   // 把bash拿过来,做最基本的交互界面
// 但是注意,bash是有依赖库的,所以需要把bash的依赖也拿过来
(#-_-)╯sysroot ldd /bin/bash     // 查看bash的依赖文件
	linux-vdso.so.1 =>  (0x00007fffa2496000)
	libtinfo.so.5 => /lib64/libtinfo.so.5 (0x0000003139200000)
	libdl.so.2 => /lib64/libdl.so.2 (0x000000312da00000)
	libc.so.6 => /lib64/libc.so.6 (0x000000312d600000)
	/lib64/ld-linux-x86-64.so.2 (0x000000312d200000)
// 依赖拷贝
(#-_-)╯sysroot cp /lib64/libtinfo.so.5 lib64/
(#-_-)╯sysroot cp /lib64/libdl.so.2 lib64/
(#-_-)╯sysroot cp /lib64/libc.so.6 lib64/
(#-_-)╯sysroot cp /lib64/ld-linux-x86-64.so.2 lib64/
// 引导安装
(#-_-)╯sysroot grub-install --root-directory=/mnt/sysroot/ /dev/sdb
(#-_-)╯sysroot vim boot/grub/grub.conf    // 编写配置文件
内容如下:
default=0
timeout=5
title MyRedHat
        root (hd0, 0)    ---> 因为我们一会我们需要把这块硬盘插一个没有硬盘的电脑上,所以需要写成(hd0,0)
        kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=dev/sd3 selinux=0 init=/bin/bash
        initrd /initramfs-2.6.32-431.el6.x86_64.img
(#-_-)╯sysroot sync   // 最后用syc同步下磁盘
// 切换进我们自己做的系统,可以发现,连ls命令都没有
(#-_-)~ chroot /mnt/sysroot/
(#-_-)~ exit
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值