.. _lvm_xfs_in_studio:
=======================
Studio环境的LVM+XFS存储
=======================
.. note::
最初我选择 :ref:`btrfs_in_studio` ,主要考虑到Btrfs文件系统接近ZFS的特性,结合了卷管理和文件系统的高级特性,灵活并且充分利用好磁盘空间。在 :ref:`ubuntu_on_mbp` 采用Btrfs构建libvirt卷和Docker卷,确实非常方便管理和维护。
不过, :ref:`archlinux_on_thinkpad_x220` 实践中,我为了体验技术,启用了Btrfs的磁盘透明压缩功能。这次尝试似乎带来了不稳定的因素,Btrfs出现csum错误。目前我还不确实是否是因为SSD磁盘存在硬件故障。
从Red Hat Enterprise Linux 8开始,Red Hat放弃了Btrfs支持,这对于企业运行RHEL/CentOS环境,实际上已经变相阻止了Btrfs。原因可能比较复杂,一方面是Btrfs的高级特性(如RAID)一直不稳定,另一方面可能和Oracle和Red Hat的存储竞争策略冲突相关。
Red Hat Enterprise Linux推荐的默认文件系统是XFS,XFS文件系统是数据库本地磁盘首选的文件系统。
方案选择
==========
- 存储分区需要能够灵活调整,所以需要采用LVM卷管理来划分磁盘分区
- 需要有高性能文件系统,对SSD存储优化,并适合大型应用运行
LVM + XFS是适合数据库应用运行的Linux存储组合,并且也是Red Hat主推的用于取代ZFS和Btrfs的 `Stratis项目 `_ 底层技术堆栈。所以,我选择这个存储技术组合。
LVM卷管理
=========
逻辑卷管理(Logical Volume Management)工具使用了内核 :ref:`device_mapper` 功能来提供系统分区无关的底层磁盘布局。通过LVM抽象存储就能够获得"虚拟分区",已及方便的扩展和收缩功能。
虚拟分区允许添加或移除一个分区的底层磁盘,这样就无需担忧磁盘空间不足。
LVM构建基础概念:
- 物理卷(Physical volume, PV): Unix块设备节点。通常是磁盘、MBR或GPT分区,loopback文件,device mapper设备(例如,dm-crypt)。在物理卷上保存了LVM头部(LVM header)
- 卷组(Volume group, VG): PV组成卷足用于提供逻辑卷LV的容器。PV是通过VG提供给LV使用的。
- 逻辑卷(Logical volume, LV): 逻辑分区是在VG中表述并由PE组成的,LV是一个Unix块设备,类似物理分区,也就是可以直接用文件系统格式化。
- 物理扩展(Physical extent): 物理扩展PE时在PV上的最小连续扩展(默认4MB),可以分配给LV,你可以将PE视为PV的一部分,被分配给LV。
安装软件包
----------------
- 安装 ``lvm2`` 软件包::
sudo pacman -S lvm2
创建分区
------------
- 使用parted划分分区,参数采用 ``--align`` ::
parted -a optimal /dev/sda
- 创建分区3::
mkpart primary 51.7GB 100%
- 设置分区名和启用分区LVM::
name 3 store
set 3 lvm on
- 最后检查::
print
显示输出::
Model: ATA INTEL SSDSC2KW51 (scsi)
Disk /dev/sda: 512GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 512MB 511MB fat16 boot, esp
2 512MB 51.7GB 51.2GB ext4
3 51.7GB 512GB 460GB store lvm
以上分区3将作为数据存储的LVM卷。对于修改系统磁盘 ``/dev/sda`` 分区,则建议重启一次操作系统以便刷新。或者通过 ``partprobe`` 刷新分区。
创建物理卷
-------------
- 初始化物理卷::
pvcreate /dev/sda3
.. note::
如果有多个设备,可以一起初始化,例如::
pvcreate /dev/sdd1 /dev/sde1 /dev/sdf1
- 检查物理卷::
pvdispaly
显示::
"/dev/sda3" is a new physical volume of "<428.78 GiB"
--- NEW Physical volume ---
PV Name /dev/sda3
VG Name
PV Size <428.78 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID HYPqoi-s2Ga-r2c9-upv6-Q3by-DFf3-NJe9BT
卷组管理
----------
- 在物理卷上构建卷组::
vgcreate store /dev/sda3
.. note::
这里将卷组命名为 ``store``
当物理卷用于创建卷组的时候,它的磁盘空间默认被划分为以4MB为单位的 ``extent`` 。这个 ``extent`` 是用于逻辑卷增长和缩减的最小大小。 ``extent`` 的数量不会影响逻辑卷的I/O性能。
- 如果要扩展卷组,可以新的物理卷加入到卷组,例如,以下在卷组 ``vg1`` 中添加 ``/dev/sdf1`` 物理卷来扩展卷组的大小::
vgextend vg1 /dev/sdf1
逻辑卷
---------
- 在 ``store`` 卷组上创建 ``home`` 逻辑卷::
lvcreate -L 100G -n home store
- 检查逻辑卷 ``lvdisplay`` 显示如下::
--- Logical volume ---
LV Path /dev/store/home
LV Name home
VG Name store
LV UUID gIwomd-B9x2-MRNP-o2Jd-diqn-Tgji-N70rP4
LV Write Access read/write
LV Creation host, time zcloud, 2019-10-05 23:02:59 +0800
LV Status available
# open 0
LV Size 100.00 GiB
Current LE 25600
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 254:0
- 同样再创建一个用于libvirt的逻辑卷,一个用于docker的逻辑卷,一个用于docker容器和虚拟机等共享的存储::
lvcreate -L 128G -n libvirt store
lvcreate -L 128G -n docker store
lvcreate -L 128G -n store store
.. note::
:ref:`docker_volume` 是Docker持久化数据的存储共享卷,单独划分 ``store`` 存储,可以在这个存储下构建不同的隔离目录给Docker共享。
Docker支持quota可以用来限制容器可用空间,如果要强制隔离,则可以利用LVM卷来实现。
详细的 ``store`` 卷部署使用请参考 :ref:`docker_volume` 和 :ref:`dockerfile` 中配置Docker使用共享卷部分。
XFS
===========
.. note::
详细XFS相关请参考 :ref:`xfs` 和 :ref:`xfs_tunning`
- 安装XFS管理工具 ``xfsprogs`` ::
sudo pacman -S xfsprogs
- 格式化LVM卷::
mkfs.xfs /dev/store/home
mkfs.xfs /dev/store/libvirt
mkfs.xfs /dev/store/docker
mkfs.xfs /dev/store/store
.. note::
:ref:`docker_overlay_driver` 要求 ``xfs`` 文件系统启用 ``d_type=true`` 选项,也就是 ``xfs_info`` 检查文件系统输出信息中有 ``ftype=1`` 。现代XFS文件系统默认都启用了 ``ftype=1`` 。
- 配置 ``/etc/fstab`` ::
/dev/mapper/store-home /home xfs defaults 0 1
/dev/mapper/store-libvirt /var/lib/libvirt xfs defaults 0 1
/dev/mapper/store-docker /var/lib/docker xfs defaults 0 1
/dev/mapper/store-store /store xfs defaults 0 1
- 挂载目录(注意,请使用root用户的单用户状态登陆,避免普通用户登陆影响/home目录修改)::
mount /home
mount /var/lib/libvirt
mount /var/lib/docker
mount /store
.. note::
实际我的操作是采用root用户登陆后,将上述两个XFS文件系统先挂载到临时目录下,将数据迁移到新建的XFS文件系统中,然后再切换目录挂载来完成的。请参考 :ref:`using_btrfs_in_studio` 中切换 libvirt 目录到btrfs文件系统步骤。
参考
=========
- `Arch Linux社区文档 - LVM `_
- `Arch Linux社区文档 - XFS `_