.. _extend_ext4_on_lvm: ======================== 扩展LVM上的EXT4文件系统 ======================== 本文案例是我的一次紧急扩容,为在线已经 100% 的LVM卷上EXT4文件系统在线扩容(不影线业务)。实践中有一点点困扰,包括 :ref:`lvm_device_excluded_by_filter` - 添加一个分区作为 pv :: #pvcreate /dev/sda5 WARNING: ext4 signature detected on /dev/sda5 at offset 1080. Wipe it? [y/n]: y Wiping ext4 signature on /dev/sda5. Physical volume "/dev/sda5" successfully created. - 检查pv:: pvs 输出显示:: PV VG Fmt Attr PSize PFree /dev/dfb1 vg-data lvm2 a-- 5.82t 0 /dev/sda5 lvm2 --- <263.72g <263.72g :: #pvdisplay --- Physical volume --- PV Name /dev/dfb1 VG Name vg-data PV Size 5.82 TiB / not usable 2.00 MiB Allocatable yes (but full) PE Size 4.00 MiB Total PE 1525878 Free PE 0 Allocated PE 1525878 PV UUID UbqdoA-z6Wx-xtuV-Q0c1-IuaF-YNWE-QNUayx "/dev/sda5" is a new physical volume of "<263.72 GiB" --- NEW Physical volume --- PV Name /dev/sda5 VG Name PV Size <263.72 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID Ka4Xkc-OkBz-NRnV-PQR7-UcU9-sTTe-ZirUli :: #vgdisplay --- Volume group --- VG Name vg-data System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 4 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 0 Max PV 0 Cur PV 1 Act PV 1 VG Size 5.82 TiB PE Size 4.00 MiB Total PE 1525878 Alloc PE / Size 1525878 / 5.82 TiB Free PE / Size 0 / 0 VG UUID VnvQM9-hcX6-gVqL-Nlsl-q7GP-CIC6-Dwbx6n 现在需要将最后的完全空闲的 ``/dev/sda5`` 加入 ``VG`` vg-data:: vgextend vg-data /dev/sda5 提示:: Volume group "vg-data" successfully extended - 此时检查可以看到 ``vg-data`` 空闲 就是刚添加的磁盘空间 :: #vgdisplay --- Volume group --- VG Name vg-data System ID Format lvm2 Metadata Areas 2 Metadata Sequence No 5 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 0 Max PV 0 Cur PV 2 Act PV 2 VG Size <6.08 TiB PE Size 4.00 MiB Total PE 1593389 Alloc PE / Size 1525878 / 5.82 TiB Free PE / Size 67511 / 263.71 GiB VG UUID VnvQM9-hcX6-gVqL-Nlsl-q7GP-CIC6-Dwbx6n - 当前磁盘:: #df -h ... /dev/mapper/vg--data-lv--thanos 5.8T 5.8T 0 100% /home/t4.new - 扩容lvm:: lvextend -l +100%FREE /dev/vg-data/lv-thanos 提示信息:: Size of logical volume vg-data/lv-thanos changed from 5.82 TiB (1525878 extents) to <6.08 TiB (1593389 extents). Logical volume vg-data/lv-thanos successfully resized. - 对挂载的EXT4文件系统进行扩容:: resize2fs -p /dev/mapper/vg--data-lv--thanos 提示信息:: resize2fs 1.43.5 (04-Aug-2017) Filesystem at /dev/mapper/vg--data-lv--thanos is mounted on /home/t4.new; on-line resizing required old_desc_blocks = 746, new_desc_blocks = 779 The filesystem on /dev/mapper/vg--data-lv--thanos is now 1631630336 (4k) blocks long. - 再次检查:: #df -h ... /dev/mapper/vg--data-lv--thanos 6.1T 5.8T 0 100% /home/t4.new 奇怪,怎么扩容到6.1T,还是显示100%使用,没有空闲出空间? - 检查文件系统是否具备 ``resize_inode`` 功能,执行:: tune2fs -l /dev/mapper/vg--data-lv--thanos | grep resize_inode 可以看到:: Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize 这说明文件系统是支持在线扩展的! - 尝试卸载文件系统:: umount /home/t4.new - 然后重新做一次离线扩展:: resize2fs -p /dev/mapper/vg--data-lv--thanos 提示:: resize2fs 1.43.5 (04-Aug-2017) Please run 'e2fsck -f /dev/mapper/vg--data-lv--thanos' first. - 好吧,先做一次fsck:: e2fsck -f /dev/mapper/vg--data-lv--thanos - 再做一次离线扩展:: resize2fs -p /dev/mapper/vg--data-lv--thanos 提示:: resize2fs 1.43.5 (04-Aug-2017) The filesystem is already 1631630336 (4k) blocks long. Nothing to do! 我突然明白了: - 磁盘空间太大(>5.8T),添加200+对百分比没有太大影响 - 原先确实是100%使用,能够继续写入是因为默认有5%的 :ref:`reserved_space_for_root_on_filesystem` : 这点我在采用 :ref:`parallel_rsync` 同步备份数据时特意观察了一下,发现即使 ``df -h`` 显示磁盘空间已经使用了 100% , ``rsync`` 依然在继续写入文件,没有报错(因为磁盘物理容量大约有6T,为root用户保留的 5% 空间就达到了惊人的 300G 空间,足够支持一段时间的超量写入) - 当我使用 ``resize2fs`` 将文件系统扩展263G空间,实际上对于文件系统,仅仅是将原先超量写入root保留空间(约300G)再计算到 ``df -h`` 显示数据中,所以看上去依然是 100% 使用(之前可能写入root保留空间不少数据了) 再次扩展验证 ============= 根据我上文推测, ``resize2fs`` 是可以在线扩展 EXT4 文件系统的,只不过刚才磁盘空间已经满了,数据是存储在 root 用户保留空间,所以扩展后还是显示 100% 准备了另一块大容量SSD磁盘,再次做扩展: - 创建PV:: #pvcreate /dev/dfa1 WARNING: ext4 signature detected on /dev/dfa1 at offset 1080. Wipe it? [y/n]: y Wiping ext4 signature on /dev/dfa1. Physical volume "/dev/dfa1" successfully created. - 扩展vg:: #vgextend vg-data /dev/dfa1 Volume group "vg-data" successfully extended - 这次检查 ``vgdisplay`` 可以看到新增加的物理磁盘将 ``vg-data`` 扩大了 5.82TB:: #vgdisplay --- Volume group --- VG Name vg-data System ID Format lvm2 Metadata Areas 3 Metadata Sequence No 7 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 1 Max PV 0 Cur PV 3 Act PV 3 VG Size <11.90 TiB PE Size 4.00 MiB Total PE 3119267 Alloc PE / Size 1593389 / <6.08 TiB Free PE / Size 1525878 / 5.82 TiB VG UUID VnvQM9-hcX6-gVqL-Nlsl-q7GP-CIC6-Dwbx6n - 扩展 ``lv`` 到所有可用 ``vg`` :: #lvextend -l +100%FREE /dev/vg-data/lv-thanos Size of logical volume vg-data/lv-thanos changed from <6.08 TiB (1593389 extents) to <11.90 TiB (3119267 extents). Logical volume vg-data/lv-thanos successfully resized. - 将文件系统扩展到整个可用空间:: #resize2fs -p /dev/mapper/vg--data-lv--thanos resize2fs 1.43.5 (04-Aug-2017) Filesystem at /dev/mapper/vg--data-lv--thanos is mounted on /home/t4.new; on-line resizing required old_desc_blocks = 779, new_desc_blocks = 1524 The filesystem on /dev/mapper/vg--data-lv--thanos is now 3194129408 (4k) blocks long. - 再次检查 ``df -h`` ,正如所愿,磁盘空间整整翻倍:: #df -h Filesystem Size Used Avail Use% Mounted on ... /dev/mapper/vg--data-lv--thanos 12T 6.1T 5.3T 54% /home/t4 参考 ======= - `How to add an extra second hard drive on Linux LVM and increase the size of storage `_ - `Extending Mounted Ext4 File System on LVM in Linux `_