菜鸟笔记
提升您的技术认知

linux中的如何进行磁盘分区

前言

在深入这部分知识之前,我们需要知道linux对于计算机各组件和设备的识别与windows系统完全不同,在linux系统中任何物理存储设备接入系统后都是以文件的形式存在的,在本文中首先会对各硬件设备在linux中的文件名加以介绍,随后将介绍在linux中如何进行设备挂载以及磁盘分区的相关内容。

一、linux中的各硬件设备的文件名

物理设备名称 设备识别文件名称
SATA / SAS / USB (串口硬盘) dev/sd[a-p] ([a-p]表示为括号内a-p字母中任意一个)
IDE(并口i硬盘) /dev/hd[a-d]
Virtio接口 /dev/vd[a-p]
M2/SSD /dev/nvme0,/dev/nvme1
SD/MMC/EMMC /dev/mmcblk0 , /dev/mmcblk1
CD-ROM DVD-ROM /dev/scd[0-1] (通用) /dev/sr[0-1] (通用, CentOS较为常见) /dev/cdrom (当前CD-ROM)

设备接入后,我们可以使用以下命令来对设备进行查看:

fdisk -l      ##查看磁盘分区情况
lsblk         ##查看设备使用情况
blkid         ##查看设备管理方式及设备id
df            ##查看正在被系统挂载的设备
cat /proc/partitions  ##查看系统中可被识别的设备

0.预备知识

1. 磁盘分区

磁盘分区主要有MBR和GPT两种格式,这两种格式所使用的分区工具有所区别。

格式 介绍 所使用的分区命令 分区表大小 支持分区个数 支持单个分区大小 位数
MBR MBR又被称为主引导记录,是一段引导代码,主要负责定位分区引导信息等工作,它存在于一个特殊扇区中。 fdisk+设备名称 64B 主分区4个,所有分区不超过16个 2T 32
GPT GPT 也称为 GUID(全局唯一标识符)分区表,是一种新型的磁盘模式,正在逐步取代MBR的地位。它会生成一个唯一的识别码来进行引导创建,而且会自动检测并修复数据。 gdisk+设备名称 128B 理论上无限制,Windows中一般为128个 8Z 64

注:可以使用diskpart来查询分区格式
MBR:分区格式如下
MBR分区形式如上所示,MBR分区表大小仅保留了64字节的存储空间,而每个分区占用16字节的空间,故而MBR只能分4个分区,这时划分的分区称为主分区(红色部分)。但是当磁盘划分为4个主分区时,磁盘剩余空间将无法被使用,在磁盘上有3个主分区时,需要将剩下的空间整个划分为一个分区称为扩展分区(紫色部分),此时的扩展分区不是一个真实的分区,可以看作是一个容器,当主分区存储空间占用完或需要新建分区时,可以在扩展分区中进一步划分逻辑分区。

GPP的磁盘结构对于分区数量没有限制。

2. linux支持的文件系统

a. 文件系统介绍
因为每种操作系统所需要的文件属性/权限并不相同,为了存放这些文件所需要的数据,故而磁盘在进行分区完毕后需要进行格式化,之后操作系统才能够使用这个文件系统。
传统的磁盘与文件系统应用中,一个分区就只能被格式化为一个文件系统,所以我们可以说一个文件系统就是一个磁盘分区,但是由于新技术的使用,如lvm等,可以将一个分区格式化为多个文件系统,也能将多个分区和成为一个文件系统,所以我们在格式化时已经不再针对磁盘分区来格式化,通常我们称一个可挂载的数据为一个文件系统而不是一个分区。
我们知道一个文件除了其中的内容外还有其自身的属性,文件系统通常会将这两部分数据存放在不同块区,如下表所示:

区块类型 存放数据
超级区块 记录此文件系统的整体信息,包括inode与数据区块的总量,使用量,剩余量以及文件系统的格式及相关信息
inode 记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的区块号码
数据区块 实际记录的文件内容,若文件过大,会占用多个分区

这种数据存取的方式称作索引式文件系统,一个文件对应一个inode,在inode中我们就可以直接找到该文件中的数据存放对应的数据区块,这样的方式使得数据的读取很有效率。而FAT格式(U盘一般使用这种读取方式)并不存在inode,所以FAT无法直接读取到该文件的数据存放区,它的每个区块号码都记录在前一个区块中,必须要顺序将文件数据所有区块内容全部读出,才能知道下一个区块身处何处,如果同一个文件中的数据过于分散,我们的磁头无法在磁盘转一圈时读出所有数据,此时磁盘将会多转好几圈才能完整的读取到这个文件的内容。

b. 文件系统分类
常见的文件系统可以分为传统文件系统(ext2,minix,FAT),日志式文件系统(ext3,ext4,xfs),网络文件系统(NFS)。

文件系统 FAT16 FAT32 NTFS EXT3 EXT4 XFS
最大卷 2G 4G 256T 32T 1E 16E
最大单个文件 4G 8T 16T 2T 16T 8E
最大文件个数 65536 4177920 4294967295 32000个子目录 无限子目录i 无限子目录
代表系统 DOS/WIN95 WIN98 WIN2000以后 RHEL5 RHEL6 RHEL7

在本文中我们主要介绍linux中的标准文件系统ext2,以及现在常用的文件系统xfs。
linux标准的文件系统是ext2,ext2 在格式化时基本是区分为多个区块群组,每个区块群组都有独立的inode,数据区块,超级区块系统,在整体的规划中,文件系统最前面有一个启动扇区,这个启动扇区可以安装启动引导程序,这样我们就可以将不同启动引导程序安装到别的文件系统最前端,而不需要覆盖整块磁盘唯一的MBR。
限制:
1.文件系统所支持的区块大小有1K,2K,4K,不同的区块大小会影响文件系统所能支持的最大磁盘容量和最大单一文件容量。
2.原则上,区块大小和数量在格式化后将无法进行修改。
3.每个区块最多只能存放一个文件的数据,文件过大则需要多个区块可能会造成文件系统读写性能不佳,文件较小则会浪费磁盘空间。

由于现在虚拟化应用越来越广泛,巨型文件也越来越常见,ext系列在对文件格式化时需要预先规划出所有的inode,区块等,这使得巨型文件在格式化时仅系统预先分配就会消耗很多时间,从CentOS 7.x开始文件系统已经由默认的ext转化为xfs,xfs不仅性能较好,它的恢复速度,创建速度都相对于ext更好。
xfs是一个日志文件系统,被用于高容量磁盘以及高性能文件系统,很适合现在的系统环境,ext文件系统的所有功能xfs都具备。xfs将数据主要规划为3个部分,如下表:

区域类型 存放的数据类型
数据区 inode+数据区块+超级区块,分为多个存储区群组,每个存储群组都包含整个文件系统的超级区块,剩余空间的管理机制,inode的分配与追踪。注意inode是用时才分配,且xfs区块与inode有多种容量可供设置,但在linux环境下由于存储控制的关系(pagesize)是的可用区块最大为4K。
文件系统活动登录区 用于记录文件系统的变化,类似日志区 ,系统的所有操作都会在这个区块作记录,因此这个区块的磁盘活动相当频繁,xfs允许将外部磁盘作为xfs日志块区,例如可以将ssd磁盘作为xfs登录区,这样将会使得系统在进行活动时更加快速
实时运行区 文件在被建立时,xfs会在这个区段找到数个extent区块,将文件放置在这个区块内,分配结束后再放置在数据区中,extent的大小要在格式化之前先进行指定。

1.磁盘分区

1.对硬盘进行分区

1. 分区

在虚拟机中增加一个10G大小的硬盘:在真实机中使用virt-manager进入虚拟机管理界面,将进行中的虚拟机挂起,剩余操作如下:

利用fdisk -l来查询该主机中可以进行使用的硬盘分区情况,此时该主机中的vdb大小为10G且未被分区。

1. 使用fdisk进行分区

使用fdisk对/dev/vdb进行分区,进入fdisk分区操作界面,其中不同参数对应不同操作如下:

参数 操作
m 获取帮助
d 删除
l 列出所有分区
n 新建分区
p 显示该磁盘上所有分区
t 更改分区类型
w 保存更改
q 退出
g 设定分区方式为GPT
o 设定分区方式为MBR
使用fdisk -l 进如分区界面,点击增加新分区,此时默认增添的是主分区,手动输入分区大小为100M,具体操作步骤如下: 同上操作继续增加两个大小为100M大小的主分区,在增加第四个分区时,此时将默认是扩展分区,在分扩展分区时,需要注意该分区大小为vdb中剩余全部容量。
此时可以点击p,查询vdb中分区情况:
在设置完逻辑分区之后,再增加新的分区,此时分区类型为逻辑分区,大小自己可以设定。
在增添结束逻辑分区后,进行查看此时分区情况如下,需注意一定要退出wq保存:

2. 使用parted命令进行分区

使用parted -l来查看分区信息,可以看到此时/dev/vdb上没有进行分区,并且未知分区格式。
使用parted 设备名称 mklabel msdos/gpt来设定分区格式,如下,此时/dev/vdb的分区格式为MBR。

使用parted 设备名称 mkpart 分区类型 起始位置 终止位置来进行分区,设定分区大小,具体如下。
使用parted 设备名称 rm 分区号码 ,来删除对应分区号码的分区

2. 进行初始化

对新建的分区进行初始化,若没有对新建分区进行文件系统初始化,该分区将无法正常使用。
*1. 如何查询磁盘分区的初始化情况、及该分区的文件系统类型。
如下图所示,此时该4个分区未进行初始化
*2. 对新建分区进行初始化,如下:

   1  mkfs.vfat /dev/vdb1
   2  mkfs.xfs /dev/vdb2
   3  mkfs.ext4 /dev/vdb3
   4  mkfs.xfs -K /dev/vdb5    #-K是为了提升初始化速度,忽视磁盘中的空白区域快速初始化

此时查询磁盘信息如下所示:

2.设备挂载

分区在进行初始化之后就可以挂载进行使用了,在挂载之前,我们首先需要确定挂载点,挂载点其实就是一个目录,这个目录就是进入这个磁盘分区的入口,但是在挂载之前我们需要确定:

  • 单一文件系统不应该重复挂载在不同挂载点上
  • 单一挂载点不应该重复挂载多个文件系统
  • 要作为挂载点的目录,理论上应该是个空目录,如果将一个文件系统挂载在一个非空目录下,那么在挂载之后,该目录下的东西会暂时消失,需要注意,并不是覆盖,只是暂时的隐藏起来

1 . 挂载和卸载

2. 只读挂载与读写挂载

若需要将该只读文件系统转换为读写文件系统,则可以执行

3. 设备忙时卸载设备

在我们需要卸载设备时,往往会出现设备在忙的提示而无法卸载设备,在这种情况下我们该如何处理呢?
此时我们可以使用fuser -kvm 挂载点|设备名称 来杀死使用该设备的所有进程,如下:

4. 设备永久挂载

以上所列举的挂载方式都属于临时挂载,在主机重新开机后,将无法自动进行挂载。永久挂载就是指在主机重新开机后设备可以自动进行挂载,这一需求的实现是需要编写设备挂载策略文件/etc/fstab,在其中添加对应的挂载语句:

在/etc/fstab文件中按以下格式写入:

设备名称  挂载点 文件系统类型  挂载参数  是否备份  是否检测

具体操作如下:
需注意,此文件在编写完成后不会马上生效,需要mount -a重新读取/etc/fstab文件。此文件内容编写错误会导致系统启动失败,若系统启动失败,按照提示在操作界面输入超级用户密码进入真实shell环境,修改磁盘挂载策略文件/注释错误行,重启系统。

3. 删除设备

需要删除该设备的所有信息时,可以使用以下命令删除该设备上的所有信息。

dd if=/dev/zero of=设备名 bs=1M count=1

2. swap分区

swap分区又称为内存交换分区,早期我们的设备中内存往往是比较小的,所以就出现了内存交换区,顾名思义,就是可以将内存中的数据拿到硬盘中暂时存放,虽然目前主机的内存都很大,似乎不需要内存交换区的存在了,但是对服务器而言,为了防止突然有大量的网络请求,还是需要保存一部分内存交换区来缓冲系统中的内存使用量。
swap分区大小建议:

内存大小 swap分区大小 当允许HIBERNATE
2G以下 内存2倍 内存3倍
2~8G 等于物理内存 物理内存2倍
8~64G 4G 物理内存1.5倍
64G以上 4G HIBERNATE不开

swap分区的管理命令

swapon -s 				         ##查看swap分区信息
mkswap 设备 			             ##格式化设备文件系统为swap格式
swapon 设备 -p 0-32767 	         ##在系统缓冲区中添加指定设备,-p指定swap设备的优先级
swapoff 设备			             ##在系统缓冲区中删除指定设备

1. 新建swap分区

首先使用fdisk分区命令新建一个普通的分区,具体步骤如上,新建分区成功后不要退出fdisk命令的管理界面,点击[t]对指定分区进行分类如下所示:

选择好分区后,选择swap对应序号将该分区置为swap分区,如若不清楚具体序号,可以点击[l]查看对应的分区类型的表格,如下:
此时便新建成功,【wq】退出保存即分区成功。分区成功后还需要进行格式化,使用mkswap 设备名称将对应分区的文件系统设置为swap格式。

2. swap分区的优先级与自动挂载

创建swap分区成功后,我们可以打开swap分区,但会发现此时我们创建好的分区会按照系统默认的方式给予权限,如下:
如若我们想要指定我们新建的swap分区的权限,可以如下进行操作:

但是此时的操作是临时操作,如果想要系统开启时能够自动挂载新建的swap分区设备到swap分区中,就需要编写设置挂载策略文件/etc/fstab,此文件编写完成后不会立即生效,需要swapon -a重新读取该设备挂载策略文件,文件内容如下:

3. 磁盘配额

linux是多人多任务的环境,所以会有许多人同时使用一个硬盘空间的情况,磁盘配额(quota)可以限制指定用户能够使用的磁盘空间即能写入指定设备的最大额度,这样可以避免因为某个用户的过度使用磁盘空间造成其他用户无法正常工作甚至影像系统运行。

1. 新建分区并进行初始化


2. 对照组:在不进行磁盘配额的情况下

首先需要建立一个公共目录,将该分区挂载到该目录下,此时切换至任意某个用户,其可以占满该分区的全部空间,这显然是不合理的。具体操作如下:


此时,该分区还未被用户使用,使用率仅有7%

切换到westos用户,建立一个大文件,我们使用dd if=/dev/zero 0f=文件名 bs=1M count=80得到一个80M的大文件来进行实验,如下:

可以看到仅westos一个用户就可以使用该分区91%的空间,在实际应用中这显然是不合理的。

3. 磁盘配额

想要对该分区进行配额,首先要激活该设备的配额参数,可以使用mount来进行查看,具体如下:

磁盘配额是针对用户来进行设置的,我们首先edquota -u 用户名 进入该用户的配额控制界面,所写内容为:
此时切换至westos用户来进行测试:

4. 永久设定磁盘配额

此时需要编写设备挂载策略文件/etc/fstab,添加配额参数usrquato,此文件编写后不即生效,需要mount -a重新读取该挂载策略文件,需要注意该文件若发生错误将会无法启动主机。
需注意,写设备挂载配置文件时,一定要先卸载设备,其中mdquota -u 用户名中的内容同第3小节磁盘配额中的部分相同,永久设定的重点就是永久开启配额开关。

5. 关闭磁盘配额

利用以下命令来关闭磁盘配额:

quotaoff -uv 设备名    #关闭磁盘配额
                      #u:显示激活过程
                      #v:显示过程

测试习题

1、在虚拟机中添加一块新的硬盘,大小为10G
2、在新硬盘中建立分区并挂在到/westosdir目录中,分区大小为500M
3、设定/westosdir目录中所有用户可以自由新建文件但不能删除不属于自己的文件
4、设定westos用户和lee用户能写入/westosdir目录中的最大数据不能超过10M
5、在系统中添加swap分区,大小为1G,优先级为1
6、以上要求在重启主机后仍然生效

步骤如下:

  1. 增加一块新硬盘
    在真实机中使用virt-manager进入虚拟机管理界面,将进行中的虚拟机挂起,剩余操作如下:

  1. 新建大小为500M的分区,如下:
    设置结束后,wq退出保存,并对该分区进行初始化如下:

  2. 在挂载配置文件/etc/fstab中开启磁盘配额开关

    进入westos的配额设置中更改hard这一项的内容为10240,单位为K,即10M

    此时就将westos用户的配额设置完成了。
    由于该主机上没有用户lee,先创建用户lee,在对其进行磁盘配额如下:


  1. 新建一个westosdir目录,并将/dev/vdb1挂载在该目录下:

    mount -a是为了是在挂载配置文件中更改的磁盘配额开关立即生效

    以上就完成了前4个习题部分,顺序有所差异,但与最终要求一致

  2. 建立1G大小的swap分区