admin 管理员组

文章数量: 887021

Linux磁盘分区

文章目录

  • Linux磁盘分区
    • 1 磁盘连接的方式与装置文件名的关系
      • 1.1 IDE接口在Linux下的装备名
      • 1.2 SATA接口在Linux下的装备名
    • 2 磁盘的组成
    • 3 磁盘分区
      • 3.1 磁盘分区表
      • 3.2 相关命令

每次学到有关硬件的知识都感觉头要秃了…但是学Linux感觉始终没有办法逃避这个问题,特别是有关磁盘这一块的内容。

如果想在主机系统里新增一个硬盘,要完成的动作有:

  • 对磁盘进行划分,创建可用的分区
  • 对分区进行格式化,以创建系统可用的文件系统
  • 对刚刚创建好的文件系统进行检验
  • 挂载

这篇文章主要是介绍一些磁盘分区的内容,至于后续步骤涉及到的部分后面也会接着学习并发布学习成果的!我参考的内容基本都来源于鸟叔私房菜,这书真的讲得很清楚,yyds!如果已经了解一些磁盘的基础知识,想直接利用分区工具进行分区的,直接跳到文章最后相关命令的介绍即可。

some 概念:

  • 磁盘

    计算机主要的存储介质,断电后能保持数据不丢失。早期计算机使用的磁盘是软磁盘(简称软盘),现在常用的磁盘是硬盘。

  • 硬盘接口

    硬盘连接主机系统的部位,在硬盘缓存和主机内存之间传输数据。常见的接口类型有IDE、SATA以及SCSI等。SATA是现在PC机硬盘的主流趋势。

1 磁盘连接的方式与装置文件名的关系

在Linux中,每个设备都被当成一个文件来对待。Linux系统下,几乎所有的设备都在"/dev"这个目录下。

常见的一些设备在Linux下的文件名(不同的Linux发行版可能对应的文件名有所不同):

设备名在Linux中的文件名
SCSI、SATA、USB磁盘驱动器/dev/sd[a-p]
U盘/dev/sd[a-p]
软盘驱动器/dev/fd[0-1]

1.1 IDE接口在Linux下的装备名

一个IDE接口可以接两个IDE设备(比如硬盘和光驱),而一个主机主板上一般又两个IDE接口,所以一台主机一般会可以连接4个IDE设备。每块主板上的IDE接口通常被称为IDE1和IDE2,每个IDE接口上的设备又可以区分为Master和Slave。对于每个设备来说,其在Linux系统下的文件名为:

MasterSlave
IDE1/dev/hda/dev/hdb
IDE2/dev/hdc/dev/hdd

不管IDE接口上连接了几个设备,它的文件名的对应关系都和上表一致。比如只有一个硬盘接在IDE1的Slave上面,那么它在Linux系统中的文件名就为/dev/hdb。

1.2 SATA接口在Linux下的装备名

对于SATA接口,由于SATA、U盘、SCSI等接口都是使用SCSI模块来驱动,所以这些接口的装置名都是/dev/sd[a-p]的格式。SATA接口以及U盘接口的磁盘都是没有顺序的,它的文件名由Linux核心侦测到磁盘的顺序来决定。

如果某台电脑上有两个SATA磁盘以及一个U盘磁盘,而主板上面有六个SATA的插槽。这两个SATA磁盘分别安插在主板上的SATA1, SATA5插槽上。根据侦测到的顺序来决定装置文件名,这三个磁盘在Linux中的文件名分别为:

设备文件名
SATA1插槽上的磁盘/dev/sda
SATA5插槽上的磁盘/dev/sdb
U盘磁碟(启动完成后才被系统捉到)/dev/sdc
# 大家可以进到/dev目录下自行查看里面的设备名称,目前基本都是SATA接口
cd /dev
ls

2 磁盘的组成

参考:5 分钟图解 磁盘的结构(盘片、磁道、扇区、柱面)
存储基础知识:扇区与块/簇

磁盘的组成主要有:盘片、机械手臂、磁头与主轴。

一个磁盘由多个盘片叠加而成,每个盘片包含两个面,每个盘面都对应地有一个读/写磁头。受到硬盘整体体积和生产成本的限制,盘片数量都受到限制,一般都在5片以内。盘片的编号自下向上从0开始,如最下边的盘片有0面和1面,再上一个盘片就编号为2面和3面。:

每个盘片又被划分为一个个个同心圆轨道,即磁道,一般从外向里从0开始编号。从圆心向外画直线,可以将磁道划分为若干个弧段,每个磁道上一个弧段被称之为一个扇区,扇区是磁盘的最小组成单元,通常是512字节:

每个盘面对应一个磁头,所有的磁头都是连在同一个磁臂上的。所有盘面中相对位置相同的磁道(即每个磁盘上编号相同的磁道)组成柱面:

以一个盘面为例,如下图所示,图中A所指向的粉红色圆环即为一个磁道,B所指向的紫色部分为几何中所指的扇形,而不是一个扇区,C所指的粉红色圆环和紫色扇形的交叉部分才是扇区。

数据读写的过程:

定位时,首先确定柱面,再确定盘面,然后确定扇区。之后所有磁头一起定位到指定柱面,再旋转盘面使指定扇区位于磁头之下。写数据时,当前柱面的当前磁道写满后,开始在当前柱面的下一个磁道写入,只有当前柱面全部写满后,才将磁头移动到下一个柱面。在对硬盘分区时,各个分区也是以柱面为单位划分的,即从什么柱面到什么柱面;不存在一个柱面同属于多个分区。

3 磁盘分区

在具备了上述知识之后,就开始正题啦!

进行分区的意义是什么:

  • 安全。每个分区的数据是分开的,当需要对某个分区的数据重整时,可以将该分区里其它重要数据放置在其它分区。
  • 高效。分区将数据集中在某个磁柱的区段内,有助于数据的读取。

在磁盘的第一个扇区中(磁盘引导扇区),记录了两个比较重要的信息。通常这个扇区包含以下内容:

  • 主引导记录(MBR):可以安装启动管理程序的地方,有446 bytes
  • 分区表。记录整颗硬盘分割的状态,有64 bytes。

磁盘引导扇区非常的重要,读取硬盘时,都会从这个扇区先读取。在计算机启动时,BIOS(写到主板上的一个软件程序)会根据使用者的配置区取得能够启动的硬盘,并且去读取磁盘引导扇区中的MBR。MBR里存放着最基本的启动管理程序,这个管理启动管理程序的目的是加载核心文件,加载后核心文件就开始操作系统的功能。

Boot loader是操作系统安装在MBR上的一套软件,其主要的任务是:

  • 提供菜单:使用者可以选择不同的启动项目
  • 加载核心文件:直接指向可启动的程序区段来开始操作系统
  • 转交其它loader:将启动管理功能交给其它loader负责

3.1 磁盘分区表

如下图所示,开始磁柱和结束磁柱即为文件系统的最小单位,即磁盘分区的最小单位。

也就是说磁柱是磁盘分区的最小单位

在分区表所在的64 bytes容量中,总共分为四组记录区,每组记录区记录了该区段的启始与结束的磁柱号码。

例如:假如硬盘有400个磁柱,共分为4个分区。第一个分区是1-100磁柱;第二个分区是101-200磁柱;第三个分区是201-300磁柱;第四个分区是301-400磁柱。(图源鸟叔私房菜)

假设这个硬盘的文件名为/dev/hda,那么这几个分区在Linux系统中的文件名分别为:

  • P1:/dev/hda1
  • P2:/dev/hda2
  • P3:/dev/hda3
  • P4:/dev/hda4

假设有数据要写入第四个分区,这也就意味着数据会写入到301-400磁柱范围内。

tips:

  • 分割其实不是说真的对这些磁柱做了一些物理意义上的隔断,只是针对分区表做了配置,哪些磁柱属于哪一个分区。
  • 硬盘默认的分区表仅仅能写入四组分区信息。这四组分区称为主要(Primary)或延伸(Extended)分区。
  • 当系统要写入磁盘时,要参考磁盘分区表,才能针对某个分区进行数据的处理。
  • 分区的最小单位是磁柱。

在上面有提到,硬盘默认的分区表仅仅能写入四组分区的信息,但在实际中,一个硬盘不仅只能划分出4个分区,它可以划分出更多的分区,这是通过扩展分配的方式来实现的。

如下图所示(图源鸟叔私房菜),这个硬盘四个分区记录表只使用了两个,P1为主要分区,P2为扩展分区。扩展分区用来记录额外的分区信息,扩展分区本身不能被格式化。通过扩展分区所指向的那个区块继续做分区的记录。如下图,由扩展分区分出了5个分区,这5个分区称为逻辑分区。这五个分区的文件名分别为:

  • P1:/dev/hda1
  • P2:/dev/hda2
  • L1:/dev/hda5
  • L2:/dev/hda6
  • L3:/dev/hda7
  • L4:/dev/hda8
  • L5:/dev/hda9

之所以没有/dev/hda3和/dev/hda4是因为前面四个号码都是保留给Primary或Extended用的,逻辑分区的编号从5开始。

tips:

  • 主要分区和扩展分区最多有四个
  • 扩展分区最多只能有一个
  • 逻辑分区是由扩展分区持续切割出来的分区
  • 能够被格式化后,作为数据存取的分区为主要分区和逻辑分区。扩展分区无法格式化。
  • 逻辑分区的数量因操作系统而不同,在Linux中,IDE硬盘最多由59个逻辑分区,SATA硬盘则有11个逻辑分区。

3.2 相关命令

  • fdisk

    fdisk是一个磁盘分区工具,用法如下图所示:

以我的系统为例,对/dev/sda进行分区:

# root用户才有使用fdisk命令
[root@centos liusongle]# fdisk /dev/sda
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。


命令(输入 m 获取帮助)

进入到分区界面后,在使用时如果记不得命令,可以输入m可以获取命令介绍:

命令(输入 m 获取帮助):m
命令操作
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   # 删除一个磁盘分区
   d   delete a partition
   g   create a new empty GPT partition table
   G   create an IRIX (SGI) partition table
   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可以离开fdisk,所做的操作不会生效;
   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,那么动作就会生效。
   w   write table to disk and exit
   x   extra functionality (experts only)

输入p,可以查看磁盘分区的信息:

命令(输入 m 获取帮助):p
# 磁盘名称为/dev/sda,容量为21.5 GB
磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
# 每个磁柱大小
Units = 扇区 of 1 * 512 = 512 bytes
# 扇区大小
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
# 磁盘分区形式。dos->MBR;gpt->GPT
磁盘标签类型:dos
# 磁盘标识符
磁盘标识符:0x000ac44b

# 装置文件名          是否为引导块          开始磁柱                结束磁柱        以1K为单位的容量  分区内的文件系统
   设备                           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

删除分区(记住不要轻易按下w键,否则操作会生效):

命令(输入 m 获取帮助):d
分区号 (1-3,默认 3):3
分区 3 已删除

命令(输入 m 获取帮助):d
分区号 (1,2,默认 2):2
分区 2 已删除

命令(输入 m 获取帮助):p

磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000ac44b

   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      616447      307200   83  Linux

# 按q即可退出且操作不生效
命令(输入 m 获取帮助):q

[root@centos liusongle]# 

新增磁盘分区:

# 先将有的分区删除,方便后面新增
命令(输入 m 获取帮助):d
分区号 (1-3,默认 3):3
分区 3 已删除

命令(输入 m 获取帮助):d
分区号 (1,2,默认 2):2
分区 2 已删除

# 只剩下一个分区,系统自动删除1号分区
命令(输入 m 获取帮助):d
已选择分区 1
分区 1 已删除

# 输入n,新增磁盘分区,可以选择新增主要分区(p)还是扩展分区(e)
命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
  # 先增加一个主要分区
Select (default p): p
# 分区号在1-4之间,这里选择了4
分区号 (1-4,默认 1):4
# 按下enter键可以即为默认值
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
# 两种格式,自己计算起始磁柱或者使用容量大小让系统自动寻找最接近的磁柱号码
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+ 512M
不支持的后缀:“512M”。
支持:10^N: KB (千字节), MB (兆字节), GB (吉字节)
            2^N: K  (约千字节), M  (约兆字节), G  (约吉字节)
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+512M
分区 4 已设置为 Linux 类型,大小设为 512 MiB

# 查看新增加的分区
命令(输入 m 获取帮助):p

磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000ac44b

# 新增了一块4号分区
   设备 Boot      Start         End      Blocks   Id  System
/dev/sda4            2048     1050623      524288   83  Linux

# 继续新增一个Extended分区,扩展分区最好能包含所有未分割的磁柱区间
命令(输入 m 获取帮助):n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
 # 新增扩展分区
Select (default p): e
分区号 (1-3,默认 1):1
# 为了包含所有磁柱,起始和结束磁柱号都使用了默认值(直接按enter)
起始 扇区 (1050624-41943039,默认为 1050624):
将使用默认值 1050624
Last 扇区, +扇区 or +size{K,M,G} (1050624-41943039,默认为 41943039):
将使用默认值 41943039
分区 1 已设置为 Extended 类型,大小设为 19.5 GiB

命令(输入 m 获取帮助):p

磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000ac44b

# 新增了extended分区
   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1         1050624    41943039    20446208    5  Extended
/dev/sda4            2048     1050623      524288   83  Linux

# 新增逻辑分区(已经有了扩展分区的才会让选逻辑分区)
命令(输入 m 获取帮助):n
Partition type:
   p   primary (1 primary, 1 extended, 2 free)
   l   logical (numbered from 5)
Select (default p): l
添加逻辑分区 5
起始 扇区 (1052672-41943039,默认为 1052672):
将使用默认值 1052672
# 创建一个大小为2G(即2048M)的逻辑分区
Last 扇区, +扇区 or +size{K,M,G} (1052672-41943039,默认为 41943039):+2048M
分区 5 已设置为 Linux 类型,大小设为 2 GiB

命令(输入 m 获取帮助):p

磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000ac44b

# 逻辑分区添加成功
   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1         1050624    41943039    20446208    5  Extended
/dev/sda4            2048     1050623      524288   83  Linux
/dev/sda5         1052672     5246975     2097152   83  Linux
  • parted

​ 由于fdisk没有办法处理大于2TB以上的磁盘分区,这个时候就需要用到parted命令。

​ parted命令的用法如下所示:

[root@centos liusongle]# parted
GNU Parted 3.1
使用 /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) help                                                             
  align-check TYPE N                        check partition N for TYPE(min|opt)
        alignment
  help [COMMAND]                           print general help, or help on COMMAND
  mklabel,mktable LABEL-TYPE               create a new disklabel (partition table)
  mkpart PART-TYPE [FS-TYPE] START END     make a partition
  name NUMBER NAME                         name partition NUMBER as NAME
  print [devices|free|list,all|NUMBER]     display the partition table, available
        devices, free space, all found partitions, or a particular partition
  quit                                     exit program
  rescue START END                         rescue a lost partition near START and END
  
  resizepart NUMBER END                    resize partition NUMBER
  rm NUMBER                                delete partition NUMBER
  select DEVICE                            choose the device to edit
  disk_set FLAG STATE                      change the FLAG on selected device
  disk_toggle [FLAG]                       toggle the state of FLAG on selected device
  set NUMBER FLAG STATE                    change the FLAG on partition NUMBER
  toggle [NUMBER [FLAG]]                   toggle the state of FLAG on partition NUMBER
  unit UNIT                                set the default unit to UNIT
  version                                  display the version number and copyright
        information of GNU Parted

列出本机的分区表数据:

[root@centos liusongle]# parted /dev/sda print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sda: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 
# 分区号        起始磁柱在磁盘的哪个容量  结束磁柱           分区容量            类型                文件系统         启动分区
Number                     Start                         End                 Size                    Type           File system           标志
 1                             1049kB                       316MB           315MB                primary       xfs                         启动
 2                                316MB                     2463MB          2147MB             primary      linux-swap(v1)
 3                                2463MB                      21.5GB             19.0GB            primary      xfs

创建一个分区:

# 这里用的是鸟叔的代码,因为我没创建扩展分区,所以也创建不了逻辑分区,就没有进行练习啦
创建一个约为 512MB 容量的逻辑分割槽
[root@www ~]# parted /dev/hdc mkpart logical ext3 19.2GB 19.7GB
# 请参考前一表格的命令介绍,因为我们的 /dev/hdc7 在 19.2GB  位置结束,
# 所以我们当然要由 19.2GB 位置处继续下一个分割,这样懂了吧?
[root@www ~]# parted /dev/hdc print
..........
 7      18.9GB  19.2GB  263MB   logical   linux-swap
 8      19.2GB  19.7GB  502MB   logical  <==就是刚刚创建的啦!

以上就是磁盘分区的内容了,磁盘的格式化和挂载就后面再写了 !

本文标签: 磁盘分区 Linux