来源:https://zhuanlan.zhihu.com/p/296777898
Linux中磁盘的管理(分区、格式化、挂载),LVM逻辑卷,RAID磁盘阵列
一、认识磁盘
1、什么是磁盘:
磁盘是一种计算机的外部存储器设备,由一个或多个覆盖有磁性材料的铝制或玻璃制的碟片组成,用来存储用户的信息,这种信息可以反复地被读取和改写。绝大多数磁盘被永久封存在一个密封的盒子里。
![](https://pic1.zhimg.com/80/v2-6733825202ce0a865afbb9210fe03454_1440w.jpg)
![](https://pic1.zhimg.com/80/v2-829824ced439dba84bfcacefc7a00a78_1440w.jpg)
2、磁盘运行机理:
简单来说就是多个盘片之间靠主轴连接,电机带动主轴做旋转运动,通过多个磁头臂的摇摆和磁盘的旋转,磁头就可以在磁盘旋转的过程中就读取到磁盘中存储的各种数据
3、磁盘的扇区、磁道、柱面:
(1)磁道:磁盘的每个盘面被划分为许多同心圆,这些同心圆的轨道叫做磁道。 (2)扇区:一个盘面划分为若干个内角相同的扇形,这样盘面上的每个磁道就被分为若干段圆弧,每段圆弧叫做一个扇区。每个扇区中的数据作为一个单元同时被读入或写入。每一个扇区是512字节,其中有64个字节存储的是分区表,一条分区信息占16个字节。 (3)柱面:每一个盘片同一大小的同心圆可以看成连在一起的柱面,磁盘在分区的时候最小单位是柱面,每一个盘片的上下面都可以读取数据,每一个磁头,不可以跨盘面读取数据。
![](https://pic2.zhimg.com/80/v2-e1e1770c63642d71290248618149541d_1440w.jpg)
![](https://pic2.zhimg.com/80/v2-f462d9dc61fd8ebebd9ef6fad938d5c1_1440w.jpg)
4、磁盘的分类:
(1)IDE磁盘:特点价格低廉,兼容性强,性价比高,数据传输慢,不支持热插拔等等。 (2)SCSI磁盘:传输速率高,读写性能好,运行稳定,可连接多个设备。可支持热插拔,占用CPU低,但是价格相对来说比较贵,一般用于工作站或服务器上。 (3)SATA磁盘:结构简单、支持热插拔 (4)USB 其中IDE的磁盘的文件名为 /dev/hd[a-d] 而SCSI、SATA、USB的磁盘文件名为 /dev/sd[a-p]
二、磁盘的分区
1、为什么要分区
(1)易于管理和使用:
比如说我们把磁盘分了sda1、sda2、sda3、sda4盘,我们假设sda1盘为系统盘,其他的比如说游戏、办公、软件盘,这样我们要重新分哪个区就直接在对应的盘分就可以了,不需要整块磁盘进行分区。根据用途我们也能较快的去使用相应的磁盘。
(2)有利于数据的安全:
通过分区可以降低数据损失的风险。出现硬盘坏道、错误操作、重装系统都有可能造成数据损失,如果分区了,那么我们就可以将损失最小化。
(3)节约寻找文件的时间:
这个我觉得跟第一条比较像,但是这里所说的寻找文件的时间,是指电脑搜索文件的时间。分区以后,电脑搜索文件时只需要在相对应的分区搜索就可以了,没必要进行全盘搜索。大大节省了寻找文件的时间。
下图为硬盘的柱面区间示意图:
![](https://pic3.zhimg.com/80/v2-4dd87e4fa0712ee90b7e6befdfe509ee_1440w.jpg)
由于我们之前说过一个扇区是512字节,其中有64个字节存储的是分区表,一条分区信息占16个字节,因此磁盘最多只能分四个分区,要想有多个分区怎么办?这时候就有了扩展分区。
那么如何进行磁盘的分区和格式化呢?
分区
在使用新的硬盘之前,我们必须对其进行分区。也就是在磁盘中存储分区信息,告诉操作系统哪个扇区是哪个分区的,哪个分区用来启动的等等。
分区信息的储存方式有两个标准,MBR和GPT,分区之前,我们必须在两个之中选择一种标准。
GPT是一种新的标准,随着硬盘的不断增大,正在逐渐地取代MBR,但是现在MBR的也是不少的。
你那么MBR和GPT有什么区别呢?
MBR
MBR的意思是“主引导记录”。之所以叫“主引导记录”,是因为它是存在于驱动器开始部分的一个特殊的启动扇区。这个扇区包含了已安装的操作系统的启动加载器和驱动器的逻辑分区信息。所谓启动加载器,是一小段代码,用于加载驱动器上其他分区上更大的加载器。如何MBR被覆盖,操作系统就无法启动了。
MBR支持最大2TB磁盘,它无法处理大于2TB容量的磁盘。MBR还只支持最多4个主分区——如果你想要更多分区,你需要创建所谓“扩展分区”,并在其中创建逻辑分区。
GPT
GPT意为GUID分区表。(GUID意为全局唯一标识符)。这是
一个正逐渐取代MBR的新标准。它和UEFI相辅相成——UEFI用于取代老旧的BIOS,而GPT则取代老旧的MBR。之所以叫作“GUID分区表”,是因为你的驱动器上的每个分区都有一个全局唯一的标识符(globally unique identifier,GUID)——这是一个随机生成的字符串,可以保证为地球上的每一个GPT分区都分配完全唯一的标识符。
在MBR磁盘上,分区和启动信息是保存在一起的。如果这部分数据被覆盖或破坏,事情就麻烦了。相对的,GPT在整个磁盘上保存多个这部分信息的副本,因此它更为健壮,并可以恢复被破坏的这部分信息。
GPT的硬盘大小大得多,几乎没有限制,最大可支持18EB。而主分区的数量也非常多,可以支持多达128个主分区,所以在GPT中没有扩展分区和逻辑分区的概念,都是主分区,当然也是可以创建的,但是没有必要。
但GPT也有缺点,就是不太适合x86,也就是32位的系统。
2、扩展分区:
比如说是图中p4为扩展分区,扩展分区可以被继续划分为多个逻辑分区,逻辑分区是可以进行格式化的。扩展分区把逻辑分区的分区信息在扩展分区中找了一个位置给存起来。假如说p4扩展分区划分了三个逻辑分区那么第1个逻辑分区命名为sda5、第2个为sda6、第3个sda7,以此类推。 上面所说的是一个磁盘被分为四个分区,第四个分区被设置为扩展分区,第一个逻辑分区为sda5。但是当整个磁盘被分为3个分区的时候,我们把扩展分区划分的第1个逻辑分区依然命名为sda5,而不是其它的。总结一下,就是不论磁盘有几个主分区,第一个逻辑分区一定是从sda5开始。
3、磁盘的分区:
我们就创建1个1G的分区吧。
(1) 在进行分区时,首先我们需要查看当前磁盘的一个分区状况,使用命令:fdisk -l
![](https://pic2.zhimg.com/80/v2-0e363d36363070add993f68e232f49ed_1440w.jpg)
注意:上图中/dev/sda1 后面有个*,表示该磁盘用于引导系统进行启动。 sda1:存放的是与系统相关的文件 sda2:虚拟内存交换分区 sda3:为我们系统上的跟分区 start、end表示分区开始的扇区位置和结束的扇区位置。 blocks:表示块的信息,一个块里面有多个扇区。 Id:表示磁盘编号 system:表示Linux系统分区的一个分区信息。
(2)然后使用命令:fdisk /dev/sda 让硬盘进入分区模式
![](https://pic1.zhimg.com/80/v2-8b7a6c8275bf6132e654f1b3905f7b00_1440w.jpg)
此时命令栏提示输入m来寻求帮助,那么我们输入m,来看一下都有哪些选项。
![](https://pic3.zhimg.com/80/v2-f4c830d70e8dabe49ef01a8a7018947a_1440w.jpg)
上图中:我将画横线的标记为经常会用到的,然后我们来解释一下其中的一些选项。
| n | 添加一个新分区
| q | 不保存就退出
| p | 打印分区表
| m | 打印选项菜单
| d | 删除一个分区
| w | 保存退出
| t | 改变系统id号
(3)开始创建分区,因此我们输入n,然后回车如下图。
![](https://pic2.zhimg.com/80/v2-6845e7720c3fda11f4da6a41e0f4ea21_1440w.png)
我们看到黄颜色线条上显示的是3个主要分区,0个扩展分区,还有1个闲置分区。 绿色光标前的default e表示的是默认为扩展分区。我们除了直接回车进入下一步,也可以输入e进入下一步。
①此时光标所在的位置表示选择输入起始位置,也就是起始扇区。当然,我们不用输入,直接回车就好进入下一步。它就是为了能够将后面的所有可用扇区充分的利用上,而默认选择可用扇区的起始最小扇区。
![](https://pic1.zhimg.com/80/v2-a9018f97d4b1ecad0b5284ec2fd513b4_1440w.png)
回车后进入下一步,如下: ②此时光标所在的位置表示选择输入终了位置,也就是结束扇区。当然,我们不用输入,直接回车就可以把上面剩余的全部空间充分的利用上。
![](https://pic3.zhimg.com/80/v2-5f24e49633ea91c24c613da3fd708f96_1440w.png)
回车后如下:
![](https://pic4.zhimg.com/80/v2-75b41885a28e8c41407f96797a704fd3_1440w.png)
③到这里我们创建的扩展分区已经创建好了,我们在命令行界面输入p查看一下分区情况:
![](https://pic1.zhimg.com/80/v2-a317a059d671b24c74c79b4a8f31da10_1440w.jpg)
黄颜色框框所框取的信息就是我们创建的扩展分区,以及他的起始,终了扇区位置信息;块信息;id编号信息,分区信息。
④有了扩展分区,那么我们才可以创建逻辑分区。 我们在命令行输入n添加一个新分区,此时添加的分区就是逻辑分区。
![](https://pic3.zhimg.com/80/v2-77e46527101afce031d0b4c8c3275ec6_1440w.png)
这时它询问设置逻辑分区的起始扇区,为了充分利用,我们选择默认值,然后回车。
![](https://pic1.zhimg.com/80/v2-156343f23de266b43052ead7e91ba154_1440w.png)
到这里它在询问扇区结束位置,说白了就是我们在设置逻辑分区大小。输入格式为:+扇区 或者 +数值大小{单位} 然后我们输入:+1G 表示设置大小为的1G的逻辑空间。回车之后就完成了新的分区的设置。 紧接着我们输入p打印分区表查看分区信息。
![](https://pic4.zhimg.com/80/v2-dc0174ca45a9577257b62ed022aa9c17_1440w.jpg)
上图中黄颜色的线上的文字为提示信息:提示分区5大小为1GB且已经创建。 ⑤此时不要着急,我们一定要记住要保存,在命令行输入w保存分区信息。我们通过w保存并退出后,使用fdisk -l 可以查看到磁盘的分区信息。 ⑥但是当你在格式化的时候,有可能找不到这个分区。这是因为Linux没有把分区信息读到内核来,我们需要输入partprobe这个命令,来使我们内核重读一下我们的分区信息。
![](https://pic3.zhimg.com/80/v2-a4fba9a936b8c9c114bf5c8da9692b9e_1440w.jpg)
到这里我们已经成功地创建了一个1G大小的分区,但是我们能用吗?不能,因为我们要对磁盘进行格式化后才可以进行数据的存储。
三、磁盘的格式化
1、认识格式化:
格式化:指将分区格式化成不同的文件系统。 那什么是文件系统呢? 文件系统:指操作系统用于明确存储设备或分区上的文件的方法和数据结构:即在存储设备上组织文件的方法。就好比一个教室,同学们的坐的位置总是与桌子凳子排列的方式有关系。桌子,凳子怎么摆放,就导致了同学坐的位置在哪里。文件系统存放数据也是这么个道理。
2、Linux系统下的文件类型:
Linux下的文件类型有ext2、ext3、ext4、xfs等等,我们可以使用命令:mkfs. 然后用按TAB、TAB来查看都有哪些文件类型。
![](https://pic1.zhimg.com/80/v2-5afd8e8a16253d7d4263686fffd494e0_1440w.png)
3、磁盘的格式化:
我们现在要对刚才创建的逻辑分区5进行格式化。
(1)在命令行输入mkfs.ext3 /dev/sda5 意思就是格式化根下的sda5分区,格式化类型为.ext3
![](https://pic2.zhimg.com/80/v2-dde5a5ab5f8221c225bc49e6b0cb12f9_1440w.jpg)
当done都出现完毕后,意味着格式化已经进行完毕。
(2)格式化完毕后我们使用命令:ll 来查看我们格式化完毕后的分区的文件类型信息。
![](https://pic3.zhimg.com/80/v2-71272379a9ef7703ad0d02b93ef47c82_1440w.png)
我们从信息中可以看出来sda5为一个块设备文件。8表示主设备号,5表示的为从设备号。
到这里已经格式化好的sda5能用吗?答案是不能,要想用这个磁盘我们还需要挂载。
四、磁盘的挂载
1、认识挂载:
(1)Linux的宗旨是一切皆文件,从以上我们也看到。我们存储的所有文件都在sda3下存放着,sda3也就是我们的根。那我们要在sda5中写入文件时,首先要sda5要与sda3先建立一个联系,这个联系就是一个目录。建立联系的过程我们叫做挂载。 (2)当我们访问sda3底下的这个目录的时候,实际上我们访问的才是sda5这个设备文件。这个目录相当于一个访问sda5的入口,可以理解为一个接口,有了这个接口才可以访问这个磁盘。
2、磁盘的挂载:
(1)挂载点目录:我们将磁盘切到根目录, media 和 mnt 这两个目录被叫做挂载点目录。除此之外,我们也可以自己创建一个目录作为一个挂载点目录,
![](https://pic2.zhimg.com/80/v2-2f85d8317145c1adbefdb4be4f98c7e1_1440w.jpg)
(2)临时挂载:将指定的一个目录作为挂载点目录时,如果挂载点的目录有文件,那么文件会被隐藏。因此当我们需要挂载目录时,最好新建一个空文件夹来作为挂在点目录。(重启后失效) ①首先在根下创建一个test目录用于测试,在test目录中创建一个文件file,和一个目录directory。
![](https://pic2.zhimg.com/80/v2-61ebfac848062cf1493145daea6ca5fd_1440w.jpg)
②然后我们挂载sda5,使用命令:mount /dev/sda5 /test 意思就是说将/dev/sda5挂载到test目录中 然后我们刷新一下切出去,重新进到这个目录。(当然你们也可以不刷新直接使用ll命令看看会出现什么)
![](https://pic4.zhimg.com/80/v2-5eb01e2eee33ea01dae6473426461747_1440w.jpg)
③现在我们在test目录下的操作就相当于在sda5中进行操作,我们在里面写一个文件吧。
![](https://pic4.zhimg.com/80/v2-01b3bacfce664a7662966f3a3cd4dd8f_1440w.jpg)
④按照上一步,我们的colour文件是在sda5中,那么我们将挂载的sda5给卸载掉。我们再进入test查看里面的文件有什么。注意卸载时一定要退出目录,不然无法进行卸载。卸载的命令:umount /dev/sda5或者是umount /test
![](https://pic4.zhimg.com/80/v2-3b7c0845aa27e89c36439ab3c6f55d53_1440w.jpg)
⑤同理根据第③步的操作,我们在sda5里面写入一个文件。那么我们这次将这个sda5直接挂载到新建的一个目录test2。同理我们应该能想到,挂载后这个空文件夹也能够读到colour这个文件。(当然也要刷新一下)
![](https://pic3.zhimg.com/80/v2-58e9f4f44aa492464542e3f6b0608fbe_1440w.jpg)
到这里就能说明colour这个文件是属于磁盘里的而非目录里的。 现在我们回到开头,我们之前说过,我们这种挂载方式为临时挂载,因此你在命令行中输入reboot重启Linux后,进入test2中是看不到任何文件的。这里不再演示。 (3)怎样查看到当前系统上所有磁盘的挂载信息? ①使用mount命令,但读起来较费劲,黄色线条可以告诉我们在哪里挂载的,磁盘的格式类型,读写权限,等其他信息。
![](https://pic4.zhimg.com/80/v2-b621691d1bf350df4dc48aaf5cfe668b_1440w.jpg)
②使用命令df -h这更易于我们对磁盘的信息的了解。包括文件的大小,已经使用的分区大小,总共可用分区的大小,使用率,以及挂载的位置。(推荐)
![](https://pic2.zhimg.com/80/v2-cb003c95f54132074df58ad36b1535ad_1440w.jpg)
注意:我们当时为sda5分配了1G的大小,但由于格式化后,要存储一些记录格式化的类型的信息。所以会占用一些空间,导致实际空间会比我们预先分配的空间要小。 (4)命令:blkid:查看对应分区的UUID(编号)。UUID唯一标识每一个分区,防止错误的挂载。除此之外,还会显示分区的类型。(建议先复制一下sda5的UUID,一会儿会用到)
![](https://pic2.zhimg.com/80/v2-792a83ac5e7d08b4c6ea036374479399_1440w.png)
(5)永久挂载:使用永久挂载,就意味着它开机会自动挂载。 ①使用vim编辑 /etc/fstab 在命令行直接输入vim /etc/fstab 就可以编辑,实现开机自动挂载。
![](https://pic4.zhimg.com/80/v2-29c6c4b8ef88136e1cbabf0738c097c7_1440w.jpg)
②在将光标移到UUID行,在命令模式下按o键进入插入模式,同时换行。将(4)步骤中复制好的sda5的UUID编号,粘贴进来。/test挂载点目录,ext3文件系统类型,第一个0表示不备份,第二个0表示不检查。注意格式一定要正确,可以不用对齐,最好的判断依据是依照颜色。 写完之后保存退出。
![](https://pic1.zhimg.com/80/v2-0fc880516950ef1749d8053a32fb93d4_1440w.jpg)
Ⅰ写完之后,你使用mount命令,是看不到test挂载信息的,只有开机时才会读取那个文件。你只需reboot然后打开相应的目录去查找我们之前创建的colour文件是否存在来判断自己是否挂载成功。
Ⅱ如果你着急的就想查看test的挂载分区存储的信息。由于内核还没有读取这个命令,我们使用mount -a 这个命令来让内核读取这个文件。然后用mount | grep /test来过滤信息,查看是否挂上。要么直接省去上一步,直接到test目录下去找colour文件是否存在。(如果失败了不要着急,很有可能你没有重新进这个区哦)
Linux磁盘管理:LVM逻辑卷基本概念及LVM的工作原理
一、传统的磁盘管理
其实在Linux操作系统中,我们的磁盘管理机制和windows上的差不多,绝大多数都是使用MBR(Master Boot Recorder)都是通过先对一个硬盘进行分区,然后再将该分区进行文件系统的格式化,在Linux系统中如果要使用该分区就将其挂载上去即可,windows的话其实底层也就是自动将所有的分区挂载好,然后我们就可以对该分区进行使用了。
但是这种传统的磁盘管理经常会带来很多的问题,比如说当我们使用的一个分区,其空间大小已经不再够用了,这个时候我们没有办法通过拉伸分区来进行分区扩充,当然目前也有其他第三方的磁盘管理软件可以进行磁盘的分区空间划分,但是这样会给我们的文件系统造成很大的伤害,有时会导致文件系统崩溃等问题。对于传统的磁盘管理如果说我们碰到当分区大小不足的时候,我们只能通过增加新的硬盘,然后在新的硬盘上创建分区,对分区进行格式化以后,然后将之前分区的所有东西都拷贝到新的分区里面才行。
但是新增加的硬盘是作为独立的文件系统存在的,原有的文件系统并没有得到任何的扩充,上层应用只能访问到一个文件系统。这样的方式对个人的电脑来说可能还能接受,但是如果对于生产环境下的服务器来说,这是不可接受的。因为如果要把一个分区的内容都拷贝到另一个分区上去,势必要首先卸载掉之前的那个分区,然后对整个分区进行拷贝,如果服务器上运行着一个重要的服务,比如说WWW或者FTP,其要求是 724 小时运行正常的,那么卸载掉分区这是不可想象的,同时如果该分区保存的内容非常非常的多,那么在对分区进行转移时时间可能会耗费很久,所以,这个时候我们就会受到传统磁盘管理的限制,因为其不能够进行动态的磁盘管理。因此,为了解决这个问题,LVM技术就诞生了!!!
二、LVM的磁盘管理
正是因为传统的磁盘管理不能对我们的磁盘空间进行动态的管理,因此就诞生出了LVM这个技术,那么LVM到底是什么呢?它又是怎么对磁盘进行管理的呢?
LVM(Logical volume Manager)是逻辑卷管理的简称。它是Linux环境下对磁盘分区进行管理的一种机制。现在不仅仅是Linux系统上可以使用LVM这种磁盘管理机制,对于其它的类UNIX操作系统,以及windows操作系统都有类似与LVM这种磁盘管理软件。
LVM的工作原理其实很简单,它就是通过将底层的物理硬盘抽象的封装起来,然后以逻辑卷的方式呈现给上层应用。在传统的磁盘管理机制中,我们的上层应用是直接访问文件系统,从而对底层的物理硬盘进行读取,而在LVM中,其通过对底层的硬盘进行封装,当我们对底层的物理硬盘进行操作时,其不再是针对于分区进行操作,而是通过一个叫做逻辑卷的东西来对其进行底层的磁盘管理操作。比如说我增加一个物理硬盘,这个时候上层的服务是感觉不到的,因为呈现给上次服务的是以逻辑卷的方式。
LVM最大的特点就是可以对磁盘进行动态管理。因为逻辑卷的大小是可以动态调整的,而且不会丢失现有的数据。我们如果新增加了硬盘,其也不会改变现有上层的逻辑卷。作为一个动态磁盘管理机制,逻辑卷技术大大提高了磁盘管理的灵活性!!!
三、LVM的原理
要想理解好LVM的原理,我们必须首先要掌握4个基本的逻辑卷概念。
①PE (Physical Extend) 物理拓展
②PV (Physical Volume) 物理卷
③VG (Volume Group) 卷组
④LV (Logical Volume) 逻辑卷
我们知道在使用LVM对磁盘进行动态管理以后,我们是以逻辑卷的方式呈现给上层的服务的。所以我们所有的操作目的,其实就是去创建一个LV(Logical Volume),逻辑卷就是用来取代我们之前的分区,我们通过对逻辑卷进行格式化,然后进行挂载操作就可以使用了。那么LVM的工作原理是什么呢?所谓无图无真相,咱们下面通过图来对逻辑卷的原理进行解释!!
![](https://pic2.zhimg.com/80/v2-77e62936777835df39ae2d9d0b322239_1440w.jpg)
1.将我们的物理硬盘格式化成PV(Physical Volume)
我们看到,这里有两块硬盘,一块是sda,另一块是sdb,在LVM磁盘管理里,我首先要将这两块硬盘格式化为我们的PV(Physical Volume),也就是我们的物理卷,其实格式化物理卷的过程中LVM是将底层的硬盘划分为了一个一个的PE(Physical Extend),我们的LVM磁盘管理中PE的默认大小是4M大小,其实PE就是我们逻辑卷管理的最基本单位。比如说我有一个400M的硬盘,那么在将其格式化成PV的时候,其实际就是将这块物理硬盘划分成了100个的PE,因为PE默认的大小就是4M。这个就是我们的第一步操作。
2.创建一个VG(Volume Group)
在将硬盘格式化成PV以后,我们第二步操作就是创建一个卷组,也就是VG(Volume Group),卷组在这里我们可以将其抽象化成一个空间池,VG的作用就是用来装PE的,我们可以把一个或者多个PV加到VG当中,因为在第一步操作时就已经将该硬盘划分成了多个PE,所以将多个PV加到VG里面后,VG里面就存放了许许多多来自不同PV中的PE,我们通过上面的图片就可以看到,我们格式化了两块硬盘,每个硬盘分别格式化成了3个PE,然后将两块硬盘的PE都加到了我们的VG当中,那么我们的VG当中就包含了6个PE,这6个PE就是两个硬盘的PE之和。通常创建一个卷组的时候我们会为其取一个名字,也就是该VG的名字。
3.基于VG创建我们最后要使用的LV(Logical Volume)
【注意】PV以及VG创建好以后我们是不能够直接使用的,因为PV、VG是我们逻辑卷底层的东西,我们其实最后使用的是在VG基础上创建的LV(Logical Volume),所以第三步操作就是基于VG来创建我们最终要使用的LV。
当我们创建好我们的VG以后,这个时候我们创建LV其实就是从VG中拿出我们指定数量的PE,还是拿上图来说,我们看到我们此时的VG里面已经拥有了6个PE,这时候我们创建了我们的第一个逻辑卷,它的大小是4个PE的大小,也就是16M(因为一个PE的默认大小是4M),而这4个PE有三个是来自于第一块硬盘,而另外一个PE则是来自第二块硬盘。当我们创建第二个逻辑卷时,它的大小就最多只有两个PE的大小了,因为其中的4个PE已经分配给了我们的第一个逻辑卷。
所以创建逻辑卷其实就是我们从VG中拿出我们指定数量的PE,VG中的PE可以来自不同的PV,我们可以创建的逻辑卷的大小取决于VG当中PE存在的数量,并且我们创建的逻辑卷其大小一定是PE的整数倍(即逻辑卷的大小一定要是4M的整数倍)。
4.将我们创建好的LV进行文件系统的格式化,然后挂载使用
在创建好LV以后,这个时候我们就能够对其进行文件系统的格式化了,我们最终使用的就是我们刚创建好的LV,其就相当于传统的文件管理的分区,我们首先要对其进行文件系统的格式化操作,然后通过mount命令对其进行挂载,这个时候我们就能够像使用平常的分区一样来使用我们的逻辑卷了。
我们在创建好LV以后,我们会在 /dev 目录下看到我们的LV信息,例如 /dev/vgname/lvname, 我们每创建一个VG,其会在/dev目录下创建一个以该VG名字命名的文件夹,在该VG的基础上创建好LV以后,我们会在这个VG目录下多出一个以LV名字命名的逻辑卷。
下面我们来对整个LVM的工作原理进行一个总结:
(1)物理磁盘被格式化为PV,空间被划分为一个个的PE
(2)不同的PV加入到同一个VG中,不同PV的PE全部进入到了VG的PE池内
(3)LV基于PE创建,大小为PE的整数倍,组成LV的PE可能来自不同的物理磁盘
(4)LV现在就直接可以格式化后挂载使用了
(5)LV的扩充缩减实际上就是增加或减少组成该LV的PE数量,其过程不会丢失原始数据
![](https://pic4.zhimg.com/80/v2-5221b45058c8fa2aa0e45e7db8f43503_1440w.jpg)
我们看到,我们这里如果要对LV进行扩充,直接加进来一块sdc硬盘,然后将其格式化成PE,然后将该PV加入到了VG当中,这个时候我们就可以通过增加LV中PE的数量来动态的对LV进行扩充了,只要我们的LV的大小不要超过我们VG空余空间的大小就行了!!
一、创建LVM逻辑卷
![](https://pic2.zhimg.com/80/v2-f65b0a142da057248af5d65913540729_1440w.jpg)
我们通过图文并茂的方式来看看如何创建我们的LVM,在上一篇随笔中,我们已经熟悉了LVM的工作原理,首先是要将我们的物理硬盘格式化成PV,然后将多个PV加入到创建好的VG中,最后通过VG创建我们的LV。所以我们第一步就是将我们的物理硬盘格式化成PV(物理卷)
①将物理硬盘格式化成PV(物理卷) 使用的是 pvcreate 命令
这里我已经事先虚拟化了3快物理硬盘,每块硬盘的大小为8G,通过 fdisk -l 命令可以查看
[root@xiaoluo ~]# fdisk -l
Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00093d90
Device Boot Start End Blocks Id System
/dev/sda1 1 523 4194304 82 Linux swap / Solaris
Partition 1 does not end on cylinder boundary.
/dev/sda2 * 523 2611 16776192 83 Linux
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/sdc: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/sdd: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
这里我们根据上面图所示,我们先将 /dev/sdb、 /dev/sdc 两块硬盘格式化成PV
[root@xiaoluo ~]# pvcreate /dev/sdb /dev/sdc
Physical volume "/dev/sdb" successfully created
Physical volume "/dev/sdc" successfully created
创建完PV以后,我们可以使用pvdisplay(显示详细信息)、pvs命令来查看当前pv的信息
[root@xiaoluo ~]# pvdisplay
"/dev/sdb" is a new physical volume of "8.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb
VG Name
PV Size 8.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 93UEEl-cxBU-A4HC-LNSh-jp9G-uU5Q-EG8LM9
"/dev/sdc" is a new physical volume of "8.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdc
VG Name
PV Size 8.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID lH1vul-KBHx-H2C6-wbt1-8AdK-yHpr-bBIul5
[root@xiaoluo ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb lvm2 a-- 8.00g 8.00g
/dev/sdc lvm2 a-- 8.00g 8.00g
通过这两个命令我们可以看到我们已经创建好的PV的信息,两个PV都是8G,目前还没有使用,PFree都是8G.
②创建卷组(VG),并将PV加入到卷组中 通过 vgcreate 命令
在创建完PV以后,这时候我们需要创建一个VG,然后将我们的PV都加入到这个卷组当中,在创建卷组时要给该卷组起一个名字
[root@xiaoluo ~]# vgcreate xiaoluo /dev/sdb /dev/sdc
Volume group "xiaoluo" successfully created
同样,在创建好VG以后,我们也可以使用 vgdisplay 或者 vgs 命来来查看VG的信息
[root@xiaoluo ~]# vgdisplay
--- Volume group ---
VG Name xiaoluo
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 2 // 当前这里有两个PV,分别是我们的 /dev/sdb 和 /dev/sdc
Act PV 2
VG Size 15.99 GiB // 当前VG的大小
PE Size 4.00 MiB // 通过这个我们也可以看到我们LVM默认的PE大小就是4M
Total PE 4094 // 因为VG里面存放的就是各个PV中的PE,所以PE的数量就是VG大小除以默认PE的大小
Alloc PE / Size 0 / 0
Free PE / Size 4094 / 15.99 GiB
VG UUID B8eavI-21kD-Phnm-F1t1-eo4K-wgvg-T5qUbt
[root@xiaoluo ~]# vgs
VG #PV #LV #SN Attr VSize VFree
xiaoluo 2 0 0 wz--n- 15.99g 15.99g
新物理卷,将新增卷增加到原有的卷组中
vgextend xiaoluo /dev/sdd1
![](https://pic4.zhimg.com/80/v2-bf3ab1f23cc7e2fb78ac90c1ad110737_1440w.jpg)
![](https://pic1.zhimg.com/80/v2-60bf2ba753369f92755e4b9d15131748_1440w.png)
![](https://pic2.zhimg.com/80/v2-c46cf0d7f0b12ff0acc5009b353c015d_1440w.jpg)
③基于卷组(VG)创建逻辑卷(LV) 通过 lvcreate 命令
因为创建好的PV、VG都是底层的东西,我们上层使用的是逻辑卷,所以我们要基于VG创建我们的逻辑卷才行
[root@xiaoluo ~]# lvcreate -n mylv -L 2G xiaoluo
Logical volume "mylv" created
lvcreate -n myweb -l 100%free lnweixin 将剩余的所有空间分配给myweb
lvcreate -n myweb -l 100% lnweixin 将所有空间分配给myweb
![](https://pic3.zhimg.com/80/v2-fcb62f39c731050517b474ab6073109e_1440w.png)
通过 lvcreate 命令基于VG创建好我们的逻辑卷,名字为mylv,大小为2G,同样我们可以使用 lvdisplay 或者 lvs 命令来查看创建好的逻辑卷的信息
[root@xiaoluo ~]# lvdisplay
--- Logical volume ---
LV Path /dev/xiaoluo/mylv // 逻辑卷的路径
LV Name mylv // 逻辑卷的名字
VG Name xiaoluo // 逻辑卷所属卷组的名字
LV UUID PYuiYy-WpI6-XZB8-IhnQ-ANjM-lcz0-dlk4LR
LV Write Access read/write
LV Creation host, time xiaoluo, 2013-05-23 23:45:08 +0800
LV Status available
# open 0
LV Size 2.00 GiB // 逻辑卷的大小
Current LE 512
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
[root@xiaoluo ~]# lvs
LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert
mylv xiaoluo -wi-a---- 2.00g
这样子我们的逻辑卷也就已经创建好了,我们这个时候再通过 vgs 还有 pvs 命令查看一下我们的PV与VG的信息
[root@xiaoluo mnt]# vgs
VG #PV #LV #SN Attr VSize VFree
xiaoluo 2 1 0 wz--n- 15.99g 13.99g // 我们看到LV的数量此时变成了1,因为我们刚创建好了一个LV,LVFree还有14G
[root@xiaoluo mnt]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb xiaoluo lvm2 a-- 8.00g 6.00g // 刚创建好的LV用的是 /dev/sdb 这块硬盘的,所以这块硬盘的PFree还剩下6G
/dev/sdc xiaoluo lvm2 a-- 8.00g 8.00g
我们发现,当我们每创建完一个LV时,VG与PV的信息都是时时在变化的,并且我们创建LV的大小是根据当前VG的大小来决定的,不能超过当前VG的剩余大小!
我们在上一篇随笔里面有讲过,每创建好一个逻辑卷,都会在 /dev 目录下出现一个以该卷组命名的文件夹,基于该卷组创建的所有的逻辑卷都是存放在这个文件夹下面,我们可以查看一下
[root@xiaoluo ~]# ls /dev/xiaoluo/mylv
/dev/xiaoluo/mylv
我们每创建一个新的逻辑卷,该VG目录下都会多出这么一个设备。
二、格式化并使用我们的逻辑卷
我们已经创建好了我们的PV、VG以及LV,这时候我们如果要使用逻辑卷,就必须将其格式化成我们需要用的文件系统,并将其挂载起来,然后就可以像使用分区一样去使用逻辑卷了
[root@xiaoluo ~]# mkfs.ext4 /dev/xiaoluo/mylv
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131072 inodes, 524288 blocks
26214 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 31 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
格式化我们的逻辑卷以后,就可以使用 mount 命令将其进行挂载,我们将其挂载到 /mnt 目录下
[root@xiaoluo ~]# mount /dev/xiaoluo/mylv /mnt
[root@xiaoluo ~]# mount
/dev/sda2 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/mapper/xiaoluo-mylv on /mnt type ext4 (rw)
[root@xiaoluo ~]# cd /mnt/
[root@xiaoluo mnt]# ls
lost+found
[root@xiaoluo mnt]# touch xiaoluo.txt
[root@xiaoluo mnt]# ls
lost+found xiaoluo.txt
我们看到,我们的卷组已经挂载好了,并且可以像使用分区一样来对其进行文件操作了。
便于以后服务器重启自动挂载,需要将创建好的文件系统挂载信息添加到/etc/fstab里面.UUID可以通过 blkid命令查询.
[root@root-002 app]# blkid
/dev/sr0: UUID=**************************
/dev/sda1: UUID=************************ TYPE="ext4"
/dev/sdb1: UUID=********************************* TYPE="LVM2_member"
/dev/mapper/centos-lvcentos: UUID="13eab17d-855e-456d-972f-42482e501529" TYPE="ext4"
为了查看/etc/fstab是否设置正确,可以先卸载逻辑卷data1,然后使用mount –a 使内核重新读取/etc/fstab,看是否能够自动挂载.
vi /etc/fstab
#
# /etc/fstab
# Created by anaconda on Mon Mar 19 03:43:20 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=*********************************** / ext4 defaults 1 1
UUID=13eab17d-855e-456d-972f-42482e501529 /app ext4 defaults 1 1
三、删除逻辑卷
我们在创建好逻辑卷后可以通过创建文件系统,挂载逻辑卷来使用它,如果说我们不想用了也可以将其删除掉。
【注意:】对于创建物理卷、创建卷组以及创建逻辑卷我们是有严格顺序的,同样,对于删除逻辑卷、删除卷组以及删除物理卷也是有严格顺序要求的
①首先将正在使用的逻辑卷卸载掉 通过 umount 命令
②将逻辑卷先删除 通过 lvremove 命令
③删除卷组 通过 vgremove 命令
④最后再来删除我们的物理卷 通过 pvremove 命令
[root@xiaoluo /]# mount /dev/xiaoluo/mylv /mnt/
[root@xiaoluo /]# umount /mnt/
[root@xiaoluo /]# lvremove /dev/xiaoluo/mylv
Do you really want to remove active logical volume mylv? [y/n]: y
Logical volume "mylv" successfully removed
[root@xiaoluo /]# vgremove xiaoluo
Volume group "xiaoluo" successfully removed
[root@xiaoluo /]# pvremove /dev/sdb
Labels on physical volume "/dev/sdb" successfully wiped
此时我们的刚创建的逻辑卷 mylv,卷组 xiaoluo以及物理卷 /dev/sdb 已经从我们当前操作系统上删除掉了,通过 lvs、vgs、pvs命令可以查看一下
[root@xiaoluo /]# lvs
No volume groups found // 逻辑卷已经没有了
[root@xiaoluo /]# vgs
No volume groups found // 卷组也没有了
[root@xiaoluo /]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdc lvm2 a-- 8.00g 8.00g // sdb物理卷已经没有了,只剩下 sdc物理卷了
借用一张很好的图来理解LVM:https://blog.csdn.net/weixin_42915431/article/details/121881054
RAID磁盘阵列的添加
RAID(Redundant Arrays of Inexpensive Disks)容错式廉价磁盘阵列。RAID技术可以通过软件或硬件实现,将多个磁盘整合成为一个较大的磁盘装置,该装置不仅有存储功能,还具有数据保护的功能。RAID具有多个不同的等级,每个等级的对整合后的磁盘实现不同的功能。常用等级有RAID5
![](https://pic2.zhimg.com/80/v2-508a3f9f99e174e79991764fdbc631d1_1440w.jpg)
![](https://pic3.zhimg.com/80/v2-d74683c9fd476d0d47ab7246450ec6ae_1440w.jpg)
![](https://pic4.zhimg.com/80/v2-4c61e305f908b43ccf1ff87869121bab_1440w.jpg)
RAID的建立 1:利用3块硬盘组建RAID5 mdadm -C /dev/md0 -n3 -l5 /dev/sd[bcd] 。 并且查看其状态 mdadm -D /dev/md0 或 cat /proc/mdstat
- -C 创建阵列存储设备
- -n 添加磁盘的数量
- -l RAID的等级
2:创建配置文件 /etc/mdadm.conf ,并且写入配置信息 3:然后把md0设备建立逻辑卷,修改配置文件 fstab,重新挂载
第一步: 建立RAID存储设备md0,并且查看其状态,记住UUID
![](https://pic2.zhimg.com/80/v2-19fda9cd40f4287c4b8c8e3a29e34869_1440w.jpg)
第二步:创建配置文件 /etc/mdadm.conf ,并且写入以下的信息
ARRAY /dev/md0 UUID=417c8b54:e78b0978:35ea0e66:63fa5f12
第三步:创建逻辑卷,修改配置文件,重新全部挂载。可以看到,我们的基于RAID的逻辑卷已经成功挂载了。
![](https://pic1.zhimg.com/80/v2-5c3db37c20144477e86b8982dc1ecb04_1440w.jpg)
/dev/myraidvg/myraidlv /mnt/raid xfs defaults 0 0
模拟RAID故障:
模拟其中一块硬盘挂了之后,数据仍然完好无损,然后重新加入一块硬盘。
先查看 RAID 状态 ,可以看到,三块硬盘都是正常的。 cat /proc/mdstat
![](https://pic3.zhimg.com/80/v2-8bdcc1f33e1c7b35d8a46bd3cf2edeee_1440w.png)
我们先往逻辑卷里写入900M的文件,模拟生产情况下的数据
我们模拟其中的 sdb 挂了
mdadm --manage /dev/md0 --fail /dev/sdb
- --fail 将设备设定为出错状态
- --remove 将设备从阵列中移除
- --add 添加设备进入阵列
可以看到 ,sdb已经挂了 。但是我们的900M的文件还是依然完好无损
![](https://pic3.zhimg.com/80/v2-8d0520ce4fcec24ac0f54ea0a0133e1e_1440w.jpg)
那我们先把挂了的 sdb 移除,然后加上一个好的 sde 。 madam --manage /dev/md0 --remove /dev/sdb madam --manage /dev/md0 --add /dev/sde 可以看到,加上sde后,三个硬盘又组成了RAID。sde会同步其他两块硬盘上的数据
![](https://pic3.zhimg.com/80/v2-352364902ecba657f961dac82e357032_1440w.jpg)
RAID阵列的停用
- umount /mnt/raid 卸载设备 ; 修改 /etc/fstab 文件中的配置信息
- 删除阵列中创建的逻辑卷,卷组,物理卷: lvremove,vgremove,pvremove
- 删除 /etc/mdadm.conf 配置文件,取消设备开机加载阵列
- 停止 md0: mdadm -S /dev/md0
- 验证 cat /proc/mdstat mdadm -D /dev/md0
![](https://pic1.zhimg.com/80/v2-197de4e1e7545dffa3a40f65433f6c18_1440w.jpg)
注:如果取消挂载设备的时候,显示设备正忙,可以使用 fuser -mv /mnt/xxx 看看是哪个进程在使用这个挂载点,然后杀死这个进程即可。
![](https://pic3.zhimg.com/80/v2-d2e95bac86bbd7bc0ccf7dffa72c0306_1440w.jpg)
好了本文到此就结束了,文章多多少少可能会出现些错误,也希望大家能帮助我发现文章的一些错误,提出宝贵的建议。欢迎大家能在留言区评论留言哦,感谢阅读。