一、概念
LVM (logical volume manager) 逻辑卷管理是通过将底层物理硬盘抽象封装起来的,以逻辑卷的形式表现给上层系统,逻辑卷的大小可以动态调整,而且不会丢失现有的数据,新加入磁盘也不会改变现有上层的逻辑卷,作为一种动态的逻辑磁盘管理机制,很大程度上提高了磁盘管理的灵活性。
二、PE LE PV VG LV概念
PE(Physical Extent)
当你用 pvcreate
命令创建 PV 时,该命令会(在逻辑上)把物理存储介质划分为了 N 个大小相同的块,“physical extent”,简称 PE。
你可以用 pvdisplay
命令查看某个 PV 的详细信息,就能看到如下信息:
PE 的尺寸
该 PV 中的 PE 总数
已分配的 PE 总数
未分配的 PE 总数
LVM2 默认的 PE 尺寸是 4MiB。对于新手而言,用【默认的】PE 尺寸就可以啦。
某些老手可能想要自己控制 PE 尺寸——可以在创建 VG 时指定 PE 尺寸,命令如下:
vgcreate -s 64M VG_XXX /dev/sdb1
(注:上述命令指定新创建的 VG 使用 64MiB 作为 PE 尺寸;对于 LVM2,PE 最小值是 1KiB)
早期的 LVM1,对 LV 有一个硬性上限——每个 LV 最多只能有 65534 个 LE(仔细看下图的右上角)。所以,早期的 LVM1 用户,如果想要创建一个超大的 LV,需要在创建 VG 时就指定一个偏大的“PE 尺寸”。
到了如今的 LVM2,每个 LV 包含的 LE 数量已经【没有】那个上限了。所以“PE 尺寸”就不像以前那么重要了。
LE(Logical Extent)
LV 与 PV 有点类似——底层也是划分为若干个大小相同的块,洋文称之为“logical extent”,简称 LE。
一般情况下,LE 与 PE 是【一一对应】滴;特殊情况下(比如后面要聊的 RAID1),一个 LE 会同时对应多个 PE。
PV (physical volume) 物理卷
在 LVM 的术语中,“物理卷”(PV)用来对应【底层】的“物理硬盘 or 物理分区”。
你可以用 LVM 的命令行工具,把某个“物理硬盘”或“物理分区”创建成 PV。这个 PV 的容量也就是“物理硬盘 or 物理分区”的容量。
整个磁盘或者使用fdisk 划分的普通分区。其包括很多固定带小块的PE(physical extent ,物理单元,默认是4M)
VG(volume group)
通过 LVM 的命令行工具,还可以把多个 PV 纳入到一个 VG(卷组)中。
你不妨把 VG 想象成一个【存储池】,这个池子的容量也就是加入其中的所有 PV 的容量总和。
每个 VG 都有自己的一些元数据。比如刚才所说的“PE 尺寸”就是它的元数据之一。
那“VG 的元数据”存储在哪里捏?
它们保存在 PV 的头部——当你创建 VG 时,至少要指定一个或多个 PV;新创建的 VG,其元数据就保存在这些 PV 头部。如果这个 VG 后来又加入其它 PV,其元数据也会保存在这些新的 PV 中。元数据保存多份,也是为了达到某种冗余。
vg的备份
可以用命令 vgcfgbackup
把某个 VG 的元数据导出到单个文件中;需要的话,还可以再用命令 vgcfgrestore
导入。
LV(logical volume)
在 LVM 的术语中,“逻辑卷”(LV)用来对应【上层】的“逻辑分区”。
你可以从 VG 中创建多个 LV。每次创建 LV 都如同从这个存储池中分配空间,直到所有存储空间都被分配完。
创建好 LV 之后,你可以对这个 LV 进行格式化,就得到一个可用的逻辑分区。
最终直接使用的逻辑卷,可以根须需求格式化成需要的格式使用,注意PV 和 VG 是不能直接使用的。
三 常用的指令
四 LV创建的过程
- 将物理磁盘格式化为PV,空间被分成多个PE
- 不同的PV加入同一个VG,不同PV的PE全部进入VG的PE池内
- LV基于PE创建,大小是PE的整数倍,组成LV的PE可能来自不同的物理磁盘。
- LV现在格式化后就可以使用了
- LV的扩充缩减实际上就是增加减少组成该LV的PE的数量,其过程对程序是透明的,不会造成数据丢失(因此可以online 做lvextend)。
五 常见用法及实战
常见的用法
◇创建 PV
使用 pvcreate
命令创建 PV。你可以针对【硬盘分区】上创建 PV,也可以针对【整个硬盘】创建 PV,命令分别如下
针对【硬盘分区】创建 PV
pvcreate /dev/sdb1
- 针对【整个硬盘】创建 PV
pvcreate /dev/sdc
为了验证上述命令确实创建了一个 PV,你可以执行 pvs
命令,它会列出系统中所有 PV 的名称。
(注:执行 pvcreate
命令之后,它会在对应设备的头部写入一个 LVM 的标志,表示这个设备已经被 LVM 用作“物理卷”)
◇创建 VG
有了某个 PV之后,你就可以基于这个 PV 创建 VG。假设你之前已经在 /dev/sdb1 这个设备(物理分区)上创建了 PV,就可以用如下命令创建一个新的 VG,VG 的名称是 VG_XXX(这个名称纯粹是为了举例,你也可以用其它字母组合作为 VG 的名称):
vgcreate VG_XXX /dev/sdb1
为了验证上述命令确实创建了一个 VG,你可以执行 vgs
命令,它会列出系统中所有 VG 的名称。
◇VG 扩容(添加新的 PV)
用上述方式创建的 VG 只包含一个 PV。为了让这个 VG 管理多个 PV,可以用 vgextend
命令加入其它 PV。举例如下:
1. pvcreate /dev/sdc1 2. vgextend VG_XXX /dev/sdc1
(注:前一个命令创建了新的 PV,后一个命令把这个 PV 加入到刚才那个 VG 里面)
添加了 PV 之后,你可以用如下命令查看该 VG,就可以看到它包含的 PV 数。
vgdisplay VG_XXX
◇创建 LV
创建 LV 包括如下几个步骤:
步骤1
用如下命令,在 VG_XXX
中创建一个新的 LV,名叫 lv_xxxx
(这个名字纯属举例,你可以用别的字母组合)。
lvcreate -L 100G -n lv_xxxx VG_XXX
请注意:上述命令中的 -L
和 100G
都是大写;其中的 G
,表示 GB 为单位。你也可以用大写 M
后缀表示多少兆字节(MB)。
为了验证上述命令确实创建了一个 LV,你可以执行 lvs
命令,它会列出系统中所有 LV 的名称,以及每个 LV 所属的 VG。
如果你想要创建一个 LV,把 VG 的剩余空间都用掉,可以用如下命令:
lvcreate --extents 100%FREE VG_XXX -n lv_xxxx
步骤2
“步骤1”只是创建了一个“逻辑设备”,你还需要在该设备上创建文件系统。不同的文件系统,创建的命令也不同。下面以 ext4 为例,在刚才那个 lv_xxxx
之上创建 ext4 文件系统。
mkfs.ext4 /dev/VG_XXX/lv_xxxx
步骤3
最后,你用 mount 命令挂载新创建的文件系统。
友情提示
Linux 有个很有用的命令 lsblk,他以【树状风格】展示系统中所有“块设备”(block device)的层次关系;如果该设备有挂载点,也会一并标注。
当你创建了 LV 之后,可以运行该命令体验一下。
◇自动挂载 LV
你可以编辑系统目录下的 /etc/fstab
文件,把需要自动挂载的“LV 路径”以及“挂载点路径”添加到该文件中。
◇LV 扩容
以刚才创建的 LV 举例。如果你想把它的空间再增加 50GB,通过如下步骤:
步骤1
先执行如下命令:
lvresize -L +50G VG_XXX/lv_xxxx
(注:上述命令中,VG_XXX
是“VG 名称”;lv_xxxx
是“LV 名称”;两者之间用【半角斜杠】相连接)
为了避免你搞错,再看如下命令:
lvresize -L 50G VG_XXX/lv_xxxx
上述两个命令,就差了一个【加号】。-L +50G
表示空间【再增加 50GB】;-L 50G
表示空间【增加到 50GB】。
步骤2
上述扩容命令仅仅是增加了“LV 的空间”,“文件系统”的空间【还没】变化;为了让“文件系统”也跟着 LV 而变大,需要再用一个“文件系统扩容命令”。
“文件系统扩容命令”与具体的“文件系统【类型】”相关,对于 EXT 家族(ext2、ext3、ext4),该命令是 resize2fs,用法如下:
resize2fs /dev/VG_XXX/lv_xxxx
ext 家族的好处是——支持【在线扩容】,你不需要卸载文件系统,就可以直接扩大其容量。
文件系统的差异
并【不是】所有的文件系统都支持“扩容”的功能。另外,有些文件系统虽然支持“扩容”,但不支持“在线扩容”——也就是说,你要先卸载文件系统,然后再执行“扩容命令”。
★不那么常见的用法
◇VG 改名
如果你觉得 VG 的名称不太满意,可以用 vgrename
命令改名。举例如下:
vgrename 旧名称 新名称
对 VG 改名之后,可以用 vgs
命令进行验证。
◇LV 改名
如果你觉得 LV 的名称不太满意,也可以改名,命令如下:
lvrename VG名称 LV旧名称 LV新名称
对 LV 改名之后,可以用 lvs
命令进行验证。
◇VG 缩容(移除 PV)
假设你的某个 VG 中包含3个 PV,分别是:sda1,sdb2,sdc3;然后你想要把 sda1 移出该 VG。可以用如下步骤完成:
步骤1
你先要确保 sdb2 与 sdc3 有足够的剩余空间来转储 sda1 上已经存储的数据。你可以先用 pvdisplay 命令分别看一下这3个 PV,评估空间的使用情况。
步骤2
假如你评估之后,另2个 PV 的剩余空间足够,就可以考虑用如下方式迁移。
pvmove /dev/sda1
(注:上述命令会智能地判断 sda1 属于哪个 VG,并把它的数据转移到【同一个 VG】的其它 PV)
如果你想手动干预。比如说:你想要指定 sda1 的数据全都转移到 sdb2,可以用如下命令:
pvmove /dev/sda1 /dev/sdb2
(注:上述命令的前提是:sdb2 有足够的剩余空间来容纳 sda1 已存储的数据)
步骤3
完成上述步骤之后,再执行如下命令,那么这个 VG 就【不再】包含 sda1 了。
vgreduce VG_XXX /dev/sda1
步骤4
完成上述命令之后,sda1 也不再属于任何 VG 了。但 sda1 还是会被 Linux 内核当成 PV 来看待。前面聊 pvcreate
的时候,俺说过:pvcreate
命令会往设备头部写入一个 LVM 的标志。
如果你要把这个 sda1 设备拿去作其它用途,不希望它继续被内核当作 PV,可以用如下命令清除该设备头部的 LVM 标志。
pvremove /dev/sda1
反之,如果你要把这个 PV 拿去给别的 VG 使用,就【不】需要执行上述 pvremove
命令。
◇LV 缩容
对 LV 缩容一定要小心。操作不当可能会导致 LV 关联的文件系统损坏。
LV 关联的文件系统,如果【类型】不同,“缩容”的操作步骤也会有差异。
下面以 ext4 文件系统为例,假定 VG 名称是 VG_XXX,LV 的名称是 lv_xxxx
步骤1
为了保险起见,在做这个操作之前,先备份 LV 相关的数据。
步骤2
用 umount 命令卸载 LV 对应的文件系统。
步骤3
用如下命令先检查一下文件系统,以防万一。
e2fsck -f /dev/VG_XXX/lv_xxxx
步骤4
用如下命令收缩文件系统的存储空间。在以下例子中,把存储空间降低到 25GB。
resize2fs /dev/VG_XXX/lv_xxxx 25G
(再次提醒:resize2fs 命令仅用于 ext 家族的文件系统)
步骤5
用如下命令把 LV 的存储空间也收缩到 25GB。
lvreduce -L 25G /dev/VG_XXX/lv_xxxx
◇删除 LV
假设你不想要某个 LV(包括它存储的数据),通过如下步骤把它干掉:
步骤1
先用 umount 命令卸载 LV 之上的文件系统(挂载点)
步骤2
假设该 LV 名叫 lv_xxxx
,VG 名叫 VG_XXX
,先用如下命令使之处于【不激活】状态。
lvchange -an /dev/VG_XXX/lv_xxxx
步骤3
最后用如下命令彻底删除该 LV。
lvremove /dev/VG_XXX/lv_xxxx
实战
vmware 中添加一块硬盘
可以看到新添加了一块大小为5G的磁盘 sdb,type为disk为磁盘
[root@localhost ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 19G 0 part ├─rhel-root 253:0 0 17G 0 lvm / └─rhel-swap 253:1 0 2G 0 lvm [SWAP] sdb 8:16 0 5G 0 disk sr0 11:0 1 3.8G 0 rom
pv vg lv详细步骤
1、将物理磁盘格式化为物理卷 [root@localhost /]# pvcrate /dev/sd sda sda1 sda2 sdb [root@localhost /]# pvcreate /dev/sdb Physical volume "/dev/sdb" successfully created. 2、创建卷组,将PV加入卷组 [root@localhost /]# vgcreate ninesunvg /dev/sdb Volume group "ninesunvg" successfully created 3、基于卷组创建逻辑卷 [root@localhost /]# lvcreate -n mylv -L 2G ninesunvg Logical volume "mylv" created. 4、为创建好的逻辑卷创建文件系统 [root@localhost /]# mkfs.xfs /dev/ninesunvg/mylv meta-data=/dev/ninesunvg/mylv isize=512 agcount=4, agsize=131072 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=4096 blocks=524288, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 5、将格式化好的文件系统挂载使用 [root@localhost /]# mount /dev/ninesunvg/mylv /data mount: mount point /data does not exist 注意需要挂载到一个已经存在的挂载点 [root@localhost /]# mount /dev/ninesunvg/mylv /data [root@localhost /]# df -hT Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/rhel-root xfs 17G 3.7G 14G 22% / devtmpfs devtmpfs 897M 0 897M 0% /dev tmpfs tmpfs 912M 0 912M 0% /dev/shm tmpfs tmpfs 912M 9.0M 903M 1% /run tmpfs tmpfs 912M 0 912M 0% /sys/fs/cgroup /dev/sda1 xfs 1014M 179M 836M 18% /boot tmpfs tmpfs 183M 28K 183M 1% /run/user/1000 /dev/mapper/ninesunvg-mylv xfs 2.0G 33M 2.0G 2% /data
常用其他指令
1、查看pv信息 pvdisplay pvs [root@localhost /]# pvs PV VG Fmt Attr PSize PFree /dev/sda2 rhel lvm2 a-- <19.00g 0 /dev/sdb ninesunvg lvm2 a-- <5.00g <3.00g 2、查看vg信息 vgdisplay vgs [root@localhost /]# vgs VG #PV #LV #SN Attr VSize VFree ninesunvg 1 1 0 wz--n- <5.00g <3.00g rhel 1 2 0 wz--n- <19.00g 0 3、查看lv信息 lvdisplay(详细) lvs [root@localhost /]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert mylv ninesunvg -wi-ao---- 2.00g root rhel -wi-ao---- <17.00g swap rhel -wi-ao---- 2.00g 4、删除一个lvm步骤 注意顺序不能打乱 1、删除lv 2、删除vg 3、删除物理卷
六 高阶实战
如何拉伸一个逻辑卷?
1、保证vg中有足够的空间
[root@localhost data]# vgs VG #PV #LV #SN Attr VSize VFree ninesunvg 1 1 0 wz--n- <5.00g <3.00g rhel 1 2 0 wz--n- <19.00g 0 [root@localhost data]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert mylv ninesunvg -wi-ao---- 2.00g root rhel -wi-ao---- <17.00g swap rhel -wi-ao---- 2.00g
swap rhel -wi-ao---- 2.00g
2、 扩充逻辑分区
[root@localhost data]# lvextend -L +1G /dev/ninesunvg/mylv Size of logical volume ninesunvg/mylv changed from 2.00 GiB (512 extents) to 3.00 GiB (768 extents). Logical volume ninesunvg/mylv successfully resized.
3、查看扩充后的lv大小
可以看到已经扩充为3G了,切挂载点还在且数据没有丢失,可正常访问。
[root@localhost data]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert mylv ninesunvg -wi-ao---- 3.00g root rhel -wi-ao---- <17.00g swap rhel -wi-ao---- 2.00g [root@localhost data]# mount|grep mylv /dev/mapper/ninesunvg-mylv on /data type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
4、为何df -hT的空间没有变化呢?
[root@localhost data]# df -hT|grep data /dev/mapper/ninesunvg-mylv xfs 2.0G 33M 2.0G 2% /data
逻辑卷属于底层的东西,操作系统要使用底层的空间都需要对其格式化,即必须要创建文件系统。
文件系统创建的时候大小已经固定了,mulv此文件系统创建好就是2G,拉伸了底层的空间,但是并没有更新其文件系统,这里需要格外注意没有更新mylv xfs这个文件系统。此时需要更新一下文件系统,请注意 xfs 格式化是需要xfs_growfs.
[root@localhost /]# resize2fs /dev/ninesunvg/mylv resize2fs 1.42.9 (28-Dec-2013) resize2fs: Bad magic number in super-block while trying to open /dev/ninesunvg/mylv Couldn't find valid filesystem superblock. [root@localhost /]# [root@localhost /]# xfs_growfs /dev/ninesunvg/mylv meta-data=/dev/mapper/ninesunvg-mylv isize=512 agcount=4, agsize=131072 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0 spinodes=0 data = bsize=4096 blocks=524288, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 data blocks changed from 524288 to 786432 [root@localhost /]#
如果是ext4 则使用resize2fs
[root@P1QMSPGPM01 mapper]# resize2fs /dev/rootvg/optlv resize2fs 1.41.12 (17-May-2010) Filesystem at /dev/rootvg/optlv is mounted on /opt; on-line resizing required old desc_blocks = 1, new_desc_blocks = 1 Performing an on-line resize of /dev/rootvg/optlv to 3145728 (4k) blocks. The filesystem on /dev/rootvg/optlv is now 3145728 blocks long.
此时df 查看就变成3G了
[root@localhost /]# df -hT|grep data /dev/mapper/ninesunvg-mylv xfs 3.0G 33M 3.0G 2% /data
实际上拉伸逻辑卷的原理就是将所属VG新的PE添加到LV中。
-----实战
root@P1QMSPL2RTM01 rootvg]# lvextend -L +10G /dev/rootvg/homelv Size of logical volume rootvg/homelv changed from 5.00 GiB (1280 extents) to 15.00 GiB (3840 extents). Logical volume homelv successfully resized [root@P1QMSPL2RTM01 rootvg]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/rootvg-rootlv 4.8G 429M 4.2G 10% / tmpfs 158G 0 158G 0% /dev/shm /dev/sda2 477M 33M 419M 8% /boot /dev/sda1 500M 272K 500M 1% /boot/efi /dev/mapper/rootvg-homelv 4.8G 4.4G 233M 95% /home /dev/mapper/rootvg-optlv 15G 5.4G 8.6G 39% /opt /dev/mapper/rootvg-tmplv 4.8G 12M 4.6G 1% /tmp /dev/mapper/rootvg-usrlv 9.8G 3.1G 6.2G 34% /usr /dev/mapper/rootvg-locallv 3.9G 1.6G 2.2G 43% /usr/local /dev/mapper/rootvg-varlv 4.8G 345M 4.3G 8% /var /dev/mapper/rootvg-aploglv1 20G 44M 19G 1% /aplog /dev/mapper/rootvg-datalv 9.8G 30M 9.2G 1% /data /dev/mapper/rootvg-redislv 818G 288G 489G 38% /redis [root@P1QMSPL2RTM01 rootvg]# resize2fs /dev/rootvg/homelv resize2fs 1.41.12 (17-May-2010) Filesystem at /dev/rootvg/homelv is mounted on /home; on-line resizing required old desc_blocks = 1, new_desc_blocks = 1 Performing an on-line resize of /dev/rootvg/homelv to 3932160 (4k) blocks. The filesystem on /dev/rootvg/homelv is now 3932160 blocks long. [root@P1QMSPL2RTM01 rootvg]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/rootvg-rootlv 4.8G 429M 4.2G 10% / tmpfs 158G 0 158G 0% /dev/shm /dev/sda2 477M 33M 419M 8% /boot /dev/sda1 500M 272K 500M 1% /boot/efi /dev/mapper/rootvg-homelv 15G 4.4G 9.6G 32% /home /dev/mapper/rootvg-optlv 15G 5.4G 8.6G 39% /opt /dev/mapper/rootvg-tmplv 4.8G 12M 4.6G 1% /tmp /dev/mapper/rootvg-usrlv 9.8G 3.1G 6.2G 34% /usr /dev/mapper/rootvg-locallv 3.9G 1.6G 2.2G 43% /usr/local /dev/mapper/rootvg-varlv 4.8G 345M 4.3G 8% /var /dev/mapper/rootvg-aploglv1 20G 44M 19G 1% /aplog /dev/mapper/rootvg-datalv 9.8G 30M 9.2G 1% /data /dev/mapper/rootvg-redislv 818G 288G 489G 38% /redis You have new mail in /var/spool/mail/root
-----实战
vg空间足时,就需要拉伸一个vg,如果有新的硬盘,可进行pv 然后把pv 加入到vg中。
1、将要添加的vg 格式化为PV
pv create /dev/sdc
2、将新的PV添加到指定的VG什么时候会用到该操作呢?
vgextend vgname /dev/sdc
例如线上服务磁盘空间不足了,逻辑卷又没有剩余空间了,这时就可以选择拉伸逻辑卷。注意该操作是online的。前提时必须个有空闲的硬盘。
如下图就是实际业务中,/redis 目录被撑爆了,但是vg 又没了,只能offline加硬盘上去。也有前辈实践过online加硬盘
Linux不重启的情况下添加硬盘 - ThinkDiff - 博客园
如何实现磁盘快照?
--update 2022年11月4日10:18:52
1、下面的命令创建一个大小为100mb的快照逻辑卷,命名为/dev/vg00/ snapshot。这将为命名为/dev/vg00/lvol1的源逻辑卷创建一个快照如果原始逻辑卷包含一个文件系统,
可以将快照逻辑卷挂载到任意目录上,原始文件系统继续更新的同时也会进行运行备份。对于特别重要的数据可以采取这种方式。
lvcreate --size 100M --snapshot --name snap /dev/vg00/lvol1
2、在创建快照逻辑卷之后,使用lvdisplay命令指定源卷将生成输出,其中包括所有快照逻辑卷及其状态(活动或不活动)的列表。
# lvdisplay /dev/new_vg/lvol0 --- Logical volume --- LV Name /dev/new_vg/lvol0 VG Name new_vg LV UUID LBy1Tz-sr23-OjsI-LT03-nHLC-y8XW-EhCl78 LV Write Access read/write LV snapshot status source of /dev/new_vg/newvgsnap1 [active] LV Status available # open 0 LV Size 52.00 MB Current LE 13 Segments 1 Allocation inherit Read ahead sectors 0 Block device 253:2
3、lvs显示快照实际使用空间。
lvs LV VG Attr LSize Origin Snap% Move Log Copy% lvol0 new_vg owi-a- 52.00M newvgsnap1 new_vg swi-a- 8.00M lvol0 0.20
使用LVM的一个疑问?
2020年8月9日13:59:09
在网上看到对新增硬盘上做lvm,都会先将磁盘用fdisk分区,然后再使用呢?不分区也能使用呀,例如上面 “pv vg lv详细步骤” 这个操作就是直接在裸硬盘上操作的,操作完全没有问题。
lvm本身支持直接硬盘 raid 和分区。但是这会埋下不安全的隐患。
摘自知乎:https://www.zhihu.com/question/30609658/answer/52253948
主要是安全性考虑。给硬盘分区就是宣布了“这个硬盘已经在用了”。因为大部分软件都默认你的硬盘是存在MBR的,如果找不到MBR可能就会有未定义行为。有的软件还可能自作主张的给你创建一个MBR,因为它觉得你这个硬盘是全新的。有的人看到只有sda没有sda1也可能自作主张给分区,比如说这个http://zhi.hu/mr3r
如果你的电脑只有自己在维护,原则上应该还是很安全的,我还没碰到那种自作主张的奇芭软件。多年来一直是把LUKS直接建立在sda上,然后在LUKS里做LVM。
看到这里就知道埋下什么不安全的隐患了,以后还是按照正常硬盘分区,再做LVM。
-- update 2022年11月4日09:21:05
xfs 格式化踩坑记
mkfs.xfs 和 xfs_growfs 是两个用于管理 XFS 文件系统的不同命令。它们的主要区别在于它们的用途和功能。
1.mkfs.xfs:这个命令用于在一个设备上创建一个新的 XFS 文件系统。它会初始化文件系统的元数据,如超级块、inode 和空闲空间等。通常在格式化一个新的磁盘分区或设备时使用此命令。例如:
mkfs.xfs /dev/sdb1
这个命令会在 /dev/sdb1 设备上创建一个新的 XFS 文件系统。也用来格式化新创建的lvm逻辑分区.
2.xfs_growfs:这个命令用于在线扩展一个已经存在的 XFS 文件系统。当你需要增加文件系统的容量时,可以使用此命令。在扩展文件系统之前,你需要先扩展底层的磁盘分区或逻辑卷。例如:
xfs_growfs /mnt/data
这个命令会扩展挂载在 /mnt/data 目录下的 XFS 文件系统。也用来格式化扩展的lvm逻辑分区.
实战
例如/dev/data-vg/lvk8s 是新创建的一个lv
[root@179-sc /k8s-cls/data]#lvcreate -L 2000G -n lvk8s data-vg Logical volume "lvk8s" created.
使用xfs_growfs 格式化就会报错,因为xfs_growfs 是在线扩展一个已经存在的 XFS 文件系统。
例如lvextend之后,df -h空间还没有变化,这时候就需要xfs_growfs进行格式化后,空间才会release给OS,df -h才可以看到
1.
[root@localhost ~]# xfs_growfs /dev/data-vg/lvk8s xfs_growfs: /dev/data-vg/lvk8s is not a mounted XFS filesystem [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# ll /dev/ | grep k8s [root@localhost ~]# ll /dev/mapper/ total 0 crw------- 1 root root 10, 236 Nov 2 16:12 control lrwxrwxrwx 1 root root 7 Nov 4 09:19 data--vg-lvk8s -> ../dm-4 lrwxrwxrwx 1 root root 7 Nov 3 17:30 data--vg-lv_k8s--sc1 -> ../dm-3 lrwxrwxrwx 1 root root 7 Nov 2 17:19 rhel-home -> ../dm-2 lrwxrwxrwx 1 root root 7 Nov 2 17:19 rhel-root -> ../dm-0 lrwxrwxrwx 1 root root 7 Nov 2 17:19 rhel-swap -> ../dm-1 [root@localhost ~]#
对于新创建的lv格式化应该使用mkfs.xfs
[root@localhost ~]# mkfs.xfs -f /dev/mapper/data--vg-lvk8s meta-data=/dev/mapper/data--vg-lvk8s isize=512 agcount=32, agsize=83886016 blks = sectsz=4096 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=4096 blocks=2684352512, imaxpct=5 = sunit=64 swidth=640 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=521728, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 [root@localhost ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 558.9G 0 disk ├─sda1 8:1 0 512M 0 part /boot/efi ├─sda2 8:2 0 1G 0 part /boot ├─sda3 8:3 0 282G 0 part │ ├─rhel-root 253:0 0 200G 0 lvm / │ ├─rhel-swap 253:1 0 32G 0 lvm [SWAP] │ └─rhel-home 253:2 0 50G 0 lvm /home └─sda4 8:4 0 275.4G 0 part sdb 8:16 0 91T 0 disk ├─data--vg-lv_k8s--sc1 253:3 0 1000G 0 lvm /k8s-sc1-1T └─data--vg-lvk8s 253:4 0 10T 0 lvm
别忘了自动挂载.
最后将lvm挂载到某个目录
mount /dev/data-vg/lvk8s-cls /clsK8/
mount /dev/data-vg/lvk8s-cls /clsK8/
格式化报错信息提示: