3
0
Fork 0
forked from mirrors/nixpkgs

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
This commit is contained in:
Michael Raskin 2009-10-23 20:30:12 +00:00
parent 4f006e49bf
commit 893f13bb14
5 changed files with 93 additions and 31 deletions

View file

@ -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 \

View file

@ -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;

View file

@ -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@

View file

@ -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

View file

@ -5,6 +5,61 @@ ensureDir $out/etc
sources_=($sources)
targets_=($targets)
modes_=($modes)
cat <<EOF >> fill-etc.c
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <sys/wait.h>
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 <<EOF >> kill-etc.c
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
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