Numer seryjny dysku twardego systemu Linux jako użytkownik inny niż root

15

Przede wszystkim chciałbym przeprosić za nieuwzględnienie szczegółów sprzętu. To dlatego, że szukam polecenia, które będzie działać we wszystkich dystrybucjach Linuksa.

Pytanie:

Jestem bardzo nowy w Linuksie i nie wiem zbyt wiele, jednak czy możliwe jest odzyskanie numeru seryjnego dysku twardego działającego jako użytkownik inny niż root. Wiem, że są dostępne polecenia do pobierania tych informacji uruchomionych przy użyciu sudo. Potrzebuję jednak sposobu na odzyskanie tych informacji bez uruchamiania jako sudo.

Wszelkie sugestie będą mile widziane.

Z poważaniem,

Mustafa

Mustafa
źródło

Odpowiedzi:

19

W większości obecnych dystrybucji numery seryjne dysku twardego są przechowywane w bazie danych udev, do której można uzyskać zapytania bez uprawnień roota:

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

(wygląd ID_SERIAL, ID_SERIAL_SHORT; istnieją również /dev/disk/by-id/ata-*dowiązania do napędów ATA na podstawie tych wartości).

udiskszapewnia interfejs wyższego poziomu do tych danych i nie tylko (daje również dostęp do atrybutów SMART bez konieczności posiadania uprawnień roota, które byłyby potrzebne do wywoływania, np. smartctlbezpośrednio).

Siergiej Własow
źródło
Masz rację, właśnie wypróbowałem udisks --show-info.__ Ale__ należy zauważyć, że gdy jest używany w trybie wsadowym lub ogólnie w skryptach, udisksjest DROGA wolniejszy niż udevadm.
składnia błąd
6

Innym sposobem, który zwykle działa, jest:

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

Oto jedna linijka, która umożliwia szybkie wyliczenie numeru napędu i modelu / numeru seryjnego:

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

Lub dla zdalnych maszyn:

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'"

Następnie możesz dalej przetwarzać to wyjście. W przypadku większości typów dysków drugim ciągiem w wierszu jest MODEL_SERIAL.

Chriswall
źródło
2

Jak powiedział womble, bez dostępu do roota lub przyznania uprawnień typu root do jakiegoś procesu, nie można tego osiągnąć. Ponieważ jednak mówisz, że jesteś nowicjuszem, pozwól, że zwrócę uwagę na przydatne polecenie o nazwie lshw.

Janne Pikkarainen
źródło
Dziękuję zarówno Womble, jak i tobie, bardzo mile widziane. Zbadam polecenie, o którym wspominałeś.
1

Bez przyznania uprawnień typu root do jakiegoś procesu, nie można tego osiągnąć. Nawet jako root nie możesz tego zrobić w niektórych konfiguracjach sprzętowych.

womble
źródło
Dzięki za szybką odpowiedź Womble. Spróbuję.
mustafa
0

Linki w / dev / disk / by-id są tworzone przez udev. W pliku /etc/udev/rules.d/50-udev.rules można znaleźć takie linie:

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}"

Niestety znalezienie tego by-iddowiązania symbolicznego z nazwy urządzenia nie jest trywialne . Ale istnieje co najmniej jeden bezpośredni sposób:

$ 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

Zwracana jest lista rozdzielona spacjami. Więc by-idmożna znaleźć ścieżkę.

Lub Możesz bezpośrednio uzyskać „seryjny” numer seryjny:

$ 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

W ID_SERIALostatnim znaku podkreślenia można uzyskać numer seryjny.

Jak widzę, numer seryjny może zawierać znaki alfanumeryczne i „-” (mam takie dyski SCSI). Czy ktoś zna jakieś ograniczenia dotyczące numeru seryjnego? Jeśli może zawierać „_”, to ta metoda nie jest kuloodporna.

ID_MODELKlucz może być używany do zlokalizować dokładniej początek numeru seryjnego, jak (wydaje mi się) swoje pierwsze 15 znaków są dodawane do ID_SERIAL(spacjami zamienionymi „_”).

Prawda
źródło
„udevinfo” nie działało dla mnie tutaj na Ubuntu. Jednak następujący linijka zrobiła dokładnie to, co chciałem: udevadm info -q property -xn sda | awk -F\' '/ID_SERIAL_SHORT/{print $2}'Oczywiście -q propertymożna to pominąć, ale zawsze uważam, że marnowanie zasobów pozwala udevadmwydawać dodatkowe linie, których w ogóle nie potrzebujemy.
składniaerror