如何获取lvm挂载点(通用)

如何获取lvm挂载点(通用)

我需要编写一个脚本来检查系统上是否存在 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/lvmlv名称是lvm_testing-lvnamefortest

在 Debian 机器上,同样是/dev/mapper/deb--all--lvm01-usr打开的/usr ,但是从上面的命令返回的 lvm 名称是deb-all-lvm01-usr

是否有适用于所有平台(如 RHEL、CentOS、Ubuntu、Debian 等)的通用命令或步骤?

答案1

您的脚本比需要的要复杂得多,并且存在一些问题:

  1. 您使用反引号而不是$().
  2. 您的脚本将忽略除它找到的第一个逻辑卷之外的所有逻辑卷。
  3. 您假设缺少 lvpath 的安装点意味着不存在逻辑卷。这种假设是完全错误的。
  4. 两者lvslvdisplay已经告诉您 LV 路径中的设备名称,无需对其命名方式做出任何假设或猜测。
  5. lvslvdisplay具有比或更灵活的输出选项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."

相关内容