Grub_blog
来源:互联网 发布:java工程师认证考试 编辑:程序博客网 时间:2024/06/08 16:25
Grub_blog
- Grub_blog
- BIOS
- 主要功能
- 执行顺序
- MBR
- GRUBGRand Unified Bootloader
- grub legacy
- grub之识别设备
- grub命令行接口
- gurb configuration
- 实例
- 添加新硬盘并提供直接单独运行的bash系统CentOS 67为例
- 破坏本机grub stage 1并救援模式修复以CentOS 7为例
BIOS
BIOS是固化在motherboard上的ROM芯片上的程序,它可以从CMOS中读写系统设置信息,确保其他的chips、hard drivers、ports和CPU协同工作。
主要功能
1、载入操作系统,为CPU提供执行指令
2、加电自检
3、驱动其他芯片上的BIOS(比如SCSI和显卡)
4、提供底层子程序供OS调用,比如键盘、显示器、串/并口
5、管理硬件设置如硬盘和系统时钟
执行顺序
1、检查CMOS中的系统设置信息
CMOS是motherboard上一块特殊的RAM芯片,用于存放系统参数,而BIOS是完成参数设置的程序
2、载入中断处理程序和设备驱动
正因为如此BIOS中的程序通常会被后续复制到RAM中驻存以提高其中断处理速度
3、初始化寄存器和电源管理
4、POST
5、显示系统设置
就是通常的BIOS设置界面
6、决定哪个程序是可启动的
BIOS中控制这种设定的程序
7、初始化bootstrap sequence
在BIOS知道启动媒介之后就要初始化启动次序。一旦BIOS决定了目标启动媒介,它就会寻找启动信息(这个启动信息就是MBR,至于硬盘/光驱中的信息是如何到内存中的,大概是BIOS会设置固定的位置让CPU跳转到那里并执行指令)来启动操作系统。
如果是硬盘,它就会在cylinder(柱面)0、head(磁头)0、sector(扇区)1寻找MBR(Master Boot Record)。如果是floppy disk(光盘),就会在光盘上的同样的位置寻找VBR(Volume Boot Record)
MBR
参考资料:http://www.dewassoc.com/kbase/hard_drives/master_boot_record.htm
在标准硬盘(扇区大小是512bytes)中,第一个扇区就是MBR,MBR包括物理磁盘上4个逻辑分区(NTFS,FAT,ext4)的入口(其中一个标记为活动的)、446bytes的bootloader、2bytes magic number(signature)。MBR会让CPU知道OS的位置。MBR指向的位置是没有分区介质中的第一个扇区、或者分区介质中独立分区的第一个扇区,这个扇区也被称作VBR。VBR中的代码会直接被机器或者boot manager执行,常见的boot manager就是grub了。MBR我的理解程度只有这么多了。。。。。
GRUB(GRand Unified Bootloader)
GRUB是引导装入器(系统启动管理器),负责装入内核并引导Linux系统,而且它还可以引导其他操作系统(Windows)。
它还提供各种配置属性,即使有些属性配置不正确,仍然可以引导系统(手动引导),在进入系统之后,还可以重新修复配置文件。
grub legacy
参考资料:http://www.uruk.org/orig-grub/technical.html
stage 1 只是用来加载stage 2的。在光盘上,grub通常就在第一个启动扇区,在硬盘上,grub可以在bootloader中或者第一个分区的扇区中。stage 1是如何知道stage 2的位置的?stage 1种存储着硬盘的快列表元数据,这种数据可以通过BIOS中的硬盘“几何测量”而得知其CHS地址,这种CHS地址是INT 13号中断获取硬盘数据的方式。stage 1.5 因为stage 2非常大,并不能一次性被stage 1加载,所以stage 1.5就用于来直接加载文件系统上/boot/grub目录下的文件,这个目录下的文件就是stage 2。stage 1.5位于保留给bootloader的位置,通常在MBR的后面。stage 2 stage 2会获得各种需要的物理信息,然后会寻找它的配置文件。如果没有找到配置文件,grub就会退变为一个命令行接口。如果找到了配置文件,一个菜单接口就会被激活,这个菜单会提供配置文件中的启动文件的入口。 stage 2功能总结: 1、提供菜单、并提供交互接口 e:编辑模式,用于编辑菜单 c:命令模式,交互式接口 2、加载用户选择的内核或者操作系统 允许传递参数给内核 可隐藏此菜单 3、可为菜单提供保护机制 为编辑菜单进行认证 为启用内核或操作系统进行认证
grub之识别设备
这里的设备指的是启动根设备,用于设置grub所在的位置,即gurb得“根”而非Linux文件系统的“根”,当然他们二者可以在同一个分区,也可以在不同的分区。(hd#,#) hd#:磁盘编号,用数字表示,从0开始编号 \#:分区编号,用数字表示,从0开始编号 (hd0,0)
grub命令行接口:
help:获取帮助列表help COMMAND:详细帮助信息find (hd#,#)/PATH/TO/SOMEFILE find (hd0,0)/vmlinuz-2.6.32-504.el6.x86_64root (hd#,#):设置启动跟设备kernel /PATH/TO/KERNEL_FILE:设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用的命令行参数,例如:init=/path/to/init表示以这个文件作为启动脚本,selinux=0表示不启用selinuxinitrd /PATH/TO/INITRAMFS_FILE:设定为选定的内核提供额外文件的ramdisk;ramdisk的版本号必须与内核版本号完完全全匹配,否则ramdisk将无法被kernel装载boot:引导启动选定的内核chainloader:将指定的文件作为一个链式装载程序载入。为了获取在一个指定分区第一个扇区的文件,使用+1作为文件名。它创建了一个从引导装入器到另一个的链,这种链式装入技术可用用于引导Windows系统,制作双系统。
gurb configuration
配置文件:/etc/grub.conf(链接文件,指向) ----> /boot/grub/grub.conf
[root@localhost ~]# ls -l /etc/grub.conflrwxrwxrwx. 1 root root 22 Dec 7 10:48 /etc/grub.conf -> ../boot/grub/grub.conf
字段详细解释:
default=#:设定默认启动的菜单项,菜单项(title)编号从0开始timeout=#:指定菜单项等待用户选择的等待时长splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜单背景图片路径hiddenmenu:隐藏菜单,不要用户选择直接默认选择某项password [--md5] STRING:设定认证方式,菜单编辑认证,输入STRING匹配才允许编辑title TITLE:定义菜单项“标题” root (hd#,#):grub查找stage2及kernel文件所在设备分区,这里是grub的根而不是文件系统的“根” kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核 initrd /PATH/TO/INITRAMFS_FILE:内核匹配的ramfs文件; password [--md5] STRING:启用选定的内核或操作系统时进行认证
关于如何生成密码?
1、明文密码,直接添加字符串作为密码,但是不安全2、加密密码:openssl或者grub-md5-crypt
[root@localhost rc.d]# grub-md5-cryptPassword: Retype password: $1$98tbY$bB5BZUUb7CuPxhLMQWfl6/
如何进入单用户模式?
1、编辑grub菜单(选定要编辑的title,而后使用e命令)2、在选定的kernel后附加 1,s,S或single或者init=/bin/bash3、在kernel所在行,键入b命令,表示boot的意思
关于如何安装grub?
grub-installgrub-install命令一定会去寻找boot目录,由于boot目录存在两种情况(单独分区、Linux根文件系统中)1、安装在本系统分区 grub-install --root-directory=/ /dev/sda 或者直接使用grub命令 这种方式需要系统上事先存在各种stage grub>root (hd#,#) grub>setup2、安装在另一块独立磁盘 grub-install --root-directory=ROOT /dev/DISK 这里的ROOT目录指的是它的下面存在boot目录而不是boot目录本身
如何修复系统(grub损坏的情况),进入紧急救援模式?
加载系统光盘 1、Esc --> \# linux rescue 2、或者直接选择rescue mode 如果是把系统硬盘挂载到另一台电脑修复grub就是到挂载点中安装grub就行了
实例
添加新硬盘并提供直接单独运行的bash系统(CentOS 6.7为例)
设置虚拟机添加一块硬盘
此处添加的是SCSI、指定为单个文件、大小10G
查看磁盘并把10G磁盘分3个区分别为/
[root@localhost ~]# fdisk -l /dev/sd[a-z]Disk /dev/sda: 128.8 GB, 128849018880 bytes255 heads, 63 sectors/track, 15665 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk identifier: 0x000431af Device Boot Start End Blocks Id System/dev/sda1 * 1 26 204800 83 LinuxPartition 1 does not end on cylinder boundary./dev/sda2 26 7859 62914560 8e Linux LVMDisk /dev/sdb: 10.7 GB, 10737418240 bytes255 heads, 63 sectors/track, 1305 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk identifier: 0x00000000#磁盘分区[root@localhost ~]# fdisk /dev/sdbDevice contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabelBuilding a new DOS disklabel with disk identifier 0x892d0f9f.Changes will remain in memory only, until you decide to write them.After that, of course, the previous content won't be recoverable.Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u').Command (m for help): nCommand action e extended p primary partition (1-4)pPartition number (1-4): 1First cylinder (1-1305, default 1): Using default value 1Last cylinder, +cylinders or +size{K,M,G} (1-1305, default 1305): +500M Command (m for help): nCommand action e extended p primary partition (1-4)pPartition number (1-4): 2First cylinder (66-1305, default 66): Using default value 66Last cylinder, +cylinders or +size{K,M,G} (66-1305, default 1305): +1GCommand (m for help): tPartition number (1-4): 2Hex code (type L to list codes): 82Changed system type of partition 2 to 82 (Linux swap / Solaris)Command (m for help): nCommand action e extended p primary partition (1-4)pPartition number (1-4): 3First cylinder (198-1305, default 198): Using default value 198Last cylinder, +cylinders or +size{K,M,G} (198-1305, default 1305): Using default value 1305Command (m for help): wThe partition table has been altered!#查看分区[root@localhost ~]# partx /dev/sdb# 1: 63- 1044224 ( 1044162 sectors, 534 MB)# 2: 1044225- 3164804 ( 2120580 sectors, 1085 MB)# 3: 3164805- 20964824 ( 17800020 sectors, 9113 MB)# 4: 0- -1 ( 0 sectors, 0 MB)[root@localhost ~]# cat /proc/partitionsmajor minor #blocks name 8 0 125829120 sda 8 1 204800 sda1 8 2 62914560 sda2 8 16 10485760 sdb 8 17 522081 sdb1 8 18 1060290 sdb2 8 19 8900010 sdb3 253 0 20971520 dm-0 253 1 2097152 dm-1 253 2 10485760 dm-2 253 3 20971520 dm-3#创建文件系统[root@localhost ~]# mke2fs -t ext4 /dev/sdb1...[root@localhost ~]# mke2fs -t ext4 /dev/sdb3...[root@localhost ~]# mkswap /dev/sdb2Setting up swapspace version 1, size = 1060284 KiBno label, UUID=7242cab1-d1a4-426e-9792-65206bfa1654#挂载文件系统,此处把sdb1挂载至/mnt/boot、sdb3挂载至/mnt/sysroot[root@localhost ~]# mount /dev/sdb1 /mnt/boot[root@localhost ~]# mount /dev/sdb3 /mnt/sysroot#在/mnt/boot中安装grub,注意这里root-directory和安装在/dev/sdb磁盘上[root@localhost ~]# grub-install --root-directory=/mnt /dev/sdbProbing 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#复制kernel和initramfs到/mnt/boot/目录下[root@localhost ~]# cp /boot/vmlinuz-2.6.32-573.el6.x86_64 /mnt/boot/vmlinuz-husa[root@localhost ~]# cp /boot/initramfs-2.6.32-573.el6.x86_64.img /mnt/boot/initramfs-husa.img#在/mnt/boot/grub目录下新建编辑grub的配置文件grub.conf[root@localhost grub]# vim /mnt/boot/grub/grub.conf...#grub.conf配置文件内容,这里最需要注意的就是root=/dev/sda3,因为根分区是在/dev/sda3分区中default=0timeout=60#hiddenmenu#splashimagetitle kernel-husa root (hd0,0) kernel /vmlinuz-husa ro root=/dev/sda3 selinux=0 init=/bin/bash initrd /initramfs-husa.img#在/mnt/sysroot目录下创建跟文件系统中的各个需要的目录[root@localhost ~]# mkdir -p /mnt/sysroot/{etc,bin,sbin,lib,lib64,var,dev,proc,sys,tmp,usr,home,root,mnt,media,usr/{bin,sbin,lib,lib64}}#复制bash及其所需要的库文件[root@localhost ~]# ldd /bin/bash linux-vdso.so.1 => (0x00007ffc51f5a000) libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00000038e2200000) libdl.so.2 => /lib64/libdl.so.2 (0x00000038da600000) libc.so.6 => /lib64/libc.so.6 (0x00000038daa00000) /lib64/ld-linux-x86-64.so.2 (0x00000038da200000)[root@localhost ~]# cp /bin/bash /mnt/sysroot/bin/[root@localhost ~]# cp /lib64/libtinfo.so.5 /mnt/sysroot/lib64/[root@localhost ~]# cp /lib64/libdl.so.2 /mnt/sysroot/lib64/[root@localhost ~]# cp /lib64/libc.so.6 /mnt/sysroot/lib64/[root@localhost ~]# cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64/#复制ls及其所需要的库文件[root@localhost ~]# ldd /bin/ls linux-vdso.so.1 => (0x00007fff9d3ac000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00000038dc200000) librt.so.1 => /lib64/librt.so.1 (0x00000038db200000) libcap.so.2 => /lib64/libcap.so.2 (0x00000038dde00000) libacl.so.1 => /lib64/libacl.so.1 (0x00000038e5600000) libc.so.6 => /lib64/libc.so.6 (0x00000038daa00000) libdl.so.2 => /lib64/libdl.so.2 (0x00000038da600000) /lib64/ld-linux-x86-64.so.2 (0x00000038da200000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00000038dae00000) libattr.so.1 => /lib64/libattr.so.1 (0x00000038ea200000)[root@localhost ~]# cp /bin/ls /mnt/sysroot/bin[root@localhost ~]# cp /lib64/libselinux.so.1 /mnt/sysroot/lib64/[root@localhost ~]# cp /lib64/librt.so.1 /mnt/sysroot/lib64/[root@localhost ~]# cp /lib64/libcap.so.2 /mnt/sysroot/lib64/[root@localhost ~]# cp /lib64/libacl.so.1 /mnt/sysroot/lib64/[root@localhost ~]# cp /lib64/libpthread.so.0 /mnt/sysroot/lib64/[root@localhost ~]# cp /lib64/libattr.so.1 /mnt/sysroot/lib64/#切换根确保能够使用[root@localhost ~]# chroot /mnt/sysroot bash-4.1# lsbin dev etc home lib lib64 lost+found media mnt proc root sbin sys tmp usr varbash-4.1# #挂起CentOS 6.7并创建新的虚拟机,使用现有磁盘,即刚才做出改变的磁盘,在这里选择一样的磁盘类型,可以移除虚拟机默认的一些设备比如cdrom和声卡等。
开机出现以下内容,他们就是定义在grub.conf文件中的各种信息
grub引导进入系统后可以发现能够进入单用户模式,bash和ls命令使用正常
破坏本机grub stage 1并救援模式修复(以CentOS 7为例)
#备份bootloader[root@husa ~]# dd if=/dev/sda of=/root/grub.bak bs=446 count=1记录了1+0 的读入记录了1+0 的写出446字节(446 B)已复制,0.000476111 秒,937 kB/秒#破坏/dev/sda磁盘的前128字节[root@husa ~]# dd if=/dev/zero of=/dev/sda bs=128 count=1记录了1+0 的读入记录了1+0 的写出128字节(128 B)已复制,0.000203084 秒,630 kB/秒#重启系统发现不能从本地启动而是从网络启动了#插入光盘并进入救援模式#进入救援模式只需要在菜单项中按tab然后再linux 这一行后面输入rescue回车再启动就行了
调整启动次序
复制备份的bootloader
#进入救援模式后可以选择把备份的bootloader复制到/dev/sda磁盘中,就像图中那样#也可以使用grub-install命令直接安装grub到/mnt/sysimage目录下的boot中就行了
- Grub_blog
- JAVA字符串格式化-String.format()的使用
- unity3d的下载与安装
- 第三方键盘高度
- Android 5.0(Lollipop)system.new.dat解包工具及方法
- C 语言之字符测试函数介绍-2015.12.31
- Grub_blog
- system.new.dat一键解包工具,支持Android5.1
- OCUI storyboard & NIB
- http请求和http响应详细解析
- 为什么我一遍看不懂?
- PhotoShop批量生成App大小不同的Icon
- 以编译方式安装python 2.7(linux)
- 计量经济学复习笔记(六)updated
- 三门问题JS