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.