From: Mark Lawrence (nomad_at_null.net)
Date: Wed 25 Feb 2004 - 21:25:08 GMT
On Wed, 11 Feb 2004, Mark Lawrence wrote:
> Therefore I would like to propose the following interface between
> kernel/vshelper.
> vshelper <action> <ctx> [<arg...>]
...
> vshelper reboot <ctx> reboot|halt|poweroff|cad_on|cad_off|{restart2 arg}
>
> (actually I would just let the kernel pass the actual hex value of flag).
So I've implemented and tested this, and it works beautifully. From a
virtual server I can now run the native halt or reboot command, which
talks to init via /dev/initctl. Init does its magic and then calls reboot
-f which does the sys_reboot.
sys_reboot calls vshelper with the appropriate arguments and with the
following patch to /usr/sbin/vserver cleans things up. I have no rebootmgr
on the system :)
I therefore submit the following for inclusion...
userspace helper:
http://rekudos.net/download/vshelper-new.
and the following patches to vserver to add "vserver <host> kill" command
and to sys.c (apply over vserver patch) to slighly modify the calling
parameters of vshelper.
Also need to do:
echo "location of vshelper" > /proc/sys/kernel/vshelper
The next step for proper integration would be to change "vserver <host>
stop" and "start" to actually use the init/halt without fiddling
with rc scripts.
Cheers, Mark.
-- Mark Lawrence (nomad_at_null.net)--- vserver Fri Feb 6 22:10:50 2004 +++ vserver-new Wed Feb 25 21:13:24 2004 @@ -651,6 +651,23 @@ cd / test -x /etc/vservers/$1.sh && /etc/vservers/$1.sh post-stop $1 ifconfig_iproot_off $1 +elif [ "$2" = "kill" ] ; then + echo killing virtual server $1 + IPROOT= + IPROOTMASK= + IPROOTBCAST= + IPROOTDEV= + CAPS= + IS_MINIT= + readlastconf $1 + echo Killing all processes + $CHBIND_CMD --silent $IPOPT \ + $CHCONTEXT_CMD $CAPS --secure --silent --ctx $S_CONTEXT \ + $VSERVERKILLALL_CMD + umountproc $VROOTDIR/$1 + cd / + test -x /etc/vservers/$1.sh && /etc/vservers/$1.sh post-stop $1 + ifconfig_iproot_off $1 elif [ "$2" = "restart" ] ; then if $0 $1 running then
--- sysold.c Thu Feb 12 18:42:08 2004 +++ sys.c Wed Feb 25 21:03:33 2004 @@ -286,9 +286,10 @@ * the following arguments * * argv [0] = vshelper_path; - * argv [1] = context identifier - * argv [2] = "restart", "halt", "poweroff", ... - * argv [3] = additional argument (restart2) + * argv [1] = "reboot" + * argv [2] = context identifier + * argv [3] = cmd (first argument to this function, as hexidecimal string) + * argv [4] = additional argument (restart2 only) * * envp [*] = type-specific parameters */ @@ -298,38 +299,28 @@ { char id_buf[8], cmd_buf[32]; char uid_buf[32], pid_buf[32]; - char buffer[256]; + char buffer[256];
- char *argv[] = {vshelper_path, id_buf, NULL, NULL, 0}; + char *argv[] = {vshelper_path, "reboot", id_buf, cmd_buf, 0, 0}; char *envp[] = {"HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", - uid_buf, pid_buf, cmd_buf, 0}; + uid_buf, pid_buf, 0};
snprintf(id_buf, sizeof(id_buf)-1, "%d", current->vx_id); + snprintf(cmd_buf, sizeof(cmd_buf)-1, "0x%08x", cmd);
- snprintf(cmd_buf, sizeof(cmd_buf)-1, "VS_CMD=%08x", cmd); snprintf(uid_buf, sizeof(uid_buf)-1, "VS_UID=%d", current->uid); snprintf(pid_buf, sizeof(pid_buf)-1, "VS_PID=%d", current->pid);
- switch (cmd) { - case LINUX_REBOOT_CMD_RESTART: - argv[2] = "restart"; - break; - - case LINUX_REBOOT_CMD_HALT: - argv[2] = "halt"; - break; - - case LINUX_REBOOT_CMD_POWER_OFF: - argv[2] = "poweroff"; - break; - + switch (cmd) { case LINUX_REBOOT_CMD_RESTART2: if (strncpy_from_user(&buffer[0], (char *)arg, sizeof(buffer) - 1) < 0) return -EFAULT; argv[3] = buffer; + case LINUX_REBOOT_CMD_CAD_ON: + case LINUX_REBOOT_CMD_CAD_OFF: + return 0 default: - argv[2] = "restart2"; break; }
_______________________________________________ Vserver mailing list Vserver_at_list.linux-vserver.org http://list.linux-vserver.org/mailman/listinfo/vserver