首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不知道安装点的情况下判断设备UUID已安装?

如何在不知道安装点的情况下判断设备UUID已安装?
EN

Unix & Linux用户
提问于 2019-03-31 00:47:09
回答 2查看 416关注 0票数 2

系统:LinuxMint19.1肉桂64位,基于Ubuntu18.04LTS.

我想知道是否有可能获得以下信息:

是否安装了 this UUID (块设备)?(不知道挂载点)

尽管如此,我已经和这半天一起玩了,我搞不懂。

我至少已经创建了一些工作代码,下面的非安装和电源两个USB硬盘驱动器。

当前的临时版本的代码如下所示:

代码语言:javascript
复制
dismount_and_poweroff_external_drives()
{
    name_external_drive_500gb_ntfs='500GB NTFS USB 2.0 HDD'
    name_external_drive_2_0tb_ext4='2.0TB Ext4 USB 3.0 HDD'
    uuid_external_drive_500gb_ntfs='xxxxxxxxxxxxxxxx' # censored
    uuid_external_drive_2_0tb_ext4='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' # censored
    path_external_drive_500gb_ntfs="/dev/disk/by-uuid/${uuid_external_drive_500gb_ntfs}"
    path_external_drive_2_0tb_ext4="/dev/disk/by-uuid/${uuid_external_drive_2_0tb_ext4}"

    tput bold; tput setaf 3; printf '%b' "\\n${name_external_drive_500gb_ntfs} un-mount\\n"; tput sgr0
    # info test ‘-b FILE’: True if FILE exists and is a block special device.
    if [ ! -b "${path_external_drive_500gb_ntfs}" ]
    then
        tput bold; tput setaf 4; printf '%b' "The device is not plugged in or powered on.\\n"; tput sgr0
    else
        if umount "${path_external_drive_500gb_ntfs}"
        then
            tput bold; tput setaf 2; printf '%b' "Un-mounting OK.\\n"; tput sgr0

            if udisksctl power-off --block-device "${path_external_drive_500gb_ntfs}"
            then
                tput bold; tput setaf 2; printf '%b' "Powering-off OK.\\n"; tput sgr0
            else
                tput bold; tput setaf 1; printf '%b' "Powering-off Failed.\\n"; tput sgr0
            fi

        else
            tput bold; tput setaf 1; printf '%b' "Un-mounting Failed.\\n"; tput sgr0
        fi
    fi

    printf '\n'

    tput bold; tput setaf 3; printf '%b' "\\n${name_external_drive_2_0tb_ext4} un-mount\\n"; tput sgr0
    # info test ‘-b FILE’: True if FILE exists and is a block special device.
    if [ ! -b "${path_external_drive_2_0tb_ext4}" ]
    then
        tput bold; tput setaf 4; printf '%b' "The device is not plugged in or powered on.\\n"; tput sgr0
    else
        if umount "${path_external_drive_2_0tb_ext4}"
        then
            tput bold; tput setaf 2; printf '%b' "Un-mounting OK.\\n"; tput sgr0

            if udisksctl power-off --block-device "${path_external_drive_2_0tb_ext4}"
            then
                tput bold; tput setaf 2; printf '%b' "Powering-off OK.\\n"; tput sgr0
            else
                tput bold; tput setaf 1; printf '%b' "Powering-off Failed.\\n"; tput sgr0
            fi

        else
            tput bold; tput setaf 1; printf '%b' "Un-mounting Failed.\\n"; tput sgr0
        fi
    fi

    printf '\n'
}

I忘记强调所接受的解决方案必须是 POSIX-ly写的。

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2019-03-31 04:17:21

原解

代码语言:javascript
复制
UUID=
mount | egrep $(readlink -f /dev/disk/by-uuid/${UUID}) && echo mounted

弗拉斯提米的S笔记

  • 使用-e而不是-f可能是个好主意,来自readlink help:-e --规范化--通过递归地跟踪给定名称的每个组件中的每个符号链接,所有组件都必须存在,而不是:-f,--通过递归地跟踪给定名称的每个组件中的每个符号链接来实现规范化;据我所知,除最后一个组件之外,所有组件都必须存在, -e there保证整个路径存在,可能更好,需要额外的验证或引用。<#>Unfortunately,发现 -e option不符合POSIX-,因此运气不好。将所有信息留在这里供将来参考。
  • 原解中没有双引号,我建议将它们与one尾部空间一起添加,作为安全措施,以避免匹配,例如sda11或类似的。
  • 您还可以利用POSIX-defined fgrep to匹配来实现一个固定的字符串,或者更好的是只匹配使用grep "^dev_name"的这个设备开始的行。
  • 正如马克·普罗尼克所指出的,mount本身可能不是POSIX-defined,同样,引用也很方便,但是无论如何,我已经更改了代码,使其直接从/proc/mounts读取。

有理函数

用于检查UUID是否已挂载的resulting函数看起来类似于:

代码语言:javascript
复制
is_uuid_mounted()
{
    readlink_output=$( readlink -f /dev/disk/by-uuid/"${1}" )
    [ -n "${readlink_output}" ] &&
        grep -F "${readlink_output} " /proc/mounts > /dev/null 2>&1
}

全工作脚本

代码语言:javascript
复制
#!/bin/sh

set -eu

translate_uuid_to_device_name()
{
    # Linux-specific; needs *BSD revision
    readlink -f -n /dev/disk/by-uuid/"${1}"
}

is_uuid_mounted()
{
    device_name=$( translate_uuid_to_device_name "${1}" )

    if [ -n "${device_name}" ]
    then
        # 1. basic regex should be working across platfotms
        #    tested on FreeBSD, OpenBSD, NetBSD with success
        #    I prefer the starting with (^) rather than filtering throung all text
        # 2. /proc/mounts is not available on all *BSDs, needs revision
        proc_mounts=$( grep "^${device_name} " /proc/mounts )
        [ -n "${proc_mounts}" ]
    fi
}

# Simplest Usage Example
if is_uuid_mounted "PUT_SOME_UUID_IN_HERE"
then
    echo "This UUID is mounted."
else
    echo "This UUID isn't mounted."
fi

请随时在评论中讨论进一步的问题。

票数 4
EN

Unix & Linux用户

发布于 2019-03-31 08:28:27

如果findmnt可用,您可以尝试:

代码语言:javascript
复制
test "$(findmnt -S UUID=$UUID)" || echo $UUID not mounted
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/509678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档