マウントポイントがわからず、デバイス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

その他の質問はコメントとして残してください。

おすすめ記事