Découvrez quel périphérique / dev / root représente sous Linux?

17

Sous Linux, il existe un /dev/rootnœud de périphérique. Ce sera le même périphérique de bloc qu'un autre nœud de périphérique, comme /dev/sdaX. Comment puis-je résoudre /dev/rootle nœud de périphérique «réel» dans cette situation, afin que je puisse montrer à un utilisateur un nom de périphérique raisonnable?

Par exemple, je pourrais rencontrer cette situation lors de l'analyse /proc/mounts.

Je cherche des solutions qui fonctionneraient à partir d'un script shell / python mais pas C.

kdt
la source
avez-vous vérifié ici? linux-diag.sourceforge.net/Sysfsutils.html Il recommande un moyen d'interroger le noyau sur les périphériques attachés de toutes sortes, pas sûr, si c'est ce que vous cherchez!

Réponses:

14

Analyser le root=paramètre de /proc/cmdline.

Ignacio Vazquez-Abrams
la source
Wow, réactions de foudre :-)
1
Bien plus sûr que de déréférencer un lien symbolique. +1 :)
Tim Post
1
Cela fonctionne sur les trois distributions (fc14, rhel5, ubuntu 11.04) que j'ai examinées, avec la légère mise en garde qu'une étape supplémentaire est nécessaire pour traiter les arguments de type root = UUID =.
kdt
Je suis intéressé par la raison pour laquelle cela est plus sûr que la solution readlink, quelqu'un pourrait-il élaborer?
opello
readlink ne fonctionne pas toujours, je travaille sur ce problème en ce moment et j'ai trouvé un utilisateur dont le système ne montre aucun résultat de: readlink / dev / root - qui a déclenché un problème dans le programme sur lequel je travaille, c'est pourquoi je suis venu à ce fil. Le test correct consiste à faire d'abord: readlink / dev / root, puis s'il est nul, le trouver dans / proc / cmdline, mais l'analyse / proc / cmdline n'est pas aussi facile qu'une meilleure solution, donc je vais continuer à chercher.
Lizardx
12

Sur les systèmes que j'ai examinés, il /dev/rooty a un lien symbolique vers le vrai périphérique, donc readlink /dev/root(ou readlink -f /dev/rootsi vous voulez le chemin complet) le fera.

cjm
la source
Ou tout simplement ls -l /dev/root- plus court pour taper :)
rozcietrzewiacz
@jankes, mais ensuite vous devez analyser la sortie de ls(il a demandé quelque chose à utiliser dans un script).
cjm
Ah, désolé - j'ai oublié ça.
rozcietrzewiacz
Non - sur ma machine RHEL5, ce n'est certainement pas un lien symbolique, bien que sur une machine FC14 ou ubuntu 11.04, ce soit le cas.
kdt
1
Ne fonctionne pas sur archlinux.
g33kz0r
7

Eh bien, /dev/rootc'est juste un lien symbolique vers le vrai périphérique, vous pouvez donc l'utiliser readlink(2)pour savoir où il pointe à partir d'un programme, ou readlink(1)pour faire la même chose à partir d'un script shell.

TomH
la source
Non. Ne fonctionne pas sur archlinux
g33kz0r
Aussi pas sur Debian, openSUSE, CentOS (liste incomplète) :(
pevik
Ajoutez ubuntu à la liste.
Lizardx
2

Peut-être que je manque quelque chose, mais qu'en est-il:

mount|grep ' / '|cut -d' ' -f 1
g33kz0r
la source
2

Cela devrait probablement être mis à jour, car une grande partie des informations fournies ici sont trompeuses et n'ont peut-être jamais été complètement correctes.

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

Pour le point de montage /, on vous dit juste qu'il correspond à / dev / root, qui n'est pas le vrai périphérique que vous recherchez.

Bien sûr, vous pouvez regarder la ligne de commande du noyau et voir sur quel système de fichiers racine initial Linux a été chargé de démarrer (paramètre racine):

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

Cependant, cela ne signifie pas que ce que vous voyez est le périphérique racine actuel. De nombreux systèmes Linux démarrent sur des systèmes de fichiers racine intermédiaires (comme initramdisks et initramfs), qui sont juste utilisés pour accéder au dernier.

Une chose que cela souligne, c'est que la chose dans / proc / cmdline n'est pas nécessairement la racine réelle du périphérique final réellement en vie.

Cela vient des gens occupés, qui je suppose savent de quoi ils parlent quand il s'agit de situations de démarrage.

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

La deuxième ressource utile que j'ai trouvée est un très vieux fil de discussion Slackware sur la question de / dev / root, depuis l'âge de ce fil, nous pouvons voir que toutes les variantes étaient toujours présentes, mais je crois que `` la plupart '' des distributions utilisaient le symbolique méthode de lien, mais c'était un simple commutateur de compilation du noyau, il pouvait en faire un, ou pas si je comprenais bien les affiches, c'est-à-dire le basculer dans un sens, et readlink / dev / root rapporte le nom réel du périphérique, le changer l'autre, et ce n'est pas le cas.

Comme le sujet principal de ce fil était comment se débarrasser de / dev / root, ils devaient entrer dans ce qu'il était réellement, ce qui le rend, etc., ce qui signifie qu'ils devaient le comprendre pour s'en débarrasser.

grincheusement expliqué bien:

/ dev / root est un périphérique générique qui peut être utilisé dans le fstab. On peut également utiliser «rootfs». Faire cela offre un certain avantage en ce qu'il vous permet d'être moins spécifique. Ce que je veux dire, c'est que si la partition racine se trouve sur un disque externe, elle peut ne pas toujours apparaître comme le même périphérique et la monter avec succès car / nécessiterait de changer le fstab pour correspondre au périphérique correct. En utilisant / dev / root, il correspondra toujours au périphérique spécifié dans les paramètres de démarrage du noyau de lilo ou grub.

/ dev / root a toujours été présent en tant que point de montage virtuel, même si vous ne l'avez jamais vu. Il en va de même pour rootfs (comparez cela aux périphériques virtuels spéciaux comme proc et tmpfs qui n'ont pas de dev / dev)

/ dev / root est un périphérique virtuel comme 'proc' ou / dev / tcp '. Il n'y a pas de nœud de périphérique dans / dev pour ces choses - il est déjà dans le noyau en tant que périphérique virtuel.

Cela explique pourquoi un lien symbolique n'existe pas nécessairement. Je suis surpris de n'avoir jamais rencontré ce problème auparavant, étant donné que je maintiens certains programmes qui ont besoin de connaître ces informations, mais mieux vaut tard que jamais.

Je crois que certaines des solutions proposées ici fonctionneront «souvent», et sont probablement ce que je ferai, mais elles ne sont pas la vraie vraie solution au problème qui, comme l'a noté l'auteur de busybox, est beaucoup plus compliqué à mettre en œuvre dans un contexte très manière robuste.

[MISE À JOUR:} Après avoir obtenu des données de test utilisateur, je vais avec la méthode de montage, qui semblait être correcte dans certains cas au moins. La ligne de commande / proc / n'était pas utile car il existe trop de variantes. Dans le premier exemple, vous voyez l'ancienne méthode. C'est de moins en moins courant car il est fortement déconseillé de l'utiliser (la syntaxe de type / dev / sdx [0-9] d'origine) car ces chemins peuvent changer dynamiquement (permuter l'ordre des disques, insérer un nouveau disque, etc., et soudainement / dev / sda1 devient / dev / sdb1).

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

VS le très propre et facile à analyser:

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

Dans le cas de cmdline, vous verrez, la seule variante qui est la bonne «réponse» en théorie est la première, déconseillée, car vous ne devez pas référencer root à une cible en mouvement comme / dev / sdxy

Les deux suivants nécessitent d'effectuer l'action supplémentaire consistant à obtenir le lien symbolique de cette chaîne dans / dev / disk / by-uuid ou / dev / disk / by-label

Le dernier nécessite, je crois, d'utiliser parted -l pour trouver ce vers quoi cet id parted pointe.

Ce ne sont que les variantes que je connais et que j'ai vues, il pourrait bien y en avoir d'autres, comme GPTID, par exemple.

La solution que j'utilise est donc la suivante:

tout d'abord, voyez si / dev / root est un lien symbolique. Si c'est le cas, vérifiez que ce n'est pas dans / dev / disk / by-uuid ou by-label, si c'est le cas, vous devez effectuer une deuxième étape de traitement pour obtenir le dernier vrai chemin. Cela dépend de l'outil que vous utilisez.

Si vous n'avez rien, allez à la monture et voyez comment c'est. Comme dernier cas de secours, celui que je n'utilise pas parce que les arguments avancés contre lui ne sont même pas nécessairement la partition ou le périphérique en question sont assez bons pour que je rejette cette solution pour mon programme. Le montage n'est pas une solution entièrement robuste, et je suis sûr qu'avec suffisamment d'échantillons, il serait facile de trouver des cas où cela ne va pas du tout, mais je pense que ces deux cas couvrent `` la plupart '' des utilisateurs, c'est tout ce dont j'avais besoin.

La solution la plus agréable, la plus propre et la plus fiable aurait été pour le noyau de toujours créer le lien symbolique, ce qui n'aurait blessé personne ni personne, et de l'appeler bon, mais ce n'est pas ainsi que cela a fonctionné dans le monde réel. .

Je ne considère aucune d'entre elles comme des solutions `` bonnes ou robustes '', mais l'option de montage semble satisfaire les `` assez bonnes '', et si la solution vraiment robuste est requise, utilisez les éléments recommandés par busybox.

Lizardx
la source