Scopri quale dispositivo / dev / root rappresenta in Linux?


17

Su Linux, c'è un /dev/rootnodo dispositivo. Questo sarà lo stesso dispositivo a blocchi di un altro nodo del dispositivo, come /dev/sdaX. Come posso risolvere /dev/rootil nodo dispositivo "reale" in questa situazione, in modo da poter mostrare a un utente un nome dispositivo sensibile?

Ad esempio, potrei incontrare questa situazione durante l'analisi /proc/mounts.

Sto cercando soluzioni che funzionino da uno script shell / python ma non da C.


hai controllato qui? linux-diag.sourceforge.net/Sysfsutils.html Raccomanda il modo di interrogare il kernel su dispositivi collegati di ogni tipo, non sono sicuro, se è quello che stai cercando!

Risposte:


14

Analizzare il root=parametro da /proc/cmdline.


Wow, reazioni lampo :-)

1
Molto più sicuro che non dereferenziare un collegamento simbolico. +1 :)
Tim Post

1
Questo funziona sulle tre distro (fc14, rhel5, ubuntu 11.04) che ho visto, con il leggero avvertimento che è necessario un ulteriore passo per gestire gli argomenti root = UUID = type.
kdt,

Sono interessato al perché questo è più sicuro della soluzione readlink, qualcuno potrebbe elaborare?
Opello,

readlink non funziona sempre, sto lavorando a questo problema in questo momento e ho trovato un utente il cui sistema non mostra risultati da: readlink / dev / root - che ha provocato un errore nel programma su cui sto lavorando, motivo per cui sono venuto a questa discussione. Il test corretto è prima di tutto: readlink / dev / root, quindi se null, trovalo in / proc / cmdline, ma analizzare / proc / cmdline non è facile come una soluzione migliore, quindi continuerò a cercare.
Lizardx,

12

Sui sistemi che ho visto, /dev/rootè un link simbolico al dispositivo reale, quindi readlink /dev/root(o readlink -f /dev/rootse vuoi il percorso completo), lo farà.


O semplicemente ls -l /dev/root- più breve da digitare :)
rozcietrzewiacz il

@jankes, ma poi devi analizzare l'output di ls(ha chiesto qualcosa da usare in uno script).
cjm

Ah, scusa, ho ignorato questo.
rozcietrzewiacz,

No: sulla mia macchina RHEL5 non è sicuramente un collegamento simbolico, sebbene lo sia su una macchina FC14 o Ubuntu 11.04.
kdt,

1
Non funziona su Archlinux.
g33kz0r,

7

Bene /dev/rootè solo un collegamento simbolico al dispositivo reale, quindi puoi usarlo readlink(2)per scoprire dove punta da un programma o readlink(1)per fare la stessa cosa da uno script di shell.


No. Non funziona su archlinux
g33kz0r

Anche non su Debian, openSUSE, CentOS (elenco incompleto) :(
pevik

Aggiungi ubuntu all'elenco.
Lizardx,

2

Forse mi manca qualcosa, ma che dire di:

mount|grep ' / '|cut -d' ' -f 1

2

Questo dovrebbe probabilmente essere aggiornato, poiché molte delle informazioni fornite qui sono fuorvianti e potrebbero in realtà non essere mai state completamente corrette.

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

Per il / mount point, ti viene semplicemente detto che corrisponde a / dev / root, che non è il dispositivo reale che stai cercando.

Ovviamente, puoi guardare la riga di comando del kernel e vedere su quale filesystem di root iniziale Linux è stato incaricato di avviare (parametro root):

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

Tuttavia, ciò non significa che quello che vedi sia l'attuale dispositivo root. Molti sistemi Linux si avviano su filesystem di root intermedi (come initramdisks e initramfs), che vengono utilizzati solo per accedere a quello finale.

Una cosa che sottolinea è che la cosa in / proc / cmdline non è necessariamente la radice del dispositivo finale reale su cui vivono effettivamente.

Viene dalle persone affollate, che presumo sappiano di cosa stanno parlando quando si tratta di situazioni di avvio.

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

La seconda risorsa utile che ho trovato è un thread Slackware molto vecchio sulla domanda di / dev / root, dall'età di questo thread, possiamo vedere che tutte le varianti erano sempre presenti, ma credo che la maggior parte delle distro usasse il simbolico metodo di collegamento, ma si trattava di un semplice switch di compilazione del kernel, poteva crearne uno o non crearne uno se avessi capito correttamente i poster, ovvero, cambialo in un modo e readlink / dev / root riporta il vero nome del dispositivo, cambialo l'altro, e non lo fa.

Poiché l'argomento principale di quel thread era come sbarazzarsi di / dev / root, dovevano entrare in quello che è in realtà, cosa lo rende, ecc., Il che significa che dovevano capirlo per sbarazzarsene.

Gnashly lo ha spiegato bene:

/ dev / root è un dispositivo generico che può essere utilizzato in fstab. Si può anche usare 'rootfs'. Ciò offre alcuni vantaggi in quanto consente di essere meno specifici. Ciò che intendo è che se la partizione di root si trova su un'unità esterna, potrebbe non apparire sempre come lo stesso dispositivo e montarlo correttamente poiché / richiederebbe la modifica di fstab in modo che corrisponda al dispositivo corretto. Usando / dev / root corrisponderà sempre a qualsiasi dispositivo specificato nei parametri di avvio del kernel da lilo o grub.

/ dev / root è sempre stato presente come punto di montaggio virtuale, anche se non l'hai mai visto. Quindi ha rootfs (confronta questo con i dispositivi virtuali speciali come proc e tmpfs che non hanno precedenti / dev)

/ dev / root è un dispositivo virtuale come 'proc' o / dev / tcp '. Non esiste un nodo dispositivo in / dev per queste cose - è già nel kernel come dispositivo virtuale.

Questo spiega perché non esiste necessariamente un collegamento simbolico. Sono sorpreso di non aver mai affrontato questo problema prima d'ora, dato che mantengo alcuni programmi che devono conoscere queste informazioni, ma meglio tardi che mai.

Credo che alcune delle soluzioni offerte qui funzioneranno "spesso", e probabilmente sono ciò che farò, ma non sono la vera vera soluzione al problema, che, come ha notato l'autore di busybox, è significativamente più complicato da implementare in modo molto modo robusto.

[AGGIORNAMENTO:} Dopo aver ottenuto alcuni dati di test utente, vado con il metodo mount, che almeno per alcuni casi sembra essere andato bene. / Proc / cmdline non è stato utile perché ci sono troppe varianti. Nel primo esempio, vedi il vecchio metodo. Questo è sempre meno comune perché è fortemente sconsigliato usarlo (la sintassi del tipo originale / dev / sdx [0-9]) perché quei percorsi possono cambiare dinamicamente (ordine del disco di swap, inserimento di un nuovo disco, ecc. E improvvisamente / dev / sda1 diventa / dev / sdb1).

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

VS molto pulito e facile da analizzare:

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

Nel caso di cmdline, vedrai, l'unica variante che è la "risposta" giusta in teoria è la prima, deprecata, dal momento che non dovresti fare riferimento a un target mobile come / dev / sdxy

I prossimi due richiedono di fare l'ulteriore azione per ottenere il collegamento simbolico da quella stringa in / dev / disk / by-uuid o / dev / disk / by-label

L'ultimo richiede credo di usare parted -l per trovare ciò a cui punta quell'ID parted.

Sono solo le varianti che conosco e che ho visto, potrebbero essercene altre, ad esempio GPTID.

Quindi la soluzione che sto usando è questa:

per prima cosa, controlla se / dev / root è un link simbolico. In tal caso, verificare che non sia / dev / disk / by-uuid o by-label, in tal caso, è necessario eseguire una seconda fase di elaborazione per ottenere l'ultimo percorso reale. Dipende dallo strumento che usi.

Se non hai niente, allora vai a montare e guarda com'è. Come ultimo caso di fallback, quello che non sto usando perché gli argomenti addotti non sono nemmeno necessariamente la partizione o il dispositivo in questione sono abbastanza buoni da poter rifiutare quella soluzione per il mio programma. mount non è una soluzione completamente solida, e sono sicuro che ci siano abbastanza campioni, sarebbe facile trovare casi in cui non è affatto giusto, ma credo che questi due casi riguardino gli utenti "più", il che è tutto ciò di cui avevo bisogno.

La soluzione più bella, pulita e affidabile sarebbe stata per il kernel fare sempre il collegamento simbolico, che non avrebbe danneggiato nulla o nessuno, e chiamarlo buono, ma non è così che ha funzionato nel mondo reale. .

Non considero nessuna di queste soluzioni "buone o robuste", ma l'opzione di montaggio sembra soddisfare il "abbastanza buono" e, se è necessaria la soluzione veramente robusta, utilizzare le cose consigliate da busybox.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.