Analyzujte root=
parametr z /proc/cmdline
.
Na systémech, na které jsem se díval, /dev/root
je symbolický odkaz na skutečné zařízení, tedy readlink /dev/root
(nebo readlink -f /dev/root
pokud chcete úplnou cestu), udělá to.
Pravděpodobně by to mělo být aktualizováno, protože mnoho zde uvedených informací je zavádějících a ve skutečnosti možná nikdy nebyly úplně správné.
https://bootlin.com/blog/find-root-device/
U bodu / mount vám bylo řečeno, že odpovídá /dev/root, což není skutečné zařízení, které hledáte.
Samozřejmě se můžete podívat na příkazový řádek jádra a zjistit, na kterém počátečním kořenovém souborovém systému dostal Linux pokyn ke spuštění (kořenový parametr):
$ cat /proc/cmdline mem=512M console=ttyS2,115200n8root=/dev/mmcblk0p2 rw rootwait
To však neznamená, že to, co vidíte, je aktuální kořenové zařízení. Mnoho linuxových systémů se spouští na středních kořenových souborových systémech (jako jsou initramdisky a initramfs), které se právě používají k přístupu k finalone.
Jedna věc, která poukazuje na to, že věc v /proc/cmdline nemusí být nutně skutečným kořenem konečného zařízení, na kterém skutečně žije.
To je od lidí z busyboxu, o kterých předpokládám, že vědí, o čem mluví, pokud jde o situace spouštění.
https://www.linuxquestions.org/questions/slackware-14/slackware-current-dev-root-688189/page2.html
Druhým užitečným zdrojem, který jsem našel, je velmi staré vlákno Slackware o otázce /dev/root, od stáří tohoto vlákna můžeme vidět, že všechny varianty byly vždy přítomné, ale věřím, že „většina“ distribucí používala symbolické link metoda, ale to byl jednoduchý přepínač kompilace jádra, mohl ho udělat, nebo neudělat, pokud jsem správně pochopil plakáty, to znamená přepnout to jedním směrem a readlink /dev/root hlásí skutečné jméno zařízení, přepnout jej druhý a to ne.
Protože hlavním tématem tohoto vlákna bylo, jak se zbavit /dev/root, museli se dostat do toho, co to vlastně je, co to dělá atd., což znamená, že tomu museli porozumět, aby se toho zbavili.
hnusně to dobře vysvětlil:
/dev/root je obecné zařízení, které lze použít v souboru fstab. Jeden může také použít 'rootfs'. To nabízí určitou výhodu v tom, že umožňuje být méně konkrétní. Mám na mysli to, že pokud je kořenový oddíl na externím disku, nemusí se vždy zobrazit jako stejné zařízení a jeho úspěšné připojení by vyžadovalo změnu fstab tak, aby odpovídala správnému zařízení. Při použití /dev/root bude vždy odpovídat jakémukoli zařízení uvedenému v parametrech zavádění jádra z lilo orgrub.
/dev/root byl vždy přítomen jako virtuální přípojný bod, i když jste jej nikdy neviděli. Stejně tak rootfs (porovnejte to se speciálními virtuálními zařízeními, jako jsou proc a tmpfs, které nemají žádné předchozí /dev)
/dev/root je virtuální zařízení jako 'proc' nebo /dev/tcp'. Pro tyto věci je v /dev uzel nodevice - je již v jádře jako virtuální zařízení.
To vysvětluje, proč symbolický odkaz nemusí nutně existovat. Překvapuje mě, že jsem se s tímto problémem nikdy dříve nesetkal, vzhledem k tomu, že spravuji některé programy, které tyto informace potřebují znát, ale lepší pozdě než nikdy.
Věřím, že některá zde nabízená řešení budou 'často' fungovat a pravděpodobně jsou to, co udělám, ale nejsou skutečným skutečným řešením problému, jehož implementace, jak poznamenal autor busyboxu, je výrazně složitější ve velmi robustním způsobem.
[AKTUALIZACE:} Po získání dat z uživatelských testů použiji metodu připojení, která se alespoň v některých případech zdála být v pořádku. /proc/cmdline nebyl užitečný, protože existuje příliš mnoho variant. V prvním příkladu vidíte starou metodu. Toto je stále méně obvyklé, protože se důrazně nedoporučuje používat to (původní syntaxe typu /dev/sdx[0-9]), protože tyto cesty se mohou dynamicky měnit (pořadí výměny disku, vložení nového disku atd. a najednou /dev/ sda1 se změní na /dev/sdb1).
root=/dev/sda1
root=UUID=5a25cf4a-9772-40cd-b527-62848d4bdfda
root=LABEL=random string
root=PARTUUID=a2079bfb-02
VS velmi čisté a snadno analyzovatelné:
mount
/dev/sda1 on / type ext4 (rw,noatime,data=ordered)
V případě cmdline uvidíte, že jediná varianta, která je teoreticky správnou 'odpovědí', je ta první, zastaralá, protože byste neměli odkazovat root na pohyblivý cíl jako /dev/sdxy
Další dva vyžadují provedení další akce získání symbolického odkazu z tohoto řetězce buď v /dev/disk/by-uuid nebo /dev/disk/by-label
Poslední vyžaduje, věřím, pomocí parted -l k nalezení toho, na co toto parted id ukazuje.
To jsou pouze varianty, o kterých vím a které jsem viděl, klidně by mohly existovat i jiné, jako například GPTID.
Takže řešení, které používám, je toto:
nejprve se podívejte, zda /dev/root je symbolický odkaz. Pokud ano, ověřte, že to není na /dev/disk/by-uuid nebo by-label, pokud ano, musíte provést druhý krok zpracování, abyste získali poslední skutečnou cestu. Záleží na nástroji, který používáte.
Pokud nic nemáte, jděte na montáž a podívejte se, jak to je. Jako poslední záložní případ, který nepoužívám, protože argumenty proti němu, které nemusí nutně být skutečným diskovým oddílem nebo dotyčným zařízením, jsou dost dobré na to, abych toto řešení pro svůj program odmítl. mount není plně robustní řešení a jsem si jistý, že vzhledem k dostatečnému množství vzorků by bylo snadné najít případy, kdy to vůbec není správné, ale věřím, že tyto dva případy pokrývají 'většinu' uživatelů, což je vše, co jsem potřeboval.
Nejhezčím, nejčistším a nejspolehlivějším řešením by bylo, kdyby jádro vždy vytvořilo symbolický odkaz, který by ničemu a nikomu neublížil, a označil to za dobré, ale v reálném světě to tak nefungovalo.
Žádné z těchto nepovažuji za „dobré nebo robustní“ řešení, ale zdá se, že možnost montáže uspokojí „dost dobré“, a pokud je vyžadováno skutečně robustní řešení, použijte věci, které doporučil busybox.