硬盘的物理结构一般由磁头与碟片、电动机、主控芯片与排线等部件组成;当主电动机带动碟片旋转时,副电动机带动一组(磁头)到相对应的碟片上并确定读取正面还是反面的碟面,磁头悬浮在碟面上画出一个与碟片同心的圆形轨道(磁轨或称柱面),这时由磁头的磁感线圈感应碟面上的磁性与使用硬盘厂商指定的读取时间或数据间隔定位扇区,从而得到该扇区的数据内容。
所有的盘片都固定在一个旋转轴上,这个轴即盘片主轴。而所有盘片之间是绝对平行的,在每个盘片的存储面上都有一个磁头,磁头与盘片之间的距离比头发丝的直径还小。所有的磁头连在一个磁头控制器上,由磁头控制器负责各个磁头的运动。磁头可沿盘片的半径方向动作,而盘片以每分钟数千转到上万转的速度在高 速旋转,这样磁头就能对盘片上的指定位置进行数据的读写操作。
当磁盘旋转时,磁头若保持在一个位置上,则每个磁头都会在磁盘表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道(Track)。信息以脉冲串的形式记录在这些轨迹中,这些同心圆不是连续记录数据,而是被划分成一段段的圆弧(扇区),这些圆弧 的角速度一样。
在有多个盘片构成的盘组中,由不同盘片的面,但处于同一半径圆的多个磁道组成的一个圆柱面(Cylinder)。所有盘面上的同一磁道构成一个圆柱,通常称做柱面(Cylinder),每个圆柱上的磁头由上而下从“0”开始编号。数据的读/写按柱面进行,即磁 头读/写数据时首先在同一柱面内从“0”磁头开始进行操作,依次向下在同一柱面的不同盘面即磁头上进行操作,只在同一柱面所有的磁头全部读/写完毕后磁头 才转移到下一柱面,因为选取磁头只需通过电子切换即可,而选取柱面则必须通过机械切换。
电子切换相当快,比在机械上磁头向邻近磁道移动快得多,所以,数据 的读/写按柱面进行,而不按盘面进行。也就是说,一个磁道写满数据后,就在同一柱面的下一个盘面来写,一个柱面写满后,才移到下一个扇区开始写数据。读数 据也按照这种方式进行,这样就提高了硬盘的读/写效率。
磁盘上的每个磁道被等分为若干个弧段,这些弧段便是硬盘的扇区(Sector)。硬盘的第一个扇区,叫做引导扇区。操作系统以扇区(Sector)形式将信息存储在硬盘上,每个扇区包括512个字节的数据和一些其他信息。
在硬盘系 统中,硬盘的每一个盘片都有两个盘面(Side),即上、下盘面,一般每个盘面都会利 用,都可以存储数据。盘面号又叫磁头号,因为每一个有效盘面都有一个对应的读写磁头。
在 linux 中可以使用 fdisk -l 查看一个磁盘的物理结构:
root@centos:~# fdisk -l /dev/sda
Disk /dev/sda:1.84 TiB,2000398934016 字节,3907029168 个扇区
Disk model: ST2000NX0253
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 4096 字节
I/O 大小(最小/最佳):4096 字节 / 4096 字节
磁盘标签类型:gpt
磁盘标识符:27E8F38B-1909-4730-B931-D399FF19A594
设备 起点 末尾 扇区 大小 类型
/dev/sda1 2048 4095 2048 1M BIOS 启动
/dev/sda2 4096 976895 972800 475M Microsoft 基本数据
/dev/sda3 976896 3726032895 3725056000 1.8T Linux LVM
输出信息分为两部分。第一部分显示硬盘的基本参数,包括容量、磁头数和扇区数等。第二部分显示硬盘的分区情况。如果硬盘没有分区,这部分是空白;如果已经分区,每行将代表一个分区,各个字段的定义如下:
值得一提的是,目前逐渐成为主流的固态硬盘中,虽然没有盘片、磁头、扇区这些物理零件,但固态硬盘的接口规范、定义功能及使用方法上与普通机械硬盘完全相同。因此,逻辑上固态硬盘也有柱面、扇区,磁头等参数。
除 fdisk 外,我们更推荐使用 lsblk 命令来查看系统中所有的硬盘情况,lsblk 会显示系统中除了内存虚拟磁盘外的所有可用块设备的信息:块设备也就是存储以“块”为单位数据的设备,比较典型的如磁盘设备、光盘或者U盘。
root@centos:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 1.8T 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 475M 0 part
└─sda3 8:3 0 1.8T 0 part
├─centos-root 253:0 0 1.7T 0 lvm
└─centos-swap 253:1 0 32G 0 lvm
sdb 8:16 0 931.5G 0 disk
├─sdb1 8:17 0 512M 0 part /boot/efi
└─sdb2 8:18 0 931G 0 part /
sdc 8:32 0 1.8T 0 disk
└─sdc1 8:33 0 1.8T 0 part /home1
sdd 8:48 0 223.6G 0 disk
└─sdd1 8:49 0 223.6G 0 part
lsblk -f 查看系统分区和挂载情况:
root@qsrobot:~# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sr0 iso9660 Ubuntu 16.04.6 LTS amd64
2019-02-27-09-57-36-00 /media/rob
sda
├─sda2
├─sda5 swap 8d41e7be-46cf-4de6-afab-fb5242d10d4f [SWAP]
└─sda1 ext4 95a7ce2a-6891-44f6-b0db-729319f8de8d /
设备类型:
块设备:block,存取单位“块”,磁盘;
字符设备:char,存取单位“字符”,键盘;
从上述输出信息中,可以直观地了解到目前系统的硬盘分区及挂载情况。
使用blkid(block id)可以查看设备的全局唯一标识符(UUID,universally unique identifier),如下图:

使用parted指令可以列出磁盘的分区信息,如下图。在图中可以看到有三个分区,实际上这三个分区为gpt(引导扇区)、/boot、/和/home和/swap的数据分区。最后一个分区为lvm实际上里面有三个文件系统均为xfs,挂载点为/和/home和/swap。

系统将文件存储到磁盘上时,按柱面、磁头、扇区的方式进行,即最先是第1磁道的第一磁头下(也就是第1盘面的第一磁道)的所有扇区,然后,是同一柱面的下一磁头,……,一个柱面存储满后就推进到下一个柱面,直到把文件内容全部写入磁盘。
系统也以相同的顺序读出数据。读出数据时通过告诉磁盘控制器要读出扇区所在的柱面号、磁头号和扇区号(物理地址的三个组成部分)进行。磁盘控制器则直接使磁头部件步进到相应的柱面,选通相应的磁头,等待要求的扇区移动到磁头下。在扇区到来时,磁盘控制器读出每个扇区的头标,把这些头标中的地址信息与 期待检出的磁头和柱面号做比较(即寻道),然后,寻找要求的扇区号。待磁盘控制器找到该扇区头标时,根据其任务是写扇区还是读扇区,来决定是转换写电路, 还是读出数据和尾部记录。
找到扇区后,磁盘控制器必须在继续寻找下一个扇区之前对该扇区的信息进行后处理。如果是读数据,控制器计算此数据的ECC码,然 后,把ECC码与已记录的ECC码相比较。如果是写数据,控制器计算出此数据的ECC码,与数据一起存储。在控制器对此扇区中的数据进行必要处理期间,磁 盘继续旋转。其实我们的文件大多数的时候都是破碎的,在文件没有破碎的时候,摇臂只需要寻找1次磁道并由磁头进行读取,只需要1次就可以成功读取;但是如果文件破碎成11处,那么摇臂要来回寻找11次磁道磁头进行11次读取才能完整的读取这个文件,读取时间相对没有破碎的时候就变得冗长。
因此,磁盘IO时的过程包括:
所以,单次磁盘IO时间 = 寻道时间 + 旋转延迟 + 存取时间。
候选的磁盘分区方案:
其实采用哪一种,最主要看的是那种方式性能更快。因为同一分区下的数据经常会一起读取,假如采用第一种,那么这样磁头就需要在3000多个track间不停地跳来跳去,这样磁盘的寻道时间就会翻倍,磁盘性能就会下降。
而对于方案二,假如对于磁盘C,只需要在磁头在1-1000个磁道间移动就可以了,大大降低了寻道时间。(实际上分区并不是从0开始的,磁盘的第一个磁道对应的柱面会被用来安装引导加载程序以及磁盘分区表)。所以,方案二的分区方式可以降低磁盘IO时间中的寻道时间部分,所以所有的操作系统采用的都是方案二,没有用方案一的。
在为主机添加硬盘前,首先要了解Linux系统下对硬盘和分区的命名方法。
对于 SATA、SCSI 或 USB 接口的硬盘或 U 盘,其命名规则如下:
| 主设备文件名 | 次设置文件名(分区) |
|---|---|
| sd[小写字母] 如 sda、sdb 等 |
sd[小写字母][正整数] 如 sda1、sdc1 等 |
在Linux下对 SCSI 和 SATA 设备是以 sd 命名的,第一个 scsi 设备是 sda,第二个是 sdb,依此类推。一般主板上有两个SCSI接口,因此一共可以安装四个SCSI设备。主 SCSI 上的两个设备分别对应 sda 和 sdb,第二个 SCSI 口上的两个设备对应 sdc 和 sdd。一般硬盘安装在主 SCSI 的主接口上,所以是 sda 或者 sdb,而光驱一般安装在第二个SCSI的主接口上,所以是 sdc。
IDE接口设备是用 hd 命名的,第一个设备是hda,第二个是hdb,依此类推。
| IDE 磁盘 | 描述 | 配置 |
|---|---|---|
| /dev/hda | 1st (Primary) IDE controller | Master |
| /dev/hdb | 1st (Primary) IDE controller | Slave |
| /dev/hdc | 2nd (Secondary) IDE controller | Master |
| /dev/hdd | 2nd (Secondary) IDE controller | Slave |
对于 NVMe(M.2)接口的硬盘,其命名规则如下:
| 主设备文件名 | 次设置文件名(分区) |
|---|---|
| nvme[非负整数] 如 nvme0、nvme1 等 |
sd[非负整数]n[正整数]p[正整数] 如 nvme0n1p1、nvme1n1p3 等 |
对于 CD 或 DVD (ROM)光驱设备,其命名规则如下:
| 主设备文件名 | 次设置文件名(分区) |
|---|---|
| sr[非负整数] 如 sr0、sr1 等 |
光驱不能分区 |
更多设备命名:

特别要注意的是,Linux 中的存储设备的名字并非固定,在热插拔、重启等操作后,存储设备名字中的序号可能会发生改变。如 sda 变成 sdc,这种改变可能会让系统管理员犯一些低级错误,如误删数据,误分区等,因此通过设备文件操作硬盘之前,一定要确认好设备名称。
在自动化管理和配置文件中,如开机自动挂载配置文件 /etc/fstab,强烈不建议使用设备文件名来指定存储设备,而是应该使用设备的 UUID。
Linux 采用了一种叫“载入”的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来。这时要载入的一个分区将使它的存储空间在一个目录下获得。
无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构 , Linux中每个分区都是用来组成整个文件系统的一部分。

磁盘分区的好处:
优化IO性能、实现磁盘配额、隔离系统和程序、可以采用多个文件系统
分区的方式:
- MBR --- 比较传统的分区
- GPT --- 支持更大的硬盘空间
MBR:Master Boot Record(主引导记录),1982年开发而来,使用32位表示扇区数,分区不超过2T 。
特点:支持的分区数量、分区空间有限,MBR只支持不超过2T的硬盘,超过2T的硬盘将只能用2T空间。
MBR分区划分基于磁盘柱面,利用参考柱面号码的方式来处理,从CentOS6开始已经支持采用扇区的方式来划分分区。
其实所谓的“分区”只是针对那个64bytes 的分区表进行设置而已,硬盘默认的分区表仅能写入四组分区信息,这四组分区信息我们称为主(Primary)分区或扩展(Extended)分区。所以,MBR的分区方式为:4个主分区或{3主分区+1扩展(N个逻辑分区)}。
第一个扇区512bytes MBR引导扇区 (0磁道0扇区):
1. MBR的分区是按照分区类型来进行组织的。
2. 把整个硬盘的分区信息放在0磁道0扇区这个512字节大小的空间中 。
3. MBR分区中一块硬盘最多有4个主分区,也可以3主分区+1扩展(N个逻辑分区) ,逻辑分区在扩展分区里面分。
该扇区分为三部分:
- 主引导程序(boot loader)446 bytes: boot loader 启动相关(存放启动相关的文件)
- 主分区表(partition table) 64 bytes:分区表(记录每个硬盘有几个分区,每个分区的开始和结束位置),其中每16bytes用来标识一个分区信息(起始位置和结束位置等信息)
-16bytes: 标识一个分区
- 结束标识 2 bytes: 55AA(两个字节的标志位)
主分区表所在的64个bytes容量中,每16个bytes分为一个项,总共分为四组记录区,每组记录区记录了该区段的起始与结束的柱面号码,等信息。
MBR分区类型:
- 主分区:可以存放数据也可以装系统
- 扩展分区:不能直接存数据,需要在里面划分逻辑分区才能存放数据(相当于一个容器)
- 逻辑分区:
主分区和扩展分区对应数字1--4,/dev/sda3,逻辑分区从数字5开始,/dev/sda5
什么是扩展分区?
所谓扩展分区,严格地讲它不是一个实际意义的分区,它仅仅是一个指向下一个分区的指针,这种指针结构将形成一个单向链表。
这样在主引导扇区中除了主分区外,仅需要存储一个被称为扩展分区的分区数据,通过这个扩展分区的数据可以找到下一个分区(实际上也就是下一个逻辑磁盘)的起始位置,以此起始位置类推可以找到所有的分区。无论系统中建立多少个逻辑磁盘,在主引导扇区中通过一个扩展分区的参数就可以逐个找到每一个逻辑磁盘。
扩展分区结构:扩展引导记录(EBR)+ 逻辑分区
注:扩展分区中的每个逻辑驱动器都存在一个类似于MBR的扩展引导记录( Extended Boot Record, EBR)。
扩展引导扇区(EBR):类似于MBR的扩展引导记录,扩展引导记录包括一个扩展分区表和该扇区的标签。
扩展引导记录将记录只包含扩展分区中每个逻辑驱动器的第一个柱面的第一面的信息,但是,如果磁盘上没有扩展分区,那么就不会有扩展引导记录和逻辑驱动器。
EBR结构:
逻辑分区前扇区,如扩展分区0号扇区(512bytes);
前446bytes:未使用,全为0;
扩展分区表(64bytes):记录分区状态,每16bytes分为一个项,共四个项。
第一项:指向它自身的引导扇区;
第二项:指向下一个逻辑驱动器的EBR;
注:如果不存在进一步的逻辑驱动器,第二项不会使用,且被记录成一系列零。
第三项:未使用;
第四项:未使用;
结束标识(2bytes): 55AA ,有效性标识;55AA为有效;
MBR分区结构:

- 主引导程序(偏移地址0000H--0088H),它负责从活动分区中装载,并运行系统引导程序。
- 出错信息数据区,偏移地址0089H--00E1H为出错信息,00E2H--01BDH全为0字节。
- 分区表(DPT,Disk Partition Table)含4个分区项,偏移地址01BEH--01FDH,每个分区表项长1个字节,共64字节。 为分区项1、分区项2、分区项3、分区项4(分区表不是一个文件,而是直接以二进制的形式存放在0扇区) 。
- 结束标志字,偏移地址01FE--01FF的2个字节值为结束标志55AA。
GPT:GUID(Globals Unique Identifiers) partition table 全局唯一标识,是一个较新的分区机制。支持128个分区,支持很大的硬盘很大的分区容量。取消了扩展分区这些概念,全是主分区(MBR使用扩展分区的目的是弥补只能分四个分区的缺陷)。
GPT分区结构:
GPT分配64bits给逻辑块地址,因而使得最大分区大小在2-1个扇区成为了可能。对于每个扇区大小为512字节的磁盘,那意味着可以有9.4ZB(9.4 x 10字节)或8ZiB-512字节 。

LBA0:保护性MBR,
在GPT分区表的最开头,处于兼容性考虑仍然存储了一份传统的MBR(LBA 0),这个MBR叫做保护性MBR(Protective MBR)。其中包含有磁盘签名,MBR分区表,结束标志。这里没有引导代码,分区表中只有一个分区表项,GPT不会用到,这个分区项只是为了让系统认为磁盘是合法的。
LBA1:主要GPT头部:
主要GPT头部位于1号扇区,会定义分区表的起始位置,结束位置,分区表项个数;
分区表头还记录了这块硬盘的GUID,记录了分区表头本身的位置和大小以及备份分区表头和分区表的位置和大小(在硬盘的最后)。它还储存着它本身和分区表的CRC32校验。固件、引导程序和操作系统在启动时可以根据这个校验值来判断分区表是否出错,如果出错了,可以使用软件从硬盘最后的备份GPT中恢复整个分区表,如果备份GPT也校验错误,硬盘将不可使用。
LBA2-33:分区表项
分区表位于GPT磁盘的2-33号扇区,一共占用32个扇区,能够容纳128个分区表项。每个分区表项大小为128字节。因为每个分区表项管理一个分区,所以GPT磁盘可以创建128个分区。
GPT分区表使用简单而直接的方式表示分区。一个分区表项的前16字节是分区类型GUID。接下来的16字节是该分区唯一的GUID(这个GUID指的是该分区本身,而之前的GUID指的是该分区的类型)。再接下来是分区起始和末尾的64位LBA编号,以及分区的名字和属性。
LBA34:分区区域
GPT分区区域就是用户使用的分区,也是用户进行数据存储的区域。分区区域的起始地址和结束地址由GPT头定义。
LBA -33~-2:分区表备份
分区区域结束后就是分区表备份,其地址在GPT头备份扇区中有描述。分区表备份是对分区表32个扇区的完整备份。如果分区表被破坏,系统会自动读取分区表备份,也能够保证正常识别分区
LBA -1:GPT头备份
GPT头有一个备份,放在GPT磁盘的最后一个扇区,但这个GPT头备份并非完全GPT头备份,某些参数有些不一样。复制的时候根据实际情况更改一下即可。
GPT分区特点:
GPT分区优点:
与目前普遍使用的主引导记录(MBR)分区方案相比,GPT提供了更加灵活的磁盘分区机制。它具有如下优点:
1、支持2TB以上的大硬盘。
2、每个磁盘的分区个数几乎没有限制(Windows系统最多只允许划分128个分区)。
3、分区大小几乎没有限制。
4、分区表自带备份。在磁盘的首尾部分分别保存了一份相同的分区表,其中一份被破坏后,可以通过另一份恢复;
5、循环冗余检验值针对关键数据结构而计算,提高了数据崩溃的检测几率;
6、虽然MBR提供1字节分区类型代码,但GPT使用一个16字节的全局唯一标识符(GUID)值来标识分区
类型,这使分区类型更不容易冲突;
7、每个分区可以有一个名称(不同于卷标)。
BIOS和UEFI:
BIOS(Basic Input Output System 基本输入输出系统):电脑主板上内置的程序代码。
作用:开机自检、引导操作系统。操作系统开始启动之后,BIOS的任务就完成了 BIOS只能识别到主引导记录(MBR)初始化的硬盘,最大支持2T的硬盘,4个主分区(逻辑分区中的扩展分区除外)。
EFI(Extensible Firmware Interface)可扩展固件接口。是因特尔首先发布出来的,后来各大公司就加入,形成了一个 UEFI的国际组织。
EFI:相当于新版BIOS。
UEFI(Unified Extensible Firmware Interface)统一的可扩展固件接口:支持更大的内存、支持gpt分区和图形界面等。
常用组合方式:
- BIOS+MBR
- UEFI+GPT
运行流程:

所谓的磁盘分区指的是告诉操作系统『我这颗磁盘在此分割槽可以存取的区域是由 A 磁柱到 B 磁柱之间的区块』, 如此一来操作系统就能够知道他可以在所指定的区块内进行文件数据的读/写/搜寻等动作了。 也就是说,磁盘分区意即指定分割槽的启始与结束磁柱就是了。
分区是用设备名称加数字命名的。例如 hda1 代表hda这个硬盘设备上的第一个分区。 每个硬盘可以最多有四个主分区,作用是 1-4 命名硬盘的主分区。多个主分区中只能有一个active 主分区作为启动分区。逻辑分区是从5开始的,每多一个分区,每个磁盘上最多可以有 24个扩展分区。
创建分区:
- fdisk --- 一个老牌工具,一般用来管理MBR分区
- gdisk --- 管理GPT分区
1. fdisk创建分区
fdisk参数:
- p 分区列表
- t 更改分区类型
- n 创建新分区
- d 删除分区
- v 校验分区
- u 转换单位
- w 保存并退出
- q 不保存并退出
说明: 开始分区后输入 n,新增分区,然后选择 p ,分区类型为主分区。两次回车默认剩余全部空间。最后输入 w 写入分区并退出,若不保存退出输入 q。
运行 fdisk 来创建主分区:
[root]# fdisk /dev/sdb
Command (m for help): m (Enter the letter "m" to get list of commands)
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-9729, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-9729, default 9729):
Using default value 9729
Command (m for help): w (Write and save partition table)
[root]# mkfs.ext4 -L disk2 /dev/sdb

该磁盘有255个heads,也就是说共有255个盘面。2610个柱面(cylinders),也就是说每个盘面上都有2610个磁道, 63 sectors/track说的是每个磁道上共有63个扇区。
命令结果也给出了Sector size的值是512bytes。那我们动笔算一下该磁盘的大小吧。
255盘面 * 2610柱面 * 63扇区 * 每个扇区512bytes ,结果是21.4G和磁盘的总大小相符。
建立第一个扩展区:
命令(输入 m 获取帮助): n
Partition type
p primary (3 primary, 0 extended, 1 free)
e extended (container for logical partitions)
Select (default e): e
Selected partition 4
First sector (25167872-41943039, default 25167872):
Last sector, +sectors or +size{K,M,G,T,P} (25167872-41943039, default 41943039): +6G
Created a new partition 4 of type 'Extended' and of size 6 GiB.
建立两个逻辑分区:
命令(输入 m 获取帮助): n
All primary partitions are in use.
Adding logical partition 5
First sector (25169920-37750783, default 25169920):
Last sector, +sectors or +size{K,M,G,T,P} (25169920-37750783, default 37750783): +1G
Created a new partition 5 of type 'Linux' and of size 1 GiB.
命令(输入 m 获取帮助): p
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x4dbeae7b
设备 启动 Start 末尾 扇区 Size Id 类型
/dev/sdb1 2048 8390655 8388608 4G 83 Linux
/dev/sdb2 8390656 16779263 8388608 4G 83 Linux
/dev/sdb3 16779264 25167871 8388608 4G 83 Linux
/dev/sdb4 25167872 37750783 12582912 6G 5 扩展
/dev/sdb5 25169920 27267071 2097152 1G 83 Linux
命令(输入 m 获取帮助): n
All primary partitions are in use.
Adding logical partition 6
First sector (27269120-37750783, default 27269120):
Last sector, +sectors or +size{K,M,G,T,P} (27269120-37750783, default 37750783): +1G
Created a new partition 6 of type 'Linux' and of size 1 GiB.
命令(输入 m 获取帮助): p
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x4dbeae7b
设备 启动 Start 末尾 扇区 Size Id 类型
/dev/sdb1 2048 8390655 8388608 4G 83 Linux
/dev/sdb2 8390656 16779263 8388608 4G 83 Linux
/dev/sdb3 16779264 25167871 8388608 4G 83 Linux
/dev/sdb4 25167872 37750783 12582912 6G 5 扩展
/dev/sdb5 25169920 27267071 2097152 1G 83 Linux
/dev/sdb6 27269120 29366271 2097152 1G 83 Linux
删除分区:
命令(输入 m 获取帮助): d
分区号 (1-6, default 6):
Partition 6 has been deleted.
命令(输入 m 获取帮助): p
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x4dbeae7b
设备 启动 Start 末尾 扇区 Size Id 类型
/dev/sdb1 2048 8390655 8388608 4G 83 Linux
/dev/sdb2 8390656 16779263 8388608 4G 83 Linux
/dev/sdb3 16779264 25167871 8388608 4G 83 Linux
/dev/sdb4 25167872 37750783 12582912 6G 5 扩展
/dev/sdb5 25169920 27267071 2097152 1G 83 Linux
分多个区有以下几个目的:
2. gdisk创建分区
gdisk和fdisk都可以给磁盘分区,gdisk适用于gpt作为引导扇区的情况,fdisk适用与MBR作为引导扇区的情况。两者的使用方法基本一样,下面介绍gdisk的使用方法。
gdisk基本上不用记命令,直接在终端输入gdisk然后根据提示就可以完成操作,如下图。注意要操作的设备就是sda,后面没有任何数字。

输入?之后可以看到gdisk支持的各种命令。使用p显示磁盘分区的信息,输出的信息和lsblk有点像(简略一些)其中Code表示在分区内可能存在的文件类型,如Linux为8300,swap为8200。

下面建立三个新的分区。已经在上面看到,整个磁盘最大的扇区号为83886046,目前只使用到了65026047。因此可以建立:
具体操作过程如下图。
Partition number表示该分区的编号,因为是第四个分区,所以默认值为4;
First sector就是新分区的第一个扇区,默认就是顺序第一个空扇区;
Last sector是新分区的最后一个扇区,默认是整个磁盘最后一个扇区,也就是分配完全部磁盘空间。这里只需要1G,因此写+1G,这种偏移量的表达方式也是可以的;
最后要求选择文件系统类型,选择默认的linux就行。其实这里的文件系统类型不一定是真正的文件系统类型,之后格式化的时候还可以更改文件系统类型。

分配完扇区之后,再次使用p显示当前的分区情况,如下图:

至此就成功完成了分区的操作。要注意的是创建分区只是修改了gpt的内容,对磁盘上相应扇区的内容没有任何改变,之后还要给这一段磁盘空间写入文件系统,即格式化。最后将格式化的磁盘挂载到一个目录下面才能正常使用这一段存储空间。
之后再创建上文提到的其他分区,然后退出gdisk(使用w退出程序)。使用partprobe指令即可更新系统的分区表(分区表/proc/partitions只是一个文本文件,会记录gpt的信息,在/proc/partitions中没有显示分区信息只是该文件还没有更新)
具体操作过程如下图:

方法一: partprobe命令:
新的分区表已经写入了硬盘,但是没有复制到内存中,我们使用fdisk和lsblk命令看到的都是内存中的分区表。所以使用partprobe命令来同步 。
方法二:- 重启计算机
注意:
分区的设备名称是不稳定的,比如两个扩展分区5和6,删除了5,6会变成5。
查看内核是否已经识别新的分区:`cat /proc/partations` 。
创建swap空间,分区的id要改为82,创建逻辑卷,物理设备分区的id要改成8e fdisk的t选项。
备份MBR分区表:
dd命令:直接以二进制的形式来访问磁盘数据 。
dd if(input file)=/dev/sda of(out file)=/data/mbr bs=1(一次读一个字节) count=64(读64次) skip=446(跳过硬盘的前446个字节)
dd命令:
按照指定大小的数据块来拷贝文件,并在拷贝的过程中对内容进行转换。
#选项:
- if:源文件(输入文件)
- of:目标文件(目的文件)
- bs:每一块的大小
- count:拷贝多少个
- skip:从输入文件跳过开头多少个块后开始复制 #单位和bs的单位一样
- seek:从输出文件开头跳过多少个块开始复制
查看二进制文件的十六进制编码。
#查看二进制文件的十六进制编码:hexdump -C filename
#选项:
-C:输出十六进制对应的字符
-n:显示前多少个字节
#如果不加选项: hexdump filename -- 已两个字节为一组的十六进制倒叙显示
#hexdump命令使用链接:https://www.cdsy.xyz/computer/system/linux/250605/cd74289.html
#备份的这个分区表文件不能放在本地,因为如果分区表坏了,这个文件也找不到了。
