1. 传统磁盘管理的痛点
管理磁盘空间一直是系统管理员的一项重要任务。
过去,磁盘空间耗尽后,通常需要将系统脱机,然后通过一系列繁琐而复杂的操作,以增加磁盘分区的可用空间,这通常包括:
- 安装新硬盘,引导到恢复或单用户模式;
- 在新硬盘上创建分区,在分区上创建文件系统;
- 使用临时挂载点将数据从太小的文件系统移动到新的、更大的文件系统;
- 更改 /etc/fstab 文件的内容以反映新分区的正确设备名称;
- 然后重新启动以重新挂载新文件系统到正确的挂载点。
2. LVM带来的便利-在线扩展文件系统大小
- LVM(Logical Volume Manager)即逻辑卷管理,它在物理的硬盘分区和上层的文件系统之间添加了一个逻辑层,为文件系统屏蔽了下层硬盘分区的布局,并提供一个抽象的盘卷,使得用户可以在盘卷上建立文件系统;
- LVM 通过将底层的物理硬盘封装,然后以逻辑卷的方式呈现给上层,当我们对底层的物理硬盘进行操作时,不再是针对分区进行操作,而是通过逻辑卷对底层硬盘进行管理操作;
- 管理员使用 LVM时, 可以在硬盘不用重新分区的情况下动态调整文件系统的大小,并且利用LVM管理的文件系统可以跨越物理硬盘:当服务器添加了新的硬盘后,管理员不必将原有的文件移动到新的硬盘上,而是通过LVM直接扩展文件系统来跨越物理硬盘;
- 由于 LVM 提供了非常灵活的磁盘空间管理,大多数现代LINUX系统的发行版,都默认支持 LVM;
- LVM 带来的灵活的磁盘空间管理功能包括:
- LVM 允许将多个物理硬盘和分区收集到一个卷组 VG 中,然后将其划分给逻辑卷 LV;
- LVM 提供了在文件系统挂载和活动时向逻辑卷 LV 及其文件系统添加磁盘空间的功能,不过能否在线扩展文件系统大小还要看文件系统是否支持:EXT2/EXT3/EXT4 只支持离线(即unmounted卸载状态下)缩小文件系统大小,不过增加文件系统大小时,即支持离线模式也支持在线模式(即mounted挂载状态下);
- LVM 还允许减少分配给逻辑卷 LV 的磁盘空间(当然必须首先减小卷上文件系统的大小后才能进行);
- 所以只要我们在卷组中有一些可用的空间,就能够向相应的逻辑卷分配额外的磁盘空间,然后即时扩展主机的文件系统,这也意味着我不必重新格式化整个硬盘并重新安装操作系统,甚至不用重新启动,而所有这些都是在文件系统在线和运行的情况下完成的。
3. LVM 的逻辑结构
lvm 磁盘环境的结构如下图所示:
- lvm 允许将多个独立的硬盘和/或磁盘分区组合成一个单一的卷组(VG);
- 然后可以将该 vg 细分为多个逻辑卷(LV)或用作单个大卷;
- 然后可以在逻辑卷上创建常规文件系统,比如 EXT3或EXT4;
- 在上图中,两个完整的物理硬盘和来自第三个硬盘的一个分区已被合并成一个单一的 vg 卷组,从卷组的空间中创建了两个逻辑卷 lv,并在这两个逻辑卷lv上创建了文件系统,如EXT3或EXT4文件系统。
4. LVM 的常规运维操作步骤
需要调整文件系统大小的需求自Unix的最初版本以来一直存在,而在Linux中也没有消失。
通过 LVM 逻辑卷管理,这变得更加简便。我们以扩展文件系统大小为例,其常规运维操作步骤如下:
- 如果需要,安装新的硬盘。
- 可选:在硬盘上创建分区。如果只打算使用新硬盘的一部分空间,则需要在硬盘上创建分区;如果打算使用整个硬盘空间,则不需要在硬盘上创建分区,因为创建分区并没有提供任何优势,反倒会消耗磁盘的一部分空间来存储元数据;
- 在完整硬盘或硬盘的分区上创建物理卷(PV):pvcreate /dev/hdd;
- 将新创建的物理卷 pv 分配给现有卷组(VG):vgextend /dev/MyVG01 /dev/hdd;
- 使用卷组 vg 中的部分或全部空间扩展现有逻辑卷 lv:lvcreate -L +50G –name Stuff MyVG01;
- 使用 resize2fs 命令扩展文件系统使用逻辑卷的新空间,注意扩展文件系统时,不同格式的文件系统需要使用不同命令:
- ext2/ext3/ext4 格式的需要使用 resize2fs命令:resize2fs /dev/MyVG01/Stuff;
- xfs格式的需要使用 xfs_growfs命令:xfs_growfs -p -F /dev/mapper/centos-root;
- 在/etc/fstab中添加适当的条目以挂载文件系统;
- 挂载文件系统;
5. LVM 常用管理命令
6. LVM实操
以安装星环 TDH 大数据集群为例,为便于后续对磁盘分区的管理和调整,我们使用 lvm来管理分区。
在申请服务器时,我们注明了操作系统需要分为系统盘和数据盘,系统盘默认50G,而数据盘由我们使用 lvm 自行管理,具体来讲,目标如下:
- 使用数据盘创建1个pv和1个vg,并在次基础上创建两个lv分别给docker和 hdfs使用;
- 其中docker 分区使用 xfs 文件系统,hdfs数据分区使用 ext4 文件系统;
- docker 分区挂载到 /var/log/docker,至少100G空间;
- hdfs 数据分区挂载到 /mnt/disk1; 具体操作步骤如下。
6.1 确认当前磁盘和分区情况
新服务器交付后,查看当前磁盘和分区信息, 可以发现,磁盘上预留了大量空间,可以用来创建新分区:(注意这里系统盘和数据盘其实是同一块物理磁盘)
lsblk && df -h
6.2. 使用数据磁盘的剩余空间创建新分区
- 创建新分区,注意分区的类型为 primary: fdisk /dev/sda
- 查看新创建的分区:lsblk && fdisk -l
6.3 使用新创建的分区,创建 pv/vg/lv
- pvcreate /dev/sda3
- vgcreate tdh /dev/sda3
- lvcreate -n docker -L 120G tdh
- lvcreate -n data -L 228G tdh
6.4.对docker 分区进行 xfs 格式化处理,并挂载到 /var/lib/docker
相关命令有:
mkdir -p /var/lib/docker
mkfs.xfs -f -n ftype=1 /dev/mapper/tdh-docker
mount /dev/mapper/tdh-docker /var/lib/docker
xfs_info /dev/mapper/tdh-docker | grep ftype=1
配置/etc/fstab,以设置docker 分区的自动挂载:
blkid /dev/mapper/tdh-docker
UUID=<UUID> /var/lib/docker ext4 defaults 00
6.5 对data 分区进行 ext4 格式化处理,并挂载到 /mnt/disk1
后续安装tdh 时,tdh会自动检测并使用/mnt/diskx目录做为 HDFS DataNode的数据目录。
mkfs.ext4 /dev/mapper/tdh-data
mkdir -p /mnt/disk1
mount /dev/mapper/tdh-data /mnt/disk1
6.6 确认分区及挂载情况
创建好分区并格式化挂载完毕后,服务器状态信息如下,注意这里因为开发环境磁盘空间有限,没有创建分区并挂载到/var/log,也没有创建Docker备用分区: