루트가 아닌 Linux 하드 드라이브 일련 번호


15

우선, 하드웨어 세부 사항을 포함하지 않은 것에 대해 사과드립니다. 모든 Linux 배포판에서 작동하는 명령을 찾고 있기 때문입니다.

질문:

나는 리눅스를 처음 접했고 많이 모르지만 루트가 아닌 것으로 실행되는 하드 드라이브 일련 번호를 검색하는 것이 가능합니까? sudo를 사용 하여이 정보를 검색하는 데 사용할 수있는 명령이 있음을 알고 있습니다. 그러나 sudo로 실행하지 않고이 정보를 검색하는 방법이 필요합니다.

어떤 제안이라도 높이 평가할 것입니다.

감사합니다.

무스타파

답변:


19

대부분의 현재 배포에서 HDD 일련 번호는 udev 데이터베이스에 저장되며 루트 권한없이 쿼리 할 수 ​​있습니다.

/sbin/udevadm info --query=property --name=sda

(보기를 위해 ID_SERIAL, ID_SERIAL_SHORT;도있다 /dev/disk/by-id/ata-*그 값을 기준으로 ATA 드라이브에 대한 심볼릭 링크).

udisks이러한 데이터에 대한보다 높은 수준의 인터페이스를 제공합니다 (예 : smartctl직접 호출하는 데 필요한 루트 권한없이 SMART 속성에 액세스 할 수도 있음).


당신은 옳습니다. udisks --show-info.__ But__ 시도했습니다. 배치 모드 또는 일반적으로 스크립트에서 사용될 udisks때보 다 느립니다 udevadm.
syntaxerror

6

일반적으로 작동하는 다른 방법은 다음과 같습니다.

ls -l /dev/disk/by-id/

다음은 드라이브 및 모델 / 일련 번호의 빠른 열거를 제공하는 하나의 라이너입니다.

ls -l /dev/disk/by-id/ | grep scsi- | grep -v part | awk '{print $NF " " $(NF-2)}' | sed 's|../../||g' | sed 's/scsi-...._//g'  

또는 원격 시스템의 경우 :

ssh $host "ls -l /dev/disk/by-id/ | grep scsi- | grep -v part | awk '{print \$NF \" \" \$(NF-2)}' | sed 's|../../||g' | sed 's/scsi-...._//g'"

그런 다음이 출력을 추가로 처리 할 수 ​​있습니다. 대부분의 드라이브 유형에서 줄당 두 번째 문자열은 MODEL_SERIAL입니다.


2

womble이 말했듯이 루트 액세스 권한이 없거나 일부 프로세스에 루트 권한을 부여하지 않으면이를 달성 할 수 없습니다. 그러나 당신이 초보자라고 말했기 때문에이라는 편리한 명령에 대해 알려 드리겠습니다 lshw.


Womble과 본인 모두에게 감사합니다. 대단히 감사합니다. 언급 한 명령을 조사하겠습니다.

1

일부 프로세스에 루트 권한을 부여하지 않으면이를 달성 할 수 없습니다. 루트로도 일부 하드웨어 구성에서는 할 수 없습니다.


빠른 답변 Womble에 감사드립니다. 나는 그것을 줄 것이다.
mustafa

0

/ dev / disk / by-id 아래의 링크는 udev에 의해 작성됩니다. /etc/udev/rules.d/50-udev.rules에서 다음 줄을 찾을 수 있습니다.

KERNEL=="sd*[!0-9]|sr*", SYSFS{ieee1394_id}=="*", ENV{ID_SERIAL}="$sysfs{ieee1394_id}", ENV{ID_BUS}="ieee1394"
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}=="", IMPORT{program}="/lib/udev/usb_id -x"
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}=="", IMPORT{program}="/lib/udev/scsi_id -g -x -s %p -d $tempnode"
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}=="", IMPORT{program}="/lib/udev/scsi_id -g -x -a -s %p -d $tempnode"
KERNEL=="nst[0-9]*|st*|sd*[!0-9]|sr*|dasd*[!0-9]|cciss?c", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}"

불행히도 by-id장치 이름 에서이 심볼릭 링크 를 찾는 것은 쉽지 않습니다 . 그러나 최소한 하나의 직접적인 방법이 있습니다.

$ udevinfo -q path -n /dev/sda
/block/sda
$ udevinfo -q symlink -p /block/sda
disk/by-id/scsi-SATA_KINGSTON_SVP100_31JY100MY5SK disk/by-path/pci-0000:00:11.0-scsi-0:0:0:0

공백으로 구분 된 목록이 반환됩니다. 그래서 by-id경로를 찾을 수 있습니다.

또는 "복합"일련 번호를 직접 얻을 수 있습니다.

$ udevinfo -q env -p /block/sda
ID_VENDOR=ATA
ID_MODEL=KINGSTON_SVP100S
ID_REVISION=CJR1
ID_SERIAL=SATA_KINGSTON_SVP100_31JY100MY5SK
ID_TYPE=disk
ID_BUS=scsi
ID_PATH=pci-0000:00:11.0-scsi-0:0:0:0

에서 ID_SERIAL후 마지막 밑줄 당신은 일련 번호를 얻을 수 있습니다.

보시다시피 일련 번호에는 영숫자 문자와 '-'가 포함될 수 있습니다 (이러한 SCSI HDD가 있습니다). 누구든지 일련 번호에 대한 제한을 알고 있습니까? '_'를 포함 할 수 있으면이 방법은 방탄이 아닙니다.

ID_MODEL키는 일련 번호의 시작 부분을보다 정확하게 지역화하는 데 사용할 수 있습니다. 첫 15 문자가 ID_SERIAL(_로 대체 된 공백)에 추가 되었기 때문 입니다.


우분투에서 "udevinfo"가 여기서 작동하지 않았습니다. 그러나 다음의 한 줄짜리가 내가 원하는 것을 정확하게 수행했습니다. udevadm info -q property -xn sda | awk -F\' '/ID_SERIAL_SHORT/{print $2}'물론 -q property생략 할 수는 있지만 항상 udevadm필요없는 추가 라인을 출력하는 것은 리소스 낭비라고 생각합니다 .
syntaxerror
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.