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 ([EMAIL PROTECTED])


--- 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
[EMAIL PROTECTED]
http://list.linux-vserver.org/mailman/listinfo/vserver

Reply via email to