Hey all,

Michael, thanks a lot, your work is too appreciated.

This mail, due to my poor English and little time nowadays, probably not cover everything I think, but I've long wanted to send it and should not delay it anymore, so sorry if there is anything that is not well explained or incomplete. I'll try to argue my POV with advantages/disadvantages as better as possible, and if necessary bringing new ideas and proposals.


The first thing that comes to my mind is the complexity of the new solution for system initialization files that you have proposed. I think that it's much more complicated than our current one, but I'm always open to new ideas and improvements. I supposse that you worked in this stuff due to solve/optimize issues you found, maybe with lvm/mdadm, but I'm not 100% sure that I got the whole idea, so please correct me if I'm wrong somewhere. Also I noted that ArchLinux has a similar implementation (1) that could be reviewed.


*** (about hooks) ***

Basically I like user configurable hooks as alternative to rc.local (or complement), and not as an imposition (some hooks are empty files). I'd like to have a minimal rc port, and let people to use as hooks as need it. This would make for rc* init scripts to load only the hooks that were selected by users to use. Personally, I have years managing CRUX systems and I've never needed anything extra apart from a couple of lines in rc.local, as is the case with rc.local/rc.local.conf in OpenBSD systems. Accordingly, I think we might have enough to accommodate all the hooks in a single directory, I like: /etc/rc.conf.d/hooks.

Another disadvantage (IMHO) with rc-hooks could be inherited and overlap the config that has established the user. Which brings us back to run rejmerge for all rc-hooks (around 20 hooks maybe?) after each update rc port. That reinforces the idea of ​​having a small rc port.

In addition I'd like to review the naming convention. I prefer the one used by ArchLinux (2) which could be housed in the same directory (maybe /etc/rc.conf.d/hooks/) and not lose its meaning:

your schema => my proposal
---------------------------
multi/early => multi_start
sysinit/early => sysinit_start
sysinit/late => sysinit_end
sysinit/udev-runner1 => sysinit_udev-runner1
sysinit/udev-runner2 => sysinit_udev-runner2
...

Also I found that there are 2 hooks (sysinit/early and sysinit/pre-trigger1) where the second hook is executed immediately after the first one which is meaningless, so in this case both hooks could be merged into one:

--- /etc/rc.sysinit ---
rc_hook sysinit/early
rc_hook sysinit/pre-trigger1
si_udev
--- endof /etc/rc.sysinit ---


*** (about functions) ***

I like most functions you added and/or implemented, new tools from util-linux-ng (like findmnt, etc.) and also new bash syntax and features. Good work!! But why not have all functions in only one file? (maybe /etc/rc.conf.d/functions) So there are about only 30 functions.
$ grep 'function .*()' /etc/rc.engine/* | wc -l
30

IMHO code refactoring makes sense when the same function is used from multiple places. If, for example, rc.engine/multi functions are only used from rc.multi script the it makes no sense to separate it into a single file, so the effect would be the same like include only those functions in rc.multi script since no more rc scripts required them.

Also I would like to adopt and/or discuss a more consistent naming convention for functions.

your schema
-----------
rc.engine/all:function __rc_spawner() {
rc.engine/all:function rc_srv_start() {
rc.engine/lib:function start_kmsg_log() {
rc.engine/sysinit:function __si_console() {
rc.engine/sysinit:function __si_seed() {
rc.engine/sysinit:function si_std() {

my proposal
-----------
rc_spawner(), rc_srv_start(), kmsg_log_start(), sysinit_console(), sysinit_seed(), sysinit_std(), ...

In addition it would be fine to have some functions like start_service(), stop_service() that could be used by services/daemons in /etc/rc.d/* like sshd or others.
For example, stop_service() basically could do:

stop_service() {
local SUCCESS=0
local SERVICE=$1
local PIDFILE=/var/run/$SERVICE.pid
#[ $VERBOSE -eq 1 ] && echo -n "Stopping $SERVICE:\t"
if [ -f /var/run/$SERVICE.pid ]; then
kill $(< /var/run/$SERVICE.pid)
if [ $? -ne 0 ]; then
SUCCESS=1
rm -f /var/run/$SERVICE.pid
fi
else
killall -q /usr/sbin/$SERVICE # we could use another argument like $BINFILE instead of $SERVICE
[ $? -ne 0 ] && SUCCESS=1
fi
#if [ $VERBOSE -eq 1 ]; then
# if [ $SUCCESS -eq 1 ]; then
# echo "[OK]"
# else
# echo "[FAILED]"
# fi
#fi
}
-- note that this is only an idea and of course it could be written better, have global vars like $VERBOSE, etc.



*** (lvm/mdadm) ***

For what I see, /etc/rc.hooks/sysinit/udev-runner1 is the place where lvm/mdadm lives. Can't be possible to move this stuff to their respective daemons in /etc/rc.d/lvm and /etc/rc.d/mdadm? It could be a clean way and better for boxes where no lvm/mdadm config is required and/or used.



*** (miscelaneous) ***

Why you added -8 --noclear to inittab?
-- c1:2:respawn:/sbin/agetty 38400 tty1 linux
++ c1:2:respawn:/sbin/agetty 38400 -8 --noclear tty1 linux
IMHO, I would leave it as is and give users freedom to change or not.

Why not move rc.engine/tlkd to functions as tlkd(), or even to /etc/rc.d/tlkd as a complete daemon service?


I'm sure I missed something but at least I hope I have expressed my ideas and opinions.

Best regards,

(1) https://wiki.archlinux.org/index.php/Arch_Boot_Process#.2Fetc.2Frc.sysinit
(2) https://wiki.archlinux.org/index.php/Arch_Boot_Process#Custom_hooks

--
Jose V Beneyto | http://sepen.it.cx/

_______________________________________________
crux-devel mailing list
crux-devel@lists.crux.nu
http://lists.crux.nu/mailman/listinfo/crux-devel

Reply via email to