一键自动创建删除磁盘的逻辑卷信息
最近在研究逻辑卷相关的知识,考虑到每次手动去清除硬盘上的逻辑卷信息和创建逻辑卷信息步骤比较繁琐,所以写了一个脚本来快速帮助我们实现目的。
方式一:通过指定硬盘去操作(相对灵活)
创建测试硬盘分区信息
因为我们后边需要在一块准备好的硬盘上边创建逻辑卷,所以我准备了一个测试脚本来帮助我们划分硬盘,可供参考。
#!/bin/sh
disk=$1
if [ $# -lt 1 ]; then
echo "请指定一个磁盘设备作为参数(例如sda)"
exit
fi
echo "磁盘名字为:"$disk
#---------------------------------------------------
parted /dev/$disk <<EOF
rm 1
rm 2
rm 3
rm 4
rm 5
rm 6
rm 7
rm 8
rm 9
quit
EOF
parted -s /dev/$disk mklabel gpt
parted /dev/$disk <<EOF
mkpart primary 0% 100
mkpart primary 100 1G
mkpart primary 1G 2G
mkpart primary 2G 3G
mkpart primary 3G 4G
mkpart primary 4G 5G
quit
EOF
sleep 3
mkfs.xfs -f /dev/${disk}1
mkfs.xfs -f /dev/${disk}2
mkfs.xfs -f /dev/${disk}3
mkfs.xfs -f /dev/${disk}4
mkfs.xfs -f /dev/${disk}5
mkfs.xfs -f /dev/${disk}6
#---------------------------------------------------
创建逻辑卷
这里我对硬盘划分了6个分区,对最后一个分区进行了逻辑卷操作,分配了分区的所有空间给逻辑卷。
注意: vgdata (卷组),一个环境中的卷组只有一个,不能在多块硬盘或多个分区中用同样的卷组名字。
#!/bin/sh
disk=$1
if [ $# -lt 1 ]; then
echo "请指定一个磁盘设备作为参数(例如sda)"
exit
fi
echo "磁盘名字为:"$disk
#制作逻辑卷,分区6做成逻辑卷
pvcreate -f /dev/${disk}6
vgcreate vgdata /dev/${disk}6
lvcreate -l 100%VG -n lvdata vgdata
echo "创建逻辑卷操作完毕!"
删除逻辑卷
删除逻辑卷不仅是需要删除整块硬盘上的逻辑卷,也包含了这块硬盘分区做的逻辑卷信息。
#!/bin/sh
disk=$1
if [ $# -lt 1 ]; then
echo "请指定一个磁盘设备作为参数(例如sda)"
exit
fi
echo "磁盘名字为:"$disk
#检测当前磁盘及其分区是否有逻辑卷
diskList=`lsblk -o NAME,TYPE | grep -E "disk|part" | grep $disk | awk '{print $1}' | sed 's/├─//g' | sed 's/└─//g'`
echo $diskList
#对每个磁盘或分区执行 LVM 检查
for disk in $diskList; do
diskName="/dev/$disk"
pv_check=`pvdisplay $diskName 2>/dev/null`
if [ $? -eq 0 ]; then
echo "$diskName 是物理卷"
#获取卷组名称,删除卷组可以同时删除掉逻辑卷
vgName=`pvscan | grep $diskName | awk '{print $4}'`
echo "$diskName 的卷组是:$vgName"
vgremove -f $vgName
#删除物理卷
pvremove -f $diskName
#清除磁盘的文件系统信息
wipefs -a $diskName
else
echo "$diskName 不是物理卷"
fi
done
echo "删除逻辑卷操作完毕!"
方式二:直接全盘删除操作(扫描出来的硬盘均清理,干净彻底)
删除逻辑卷信息
#!/bin/sh
# 删除所有逻辑卷
echo "删除所有逻辑卷..."
lvscan | grep "ACTIVE" | awk '{print $2}' | sed 's/[[:space:]]//g' | sed 's/"//g' | while read lv_path; do
# 去除路径两端的空白字符
lv_path=$(echo "$lv_path" | xargs)
# 检查逻辑卷路径是否有效
if [ -b "$lv_path" ]; then
echo "删除逻辑卷: $lv_path"
lvremove -f "$lv_path"
else
echo "跳过无效路径: $lv_path"
fi
done
# 删除所有卷组
echo "删除所有卷组..."
vgs --noheadings -o vg_name | while read vg_name; do
echo "删除卷组: $vg_name"
vgremove -f "$vg_name"
done
# 删除所有物理卷
echo "删除所有物理卷..."
pvs --noheadings -o pv_name | while read pv_name; do
echo "删除物理卷: $pv_name"
pvremove -f "$pv_name"
done
# 清除磁盘的文件系统信息
echo "清除磁盘的文件系统信息..."
for disk in /dev/sd?; do
if [ -b "$disk" ]; then
echo "清除 $disk 的文件系统信息..."
wipefs -a "$disk"
fi
done