From 855c7d8251bbaf9948e731282f7ee1388fd6e240 Mon Sep 17 00:00:00 2001 From: Joachim Nilsson Date: Mon, 17 Sep 2012 16:00:00 +0200 Subject: [PATCH] Assume kernel has devtmpfs enabled --> cleanup device creation & mount Cleanup device creation and initial mount by assuming that the kernel has devtmpfs enabled. This is the default for most modern GNU/Linux distributions. See http://lwn.net/Articles/331818/ for more info. Also, since finit is targeted at deeply embedded systems hooks for the BusyBox udev replacement, mdev has been added. If MDEV is defined in the build it will take care of both hotplugging of devices and initial setup of /dev Signed-off-by: Joachim Nilsson --- Makefile | 16 ++++++----- common.mk | 1 - finit.c | 86 +++++++++++++------------------------------------------ finit.h | 82 +++++++++++++++++++++++++++++----------------------- initctl.c | 2 +- 5 files changed, 76 insertions(+), 111 deletions(-) diff --git a/Makefile b/Makefile index 39813475..e8c92ff1 100644 --- a/Makefile +++ b/Makefile @@ -31,13 +31,14 @@ EXEC = finit OBJS = finit.o helpers.o initctl.o signal.o SRCS = $(OBJS:.o=.c) DEPS = $(addprefix .,$(SRCS:.c=.d)) -CPPFLAGS += -DVERSION=\"$(VERSION)\" -DWHOAMI=\"`whoami`@`hostname`\" -CPPFLAGS += -DLISTEN_INITCTL -DBUILTIN_RUNPARTS -CPPFLAGS += -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -D_GNU_SOURCE +CFLAGS += -W -Wall -Werror -Os # Disable annoying gcc warning for "warn_unused_result", see GIT 37af997 CPPFLAGS += -U_FORTIFY_SOURCE CPPFLAGS += -I$(ROOTDIR)/$(CONFIG_LINUXDIR)/include/ -CFLAGS += -W -Wall -Werror -Os +# Build for embedded systems, not notebook by default, see finit.h +CPPFLAGS += -DEMBEDDED_SYSTEM -DBUILTIN_RUNPARTS +CPPFLAGS += -DVERSION=\"$(VERSION)\" -DWHOAMI=\"`whoami`@`hostname`\" +CPPFLAGS += -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -D_GNU_SOURCE prefix ?= /usr/local sysconfdir ?= /etc @@ -52,21 +53,22 @@ $(OBJS): Makefile finit: $(OBJS) +# @ln -sf /sbin/finit /sbin/init install: all @install -d $(DESTDIR)$(prefix)/sbin @install -d $(DESTDIR)$(sysconfdir) @install -d $(DESTDIR)$(datadir) @install -d $(DESTDIR)$(mandir) - @for file in $(EXEC); do \ + @for file in $(EXEC); do \ + printf " INSTALL $(DESTDIR)$(prefix)/sbin/$$file\n"; \ install -m 0755 $$file $(DESTDIR)$(prefix)/sbin/$$file; \ done - @ln -sf /sbin/finit /sbin/init uninstall: -@for file in $(EXEC); do \ + printf " REMOVE $(DESTDIR)$(prefix)/sbin/$$file\n"; \ $(RM) $(DESTDIR)$(prefix)/sbin/$$file; \ done - -@$(RM) /sbin/finit /sbin/init clean: -@$(RM) $(OBJS) $(DEPS) $(EXEC) diff --git a/common.mk b/common.mk index f2a810ab..678e1123 100644 --- a/common.mk +++ b/common.mk @@ -1,6 +1,5 @@ # Some junk files we always want to be removed when doing a make clean. JUNK = *~ *.bak *.aux *.dvi *.idx *.ind *.log *.ps *.map .*.d DEADJOE semantic.cache *.gdb *.elf core core.* -RM := -@$(RM) MAKE := @$(MAKE) MAKEFLAGS = --no-print-directory diff --git a/finit.c b/finit.c index a6d28ca2..dd661dd3 100644 --- a/finit.c +++ b/finit.c @@ -79,8 +79,24 @@ int main(void) chdir("/"); umask(022); + /* + * Mount base file system, kernel is assumed to run devtmpfs for /dev + */ mount("none", "/proc", "proc", 0, NULL); + mount("none", "/proc/bus/usb", "usbfs", 0, NULL); mount("none", "/sys", "sysfs", 0, NULL); + mkdir("/dev/pts", 0755); + mkdir("/dev/shm", 0755); + mount("none", "/dev/pts", "devpts", 0, "gid=5,mode=620"); + mount("none", "/dev/shm", "tmpfs", 0, NULL); + + /* + * Populate /dev and prepare for runtime events from kernel. + */ +#ifdef MDEV + system("sysctl -w kernel.hotplug=" MDEV); + system(MDEV " -s"); +#endif /* * Parse kernel parameters @@ -153,44 +169,12 @@ int main(void) system(cmd); continue; } -#ifdef MAKE_DEVICES - /* This is used if the system uses udev and doesn't - * mount /dev as tmpfs in the initrd, or if it doesn't - * use an initrd. Mount /dev as tmpfs and create basic - * device nodes. - */ - if (MATCH_CMD(line, "mountdev", x)) { - mount("none", "/dev", "tmpfs", 0, "mode=0755"); - chardev("/dev/null", 0666, 1, 3); - blkdev("/dev/sda1", 0660, 8, 1); - blkdev("/dev/sda2", 0660, 8, 2); - blkdev("/dev/sda3", 0660, 8, 3); - blkdev("/dev/sda4", 0660, 8, 4); - blkdev("/dev/sda5", 0660, 8, 5); - blkdev("/dev/sda6", 0660, 8, 6); -#ifdef MAKE_DEV_VCS - /* Caio reports that newer X.org needs these */ - blkdev("/dev/vcs1", 0660, 7, 1); - blkdev("/dev/vcs2", 0660, 7, 2); - blkdev("/dev/vcs3", 0660, 7, 3); - blkdev("/dev/vcs4", 0660, 7, 4); - blkdev("/dev/vcsa1", 0660, 7, 129); - blkdev("/dev/vcsa2", 0660, 7, 130); - blkdev("/dev/vcsa3", 0660, 7, 131); - blkdev("/dev/vcsa4", 0660, 7, 132); -#endif - continue; - } - /* This works only if /dev is tmpfs! If not, create - * devices statically on the filesystem - */ if (MATCH_CMD(line, "mknod ", x)) { strcpy(cmd, "/bin/mknod "); build_cmd(cmd, x, CMD_SIZE); system(cmd); continue; } -#endif } fclose(f); } @@ -203,42 +187,12 @@ int main(void) #ifdef REMOUNT_ROOTFS_RW system("/bin/mount -n -o remount,rw /"); #endif - umask(0); - -#ifdef MAKE_DEVICES - mkdir("/dev/shm", 0755); - mkdir("/dev/pts", 0755); -#endif - - mount("none", "/dev/pts", "devpts", 0, "gid=5,mode=620"); - mount("none", "/dev/shm", "tmpfs", 0, NULL); - mount("none", "/tmp", "tmpfs", 0, "mode=1777,size=128m"); - mount("none", "/var/run", "tmpfs", 0, "mode=0755"); - mount("none", "/var/lock", "tmpfs", 0, "mode=1777"); - mount("none", "/proc/bus/usb", "usbfs", 0, NULL); +#ifdef SYSROOT mount(SYSROOT, "/", NULL, MS_MOVE, NULL); - - _d("make devices"); -#ifdef MAKE_DEVICES - mkdir("/dev/input", 0755); - chardev("/dev/urandom", 0666, 1, 9); - chardev("/dev/ptmx", 0666, 5, 2); - chardev("/dev/null", 0666, 1, 3); - chmod("/dev/null", 0666); - chardev("/dev/mem", 0640, 1, 1); - chardev("/dev/tty0", 0660, 4, 0); - chardev("/dev/tty1", 0660, 4, 1); - chardev("/dev/tty2", 0660, 4, 2); - chardev("/dev/tty3", 0660, 4, 3); - chardev("/dev/input/mice", 0660, 13, 63); - chardev("/dev/input/event0", 0660, 13, 64); - chardev("/dev/agpgart", 0660, 10, 175); - blkdev("/dev/loop0", 0600, 7, 0); #endif - + umask(0); unlink("/etc/mtab"); system("mount -a"); - umask(0022); /* @@ -296,9 +250,9 @@ int main(void) run_parts("/etc/resolvconf/update.d", "-i", NULL); #else system(RUNPARTS " --arg=i /etc/resolvconf/update.d"); -#endif +#endif /* BUILTIN_RUNPARTS */ chdir("/"); -#endif +#endif /* USE_ETC_RESOLVCONF_RUN */ #ifdef TOUCH_ETC_NETWORK_RUN_IFSTATE touch("/etc/network/run/ifstate"); diff --git a/finit.h b/finit.h index 6595a07d..7729492b 100644 --- a/finit.h +++ b/finit.h @@ -47,47 +47,57 @@ /* Distribution configuration */ -#if defined DIST_MDV /* Mandriva */ -#define RANDOMSEED "/var/lib/random-seed" -#define SYSROOT "/sysroot" -#define CONSOLE "/dev/console" -#define GETTY "/usr/bin/openvt /sbin/mingetty tty2" -#define RUNPARTS "/usr/bin/run-parts" -#define REMOUNT_ROOTFS_RW -#define MAKE_DEVICES -#define MAKE_DEV_VCS -#define PAM_CONSOLE -#define LISTEN_INITCTL -#define RUNLEVEL 5 -#define USE_MESSAGE_BUS +#if defined EMBEDDED_SYSTEM +# define CONSOLE "/dev/console" +# define MDEV "/sbin/mdev" +# define GETTY "/sbin/getty -L 115200 ttyS0 vt100" +# define LISTEN_INITCTL +#elif defined DIST_MDV /* Mandriva */ +# define RANDOMSEED "/var/lib/random-seed" +# define SYSROOT "/sysroot" +# define CONSOLE "/dev/console" +# define GETTY "/usr/bin/openvt /sbin/mingetty tty2" +# define RUNPARTS "/usr/bin/run-parts" +# define REMOUNT_ROOTFS_RW +# define PAM_CONSOLE +# define LISTEN_INITCTL +# define RUNLEVEL 5 +# define USE_MESSAGE_BUS #elif defined DIST_EEEXUBUNTU /* eeeXubuntu */ -#define RANDOMSEED "/var/lib/urandom/random-seed" -#define SYSROOT "/sysroot" -#define CONSOLE "/dev/console" -#define GETTY "/usr/bin/openvt /sbin/getty 38400 tty2" -#define RUNPARTS "/bin/run-parts" -#define REMOUNT_ROOTFS_RW -#define MAKE_DEVICES -#define TOUCH_ETC_NETWORK_RUN_IFSTATE -#define LISTEN_INITCTL -#else /* original Eeepc distribution */ -#define RANDOMSEED "/var/lib/urandom/random-seed" -#define SYSROOT "/mnt" -#define CONSOLE "/dev/console" -#define GETTY "/usr/bin/openvt /sbin/getty 38400 tty2" -#define RUNPARTS "/bin/run-parts" -#define TOUCH_ETC_NETWORK_RUN_IFSTATE -#define USE_ETC_RESOLVCONF_RUN +# define RANDOMSEED "/var/lib/urandom/random-seed" +# define SYSROOT "/sysroot" +# define CONSOLE "/dev/console" +# define GETTY "/usr/bin/openvt /sbin/getty 38400 tty2" +# define RUNPARTS "/bin/run-parts" +# define REMOUNT_ROOTFS_RW +# define TOUCH_ETC_NETWORK_RUN_IFSTATE +# define LISTEN_INITCTL +#elif defined DIST_ORIGEEE /* original EeePC distribution */ +# define RANDOMSEED "/var/lib/urandom/random-seed" +# define SYSROOT "/mnt" +# define CONSOLE "/dev/console" +# define GETTY "/usr/bin/openvt /sbin/getty 38400 tty2" +# define RUNPARTS "/bin/run-parts" +# define TOUCH_ETC_NETWORK_RUN_IFSTATE +# define USE_ETC_RESOLVCONF_RUN +#else /* Ubuntu */ +# define RANDOMSEED "/var/lib/urandom/random-seed" +# define CONSOLE "/dev/console" +# define MDEV "\"/bin/busybox mdev\"" +# define GETTY "/usr/bin/openvt /sbin/getty 38400 tty2" +# define REMOUNT_ROOTFS_RW +# define TOUCH_ETC_NETWORK_RUN_IFSTATE +# define LISTEN_INITCTL #endif #define SYNC_SHUTDOWN "/var/lock/finit.shutdown" #define SYNC_STOPPED "/var/lock/finit.stopped" #ifndef DEFUSER -#define DEFUSER "user" +# define DEFUSER "user" #endif #ifndef DEFHOST -#define DEFHOST "noname" +# define DEFHOST "noname" #endif #define LINE_SIZE 1024 @@ -96,16 +106,16 @@ #define HOSTNAME_SIZE 32 #ifndef touch -#define touch(x) mknod((x), S_IFREG|0644, 0) +# define touch(x) mknod((x), S_IFREG|0644, 0) #endif #ifndef chardev -#define chardev(x,m,maj,min) mknod((x), S_IFCHR|(m), makedev((maj),(min))) +# define chardev(x,m,maj,min) mknod((x), S_IFCHR|(m), makedev((maj),(min))) #endif #ifndef blkdev -#define blkdev(x,m,maj,min) mknod((x), S_IFBLK|(m), makedev((maj),(min))) +# define blkdev(x,m,maj,min) mknod((x), S_IFBLK|(m), makedev((maj),(min))) #endif #ifndef fexist -#define fexist(x) (access(x, F_OK) != -1) +# define fexist(x) (access(x, F_OK) != -1) #endif /* Match one command. */ diff --git a/initctl.c b/initctl.c index 0f004326..6d4005f9 100644 --- a/initctl.c +++ b/initctl.c @@ -22,7 +22,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#ifdef LISTEN_INITCTL #include #include #include @@ -45,6 +44,7 @@ struct init_request { char data[368]; }; +#ifdef LISTEN_INITCTL /* Standard reboot/shutdown utilities talk to init using /dev/initctl. * We should check if the fifo was recreated and reopen it. */