From 9986bda673cf84775d8cb2584e8573cb82553006 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Sat, 9 Dec 2006 19:25:23 +0000 Subject: [PATCH] * Move the stuff in boot-stage-2-init.sh that doesn't have to happen at boot time into a separate script. This will allow us to change the configuration without rebooting (provided that the configuration doesn't have a different kernel, init, etc.). svn path=/nixos/trunk/; revision=7294 --- boot/boot-stage-2-init.sh | 118 +----------------------- boot/boot-stage-2.nix | 33 +------ configuration/activate-configuration.sh | 110 ++++++++++++++++++++++ configuration/boot-environment.nix | 109 ++++++++++++++-------- 4 files changed, 191 insertions(+), 179 deletions(-) create mode 100644 configuration/activate-configuration.sh diff --git a/boot/boot-stage-2-init.sh b/boot/boot-stage-2-init.sh index 96d4e086275..824e89a8a75 100644 --- a/boot/boot-stage-2-init.sh +++ b/boot/boot-stage-2-init.sh @@ -72,26 +72,9 @@ mkdir -m 0755 -p /var/log ln -sf /nix/var/nix/profiles /nix/var/nix/gcroots/ -# Set up the statically computed bits of /etc. -staticEtc=/etc/static -rm -f $staticEtc -ln -s @etc@/etc $staticEtc -for i in $(cd $staticEtc && find * -type l); do - mkdir -p /etc/$(dirname $i) - rm -f /etc/$i - ln -s $staticEtc/$i /etc/$i -done - - -# Remove dangling symlinks that point to /etc/static. These are -# configuration files that existed in a previous configuration but not -# in the current one. -for i in $(find /etc/ -type l); do - target=$(readlink "$i") - if test "${target:0:${#staticEtc}}" = "$staticEtc" -a ! -e "$i"; then - rm -f "$i" - fi -done +# Run the script that performs all configuration activation that does +# not have to be done at boot time. +source @activateConfiguration@ # Ensure that the module tools can find the kernel modules. @@ -117,103 +100,10 @@ udevtrigger udevsettle # wait for udev to finish -# !!! Hack - should be done with udev rules. -chmod 666 /dev/null - - -# Enable a password-less root login. -source @accounts@ - -if ! test -e /etc/passwd; then - if test -n "@readOnlyRoot@"; then - rootHome=/ - else - rootHome=/home/root - mkdir -p $rootHome - fi - createUser root '' 0 0 'System administrator' $rootHome/var/empty @shell@ -fi - -if ! test -e /etc/group; then - echo "root:*:0" > /etc/group -fi - - -# Set up Nix accounts. -if test -z "@readOnlyRoot@"; then - - for i in $(seq 1 10); do - account=nixbld$i - if ! userExists $account; then - createUser $account x \ - $((i + 30000)) 30000 \ - 'Nix build user' /var/empty /noshell - fi - accounts="$accounts${accounts:+,}$account" - done - - if ! grep -q "^nixbld:" /etc/group; then - echo "nixbld:*:30000:$accounts" >> /etc/group - fi - - mkdir -p /nix/etc/nix - cat > /nix/etc/nix/nix.conf < /etc/profile < $wrapperDir/$i.real - chown root.root $wrapperDir/$i - chmod 4755 $wrapperDir/$i -done - - -# Set the host name. -hostname @hostName@ - - # Start an interactive shell. #exec @shell@ # Start Upstart's init. +export UPSTART_CFG_DIR=/etc/event.d exec @upstart@/sbin/init -v diff --git a/boot/boot-stage-2.nix b/boot/boot-stage-2.nix index ed157930b5f..051a7105642 100644 --- a/boot/boot-stage-2.nix +++ b/boot/boot-stage-2.nix @@ -1,19 +1,10 @@ -{ genericSubstituter, buildEnv, shell, coreutils, findutils -, gnugrep, utillinux, kernel, udev, upstart, setuidWrapper -, path ? [] +{ genericSubstituter, shell, coreutils, findutils +, gnugrep, utillinux, kernel, udev, upstart +, activateConfiguration , # Whether the root device is root only. If so, we'll mount a # ramdisk on /etc, /var and so on. readOnlyRoot - -, # The Upstart job configuration. - upstartJobs - -, # Static configuration files to be placed (through symlinks) in - # /etc. - etc - -, hostName }: let @@ -25,7 +16,6 @@ let utillinux udev upstart - setuidWrapper ]; in @@ -33,21 +23,6 @@ in genericSubstituter { src = ./boot-stage-2-init.sh; isExecutable = true; - inherit shell kernel upstart readOnlyRoot upstartJobs etc hostName; + inherit shell kernel upstart readOnlyRoot activateConfiguration; inherit startPath; - - # We don't want to put all of `startPath' and `path' in $PATH, since - # then we get an embarrassingly long $PATH. So use the user - # environment builder to make a directory with symlinks to those - # packages. - fullPath = buildEnv { - name = "boot-stage-2-path"; - paths = startPath ++ path; - pathsToLink = ["/bin" "/sbin" "/man/man1" "/share/man/man1"]; - ignoreCollisions = true; - }; - - wrapperDir = setuidWrapper.wrapperDir; - - accounts = ../helpers/accounts.sh; } diff --git a/configuration/activate-configuration.sh b/configuration/activate-configuration.sh new file mode 100644 index 00000000000..0aee051503a --- /dev/null +++ b/configuration/activate-configuration.sh @@ -0,0 +1,110 @@ +#! @shell@ + + +# !!! Hack - should be done with udev rules. +chmod 666 /dev/null + + +# Set up the statically computed bits of /etc. +staticEtc=/etc/static +rm -f $staticEtc +ln -s @etc@/etc $staticEtc +for i in $(cd $staticEtc && find * -type l); do + mkdir -p /etc/$(dirname $i) + rm -f /etc/$i + ln -s $staticEtc/$i /etc/$i +done + + +# Remove dangling symlinks that point to /etc/static. These are +# configuration files that existed in a previous configuration but not +# in the current one. +for i in $(find /etc/ -type l); do + target=$(readlink "$i") + if test "${target:0:${#staticEtc}}" = "$staticEtc" -a ! -e "$i"; then + rm -f "$i" + fi +done + + +# Enable a password-less root login. +source @accounts@ + +if ! test -e /etc/passwd; then + if test -n "@readOnlyRoot@"; then + rootHome=/ + else + rootHome=/home/root + mkdir -p $rootHome + fi + createUser root '' 0 0 'System administrator' $rootHome/var/empty @shell@ +fi + +if ! test -e /etc/group; then + echo "root:*:0" > /etc/group +fi + + +# Set up Nix accounts. +if test -z "@readOnlyRoot@"; then + + for i in $(seq 1 10); do + account=nixbld$i + if ! userExists $account; then + createUser $account x \ + $((i + 30000)) 30000 \ + 'Nix build user' /var/empty /noshell + fi + accounts="$accounts${accounts:+,}$account" + done + + if ! grep -q "^nixbld:" /etc/group; then + echo "nixbld:*:30000:$accounts" >> /etc/group + fi + + mkdir -p /nix/etc/nix + cat > /nix/etc/nix/nix.conf < /etc/profile < $wrapperDir/$i.real + chown root.root $wrapperDir/$i + chmod 4755 $wrapperDir/$i +done + + +# Set the host name. +hostname @hostName@ diff --git a/configuration/boot-environment.nix b/configuration/boot-environment.nix index df445fb12db..721d21cb668 100644 --- a/configuration/boot-environment.nix +++ b/configuration/boot-environment.nix @@ -230,7 +230,12 @@ rec { source = ./etc/sshd_config; target = "ssh/sshd_config"; } - + + { # The Upstart events defined above. + source = upstartJobs + "/etc/event.d"; + target = "event.d"; + } + ]; }; @@ -246,47 +251,79 @@ rec { }; + # The packages you want in the boot environment. + fullPath = [ + pkgs.bash + pkgs.bzip2 + pkgs.coreutils + pkgs.cpio + pkgs.curl + pkgs.e2fsprogs + pkgs.findutils + pkgs.gnugrep + pkgs.gnused + pkgs.gnutar + pkgs.grub + pkgs.gzip + pkgs.iputils + pkgs.less + pkgs.module_init_tools + pkgs.nano + pkgs.netcat + pkgs.nettools + pkgs.perl + pkgs.procps + pkgs.rsync + pkgs.shadowutils + pkgs.strace + pkgs.sysklogd + pkgs.udev + pkgs.upstart + pkgs.utillinux +# pkgs.vim + nix + nixosInstaller + setuidWrapper + ]; + + + # The script that activates the configuration, i.e., it sets up + # /etc, accounts, etc. It doesn't do anything that can only be done + # at boot time (such as start `init'). + activateConfiguration = pkgs.genericSubstituter { + src = ./activate-configuration.sh; + isExecutable = true; + + shell = pkgs.bash + "/bin/sh"; + + inherit etc; + inherit readOnlyRoot; + inherit (pkgs) kernel; + hostName = config.get ["networking" "hostname"]; + wrapperDir = setuidWrapper.wrapperDir; + accounts = ../helpers/accounts.sh; + + # We don't want to put all of `startPath' and `path' in $PATH, since + # then we get an embarrassingly long $PATH. So use the user + # environment builder to make a directory with symlinks to those + # packages. + fullPath = pkgs.buildEnv { + name = "boot-stage-2-path"; + paths = fullPath; + pathsToLink = ["/bin" "/sbin" "/man/man1" "/share/man/man1"]; + ignoreCollisions = true; + }; + }; + + # The init script of boot stage 2, which is supposed to do # everything else to bring up the system. bootStage2 = import ../boot/boot-stage-2.nix { - inherit (pkgs) genericSubstituter buildEnv coreutils findutils + inherit (pkgs) genericSubstituter coreutils findutils gnugrep utillinux kernel udev upstart; - inherit setuidWrapper; - inherit upstartJobs; - inherit etc; shell = pkgs.bash + "/bin/sh"; - - # Additional stuff; add whatever you want here. - path = [ - pkgs.bash - pkgs.bzip2 - pkgs.cpio - pkgs.curl - pkgs.e2fsprogs - pkgs.gnused - pkgs.gnutar - pkgs.grub - pkgs.gzip - pkgs.iputils - pkgs.less - pkgs.module_init_tools - pkgs.nano - pkgs.netcat - pkgs.nettools - pkgs.perl - pkgs.procps - pkgs.rsync - pkgs.shadowutils - pkgs.strace - pkgs.sysklogd -# pkgs.vim - nix - nixosInstaller - ]; - inherit readOnlyRoot; - - hostName = config.get ["networking" "hostname"]; + inherit activateConfiguration; };