深度剖析Linux磁盘分区 | LVM逻辑卷 | VDO卷 | AutoFS存储自动挂载

前言说明

  要注意这些技术和工具在不同Linux发行版中的使用可能会有所不同,需要查看您正在使用的特定发行版的文档和指南,以获取更多详细信息和操作说明。

1. 安装操作系统分区配置

  创建/boot分区(大小50MB):
在这里插入图片描述
 
  /boot/efi分区设置为200MB即可
在这里插入图片描述
 
  Swap交换分区的大小设置为物理内存大小的2倍:
在这里插入图片描述
 
  剩余空间全部留给/分区,当然也可以将根分区设置为50GB或者100GB,然后将剩余空间划分给/home分区和/var分区
在这里插入图片描述

2. 大磁盘分区管理

[root@localhost ~]# fdisk -l

Disk /dev/sda: 8393.0 GB, 8392996290560 bytes, 16392570880 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 262144 bytes / 1048576 bytes

  可以看到/dev/sda的总空间是8T左右,直接进行分区格式化操作:

[root@localhost ~]# fdisk /dev/sda
[root@localhost ~]# mkfs.xfs /dev/sda1
[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                  63G     0   63G   0% /dev
tmpfs                     63G     0   63G   0% /dev/shm
tmpfs                     63G   11M   63G   1% /run
tmpfs                     63G     0   63G   0% /sys/fs/cgroup
/dev/mapper/centos-root   50G  2.0G   49G   4% /
/dev/sdb2               1014M  151M  864M  15% /boot
/dev/sdb1                200M   12M  189M   6% /boot/efi
/dev/mapper/centos-home  838G   34M  838G   1% /home
tmpfs                     13G     0   13G   0% /run/user/0
/dev/sda1                2.0T   34M  2.0T   1% /data

  磁盘空间却只有2T大小。原因是因为fdisk最大只能创建2T分区的盘,超过2T使用parted
  删除上述使用fdisk创建的磁盘分区:

[root@localhost ~]# fdisk /dev/sda
Command (m for help): p
Command (m for help): d
Selected partition 1
Partition 1 is deleted

Command (m for help): w

  接下来使用parted工具进行分区创建:

[root@localhost ~]# parted /dev/sda
GNU Parted 3.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p                                                                
Model: BROADCOM MR9560-16i (scsi)
Disk /dev/sda: 8393GB		# 磁盘空间最大8393GB	
Sector size (logical/physical): 512B/4096B
Partition Table: msdos
Disk Flags: 

Number  Start  End  Size  Type  File system  Flags

(parted) mklabel gpt                                                      
Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? y                                                                 
(parted) mkpart                                                           
Partition name?  []? sda1                                                 
File system type?  [ext2]? ext4                                           
Start? 0                                                                  
End?                                                                      
End? 8393GB                                                               
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? Ignore                                                     
(parted) p                                                                
Model: BROADCOM MR9560-16i (scsi)
Disk /dev/sda: 8393GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name  Flags
 1      17.4kB  8393GB  8393GB               sda1

(parted) quit                                                             
Information: You may need to update /etc/fstab.
[root@localhost ~]# fdisk -l                                              
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.

Disk /dev/sda: 8393.0 GB, 8392996290560 bytes, 16392570880 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 262144 bytes / 1048576 bytes
Disk label type: gpt
Disk identifier: E43B9D7C-0D7E-470D-8BBA-FC6A7238D6C3


#         Start          End    Size  Type            Name
 1           34  16392570846    7.6T  Microsoft basic sda1
[root@localhost ~]# mkfs.ext4 /dev/sda1
[root@localhost ~]# mkdir /data
[root@localhost ~]# mount /dev/sda1 /data
[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                  63G     0   63G   0% /dev
tmpfs                     63G     0   63G   0% /dev/shm
tmpfs                     63G   11M   63G   1% /run
tmpfs                     63G     0   63G   0% /sys/fs/cgroup
/dev/mapper/centos-root   50G  2.0G   49G   4% /
/dev/sdb2               1014M  151M  864M  15% /boot
/dev/sdb1                200M   12M  189M   6% /boot/efi
/dev/mapper/centos-home  838G   34M  838G   1% /home
tmpfs                     13G     0   13G   0% /run/user/0
/dev/sda1                7.6T   93M  7.2T   1% /data

  查看磁盘的UUID:

blkid
/dev/mapper/centos-root: UUID="6daff923-488c-4dd8-80ee-fb5faed8cca9" TYPE="xfs" 
/dev/sdb3: UUID="JW1wdc-hst2-omzt-QegM-XS5a-tShf-OeUu1a" TYPE="LVM2_member" PARTUUID="6d3d61ff-6f12-4537-8abc-e59075d23291" 
/dev/sda1: UUID="bcde2c04-0944-4ec3-9d16-cdfbff7f38ea" TYPE="ext4" PARTLABEL="sda1" PARTUUID="1a4db326-aa94-4c44-99b5-21d96388334a" 
/dev/sdb1: SEC_TYPE="msdos" UUID="B09B-3EEA" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="6f8129b9-3eae-4234-98b8-7cde65820c0c" 
/dev/sdb2: UUID="dc45cf08-fdca-4c5c-9ef5-94396644c548" TYPE="xfs" PARTUUID="54c0bb37-f49e-4f87-aaa3-96201d717bb7" 
/dev/mapper/centos-swap: UUID="1ca6f4e8-c154-4ec0-9200-74bf2d7c8e87" TYPE="swap" 
/dev/mapper/centos-home: UUID="a8c37d6a-51e1-44ec-b506-29614f931ad1" TYPE="xfs" 
[root@localhost ~]# vim /etc/fstab
UUID=bcde2c04-0944-4ec3-9d16-cdfbff7f38ea /data xfs     defaults        0 0 

  测试下磁盘的读写性能:

[root@localhost ~]# dumpe2fs /dev/sda1|grep -i "block Size"
dumpe2fs 1.42.9 (28-Dec-2013)
Block size:               4096

  测试写性能:

[root@localhost ~]# cd /data/
[root@localhost data]# time dd if=/dev/zero of=/testio bs=4k count=100000 oflag=direct oflag=sync
100000+0 records in
100000+0 records out
409600000 bytes (410 MB) copied, 9.6584 s, 42.4 MB/s
real	0m9.732s
user	0m0.103s
sys	0m4.798s


[root@localhost data]# dd if=/dev/zero of=/testio2 bs=4k count=100000 oflag=direct
100000+0 records in
100000+0 records out
409600000 bytes (410 MB) copied, 3.71845 s, 110 MB/s

# 添加oflag=direct将跳过内存缓存,添加oflag=sync将跳过hdd缓存

  测试读性能:

[root@localhost data]# time dd if=/dev/sda1 of=/dev/null bs=4k
^C4775424+0 records in
4775423+0 records out
19560132608 bytes (20 GB) copied, 12.6906 s, 1.5 GB/s

real	0m12.693s
user	0m0.804s
sys	0m10.713s

3. LVM逻辑卷管理

在这里插入图片描述
  LVM(Logical Volume Manager)是Linux系统下的一种管理硬盘分区机制,在磁盘和分区之上建立一个逻辑层,可以灵活、高效地管理磁盘分区,简化了磁盘管理操作。逻辑卷的大小可以动态调整,而且不会丢失现有数据;即使新增了磁盘,也不会改变现有的逻辑卷。

3.1. 创建LVM逻辑卷

在这里插入图片描述

3.1.1. 创建物理卷PV

yum install -y lvm2

  查看主机上的所有硬盘:

lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0   2.2T  0 disk 
sdb      8:16   0 893.1G  0 disk 
├─sdb1   8:17   0   190M  0 part /boot/efi
├─sdb2   8:18   0   976M  0 part /boot
├─sdb3   8:19   0   128G  0 part [SWAP]
└─sdb4   8:20   0   764G  0 part /
sdc      8:32   0   1.1T  0 disk 
sdd      8:48   0   1.1T  0 disk 
sde      8:64   0   2.2T  0 disk 

  选择使用sda和sde创建物理卷,多个设备之间用空格间隔:

pvcreate /dev/sda /dev/sde

3.1.2. 创建卷组VG

vgcreate <卷组名称> <物理卷名称> …… <物理卷名称>

  例如创建vg_01卷组,并添加/dev/sda、/dev/sde这2块物理卷:

vgcreate vg_01 /dev/sda /dev/sde

  如果需要在卷组中添加新的物理卷,运行以下命令添加其他已创建的物理卷:

vgextend <卷组名称> <物理卷名称> …… <物理卷名称>

  查看卷组信息:

vgs
  VG    #PV #LV #SN Attr   VSize VFree
  vg_01   2   0   0 wz--n- 4.36t 4.36t

3.1.3. 创建逻辑卷LV

  创建逻辑卷:

lvcreate -L <逻辑卷大小> -n <逻辑卷名称> <卷组名称>

# 逻辑卷大小:逻辑卷的大小应小于卷组剩余可用空间。
# 逻辑卷名称:由您自定义,例如lv01。
# 卷组名称:创建卷组已经创建的卷组的名称,例如vg_01
lvcreate -L 10g -n lv01 vg_01

3.1.4. 创建并挂载文件系统

  获取逻辑卷路径、名称、所属卷组等信息,后续操作步骤需使用

lvdisplay
  --- Logical volume ---
  LV Path                /dev/vg_01/lv01
  LV Name                lv01
  VG Name                vg_01
  LV UUID                4fx5f3-BA2H-yCcE-2mys-p0FW-umQS-0ur97v
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2023-07-13 23:25:53 -0400
  LV Status              available
  # open                 0
  LV Size                10.00 GiB
  Current LE             2560
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

# LV Path:逻辑卷路径,例如/dev/vg_01/lv01
# LV Name:逻辑卷的名称,例如lv01
# VG Name:逻辑卷所属的卷组名称,例如vg_01
# LV Size:逻辑卷的大小,图示信息为10 GiB

  在逻辑卷上创建文件系统:

mkfs.<文件系统格式> <逻辑卷路径>

  以逻辑卷路径为/dev/vg_01/lv01、文件系统为ext4为例进行格式化:

mkfs.ext4 /dev/vg_01/lv01

  创建新挂载点,例如/media/lv01,并将文件系统挂载至挂载点:

mkdir /media/lv01
mount /dev/vg_01/lv01 /media/lv01

  查看逻辑卷的挂载结果:

df -h
Filesystem              Size  Used Avail Use% Mounted on
......
/dev/mapper/vg_01-lv01  9.8G   37M  9.2G   1% /media/lv01

3.1.5. 配置开机自动挂载

  如果需要设置开机自动挂载逻辑卷,需要在/etc/fstab中添加该逻辑卷的挂载信息,实现系统开机重启时自动挂载该逻辑卷。
运行以下命令备份etc/fstab文件

cp /etc/fstab  /etc/fstab.bak

  在/etc/fstab文件中添加目标逻辑卷的挂载信息:

echo `blkid <逻辑卷路径> | awk '{print $2}' | sed 's/\"//g'` <逻辑卷挂载点> <逻辑卷的文件系统类型> defaults 0 0 >> /etc/fstab

  在开机重启时自动将逻辑卷(路径为/dev/vg_01/lv01)挂载至/media/lv01目录下,文件系统类型为ext4:

echo `blkid /dev/vg_01/lv01 | awk '{print $2}' | sed 's/\"//g'` /media/lv01 ext4 defaults 0 0 >> /etc/fstab

  查询逻辑卷的挂载信息是否添加成功:

cat /etc/fstab
......
UUID=2b1a3a54-2ab8-48f4-a321-3d5bfed63482 /media/lv01 ext4 defaults 0 0

  验证自动挂载功能是否生效
  重新挂载/etc/fstab配置的文件系统。如果无报错输出,说明逻辑卷已经成功挂载到指定的挂载点

mount -a

3.2. 逻辑卷的扩缩容

  扩容逻辑卷:
  通过LVM(Logical Volume Manager)扩容一个逻辑卷LV(Logical Volume)
  使用其他物理磁盘创建物理卷:

pvcreate <云盘设备名称>
pvcreate /dev/sdc

  查看卷组信息,运行以下命令,扩容卷组:

vgs
  VG    #PV #LV #SN Attr   VSize VFree
  vg_01   2   1   0 wz--n- 4.36t 4.35t
vgextend <卷组名称> <物理卷名称>

  将物理卷/dev/sdc添加至卷组vg_01中:

vgextend vg_01 /dev/sdc

  查看卷组信息:

vgs
  VG    #PV #LV #SN Attr   VSize VFree
  vg_01   3   1   0 wz--n- 5.45t 5.44t

  扩容逻辑卷和文件系统:
  获取逻辑卷路径、名称、所属卷组等信息,后续操作步骤需使用

lvdisplay
  --- Logical volume ---
  LV Path                /dev/vg_01/lv01
  LV Name                lv01
  VG Name                vg_01
  LV UUID                4fx5f3-BA2H-yCcE-2mys-p0FW-umQS-0ur97v
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2023-07-13 23:25:53 -0400
  LV Status              available
  # open                 1
  LV Size                10.00 GiB
  Current LE             2560
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

  扩容逻辑卷:

lvextend -L </减逻辑卷容量> <逻辑卷路径>

  为逻辑卷(路径为/dev/vg_01/lv01)新增5GiB容量:

lvextend -L +5G /dev/vg_01/lv01

或者:
lvextend -L 15G /dev/vg_01/lv01

  扩容逻辑卷文件系统:

resize2fs <逻辑卷路径>

  以扩容逻辑卷lv01(路径为/dev/vg_01/lv01)为例:

resize2fs /dev/vg_01/lv01
df -h
Filesystem              Size  Used Avail Use% Mounted on
......
/dev/mapper/vg_01-lv01   15G   41M   14G   1% /media/lv01

  缩减逻辑卷:
  先卸载逻辑卷/dev/mapper/vg_01-lv01

umount /media/lv01
umount: /media/lv01: target is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))
fuser -m /media/lv01
/media/lv01:          9141c

ps -ef | grep 9141
root      9141  9137  0 Jul13 pts/2    00:00:00 -bash
root     39546 39449  0 02:18 pts/0    00:00:00 grep --color=auto 9141

kill -9 9141
umount /media/lv01

  通过e2fsck命令检测逻辑卷上空余的空间:

e2fsck -f /dev/mapper/vg_01-lv01
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/mapper/vg_01-lv01: 12/983040 files (0.0% non-contiguous), 104724/3932160 blocks

  使用resize2fs将文件系统减少到3G

resize2fs /dev/mapper/vg_01-lv01 3G
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/mapper/vg_01-lv01 to 786432 (4k) blocks.
The filesystem on /dev/mapper/vg_01-lv01 is now 786432 blocks long.

  使用lvreduce命令将逻辑卷减少到3G:

lvreduce -L 3G /dev/mapper/vg_01-lv01
  WARNING: Reducing active logical volume to 3.00 GiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg_01/lv01? [y/n]: y
  Size of logical volume vg_01/lv01 changed from 15.00 GiB (3840 extents) to 3.00 GiB (768 extents).
  Logical volume vg_01/lv01 successfully resized.
mount -a
df -h
Filesystem              Size  Used Avail Use% Mounted on
/dev/mapper/vg_01-lv01  2.9G   25M  2.7G   1% /media/lv01

3.3. 卷组缩容

  首先要确定移除的物理卷,将此物理卷上的数据转移至其他的物理卷,然后从卷组中将此物理卷移除

pvmove /dev/sdc
  No data to move for vg_01.

  当 pvmove命令完成后,再次使用 pvs 命令检查物理卷是否有空闲

pvs -o+pv_used
  PV         VG    Fmt  Attr PSize PFree  Used 
  /dev/sda   vg_01 lvm2 a--  2.18t <2.18t 3.00g
  /dev/sdc         lvm2 ---  1.09t  1.09t    0 
  /dev/sde   vg_01 lvm2 a--  2.18t  2.18t    0 

  如果它是空闲的,使用vgreduce命令从卷组中删除物理卷 /dev/sdc

vgreduce vg_01 /dev/sdc
  Removed "/dev/sdc" from volume group "vg_01"

  最后运行pvremove命令从LVM配置中删除磁盘:

pvremove /dev/sdc
  Labels on physical volume "/dev/sdc" successfully wiped.

3.4. 删除逻辑卷、卷组和物理卷

umount /media/lv01 
lvremove /dev/mapper/vg_01-lv01
Do you really want to remove active logical volume vg_01/lv01? [y/n]: y
  Logical volume "lv01" successfully removed

vgremove vg_01
  Volume group "vg_01" successfully removed

lvs # 执行结果为空
vgs	# 执行结果为空
pvs
  PV         VG Fmt  Attr PSize PFree
  /dev/sda      lvm2 ---  2.18t 2.18t
  /dev/sde      lvm2 ---  2.18t 2.18t

pvremove /dev/sda
  Labels on physical volume "/dev/sda" successfully wiped.
pvremove /dev/sde
  Labels on physical volume "/dev/sde" successfully wiped.

4. VDO(虚拟数据优化)卷管理

4.1. VDO简介

  VDO(Virtual Data Optimize)是RHEL8/Centos8上新推出的一个存储相关技术(最早在7.5测试版中开始测试),是Redhat收购的Permabit公司的技术。
  VDO的主要作用是节省磁盘空间,比如让1T的磁盘能装下1.5T的数据,从而降低数据中心的成本。
  VDO的关键实现原理主要是重删和压缩,重删就是硬盘里拷贝来相同的数据,以前要占多份空间,现在只需要1份空间就可以了。类似我们在百度网盘中上传一个大型软件安装包,能实现秒传,其实历史记录就已经存在,所以无需再传一份相同的文件,也无需再占百度一份空间。另一方面是数据压缩,类似于压缩软件的算法,也可以更加节省磁盘空间。
  VDO(Virtual Data Optimizer)是一种存储软件,可用作本地文件系统、iSCSI 或者 Ceph 存储下的添加存储层。VDO以重复数据删除、压缩和精简配置的形式为Linux提供内联数据缩减。当设置VDO卷时,可以指定一个块设备来构建VDO卷以及设置逻辑存储量。
  ● 当为虚拟机或容器使用时,建议按10:1的逻辑与物理比例配置存储:也就是说,如果使用1TB的物理存储,则将其显示为10TB 的逻辑存储。
  ● 对于对象存储,如Ceph提供的类型,建议使用3:1的逻辑与物理比例:1TB的物理存储将显示为3TB的逻辑存储
  在这两种情况下,只需将文件系统放在VDO提供的逻辑设备之上,然后直接使用它,或将其作为分布式云存储架构的一部分。
  由于 VDO是迅速置备的,所以文件系统和应用程序只会看到使用中的逻辑空间,且不知道可用的实际物理空间。使用脚本来监控实际的可用空间,并在使用超过阈值时产生一个报警:例如当VDO卷已满80% 时。

  VDO部署场景:
  KVM:
  可以在配置了直接附加存储的 KVM 服务器上部署VDO
在这里插入图片描述

  文件系统:
  可以在VDO上创建文件系统,并通过NFS服务器或Samba将其公开给NFS或CIFS用户。
在这里插入图片描述
  在iSCSI上放置 VDO:
  可以将整个 VDO 存储目标作为 iSCSI 目标导出到远程 iSCSI 启动器
在这里插入图片描述
  在iSCSI上创建VDO卷时,您可以将VDO卷放在 iSCSI 层之上或之下。
  当将VDO卷放在 iSCSI 层下方的 iSCSI 服务器(目标)上时:
  ● VDO 卷对启动器是透明的,与其他 iSCSI LUN 类似。对客户端隐藏精简配置和节省空间后,更易于监控和维护 LUN 。
  ● 网络流量会减少,因为没有对 VDO 元数据的读或写,并且在网络上不会发生对去除重复建议的读验证。
  ● 在 iSCSI 目标上使用的内存和 CPU 资源可以带来更好的性能。例如,能够托管越来越多的 hypervisor ,因为在 iSCSI 目标上发生了卷减少。
  ● 如果客户端在启动器上实现了加密,且在目标下面有一个 VDO 卷,则不会实现任何空间节省。

  当将 VDO 卷放在 iSCSI 层上面的 iSCSI 客户端(启动器)上时:
  ● 如果要取得较高的空间节省率,则异步模式下的网络流量可能会降低。
  ● 可以直接查看和控制空间节省,并监控使用情况。
  ● 如果要加密数据,例如使用dm-crypt,您可以在加密之上实现 VDO,并充分利用空间效率。

  LVM:
  在下图中,VDO 目标被注册为一个物理卷,这样它可以由 LVM 来管理。从去除重复数据的存储池中创建多个逻辑卷(LV1到 LV4)。这样 VDO 便可支持多协议统一块或者对底层的去除重复数据的存储池的文件进行访问
在这里插入图片描述

4.2. 部署VDO

  安装VDO软件:

yum install lvm2 kmod-kvdo vdo

  创建VDO卷:
  接下来在块设备中创建VDO卷,在以下步骤中将vdo-name替换为要用于VDO卷的标识符,例如vdo1。必须为系统中的每个 VDO实例使用不同的名称和设备。如果使用非持久性设备名称,则如果设备名称改变了,VDO 将来可能无法正常启动。

vdo create \
--name=vdo-name \
--device=block-device \
--vdoLogicalSize=logical-size

# --name后面跟vdo卷的名称,随便写,好认即可
# --device后面跟真实的物理磁盘
# --vdoLogicalSize后面跟vdo卷的容量,这里按真实物理空间的1.5
vdo create \
--name=vdo-name \
--device=/dev/sdc \
--vdoLogicalSize=50G

Creating VDO vdo-name
Starting VDO vdo-name
Starting compression on VDO vdo-name
VDO instance 0 volume is ready at /dev/mapper/vdo-name

如果物理块设备大于 16TiB,请添加 --vdoSlabSize=32G 选项,将卷上的 slab 大小增加到 32GiB

mkfs.xfs /dev/mapper/vdo-name 

  挂载VDO:

mount /dev/mapper/vdo-name /vodvolume/

  启用定期块丢弃:
  可以启用systemd计时器来定期丢弃所有支持的文件系统中未使用的块
  启用并启动systemd计时器:

systemctl enable --now fstrim.timer

  验证计时器的状态:

systemctl status fstrim.timer
● fstrim.timer - Discard unused blocks once a week
   Loaded: loaded (/usr/lib/systemd/system/fstrim.timer; enabled; vendor preset: disabled)
   Active: active (waiting) since Fri 2023-07-14 04:33:38 EDT; 5s ago
     Docs: man:fstrim

Jul 14 04:33:38 localhost.localdomain systemd[1]: Started Discard unused blocks once a week.

  监控VDO:
  使用vdostats工具来获取有关 VDO 卷的信息:

vdostats --human-readable
Device                    Size      Used Available Use% Space saving%
/dev/mapper/vdo-name      1.1T      5.4G      1.1T   0%           99%

  vdostats是用来看真实物理空间的大小,以及剩余空间

4.3. VDO维护

4.3.1. 管理VDO卷的空闲空间

4.3.2. 启动或停止VDO卷

  在系统引导过程中,vdosystemd单元会自动 启动 所有配置为激活的 VDO设备。安装vdo软件包时,默认会安装并启用vdo systemd 单元。此单元会在系统启动时自动运行vdo start --all命令来启动所有激活的 VDO 卷。
  还可以通过在vdo create命令中添加--activate=disabled选项来创建不自动启动的 VDO 卷

  启动顺序:
  有些系统可能会将LVM卷放在VDO卷之上,或VDO卷之下。在这些系统中,需要以正确顺序启动服务:
  ● 必须首先启动 LVM 的下层。在大多数系统中,当安装 LVM 软件包时会自动启动这个层。
  ● 然后,vdo systemd 单元必须启动。
  ● 最后,必须运行其他脚本以启动正在运行的 VDO 卷上的 LVM 卷或其他服务。

  停止卷所需的时间:
  停止 VDO 卷需要根据存储设备速度以及卷需要写入的数据量而有所不同:
  ● 卷总是为每 1GiB UDS 索引写入大约 1GiB。
  ● 卷还写入与块映射缓存大小相等的数据量,再加上每个 slab 最多 8MiB。
  ● 卷必须完成处理所有未完成的 IO 请求。

  要启动给定的 VDO 卷,请使用:

vdo start --name=vdo-name
Starting VDO vdo-name
VDO instance 0 volume is ready at /dev/mapper/vdo-name

  要启动所有VDO 卷,请使用:

vdo start --all

  激活VDO卷(激活VDO卷使其自动启动):
  激活一个特定卷:

vdo activate --name=vdo-name
vdo-name already activated

  激活所有卷:

vdo activate --all
vdo-name already activated

  取消激活一个特定卷:

vdo deactivate --name=vdo-name

  取消激活所有卷:

vdo deactivate --all

4.3.3. 选择VDO写入模式

  sync模式:
  当VDO处于sync模式时,上层认为写入命令写入数据到持久化存储。这样的结果就是对于文件系统或应用不需要处理严重故障点的数据保留,比如出发FLUSH或者force unit access(FUA)请求来保留数据(也就是不需要刷缓存将数据从缓存写到持久存储中,上层认为写入命令直接写到了持久存储,并没有写到缓存中)。当底层存储可以保证写入命令完成时数据一定写入持久化存储,VDO必须设置成sync模式。也就是说,该存储设备没有易失性写高速缓存,或有直写高速缓存。
  async模式:
  当VDO处于async模式时,VDO不保证一个写入命令完成时数据写入持久化存储。文件系统或应用必须在每次交互时触发FLUSH或FUA请求来保证数据在严重故障时被持久存储。如果底层存储不能保证命令完成时数据持久化,VDO必须设置为async模式。也就是存储设备具有易失性写高速缓存。
  auto模式:
  auto模式会根据设备属性自动选择sync模式或async模式

  VDO写入模式的内部处理过程:
  当kvdo内核模块以同步模式运行时:
  ● 首先它将请求的数据临时写入分配的块,然后确认该请求。
  ● 确认完成后,将尝试通过计算块数据的hash签名对块进行重复数据删除,然后将其发送到VDO索引。
  ● 如果VDO索引包含具有相同签名的块,则kvdo读取找到的块并对两个块进行逐字节比较,以验证他们是否相同。
  ● 如果他们确实相同,那么kvdo将更新其块映射,以使逻辑块指向相应的物理块并释放分配的临时物理块
  ● 如果VDO索引不包含要写入的块的签名,或者指向的块实际上不包含相同的数据,则kvdo将更新其块映射以使临时物理块永久化。
  当kvdo内核模块以异步模式运行时:
  ● 它会立即确认该请求,而不是写入数据
  ● 然后它将尝试以与上述相同的方式对数据块进行检查
  ● 如果该块证明是重复块,则kvdo更新其映射并释放分配的块。否则,它将请求中的数据写入分配的块,并更新块映射以使物理块永久化。

  查看 VDO 卷使用的写入模式:

vdo status --name=vdo-name | grep "write policy"
    Configured write policy: auto
        write policy: sync

# 配置的写入策略: 会有sync、async或auto选项
# 写入策略:是VDO应用的特定的写模式,即sync或async

  检查易变的缓存:
  可以通过查看/sys/block/block-device/device/scsi_disk/identifier/cache_type文件检查易失性缓存

cat /sys/block/sda/device/scsi_disk/7:0:0:0/cache_type
write back
cat /sys/block/sdb/device/scsi_disk/1:2:0:0/cache_type
None
cat /sys/block/sdc/device/scsi_disk/0\:3\:109\:0/cache_type 
write through

  ● 设备sda表示它有 一个回写缓存。对其使用async模式
  ● 设备sdb表示 它没有 一个回写缓存。对其使用sync模式

如果 cache_type 的值是None 或 write through,应该将 VDO配置为使用sync写模式

  设置VDO写入模式:
  为VDO卷设置写模式,可以是对现有卷,也可以是在创建新卷时设置

使用不正确的写模式可能会在电源故障、系统崩溃或与磁盘意外失去联系后导致数据丢失

  要修改现有的VDO卷,请使用:

vdo changeWritePolicy --writePolicy=sync|async|async-unsafe|auto \
                        --name=vdo-name

  要在创建VDO卷时指定写模式,请在vdo create命令中添加 --writePolicy=sync|async|async-unsafe|auto 选项

4.3.4. VDO卷恢复与重建

  VDO卷恢复:
  VDO卷的重建操作是自动完成的无需人工干预,VDO会根据当前的写入模式重建不同的写入规则,当VDO卷在异常关机后启动时,VDO会验证卷上的元数据的一致性,如果需要修复会重建一部分元数据。

  sync:
如果 VDO 在同步存储上运行,且写策略被设为sync,则写到卷的所有数据都可以被完全恢复。
  async:
  如果写策略是async的,如果一些写不是持久化的,则它们可能无法被恢复。这可以通过发送VDO FLUSH命令或带有 FUA(强制单元访问)标记的写 I/O 来实现。您可以通过调用fsyncfdatasyncsyncumount 等数据完整性操作来在用户模式下实现这一点。

在任何一种模式下,某些未被确认或未刷新的写也可能被重新构建

  自动和手动恢复:
  当VDO卷进入到recovering操作模式时,VDO会在其重新上线后自动重建不干净的VDO卷。这叫做在线恢复。
  如果VDO无法成功恢复VDO卷,它会将卷置于只读操作模式下,该模式在卷重新启动时仍然有效。您需要强制重新构建来手动解决这个问题。

  VDO运行模式:
  可以通过下面的方式查看VDO卷是否在正常运行或者正在从错误中恢复的模式

vdostats --verbose vdo-name | grep mode
  operating mode                      : normal

  normal:
  这是默认的操作模式。VDO卷始终处于normal模式,除非以下其中一种状态强制使用不同的模式。新创建的 VDO 卷以normal模式启动。
  recovering:
  当VDO卷在关闭前没有保存其所有元数据时,它会在下次启动时自动进入recovering模式。进入这个模式的典型原因是电源丢失或者基础存储设备出现问题。
  在recovering模式下,VDO 将修复设备上每个物理块的引用数。恢复通常不需要非常长。时间取决于 VDO 卷的大小、基础存储设备的速度以及其它请求 VDO 同时处理的速度。VDO 卷通常具有以下例外:
  ● 最初,在卷中写入请求的空间量可能会有所限制。当恢复了更多元数据后,更多的可用空间就会可用。
  ● 如果数据位于尚未恢复的卷的一部分中,则在 VDO 卷恢复过程中的数据写入可能对崩溃前写入的数据不能去除重复数据。VDO 可在恢复卷时压缩数据。您仍然可以读取或覆盖压缩的块。
  ● 在在线恢复过程中,某些统计数据不可用:例如,blocks in use 和 blocks free。重建完成后就可使用这些统计数据。
  ● 由于正在进行恢复工作,读取和写入的响应时间可能比通常要慢
  可以在recovering模式下安全地关闭 VDO 卷。如果恢复在关闭前没有完成,则设备将在下一次启动时再次进入 recovering 模式。
  当VDO卷修复了所有引用数时,VDO 卷会自动退出recovering模式,并进入到normal模式。不需要管理员操作。

  在线恢复VDO卷:
  在线恢复VDO卷可以使用如下命令:

vdo start --name=vdo-name

  不需要额外的步骤。恢复在后台运行

  强制VDO卷元数据离线重建:
  将VDO卷元数据执行强制离线重新构建,以便在不正常的关闭后进行恢复。先决条件必须是已启动VDO卷。

此过程可能会导致卷的数据丢失

  检查卷是否处于只读模式:

vdo status --name=vdo-name | grep mode
        operating mode: normal

  如果卷不处于只读模式,则不需要强制离线重建。执行在线恢复
  如果卷正在运行,请停止它:

vdo stop --name=vdo-name

  使用--forceRebuild选项重启卷:

vdo start --name=vdo-name --forceRebuild

  删除失败创建的VDO卷:
  此过程清理处于中间状态的 VDO 卷。如果在创建卷时发生故障,则卷处于中间状态。这可能会在以下情况发生,例如:
  ● 系统崩溃
  ● 电源失败
  ● 管理员中断了运行的vdo create命令

  要进行清理,请使用--force选项删除创建失败的卷:

vdo remove --force --name=vdo-name

  需要--force选项,由于卷创建失败,管理员可能会由于更改了系统配置而导致冲突。如果没有--force选项,vdo remove命令会失败

4.3.5. 在VDO中启用或禁用压缩

  VDO提供数据压缩,启用它可增加空间节省,VDO卷压缩默认是on
  当VDO首次看到唯一数据时,它会压缩数据。已存储的数据的后续副本会复制,而无需额外的压缩步骤。
  在VDO 卷中启用压缩(默认启用压缩):

vdo enableCompression --name=vdo-name

  禁用VDO卷上的压缩:
  要停止在现有VDO卷中压缩,请使用以下命令:

vdo disableCompression --name=vdo-name

  另外在创建新卷时,您可以在vdo create命令中添加--compression=disabled选项来禁用压缩

4.3.6. 增大VDO卷的大小

  可以增加VDO卷的物理大小,以利用更多的底层存储容量,或者增加逻辑大小以在卷上提供更多的容量。

  物理大小:
  底层块设备的大小。VDO使用这个存储用于:
  ● 用户数据,这些数据可能会进行重复数据删除和压缩
  ● VDO 元数据,如 UDS 索引
  可用物理大小:
  这是VDO可用于用户数据的物理大小的一部分
  它等同于物理大小减去元数据的大小,再减去将卷根据指定的 slab 的大小分为 slab 后剩余的值。
  逻辑大小:
  这是VDO卷在应用程序中的置备大小。它通常大于可用的物理大小。如果没有指定--vdoLogicalSize选项,则逻辑卷的调配现在被配置为1:1的比率。例如如果将 VDO 卷放在 20GB 块设备之上,则为 UDS 索引保留 2.5 GB(如果使用默认索引大小)。剩余的 17.5 GB 为 VDO 元数据和用户数据提供。因此,要消耗的可用存储不超过 17.5 GB,且可能会因为组成实际 VDO 卷的元数据而减少。

VDO 目前支持任意逻辑卷大小最多为物理卷的 254 倍,但不能超过 4PB

  VDO磁盘结构:
在这里插入图片描述
  增大VDO卷的逻辑卷大小:
  这个过程会增加给定VDO卷的逻辑大小。可以先创建具有逻辑大小足够小的VDO卷,使其安全而无法耗尽空间。一段时间后,可以评估实际的数据减少率,如果足够的话,可以增大 VDO 卷的逻辑大小以利用节省的空间。

不可能缩小 VDO 卷的逻辑卷大小

  要增大逻辑大小,请使用:

# 原VDO卷大小

lsblk
NAME       MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sdc          8:32   0   1.1T  0 disk 
└─vdo-name 253:0    0    50G  0 vdo  /vodvolume
vdo growLogical --name=vdo-name \
                  --vdoLogicalSize=100G
lsblk
NAME       MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sdc          8:32   0   1.1T  0 disk 
└─vdo-name 253:0    0   100G  0 vdo  /vodvolume

  增加VDO卷的物理大小:
  可以增加VDO卷可以使用的物理存储量,不可以以这种方式缩小VDO卷使用的物理存储量。首先底层块设备的容量要大于VDO卷的当前物理大小
  为VDO卷添加新物理存储空间:

vdo growPhysical --name=my-vdo

4.3.7. 删除VDO卷

  删除一个有效的VDO卷:
  ● 卸载文件系统并停止使用VDO卷中的存储的应用程序。
  ● 要从您的系统中删除VDO卷,请使用:

vdo remove --name=vdo-name

  删除失败创建的VDO卷:
  清理处于中间状态的VDO卷。如果在创建卷时发生故障,则卷处于中间状态。这可能会在以下情况发生,例如:
  ● 系统崩溃
  ● 电源失败
  ● 管理员中断了运行的vdo create命令
  要进行清理,请使用--force选项删除创建失败的卷:

vdo remove --force --name=vdo-name

  需要--force选项,由于卷创建失败,管理员可能会由于更改了系统配置而导致冲突。如果没有--force选项,vdo remove命令会失败

4.4. 测试VDO空间节省

4.4.1. 测试VDO重删功能

  首先创建一个VDO测试卷:
  在1.1TB的物理卷中创建了大小为2TiB 的VDO卷,用于测试目的。

vdo create --name=vdo-test \
             --device=/dev/sdd \
             --vdoLogicalSize=2T \
             --writePolicy=sync \
             --verbose

  ● 要在异步存储之上测试 VDO async 模式,请使用--writePolicy=async选项创建一个异步卷
  ● 要在同步存储之上测试 VDO sync 模式,请使用--writePolicy=sync选项创建一个同步卷

lsblk
NAME       MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sdd          8:48   0   1.1T  0 disk 
└─vdo-test 253:1    0     2T  0 vdo  

  使用 XFS 或者 ext4 文件系统格式化新卷:

mkfs.xfs -K /dev/mapper/vdo-test

  挂载格式化的卷:

mkdir /mnt/vdo-test
mount /dev/mapper/vdo-test /mnt/vdo-test && \
  chmod a+rwx /mnt/vdo-test

4.4.2. 测试VDO读写性能

  将随机数据的32 GiB写入VDO 卷:

dd if=/dev/urandom of=/mnt/vdo-test/testfile bs=4096 count=8388608
8388608+0 records in
8388608+0 records out
34359738368 bytes (34 GB) copied, 165.781 s, 207 MB/s

  从VDO卷中读取数据并将其写入另一个卷:

dd if=/mnt/vdo-test/testfile of=/tmp/testfile bs=4096
8388608+0 records in
8388608+0 records out
34359738368 bytes (34 GB) copied, 27.7768 s, 1.2 GB/s

  比较这两个文件:

diff --report-identical-files /mnt/vdo-test/testfile /tmp/testfile 
Files /mnt/vdo-test/testfile and /tmp/testfile are identical

  命令应该报告这些文件是相同的

4.4.3. 清理VDO测试卷

  卸载在VDO卷中创建的文件系统:

umount /mnt/vdo-test

  从系统中删除VDO测试卷:

vdo remove --name=vdo-test
Removing VDO vdo-test
Stopping VDO vdo-test

  验证卷是否已被删除:

vdo list --all | grep vdo-test

4.5. 丢弃未使用块

4.5.1. 块丢弃操作的类型

  如果/sys/block/<device>/queue/discard_max_bytes文件中的值不为零,则支持物理丢弃操作。

cat /sys/block/sdc/queue/discard_max_bytes 
0

  可以使用不同方法运行丢弃块操作:
  批量丢弃:
  由用户明确触发,并丢弃所选文件系统中所有未使用的块。
  在线丢弃:
  在挂载时指定,并在无需用户干预的情况下实时指定触发器。在线丢弃操作只丢弃从已使用到空闲状态的块。
  定期丢弃:
  是systemd服务定期运行的批处理操作

4.5.2. 执行批块丢弃

  先决条件:挂载文件系统、文件系统底层的块设备支持物理忽略操作
  在所选文件系统中执行丢弃:

df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vdo-name   50G   33M   50G   1% /vodvolume

fstrim /vodvolume

  要在所有挂载的文件系统中执行丢弃,请使用:

fstrim --all

  如果在不支持丢弃操作的设备,或者由多个设备组成的逻辑设备(LVM 或者 MD),其中任意设备不支持丢弃操作:

fstrim /mnt/non_discard
fstrim: /mnt/non_discard: the discard operation is not supported

4.5.3. 启用在线块丢弃

  可以执行在线块丢弃操作,以便在所有支持的文件系统中自动丢弃未使用的块
  在挂载时启用在线丢弃,请添加-o discard挂载选项:

mount -o discard device mount-point

  永久挂载文件系统时,请将discard选项添加到/etc/fstab文件中的挂载条目中

4.5.4. 启用定期块丢弃

  可以启用systemd计时器来定期丢弃所有支持的文件系统中未使用的块
  启用并启动systemd计时器:

systemctl enable --now fstrim.timer

  验证计时器的状态:

systemctl status fstrim.timer
● fstrim.timer - Discard unused blocks once a week
   Loaded: loaded (/usr/lib/systemd/system/fstrim.timer; enabled; vendor preset: disabled)
   Active: active (waiting) since Fri 2023-07-14 04:33:38 EDT; 1 day 5h ago
     Docs: man:fstrim

Jul 14 04:33:38 localhost.localdomain systemd[1]: Started Discard unused blocks once a week.

4.6. 使用Web控制台管理VDO卷

4.6.1. 安装并启用Web控制台

cat /etc/redhat-release 
Red Hat Enterprise Linux release 8.5 (Ootpa)
yum install cockpit
systemctl enable cockpit.socket --now
systemctl status cockpit.socket

firewall-cmd --permanent --add-service=cockpit
firewall-cmd --reload

ss -tnlp | grep 9090
LISTEN    0         128                      *:9090                   *:*        users:(("systemd",pid=1,fd=28))       

  登录到 Web 控制台:
在这里插入图片描述

  填写服务器的root账号和密码即可

4.6.2. 在Web控制台中创建VDO卷

  可参考官方指引,此处基本上就是按键操作

4.6.3. 在Web控制台中格式化VDO卷

  可参考官方指引,此处基本上就是按键操作

4.6.4. 在Web控制台中扩展VDO卷

  可参考官方指引,此处基本上就是按键操作

5. AutoFS自动挂载服务

  我们在使用Linux时,如果要访问硬件资源,则需要使用mount命令进行挂载,将硬件资源与一个目录进行对应,然后才可以访问使用该存储介质。如果使用samba或者是NFS服务,也需要对远程存储设备进行挂载。mount挂载是使用外部存储介质或者文件系统所必须的一步操作,但是如果挂载的资源过多,则会给网络资源和服务器资源造成一定的负载,从而降低服务器性能。
  为了解决这一问题,我们可以使用autofs服务,autofs是一种系统守护进程,我们可以把挂载信息写入其配置文件中,如果用户不访问其他存储介质的,则系统不会进行挂载,如果用户尝试访问该存储介质,则autofs会自动进行挂载操作,上述所有操作对用户而言是透明的,这样一来,autofs服务节省了服务器的网络和硬件资源。AutoFS是一个用于自动挂载文件系统的工具,通常用于NFS(网络文件系统)挂载。
   操作步骤如下:
   首先在serverb服务器中安装NFS服务端,创建一个共享目录作为servera的共享存储

[root@serverb ~]# mkdir -p /rhome/ldapuser0
[root@serverb ~]# chmod 777 /rhome/ldapuser0/
[root@serverb ~]# vim /etc/exports
/rhome/ldapuser0 *(rw)

[root@serverb ~]# systemctl restart nfs-server.service
[root@serverb ~]# systemctl enable nfs-server.service

[root@serverb ~]# firewall-cmd --permanent --add-service=nfs
[root@serverb ~]# firewall-cmd --permanent --add-service=mountd
[root@serverb ~]# firewall-cmd --permanent --add-service=rpc-bind
[root@serverb ~]# firewall-cmd --reload

  接下来在servera中安装autofs,创建一个ldapuser0用户,ldapuser0用户登录系统后可以自动挂载NFS共享目录

[root@servera ~]# showmount -e serverb.lab.example.com
Export list for serverb.lab.example.com:
/rhome/ldapuser0 *
[root@servera ~]# useradd ldapuser0
[root@servera ~]# vim /etc/passwd
ldapuser0:x:1002:1002::/rhome/ldapuser0:/bin/bash

  autofs服务的主配置文件为/etc/auto.master,打开后需要在主配置文件中写入格式:

[root@servera ~]# yum install autofs.x86_64
[root@servera ~]# vim /etc/auto.master
/rhome  /etc/auto.nfs

[root@servera ~]# vim /etc/auto.nfs
ldapuser0          -rw       serverb.lab.example.com:/rhome/ldapuser0
[root@servera ~]# systemctl enable autofs.service --now
[root@servera ~]# systemctl restart autofs.service

  验证效果:登录ldapuser0用户后,查看挂载的文件已经自动挂载serverb的NFS共享文件。

[root@servera ~]# su - ldapuser0
Last login: Fri Sep 29 00:40:22 CST 2023 on pts/0
[ldapuser0@servera ~]$
[ldapuser0@servera ~]$ df -Th
Filesystem                               Type      Size  Used Avail Use% Mounted on
devtmpfs                                 devtmpfs  887M     0  887M   0% /dev
tmpfs                                    tmpfs     914M     0  914M   0% /dev/shm
tmpfs                                    tmpfs     914M   17M  897M   2% /run
tmpfs                                    tmpfs     914M     0  914M   0% /sys/fs/cgroup
/dev/vda3                                xfs       9.9G  1.6G  8.4G  16% /
/dev/vda2                                vfat      100M  6.8M   94M   7% /boot/efi
tmpfs                                    tmpfs     183M     0  183M   0% /run/user/1000
serverb.lab.example.com:/rhome/ldapuser0 nfs4      9.9G  1.6G  8.4G  16% /rhome/ldapuser0

猜你喜欢

转载自blog.csdn.net/wangzongyu/article/details/133421024