我需要编写一个脚本来检查系统上是否存在 LVM。如果 LVM 存在,那么它将执行某些步骤,否则它将执行其他步骤。
我的问题是如何找到一种通用方法来查找 lvm 名称及其挂载点。我尝试从 lvdisplay 命令获取 lv 名称和 vg 名称,然后从 mount 中 grep 它。
LV_Name=`sudo lvdisplay | sed -n '3,4p' | sed -n '1p' | awk '{print $3}'`
VG_Name=`sudo lvdisplay | sed -n '3,4p' | sed -n '2p' | awk '{print $3}'`
echo -e "VG_Name is $VG_Name. \nLV_Name is $LV_Name".
lv_device_name=`echo $VG_Name-$LV_Name`
echo "LVM device name is $lv_device_name"
mount_point=`mount | grep $lv_device_name | awk '{print $3}'`
if [ $? -eq 0 ]
then
echo "$mount_point is the mount point for $lv_device_name"
else
echo "No LVM found"
fi
但现在的问题是,无论 *nix 平台如何,这都不是通用的。
这是Ubuntu14.04特定的脚本,这里lvm挂载点是/mnt/lvm
lv名称是lvm_testing-lvnamefortest
。
在 Debian 机器上,同样是/dev/mapper/deb--all--lvm01-usr
打开的/usr
,但是从上面的命令返回的 lvm 名称是deb-all-lvm01-usr
。
是否有适用于所有平台(如 RHEL、CentOS、Ubuntu、Debian 等)的通用命令或步骤?
答案1
您的脚本比需要的要复杂得多,并且存在一些问题:
- 您使用反引号而不是
$()
. - 您的脚本将忽略除它找到的第一个逻辑卷之外的所有逻辑卷。
- 您假设缺少 lvpath 的安装点意味着不存在逻辑卷。这种假设是完全错误的。
- 两者
lvs
都lvdisplay
已经告诉您 LV 路径中的设备名称,无需对其命名方式做出任何假设或猜测。 lvs
lvdisplay
具有比或更灵活的输出选项vgdisplay
。
尝试更像这样的事情:
#! /bin/bash
lvcount=0
while read lvname vgname lvpath ; do
lvcount=$((lvcount+1))
printf "VG_Name is %s.\nLV_Name is %s.\n" "$vgname" "$lvname"
echo "LVM Device name is $lvpath"
mp=$(mount | grep "$lvpath" | awk '{print $3}')
if [ -n "$mp" ] ; then
echo "$mp is the mount point for $lvpath"
else
echo "$lvpath is not mounted."
fi
echo
done < <(lvs --no-headings -o lv_name,vg_name,lv_path)
echo "Found $lvcount logical volumes."