마운트 지점을 모르고 장치 UUID가 마운트되었는지 확인하는 방법은 무엇입니까?

마운트 지점을 모르고 장치 UUID가 마운트되었는지 확인하는 방법은 무엇입니까?

시스템: Linux Mint 19.1 Cinnamon 64비트, Ubuntu 18.04 LTS 기반.


다음 정보를 얻을 수 있는지 궁금합니다.

이 UUID(블록 장치의) 블록 장치가 설치되어 있습니까? (마운트 지점을 모릅니다)

하지만 오랫동안 플레이해 왔지만 여전히 이해할 수 없습니다.

나는 적어도 창조했다일부아래 작업 코드는 두 USB 하드 드라이브를 모두 마운트 해제하고 종료합니다.


내 코드의 현재 임시 버전은 다음과 같습니다.

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'
}

나는 수용된 해결책이 다음과 같아야 한다는 점을 강조하는 것을 잊었습니다.POSIX- 썼어요.

답변1

독창적인 솔루션

UUID=<device_uuid>
mount | egrep $(readlink -f /dev/disk/by-uuid/${UUID}) && echo mounted

블라디미르노트

  • -e대신 도움말을 사용하는 -f것이 좋습니다 readlink.

    -e, --canonicalize-existing   canonicalize by following every symlink in
                                  every component of the given name recursively,
                                  all components must exist
    

    비교:

    -f, --canonicalize            canonicalize by following every symlink in
                                  every component of the given name recursively;
                                  all but the last component must exist
    

    내가 아는 한,-e보장추가 검증이나 인용이 필요한 전체 경로가 존재하는 것이 더 나을 수도 있습니다.안타깝게도 -e이 옵션을 사용할 수 없는 것으로 확인되었습니다.POSIX- 준수하니 운이 없군요.나중에 참조할 수 있도록 여기에 모든 정보를 남겨주세요.

  • 에는 큰따옴표가 없습니다.독창적인 솔루션, 다음과 결합하는 것이 좋습니다.보안 조치로서의 후행 공백예를 들어 또는 이와 유사한 일치를 피하기 위해 sda11.

  • 사람들은 또한 이점을 누릴 수 있습니다POSIX-정의fgrep고정 문자열 일치, 또는 해당 장치로 시작하는 줄만 일치시키는 것이 더 좋습니다 grep "^dev_name".

  • 지적한대로마크 플롯닉, mount그 자체는 그렇지 않을 수도 있습니다POSIX-define, 다시 말하면 참조가 편리하겠지만 /proc/mounts어쨌든 직접 읽을 수 있도록 코드를 변경했습니다.


합리적인 기능

이것결과 함수UUID가 설치되어 있는지 확인하는 데 사용됩니다.할 수 있다다음과 유사해 보입니다:

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
}

완전한 작업 스크립트

#!/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

더 많은 질문은 댓글로 남겨주세요.

답변2

findmnt를 사용할 수 있는 경우 다음을 시도해 볼 수 있습니다.

test "$(findmnt -S UUID=$UUID)" || echo $UUID not mounted

관련 정보