Root Remount (reroot) ze ZFS na jine ZFS

Dan Lukes dan at obluda.cz
Fri May 31 07:39:02 CEST 2019


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.



More information about the Users-l mailing list