LINUX.ORG.RU
ФорумAdmin

получить уникальный идентификатор машины

 


1

1

Постоянно использую один внешний hdd, загружая с него Linux систему на разных машинах. Хочу написать скрипт для автоматизации рутинных действий по индивидуальной настройке hardware с вызовом разных программ для разных машин.

Т.е. напр.
If (Home)
cp /etc/X11/xorg-home.conf. /etc/X11/xorg.conf

if (Notebook)
/etc/init.d/wpa_supplicant start
и т.п

Вот только как отличать друг от друга различные компьютеры в скрипте? Нужен уникальный идентификатор машины.
По смыслу подошел бы например серийный номер. мат. платы, процессора или что-то в этом духе, но как получить эту информацию в скрипте я не знаю.
Думал про легко доступные вещи типа MAС-адреса сетевых карточек и серийников hdd но это будет не очень надежно (сетевух может быть много, hdd может поменяться и тп.).
Есть ли ещё какие-то доступные из скрипта id, которые можно использовать в качестве уникального идентификатора машины?



Последнее исправление: Dblmok (всего исправлений: 1)

Может подойдёт вывод dmidecode.

mky ★★★★★
()
Ответ на: комментарий от f1xmAn

Только не hostname, а hostid. Хотя это все равно что взять mac от первой сетевой карты в системе, вроде от него вычисляется. Главное чтобы /etc/hostid не сушествовал.

anonymous
()
Ответ на: комментарий от Bagrov

$ cpuid | grep «Processor serial»
Processor serial: 0001-06CA-0000-0000-0000-0000

└► cpuid | grep "Processor serial"
bash: cpuid: command not found...
dexpl ★★★★★
()
Ответ на: комментарий от varchar

#modprobe eeprom

└► sudo modprobe eeprom && dmidecode | grep UUID
[sudo] password for dexpl: 
/dev/mem: Permission denied

От рута dmidecode возвращает искомый UUID безо всяких modprobe eeprom, но насколько я понял условие задачи, рута может и не быть. Не говоря уже о том, что modprobe сам по себе требует рута.

dexpl ★★★★★
()
Ответ на: комментарий от dexpl

Может не eeprom, у меня он тоже не загружен, i2c может быть... Не важно, раз от рута работает.

dmidecode от юзера у меня «not found», cpuid - работает.

varchar
()
Ответ на: комментарий от varchar

dmidecode от юзера у меня «not found»

А у меня «/dev/mem: Permission denied» даже после добавления юзера в группу kmem и выдаче kmem прав на запись в /dev/mem (право на чтение у kmem и так есть).

cpuid - работает

Аналогично.

dexpl ★★★★★
()
Ответ на: комментарий от dexpl

«/dev/mem: Permission denied»

Скопировал dmidecode /usr/sbin/ в /usr/bin/ и получил то же самое.

даже после добавления юзера в группу kmem и выдаче kmem прав

Похоже не в правах дело. Даже после chmod 777 на /dev/mem

# dmidecode 2.11
/dev/mem: Operation not permitted

varchar
()
Ответ на: комментарий от false

Что за защита кроме прав? Уже интересно. Руту дает, юзеру не даёт, Как знает кто есть кто?
Куски стрейса, на /dev/mem 777. Рут:

open("/proc/efi/systab", O_RDONLY)      = -1 ENOENT (No such file or directory)
open("/dev/mem", O_RDONLY)              = 3
mmap(NULL, 65536, PROT_READ, MAP_SHARED, 3, 0xf0000) = 0x7f5524e7b000
Юзер:
open("/proc/efi/systab", O_RDONLY)      = -1 ENOENT (No such file or directory)
open("/dev/mem", O_RDONLY)              = -1 EPERM (Operation not permitted)
dup(2)                                  = 3

varchar
()
Ответ на: комментарий от varchar

Что за защита кроме прав?

В ядре может быть что угодно. man capabilities

anonymous
()
Ответ на: комментарий от anonymous

Ты прав, ЛОЛ. Достаточно было полный путь указать. Т.к. /usr/sbin не в $PATH у юзера.

varchar
()

lsusb | base64 | md5sum 640cb464dff295e9f8d99f41bfc41aba -

Вот тебе и уникальный идентификатор

Вместо lsusb выбрать что-то по стабильней lspci к примеру

Dron ★★★★★
()
Последнее исправление: Dron (всего исправлений: 1)
Ответ на: комментарий от varchar

dmidecode | grep UUID — уникальный id мат платы.

очень уникальный у моего десктопа :)

UUID: 03000200-0400-0500-0006-000700080009

btw,

Handle 0x0001, DMI type 1, 27 bytes
System Information
        Manufacturer: To Be Filled By O.E.M.
        Product Name: To Be Filled By O.E.M.
        Version: To Be Filled By O.E.M.
        Serial Number: To Be Filled By O.E.M.
        UUID: 03000200-0400-0500-0006-000700080009
        Wake-up Type: Power Switch
        SKU Number: To Be Filled By O.E.M.
        Family: To Be Filled By O.E.M.

qbe
()
Ответ на: комментарий от varchar

А не, походу ошибся, у меня даже руту не даёт.

┌─[10:34][vl]:[/usr/src/linux]
└─$ sudo cat /dev/mem > /dev/null 
cat: /dev/mem: Операция не позволена
false ★★★★★
()
Ответ на: комментарий от dexpl

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

Это в какой системе можно писать в /etc/X11/ обычному пользователю?

cp /etc/X11/xorg-home.conf. /etc/X11/xorg.conf

mky ★★★★★
()
Ответ на: комментарий от dexpl

От рута dmidecode возвращает искомый UUID безо всяких modprobe eeprom, но насколько я понял условие задачи, рута может и не быть. Не говоря уже о том, что modprobe сам по себе требует рута.

А системные конфиги ты собрался от пользователя менять, а не от рута? И init-скрипты тоже запускать от пользователя будешь?

AnDoR ★★★★★
()
Ответ на: комментарий от varchar

:) Там далее в простыне был вендор материнской платы ASRock. Я к тому, что на самосборных ПК этот UUID считать уникальным рискованно.

Вообще, этот UUID (по назначению) - идентификатор всей системы, а не материнки

qbe
()

Вот только как отличать друг от друга различные компьютеры в скрипте? Нужен уникальный идентификатор машины.

/sbin/fdisk -l | sed -rn '/Disk identifier: /p' выдаст несколько идентификаторов дисков и флешек. Я их юзаю.

Они создаются при разметке устройства.

PS: важно: их можно клонировать командой dd.

emulek
()

hdd может поменяться

мамка тоже может поменяться. Как раз hdd удобнее, если ты его на другую мамку сунул или клонировал.

emulek
()

Поскольку с получением по-настоящему уникального железного идентификатора машины вылезают всякие проблемы, я бы разово создал через uuidgen и хранил где-нибудь на каждом хосте метку.

qbe
()
Ответ на: комментарий от qbe

тоже годное решение. Но я просто задаю hostname уникальный, и немного осмысленный.

emulek
()
Ответ на: комментарий от dexpl

Значит, я недопонял условие задачи

да ты, похоже, вообще топ не читал, там же первой строкой идёт:

Постоянно использую один внешний hdd, загружая с него Linux систему на разных машинах.

и как тут без рута?

novitchok ★★★★★
()

lspci|md5sum

anonymous
()
Ответ на: комментарий от qbe

А где хранить метку то? Ведь по условиям задачи речь идёт о загрузке разного железе с одно и того же внешнего винта. Нет никаких гарантий, что в системе есть другие диски, и что там есть место что-то хранить.

mky ★★★★★
()
Ответ на: комментарий от mky

Тогда ой :)

Тогда я бы взял MAC в качестве идентификатора. Вероятность обмена местами сетевых карт на двух хостах низка, а сложность других методов автоопределения снижает общую надёжность самого автоопределения.

В конце концов, если у скрипта возникают сомнения в достоверном определении, можно и у пользователя спросить, какой сценарий выполнять дальше.

qbe
()
Ответ на: комментарий от novitchok

Постоянно использую один внешний hdd, загружая с него Linux систему на разных машинах.

и как тут без рута?

Для того, чтобы загрузить ту или иную ОС (в частности, Linux) с того или иного устройства, не нужен не то, что рут, но и вообще какая-либо учетка в этой ОС. Для дальнейшей работы в загруженном Linux рут вообще говоря не принципиален и даже вреден. Другое дело, что «скрипт для автоматизации рутинных действий по индивидуальной настройке hardware с вызовом разных программ для разных машин» без рута не обойдется, кто бы спорил.

dexpl ★★★★★
()
Ответ на: комментарий от novitchok

да, рут присутсвует, сетевых карточек а также, других hdd может и не быть.

За dmidecode спасибо, на retail системах это может быть решением.

hostid прямой связи с mac не имеет, определяется софтом и насколько я понимаю тупо может быть изменен в любой момент вызовом sethostid().

Но вообще как подсказал qbe
информация dmidecode не очень то и надежная и в ряде случаев производители на неё забивают.

Dblmok
() автор топика
Ответ на: комментарий от anonymous

Я предложил hostname потому что для меня это самый удобный способ идентификации машины. Зачем же привязываться к железу, если можно просто дать человекочитаемое название, для чтения которого не нужен root?

f1xmAn ★★★★★
()
Ответ на: комментарий от IIIypuk

Не понял, нужен динамический id? Если ты о том, чтобы ручками изменить hostname, то это делается за минуту.

f1xmAn ★★★★★
()
Ответ на: комментарий от Dblmok

да, рут присутсвует, сетевых карточек а также, других hdd может и не быть.

вообще я бы посоветовал не привзываться к идентификации «машины» как цельного объекта, а привязываться к тому, что ты в данный момент хочешь настроить.

например:
if(видеокарта hd8700)
cp /etc/X11/xorg.conf.hd8700 /etc/X11/xorg.conf

...
if(есть вай-фай карта с маком 00:ab:cd:ef )
service networkManager start

и т.д.

кстати, для подобных действий есть уже готовое решение - правила udev :)

maloi ★★★★★
()
Последнее исправление: maloi (всего исправлений: 2)
Ответ на: комментарий от Bagrov

Идея хорошая, но например для моего «Intel(R) Core(TM) i7-2630QM» никаких serial в /proc/cpuinfo не наблюдается

selivan ★★★
()
Ответ на: комментарий от Dblmok

информация dmidecode не очень то и надежная

Там много строк, не обязательно привязываться к конкретному параметру, можно сразу к нескольким. И вы же пишите под себя, под конкретные компьютеры, зачем сразу же думать о плохом :-)

А так, компьютерное железо позволяет сделать полные клоны, если прозводитель забъёт на id, ЕМНИП, как-то давно видел материнки у которых всё было по нулям, даже MAC-адреса встроенных сетёвок.

mky ★★★★★
()
Ответ на: комментарий от maloi

вообще я бы посоветовал не привзываться к идентификации «машины» как цельного объекта, а привязываться к тому, что ты в данный момент хочешь настроить.

кстати, для подобных действий есть уже готовое решение - правила udev :)

нет, udev для моих задач не удобен. При появлении каждого устройства надо будет добавлять его руками в udev.rules. Идентификация устройства в ряде случаев будет сложнее инициализации, каждый раз надо думать по какому id, шине и пр. опознавать устройстово, копировать серийники из /sys и т.п. Кроме того ну не делать же через udev вещи типа «поставить на разных машинах разные обои» :-)

Для моих задач проще сначала опознать машину и сделать для неё скриптами доп. инициализацию всех устройств и настройку программ в зависимости от роли этой машины. А при появлении нового девайса не морочиться с его опознанием и добавить строчку инициализации в скрипт.

Вообщем как и ожидалось простого и универсального решения не существует, для себя попробую пока такой вариант

lspci  -mm |md5sum | awk '{ print $1 }'

Dblmok
() автор топика
Ответ на: комментарий от Dblmok

При появлении каждого устройства надо будет добавлять его руками в udev.rules

чем это отличается от

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

по-моему абсолютно одно и та же последовательность действий при определенном навыке.

обои выставлять нет смысла, но обои вообще выставлять от рута - довольно странная идея (если это конечно не дефолтная обоина для всех пользователей, тогда удев вполне себе вариант).

maloi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.