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