마운트 지점에서 드라이브 일련 번호를 얻는 방법은 무엇입니까?

마운트 지점에서 드라이브 일련 번호를 얻는 방법은 무엇입니까?

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. 표시된 일련번호는 데모 목적으로 생성된 임의의 문자열입니다.

관련 정보