文件与磁盘是系统管理中非常重要的概念,这篇博客总结一下在linux系统中的磁盘分区、配额,以及文件系统,LVM(可恶这篇写了真的很久,本来还计划写下RAID,下次一定

一、磁盘

(1)磁盘的基本组成

image.png
磁盘中分为硬盘和软盘,现在更常用的时硬盘。硬盘主要有由盘片、机械手臂、磁头与主轴马达等组成。当然现在还出现了SSD固态硬盘,它的读写性能非常强悍,与上图展示的机械硬盘结构完全不同。机械硬盘中,数据主要存储在盘片上,在读取数据时,盘片旋转,磁头臂就一圈圈的读取,从直观上我们可以看到,同样的一圈磁盘外圈会比磁盘内圈大,所以外圈可以存储更多的数据。当我们在探讨磁盘分区时,一定躲不了盘片,所以我们有必要对盘片的结构做进一步了解。
image.png
盘片上面又可细分出扇区与磁道两种单位, 其中扇区的物理量设计有两种大小,分别是 512Bytes 与 4KBytes。在实际数据存储中,各个扇区也在担任不同的角色,其中一些扇区会记录这个磁盘的分区情况以及各种信息,记录分区信息的我们把它叫做磁盘分区表,通常放在第一个扇区,下面就来探讨一下磁盘分区。

(2)磁盘分区

在Windows系统中,我们常常会看到C盘,D盘等,也许在你拿到电脑之初,厂家会帮你自动设定好,或者你在自行加装机械硬盘时,需要手动设置分区,那么我们为什么要设置分区呢?
设想一下这个场景,如果你的家中不设立任何独立的房间,而是所有的房间都合并在了一起,那么你一定会生活乱了套。在计算机中也一样,如果你的某个分区受到了破坏,你只需要修复那个分区即可,而不需要把整个磁盘修复。还有一方面是可以提高你计算机的性能,寻找数据时只需要到某个特定的分区寻找即可。在上面已经谈到,磁盘利用磁盘分区表来记录分区信息,那么什么是磁盘分区表呢?
磁盘分区表是计算机安装系统的时候进行分区所保存的分区表,常见的分区方案有MBR分区表和GPT分区表。

MBR分区表

传统的分区方案(称为MBR分区方案)是将分区信息保存到磁盘的第一个扇区(MBR扇区)中的64个字节中,每个分区项占用16个字节,这16个字节中存有活动状态标志、文件系统标识、起止柱面号、磁头号、扇区号、隐含扇区数目(4个字节)、分区总扇区数目(4个字节)等内容。由于MBR扇区只有64个字节用于分区表,所以只能记录4个分区的信息。这就是硬盘主分区数目不能超过4个的原因。后来为了支持更多的分区,引入了扩展分区及逻辑分区的概念。但每个分区项仍用16个字节存储。

想象一下我们把磁盘展开成长条状,开机管理程序纪录区与分区表则通通放在磁盘的第一个扇区, 这个扇区通常是 512Bytes 的大小 ,所以说,第一个扇区 512Bytes 会有这两个数据:

  • 主要开机记录区(Master Boot Record, MBR):可以安装开机管理程序的地方,有446 Bytes
  • 分区表(partition table):记录整颗硬盘分区的状态,有64 Bytes

由于分区表所在区块仅有64 Bytes容量,因此最多仅能有四组记录区,每组记录区记录了该区段的启始与结束的柱面号码。但其实在实际环境中,我们不可能只有四个分区,这就要谈到主要分区、延伸分区以及由延伸分区切割出来的逻辑分区。在上图中Partition3就是一个延伸分区,其中分割出了四个逻辑分区。

GPT分区表

与 MBR相比 GPT 使用了 34 个 LBA 区块来纪录分区信息,同时与GPT 除了前面 34 个 LBA 之外,整个磁盘的最后 33 个 LBA 也拿来作为另一个备份。同时GPT分区也在首部加入了MBR相容分区,这个相容模式仅放入一个特殊标志的分区,用来表示此磁盘为 GPT 格式之意。而不懂 GPT 分区表的磁盘管理程序, 就不会认识这颗磁盘。

(3)磁盘分区实操

不同的磁盘分区方案适用不同的服务类型,由于linux中不同目录有明确的作用,所以我们需要根据目录类型来分配分区,至于linux的目录我们后面再讨论。

查看当前磁盘分区

我们可以使用lsblk指令来查看当前的系统分区,lsblk 可以看成“ list block device ”的缩写,就是列出所有储存设备的意思。

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@MiWiFi-R3-srv dev]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 381M 0 part /boot
└─sda2 8:2 0 24.2G 0 part
├─centos-root 253:0 0 3.7G 0 lvm /
├─centos-swap 253:1 0 956M 0 lvm [SWAP]
├─centos-usr 253:2 0 9.3G 0 lvm /usr
├─centos-var 253:3 0 3.7G 0 lvm /var
├─centos-tmp 253:4 0 1.9G 0 lvm /tmp
└─centos-home 253:5 0 4.7G 0 lvm /home
sr0 11:0 1 4.4G 0 rom /run/media/huajianchun/CentOS 7 x86_64

我们可以看到其中除了分区还出现了一个叫lvm的东西,这其实是逻辑卷,可以认为是一种特殊的分区,我们后面再详细讨论

增删磁盘分区

由于使用的分区表不同也存在着不同的分区工具,MBR 分区表使用 fdisk 分区, GPT 分区表使用 gdisk 分区。本文使用的MBR分区,所以采用fdisk工具,让我们来做做看。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@MiWiFi-R3-srv dev]# fdisk /dev/sda
欢迎使用 fdisk (util-linux 2.23.2)。

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


命令(输入 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 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 write table to disk and exit
x extra functionality (experts only)

fdisk工具有非常丰富的操作提示,我们只要根据它的文字提示操作即可。如果想要新增一个分区,看到文字提示n add a new partition,所以我们输入n并看看新增前后的分区对比,这里新增了一个大小为1GB的分区。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
命令(输入 m 获取帮助):p

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

设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 782335 390144 83 Linux
/dev/sda2 782336 51605503 25411584 8e Linux LVM

命令(输入 m 获取帮助):n
Partition type:
p primary (2 primary, 0 extended, 2 free)
e extended
Select (default p): p
分区号 (3,4,默认 3):3
起始 扇区 (51605504-83886079,默认为 51605504):
将使用默认值 51605504
Last 扇区, +扇区 or +size{K,M,G} (51605504-83886079,默认为 83886079):+1GB
分区 3 已设置为 Linux 类型,大小设为 954 MiB

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

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

设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 782335 390144 83 Linux
/dev/sda2 782336 51605503 25411584 8e Linux LVM
/dev/sda3 51605504 53559295 976896 83 Linux

但当我们写入推出后,会惊讶的发现磁盘分区信息并没有发生改变,这是为什么呢,我们在前面提到磁盘的分区信息由分区记录表来记录,所以我们在更改后也需要更新分区表,这里使用partprobe指令即可,通过前后对比可以明显看出差异。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[root@MiWiFi-R3-srv dev]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 381M 0 part /boot
└─sda2 8:2 0 24.2G 0 part
├─centos-root 253:0 0 3.7G 0 lvm /
├─centos-swap 253:1 0 956M 0 lvm [SWAP]
├─centos-usr 253:2 0 9.3G 0 lvm /usr
├─centos-var 253:3 0 3.7G 0 lvm /var
├─centos-tmp 253:4 0 1.9G 0 lvm /tmp
└─centos-home 253:5 0 4.7G 0 lvm /home
sr0 11:0 1 4.4G 0 rom /run/media/huajianchun/CentOS 7 x86_64
[root@MiWiFi-R3-srv dev]# partprobe -s
/dev/sda: msdos partitions 1 2 3
Warning: 无法以读写方式打开 /dev/sr0 (只读文件系统)。/dev/sr0 已按照只读方式打开。
/dev/sr0: msdos partitions 2
[root@MiWiFi-R3-srv dev]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 381M 0 part /boot
├─sda2 8:2 0 24.2G 0 part
│ ├─centos-root 253:0 0 3.7G 0 lvm /
│ ├─centos-swap 253:1 0 956M 0 lvm [SWAP]
│ ├─centos-usr 253:2 0 9.3G 0 lvm /usr
│ ├─centos-var 253:3 0 3.7G 0 lvm /var
│ ├─centos-tmp 253:4 0 1.9G 0 lvm /tmp
│ └─centos-home 253:5 0 4.7G 0 lvm /home
└─sda3 8:3 0 954M 0 part
sr0 11:0 1 4.4G 0 rom /run/media/huajianchun/CentOS 7 x86_64

(4)磁盘配额

想象这样一个场景,当你设定了一个1GB的分区,其中有五位用户在使用这个分区,理想状态是,这五位用户平分这1GB的空间,但偏偏有用户恶意使用,一个人独占800MB该怎么办,由此我们便要讨论磁盘配额,对用户或者目录进行限制,避免这一情况发生。在linux中,有一个名为quota的工具可以解决这一问题。因为Linux是多用户多任务的操作系统,许多人共用磁盘空间,为了合理的分配磁盘空间,于是就有了quota的出现。
我们首先要介绍柔性劝导(soft)与硬性规定(hard)这两个概念,hard表示绝对的限制,举个例子来说就是,如果限制为500MB,那么你的文件大小无论如何都不能超过500MB,所谓soft可以理解为一个警戒值,假如你的hard设置为500MB,soft设置为400MB,那么当你的文件大小超过400MB但没有达到500MB时会受到警告,这个警告通常有个时限被叫做grace time,一旦超过时限,你的hard也会变成400MB,目录被锁住,你就无法再进行操作了。
image.png
我提前创建好了五个用户命名为quotatest1,quotatest2,quotatest3,quotatest4,quotatest5并将他们加入quotatest群组。

1
2
[quotatest1@MiWiFi-R3-srv tmp]$ id
uid=1002(quotatest1) gid=1002(quotatest) 组=1002(quotatest)

我们还需要修改/etc/fstab文件来打开quota功能,并进行重新挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@MiWiFi-R3-srv tmp]# vim /etc/fstab
[root@MiWiFi-R3-srv tmp]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Fri Jul 29 17:12:39 2022
#
# 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
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=8809eae2-0ea5-4d53-bc0a-284678c4bd41 /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
/dev/mapper/centos-tmp /tmp xfs defaults 0 0
/dev/mapper/centos-usr /usr xfs defaults 0 0
/dev/mapper/centos-var /var xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
/dev/sda3 /data/sda3 xfs defaults,usrquota,grpquota 0 0
[root@MiWiFi-R3-srv tmp]# umount /data/sda3
[root@MiWiFi-R3-srv tmp]# mount -a
[root@MiWiFi-R3-srv tmp]# mount | grep /data/sda3
/dev/sda3 on /data/sda3 type xfs (rw,relatime,attr2,inode64,usrquota,grpquota)

下面我们要进行配额的设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@MiWiFi-R3-srv tmp]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M quotatest1" /data/sda3
[root@MiWiFi-R3-srv tmp]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M quotatest2" /data/sda3
[root@MiWiFi-R3-srv tmp]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M quotatest3" /data/sda3
[root@MiWiFi-R3-srv tmp]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M quotatest4" /data/sda3
[root@MiWiFi-R3-srv tmp]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M quotatest5" /data/sda3
[root@MiWiFi-R3-srv tmp]# xfs_quota -x -c "report -ubih" /data/sda3
User quota on /data/sda3 (/dev/sda3)
Blocks Inodes
User ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
root 0 0 0 00 [------] 4 0 0 00 [------]
quotatest1 0 250M 300M 00 [------] 0 0 0 00 [------]
quotatest2 0 250M 300M 00 [------] 0 0 0 00 [------]
quotatest3 0 250M 300M 00 [------] 0 0 0 00 [------]
quotatest4 0 250M 300M 00 [------] 0 0 0 00 [------]
quotatest5 0 250M 300M 00 [------] 0 0 0 00 [------]

二、文件

(1)文件系统层次结构

在linux系统中,我们知道它并没有C盘,D盘等,那么文件目录的结构是什么样的呢。在linux的各大发行版中都遵循着一个目录配置标准,就是Filesystem Hierarchy Standard (FHS)标准,这个标准规定了linux的文件系统层次结构,让不同的发行版之间有了统一的标准。

FHS:https://refspecs.linuxfoundation.org/FHS_3.0/fhs/index.html

整个系统的文件都从 /(根目录)开始由于这个结构特别像一颗树从下往上开始分叉,于是我们又形象的把它叫做目录树,我们介绍几个其中的目录。

etc目录是配置文件目录,系统主要的配置文件几乎都放置在这个目录内,例如人员的帐号密码档、 各种服务的启始档等等。一般来说,这个目录下的各文件属性是可以让一般使用者查阅的, 但是只有root有权力修改。
home目录这是系统默认的使用者主文件夹。当你新增一个用户时,该用户的主文件夹会放置到该目录下。
usr目录并不是user的缩写,所以其中放置的并不是用户数据。usr是Unix Software Resource的缩写,其中放置的是软件数据。
在上图中我们可以看到几个箭头,这是什么意思呢,在windows中,当我们想打开一个软件时,通常不会一层层的进入目录寻找可执行文件,而是会选择在桌面放置一个快捷方式。类比这样的思想,我们也可以把这样的箭头认为是快捷方式,例如/bin目录的箭头指向了/usr/sbin,那么就说明/bin目录下存放的内容就是/usr/bin目录下存放的内容。

(2)文件系统

那么既然是这样的结构,如何把它和我们之前谈到的磁盘联系起来呢,这里就要谈到一个叫文件系统的东西。文件系统是操作系统中负责管理持久数据的子系统,说简单点,就是负责把用户的文件存到磁盘硬件中,因为即使计算机断电了,磁盘里的数据并不会丢失,所以可以持久化的保存文件。文件系统的基本数据单位是文件,它的目的是对磁盘上的文件进行组织管理,那组织的方式不同,就会形成不同的文件系统。在centos系统中,文件系统经历了从Ext文件系统到xfs文件系统的变化。
谈到文件系统,我们就必须要谈到三个区块,分别是superblock、inode和block,其中superblock记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等。inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的 block 号。block实际记录文件的内容,若文件太大时,会占用多个 block 。image.png

EXT2文件系统简述

EXT2文件系统采用一个叫块组的东西,即block group。如下图所示,在文件系统的最前面会有一个Boot Block开机扇区,后面被分成了多个块组。每个块组的结构相同。通过这种结构可以高效的进行数据管理,就像班级一样,每个班级的结构相同,那么学校就很容易管理众多的学生。

xfs文件系统简述

XFS是高性能文件系统,SGI为他们的IRIX平台而设计。自从2001年移植到Linux内核上,由于它的高性能,XFS成为了许多企业级系统的首选,特别是有大量数据,需要结构化伸缩性和稳定性的。例如,RHEL/CentOS 7 和Oracle Linux将XFS作为默认文件系统,SUSE/openSUSE已经为XFS做了长期支持。XFS有许多独特的性能提升功能使他从众多文件系统中脱颖而出,像可伸缩/并行 IO,元数据日志,热碎片整理,IO 暂停/恢复,延迟分配等。我们可以用xfs_info指令来查看xfs文件系统信息。

1
2
3
4
5
6
7
8
9
10
11
[root@MiWiFi-R3-srv dev]# xfs_info /dev/sda1
meta-data=/dev/sda1 isize=512 agcount=4, agsize=24384 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=97536, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=855, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

(3)文件系统与目录和磁盘间的关系

让我们想象一下这个场景,假如你想要购买一个房子,你可以选择房子所处的位置,你也可以选择如何使用这个房子。类比这三者的关系,磁盘代表位置,你可以选择目录存储在哪个磁盘中,文件系统则决定了你如何使用这个目录。还记得我们之前创建了一个分区吗,现在我们要将它格式化并挂载到一个目录下。
我们常常会听到格式化这三个字,格式化是指对磁盘或磁盘中的分区进行初始化的一种操作,这种操作通常会导致现有的磁盘或分区中所有的文件被清除。但在这里我们的分区中很干净并没有文件,所以我们格式化的目的在于该分区中创建一个文件系统,我们可以用mkfs.xfs创建一个xfs文件系统。

1
2
3
4
5
6
7
8
9
10
11
[root@MiWiFi-R3-srv dev]# mkfs.xfs /dev/sda3
meta-data=/dev/sda3 isize=512 agcount=4, agsize=61056 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=244224, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=855, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

格式化结束后我们就可以进行挂载,但是要注意,如果原来的某一目录已经被挂载的话,那如果你用新的分区再次挂载这个目录,那么这个目录里面的内容就会被覆盖。我们可以用mount指令进行挂载,并通过修改/etc/fstab文件设置开机挂载。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
[root@MiWiFi-R3-srv /]# mkdir -p data/sda3
[root@MiWiFi-R3-srv /]# mount /dev/sda3 /data/sda3
[root@MiWiFi-R3-srv /]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 381M 0 part /boot
├─sda2 8:2 0 24.2G 0 part
│ ├─centos-root 253:0 0 3.7G 0 lvm /
│ ├─centos-swap 253:1 0 956M 0 lvm [SWAP]
│ ├─centos-usr 253:2 0 9.3G 0 lvm /usr
│ ├─centos-var 253:3 0 3.7G 0 lvm /var
│ ├─centos-tmp 253:4 0 1.9G 0 lvm /tmp
│ └─centos-home 253:5 0 4.7G 0 lvm /home
└─sda3 8:3 0 954M 0 part /data/sda3
sr0 11:0 1 4.4G 0 rom /run/media/huajianchun/CentOS 7 x86_64
[root@MiWiFi-R3-srv /]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Fri Jul 29 17:12:39 2022
#
# 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
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=8809eae2-0ea5-4d53-bc0a-284678c4bd41 /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
/dev/mapper/centos-tmp /tmp xfs defaults 0 0
/dev/mapper/centos-usr /usr xfs defaults 0 0
/dev/mapper/centos-var /var xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
[root@MiWiFi-R3-srv /]# vim /etc/fstab
[root@MiWiFi-R3-srv /]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Fri Jul 29 17:12:39 2022
#
# 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
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=8809eae2-0ea5-4d53-bc0a-284678c4bd41 /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
/dev/mapper/centos-tmp /tmp xfs defaults 0 0
/dev/mapper/centos-usr /usr xfs defaults 0 0
/dev/mapper/centos-var /var xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
/dev/sda3 /data/sda3 xfs defaults 0 0
[root@MiWiFi-R3-srv /]# mount -a
[root@MiWiFi-R3-srv /]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 381M 0 part /boot
├─sda2 8:2 0 24.2G 0 part
│ ├─centos-root 253:0 0 3.7G 0 lvm /
│ ├─centos-swap 253:1 0 956M 0 lvm [SWAP]
│ ├─centos-usr 253:2 0 9.3G 0 lvm /usr
│ ├─centos-var 253:3 0 3.7G 0 lvm /var
│ ├─centos-tmp 253:4 0 1.9G 0 lvm /tmp
│ └─centos-home 253:5 0 4.7G 0 lvm /home
└─sda3 8:3 0 954M 0 part /data/sda3
sr0 11:0 1 4.4G 0 rom /run/media/huajianchun/CentOS 7 x86_64

三、LVM

我们可以对磁盘进行分区管理,那么我们也一定能对分区进行进一步管理,由此我们开始讨论LVM。LVM是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2.4内核上实现,我们常常难以评估各分区大小,以分配合适的硬盘空间。普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某个文件时,这个文件因为受上层文件系统的限制,也不能跨越多个分区来存放,所以也不能同时放到别的磁盘上。如果我们使用LVM,这些问题就都迎刃而解,我们在无需停机的情况下可以方便地调整各个分区大小。

(1)VG、LV、PV和PE

我们需要先理解四个概念VG、LV、PV和PE

  • PE(physical extend,物理区域):物理区域是物理卷中可用于分配的最小存储单元,物理区域大小在建立卷组时指定,一旦确定不能更改,同一卷组所有物理卷的物理区域大小需一致,新的pv加入到vg后,pe的大小自动更改为vg中定义的pe大小
  • PV(phsical volume,物理卷):是VG的组成部分,在逻辑卷管理系统的最底层,可为整个物理硬盘或硬盘上的分区
  • LV(logical volumn,逻辑卷 ):逻辑卷建立在卷组基础上,卷组中未分配空间用于建立新的逻辑卷,建立后可动态添加卷到卷组中,逻辑卷建立后可以动态扩展和缩小空间,在逻辑卷上可以建立文件系统。
  • VG(volume group,卷组 ):建立在物理卷上,一卷组至少包含一个物理卷,卷组建立后可动态添加卷到卷组,一个逻辑卷管理系统有多个卷组,LVM卷组由一个或多个物理卷组成

(2)LV建立过程

通俗来说如果我们要建立一个LV即逻辑卷,那么我们一定会经历以下步骤。首先我们需要用fdisk/gdisk工具把分区的System ID改为8e,将该分区类型变为Linux LVm。至于为什么是8e,请看如下展示,根据fdisk/gdisk的文字提示即可查询。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
空                 24  NEC DOS         81  Minix / 旧 Linu bf  Solaris        
1 FAT12 27 隐藏的 NTFS Win 82 Linux 交换 / So c1 DRDOS/sec (FAT-
2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT-
3 XENIX usr 3c PartitionMagic 84 OS/2 隐藏的 C: c6 DRDOS/sec (FAT-
4 FAT16 <32M 40 Venix 80286 85 Linux 扩展 c7 Syrinx
5 扩展 41 PPC PReP Boot 86 NTFS 卷集 da 非文件系统数据
6 FAT16 42 SFS 87 NTFS 卷集 db CP/M / CTOS / .
7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux 纯文本 de Dell 工具
8 AIX 4e QNX4.x 第2部分 8e Linux LVM df BootIt
9 AIX 可启动 4f QNX4.x 第3部分 93 Amoeba e1 DOS 访问
a OS/2 启动管理器 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O
b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor
c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad 休 eb BeOS fs
e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD ee GPT
f W95 扩展 (LBA) 54 OnTrackDM6 a6 OpenBSD ef EFI (FAT-12/16/
10 OPUS 55 EZ-Drive a7 NeXTSTEP f0 Linux/PA-RISC
11 隐藏的 FAT12 56 Golden Bow a8 Darwin UFS f1 SpeedStor
12 Compaq 诊断 5c Priam Edisk a9 NetBSD f4 SpeedStor
14 隐藏的 FAT16 <3 61 SpeedStor ab Darwin 启动 f2 DOS 次要
16 隐藏的 FAT16 63 GNU HURD or Sys af HFS / HFS+ fb VMware VMFS
17 隐藏的 HPFS/NTF 64 Novell Netware b7 BSDI fs fc VMware VMKCORE
18 AST 智能睡眠 65 Novell Netware b8 BSDI swap fd Linux raid 自动
1b 隐藏的 W95 FAT3 70 DiskSecure 多启 bb Boot Wizard 隐 fe LANstep
1c 隐藏的 W95 FAT3 75 PC/IX be Solaris 启动 ff BBT
1e 隐藏的 W95 FAT1 80 旧 Minix

然后我们要将多个PV形成一个VG,即把多个分区变为一个卷组。最后我们把该卷组分出多个逻辑卷(LV),用先前同样的方法格式化挂载即可使用。