From 893f13bb1490f1facd7750049cf67ed4ac143172 Mon Sep 17 00:00:00 2001 From: Michael Raskin <7c6f434c@mail.ru> Date: Fri, 23 Oct 2009 20:30:12 +0000 Subject: [PATCH] Some boot optimisations attempted. My system boots a few times faster now, and I cannot see how these can break things. svn path=/nixos/trunk/; revision=17946 --- .../system/activation/activation-script.nix | 11 ++- modules/system/activation/top-level.nix | 4 +- modules/system/boot/stage-2-init.sh | 1 + modules/system/etc/etc.nix | 32 ++------ modules/system/etc/make-etc.sh | 76 ++++++++++++++++++- 5 files changed, 93 insertions(+), 31 deletions(-) diff --git a/modules/system/activation/activation-script.nix b/modules/system/activation/activation-script.nix index a62120363f25..2ca7dcc82e12 100644 --- a/modules/system/activation/activation-script.nix +++ b/modules/system/activation/activation-script.nix @@ -11,6 +11,7 @@ let text = '' #### actionScripts snippet ${a} : # ======================================== + echo "executing activation snippet ${a} at $(${pkgs.coreutils}/bin/date)" ${v.text} ''; }); @@ -123,8 +124,14 @@ let # Set up Nix. mkdir -p /nix/etc/nix ln -sfn /etc/nix.conf /nix/etc/nix/nix.conf - chown root.nixbld /nix/store - chmod 1775 /nix/store + stat /nix/store/ | \ + egrep \ + 'Access: [(]1775/[-drwxt]*[)] *Uid: [(][0-9 ]*/ *root[)] *Gid: [(][0-9 ]*/ *nixbld[)]' \ + > /dev/null || { + + chown root.nixbld /nix/store + chmod 1775 /nix/store + } # Nix initialisation. mkdir -m 0755 -p \ diff --git a/modules/system/activation/top-level.nix b/modules/system/activation/top-level.nix index 609b11dd3d6d..50fbde63b88d 100644 --- a/modules/system/activation/top-level.nix +++ b/modules/system/activation/top-level.nix @@ -42,7 +42,9 @@ let # as you use, but with another kernel # !!! fix this children = map (x: ((import ../../../default.nix) - { configuration = x//{boot=((x.boot)//{grubDevice = "";});};}).system) + { configuration = x//{boot=((x.boot)// + {loader=x.boot.loader//{grub=x.boot.loader.grub// + {device = "";};};});};}).system) config.nesting.children; diff --git a/modules/system/boot/stage-2-init.sh b/modules/system/boot/stage-2-init.sh index 0cc09caebba9..1089526cf6b1 100644 --- a/modules/system/boot/stage-2-init.sh +++ b/modules/system/boot/stage-2-init.sh @@ -132,6 +132,7 @@ fi # Ensure that the module tools can find the kernel modules. export MODULE_DIR=@kernel@/lib/modules/ +echo "Running post-boot commands" # Run any user-specified commands. @shell@ @postBootCommands@ diff --git a/modules/system/etc/etc.nix b/modules/system/etc/etc.nix index 4ae420017a57..35137597d040 100644 --- a/modules/system/etc/etc.nix +++ b/modules/system/etc/etc.nix @@ -41,6 +41,8 @@ let builder = ./make-etc.sh; + inherit (pkgs) coreutils; + /* !!! Use toXML. */ sources = map (x: x.source) config.environment.etc; targets = map (x: x.target) config.environment.etc; @@ -61,33 +63,9 @@ in etc = pkgs.lib.fullDepEntry '' # Set up the statically computed bits of /etc. echo "setting up /etc..." - staticEtc=/etc/static - rm -f $staticEtc - ln -s ${makeEtc}/etc $staticEtc - for i in $(cd $staticEtc && find * -type l); do - mkdir -p /etc/$(dirname $i) - rm -f /etc/$i - if test -e "$staticEtc/$i.mode"; then - # Create a regular file in /etc. - cp $staticEtc/$i /etc/$i - chown 0.0 /etc/$i - chmod "$(cat "$staticEtc/$i.mode")" /etc/$i - else - # Create a symlink in /etc. - ln -s $staticEtc/$i /etc/$i - fi - 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 efficiency, don't look under /etc/nixos - # (where all the NixOS sources live). - for i in $(find /etc/ \( -path /etc/nixos -prune \) -o -type l); do - target=$(readlink "$i") - if test "''${target:0:''${#staticEtc}}" = "$staticEtc" -a ! -e "$i"; then - rm -f "$i" - fi - done + /etc/kill-etc || true + ${makeEtc}/bin/fill-etc + echo "/etc is set up" '' [ "systemConfig" "defaultPath" # path to cp, chmod, chown diff --git a/modules/system/etc/make-etc.sh b/modules/system/etc/make-etc.sh index f05d74b55fcf..76ae97c6c65a 100644 --- a/modules/system/etc/make-etc.sh +++ b/modules/system/etc/make-etc.sh @@ -5,6 +5,61 @@ ensureDir $out/etc sources_=($sources) targets_=($targets) modes_=($modes) + +cat <> fill-etc.c + #include + #include + #include + #include + #include + #include + #include + #include + + struct stat statBuffer; + + void ensureDir(char* path) { + int i, j; + char pathBuffer[PATH_MAX]; + statBuffer.st_mode = 0; + for (i=0; path[i]; i++) { + if (path[i]=='/') { + pathBuffer[i]=0; + mkdir(pathBuffer ,0755); + j = i; + } + pathBuffer[i]=path[i]; + } + pathBuffer[j]=0; + if (stat(pathBuffer, &statBuffer) || ! (statBuffer.st_mode & S_IFDIR)) { + printf ("Path does not exist or not a directory: %s\n", path); + exit (EXIT_FAILURE); + } + } + + void copyAndChmod(char* path, char* target, mode_t mode) { + int pid; + pid = fork(); + if (! pid) { + execl("${coreutils}/bin/cp", "cp", path, target, NULL); + } else { + waitpid (pid, NULL, 0); + } + chmod (target, mode); + } + + int main () { + /* generated code begins */ +EOF +cat <> kill-etc.c + #include + #include + #include + + int main () { + /* generated code begins */ +EOF + for ((i = 0; i < ${#targets_[@]}; i++)); do ensureDir $out/etc/$(dirname ${targets_[$i]}) if ! test -e $out/etc/${targets_[$i]}; then @@ -13,10 +68,29 @@ for ((i = 0; i < ${#targets_[@]}; i++)); do echo "Duplicate entry ${targets_[$i]} -> ${sources_[$i]}" if test "$(readlink $out/etc/${targets_[$i]})" != "${sources_[$i]}"; then echo "Mismatched duplicate entry $(readlink $out/etc/${targets_[$i]}) <-> ${sources_[$i]}" - exit 1 + exit 1 fi fi; + echo "ensureDir(\"/etc/${targets_[$i]}\");" >> fill-etc.c if test "${modes_[$i]}" != symlink; then echo "${modes_[$i]}" > $out/etc/${targets_[$i]}.mode + + echo "copyAndChmod(\"$out/etc/${targets_[$i]}\",\"/etc/${targets_[$i]}\",${modes_[$i]});" >> fill-etc.c; + else + echo "symlink(\"$out/etc/${targets_[$i]}\",\"/etc/${targets_[$i]}\");" >> fill-etc.c; fi + + echo "unlink (\"/etc/${targets_[$i]}\");" >> kill-etc.c done + +echo "symlink(\"$out/bin/kill-etc\",\"/etc/kill-etc\");" >> fill-etc.c +echo "unlink(\"/etc/kill-etc\");" >> kill-etc.c +echo " return 0; }" >> fill-etc.c +echo " return 0; }" >> kill-etc.c +ensureDir $out/bin +ensureDir $out/share/etc-scripts/src +gcc -Wall fill-etc.c -o $out/bin/fill-etc +gcc -Wall kill-etc.c -o $out/bin/kill-etc +cp fill-etc.c $out/share/etc-scripts/src +cp kill-etc.c $out/share/etc-scripts/src +