マウントポイントからドライブのシリアル番号を取得するには?

マウントポイントからドライブのシリアル番号を取得するには?

lsblk -o NAME,SERIAL,MOUNTPOINT出力に以下が含まれている場合

sdb                                           X55MM4827123
└─sdb1
  └─luks-4d0dc651-9aa6-452d-9442-7b33d95f8427                /run/media/main/mydrive

X55MM4827123マウントポイント(この場合)を提供するときにシリアル番号(この場合)を取得するために使用できる単純なコンソール/ CLIコマンドは何ですか/run/media/main/mydrive

答えを使用する必要はありませんが、lsblk簡潔でなければならず、単純なbashスクリプトを使用することをお勧めします。

答え1

次のオプションは、ヘッダーなしでディスクのシリアル番号を印刷します。lsblk -n -o SERIAL /dev/sda

オプションの説明はマンページにあります。

-n, --noheadings
Do not print a header line.

Serial:このオプションはコマンド出力からヘッダーを削除します。

-o, --output list
Specify which output columns to print. Use --help to get a list of all supported columns.

ディスクについて印刷する情報を選択してください。

シリーズを提供するのに十分です。残念ながら、lsblkシリアル番号はパーティションではなくディスクの属性なので、マウントポイントでは機能しません。見学するsynopsis

Synopsis

lsblk [options]
lsblk [options] device...

マウントポイントからパーティションを抽出し、ディスク情報を整理し、それを引数として提供するには多くの努力が必要ですlsblk。これで成功することができます。

mount| grep /run/media/main/mydrive | awk 'NR==1{print $1}'|sed 's/[0-9]*//g'

mountすべてのマウントポイントが一覧表示され、マウントポイントの行がフェッチgrepされ、awkパーティション列がフェッチされ、sedパーティションを表す番号が削除されます。要約すると、次のようになります。

lsblk -n -o SERIAL `mount| grep /run/media/main/mydrive | awk 'NR==1{print $1}'|sed 's/[0-9]*//g'`

答え2

私が理解しているように、目標はマウントポイントにコマンドを入力し、シリアル番号を出力することです。まあ、少しawk魔法とパッケージを使用する小さなスクリプトで可能ですsmartmontools

デモ2 :

$ ./mount2serial.sh /                                                                                                    
[sudo] password for xieerqi: 
Serial Number:    4G7AA3Q1HSZ4HH4YN
$ ./mount2serial.sh /mnt/HDD                                                                                             
[sudo] password for xieerqi: 
Serial Number:    4O75CEXFLML9M

スクリプト自体は次のとおりです。

#!/usr/bin/env bash

if [ "$1" = "/"  ]
then
    dev=$(awk -v mount="$1" '$2 == mount{print $1}' /proc/self/mounts)
else
    dev=$(awk -v mount="$1" '$0 ~ mount{print $1}' /proc/self/mounts)
fi
sudo smartctl -i "$dev" | grep 'Serial Number:'

からシリアル番号を取得し、lsblkGNUバージョン1はJSONデータを出力できるため、次のようにlsblk 動作するPythonスクリプトを設定しました。

$ ./mount2serial.py '/mnt/ubuntu'
4O75CEXFLML9M
xie@xie-PC:~$ ./mount2serial.py '/'
B4VOM8OEIZIHF
#!/usr/bin/env python3

import json
import subprocess
import sys

lsblk = subprocess.run(['lsblk','-J','-o','NAME,SERIAL,MOUNTPOINT'],stdout=subprocess.PIPE)
for dev in json.loads(lsblk.stdout.decode())['blockdevices']:
    serial = ''
    # find serial number of current block device
    for key,value in dev.items():
        if key == 'serial':
            serial = value
            break
    # we don't need to iterate through everything in dev.items()
    for child in dev['children']:
        if child['mountpoint'] == sys.argv[1]:
            print(serial)
            sys.exit(0)
# if nothing is found we end up here with exit status 1 and nothing printed
sys.exit(1)

1. GNU以外のバージョンがあるかどうかはわかりませんがlsblk、ある場合はコメントを残してください。

/dev/urandom2. 表示されるシリアル番号は、デモ目的で生成された任意の文字列です。

関連情報