Дізнайтеся, який пристрій / dev / root представляє в Linux?


17

У Linux є /dev/rootвузол пристрою. Це буде той самий блок пристрою, що й інший вузол пристрою /dev/sdaX. Як /dev/rootу цій ситуації я можу вирішити "справжній" вузол пристрою, щоб я міг показати користувачеві розумне ім'я пристрою?

Наприклад, я можу зіткнутися з цією ситуацією під час розбору /proc/mounts.

Я шукаю рішення, які працюватимуть із сценарію shell / python, але не з C.


Ви тут перевірили? linux-diag.sourceforge.net/Sysfsutils.html Він рекомендує спосіб запитувати ядро ​​про приєднані пристрої всіх видів, не впевнені, чи це те, що ви шукаєте!

Відповіді:


14

Розбираємо root=параметр з /proc/cmdline.


Нічого, реакції блискавки :-)

1
Настільки безпечніше, ніж перенаправлення символічного посилання. +1 :)
Tim Post

1
Це працює над трьома дистрибутивами (fc14, rhel5, ubuntu 11.04), які я переглянув, з невеликим застереженням, що існує додатковий крок, необхідний для роботи з аргументами root = UUID = type.
kdt

Мене цікавить, чому це безпечніше, ніж рішення readlink, хтось може розробити?
opello

readlink не завжди працює, я зараз працюю над цією проблемою і знайшов користувача, система якого не відображає результатів: readlink / dev / root - який спричинив помилку в програмі, над якою я працюю, саме тому я прийшов до цієї нитки. Правильний тест потрібно спочатку зробити: readlink / dev / root, потім, якщо null, знайти його в / proc / cmdline, але розбір / proc / cmdline не такий простий, як краще рішення, тому я буду продовжувати шукати.
Лізардкс

12

У системах, які я переглянув, /dev/rootє символьним посиланням на реальний пристрій, тому readlink /dev/root(або readlink -f /dev/rootякщо ви хочете повний шлях), це зробимо.


Або просто ls -l /dev/root- коротше набрати :)
rozcietrzewiacz

@jankes, але тоді ви повинні проаналізувати вихід ls(він попросив щось використовувати у сценарії).
cjm

Ах, вибачте - це не помітили.
rozcietrzewiacz

Ні - на моїй машині RHEL5 це точно не є симпосиланнями, хоча на машині FC14 або ubuntu 11.04 це є.
kdt

1
Не працює на archlinux.
g33kz0r

7

Ну /dev/rootце лише символічне посилання на реальний пристрій, тож ви можете readlink(2)дізнатися, куди він вказує програму, або readlink(1)зробити те ж саме із скрипту оболонки.


Ні. Не працює на
archlinux

Також не на Debian, openSUSE, CentOS (неповний список) :(
pevik

Додайте ubuntu до списку.
Лізардкс

3

Це, мабуть, слід оновити, оскільки велика кількість наданої тут інформації вводить в оману і, можливо, ніколи не була всебічно коректною.

https://bootlin.com/blog/find-root-device/

Щодо / точки монтажу, тобі просто сказали, що вона відповідає / dev / root, що не є реальним пристроєм, який ти шукаєш.

Звичайно, ви можете подивитися в командному рядку ядра і побачити, на якій початковій кореневій файловій системі Linux було доручено завантажуватись (кореневий параметр):

$ cat / proc / cmdline mem = 512M console = ttyS2,115200n8 root = / dev / mmcblk0p2 rw rootwait

Однак це не означає, що ви бачите поточний кореневий пристрій. Багато систем Linux завантажуються на проміжні кореневі файлові системи (наприклад, initramdisks та initramfs), які просто використовуються для доступу до остаточної.

Одне, на що вказується, було те, що річ у / proc / cmdline не обов'язково є фактичним кінцевим кореневим пристроєм.

Це від людей зайнятих, які, напевно, знають, про що вони говорять, коли справа стосується завантажувальних ситуацій.

https://www.linuxquestions.org/questions/slackware-14/slackware-current-dev-root-688189/page2.html

Другий корисний ресурс, який я знайшов, - це дуже стара програма Slackware щодо питання / dev / root, з епохи цієї теми ми бачимо, що всі варіанти завжди були присутніми, але я вважаю, що у більшості дистрибутивів використовувались символічні метод посилання, але це був простий перемикач компіляції ядра, він міг зробити один, або не зробити його, якщо я правильно зрозумів плакати, тобто переключити його в один бік і readlink / dev / root повідомляти про справжнє ім’я пристрою, переключити його інший, і це не так.

Оскільки головна тема цієї теми полягала в тому, як позбутися / dev / root, вони мусили вникнути в те, що воно є насправді, що це робить, тощо. Це означає, що вони повинні були зрозуміти це, щоб позбутися.

gnashly це добре пояснив:

/ dev / root - це загальний пристрій, який можна використовувати у fstab. Можна також використовувати "rootfs". Це робить певну перевагу тим, що дозволяє бути менш конкретними. Що я маю на увазі, якщо кореневий розділ знаходиться на зовнішньому диску, він не завжди може відображатися як той самий пристрій і успішно монтувати його, як / вимагає змінити fstab, щоб відповідати правильному пристрою. Використовуючи / dev / root, він завжди відповідатиме будь-яким пристроєм, вказаним у параметрах завантаження ядра від lilo або grub.

/ dev / root завжди був віртуальною точкою кріплення, навіть якщо ви його ніколи не бачили. Так само є rootfs (порівняйте це зі спеціальними віртуальними пристроями, такими як proc і tmpfs, які не мають попереднього / dev)

/ dev / root - це віртуальний пристрій на зразок 'proc' або / dev / tcp '. Немає вузла пристрою в / dev для цих речей - він вже є в ядрі як віртуальний пристрій.

Це пояснює, чому символічне посилання не обов'язково існує. Я здивований, що ніколи до цього не звертався до цього питання, враховуючи, що я підтримую деякі програми, які мають знати цю інформацію, але краще пізно, ніж ніколи.

Я вважаю, що деякі запропоновані тут рішення "часто" спрацюють, і, мабуть, я буду робити це, але вони не є справжнім справжнім рішенням проблеми, яке, як зазначив автор зайнятої скриньки, значно складніше реалізувати в дуже надійний спосіб.

[ОНОВЛЕННЯ:} Після отримання даних про тестування користувачів, я переходжу до методу кріплення, який, здавалося б, у деяких випадках нормально. / Proc / cmdline не був корисним, оскільки варіантів занадто багато. У першому прикладі ви бачите старий метод. Це все рідше і рідше, оскільки сильно не рекомендується використовувати його (оригінальний синтаксис / original / dev / sdx [0-9]), оскільки ці шляхи можуть динамічно змінюватися (міняти порядок диска, вставляти новий диск тощо) і раптом / dev / sda1 стає / dev / sdb1).

root=/dev/sda1
root=UUID=5a25cf4a-9772-40cd-b527-62848d4bdfda
root=LABEL=random string
root=PARTUUID=a2079bfb-02

VS дуже чистий і простий для розбору:

mount
/dev/sda1 on / type ext4 (rw,noatime,data=ordered)

Що стосується cmdline, ви побачите, єдиний варіант, який є правильним "відповіддю" в теорії, це перший, застарілий, оскільки ви не повинні посилати корінь на рухому ціль типу / dev / sdxy

Наступні два потребують виконання подальших дій для отримання символічного посилання з цього рядка або в / dev / disk / by-uuid або / dev / disk / by-label

Останнє вимагає, я вважаю, використовуючи parted -l, щоб знайти те, на що вказує цей розділений ідентифікатор.

Це лише ті варіанти, які я знаю і бачив, цілком можуть бути й інші, наприклад GPTID.

Тому рішення, яке я використовую, таке:

спочатку подивіться, чи / dev / root є символічним посиланням. Якщо це так, переконайтеся, що це не / dev / disk / by-uuid або by-label, якщо це так, вам потрібно зробити другий крок обробки, щоб отримати останній реальний шлях. Залежить від інструменту, який ви використовуєте.

Якщо у вас нічого немає, тоді перейдіть на гору і подивіться, як це. Як останній випадок, який я не використовую, тому що аргументи, подані проти нього, навіть не обов'язково фактичний розділ чи пристрій, про які йдеться, досить хороші для мене, щоб відхилити це рішення для моєї програми. mount не є надійним рішенням, і я впевнений, що даючи достатньо зразків, було б легко знайти випадки, коли це зовсім не так, але я вважаю, що ці два випадки охоплюють "більшість" користувачів, що все, що мені потрібно.

Найприємнішим, найчистішим та найнадійнішим рішенням було б ядро ​​просто завжди робити символічне посилання, яке б нікому і нікому не зашкодило, і називати це хорошим, але це не так, як це спрацювало в реальному світі. .

Я не розглядаю жодне з них як «хороші чи надійні» рішення, але, можливо, варіант кріплення задовольняє «досить хороший» варіант, і якщо потрібне справді надійне рішення, використовуйте речі, які рекомендується зайняти.


2

Можливо, мені чогось не вистачає, але як бути:

mount|grep ' / '|cut -d' ' -f 1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.