linux 存储管理

1. 磁盘设备的命名规则

  • SATA/SAS/USB 硬盘
    • 命名格式:/dev/sd[a-z]
    • 示例:
      • 第一块磁盘:/dev/sda
      • 第二块磁盘:/dev/sdb
      • 第三块磁盘:/dev/sdc
  • NVMe SSD
    • 命名格式:/dev/nvme[0-9]n[1-9]
    • 示例:
      • 第一个 NVMe 控制器下的第一个命名空间:/dev/nvme0n1
      • 第二个 NVMe 控制器的第一个命名空间:/dev/nvme1n1

2. 磁盘分区详解

在 Linux 系统中有 MBR(Master Boot Record) 和 GPT(GUID Partition Table)两种主流的磁盘分区表格式。

  • MBR 分区最大支持 2TB 容量,在容量方面存在着极大的瓶颈。并且只支持创建最多4个主分区(或 3 主 + 1 扩展 + 逻辑分区)。
    • 主分区:能够直接格式化并存储数据或安装操作系统,操作系统通常需要安装到主分区才能启动。
    • 扩展分区:本身不能直接存储数据,仅用于容纳逻辑分区。每块磁盘最多 1 个扩展分区(占用 1 个主分区名额,即最多 3 主 + 1 扩展),突破 MBR 的 4 分区限制,允许创建更多逻辑分区。
    • 逻辑分区:实际存储数据的分区,依赖扩展分区存在,理论上无上限(受磁盘空间和系统限制,通常最多 64 个)。
  • GPT 分区最大支持 8ZB(理论值,实际受操作系统限制)容量,支持创建128 个主分区(可调整更多)。这是一个正逐渐取代 MBR 的新标准,需 UEFI 支持。

2.1. 分区管理工具

查看现有分区

lsblk                         # 树形显示磁盘和分区
sudo fdisk -l /dev/sda        # 查看详细分区表
sudo parted /dev/sda print    # 显示分区信息(含文件系统)
Bash

MRB 分区管理工具 fdisk

fdisk 参数详解:

fdisk /dev/sdb
Command (m for help): m    # 输入m列出常用的命令
 
Command action
a toggle a bootable flag    # 切换分区启动标记
 
b edit bsd disklabel    # 编辑sda磁盘标签
 
c toggle the dos compatibility flag    # 切换dos兼容模式
 
d delete a partition    # 删除分区
 
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     # 创建新的Sun磁盘标签
 
t change a partitions system id    # 修改分区ID,可以通过l查看id
u change display/entry units     # 修改容量单位,磁柱或扇区
 
v verify the partition table     # 检验分区表
 
w write table to disk and exit     # 保存退出
 
x extra functionality (experts only)     # 拓展功能


# 常用参数为 n、p、d、w
# 删除一个已有的分区,保存退出后需要执行partprobe命令刷新一下分区表
Bash

创建分区示例:

[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

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

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

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

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

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

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux

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

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

重复上述步骤,再创建3个主分区:

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

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

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux
/dev/sdb2         2099200     4196351     1048576   83  Linux
/dev/sdb3         4196352     6293503     1048576   83  Linux
/dev/sdb4         6293504     8390655     1048576   83  Linux
Bash

此时磁盘还有剩余空间但不能创建新分区:

[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

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


命令(输入 m 获取帮助):n
If you want to create more than four partitions, you must replace a
primary partition with an extended partition first.

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

删除主分区4,创建一个扩展分区:

命令(输入 m 获取帮助):d
分区号 (1-4,默认 4):
分区 4 已删除

命令(输入 m 获取帮助):n
Partition type:
   p   primary (3 primary, 0 extended, 1 free)
   e   extended
Select (default e): 
Using default response e
已选择分区 4
起始 扇区 (6293504-20971519,默认为 6293504):
将使用默认值 6293504
Last 扇区, +扇区 or +size{K,M,G} (6293504-20971519,默认为 20971519):+7G
值超出范围。
Last 扇区, +扇区 or +size{K,M,G} (6293504-20971519,默认为 20971519):
将使用默认值 20971519
分区 4 已设置为 Extended 类型,大小设为 7 GiB

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

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

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux
/dev/sdb2         2099200     4196351     1048576   83  Linux
/dev/sdb3         4196352     6293503     1048576   83  Linux
/dev/sdb4         6293504    20971519     7339008    5  Extended

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

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

创建一个逻辑分区:

[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

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


命令(输入 m 获取帮助):n
All primary partitions are in use
添加逻辑分区 5
起始 扇区 (6295552-20971519,默认为 6295552):
将使用默认值 6295552
Last 扇区, +扇区 or +size{K,M,G} (6295552-20971519,默认为 20971519):+2G
分区 5 已设置为 Linux 类型,大小设为 2 GiB

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

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

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux
/dev/sdb2         2099200     4196351     1048576   83  Linux
/dev/sdb3         4196352     6293503     1048576   83  Linux
/dev/sdb4         6293504    20971519     7339008    5  Extended
/dev/sdb5         6295552    10489855     2097152   83  Linux

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

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

GPT 分区管理工具 gdisk

gdisk 参数详解:

# 需要安装命令
[root@localhost ~]# yum install gdisk -y
 
[root@localhost ~]# gdisk /dev/sdb
...
Command (? for help): m
b    back up GPT data to a file                          # 将GPT数据备份到文件中

c    change a partitions name                            # 更改分区的名称
 
d    delete a partition                                  # 删除分区
 
i    show detailed information on a partition            # 显示分区的详细信息
 
l    list known partition types                          # 列出已知的分区类型
 
n    add a new partition                                 # 添加一个新的分区
 
o    create a new empty GUID partition table (GPT)       # 创建一个新的空GUID分区表(GPT)
p    print the partition table                           # 打印分区表
 
q    quit without saving changes                         # 不保存更改就退出
 
r    recovery and transformation options (experts only)  # 恢复和转换选项(仅限专家使用)
s    sort partitions                                     # 对分区表进行排序
 
t    change a partitions type code                       # 更改分区类型代码
 
v    verify disk                                         # 验证磁盘
 
w    write table to disk and exit                        # 将表写入磁盘并退出
 
x    extra functionality (experts only)                  # 额外功能(仅限专家使用)
?    print this menu                                     # 打印菜单
Bash

创建分区示例:

[root@localhost ~]# gdisk /dev/sdb
...
Command (? for help): n  # 新建
Partition number (1-128, default 1):  # 直接回车,默认分区号为1
First sector (34-5242879966, default = 2048) or {+-}size{KMGTP}: # 直接回车,使用默认的起始位置
Last sector (2048-5242879966, default = 5242879966) or {+-}size{KMGTP}: +1G # 设定1G的空间
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):  # 直接回车用默认8300就好,或者输入L,可以看到一系列文件系统信息,默认的8300编号代表Linux filesystem,用它就好
Changed type of partition to 'Linux filesystem'
 
Command (? for help): p  # 打印查看
......
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         2099199   1024.0 MiB  8300  Linux filesystem
 
Command (? for help): w  # 保存
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
 
Do you want to proceed? (Y/N): y  # 输入y保存
OK; writing new GUID partition table (GPT) to /dev/sdc.
The operation has completed successfully.
Bash

3. 格式化制作文件系统与挂载

在 Linux 系统中,磁盘分区后并不能直接使用,还需要经过 格式化 和 挂载 两个关键步骤才能使分区可用。

格式化制作文件系统:

# 不分区,整个磁盘直接格式化
mkfs.xfs /dev/sdb  # /dev/sdb整体就是一个分区

# 分区后对一个分区格式化
mkfs.xfs /dev/sdb1

# .xfs 为文件系统的类型(如 ext4/xfs/ntfs)
# 查看已挂载的文件系统
df -T
Bash

挂载与卸载示例:

# 挂载
mount /dev/sdb /opt/
 
# 卸载
umount /dev/sdb # 或者 umount /opt
 
# 强制卸载
umount -l /dev/sdb # 或者 umount -l /opt
Bash

配置开机自动挂载:

# 方式一:(适用于红帽系)
# 将挂载命令写入/etc/rc.local文件,并添加可执行权限。

# 文件/etc/rc.local中配置的开机启动项不执行原因可能是链接文件未添加可执行权限
ll /etc/rc.local 
lrwxrwxrwx. 1 root root 13 5   8 2024 /etc/rc.local -> rc.d/rc.local
ll /etc/rc.d/rc.local  
-rw-r--r--. 1 root root 473 1  14 2022 /etc/rc.d/rc.local  # 没有执行权限,需要加上
chmod +x /etc/rc.d/rc.local 

# 方式二:编辑文件/etc/fstab
sed -i '$a /dev/sdb1 /opt xfs defaults 0 0' /etc/fstab 
tail -1 /etc/fstab 
/dev/sdb /opt xfs defaults 0 0
Bash

/etc/fstab 配置文件格式详解:

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

#
# /etc/fstab
# Created by anaconda on Wed May  8 01:38:18 2024
#
# 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=6d557e68-8b18-4ad5-8d38-c1b9e62d5d18 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

# 第一列:/dev/mapper/centos-root 这是挂载的文件系统的设备名称或块信息,除了指定设备文件外,也可以使用UUID、LABEL来指定分区。

# 第二列:/ 指定挂载点的路径,这里是根目录。

# 第三列:xfs 指定文件系统的类型,如 ext3,ext4,xfs 等。

# 第四列:defaults 指定挂载的参数,默认为 defaults。
## 参数含义:
## async/sync:是否同步方式运行,默认async(异步)。
## user/nouser:是否允许普通用户使用 mount 命令挂载,默认 nouser。
## exec/noexec:是否允许可执行文件执行,默认exec。
## suid/nosuid:是否允许存在suid属性的文件,默认suid。
## auto/noauto:执行mount-a时,此文件系统是否被主动挂载,默认auto。
## rw/ro:是否只读或者读写模式进行挂载。默认rw。
## defaults:具有rw,suid,exec,auto,nouser,async等默认参数的设定。

# 第五列:0 控制 dump 工具是否备份该分区。
## 0 表示不备份,1 表示每天备份,2 表示不定期备份。
## 由于 dump 主要适用于 ext2/ext3/ext4 文件系统,现代系统较少使用,通常设为 0。

# 第六列:0 控制系统启动时 fsck 检查文件系统的顺序。
## 0 表示不检查,1 表示优先检查(通常只有根目录设为 1),2+ 按数字顺序检查。
Bash

4. 制作 swap 分区

制作swap分区:

fdisk /dev/sdb  # 新建一个磁盘分区
mkswap /dev/sdb1  # 格式化为swap

# 如果磁盘没有过多的分区可用,也可以通过文件模拟 Swap
dd if=/dev/zero of=/swap_file bs=1M count=200  # 创建一个文件
chmod 0600 /swap_file  # 修改权限

mkswap -f /swap_file  # 将文件格式化为swap,-f 参数表示指定文件
swapon /swap_file
Bash

挂载swap分区:

swapon /dev/sdb1  # 临时挂载

swapoff /dev/sdb1   # 卸载

# 开机自动挂载
blkid | grep /dev/sdb1  # 查看 UUID
/dev/sdb1: UUID="91d30c2d-2b43-40b1-b2b5-6f828c585f97" TYPE="swap" PARTUUID="d3b7649d-54aa-45eb-8bef-dccfe6915413" 

vim /etc/fstab  # 添加挂载信息
UUID="91d30c2d-2b43-40b1-b2b5-6f828c585f97" swap                  swap    defaults        0 0
Bash

查看swap分区:

swapon -s  # 列出所有正在使用的 Swap 分区

free -m  # 查看内存和虚拟内存容量,-m 表示显示单位为兆。
              total        used        free      shared  buff/cache   available
Mem:           3931         178        3568          11         184        3537
Swap:          2047           0        2047
Bash

5. 修复文件系统方式

# 0、如果进入不了操作系统,可以进入单用户模式下操作
 
# 1、首先尝试mount和umount文件系统,以便重放日志,修复文件系统,如果不行,再进行如下操作。
 
# 2、执行xfs_repair -n,只检查不修复:检查文件系统是否损坏,如何损坏会列出将要执行的操作
[root@localhost ~]# xfs_repair -n /dev/sdb2
如果是日志和数据不一致了,xfs 默认会在挂载的时候修复这种不一致,操作系统给出的建议是以读写的方式挂载并自动修复,可以尝试以只读不修复方式挂载文件系统。
[root@localhost ~]# mount -o ro,norecovery /dev/sdb2 /opt
 
# 3、如果上述挂载不成功,可以执行xfs_repair修复文件系统
[root@localhost ~]# xfs_repair /dev/sdb2 
 
# 4、如果还不行,那最后方法只能采用"损失部分数据的修复方法"
根据打印消息,修复失败时:
先执行xfs_repair -L /dev/sdb2(清空日志,会丢失文件)
再执行xfs_repair /dev/sdb2
 
说明:-L是修复xfs文件系统的最后手段,慎重选择,它会清空日志,会丢失用户数据和文件。
备注:在执行xfs_repair操作前,最好使用xfs_metadump工具保存元数据,一旦修复失败,最起码可以恢复到修复之前的状态。
 
# 5、修复完成以后,尝试能不能正常挂载 ,如能,取消挂载,再启动就正常了
Bash

示例:

# 1、准备一个1G的文件系统与数据
[root@localhost ~]# mount /dev/sdb1 /opt/
[root@localhost ~]# echo big_egon > /opt/1.txt
 
# 2、模拟文件系统损坏(注意下述操作在centos7.9可复现,在centos9+中,你单纯的写前500M根本不会对你后面的分区造成数据影响,而如果你dd的数据量很大,大到蔓延到了你的目标分区,你执行xfs_repair会发现分区表都会消失掉,不过也没啥关系,用下一小节我们学习的xfsdump提前做好备份的话,数据都可以恢复回来)
[root@localhost ~]# dd if=/dev/zero of=/dev/sdb bs=500M count=1  # 直接干/dev/sdb而不是sdb1
记录了1+0 的读入
记录了1+0 的写出
524288000字节(524 MB)已复制,1.09433 秒,479 MB/秒
[root@localhost ~]# # 此时看似一切都正常
[root@localhost ~]# cat /opt/1.txt 
big_egon
[root@localhost ~]# echo egon_nb > /opt/2.txt
[root@localhost ~]# cat /opt/2.txt 
egon_nb
[root@localhost ~]# # 但是重新挂载就会失效,即断电后系统重启,重新挂载不成功
 
[root@localhost ~]# umount /opt 
[root@localhost ~]# mount /dev/sdb1 /opt
mount: /dev/sdb1 写保护,将以只读方式挂载
mount: 未知的文件系统类型“(null)
 
# 3、修复
[root@localhost ~]# umount /opt
[root@localhost ~]# xfs_repair /dev/sdb1
Phase 1 - find and verify superblock...
bad primary superblock - bad magic number !!!
。。。。。。
修复失败,无法挂载
[root@localhost ~]# mount /dev/sdb1 /opt/
mount:  /dev/sdb1 挂载到 /opt 失败: 结构需要清理
 
[root@localhost ~]# xfs_repair -L /dev/sdb1  # 强制修复
[root@localhost ~]# mount /dev/sdb1 /opt/
[root@localhost ~]# ls /opt/  # 数据丢失,所以此时修复的意义在于可用,至于数据,你需要自己有备份意识
[root@localhost ~]# 
Bash

如果是ext文件系统,修复需要使用fsck命令:

fsck -f -y /dev/sda1 
 
-y 对所有问题都回答 "yes"
-f 即使文件系统标记为 clean 也强制进行检查
Bash

6. xfs 文件系统备份与恢复

xfsdump 是专为 XFS 文件系统 设计的备份工具,支持 完整备份 和 增量备份,能够保留文件权限、属性、ACL 和扩展属性。它直接读取文件系统结构,适合大规模数据备份。

基本语法:

xfsdump [选项] -f <备份文件> <源路径>

# 常用参数
# -l:注意不是大写字母L而是小写,就是指定level,有0~9共10个等级,默认为0,即完整备份,1-9(增量备份)。
# -L:xfsdump会记录每次备份的session Label,这里可以填写针对此文件系统的简易说明。
# -M:xfsdump可以记录存储Media Label,这里可以填写此媒体的简易说明。
# -f:后面接产生的文件和destination file 。例如/dev/st0设备文件名或其他一般文件文件名
# -I:从/var/lib/xfsdump/inventory 列出目前备份的信息状态。

# 使用限制
# 1.必须用root权限
# 2.只能备份已挂载的文件系统
# 3.只能备份XFS文件系统
# 4.只能用xfsrestore解释
# 5.透过文件系统的UUID来分辨备份档,因此不能备份相同UUID的文件系统
Bash

xfsdump 备份示例:

# 安装
sudo yum install xfsdump -y

# 准备一个分区并制作好xfs文件系统,挂载给测试目录test
cp -r /etc/ /test/  # 添加数据

# 先做全量备份
xfsdump -l 0 -L test_bak -M test_bak -f /test.bak /test  # 注意原路径末尾不要加斜杠
 
# 往 /test 下新增文件,然后增量备份
echo 222 > /test/2.txt
xfsdump -l 1 -L test_bak -M test_bak -f /test.bak1 /test
echo 333 > /test/3.txt
xfsdump -l 2 -L test_bak -M test_bak -f /test.bak2 /test
 
# 注意:上面备份的都是挂载目录/test,对应文件系统/dev/sdb,这个在centos7.9中还可用,但是到了rockylinux9.3中会报错:
xfsdump: version 3.1.12 (dump format 3.0) - type ^C for status and control
xfsdump: ERROR: /mydata/ does not identify a file system
xfsdump: usage: xfsdump [ -a (dump DMF dualstate files as offline) ]
# 解决办法就是把挂载目录/test换成/dev/sdb
# 如:xfsdump -l 0 -L test_bak -M test_bak -f /test.bak /dev/sdb
 
# 查看一下备份文件大小
du -sh /test/
32M	/test/
 
ll -h /test.bak   # 全量备份大小
-rw-r--r--. 1 root root 30M 5  23 19:58 /test.bak
ll -h /test.bak1  # 增量备份大小
-rw-r--r--. 1 root root 22K 5  23 19:58 /test.bak1
ll -h /test.bak2  # 增量备份大小
-rw-r--r--. 1 root root 21K 5  23 20:04 /test.bak2
Bash

xfsdump 恢复示例:

rm -rf /test/*
xfsrestore -f /test.bak /test/  # 先恢复全量
[root@localhost /]# ls /test/
etc

xfsrestore -f /test.bak1 /test/  # 再恢复增量1
[root@localhost ~]# ls /test/
2.txt  etc


xfsrestore -f /test.bak2 /test/  # 再恢复增量2
[root@localhost ~]# ls /test/
2.txt  3.txt  etc
Bash

7. LVM 介绍

LVM 是 Linux 系统下的高级磁盘管理工具,它通过抽象化物理存储设备,提供更灵活的磁盘管理方式,支持动态调整容量、快照、条带化等功能,特别适合需要频繁调整存储的场景(如服务器、数据库)。

7.1. LVM 核心概念

  • 物理卷(PV, Physical Volume)
    • 底层物理存储单元(如硬盘 /dev/sda、分区 /dev/sda1)。
    • 通过 pvcreate 命令将物理设备初始化为 PV。
    • 查看 PV 信息:sudo pvdisplay
  • 卷组(VG, Volume Group)
    • 由多个 PV 组成的存储池,是 LVM 的中间层。
    • 通过 vgcreate 命令创建 VG。
    • 查看 VG 信息:sudo vgdisplay
  • 逻辑卷(LV, Logical Volume)
    • 从 VG 中划分出的逻辑存储单元(类似传统分区,但可动态调整)。
    • 通过 lvcreate 命令创建 LV。
    • 查看 LV 信息:sudo lvdisplay

7.2. LVM 优缺点

  • 优点:
    • 可以在系统运行的状态下动态的扩展文件系统的大小。
    • 文件系统可以跨多个磁盘,因此文件系统大小不会受物理磁盘的限制。
    • 可以增加新的磁盘到LVM的存储池中。
    • 可以以镜像的方式冗余重要的数据到多个物理磁盘。
    • 可以方便的导出整个卷组到另外一台机器。
  • 缺点:
    • 因为加入了额外的操作,存取性能受到影响(基本可以忽略不计)。
    • 当卷组中的一个磁盘损坏时,整个卷组都会受到影响。
      • 解释:LVM如果有一个磁盘损坏,会导致数据部分或全部丢失
      • 解决方案:底层用RAID + 上层LVM = 既有冗余又有动态扩展。
    • 在从卷组中移除一个磁盘的时候必须使用reducevg命令(该命令要求root权限,并且不允许在快照卷组中使用)

7.3. LVM 使用流程

安装:

yum install -y lvm2
Bash

将物理设备初始化为 PV:

# 可以对分区也可以多整个磁盘
pvcreate /dev/sda2  # 对分区初始化为 PV
pvcreate /dev/sdb  # 对整块盘初始化为 PV
 
# 查看pv列表
[root@localhost /]# pvs
  PV         VG     Fmt  Attr PSize   PFree 
  /dev/sda2         lvm2 ---   19.50g 19.50g 
  /dev/sdb          lvm2 ---   10.00g 10.00g

[root@localhost /]# pvscan
  PV /dev/sda2                      lvm2 [19.50 GiB]
  PV /dev/sdb                       lvm2 [10.00 GiB]
  Total: 2 [29.50 GiB] / in use: 0 [0   ] / in no VG: 2 [29.5.00 GiB]
Bash

制作 VG,将 PV 加入 VG:

# 制作一个包含/dev/sdb1与/dev/sdc两个PV的VG
vgcreate centos /dev/sda2 /dev/sdb 
# 也可将一个PV加入已经存在的VG
vgextend centos /dev/sdb

[root@localhost /]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree
  centos   2   0   0 wz--n-  29.49g  29.49g 
Bash

创建逻辑卷 LVM:

# 从 VG 中划分逻辑卷
lvcreate -L 100M -n lv1 centos
lvcreate -L 200M -n lv2 centos
# 选项:
# -L  逻辑卷大小
# -n  逻辑卷名字
 
# 查看
[root@localhost /]# lvs
 
 
# 把vg的100%空间都给lv
lvcreate -l 100%VG -n lv的名字 vg的名字
Bash

格式化与挂载:

# 将制作好的lv格式化
mkfs.xfs /dev/centos/lv1 
mkfs.xfs /dev/centos/lv2 

# 挂载
mount /dev/centos/lv1 /test1/
mount /dev/centos/lv2 /test2/
 
# 查看
[root@localhost /]# df
Bash

动态扩容:

lvextend -L  [+]MGT  /dev/VG_NAME/VL_NAME

# 示例:
lvextend -L +1000M /dev/centos/lv1 
xfs_growfs /dev/centos/lv1  # 扩展逻辑卷后需要更新fs文件系统
Bash

移除 LVM 组件:

# 删除lv之前需要先卸载挂载点
umount /test1
lvremove /dev/centos/lv1 
 
# 删除vg
vgremove centos
 
# 删除pv,只能删掉那些不属于任何vg的pv
pvremove /dev/sdb
Bash

迁移数据(PV 移动):

# 将数据从 /dev/sdb 迁移到 /dev/sdd
sudo pvmove /dev/sdb /dev/sdd
Bash

快照功能:

# 注意点:
# 1、VG中需要预留存放快照本身的空间,不能全部被占满。
# 2、快照所在的 VG 必须与被备份的 LV 相同,否则创建快照会失败。

# 快照的本质就是一个特殊的lv,创建快照后,如果源数据卷中的文件被更新了,会将老数据赋给快照的空间,这就要求快照的lv也要有足够的空间
# 创建快照
sudo lvcreate -s -L 5G -n my_lv_snap /dev/my_vg/my_lv  # -L指快照的大小,一般不超过源的大小。
# 恢复快照
sudo lvconvert --merge /dev/my_vg/my_lv_snap


# 如果只想恢复部分文件,可以将快照挂载到一个目录拷贝需要恢复的文件
# 注意:快照在挂载的时候由于和原来的lvm是同一个UUID,而XFS是不允许相同UUID的文件系统挂载,所以需要加选项 -o nouuid
mount -o nouuid /dev/my_vg/my_lv_snap /opt/

cp /opt/xxx /xxx 
umount /opt
Bash


上一篇
下一篇