[PATCH 02/16] Remove from init.c/loader.c things that systemd does for us.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



* We don't need to populate /dev.
* We don't need to mount filesystems.
* We don't need to start dbus or udevd.
* We don't need to start a shell in multiple places.
---
 data/systemd/Makefile.am    |    2 +-
 data/systemd/loader.service |    8 +-
 data/systemd/tmp.mount      |    9 ++
 loader/devices.h            |  103 -----------------
 loader/init.c               |  268 +------------------------------------------
 loader/loader.c             |   76 +------------
 6 files changed, 19 insertions(+), 447 deletions(-)
 create mode 100644 data/systemd/tmp.mount
 delete mode 100644 loader/devices.h

diff --git a/data/systemd/Makefile.am b/data/systemd/Makefile.am
index 4185ddb..cebbd2c 100644
--- a/data/systemd/Makefile.am
+++ b/data/systemd/Makefile.am
@@ -18,7 +18,7 @@
 # Author: Chris Lumens <clumens@xxxxxxxxxx>
 
 systemddir           = /lib/systemd/system
-dist_systemd_DATA = anaconda-shell.service anaconda.target loader.service
+dist_systemd_DATA = anaconda-shell.service anaconda.target loader.service tmp.mount
 
 MAINTAINERCLEANFILES = Makefile.in
 
diff --git a/data/systemd/loader.service b/data/systemd/loader.service
index 3b6b726..d808067 100644
--- a/data/systemd/loader.service
+++ b/data/systemd/loader.service
@@ -1,12 +1,12 @@
 [Unit]
 Description=The anaconda loader
-Requires=dbus.service udev.service rsyslog.service
-After=dbus.service udev.service rsyslog.service
+Requires=dbus.service udev.service rsyslog.service tmp.mount
+After=dbus.service udev.service rsyslog.service tmp.mount
 
 [Service]
-Environment=HOME=/
+Environment=HOME=/root MALLOC_CHECK_=2 MALLOC_PERTURB_=204 PATH=/usr/bin:/bin:/sbin:/usr/sbin:/mnt/sysimage/bin:/mnt/sysimage/usr/bin:/mnt/sysimage/usr/sbin:/mnt/sysimage/sbin PYTHONPATH=/tmp/updates TERM=linux
 Type=oneshot
-WorkingDirectory=/
+WorkingDirectory=/root
 ExecStart=/sbin/loader
 StandardInput=tty-force
 KillMode=process-group
diff --git a/data/systemd/tmp.mount b/data/systemd/tmp.mount
new file mode 100644
index 0000000..5a42685
--- /dev/null
+++ b/data/systemd/tmp.mount
@@ -0,0 +1,9 @@
+[Unit]
+Description=Runtime Directory
+Before=loader.service
+
+[Mount]
+What=tmpfs
+Where=/tmp
+Type=tmpfs
+Options=size=250m
diff --git a/loader/devices.h b/loader/devices.h
deleted file mode 100644
index 974e792..0000000
--- a/loader/devices.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * devices.h: handle declaration of devices to be created under /dev
- *
- * Copyright (C) 2004  Red Hat, Inc.  All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef LOADER_INIT_DEVICES_H
-#define LOADER_INIT_DEVICES_H
-
-struct devnode {
-    char * devname;
-    int type;
-    int major;
-    int minor;
-    int perms;
-    char * owner;
-    char * group;
-};
-
-#define CHARDEV 0
-#define BLOCKDEV 1
-#define DIRTYPE 2
-
-struct devnode devnodes[] = {
-    /* consoles */
-    {"console", CHARDEV, 5, 1, 0600, "root", "root"},
-    {"ttyS0", CHARDEV, 4, 64, 0600, "root", "root"},
-    {"ttyS1", CHARDEV, 4, 65, 0600, "root", "root"},
-    {"ttyS2", CHARDEV, 4, 66, 0600, "root", "root"},
-    {"ttyS3", CHARDEV, 4, 67, 0600, "root", "root"},
-#ifdef __ia64__
-    {"ttySG0", CHARDEV, 204, 40, 0600, "root", "root"},
-#endif
-#ifdef __powerpc__
-    {"hvsi0", CHARDEV, 229, 128, 0600, "root", "root"},
-    {"hvsi1", CHARDEV, 229, 129, 0600, "root", "root"},
-    {"hvsi2", CHARDEV, 229, 130, 0600, "root", "root"},
-#endif
-    {"hvc0", CHARDEV, 229, 0, 0600, "root", "root"},
-#if defined(__i386__) || defined(__x86_64__) || defined(__ia64__)
-    {"xvc0", CHARDEV, 204, 191, 0600, "root", "root"},
-#endif
-    /* base unix */
-    {"null", CHARDEV, 1, 3, 0666, "root", "root"},
-    {"zero", CHARDEV, 1, 5, 0666, "root", "root"},
-    {"mem", CHARDEV, 1, 1, 0600, "root", "root"},
-    /* ttys */
-    {"pts", DIRTYPE, 0, 0, 0755, "root", "root"},
-    {"ptmx", CHARDEV, 5, 2, 0666, "root", "root"},
-    {"tty", CHARDEV, 5, 0, 0666, "root", "root"},
-    {"tty0", CHARDEV, 4, 0, 0600, "root", "tty"},
-    {"tty1", CHARDEV, 4, 1, 0600, "root", "tty"},
-    {"tty2", CHARDEV, 4, 2, 0600, "root", "tty"},
-    {"tty3", CHARDEV, 4, 3, 0600, "root", "tty"},
-    {"tty4", CHARDEV, 4, 4, 0600, "root", "tty"},
-    {"tty5", CHARDEV, 4, 5, 0600, "root", "tty"},
-    {"tty6", CHARDEV, 4, 6, 0600, "root", "tty"},
-    {"tty7", CHARDEV, 4, 7, 0600, "root", "tty"},
-    {"tty8", CHARDEV, 4, 8, 0600, "root", "tty"},
-    {"tty9", CHARDEV, 4, 9, 0600, "root", "tty"},
-    /* fb */
-    {"fb0", CHARDEV, 29, 0, 0600, "root", "tty"},
-    /* sparc specific */
-#ifdef __sparc__
-    {"openprom", CHARDEV, 10, 139, 0644, "root", "root"},
-    {"sunmouse", CHARDEV, 10, 6, 0644, "root", "root"},
-    {"kbd", CHARDEV, 11, 0, 0644, "root", "root"},
-#endif
-    /* X */
-    {"agpgart", CHARDEV, 10, 175, 0664, "root", "root"},
-    {"psaux", CHARDEV, 10, 1, 0644, "root", "root"},
-    {"input", DIRTYPE, 0, 0, 0755, "root", "root"},
-    {"input/mice", CHARDEV, 13, 63, 0664, "root", "root"},
-    /* floppies */
-    {"fd0", BLOCKDEV, 2, 0, 0644, "root", "root"},
-    {"fd1", BLOCKDEV, 2, 1, 0644, "root", "root"},
-    /* random */
-    {"random", CHARDEV, 1, 8, 0644, "root", "root"},
-    {"urandom", CHARDEV, 1, 9, 0644, "root", "root"},
-    /* mac stuff */
-#ifdef __powerpc__
-    {"nvram", CHARDEV, 10, 144, 0644, "root", "root"},
-    {"adb", CHARDEV, 56, 0, 0644, "root", "root"},
-    {"iseries", DIRTYPE, 0, 0, 0755, "root", "root" },
-#endif
-    {"rtc", CHARDEV, 10, 135, 0644, "root", "root"},
-    { NULL, 0, 0, 0, 0, NULL, NULL },
-};
-
-#endif
diff --git a/loader/init.c b/loader/init.c
index 65df89c..bdcf614 100644
--- a/loader/init.c
+++ b/loader/init.c
@@ -52,49 +52,12 @@
 
 #include "init.h"
 #include "copy.h"
-#include "devices.h"
 #include "modules.h"
 #include "readvars.h"
 
 #include <asm/types.h>
 #include <linux/serial.h>
 
-#ifndef MS_REMOUNT
-#define MS_REMOUNT          32
-#endif
-
-#define ENV_PATH            0
-#define ENV_LD_LIBRARY_PATH 1
-#define ENV_HOME            2
-#define ENV_TERM            3
-#define ENV_DEBUG           4
-#define ENV_TERMINFO        5
-#define ENV_PYTHONPATH      6
-#define ENV_MALLOC_CHECK    7
-#define ENV_MALLOC_PERTURB  8
-
-char * env[] = {
-    "PATH=/usr/bin:/bin:/sbin:/usr/sbin:/mnt/sysimage/bin:"
-    "/mnt/sysimage/usr/bin:/mnt/sysimage/usr/sbin:/mnt/sysimage/sbin:"
-    "/mnt/sysimage/usr/X11R6/bin",
-
-    /* we set a nicer ld library path specifically for bash -- a full
-       one makes anaconda unhappy */
-#if defined(__x86_64__) || defined(__s390x__) || defined(__powerpc64__) || (defined(__sparc__) && defined(__arch64__))
-    "LD_LIBRARY_PATH=/lib64:/usr/lib64:/lib:/usr/lib",
-#else
-    "LD_LIBRARY_PATH=/lib:/usr/lib",
-#endif
-    "HOME=/root",
-    "TERM=linux",
-    "DEBUG=",
-    "TERMINFO=/etc/linux-terminfo",
-    "PYTHONPATH=/tmp/updates",
-    "MALLOC_CHECK_=2",
-    "MALLOC_PERTURB_=204",
-    NULL
-};
-
 static char *VIRTIO_PORT = "/dev/virtio-ports/org.fedoraproject.anaconda.log.0";
 
 /* 
@@ -116,13 +79,6 @@ struct termios ts;
 static int expected_exit = 0;
 static GHashTable *cmdline = NULL;
 
-static void doExit(int) __attribute__ ((noreturn));
-static void doExit(int result)
-{
-    expected_exit = 1;
-    exit(result);
-}
-
 static void printstr(char * string) {
     write(1, string, strlen(string));
 }
@@ -232,49 +188,6 @@ static int termcmp(struct termios *a, struct termios *b) {
 }
 #endif
 
-static void createDevices(void) {
-    int i;
-
-    /*	unset the umask so devices are created with correct perms
-	and not complemented by the previous umask call */
-
-    mode_t previous_umask = umask(0); 
-
-    for (i = 0; devnodes[i].devname != NULL; i++) {
-        char devname[64];
-        int type = -1;
-
-        snprintf(devname, 63, "/dev/%s", devnodes[i].devname);
-        switch (devnodes[i].type) {
-        case DIRTYPE:
-            if (mkdir(devname, devnodes[i].perms) < 0) {
-                fprintf(stderr, "Unable to create directory %s: %m\n",
-                        devname);
-            }
-            break;
-        case CHARDEV:
-            type = S_IFCHR;
-            break;
-        case BLOCKDEV:
-            type = S_IFBLK;
-            break;
-        }
-        if (type == -1) continue;
-
-        if (mknod(devname, type | devnodes[i].perms, 
-                  makedev(devnodes[i].major, devnodes[i].minor)) < 0)
-            fprintf(stderr, "Unable to create device %s: %m\n", devname);
-    }
-
-    /* Hurray for hacks, this stops /lib/udev/rules.d/65-md-incremental.rules
-       from medling with mdraid sets. */
-    i = creat("/dev/.in_sysinit", 0644);
-    close(i);
-
-    /* Restore umask for minimal side affects */
-    umask(previous_umask); 
-}
-
 static void termReset(void) {
     /* change to tty1 */
     ioctl(0, VT_ACTIVATE, 1);
@@ -383,21 +296,6 @@ static int onQEMU(void)
     return ret;
 }
 
-static int getInitPid(void) {
-    int fd = 0, pid = -1;
-    char * buf = calloc(1, 10);
-
-    fd = open("/var/run/init.pid", O_RDONLY);
-    if (fd < 0) {
-        fprintf(stderr, "Unable to find pid of init!!!\n");
-        return -1;
-    }
-    read(fd, buf, 9);
-    close(fd);
-    sscanf(buf, "%d", &pid);
-    return pid;
-}
-
 static void copyErrorFn (char *msg) {
     printf(msg);
 }
@@ -514,7 +412,7 @@ static void setupEnv(void)
 }
 
 int main(int argc, char **argv) {
-    pid_t installpid, childpid;
+    pid_t installpid;
     int waitStatus;
     int fd = -1;
     int doShutdown =0;
@@ -531,26 +429,6 @@ int main(int argc, char **argv) {
     int ret;
     gpointer value = NULL;
 
-    if (!strncmp(basename(argv[0]), "poweroff", 8)) {
-        printf("Running poweroff...\n");
-        fd = getInitPid();
-        if (fd > 0)
-            kill(fd, SIGUSR2);
-        doExit(0);
-    } else if (!strncmp(basename(argv[0]), "halt", 4)) {
-        printf("Running halt...\n");
-        fd = getInitPid();
-        if (fd > 0)
-            kill(fd, SIGUSR1);
-        doExit(0);
-    } else if (!strncmp(basename(argv[0]), "reboot", 6)) {
-        printf("Running reboot...\n");
-        fd = getInitPid();
-        if (fd > 0)
-            kill(fd, SIGINT);
-        doExit(0);
-    }
-
     /* turn off screen blanking */
     printstr("\033[9;0]");
     printstr("\033[8]");
@@ -567,12 +445,6 @@ int main(int argc, char **argv) {
 
     printf("anaconda installer init version %s starting\n", VERSION);
 
-    printf("mounting /proc filesystem... "); 
-    mount("/proc", "proc", "proc", 0, NULL);
-    if (access("/proc/cmdline", R_OK) == -1)
-        fatal_error(1);
-    printf("done\n");
-
     cmdline = readvars_parse_file("/proc/cmdline");
 
     /* check for development mode early */
@@ -589,57 +461,6 @@ int main(int argc, char **argv) {
         }
     }
 
-    printf("creating /dev filesystem... "); 
-    mount("/dev", "/dev", "tmpfs", 0, NULL);
-    if (access("/dev", W_OK) == -1)
-        fatal_error(1);
-    createDevices();
-    printf("done\n");
-    printf("starting udev...");
-    if ((childpid = fork()) == 0) {
-        execl("/sbin/udevd", "/sbin/udevd", "--daemon", NULL);
-        exit(1);
-    }
-    
-    /* wait at least until the udevd process that we forked exits */
-    do {
-        pid_t retpid;
-        int waitstatus;
-
-        retpid = wait(&waitstatus);
-        if (retpid == -1) {
-            if (errno == EINTR)
-                continue;
-            /* if the child exited before we called waitpid, we can get
-             * ECHILD without anything really being wrong; we just lost
-             * the race.*/
-            if (errno == ECHILD)
-                break;
-            printf("init: error waiting on udevd: %m\n");
-            exit(1);
-        } else if ((retpid == childpid) && WIFEXITED(waitstatus)) {
-            break;
-        }
-    } while (1);
-    
-    if (fork() == 0) {
-        execl("/sbin/udevadm", "udevadm", "control", "--env=ANACONDA=1", NULL);
-        exit(1);
-    }
-    printf("done\n");
-
-    printf("mounting /dev/pts (unix98 pty) filesystem... "); 
-    mount("/dev/pts", "/dev/pts", "devpts", 0, NULL);
-    if (access("/dev/pts/ptmx", F_OK) == -1)
-        fatal_error(1);
-    printf("done\n");
-
-    printf("mounting /sys filesystem... "); 
-    mount("/sys", "/sys", "sysfs", 0, NULL);
-    if (access("/sys/class/block", R_OK) == -1)
-        fatal_error(1);
-    printf("done\n");
-
     /* if anaconda dies suddenly we are doomed, so at least make a coredump */
     struct rlimit corelimit = { RLIM_INFINITY,  RLIM_INFINITY};
     ret = setrlimit(RLIMIT_CORE, &corelimit);
@@ -764,60 +585,10 @@ int main(int argc, char **argv) {
         tcsetattr(0, TCSANOW, &ts);
     }
 
-    ret = sethostname("localhost.localdomain", 21);
-    /* the default domainname (as of 2.0.35) is "(none)", which confuses 
-     glibc */
-    ret = setdomainname("", 0);
-
-    printf("trying to remount root filesystem read write... ");
-    mount("/", "/", "remount", MS_REMOUNT, NULL);
-    printf("done\n");
-
-    /* we want our /tmp to be tmpfs, but we also want to let people hack
-     * their initrds to add things like a ks.cfg, so this has to be a little
-     * tricky */
-    rename("/tmp", "/oldtmp");
-    mkdir("/tmp", 0755);
-
-    printf("mounting /tmp as tmpfs... ");
-    mount("none", "/tmp", "tmpfs", 0, "size=250m");
-    if (access("/tmp", W_OK) == -1)
-        fatal_error(1);
-    printf("done\n");
-
-    copyDirectory("/oldtmp", "/tmp", copyErrorFn, copyErrorFn);
-    unlink("/oldtmp");
-
     /* Now we have some /tmp space set up, and /etc and /dev point to
        it. We should be in pretty good shape. */
     startSyslog();
 
-    /* write out a pid file */
-    if ((fd = open("/var/run/init.pid", O_WRONLY|O_CREAT, 0644)) > 0) {
-        char * buf = malloc(10);
-
-        snprintf(buf, 9, "%d", getpid());
-        write(fd, buf, strlen(buf));
-        close(fd);
-        free(buf);
-    } else {
-        printf("unable to write init.pid (%d): %m\n", errno);
-        sleep(2);
-    }
-
-    /* D-Bus */
-    if (fork() == 0) {
-        execl("/bin/dbus-uuidgen", "/bin/dbus-uuidgen", "--ensure", NULL);
-        doExit(1);
-    }
-
-    if (fork() == 0) {
-        execl("/bin/dbus-daemon", "/bin/dbus-daemon", "--system", NULL);
-        doExit(1);
-    }
-
-    sleep(2);
-
     /* Go into normal init mode - keep going, and then do a orderly shutdown
        when:
 
@@ -854,22 +625,7 @@ int main(int argc, char **argv) {
 
     /* set up the ctrl+alt+delete handler to kill our pid, not pid 1 */
     signal(SIGINT, sigintHandler);
-    if ((fd = open("/proc/sys/kernel/cad_pid", O_WRONLY)) != -1) {
-        char buf[7];
-        size_t count;
-        sprintf(buf, "%d", getpid());
-        count = write(fd, buf, strlen(buf));
-        close(fd);
-        /* if we succeeded in writing our pid, turn off the hard reboot
-           ctrl-alt-del handler */
-        if (count == strlen(buf) &&
-            (fd = open("/proc/sys/kernel/ctrl-alt-del", O_WRONLY)) != -1) {
 
-            write(fd, "0", 1);
-            close(fd);
-        }
-    }
-    
     while (!doShutdown) {
         pid_t childpid;
         childpid = wait(&waitStatus);
@@ -897,28 +653,6 @@ int main(int argc, char **argv) {
         }
         printf("\n");
 
-        /* If debug mode was requested, spawn shell */
-        if(isDevelMode) {
-            pid_t shellpid;
-
-            printf("Development mode requested spawning shell...\n");
-
-            if ((shellpid = fork()) == 0) {
-                if (chdir("/root") == 0) {
-                    execl("/bin/bash", "/bin/bash", NULL);
-                } else {
-                    perror("Unable to chdir to /root");
-                }
-            }
-            else if (shellpid > 0) {
-                waitpid(shellpid, NULL, 0);
-            }
-            else {
-                perror("Execution of debug shell failed.");
-            }
-
-        }
-
     } else {
         shutdown_method = REBOOT;
     }
diff --git a/loader/loader.c b/loader/loader.c
index d4437c3..b32e5ce 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -358,62 +358,6 @@ static void initializeTtys(void) {
     }
 }
 
-static void spawnShell(void) {
-    pid_t pid;
-
-    if (FL_SERIAL(flags) || FL_NOSHELL(flags)) {
-        logMessage(INFO, "not spawning a shell");
-        return;
-    } else if (access("/bin/sh",  X_OK))  {
-        logMessage(ERROR, "cannot open shell - /bin/sh doesn't exist");
-        return;
-    }
-
-    if (!(pid = fork())) {
-	int fd;
-
-    	fd = open("/dev/tty2", O_RDWR|O_NOCTTY);
-    	if (fd < 0) {
-            logMessage(ERROR, "cannot open /dev/tty2 -- no shell will be provided");
-	    return;
-	}
-
-        dup2(fd, 0);
-        dup2(fd, 1);
-        dup2(fd, 2);
-        
-        close(fd);
-        setsid();
-
-	/* enable UTF-8 console */
-	printf("\033%%G");
-	fflush(stdout);
-	isysLoadFont();
-	
-        if (ioctl(0, TIOCSCTTY, NULL)) {
-            logMessage(ERROR, "could not set new controlling tty");
-        }
-        
-        signal(SIGINT, SIG_DFL);
-        signal(SIGTSTP, SIG_DFL);
-
-        if (!access("/tmp/updates/pyrc.py", R_OK|X_OK))
-            setenv("PYTHONSTARTUP", "/tmp/updates/pyrc.py", 1);
-        else if (!access("/usr/share/anaconda/pyrc.py", R_OK|X_OK))
-            setenv("PYTHONSTARTUP", "/usr/share/anaconda/pyrc.py", 1);
-        setenv("LD_LIBRARY_PATH", LIBPATH, 1);
-        setenv("LANG", "C", 1);
-        
-        if (execl("/bin/sh", "-/bin/sh", NULL) == -1) {
-            logMessage(CRITICAL, "exec of /bin/sh failed: %m");
-            exit(1);
-        }
-    }
-
-    return;
-}
-
-
 static void copyWarnFn (char *msg) {
    logMessage(WARNING, msg);
 }
@@ -2048,9 +1992,6 @@ int main(int argc, char ** argv) {
     /* Save list of preloaded modules so we can restore the state */
     moduleState = mlSaveModuleState();
 
-    /* Load all known devices */
-    busProbe(FL_NOPROBE(flags));
-
     if (FL_AUTOMODDISK(flags)) {
         /* Load all autodetected DDs */
         logMessage(INFO, "Trying to detect vendor driver discs");
@@ -2173,23 +2114,14 @@ int main(int argc, char ** argv) {
     /* now load SELinux policy before exec'ing anaconda and the shell
      * (if we're using SELinux) */
     if (FL_SELINUX(flags)) {
-        if (mount("/selinux", "/selinux", "selinuxfs", 0, NULL)) {
-            logMessage(ERROR, "failed to mount /selinux: %m, disabling SELinux");
-            flags &= ~LOADER_FLAGS_SELINUX;
+        if (loadpolicy() == 0) {
+            setexeccon(ANACONDA_CONTEXT);
         } else {
-            if (loadpolicy() == 0) {
-                setexeccon(ANACONDA_CONTEXT);
-            } else {
-                logMessage(ERROR, "failed to load policy, disabling SELinux");
-                flags &= ~LOADER_FLAGS_SELINUX;
-            }
+            logMessage(ERROR, "failed to load policy, disabling SELinux");
+            flags &= ~LOADER_FLAGS_SELINUX;
         }
     }
 
-    logMessage(INFO, "getting ready to spawn shell now");
-
-    spawnShell();  /* we can attach gdb now :-) */
-
     if (FL_NOPROBE(flags) && !loaderData.ksFile) {
         startNewt();
         manualDeviceCheck(&loaderData);
-- 
1.7.4.1

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/anaconda-devel-list


[Index of Archives]     [Kickstart]     [Fedora Users]     [Fedora Legacy List]     [Fedora Maintainers]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]
  Powered by Linux