web-dev-qa-db-ja.com

マウントポイントからドライブのシリアル番号を取得するにはどうすればよいですか?

lsblk -o NAME,SERIAL,MOUNTPOINTの出力に次のものが含まれている場合

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

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

答えは必ずしもlsblkを使用する必要はありませんが、簡潔で、理想的には単純なbashスクリプトを使用する必要があります。

5
user779159

私が理解している限り、目標はコマンド入力をマウントポイントおよび出力シリアル番号として与えることです。まあ、少しの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:'

シリアル番号はlsblkにあり、GNU version1 of lsblkはJSONデータを出力できるので、Pythonのように機能するスクリプトをまとめました。2

$ ./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. lsblkの非GNUバージョンが存在するかどうかはわかりませんが、存在する場合-コメントを残してください

2.表示されているシリアル番号は、デモ目的で/dev/urandomから生成されたランダムな文字列です

0

これらのオプションは、見出しなしでディスクシリアルを印刷します: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'`
3
user34720