Jindrich Fucik wrote on 30. 5. 2019 13:22:
Že se tak ptám, ono je možné odmontovat fs, když je v něm namontovaný jiný fs?
Moc si to nedovedu představit.

Zvlastni. A ze je tu rec o odmountovani rootu a namountovani jinyho te ze sna nebudi ? ;-)

Ale zpatky k tomu co teda vlastne "reboot -r" udela.

 -- reboot -r -------------

Ten binar vlastne nic - ten udela jen sync(), pokud to optionem nema zakazane, a pak posle INITu signal SIGEMT.

 --------------------------

To je signal v namualove strance init nedokumentovany, ale jeho ucel je jasny - pozaduje po INITu aby provedl reroot. A ten ...

 -- init (puvodni) --------

Posle SIGTERM vsem procesum s vyjimkou systemovych (P_SYSTEM).

Mountne /dev/reroot jako tmpfs, nakopiruje do nej sam sebe (/init) a nasledne si preda rizeni s optionem -r (pokud se neco z toho nepovede, skonci to v singlu).

 --------------------------

Tim byl puvodni init nahrazen tim, ktery bezi z tmpfs a dale uz pokracuje ten. A ten:

 -- init -r bezici z tmpfs --------

pomoci syscallu reboot(RB_REROOT) pozada kernel o remountnuti rootu

najde novy init (tak jako pri startu - kenv init_path, sysctl kern.init_path, compiled-in init path) a preda mu rizeni (kdyz se to nepovede, skonci v singlu)

 -- init (z noveho rootu) -

Novy init odpovida za odmountovani /dev/reroot

 --------------------------

Zbyva rozklicovat co dela reboot(RB_REROOT)

 -- kernel, RB_REBOOT -----

Overi, ze ho o reroot zada init, jinak EPERM

uzamkne filesystem ze ktereho bezi zadajici init (tmpfs) jako BUSY (pokud se to nepovede, cela operace selze a syscall vrati ENOENT),

Vyjme tento fs a take devfs ze seznamu namountovanych fs

vfs_unmountall(), zde je asi podstatne vedet, ze funkce nema navratovou hodnotu a tedy schopnost signalizovat, ze se unmount neceho nepovedl - jen se to napise na konzoli (syslog uz nefunguje)

Vrati do seznamu namountovanych fs (ten by mel byt prazdny) devfs

vfs_mountroot();

Projdou se vsechny existujici reference (nezapomente, zustaly mj. bezet systemove procesy) a pokud jejich rootdir, curdir, chroot odkazuje na puvodni root, prepise se odkaz na novy root. Obdobne jaildir pro jaily.

Vrati tmpfs do seznamu namountovanych fs a zrusi jeho BUSY

 --------------------------

Pokud tedy po rerootu zustane namountovane neco ze stareho systemu (krome devfs) tak selhal dounmount(, MNT_FORCE, )

A problem je, ze vfs_unmountall() informaci o problemu nepreda (dokud se pouzival pouze pro shutown tak to nevadilo) a handler RB_REBOOT tedy na problem nemuze reagovat (nejspis tak, ze skonci v singlu).

Dan

V popisu projektu se pise:
system performs a partial shutdown, killing all processes and unmounting the 
rootfs, and then partial bringup, mounting the new rootfs, running init, and 
running the startup scripts as usual.

Tedy o odmountovavani dalsich FS nic.

Mas pravdu ze man 8 reboot pise:

unmounts all filesystems

Ted je ale otazka, jestli je chyba v kodu, nebo v manualove strance.

--
FreeBSD mailing list (users-l@freebsd.cz)
http://www.freebsd.cz/listserv/listinfo/users-l

Odpovedet emailem