linux系统启动2——MBR
MBR位于硬盘的0柱面,0磁头,1扇区,被称为主引导程序。
MBR的全称是Master Boot Record(主引导记录),MBR早在1983年IBM PC DOS 2.0中就已经提出。
MBR是位于磁盘最前边的一段引导代码。它负责磁盘操作系统对磁盘进行读写时分区合法性的判别、分区引导信息的定位,它由磁盘操作系统在对硬盘进行初始化时产生的。
MBR包含了已安装的操作系统的启动加载器和驱动器的逻辑分区信息。
MBR由三个部分组成,主引导记录BootLoader、硬盘分区表DPT和硬盘有效标志。
在总共512字节的主引导扇区里
第一部分是BootLoader,占446个字节,它负责从活动分区中装载并运行系统引导程序;
第二部分是Partition table区(DPT分区表),占64个字节;
第三部分是Magic number,占2个字节。
所谓 BootLoader(启动加载器),偏移地址00000--0x1BD,是一小段代码(如GRUB的stage1),用于加载磁盘启动分区上更大的加载器(如vmlinuz)。
如果你安装了Windows,Windows启动加载器的初始信息就放在这个区域里;
如果MBR的信息被覆盖导致Windows不能启动,你就需要使用Windows的MBR修复功能来使其恢复正常。
如果你安装了Linux,则位于MBR里的通常会是GRUB加载器。
DPT分区表偏移地址为0x1BE--0x1fd,每个分区表项长16个字节,共64字节分别对应MBR的四个主分区。
每个分区表的16个字节含义如下
00-Partition Flag-00/不可引导、80/可以引导
01~03-Start CHS-分区开始的CHS值(磁头Head,扇区Sector,柱面Cylinder)
04-Partition Bytes-分区类型-83/linux、82/SWAP、8e/LVM
05~07-End CHS-分区结束的CHS值(磁头Head,扇区Sector,柱面Cylinder)
08~11-Start LBA-相对的起始扇区号(第二个分区=第一个分区起始扇区号+第一个分区的扇区数量)
12~15-Size-该分区所拥有的扇区数量
Magic Number也就是结束标志字,偏移地址0x1FE--0x1FF的2个字节,固定为55AA,如果该标志错误系统就不能启动。
我们可以用dd命令来将/dev/sda磁盘的MBR读出并写入到/tmp/mbr文件,如下:
[root@128 ~]# dd if=/dev/sda of=/tmp/mbr-128 bs=512 count=1
记录了1+0 的读入
记录了1+0 的写出
512字节(512 B)已复制,0.000174479 秒,2.9 MB/秒
[root@130 ~]# dd if=/dev/sda of=/tmp/mbr-130 bs=512 count=1
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000160761 s, 3.2 MB/s
用hexdump打开/tmp/mbr文件,
注:-C的作用是用十六进制及ASCII的方式查看文件,并采用低/高位的方式显示
hexdump -C /tmp/mbr-128
hexdump -C /tmp/mbr-130
MBR内容的打开后共有32行,每行16个字节,共计512个字节
为了便于查看,我将内容复制到Excel中,将BootLoader的部分内容予以隐藏,结果如下图所示
其中128主机共分了三个区,130主机分了两个区,分区信息如下
[root@130 ~]# parted /dev/sda
GNU Parted 2.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sda: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags1 1049kB 525MB 524MB primary ext4 boot2 525MB 21.5GB 20.9GB primary lvm
(parted)
[root@128 ~]# fdisk -l /dev/sda
磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x00000116设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 616447 307200 83 Linux
/dev/sda2 616448 4810751 2097152 82 Linux swap / Solaris
/dev/sda3 4810752 41943039 18566144 83 Linux
[root@128 ~]#
下面我们来对两台主机的分区表进行详解
先将16位分区表进行区域拆分,如下图
192.168.254.128三个分区信息
80 20 21 0083 5e 38 2600 08 00 00 00 60 09 00 614400*512/1000/1000=315M
第一个分区是启动分区,拥有的扇区数量是614400,大小是315M,LBA寻址的起始扇区是2048
方法详解:
1、第一位是80,即可以启动
2、12~15位的Size的十六进制数值为00 60 09 00,高低位转换后为00096000,换算成十进制为614400,每个扇区大小512字节,换算成MB大小为315M
3、08~11位Start LBA起始扇区号十六进制数值为00 08 00 00,高低位转换后为00000800,换算成十进制为2048
00 5e 39 26 82 74 49 2b 00 68 09 00 00 00 40 00 4194304*512/1000/1000=2147M
第二个分区不可启动,拥有的扇区数量是4194304,大小是2147M,LBA寻址的起始扇区是2048+614400=616448
00 74 4a 2b 83 fe ff ff 00 68 49 00 00 98 36 02 37132288*512/1000/1000/1000=19G
第三个分区不可启动,拥有的扇区数量是37132288,大小是19G,LBA寻址的起始扇区是616448+4194304=4810752
192.168.254.130两个分区信息
80 20 21 00 83 dd 1e 3f 00 08 00 00 00 a0 0f 00 1024000*512/1000/1000=524M
第一个分区是启动分区,拥有的扇区数量是1024000,大小是524M,LBA寻址的起始扇区是2048
00 dd 1f 3f 8e fe ff ff 00 a8 0f 00 00 58 70 02 40916992*512/1000/1000/1000=21G
第二个分区不可启动,拥有的扇区数量是40916992,大小是21G,LBA寻址的起始扇区是2048+1024000=1026048
最后,我们来看在两种不同的硬盘寻址方式:LBA和CHS
CHS寻址模式将硬盘划分为磁头(Heads)、柱面(Cylinder)、扇区(Sector),即所谓的CSH 3D参数 (Disk Geometry)。
磁头(Heads):每张磁片的正反两面各有一个磁头,一个磁头对应一张磁片的一个面。因此,用第几磁 头就可以表示数据在哪个磁面。
柱面(Cylinder):所有磁片中半径相同的同心磁道构成“柱面",意思是这一系列的磁道垂直叠在一起,就形成一个柱面的形状。简单地理解,柱面数=磁道数。
扇区(Sector):将磁道划分为若干个小的区段,就是扇区。虽然很小,但实际是一个扇子的形状,故称为扇区。每个扇区的容量为512字节。
磁头/柱面/扇区理解示意图如下
所以在CHS寻址模式下,BIOS寻找的是硬盘空间的物理位置,所以CHS可以理解为物理寻址。
CHS寻址的最大容量为8GB
CHS寻址方式的容量由CHS三个参数决定:
磁头数最大为255 (用 8 个二进制位存储)。从0开始编号。
柱面数最大为1023(用 10 个二进制位存储)。从0开始编号。
扇区数最大数 63(用 6个二进制位存储)。从1始编号。
所以CHS寻址方式的最大寻址范围为:
255 * 1023 * 63 * 512 / 1048576 = 7.837 GB ( 1M =1048576 Bytes )
或硬盘厂商常用的单位:
255 * 1023 * 63 * 512 / 1000000 = 8.414 GB ( 1M =1000000 Bytes )
LBA(Logical Block Addressing)逻辑块寻址模式,也叫线性寻址,在LBA地址中,地址不再表示实际硬盘的实际物理地址(柱面、磁头和扇区)。
LBA编址方式将 CHS这种三维寻址方式转变为唯一的线性寻址,它把硬盘所有的物理扇区的C/H/S编号通过一定的规则转变为线性编号,系统效率得到大大提高,避免了 烦琐的磁头/柱面/扇区的寻址方式。在访问硬盘时,由硬盘控制器将这种逻辑地址转换为实际硬盘的物理地址。
LBA寻址的最大容量为2.2TB
由于MBR中DPT分区表中LBA寻址的部分只有32位(4个分区*每个分区表8位LBA寻址),因此最大仅能够支持2^32(2的32次方)个扇区,而每个扇区的数据量是512字节,于是2^32 x 512,就得出了最大支持容量,这个数值按硬盘厂商的计算方式(1000进位制)来说,大约就是2.199TB.
目前大部分主板BIOS采用的都是LBA寻址,CHS寻址很早之前就已经无人使用了,另外,在MBR分区表中CHS和LBA的地址是可以互换的,互换公式请自行百度,以本人的数学能力暂时无法理解
本文广泛参考了百度百科及以下链接内容
http://fyzx.ankang.gov.cn/Article/Class26/201408/1484.html
http://wushank.blog.51cto.com/3489095/1144637
http://diy.pconline.com.cn/329/3292501_all.html
http://blog.sina.com.cn/s/blog_4b9eab3201011p8c.html
http://www.cnblogs.com/joyzhuang/p/4126325.html
linux系统启动2——MBR相关推荐
- linux启动写入了mbr,一、Linux系统启动(MBR)
1.系统启动流程 BIOS(Basic Input Output System):基本输入输出系统完成 ①硬件检查②可启动设备查找 可启动设备(Master Boot Record):主引导记录 字节 ...
- Linux系统启动级别及grub配置(一)
一.Linux系统启动流程 1.首先电脑加电自检,进入到BIOS中,通过MBR装载bootloader,再由bootloader装载内核在内存中完成解压,再将控制权交由内核,内核完成硬件的探测再访问i ...
- Linux 系统启动流程及其介绍
熟悉Linux系统启动流程可以更好的排除Linux系统在启动的过程中所遇到的错误,下面介绍Linux系统在启动过程. 开机,BIOS自检:检测外置设备,目的是为了把外围设备的信息提供给操作系统使用 寻 ...
- linux系统运行pbs出现ntf,Linux系统启动故障修复
Linux在启动过程中会出现一些故障,导致系统无法正常启动,本文列举了几个应用单用户模式.GRUB命令操作.Linux救援模式的典型故障修复案例. 一.单用户模式 Linux提供了单用户模式(类似Wi ...
- linux系统启动故障排除
linux也会有系统故障,当你好心情启动系统学习时却发生了故障起不来,岂不是很难受:接下来就简单说明系统启不了的问题排查. linux系统是怎样启动的.会经过哪些初始化进程,大致是两个阶段都都是什么? ...
- 5. linux操作系统bios启动过程需要执行哪几个操作?,Linux系统启动的大致过程
Linux系统启动的大致过程 Linux操作系统是基于UNIX操作系统发展而来的一种克隆系统,它诞生于1991 年的 [Linux桌面] 10 月5 日.下面小编准备了关于Linux系统启动的大致过程 ...
- linux 系统重启过程,linux 系统启动流程
linux系统启动流程可以简单总结为以下几步 1)开机BIOS自检 2)读取MBR,进行MBR引导 3)启动bootloader 4)加载内核kernel 5)启动init进程,依据inittab文件 ...
- Linux系统启动过程详解
目录 linux系统启动详细过程 内核引导 启动init程序进入初始化阶段 init程序的类型 系统初始化 建立终端 用户登录 关机 linux系统启动详细过程 通电 bios初始化 grub2磁盘引 ...
- linux efi 启动原理,Linux系统启动过程
了解Linux系统的启动过程有助于我们深入理解Linux系统运行原理,下面我们将介绍一些系统启动过程中一些重要的细节.在这里,我们将Linux系统启动过程分成7个步骤介绍,这个过程如下图所示. 1.启 ...
最新文章
- 一起ORACLE数据库中数据查询结果不一致问题的排查过程
- 自动添加端口添加至Windows防火墙脚本
- Atitit.播放系统的选片服务器,包厢记时系统 的说明,教程,维护,故障排查手册p825...
- Java的知识点25——程序、进程与线程 || 线程的创建和启动
- 在eclipse使用git管理项目工程代码
- php 数组值sum,php sum数组值(如果特定列的值重复)
- 【机器学习】 - 使用dlib进行人脸定位,人脸检测,给人脸图片戴口罩
- ROS,launch学习
- FLC-Regular Grammar
- ubuntu18.04安装有道词典等常用软件
- Python实现分解质因数
- 安卓模拟经营类游戏_十大最诱人手机模拟经营类游戏专题
- word文档 文字变网址 解决办法
- 河北省谷歌高清卫星地图下载
- 为了拿到像素点,GetPixel的速度太慢,改用CreateDIBSection
- Kinect for Windows SDK v2.0 开发笔记 (十二) 高清面部帧(3) 面部模型(2D)
- Android仿微信朋友圈2自定义点赞评论弹框
- 学习Android系统
- 用画中画剪辑技巧,给每个视频添加背景图片
- indexedDB基本使用(内含案例)
热门文章
- 思科路由器关联RADIUS服务器配置命令
- 利用输入法的用户自定义短语,快速插入代码框架,解放双手
- 基于DHCP和NAT的家庭网络设备间通信解决方案
- 3D大底批量分布处理7.47h注册版
- 使命召唤12服务器系统,《使命召唤12:黑色行动3》PS4版全面开测,服务器质量遭吐槽...
- Spring Scheduling 调度/定时任务
- 初探JAVA代码在虚拟机中的运行机制
- System32与SysWow64
- C语言进阶--自定义类型:结构体,枚举,联合
- Android游戏历程,快忘掉“吃鸡” 2019最佳Android游戏Top20出炉