* Use sysvinit's init to start the system. This has the happy

side-effect of initialising the console properly (i.e., enabling
  Ctrl-[C, Z]).

svn path=/nixu/trunk/; revision=801
This commit is contained in:
Eelco Dolstra 2004-02-18 10:56:07 +00:00
parent 1f7a8c8ae9
commit 1e87e75d07
6 changed files with 65 additions and 18 deletions

View file

@ -1,6 +1,7 @@
#! /bin/sh -e #! /bin/sh -e
initExpr=$1 sysvinitPath=$1
initPath=$2
make_dir() { make_dir() {
mode=$1 mode=$1
@ -18,6 +19,8 @@ mount -t ext2 /dev/discs/disc0/disc $root
make_dir 00755 /dev make_dir 00755 /dev
make_dir 00755 /proc make_dir 00755 /proc
make_dir 01777 /tmp make_dir 01777 /tmp
make_dir 00755 /etc # global non-constant configuration
make_dir 00755 /var
make_dir 00755 /nix make_dir 00755 /nix
make_dir 00755 /nix/store make_dir 00755 /nix/store
make_dir 00755 /nix/var make_dir 00755 /nix/var
@ -25,6 +28,13 @@ make_dir 00755 /nix/var/nix
make_dir 00755 /nix/var/nix/db make_dir 00755 /nix/var/nix/db
make_dir 00755 /nix/var/log make_dir 00755 /nix/var/log
make_dir 00755 /nix/var/log/nix make_dir 00755 /nix/var/log/nix
make_dir 00755 /mnt
make_dir 00755 /mnt/host
make_dir 00755 /home
make_dir 00755 /home/root
rm -f $root/etc/mtab
ln -s /proc/mounts $root/etc/mtab
export NIX_ROOT=$root export NIX_ROOT=$root
@ -50,9 +60,13 @@ echo registering successors...
done) < /tmp/successors done) < /tmp/successors
echo setting init symlink... echo setting init symlink...
initPath=$(/nix/bin/nix-store -qn $initExpr)
rm -f $root/init rm -f $root/init
ln -s $initPath/bin/init $root/init ln -s $sysvinitPath/sbin/init $root/init
echo setting up inittab...
rm -f $root/etc/inittab
echo "id:2:initdefault:" >> $root/etc/inittab
echo "si::bootwait:$initPath/bin/init" >> $root/etc/inittab
echo unmounting... echo unmounting...
umount $root umount $root

View file

@ -9,6 +9,10 @@ sed \
-e "s^@bash\@^$bash^g" \ -e "s^@bash\@^$bash^g" \
-e "s^@coreutils\@^$coreutils^g" \ -e "s^@coreutils\@^$coreutils^g" \
-e "s^@findutils\@^$findutils^g" \ -e "s^@findutils\@^$findutils^g" \
-e "s^@utillinux\@^$utillinux^g" \
-e "s^@sysvinit\@^$sysvinit^g" \
-e "s^@e2fsprogs\@^$e2fsprogs^g" \
-e "s^@nix\@^$nix^g" \
< $src > $out/bin/init < $src > $out/bin/init
chmod +x $out/bin/init chmod +x $out/bin/init

View file

@ -1,9 +1,9 @@
{stdenv, bash, coreutils, findutils}: {stdenv, bash, coreutils, findutils, utillinux, sysvinit, e2fsprogs, nix}:
derivation { derivation {
name = "init"; name = "init";
system = stdenv.system; system = stdenv.system;
builder = ./builder.sh; builder = ./builder.sh;
src = ./init.sh; src = ./init.sh;
inherit stdenv bash coreutils findutils; inherit stdenv bash coreutils findutils utillinux sysvinit e2fsprogs nix;
} }

View file

@ -1,14 +1,33 @@
#! @bash@/bin/sh -e #! @bash@/bin/sh -e
export PATH=@bash@/bin:@coreutils@/bin:@findutils@/bin trap "echo 'ignoring TERM signal'" SIGTERM
trap "echo 'ignoring INT signal'" SIGINT
export PATH=@nix@/bin:@bash@/bin:@coreutils@/bin:@findutils@/bin:@utillinux@/bin:@utillinux@/sbin:@sysvinit@/bin:@sysvinit@/sbin:@e2fsprogs@/bin:@e2fsprogs@/sbin
echo "--- Nix ---" echo "--- Nix ---"
#echo "remounting root..." echo "mounting /proc..."
mount -n -t proc none /proc
echo "checking /dev/root..."
e2fsck -y /dev/root || test "$?" -le 1
echo "remounting / writable..."
mount -n -o remount,rw /dev/root /
echo "mounting /mnt/host..."
mount -n -t hostfs none /mnt/host
echo "starting root shell..." echo "starting root shell..."
@bash@/bin/sh @bash@/bin/sh
echo "remounting / read-only..."
mount -n -o remount,rw /dev/root / || echo "(failed)" # ignore errors
echo "syncing..."
sync || echo "(failed)" # ignore errors
echo "shutting down..." echo "shutting down..."
exit 0 halt -d -f

View file

@ -2,7 +2,7 @@
image=/tmp/disk.img image=/tmp/disk.img
size=$(expr 256 \* 1024 \* 1024) size=$(expr 256 \* 1024 \* 1024)
storepaths=/tmp/storepaths storePaths=/tmp/storepaths
successors=/tmp/successors successors=/tmp/successors
if ! test -f $image; then if ! test -f $image; then
@ -16,19 +16,24 @@ if ! test -f $image; then
fi fi
# What to copy? # What to copy?
storeexpr=$(echo '(import ./pkgs.nix).init' | nix-instantiate -) storeExpr=$(echo '(import ./pkgs.nix).everything' | nix-instantiate -)
nix-store -rB $storeexpr nix-store -rB $storeExpr
nix-store -qn --requisites $storeexpr > $storepaths nix-store -qn --requisites $storeExpr > $storePaths
(while read storepath; do (while read storepath; do
nix-store -q --predecessors $storepath | (while read predecessor; do nix-store -q --predecessors $storepath | (while read predecessor; do
echo $predecessor $storepath echo $predecessor $storepath
done) done)
done) < $storepaths > $successors done) < $storePaths > $successors
# Location of sysvinit?
sysvinitPath=$(nix-store -qn $(echo '(import ./pkgs.nix).sysvinit' | nix-instantiate -))
# Location of Nix init?
initPath=$(nix-store -qn $(echo '(import ./pkgs.nix).init' | nix-instantiate -))
# Fill the disk with the minimal Nix store. # Fill the disk with the minimal Nix store.
if ! test -d /tmp/mnt; then mkdir /tmp/mnt; fi if ! test -d /tmp/mnt; then mkdir /tmp/mnt; fi
linux ubd0=$image root=/dev/root rootflags=/ rootfstype=hostfs init="$(pwd)/fill-disk.sh $storeexpr" linux ubd0=$image root=/dev/root rootflags=/ rootfstype=hostfs \
init="$(pwd)/fill-disk.sh $sysvinitPath $initPath"

View file

@ -1,4 +1,9 @@
rec { rec {
inherit (import pkgs/system/i686-linux.nix) stdenv bash coreutils findutils; inherit (import pkgs/system/i686-linux.nix)
init = (import ./init) {inherit stdenv bash coreutils findutils;}; stdenv bash coreutils findutils utillinux sysvinit e2fsprogs nix;
init = (import ./init)
{inherit stdenv bash coreutils findutils utillinux sysvinit e2fsprogs nix;};
everything = [init sysvinit];
} }