我正在设置一个 redhat ec2 实例,默认情况下我正在使用的软件(称为格雷达)在连接到实例的两个 500g ebs 存储设备上创建了以下卷:
$ lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
storetmp rootrhel -wi-ao---- 20.00g
varlog rootrhel -wi-ao---- <20.00g
store storerhel -wi-ao---- <348.80g
transient storerhel -wi-ao---- <87.20g
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda2 500G 1.4G 499G 1% /
devtmpfs 16G 0 16G 0% /dev
tmpfs 16G 0 16G 0% /dev/shm
tmpfs 16G 17M 16G 1% /run
tmpfs 16G 0 16G 0% /sys/fs/cgroup
/dev/mapper/storerhel-store 349G 33M 349G 1% /store
/dev/mapper/storerhel-transient 88G 33M 88G 1% /transient
/dev/mapper/rootrhel-storetmp 20G 33M 20G 1% /storetmp
/dev/mapper/rootrhel-varlog 20G 35M 20G 1% /var/log
tmpfs 3.2G 0 3.2G 0% /run/user/1000
我需要storetmp
100克。如何将 80g 存储空间从 移动store
到storetmp
?
我似乎还需要将一些空间从 xvdb3 转移到 xvdb2:
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 500G 0 disk
├─xvda1 202:1 0 1M 0 part
└─xvda2 202:2 0 500G 0 part /
xvdb 202:16 0 500G 0 disk
├─xvdb1 202:17 0 24G 0 part [SWAP]
├─xvdb2 202:18 0 40G 0 part
│ ├─rootrhel-varlog 253:2 0 20G 0 lvm /var/log
│ └─rootrhel-storetmp 253:3 0 20G 0 lvm /storetmp
└─xvdb3 202:19 0 436G 0 part
├─storerhel-store 253:0 0 348.8G 0 lvm /store
└─storerhel-transient 253:1 0 87.2G 0 lvm /transient
请注意,这些目录当前正在由盒子上运行的软件使用,并且不为空,因此删除它们是不可能的,我需要即时完成此操作:
$ ls -l /dev/mapper/storerhel-transient
lrwxrwxrwx 1 root root 7 Aug 10 16:00 /dev/mapper/storerhel-transient -> ../dm-3
$ ls -l /dev/mapper/rootrhel-varlog
lrwxrwxrwx 1 root root 7 Aug 10 16:00 /dev/mapper/rootrhel-varlog -> ../dm-0
$ ls -l /dev/mapper/storerhel-store
lrwxrwxrwx 1 root root 7 Aug 17 04:10 /dev/mapper/storerhel-store -> ../dm-2
答案1
EC2 EBS 中额外的 80 GB 费用每月不到 12 美元。在线操作可能会花费您一个多小时的工作时间,并且如果出现问题,还会有停机的风险 - 这对您来说值多少钱?
支付一些额外的容量,将其作为第三个磁盘添加到您的实例中xvdc
,将其初始化为 LVM PV(您甚至不必在其上放置分区表:就pvcreate /dev/xvdc
足够了)。然后将新的 PV 添加到您的rootrhel
VG ( vgextend rootrhel /dev/xvdc
),现在您可以/storetmp
使用增加的容量来扩展您的 VG。
lvextend -L +80G /dev/mapper/rootrhel-storetmp
xfs_growfs /storetmp #or the appropriate tool for your filesystem type
解决了眼前的问题后,您现在可以在适当的时间安排一些停机时间。
/store
如果您使用 XFS 文件系统(RHEL/CentOS 7 默认情况下这样做),那么在下一次计划停机期间,您将创建和的当前内容的 tarball /transient
,卸载并删除整个storerhel
VG,将其 PV 添加xvdb3
到rootrhel
VG 并然后使用更实际的容量需求估计来重新创建 LV/store
和/transient
文件系统,并恢复 tarball 的内容。停机时间结束。
现在您的rootrhel
VG 具有三个 PV:xvdb2
、xvdb3
和xvdc
,并且有足够的空间满足您的需求。
如果您想停止付费xvdc
,您可以使用pvmove /dev/xvdc
自动将 VG 内的数据从和/或xvdc
内的未分配空间迁移到xvdb2
和/或 内xvdb3
。您可以在线完成此操作;只是不要在 I/O 工作负载高峰时执行此操作,以避免性能受到影响。然后vgreduce rootrhel /dev/xvdc
,echo 1 > /sys/block/xvdc/device/delete
告诉内核该xvdc
设备即将消失,然后告诉亚马逊您不再需要磁盘了xvdc
。
我拥有近 20 年使用 LVM 磁盘存储的经验(首先使用 HP-UX LVM,后来在 Linux LVM 成熟到可以在企业环境中使用时使用 Linux LVM)。以下是我在 LVM 中使用的经验法则:
- 当一个 VG 就足够时,您永远不应该创建两个 VG。
特别是,在一个磁盘上拥有两个 VG 很可能是一个让您头疼的错误。在 VG 内重新分配磁盘容量的灵活性取决于您的文件系统类型所允许的程度;在 VG 之间以小于一个现有 PV 的块的形式移动容量通常不值得这么麻烦。
- 如果您的磁盘空间需求存在不确定性(而且总是存在),请将 LV 保持在较小的范围内,并保留一些未分配的空间。
只要您的 VG 有未分配的可用容量,您就可以根据需要通过一两个快速命令在线扩展其中的 LV 和文件系统。对于受过训练的猴子初级系统管理员来说,这只是一个香蕉的工作。
如果VG中没有未分配的容量,则获取一个新磁盘,将其初始化为新的PV,将其添加到需要容量的VG中,然后照常进行扩展。缩小文件系统更容易出错,可能需要停机,甚至可能在不备份和重新创建较小尺寸的文件系统的情况下不可能实现,具体取决于文件系统类型。因此,您需要尽可能避免需要在线缩小文件系统的情况。
- 对磁盘空间进行微观管理可能存在风险,而且工作量很大。工作很昂贵。
好的。从技术上讲你可以在 上创建一个 80 GB 文件/store
,losetup
将其放入循环设备中,然后将其放入可以添加到您的 PV 中rootrhel
VG 中的 PV...但这样做会导致系统很可能在启动时进入单用户恢复模式,除非您为这些文件系统和 VG 设置自定义启动脚本并且第一次就做对了。
如果出现错误,下次系统因任何原因重新启动时,您将不得不花费一些计划外的停机时间来进行故障排除和修复,或者更实际地从头开始重新创建文件系统并从备份中恢复内容,因为这比尝试排除故障更简单这种临时操纵的混乱局面
或者,如果您使用的是ext4
可以在线缩减的文件系统,您可以收缩/store
文件系统,收缩 LV,用于pvmove --alloc anywhere
将可用空间合并到 PV 的尾部xvdb3
,收缩 PV,收缩分区,运行partprobe
以生成更改无需重新启动即可生效,然后创建一个新分区xvdb4
,将其初始化为新的 PV 并将其添加到rootrhel
VG...
但是,如果您在此序列中犯了一个错误,导致您的文件系统/PV 超出了其 LV/分区容器,并且您的文件系统会切换到只读模式,并带有一个错误标志,该错误标志只能通过运行文件系统检查来重置,从而导致强制计划外停机。