2013-11-12 5 views
4

Я создаю программу на C/C++, которая должна прочитать серию HD. Я знаю, что если я бегу эти команды:Как читать HD-сериал в Linux без привилегий root?

hdparm -i /dev/sda | grep -i serial 

/sbin/udevadm info --query=property --name=sda | grep "ID_SERIAL" 

я могу получить его, прежде всего, требует прав суперпользователя, но второй нет.

Однако мое приложение не может получить доступ к внешним программам и не может требовать привилегий от root, так же есть ли библиотека Linux C/C++, которая имеет функцию, которая возвращает серию HD? Или есть другой способ, который не требует запуска программы?

+0

Помните, что '' hdparm' и udevadm' программы, как и большинство из любого другого ядра утилитами Linux, с открытым исходным кодом. Так почему бы просто не скачать источник им и проверить, что они делают? –

+0

Мое предположение: вам нужно открыть '/ bin/sda' и использовать IOCTL для чтения серийного номера. –

+0

Спасибо, конечно, вариант, хотя понять код и реплицировать его можно очень сложно, возможно, есть более простое решение. – Chicoscience

ответ

4

Просто зарегистрировав каталог /dev/disk/by-id/, вы получите идентификаторы всех блочных устройств в вашей системе. Выход не совсем то же самое, что и с командами, но он достаточно близко.

Для этого вам не нужны привилегии root.


На моем компьютере:

$ /sbin/udevadm info --query=property --name=sda | grep "ID_SERIAL" 
ID_SERIAL=WDC_WD5000AAKX-60U6AA0_WD-WCC2EHJ93860 
ID_SERIAL_SHORT=WD-WCC2EHJ93860 

и

$ ll /dev/disk/by-id/ | grep sda 
lrwxrwxrwx 1 root root 9 Nov 11 07:47 ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2EHJ93860 -> ../../sda 
lrwxrwxrwx 1 root root 10 Nov 11 07:47 ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2EHJ93860-part1 -> ../../sda1 
lrwxrwxrwx 1 root root 10 Nov 11 07:47 ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2EHJ93860-part2 -> ../../sda2 
lrwxrwxrwx 1 root root 10 Nov 11 07:47 ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2EHJ93860-part3 -> ../../sda3 
+0

Это выглядит великолепно! – Chicoscience

2

Вы можете использовать ioctls для доступа к информации на жестком диске, как это делает hdparm. HDIO_GET_IDENTITY ioctl должен быть достаточным для ваших нужд. Он возвращает структуру, в которую (IIRC) входит серийный номер; googling around поможет вам найти определение структуры.

+2

Проблема в том, что для этого требуются привилегии root, и я не могу требовать этого от своей программы. Спасибо в любом случае – Chicoscience

Смежные вопросы