云计算基础-6:Linux存储管理-1

Linux 存储管理完全指南

存储管理是 Linux 运维最核心的技能之一。从一块新硬盘到可用的存储空间,需要经过分区、格式化、挂载等一系列操作;而面对复杂的生产环境,还需要掌握 LVM 逻辑卷管理和 Swap 交换分区等技术。

很多初学者觉得存储管理复杂,是因为没有建立起”物理磁盘 → 分区 → 文件系统 → 挂载点”之间的清晰关联。本文将通过层层拆解的方式,从最基础的磁盘结构讲起,逐步演示 fdisk、mkfs、mount、LVM、Swap 等工具的实战用法,帮你构建完整的 Linux 存储知识体系。


磁盘基础概念

磁盘/硬盘/disk是同一个东西,不同于内存的是容量比较大。

磁盘类型

机械

机械硬盘即是传统普通硬盘,主要由:盘片,磁头,盘片转轴及控制电机,磁头控制器,数据转换器,接口,缓存等几个部分组成。

固态

固态驱动器(Solid State Disk或Solid State Drive,简称SSD),俗称固态硬盘,固态硬盘是用固态电子存储芯片阵列而制成的硬盘

图示

磁盘的物理结构

核心术语详解

机械硬盘的物理结构遵循从整体到局部的层级划分,以下是核心概念的精确定义:

  1. 盘片与盘面


    硬盘内部由多个同轴重叠的磁性盘片组成,每个盘片拥有上下两个独立的盘面(Side)。所有数据最终都存储在这些盘面的磁性涂层上。


  2. 磁道(Track)


    盘面被划分为若干个宽度相同的同心圆,这些同心圆就是磁道。磁道从外向内依次编号(最外侧为 0 磁道),0 磁道存储着硬盘分区表等关键系统信息,一旦损坏硬盘将无法正常使用。


  3. 扇区(Sector)

    将盘面沿径向划分为若干个内角相同的扇形区域,每个磁道因此被分割为若干段圆弧,每段圆弧就是一个扇区。

    • 扇区是磁盘最小的物理读写单位,数据只能以扇区为单位整体读取或写入
    • 传统硬盘扇区大小为 512 字节,现代硬盘普遍采用 4KB(4096 字节)的高级格式化扇区
    • 硬盘的第一个扇区称为引导扇区,存放操作系统启动的核心代码
  4. 柱面(Cylinder)


    所有盘面上同一编号的磁道共同构成一个圆柱,称为柱面。磁盘读写优先在同一柱面内进行,因为此时磁头无需径向移动,读写速度最快。


  5. 簇(Cluster)


    操作系统层面的最小文件存储单位,由若干个连续的扇区组成。即使文件大小小于一个簇,也会占用整个簇的存储空间,这也是小文件会浪费磁盘空间的原因。


常见机械硬盘关键参数

参数类别主流规格
物理尺寸3.5 英寸(台式机)、2.5 英寸(笔记本)、1.8 英寸(便携设备)
接口类型早期 IDE 接口 → 主流 SATA I/II/III 接口
主轴转速5400rpm、7200rpm(消费级)、10000rpm、15000rpm(企业级)
主流厂商西部数据、希捷、三星、日立、金士顿

核心读写部件

!!!内部运作时很类似于这种唱片机!!!

机械硬盘读写依赖三个运动部件的精密协同:

  1. 主轴电机:带动盘片高速旋转(如 7200 转 / 分钟)


  2. 磁头臂 + 步进电机:带动所有磁头同步径向移动,定位到目标磁道


  3. 磁头:每个盘面对应一个磁头,悬浮在盘片上方(距离仅 0.1-0.3 微米),负责读写数据


    ⚠️ 硬盘极度怕震动,震动会导致磁头撞击盘片,造成永久性物理坏道。



硬盘命名规则

Linux 内核(kernel)对不同接口的硬盘有不同的命名方式:

接口类型命名前缀示例说明
IDE(并口)/dev/hd/dev/hda/dev/hdb老式硬盘接口,现在较少使用
SATA(串口)/dev/sd/dev/sda/dev/sdb现代硬盘通用接口

命名拆解说明:

/dev/sda 为例:

部分含义
/dev设备文件目录
s代表 SATA 串口硬盘
d代表 disk(磁盘)
a代表第一块硬盘(b 为第二块,c 为第三块…)

问题:第五块硬盘的全名是什么?

答案:/dev/sde(a→第一块,b→第二块,c→第三块,d→第四块,e→第五块)


分区方式

Linux 支持两种主要的分区表格式:

特性MBRGPT
全称Master Boot Record(主引导记录)GUID Partition Table(全局唯一标识分区表)
最大支持容量< 2TB> 2TB(理论上可达 9.4ZB)
分区数量限制最多 4 个主分区最多 128 个分区
突破分区限制需使用扩展分区 + 逻辑分区无需扩展分区
使用场景传统 BIOS + 小容量硬盘UEFI + 大容量硬盘

MBR 分区说明

  • MBR 是位于磁盘最前边的一段引导代码
  • 设计时只分配了 4 个分区槽位
  • 如果需要超过 4 个分区,需放弃一个主分区,改为创建扩展分区,再在扩展分区内创建逻辑分区

磁盘管理流程

添加新磁盘

在 VMware 虚拟机中添加磁盘的步骤:

  1. 先关闭虚拟机电源
  2. 编辑虚拟机设置 → 添加硬盘
  3. 按照向导完成添加

管理磁盘流程三部曲

新硬盘投入使用需要三个步骤,可以用”装修房子”来理解:

新磁盘(毛坯房)
    ↓
1. 分区(MBR 或 GPT)  →  隔间(划分卧室、客厅)
    ↓
2. 格式化/文件系统     →  装修放家具/打造格子柜
    ↓
3. 挂载(mount)       →  加个门/目录(设置访问入口)

步骤一:查看磁盘信息

方法 1:查看设备文件

[root@localhost ~]# ll    /dev/sd*
brw-rw----. 1 root disk 8,  0 5月  13 15:27 /dev/sda
brw-rw----. 1 root disk 8,  1 5月  13 15:27 /dev/sda1
brw-rw----. 1 root disk 8,  2 5月  13 15:27 /dev/sda2
brw-rw----. 1 root disk 8, 16 5月  13 15:27 /dev/sdb
brw-rw----. 1 root disk 8, 32 5月  13 15:27 /dev/sdc
brw-rw----. 1 root disk 8, 48 5月  13 15:27 /dev/sdd
brw-rw----. 1 root disk 8, 64 5月  13 15:27 /dev/sde
brw-rw----. 1 root disk 8, 80 5月  13 15:27 /dev/sdf
brw-rw----. 1 root disk 8, 96 5月  13 15:27 /dev/sdg

分析:

  • /dev/sd*中*代表的意思是以sd开头命名的所有目录/文件


  • /dev/sda 是系统盘(已有分区 sda1、sda2)


  • /dev/sdb/dev/sdc/dev/sdd 等没有分区号,相当于新购买的磁盘


方法 2:使用 lsblk 查看(推荐)

[root@localhost ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   19G  0 part 
  ├─centos-root 253:0    0   17G  0 lvm  /
  └─centos-swap 253:1    0    2G  0 lvm  [SWAP]
sdb               8:16   0   20G  0 disk 
sdc               8:32   0   20G  0 disk 
sdd               8:48   0   20G  0 disk 
sde               8:64   0   20G  0 disk 
sdf               8:80   0   20G  0 disk 
sdg               8:96   0   20G  0 disk 
sr0              11:0    1  4.3G  0 rom  /run/media/root/CentOS 7 x86_64
字段名全称含义
NAMEName设备的系统名称,即我们操作磁盘时使用的标识符
MAJ:MINMajor:Minor主设备号:次设备号,内核用来唯一标识一个块设备
RMRemovable是否为可移动设备(1 = 是,0 = 否)
SIZESize设备的总容量
RORead Only是否为只读设备(1 = 是,0 = 否)
TYPEType设备类型
MOUNTPOINTMount Point设备的挂载点(文件系统在系统中的访问路径)

步骤二:创建分区(MBR)

打个比方:分区就像把一个大房子划分成卧室、客厅、厨房。

启动 fdisk 分区工具

[root@localhost ~]# fdisk /dev/sdb

进入 fdisk 后的交互界面:

欢迎使用 fdisk (util-linux 2.23.2)。

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

Device does not contain a recognized partition table
使用磁盘标识符 0xa9c32dd1 创建新的 DOS 磁盘标签。

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

常用操作指令

指令功能说明
n新建分区(New)创建新分区
p打印分区表(Print)查看当前分区情况
d删除分区(Delete)删除已有分区
l列出分区类型查看所有分区类型代码
t更改分区类型修改分区类型(如改为 Swap 类型 82)
w写入并退出(Write)保存分区信息
q不保存退出放弃修改并退出

创建主分区完整流程

1. 输入 n 新建分区:

命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): 
  • p 代表主分区(primary),括号内表示当前磁盘 0 个主分区、0 个扩展分区,剩余 4 个主分区可用(MBR 分区表最多支持 4 个主分区)
  • e 代表扩展分区(extended),用于突破主分区数量限制,可在其内部创建多个逻辑分区
  • Select (default p): 表示默认选择主分区,直接回车即可确认;如需创建扩展分区,输入e后回车

2. 选择分区类型,输入 p 创建主分区:

Select (default p): p

3. 选择分区号(1-4),输入 1

分区号 (1-4,默认 1):1

4. 选择起始扇区,直接回车使用默认值:

起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
  • 提示选择分区的起始扇区位置,括号内2048-41943039是当前磁盘剩余空间的可用扇区范围,默认为2048是系统推荐的最优值(满足 4K 扇区对齐,大幅提升磁盘读写性能)
  • 这里直接回车确认,系统将自动使用推荐的默认起始扇区2048创建分区

5. 指定分区大小,输入 +2G

Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+2G  
分区 1 已设置为 Linux 类型,大小设为 2 GiB
  • 提示选择分区的结束位置,支持三种输入格式:直接输入结束扇区号、输入+扇区数、输入+大小{K,M,G}(最常用)
  • 括号内2048-41943039是当前剩余空间的可用扇区范围,默认为41943039表示默认直接分配全部剩余空间
  • +2G 表示手动指定该分区大小为 2GB,是最直观易用的分区大小指定方式
  • 系统反馈:1 号分区创建成功,默认设置为 Linux 文件系统类型,实际分配大小为 2 GiB

提示:实际环境中根据磁盘大小划分,如 4TB 磁盘可以 500GB 一个分区。

6. 输入 w 保存分区信息:

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@localhost ~]#

这里竟然自己退出了,我印象里是输入q才退出,可能是我记错了。 一般来说,我们在w保存前会先使用p看一下分区是否正确,然后才决定是保存还是重新分配。

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

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xa9c32dd1

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     4196351     2097152   83  Linux

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

刷新分区表

[root@localhost ~]# partprobe /dev/sdb
  • partprobe 是 Linux 系统中强制刷新内核磁盘分区表的专用命令
  • /dev/sdb 指定要刷新分区表的目标磁盘,对应我们刚才新建分区的第二块磁盘
  • 执行后无任何输出即表示成功,系统会立即识别出 fdisk 刚创建的新分区(如/dev/sdb1
  • 这是 fdisk 分区完成后的必备步骤,省略会导致内核仍使用旧分区表,新分区无法被识别、无法格式化和挂载

查看分区结果

方法 1:使用 fdisk -l

[root@localhost ~]# fdisk -l /dev/sdb

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xa9c32dd1

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     4196351     2097152   83  Linux

方法 2:使用 lsblk

[root@localhost ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   19G  0 part 
  ├─centos-root 253:0    0   17G  0 lvm  /
  └─centos-swap 253:1    0    2G  0 lvm  [SWAP]
sdb               8:16   0   20G  0 disk 
└─sdb1            8:17   0    2G  0 part 

结论:说明划分磁盘完毕,成功创建 /dev/sdb1 分区,大小为2G。


步骤三:创建文件系统(格式化)

打个比方:文件系统就像房子里的格子柜,让数据有规律地存放。

[root@localhost ~]# mkfs.ext4 /dev/sdb1

输出示例:

[root@localhost ~]# mkfs.ext4       /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131072 inodes, 524288 blocks
26214 blocks (5.00%) reserved for the super user
第一个数据块=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

Allocating group tables: 完成                            
正在写入inode表: 完成                            
Creating journal (16384 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

注意:新创建的每个分区(如 sdb2、sdb3)都需要执行格式化操作。

常见文件系统类型

文件系统命令特点
ext4mkfs.ext4经典文件系统,稳定可靠
xfsmkfs.xfsCentOS 7+ 默认,支持大容量
vfatmkfs.vfat兼容 Windows 的 FAT32

步骤四:挂载 mount

手动挂载

1. 创建挂载点(一个分区对应一个挂载点):

[root@localhost ~]# mkdir /mnt/disk1

2. 执行挂载:

[root@localhost ~]# mount -t ext4 /dev/sdb1 /mnt/disk1

参数说明-t ext4 指定文件系统类型,通常可以省略,系统会自动识别。


步骤五:查看挂载信息

方法 1:使用 df -hT(推荐)

[root@localhost ~]# df  -hT
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs        17G  3.6G   14G   21% /
devtmpfs                devtmpfs  470M     0  470M    0% /dev
tmpfs                   tmpfs     487M     0  487M    0% /dev/shm
tmpfs                   tmpfs     487M  8.6M  478M    2% /run
tmpfs                   tmpfs     487M     0  487M    0% /sys/fs/cgroup
/dev/sda1               xfs      1014M  166M  849M   17% /boot
tmpfs                   tmpfs      98M  4.0K   98M    1% /run/user/42
tmpfs                   tmpfs      98M   24K   98M    1% /run/user/0
/dev/sr0                iso9660   4.3G  4.3G     0  100% /run/media/root/CentOS 7 x86_64
/dev/sdb1               ext4      2.0G  6.0M  1.8G    1% /mnt/disk1
字段(中文)字段(英文)说明
文件系统Filesystem分区设备名
类型Type文件系统类型
容量Size分区总大小
已用Used已使用空间
可用Avail可用空间
已用%Use%使用百分比
挂载点Mounted on挂载点

方法 2:使用 mount 命令

[root@localhost ~]# mount
/dev/sdb1 on /mnt/disk1 type ext4 (rw,relatime,seclabel,data=ordered)

mount 命令可以查看磁盘的特殊挂载属性,具体属性在后续讲解。


永久挂载(重启后不失效)

手动挂载的分区在系统重启后会失效。有两种方式实现永久挂载:

方法一:写入 /etc/fstab(推荐)

[root@localhost ~]# vim /etc/fstab

添加以下内容:

/dev/sdb1  /mnt/disk1  ext4  defaults  0  0

字段说明:

字段顺序示例值说明
设备/dev/sdb1要挂载的分区
挂载点/mnt/disk1挂载目录
文件系统类型ext4分区格式
挂载选项defaults使用默认选项(rw, suid, dev, exec, auto, nouser, async)
dump 备份0是否备份(0=不备份,1=每天备份)
fsck 检查顺序0开机检查顺序(0=不检查,1=最先检查,2=稍后检查)

使配置立即生效:

[root@localhost ~]# mount -a

mount -a 会读取 /etc/fstab 并挂载所有未挂载的条目。这是检验 fstab 配置是否正确的好方法。

方法二:写入自启动文件(不推荐)

[root@localhost ~]# vim /root/.bashrc

在文件末尾追加:

mount -t ext4 /dev/sdb1 /mnt/disk1

注意:这种方法会在用户登录时执行这条命令挂载,不够优雅,且不要影响文件原有的内容。


扩展分区与逻辑分区

问题:磁盘分区数量可以超过 4 个吗?

MBR 分区表最多支持 4 个主分区。如果需要更多分区,需要放弃一个主分区,改为扩展分区,然后在扩展分区内创建逻辑分区

操作步骤

前提:sdb这块磁盘被我分了四个主分区,且各个分区已在使用,详细信息如下图

1. 删除主分区:

先卸载

[root@localhost ~]# umount /dev/sdb4
[root@localhost ~]# fdisk /dev/sdb

命令(输入 m 获取帮助):d    # 删除分区
分区号 (1-4):4             # 删除第四个分区

命令(输入 m 获取帮助):p    # 打印分区列表,确认删除成功

2. 创建扩展分区:

命令(输入 m 获取帮助):n    # 新建分区
Partition type:
   p   primary
   e   extended
Select (default p):e       # 选择扩展分区
分区号 (1-4):回车          # 使用默认
起始 扇区:回车             # 使用默认
Last 扇区:回车             # 使用磁盘剩余全部空间

3. 在扩展分区内创建逻辑分区:

命令(输入 m 获取帮助):n    # 新建分区
Select (default l):l       # 选择逻辑分区,如果已经创建三个主分区,则直接默认创建逻辑分区
起始 扇区:回车             # 使用默认
Last 扇区, +size{K,M,G}:+200M   # 指定大小

命令(输入 m 获取帮助):p    # 查看结果

逻辑分区命名:逻辑分区从 /dev/sdb5 开始编号(sdb1-sdb4 保留给主分区和扩展分区)。

后续的刷新分区,创建文件系统,挂载同上


逻辑卷管理 LVM

前言:基本磁盘的局限性

尝试用以下命令写满一个磁盘:

dd if=/dev/zero of=/mnt/disk2/1.txt bs=1M count=10000
  • dd 是 Linux 系统中底层字节级数据复制工具,俗称 “磁盘手术刀”(也被称为 “磁盘毁灭者”,操作失误会导致数据永久丢失)
  • if=/dev/zero 指定输入源为系统特殊设备 /dev/zero,该设备会无限输出空字节(0x00),所以我们看1.txt这个文件时并没有内容
  • of=/mnt/disk2/1.txt 指定输出目标为 /mnt/disk2 挂载点下的 1.txt 文件
  • bs=1M 指定每次读写操作的块大小为 1MB(1024×1024 字节),是经过验证的高效块大小
  • count=1000 指定总共复制 10000 个这样的块
  • 执行后会生成精确大小为 10000MB(约 10GB)的文件,文件内容全部为 0 字节,且会真实占用磁盘 10GB 空间
[root@localhost ~]# dd if=/dev/zero of=/mnt/disk2/1.txt bs=1M count=10000
dd: 写入"/mnt/disk2/1.txt" 出错: 设备上没有空间
记录了3872+0 的读入
记录了3871+0 的写出
4059779072字节(4.1 GB)已复制,1.7465 秒,2.3 GB/秒
[root@localhost ~]# df -hT
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs        17G  3.6G   14G   21% /
devtmpfs                devtmpfs  470M     0  470M    0% /dev
tmpfs                   tmpfs     487M     0  487M    0% /dev/shm
tmpfs                   tmpfs     487M  8.4M  478M    2% /run
tmpfs                   tmpfs     487M     0  487M    0% /sys/fs/cgroup
/dev/sda1               xfs      1014M  166M  849M   17% /boot
/dev/sdb1               ext4      2.0G  6.0M  1.8G    1% /mnt/disk1
tmpfs                   tmpfs      98M   12K   98M    1% /run/user/42
tmpfs                   tmpfs      98M     0   98M    0% /run/user/0
/dev/sdb2               ext4      3.9G  3.8G     0  100% /mnt/disk2

基本磁盘的最大缺点:无法灵活调整大小!

当分区满了之后,只能重新划分分区、备份数据、格式化、恢复数据,操作繁琐且风险高。

LVM 的目的

LVM(Logical Volume Manager,逻辑卷管理)是 Linux 管理磁盘的一种高级方式。它的性质与基本磁盘无异,但最大特点是可以随意扩张大小

LVM 核心术语

术语缩写说明
物理卷PV(Physical Volume)一块或多块物理硬盘
卷组VG(Volume Group)多个 PV 聚合成的存储池
逻辑卷LV(Logical Volume)从 VG 中划分出的逻辑分区
物理扩展块PE(Physical Extent)VG 中的最小分配单元

第一层:物理存储层(最底层)

对应图中:磁盘 / 分区

  • 本质:服务器上真实存在的硬件,就是你插在机器里的一块块硬盘,或者一块硬盘上划分出来的多个分区。
  • 特点:每个硬盘 / 分区都是独立的 “孤岛”,容量从出厂就固定了,互相之间不能借用空间。
  • 传统痛点:如果 1TB 的硬盘装满了,哪怕旁边 2TB 的硬盘还剩 1.5TB 空着,你也没法把数据存过去,只能手动迁移。

举例:你有一台服务器,插了 3 块空硬盘,分别是 1TB、2TB、3TB。在传统模式下,它们就是 3 个独立的水桶,各自装各自的水,互不连通。


第二层:PV(物理卷)

对应图中:PV1-PV5

  • 本质:LVM 对物理硬盘的第一步标准化改造
  • 核心动作:LVM 会把每一块物理硬盘,都切分成无数个大小完全相等的最小存储单元(叫做 PE,物理扩展块,默认大小是 4MB)。
  • 作用:改造之后,硬盘就不再是一个完整的 “水桶” 了,变成了一堆可以自由移动、自由组合的 “小水滴”。所有硬盘都被统一成了相同的基本单位,为后续的整合打下基础。

举例

  • 1TB 的硬盘会被切成约 26 万个 4MB 的小水滴
  • 2TB 的硬盘会被切成约 52 万个 4MB 的小水滴
  • 3TB 的硬盘会被切成约 78 万个 4MB 的小水滴

现在这 3 块硬盘,已经变成了三堆一模一样的小水滴,再也没有 “1TB 硬盘” 和 “2TB 硬盘” 的区别了。


第三层:VG(卷组)

对应图中:中间的大 VG 层

  • 本质:LVM 的核心存储资源池,也是整个架构最精妙的设计。


  • 核心动作:把所有 PV 里的 “小水滴”,全部倒进同一个大池子里,完全混合在一起。


  • 核心特点:

    1. 这个池子的总容量,就是所有加入进来的物理硬盘的容量总和
    2. 你可以随时把新的硬盘改造成 PV,然后倒进这个池子里,池子的总容量会立刻变大
    3. 你也可以把某个旧硬盘里的所有小水滴,全部移到其他硬盘上,然后把旧硬盘拿走,池子的总容量会相应变小
    4. 池子里的所有小水滴都是完全等价的,再也分不清哪个水滴来自原来的哪块硬盘

举例:把刚才 3 块硬盘的小水滴全部倒进一个池子,你就得到了一个总容量 6TB的统一存储池,里面一共有约 157 万个小水滴可以自由分配。


第四层:LV(逻辑卷)

对应图中:最上层的 LV1-LVn

  • 本质:从 VG 这个大池子里,按需舀出来的一瓢水,也就是用户最终实际使用的 “逻辑硬盘”。


  • 核心特点:

    1. 你可以创建任意多个 LV,每个 LV 的大小可以是任意的(只要不超过池子的总容量)
    2. LV 可以像普通硬盘分区一样使用,你可以格式化它、在上面创建文件夹、存放任何数据
    3. 最关键的优势:LV 的大小可以随时动态调整,完全不用停机,也不会影响上面已经存有的数据
      • 如果 LV 快满了,你只需要从池子里再舀一些小水滴加进去,它就立刻变大了
      • 如果 LV 太大用不完,你也可以把多余的小水滴倒回池子里,它就立刻变小了

一、创建 LVM

环境准备:准备物理磁盘

[root@localhost ~]# ll  /dev/sd*
brw-rw----. 1 root disk 8, 32 5月  15 14:12 /dev/sdc
brw-rw----. 1 root disk 8, 48 5月  15 14:12 /dev/sdd
brw-rw----. 1 root disk 8, 64 5月  15 14:12 /dev/sde

步骤 1:创建物理卷(PV)

将物理磁盘转换成物理卷:

[root@localhost ~]# pvcreate /dev/sdc
  Physical volume "/dev/sdc" successfully created.

查看 PV 信息的三种方式:

# 方式一:简要扫描
[root@localhost ~]# pvscan 
  PV /dev/sda2   VG centos          lvm2 [<19.00 GiB / 0    free]
  PV /dev/sdc                       lvm2 [20.00 GiB]
  Total: 2 [<39.00 GiB] / in use: 1 [<19.00 GiB] / in no VG: 1 [20.00 GiB]

# 方式二:摘要信息
[root@localhost ~]# pvs
  PV         VG     Fmt  Attr PSize   PFree 
  /dev/sda2  centos lvm2 a--  <19.00g     0 
  /dev/sdc          lvm2 ---   20.00g 20.00g

# 方式三:详细信息
[root@localhost ~]# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               centos
  PV Size               <19.00 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              4863
  Free PE               0
  Allocated PE          4863
  PV UUID               EhMPvf-eM0X-lNwi-GaU7-Jsrg-tCqA-8FzTl9
   
  "/dev/sdc" is a new physical volume of "20.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdc
  VG Name               
  PV Size               20.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               V5CPYe-osIK-Emf4-nT7a-Q9oH-xA2K-cLGDgE

步骤 2:创建卷组(VG)

[root@localhost ~]# vgcreate vg1 /dev/sdc
  Volume group "vg1" successfully created

查看 VG 信息:

# 方式一:摘要信息
  [root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree  
  centos   1   2   0 wz--n- <19.00g      0 
  vg1      1   0   0 wz--n- <20.00g <20.00g
  
# 方式二:扫描卷组
[root@localhost ~]# vgscan 
  Reading volume groups from cache.
  Found volume group "vg1" using metadata type lvm2
  Found volume group "centos" using metadata type lvm2

# 方式三:详细信息
[root@localhost ~]# vgdisplay
  --- Volume group ---
  VG Name               vg1
  System ID             
  Format                lvm2
  Metadata Areas        1
  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                1
  Act PV                1
  VG Size               <20.00 GiB     # 重点观察:卷组总大小
  PE Size               4.00 MiB         # 重点观察:物理扩展块大小
  Total PE              5119           # 重点观察:总 PE 数量
  Alloc PE / Size       0 / 0   
  Free  PE / Size       5119 / <20.00 GiB
  VG UUID               SvUbjH-WGtq-49ZK-RmwO-jsep-1r8n-QKowhE

步骤 3:创建逻辑卷(LV)

[root@localhost ~]# lvcreate   -L 200M   -n lv1  vg1 
  Logical volume "lv1" created.
参数说明
-L指定大小(单位 M 或 G)
-n指定逻辑卷名称
vg1从哪个卷组中划分

查看 LV 信息:

[root@localhost ~]# lvscan
  ACTIVE            '/dev/vg1/lv1' [200.00 MiB] inherit
  ACTIVE            '/dev/centos/swap' [2.00 GiB] inherit
  ACTIVE            '/dev/centos/root' [<17.00 GiB] inherit
  
  # 其他查看方式与之前类似   lvs  ,   lvdisplay

步骤 4:创建文件系统并挂载

# 创建文件系统
[root@localhost ~]# mkfs.ext4  /dev/vg1/lv1 
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=1024 (log=0)
分块大小=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
51200 inodes, 204800 blocks
10240 blocks (5.00%) reserved for the super user
第一个数据块=1
Maximum filesystem blocks=33816576
25 block groups
8192 blocks per group, 8192 fragments per group
2048 inodes per group
Superblock backups stored on blocks: 
    8193, 24577, 40961, 57345, 73729

Allocating group tables: 完成                            
正在写入inode表: 完成                            
Creating journal (4096 blocks): 完成
Writing superblocks and filesystem accounting information: 完成 

# 创建挂载点
[root@localhost ~]# mkdir   /mnt/lv1
# 挂载
[root@localhost ~]# mount  /dev/vg1/lv1   /mnt/lv1

查看挂载结果:

[root@localhost ~]# df  -hT
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/sdb2               ext4      3.9G  3.8G     0  100% /mnt/disk2
/dev/mapper/vg1-lv1     ext4      190M  1.6M  175M    1% /mnt/lv1

逻辑卷管理完毕!现在可以向挂载点 /mnt/lv1 正常写入数据了。


二、VG 管理(扩大卷组)

场景:将 VG 容量从 20G 扩容到 40G

步骤 1:创建新的 PV

[root@localhost ~]# pvcreate   /dev/sdd
  Physical volume "/dev/sdd" successfully created.

步骤 2:扩展 VG

[root@localhost ~]# vgextend   vg1  /dev/sdd
  Volume group "vg1" successfully extended

查看扩容后的 VG:

[root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree  
  centos   1   2   0 wz--n- <19.00g      0 
  vg1      2   1   0 wz--n-  39.99g <39.80g

卷组从 1 块磁盘扩展为 2 块,总容量增加。


三、LV 扩容(扩大逻辑卷)

步骤 1:扩容 LV

首先查看 VG 是否有剩余空间:

[root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree  
  centos   1   2   0 wz--n- <19.00g      0 
  vg1      2   1   0 wz--n-  39.99g <39.80g

确认有空闲空间后,扩容 LV:

[root@localhost ~]# lvextend -L +15G /dev/vg1/lv1
  Size of logical volume vg1/lv1 changed from 200.00 MiB (50 extents) to <15.20 GiB (3890 extents).
  Logical volume vg1/lv1 successfully resized.

-L +15G 表示增加 15G。如果是 -L 500M 则表示扩容 500M空间。

步骤 2:扩容文件系统(FS)

扩容 LV 后,还需要让文件系统识别新增的空间。

先观察扩容前的容量:

[root@localhost ~]# df -hT /dev/vg1/lv1
文件系统            类型  容量  已用  可用 已用% 挂载点
/dev/mapper/vg1-lv1 ext4  190M  1.6M  175M    1% /mnt/lv1
[root@localhost ~]# 

执行文件系统扩容:

[root@localhost ~]# resize2fs /dev/vg1/lv1
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/vg1/lv1 is mounted on /mnt/lv1; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 122
The filesystem on /dev/vg1/lv1 is now 15933440 blocks long.

再次查看,大小已改变:

[root@localhost ~]# df -hT /dev/vg1/lv1
文件系统            类型  容量  已用  可用 已用% 挂载点
/dev/mapper/vg1-lv1 ext4   15G  2.1M   15G    1% /mnt/lv1
[root@localhost ~]# 

注意

  • ext4 文件系统使用 resize2fs 命令
  • xfs 文件系统使用 xfs_growfs 命令
  • XFS 文件系统只能扩容,不能缩容

四、LVM 命令汇总

操作PV 命令VG 命令LV 命令
创建pvcreatevgcreatelvcreate
查看pvs / pvscan / pvdisplayvgs / vgscan / vgdisplaylvs / lvscan / lvdisplay
扩容vgextendlvextend
缩容vgreducelvreduce
删除pvremovevgremovelvremove


交换分区管理 Swap

简介

Swap(交换分区)的作用:当物理内存不足时,将部分不常用的数据从内存转移到硬盘上的 Swap 空间,从而”提升”可用内存容量,防止系统发生 OOM(Out Of Memory)

Swap(交换分区)的核心作用

Swap 是 Linux 系统在磁盘上划分的一块特殊空间(可以是分区也可以是文件),本质是**物理内存的 “磁盘备份与安全垫”**。它的核心作用不是 “扩展内存”,而是保障系统稳定运行和优化内存使用效率。

三大核心作用

  1. 防止系统因内存耗尽崩溃(最主要作用)


    当物理内存被占满时,系统不会直接杀死进程(OOM)或死机,而是会把长时间不活跃、闲置的进程数据从内存 “换出” 到 Swap,腾出宝贵的物理内存给正在运行的重要程序。


    这是生产服务器必须保留 Swap 的核心原因:它能在突发流量高峰或内存泄漏时,给你留出处理问题的时间。


  2. 支持系统休眠功能


    系统休眠(Suspend to Disk)的原理就是把当前物理内存中的所有数据完整写入 Swap,然后关机。下次开机时,系统会直接从 Swap 把数据读回内存,瞬间恢复到休眠前的状态。


    ⚠️ 注意:如果需要使用休眠功能,Swap 大小必须大于等于物理内存大小


  3. 优化系统整体内存效率


    Linux 内核会主动将一些长期闲置的进程(比如后台挂了几天的终端、很少访问的服务)换出到 Swap,把物理内存留给更需要的磁盘缓存和活跃进程,从而提升系统的整体响应速度。


现代系统中 Swap 的角色变化

  • 十几年前内存昂贵且容量小(几百 MB):Swap 是主要的内存扩展手段
  • 现在内存动辄几十 GB:Swap 已经从 “内存扩展” 变成了 **”安全垫” 和 “辅助优化工具”**。
  • 误区纠正:Swap 被使用≠内存不足。系统主动换出闲置进程是正常的优化行为,只有当 Swap 被大量、频繁使用(使用率 > 50% 且系统明显卡顿),才说明真的内存不够用了。

Swap 大小推荐值

场景推荐大小
内存 4GB ~ 16GB至少 4GB Swap
内存 16GB ~ 64GB至少 8GB Swap
内存 64GB ~ 256GB至少 16GB Swap

一、查看当前 Swap 状态

[root@localhost ~]# free   -m
              total        used        free      shared  buff/cache   available
Mem:            972         381          80          14         510         375
Swap:          2047           0        2047
字段说明通俗解释
total总大小(单位:MB)系统总共拥有的物理内存 / 交换分区容量
used已使用大小已经被程序实际占用的内存,不包括缓存和缓冲区
free空闲大小完全没有被使用的内存,是真正 “空着” 的内存
shared共享内存大小多个进程之间可以共享使用的内存,主要用于进程间通信
buff/cache缓冲区 + 缓存大小系统为了提高性能而使用的内存,用来缓存磁盘数据和文件系统元数据
available可用内存大小系统真正可以分配给新程序的内存总量,是最有参考价值的指标

二、增加 Swap 分区

步骤 1:准备分区

以将 /dev/sde 磁盘划分为 1GB 分区为例:

[root@localhost ~]# fdisk /dev/sde

分区过程(略)

这里划分了两个主分区,sde1(1G)和sde2(剩余所有空间),这里把sde1设为swap分区

可选操作:划分分区后,将分区类型设置为 82(Linux Swap)

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

磁盘 /dev/sde:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xdf003306

   设备 Boot      Start         End      Blocks   Id  System
/dev/sde1            2048     2099199     1048576    0  Empty
/dev/sde2         2099200    41943039    19921920   83  Linux

命令(输入 m 获取帮助):t
分区号 (1,2,默认 2):1
Hex 代码(输入 L 列出所有代码):82
已将分区“Empty”的类型更改为“Linux swap / Solaris”

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

磁盘 /dev/sde:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xdf003306

   设备 Boot      Start         End      Blocks   Id  System
/dev/sde1            2048     2099199     1048576   82  Linux swap / Solaris
/dev/sde2         2099200    41943039    19921920   83  Linux


命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。

刷新分区表:

[root@localhost ~]# partprobe /dev/sde
[root@localhost ~]# ll  /dev/sde*
brw-rw----. 1 root disk 8, 64 5月  15 15:48 /dev/sde
brw-rw----. 1 root disk 8, 65 5月  15 15:48 /dev/sde1
brw-rw----. 1 root disk 8, 66 5月  15 15:48 /dev/sde2
[root@localhost ~]# 

步骤 2:格式化为 Swap

[root@localhost ~]# mkswap /dev/sde1
正在设置交换空间版本 1,大小 = 1048572 KiB
无标签,UUID=d58082bb-f4d3-4ab3-a5f1-c7fc25e32041

步骤 3:挂载启用 Swap

[root@localhost ~]# swapon /dev/sde1

步骤 4:验证

[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:            972         423          70          14         478         319
Swap:          3071           0        3071

Swap 从 2047MB 增加到 3071MB,增加了约 1GB!

永久生效

将 Swap 写入 /etc/fstab 实现开机自动启用:

/dev/sde1  swap  swap  defaults  0  0

补充:使用文件创建 Swap(无需额外分区)

如果磁盘没有空闲空间创建新分区,可以用文件代替:

# 1. 创建 1GB 的空文件
[root@localhost ~]# dd if=/dev/zero of=/swapfile bs=1M count=1024

# 2. 设置权限
[root@localhost ~]# chmod 600 /swapfile

# 3. 格式化为 Swap
[root@localhost ~]# mkswap /swapfile

# 4. 启用 Swap
[root@localhost ~]# swapon /swapfile

# 5. 永久生效
[root@localhost ~]# echo '/swapfile swap swap defaults 0 0' >> /etc/fstab

常见问题

Q1:mount -a 报语法错误怎么办?

/etc/fstab 格式非常严格,字段之间用空格或制表符分隔。检查:

  • 文件系统类型是否正确(ext4、xfs 等)
  • 设备路径是否正确
  • 不要有多余的字符

Q2:如何查看磁盘的 UUID?

[root@localhost ~]# blkid
/dev/sr0: UUID="2018-11-25-23-54-16-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos" 
/dev/sda1: UUID="da4c4904-e35a-4183-bcae-1401931f0eb0" TYPE="xfs" 
/dev/sda2: UUID="EhMPvf-eM0X-lNwi-GaU7-Jsrg-tCqA-8FzTl9" TYPE="LVM2_member" 
/dev/sdb1: UUID="9de06345-873e-4284-a2ac-ad1f6466f659" TYPE="ext4" 
/dev/sdb2: UUID="41b8a9d8-87fd-4c35-8b10-b0fba792fb6e" TYPE="ext4" 
/dev/sdb3: UUID="cf826307-c9e2-4aa7-b7d8-2ddf9ee5d6d7" TYPE="ext4" 
/dev/sdb4: UUID="c73034bf-83bb-46c4-b965-f0dee09ad9f1" TYPE="ext4" 
/dev/sdd: UUID="8COQ1V-wap7-Z8OC-HRyn-PWsL-nAlf-ZNUmhL" TYPE="LVM2_member" 
/dev/sde1: UUID="d58082bb-f4d3-4ab3-a5f1-c7fc25e32041" TYPE="swap" 
/dev/mapper/vg1-lv1: UUID="3bc6e6c1-176a-46e7-9e31-d4acbe2fd6d1" TYPE="ext4" 

在生产环境中,建议使用 UUID 而非设备名(/dev/sdb1)来挂载磁盘,因为设备名可能因硬件变动而改变:

UUID=xxxx-xxxx  /mnt/disk1  ext4  defaults  0  0

Q3:如何安全卸载分区?

# 1. 确保没有进程在使用该分区
[root@localhost ~]# lsof /mnt/disk1

# 2. 卸载
[root@localhost ~]# umount /mnt/disk1

# 3. 如果提示"设备忙",可以强制卸载
[root@localhost ~]# umount -l /mnt/disk1

Q4:LV 扩容后忘记执行 resize2fs 会怎样?

LV 的底层空间会增大,但文件系统不知道底层变化,df 显示的大小不会改变。务必在 lvextend 后执行文件系统扩容命令。

快捷方式:可以直接使用 lvextend -r 参数,自动完成文件系统扩容:

[root@localhost ~]# lvextend -r -L +200M /dev/vg1/lv1

最佳实践

  1. 分区前先规划好大小

    • 使用 fdisk -l 确认磁盘总容量
    • 根据业务需求合理划分分区
  2. LVM 是生产环境首选

    • LVM 提供灵活的扩容和缩容能力
    • 建议所有数据盘都使用 LVM 管理
  3. 永久挂载使用 UUID

    • 设备名 /dev/sdb1 可能变化
    • UUID 是唯一标识,更可靠
  4. 修改 fstab 前先测试

    • 先用 mount -a 测试 fstab 是否正确
    • 错误的 fstab 配置可能导致系统无法启动
  5. 合理配置 Swap

    • 内存充足时 Swap 使用率应接近 0
    • 可以通过 vm.swappiness 调整系统使用 Swap 的倾向:
      # 查看当前值(默认 30)
      cat /proc/sys/vm/swappiness
      # 临时修改
      sysctl vm.swappiness=10
      # 永久修改
      echo 'vm.swappiness=10' >> /etc/sysctl.conf


总结

通过本章节的学习,你应该掌握了:

  • 理解磁盘的物理结构(盘面、磁道、扇区、柱面)
  • 掌握 MBR 和 GPT 两种分区方式的区别
  • 使用 fdisk 创建和管理分区(主分区、扩展分区、逻辑分区)
  • 使用 mkfs 格式化分区创建文件系统
  • 使用 mount 挂载分区到目录
  • 通过 /etc/fstab 实现永久挂载
  • 使用 LVM 管理逻辑卷(PV → VG → LV)
  • 灵活扩容 VG 和 LV
  • 创建和管理 Swap 交换分区

学习建议:存储管理是 Linux 运维的基石。建议在虚拟机中添加多块磁盘,反复练习分区、LVM 创建、扩容等操作流程。实际操作一遍,胜过阅读十遍文档!


🙋 学习路上不孤单,有坑一起填!



卡在参数调试、命令打架、功能没反应、资源失效?其他问题?直接戳我,也可以进群和同好交流!



📱 个人QQ:3838586495    👥 交流Q群:1094091455    📮 邮箱:leyan2504@163.com



内容帮你省了大把踩坑时间?可以文末小小打赏鼓励一波,也欢迎安利给身边学习的朋友~



✨ 欢迎来评论区「交作业」:分享你的配置思路、提出疑难问题;评论区正确填写邮箱,不错过任何人的解答回复!


暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇