前言
说起磁盘(也就是硬盘),想必大家都不陌生。磁盘是计算机的重要组成部分,依靠磁盘我们得以将计算机各种数据进行保存和读取。不过磁盘并不是开箱即用的组件,在计算机使用磁盘之前,还需要经过分区和挂载这两个步骤,本篇文章主要来介绍分区和挂载的概念和作用,以及Linux系统中的硬盘分区和实际的目录树之间关联关系,希望对各位读者有所帮助。
名词解释
(一)硬盘
在Linux系统中所有的设备都会以文件的形式存储。设备一般保存在/dev目录下面,以sda、sda1、sda2 ...,sdb、sdb1...,hda,hdb。现在的设备一般都是sd命名,以前的很老的硬盘是以ha命名。
sda:第一块硬盘,如果对磁盘进行了分区会有sda1(第一个分区),sda2等。
sdb:第二个硬盘,同样对硬盘分区后有sdb1,sdb2等。
我们可以使用lsblk
命令来查看当前服务器的磁盘情况,从下图中我们可以看到,磁盘的挂载点、容量、类型等信息。
(二)分区
磁盘分区的目的就是便于管理,比如在Windows系统我们一般会分C盘,D盘,E盘等。
在Linux系统中,磁盘使用之前进行分区也是必不可少的步骤,磁盘的分区可以分为三类:主分区、拓展分区和逻辑分区。其中主分区是必须的,且一个硬盘最多只能创建4个主分区(基于MBR分区方式),而拓展分区和逻辑分区则是非必要的,一般来说如果我们觉得把硬盘划分为4份还不够满足我们需要的话,我们可能就会再使用拓展分区和逻辑分区来对磁盘空间来进一步细分。
主分区:可以理解为硬盘分出来的一部分区域,用于存储数据,比如我们的C盘,一般作为启动分区。主分区可以存在多个,但是至少需要一个。
拓展分区:分完主分区了,剩下的部分区域,一般就是拓展分区(除非你想浪费部分空间)。所以拓展分区最多只能有一个。
逻辑分区:逻辑分区依赖于拓展分区,因为硬盘不能直接使用来存储数据,而拓展分区时剩余
的部分区域,也是不能直接使用的,想要使用,我们就必须在拓展分区上继续划分逻辑分区。拓展分区上的逻辑分区可以有多个。
需要注意的是,使用逻辑分区本身也会占用一个主分区的名额,所以不存在4个主分区+1个逻辑分区的情况。一般来说,3个主分区+1个逻辑分区这种搭配会更加常见一些。
(三)格式化
分区后只是把磁盘的空间进行了划分,但此时磁盘还是不可用,接下来我们需要对磁盘的分区进行格式化的操作,不同的格式化方式会影响后续磁盘的存储方式。比较常见的格式化方式有:ext4、xfs、<font style="color:rgb(6, 6, 7);">btrfs等</font>
1. ext4
ext4是Linux中最常用的文件系统之一,它是ext文件系统的进化版本。它是许多Linux发行版的默认文件系 统。
2. xfs
xfs是一种高性能的日志文件系统,适用于大容量存储和大文件,它具有快速的读写速度、高效的空间管理和稳定的性能,在处理大文件和大型数据集时效果显著。
注意:对分区进行格式化是会丢失分区里面的所有数据的,所以格式化磁盘之前请注意备份分区中需要保留的文件
(四)挂载
挂载是Linux系统才需要执行的动作(window系统完成分区和格式化之后,就可以正常使用硬盘了),当硬盘分区完成格式化后,我们需要把分区挂载在指定的目录。比如说把硬盘A分区1挂载在/home
目录下面,表示后续存放在/home
目录的文件都会实际上存放在硬盘A的分区1上面。
一、如何挂载一块硬盘
(一)如何挂载硬盘
略~
关于开机自动挂载
需要注意的是,我们虽然通过命令将硬盘进行了挂载,但是一旦系统重启了,那么我们就得重新执行一次挂载的操作,这显然是一个很麻烦的动作,所以我们一般都会同时设置分区的开机自动挂载,具体配置文件是/etc/fstab
,下面的参考的文件内容。
/dev/sdb1 /mnt/sdb1 ext4 defaults 0 1
/dev/sdb5 /mnt/sdb5 xfs defaults 0 1
- 第一列是挂载的分区
- 第二列是挂载的目录(即挂载点)
- 第三列是文件系统的类型(分区原先进行格式化的方式)
- 第四列是挂载选项,表示使用默认的挂载选项
挂载选项通常在 /etc/fstab
文件中以逗号分隔的列表形式出现,使用 defaults 选项时,系统会应用一组默认的挂载选项,这些选项通常是 rw
、suid
、dev
、exec
、auto
、nouser
和 async
。具体选项的含义可以看下文的总结。
挂载选项 | 含义 |
---|---|
rw | 允许文件系统被读写。这是默认行为,如果不需要特别指定,通常可以省略。 |
ro | 将文件系统挂载为只读。 |
exec | 允许在文件系统上执行二进制文件 |
noexec | 禁止在文件系统上执行二进制文件,这可以提高安全性,防止自动执行可能的恶意代码 |
suid | 允许设置用户ID位,这意味着可以执行设置了setuid位的程序 |
nosuid | 禁止设置用户ID位,这可以防止某些安全问题。 |
dev | 允许访问文件系统上的设备文件 |
nodev | 禁止访问文件系统上的设备文件 |
sync | 所有数据写入操作都将同步完成,这可以提高数据的一致性,但可能会降低性能 |
async | 数据写入操作将异步完成,这可以提高性能,但可能会牺牲数据一致性 |
user | 允许非超级用户挂载文件系统 |
nouser | 禁止非超级用户挂载文件系统。 |
noatime | 不更新文件的访问时间,这可以减少磁盘I/O,提高性能 |
- 第五列表示
dump
的备份操作设置,0表示不需要备份。 - 第六列是
fsck
磁盘检查的顺序设置,1表示在启动时,fsck
会先检查根文件系统,然后检查这个分区。数字越小,优先级越高
(二)分区的好处是什么?
在不熟悉分区之前,我会觉得分区的步骤有点多余,让使用硬盘的前置步骤变多了,看了相关的文章后才知道分区的作用不容忽视,带给服务器的好处也是十分显著的,基本上可以归纳为2点:安全和性能。
安全
安全其实很好理解,分区划分了不同区域的存储界限,假如分区A由于某些原因受损导致无法使用了,那么也不影响其他分区的正常使用。性能
如果没有分区,操作系统想要在硬盘上找一个文件,需要把整个硬盘全部扫描一次,分区后则只需要扫描某个分区下面的文件即可,减少了文件扫描的范围从而提升了文件读取的性能。
二、分区和目录树的关系是什么?
Linux系统的分区和Window系统不太一样,后者我们一般就是简单分为C、D、E盘,划分完成之后格式化就可以使用了,而且在使用上也十分清晰,我们可以根据文件所在的盘符知道当前文件存放在哪个分区。
Linux系统虽然也是通过目录的形式来访问磁盘分区,但是和window不同的是,Linux目录是以根目录/
为起点的树状结构,称为目录树。我们在访问磁盘分区之前需要先将磁盘分区挂在这棵树上面,称为挂载,而可以挂载设备的目录称为挂载点。
例如我们把三个磁盘分区依次挂载在不同的目录上面:
- mount /dev/sda1 /
- mount /dev/sda2 /home
- mount /dev/sda1 /boot
那么我们访问/home
目录相当于是访问sda2分区,访问/
根目录相当于是访问sd1分区的磁盘空间。
看到这里,或许有读者已经有疑问了,在window系统中我可以通过文件放在哪个盘符下面来快速判断文件对应存放的位置,但是在Linux系统中挂载点似乎可以挂载到完全不同的目录下面,我们该怎么知道当前目录下的文件到底是存储在哪个分区下面呢?使用df -h path
可以快速帮助我们确定文件所在分区
同时,在选择挂载点的时候,我似乎没有给每一个目录都指定一个分区,例如/opt
,那么/opt
目录在没有显式指定挂载分区的情况下,放在目录下的文件到底放在了哪个分区下面呢?答案是/
根目录,因为所有的文件的访问默认都是从根目录开始(这也是为什么根目录一定要挂载到某个分区的原因)。
有时候一个多级目录下可能存在多个挂载点(例如/home/user1
是挂载点1,/home/user1/log
是挂载点2),那么Linux系统是怎么确定文件具体是存在哪个分区下面吗?
答案很简单,通过目录反向追踪即可。要想知道/home/user1/log/aa.txt
文件在哪个分区,由aa.txt -> log -> user1 -> home -> /
进行目录的反向追溯,先进去的哪个挂载点就是文件存放的分区了,所以aa.txt
文件进入的挂载点是/home/user1/log
。(这里也可以看出来,根目录往往是作为兜底的目录存在的,所以一般情况下不建议根目录的分区太小,避免不够用)
不是所有的目录都适合作为挂载点
挂载点虽然没有太多约束条件,但是不是所有目录都适合作为挂载点使用,比如根目录下的/etc
、/bin
、/dev
、/lib
、/sbin
,这些目录都不能作为挂载点使用,需要和/
根目录放在同一个分区中。
三、常用命令总结
- 查看设备的挂载状态和文件系统信息
lsblk
image.png
- 查看磁盘的分区表信息和分区的详细参数
fdisk -l
- 查看文件系统类型
parted -l
四、关于硬盘的扩容
如果Linux某个目录下有很多大文件,那么时间一长我们就会发现新的文件不够放。不考虑删除旧数据的前提下,解决的方式无非就是开源。开源的方式主要有2种:① 挂载新的硬盘分区上去,这个很好理解,不够空间就加多一块硬盘上去就行 ② 给原有的硬盘分区进行扩容,扩容简单理解就是扩大旧分区的容量,更加准确的说法是扩容就是重新设置分区的起始扇区与截止扇区。
我们操作磁盘分区的时候可以注意到,分区的时候必然需要确定起始扇区和截止扇区,确定好范围后这一块连续的区域就成为了分区的大小(为何要强调连续,是因为分区不支持东拼西凑不同的扇区来组合成一个分区)。这也意味着扩容其实并不算是一个无风险的行为,假设两块相邻的分区早已存放了很多文件,如果希望扩宽某一个分区的大小,且扩容的方向是朝着另外一个正在使用中的分区的,那么势必就会造成其他分区数据的丢失。(也很好理解,毕竟蛋糕就这么大,给你了其他人就不能用了)。
按照现有的流程,你扩容之前必须要先删除掉旧的分区把空间腾出来,所以主分区之间如果没有做好一次性调整后面所有分区大小的准备的话,一般都不会动的。比较常见的分区扩容都是主分区往逻辑分区扩容,或者逻辑分区往未使用部分的空间扩容。
五、什么是LVM?
LVM的全称是“Logical Volume Manager”,意思是逻辑盘卷管理,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。笔者用自己的话来概况一下,可以把LVM理解为不受分区限制的虚拟硬盘技术。
由于篇幅有限,本小节主要讲LVM相关的概念,不涉及LVM
技术的实操。
我们在上文中提到,分区的扩容比较麻烦(特别是在分区已经投入使用一段时间,里面存放了用户数据),我们需要先备份旧分区文件,删旧分区,重新定义扩容分区的截止扇区,来保障最终的扩容分区有一片连续完整的扇区可用。虽然分区要求了扇区的连续性,但是毕竟我们也基本很少会有需求去改变分区的大小,所以只要分区的大小分配相对合理,其实也没有太大所谓。但是对于需要频繁改动扩容缩容的场景而言,分区的弊端就出来了(不过除了云服务器外,暂时笔者也没想到说什么场景下可能会频繁进行服务器的磁盘容量变动),我们很难要求每次都有连续的空闲分区空间给我们使用。LVM技术的优势主要也是为了解决这类场景下的问题。
接下来我们来聊一下LVM的一些基本概念:
(一)物理卷 (PV,Physical Colume)
一个可供存储LVM的块设备. 如硬盘分区(MBR或GPT分区)、SAN 的硬盘、RAID 或 LUN,一个回环文件, 一个被内核映射的设备 (例如 dm-crypt),它包含一个特殊的LVM头,它是 LVM 构建的实际硬件或存储系统。简单理解的话,一个支持LVM数据存储的设备就可以作为物理卷。
(二)卷组(VG,Volume Group)
卷组由一个或多个物理卷组成,相当于是我们把多个存储设备逻辑上放在了同一个组里面,作为一个逻辑上统一的存储空间更大的设备。
(三)逻辑卷(LV,Logical Volume)
逻辑卷是可供系统使用的最终元设备,它们在卷组中创建和管理,由物理块组成,实际上就是一个虚拟分区,并显示为 /dev/VG_NAME/LV_NAME
,通常在其上可以创建文件系统。
(四)物理块(PE,Physical Extend)
一个卷组中最小的连续区域(默认为4 MiB),多个物理块将被分配给一个逻辑卷。你可以把它看成物理卷的一部分,这部分可以被分配给一个逻辑卷。
下面是从另外一篇文章搬来的图,觉得基本可以表示LVM的使用原理,首先是物理磁盘分成若干份分区并设置为LVM类型,我们把这若干个分区组成一个(或多个)卷组,接下来就可以对这个卷组进行逻辑卷的划分,重点来了逻辑卷的扩容成本要远远低于分区扩容,只需要卷组中有足够的空间就行。如果是逻辑卷需要缩容的话,则相对麻烦一些,除了多了一些执行命令外,我们需要额外确保缩容后的文件足够容纳原有的数据。
LVM的优势和劣势
优点:
1. 文件系统可以跨多个磁盘,因此文件系统大小不会受物理磁盘的限制。
2. 可以在系统运行的状态下动态的扩展文件系统的大小
3. 可以增加新的磁盘到LVM的存储池中。
4. 可以以镜像的方式冗余重要的数据到多个物理磁盘。
5. 可以方便的导出整个卷组到另外一台机器。
缺点:
1. 在从卷组中移除一个磁盘的时候必须使用reducevg命令(这个命令要求root权限,并且不允许在快照卷组中使用)。
2. 当卷组中的一个磁盘损坏时,整个卷组都会受到影响。
3. 因为加入了额外的操作,存储性能受到影响
4. 不能减小文件系统大小(受文件系统类型限制)
参考文章
Linux磁盘挂载、分区、扩容操作 https://segmentfault.com/a/1190000017213655
Linux硬盘挂载与磁盘分区基础 https://www.cnblogs.com/shanfeng1000/p/18343855
Linux下的磁盘管理之LVM详解及lvm的常用磁盘操作命令 https://blog.csdn.net/weixin_42915431/article/details/121881054