磁盘分区以及挂载

要想使用一块硬盘,我们需要怎么做呢?假设操作系统已经识别到了一块硬盘,剩下的在linux上主要可以分成三步来完成: - 分区(对硬盘进行划分) - 格式化分区(在分区上进行文件系统初始化) - 将格式化好的分区(文件系统)进行挂载

这篇博客主要记录磁盘分区知识。

目前,磁盘分区主要使用两种方式,分别是MBR磁盘分区方式与GPT磁盘分区方式。其中前者是比后者先出现,后来随着磁盘容量越来越大,前者已经不能很好的适应新的状况了,于是出现了后者。但是如今个人电脑磁盘分区主要还是使用MBR分区方式,因为在磁盘容量没有大于2.2TB时,完全够用,而且可以很好的兼容旧的主板。

其实所谓的分区方式其实是一种格式,按照某种格式对磁盘进行划分。

MBR分区格式

MBR(Master Boot Record,主引导记录)的根源是windows用来处理启动引导程序和分区表的方式。早期的linux系统为了兼容windows的磁盘,也使用了这种分区方式。

所以,MBR分区格式的做法其实是将启动引导程序记录区分区表都放在了磁盘的第一个扇区(早期通常是一个扇区512字节)。其中 - 主引导记录(Master Boot Record,也就是MBR): 也就是可以安装启动引导程序的地方,占据446字节。 - 分区表(partition table): 记录整块硬盘分区的状态,占据64字节空间。

我们今天主要讨论的就是上述的分区表。这个分区表只有64字节,最多放置四组记录区,每组记录区记录了一个分区的起始与结束的柱面号码。如下大致如下图所示:

mbr_partition

上述由磁盘第一个扇区上的分区表划分出来的分区(最多四个)叫做主要分区或者叫做扩展分区。分区的最小单位是柱面(cylinder)。什么是柱面可以参考下面的磁盘构造图

disk

只能划分四个分区是肯定不行的,在MBR分区格式中我们还可以使用扩展分区的方式来实现多于四个分区的情况。如下图所示,便是一个扩展分区的例子。

mbr_extend

在这个例子中,磁盘第一个扇区上的分区表我们只使用了前两组分区记录表,第一个是主分区,第二个是扩展分区。通常每组分区记录中会有一个字节是存储分区类型值的,可以在此指定为扩展分区。然后扩展分区会在自己的区域再次进行分区划分,图中的L1~L5是扩展分区上划分出来的五个逻辑分区

其实扩展分区本质上并不是一个分区,它是一个指向下一个分区的指针,这种指针结构最后会形成一个单向链表。具体扩展分区形式比较复杂,以后我完全弄懂了再补充,如今先按照上图中的方式理解。

总结

  • 主要分区与扩展分区最多可以有4个
  • 扩展分区最多只能有1个(操作系统的限制)
  • 逻辑分球是由扩展分区持续划分出来的分区
  • 主要分区与逻辑分区可以被格式化或最为数据存取的分区,扩展分区不能(本质上不是一个分区)
  • 逻辑分区的容量依据操作系统而不同,在linux上SATA硬盘可以突破63个以上的分区限制。

每个物理磁盘文件的文件名为/dev/sd[a~p]的格式,而每个磁盘上的分区文件的文件名(拿/dev/sda磁盘文件举例)被命名成/dev/sda[1~128],mbr分区表中/dev/sda[1~4]是主分区或扩展分区,剩下的是逻辑分区。

GPT分区格式

MBR分区格式虽然使用的很多,但是它也有局限。首先硬盘首扇区上的分区表上只有64字节,于是每组记录区只有16字节,可以记录的信息十分有限。通常会有如下问题: - 操作系统无法使用超过2TB(具体没分析)以上的磁盘容量; - MBR上只有一个区块记录分区信息,被破坏后基本就是坏了; - MBR内的启动引导程序只有446字节,无法存储较多程序代码。

首先目前其实已经有4k扇区的磁盘出现,但是为了兼容所有的磁盘,大多会使用逻辑区块地址(logical block address, LBA)来规划磁盘区块,每个LBA默认512字节。

GPT(GUID partition table)磁盘分区表可以解决MBR的问题。首先,GPT使用磁盘前34个LBA区块(LBA0~LBA33)来记录分区信息,并且将硬盘最后34个LBA区块拿来作为备份。整体结构如下图所示。

gpt

其中,上图中的结构解释如下:

  • LBA0(MBR兼容区块)

  与MBR模式兼容,这个区块的结构基本不变,第一部分是446字节的第一阶段的启动引导程序。而第二部分放的不是分区信息,而是标识符用来表示磁盘使用GPT分区格式。如果是不能读懂GPT分区表格式的磁盘管理程序就不能使用这块磁盘。 - LBA1(GPT表头记录)

这部分记录了分区表本身的位置与大小,同时记录了备份用的GPT分区放置的位置。同时还有一个用来检测GPT分区表是否正常的校验码,如果检测结果是不正常,便可以获取前面记录的备份用的GPT分区信息使得可以获得正确的分区信息。
  • LBA2~LBA33(实际记录分区信息的地方)

    这32个区块,每个记录了四组分区信息(512字节),所以默认一共可以记录128组分区信息,每组分区信息使用128字节存储。这128字节的空间中有除去记录标识符之类的信息外,使用64位来记录分区开始/结束的扇区号码。所以可以寻址的空间是2^64 * 512字节也就是 $ 2^33 $TB的空间。

linux界面分区软件gparted

启动软件

sudo gparted

如果没有安装,需要先安装

sudo apt install gparted

运行后如下界面

gparted

这是我虚拟机的分区情况,首先有一个主分区/dev/sda1,挂载在/目录下,与一个扩展分区/dev/sda2,扩展分区只分了一个逻辑分区/dev/sda5作为内存的交换分区。

一般这种图形界面的分区软件都是分区与文件系统初始化同时进行的。十分周到到位,下面讲的命令行分区命令一般都是仅仅进行分区操作(即只对分区表进行填写),文件系统初始化需要专用的命令进行。

分区命令行

  • lsblk列出计算机硬盘与分区情况
    1
    2
    3
    4
    5
    6
    7
    xhy@ubuntu:~$ lsblk
    NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    sr0 11:0 1 1024M 0 rom
    sda 8:0 0 50G 0 disk
    ├─sda2 8:2 0 1K 0 part
    ├─sda5 8:5 0 2G 0 part
    └─sda1 8:1 0 48G 0 part /
    ---
  • blkid查看一个分区的文件系统,UUId等
  • 使用parted可以列出磁盘的分区表类型与分区信息(其实它的功能十分强大),也可以使用这个命令来进行磁盘分区操作(两种分区表格式都支持)。
parted-blkid
  • 分区操作命令gdiskfdisk(前一个针对gpt分区表的磁盘,后一个针对mbr分区表的磁盘)

挂载分区

1
2
3
4
5
6
7
8
9
10
11
12
13
# 首先需要将分区文件系统格式化成可用形式,我一般用ext4
sudo mkfs -t ext4 /dev/sda1
# 查看该分区信息,包括文件系统和uuid这些
sudo blkid /dev/sda1
# 新建一个文件夹用于挂载
mkdir -p /home/line/media
# 设置分区自动挂载,在/etc/fstab末尾添加(其中第一行是分区的uuid)
# UUID=21e3c5b1-5a43-4df2-b41a-5f6a5cfc67cc /home/line/media ext4 defaults 0 2
sudo vim /etc/fstab
# 重启,或者用以下命令将/etc/fstab中设置的所有进行挂载
sudo mount -a
# 查看分区挂载以及占用情况
df -h

此处自动挂载添加的UUID=21e3c5b1-5a43-4df2-b41a-5f6a5cfc67cc /home/line/media ext4 defaults 0 2总共有6列,第一列表示待挂载的分区的uuid,第二列表示挂载目录,第三列为分区的文件类型,第四列表示挂载设置,一般默认default的设置就可以;第五列表示是否备份数据,第六列表示fsck磁盘检查的设置,0为不检查,1一般是根目录的设置值,从2开始数字越小越先检查,数字相同则同时检查。

经验:挂载分区多或者大可能会影响硬盘读取速度。

linux交换分区的设置

交换分区本质是一种用途独特的分区。 ## 第一种方法:分区挂载 - 使用上述分区方法得到一个/dev/sda5的分区

  • 交换分区一般并没有挂载,可以在觉得内存不足时再进行挂载。如下使用free命令查看内存是否挂载

    1
    2
    3
    4
    xhy@ubuntu:~$ free
    total used free shared buff/cache available
    Mem: 2017308 894012 362524 24756 760772 892696
    Swap: 0 0 0
    ---

  • 如上,显示交换分区并没有挂载,可以使用swapon命令进行挂载

    1
    2
    3
    4
    5
    6
    xhy@ubuntu:~$ sudo swapon /dev/sda5 
    [sudo] xhy 的密码:
    xhy@ubuntu:~$ free
    total used free shared buff/cache available
    Mem: 2017308 894712 360908 24756 761688 892008
    Swap: 2046972 0 2046972
    --- 如上,挂载成功。

  • 每一次都手动挂载如果不耐烦,可以设置自动挂载,在文件/etc/fstab最后一行添加/dev/sda5 swap swap defaults 0 0即可。

  • 然后先使用swapoff /dev/sda5即可将前面的挂载的交换分区卸载。然后swapon -a执行一下,不用重启即可自动挂载。

  • 最后使用swapon -s查看交换分区挂载情况

    1
    2
    3
    xhy@ubuntu:~$ swapon -s
    Filename Type Size Used Priority
    /dev/sda5 partition 2046972 0 -2
    ---

第二种方法:文件挂载

  • 具体思路

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 创建16g交换空间文件
    sudo fallocate -l 16G /swapfile
    # 修改交换空间文件权限
    sudo chmod 600 /swapfile
    # 格式化交换空间文件
    sudo mkswap /swapfile
    # 设置开机自动挂载
    echo "/swapfile swap swap defaults 0 0" | sudo tee -a /etc/fstab

  • 如果fallocate报错fallocate: fallocate failed: Text file busy,表示目前已经有交换空间,并且在使用中,可以通过sudo swapoff -a先关闭交换空间

  • 如果不想重启,也可以直接sudo swapon /swapfile直接挂载交换空间文件

参考资料

  • [1] 鸟哥的linux私房菜(第四版)
  • [2] https://baike.baidu.com/item/%E6%89%A9%E5%B1%95%E5%88%86%E5%8C%BA
  • [3] https://gparted.org/

磁盘分区以及挂载
http://line.com/2018/12/02/2018-12-02-disk-partition/
作者
Line
发布于
2018年12月2日
许可协议