From bc3ffa345873bfbbb3252fceb857875846802121 Mon Sep 17 00:00:00 2001 From: Armijn Hemel Date: Fri, 5 Aug 2005 13:48:22 +0000 Subject: [PATCH] get NixOS more towards an installable state. Stuff now actually gets installed on the disk itself. Missing is functionality to detect the right drive with the install CD in it. svn path=/nixu/trunk/; revision=3531 --- fill-disk.sh | 39 ++++++++- init/fill-disk.sh | 203 ++++++++++++++++++++++++++++++++++++++++++++++ make-disk.sh | 4 + pkgs.nix | 5 +- 4 files changed, 248 insertions(+), 3 deletions(-) create mode 100755 init/fill-disk.sh diff --git a/fill-disk.sh b/fill-disk.sh index f384d15d7ec9..c67179458157 100755 --- a/fill-disk.sh +++ b/fill-disk.sh @@ -1,6 +1,6 @@ #! @bash@/bin/sh -e -export PATH=@bash@/bin:@coreutils@/bin:@findutils@/bin:@utillinux@/bin:@utillinux@/sbin +export PATH=@bash@/bin:@coreutils@/bin:@findutils@/bin:@utillinux@/bin:@utillinux@/sbin:@e2fsprogs@/sbin sysvinitPath=@sysvinitPath@ bootPath=@bootPath@ @@ -47,7 +47,22 @@ mknod -m 0666 /dev/ptmx c 5 2 mknod -m 0644 /dev/random c 1 8 mknod -m 0644 /dev/urandom c 1 9 -echo "blaat" +mknod -m 0660 /dev/hda b 3 0 +mknod -m 0660 /dev/hda1 b 3 1 +mknod -m 0660 /dev/hda2 b 3 2 +mknod -m 0660 /dev/hda3 b 3 3 + +#mknod -m 0660 /dev/sda b 8 0 +#mknod -m 0660 /dev/sda1 b 8 1 +#mknod -m 0660 /dev/sda2 b 8 2 +#mknod -m 0660 /dev/sda3 b 8 3 + +echo "dev" +cd /dev; echo * + +mkfs.ext2 /dev/hda1 +mkswap /dev/hda2 + #if ! test -n "$1" #then @@ -58,6 +73,8 @@ echo "blaat" #fi device=/dev/hda1 +#device=/dev/sda1 + make_dir() { mode=$1 @@ -88,6 +105,10 @@ cd /sys; echo * # mount --bind /mnt/cdrom1/nix /nix # mount --bind /mnt/cdrom1/pkgs /nixpkgs/trunk/pkgs +## +## Create a directory tree on the installation disk. +## + make_dir 00755 /bin make_dir 00755 /dev make_dir 00755 /proc @@ -110,6 +131,10 @@ make_dir 00755 /mnt/host make_dir 00755 /home make_dir 00755 /home/root +## +## Add a few devices to /dev on the install disk. This is by far complete. +## + mknod $root/dev/null c 1 3 touch_file /etc/passwd @@ -119,6 +144,12 @@ touch_file /etc/group rm -f $root/etc/mtab #ln -s /proc/mounts $root/etc/mtab +cat /proc/mounts + +## Probe for CD device which contains our CD here and mount /nix and +## /nixpkgs from it inside the ramdisk. Anaconda uses kudzu for this. +## Find out how Knoppix and SUSE do this... + export NIX_DATA_DIR=$root/nix/share export NIX_LOG_DIR=$root/nix/log/nix export NIX_STATE_DIR=$root/nix/var/nix @@ -201,3 +232,7 @@ cp /etc/resolv.conf $root/etc rm -f $root/etc/hosts echo "127.0.0.1 localhost" >> $root/etc/hosts echo "192.168.150.1 uml" >> $root/etc/hosts + +### +### Do funky stuff with grub here. +### diff --git a/init/fill-disk.sh b/init/fill-disk.sh new file mode 100755 index 000000000000..f384d15d7ec9 --- /dev/null +++ b/init/fill-disk.sh @@ -0,0 +1,203 @@ +#! @bash@/bin/sh -e + +export PATH=@bash@/bin:@coreutils@/bin:@findutils@/bin:@utillinux@/bin:@utillinux@/sbin + +sysvinitPath=@sysvinitPath@ +bootPath=@bootPath@ + +mount -t proc proc /proc +mount -t sysfs sys /sys + +#mount -t /dev/hdc /installimage + +# make a complete /dev filesystem +# ripped permissions and everything from anaconda (loader2/devices.h) + +# consoles + +#mknod -m 0600 /dev/console c 5 1 +mknod -m 0600 /dev/ttyS0 c 4 64 +mknod -m 0600 /dev/ttyS1 c 4 65 +mknod -m 0600 /dev/ttyS2 c 4 66 +mknod -m 0600 /dev/ttyS3 c 4 67 + +# base UNIX devices +mknod -m 0600 /dev/mem c 1 1 +mknod -m 0666 /dev/null c 1 3 +mknod -m 0666 /dev/zero c 1 5 + +# tty +mknod -m 0600 /dev/tty c 5 0 +mknod -m 0600 /dev/tty0 c 4 0 +mknod -m 0600 /dev/tty1 c 4 1 +mknod -m 0600 /dev/tty2 c 4 2 +mknod -m 0600 /dev/tty3 c 4 3 +mknod -m 0600 /dev/tty4 c 4 4 +mknod -m 0600 /dev/tty5 c 4 5 +mknod -m 0600 /dev/tty6 c 4 6 +mknod -m 0600 /dev/tty7 c 4 7 +mknod -m 0600 /dev/tty8 c 4 8 +mknod -m 0600 /dev/tty9 c 4 9 + +mkdir -m 0755 /dev/pts +mknod -m 0666 /dev/ptmx c 5 2 + +# random + +mknod -m 0644 /dev/random c 1 8 +mknod -m 0644 /dev/urandom c 1 9 + +echo "blaat" + +#if ! test -n "$1" +#then +# echo "need harddisk device for installing!" +# exit +#else +# device=$1 +#fi + +device=/dev/hda1 + +make_dir() { + mode=$1 + name=$2 + echo creating $name... + if ! test -d $root/$name; then mkdir $root/$name; fi + chmod $mode $root/$name +} + + +touch_file() { + name=$1 + echo touching $name... + if ! test -d $root/$name; then touch $root/$name; fi +} +root=/tmp/mnt + +mkdir -p /tmp/mnt + +mount -t ext2 $device /tmp/mnt + +cd /sys; echo * + +# mkdir -p /nix +# mkdir -p /nixpkgs/trunk/pkgs + +# temporary hack +# mount --bind /mnt/cdrom1/nix /nix +# mount --bind /mnt/cdrom1/pkgs /nixpkgs/trunk/pkgs + +make_dir 00755 /bin +make_dir 00755 /dev +make_dir 00755 /proc +make_dir 01777 /tmp +make_dir 00755 /etc # global non-constant configuration +make_dir 00755 /etc-secret +make_dir 00755 /var +make_dir 00755 /nix +make_dir 00755 /nix/store +make_dir 00755 /nix/var +make_dir 00755 /nix/var/nix +make_dir 00755 /nix/var/nix/db +make_dir 00755 /nix/var/nix/manifests +make_dir 00755 /nix/var/log +make_dir 00755 /nix/var/log/nix +make_dir 00755 /nixpkgs +make_dir 00755 /nixpkgs/trunk +make_dir 00755 /mnt +make_dir 00755 /mnt/host +make_dir 00755 /home +make_dir 00755 /home/root + +mknod $root/dev/null c 1 3 + +touch_file /etc/passwd +touch_file /etc/shadow +touch_file /etc/group + +rm -f $root/etc/mtab +#ln -s /proc/mounts $root/etc/mtab + +export NIX_DATA_DIR=$root/nix/share +export NIX_LOG_DIR=$root/nix/log/nix +export NIX_STATE_DIR=$root/nix/var/nix +export NIX_CONF_DIR=$root/nix/etc +NIX_CMD_PATH=@NIX_CMD_PATH@/bin + +echo initialising Nix DB... +#/nix/bin/nix-store --init +$NIX_CMD_PATH/nix-store --init + +echo verifying Nix DB... +$NIX_CMD_PATH/nix-store --verify + +echo copying nixpkgs... +cp -fa ../pkgs $root/nixpkgs/trunk + +make_dir 0755 /tmp/scripts +cp -fa ../scripts $root/tmp + +#echo adding manifest +#$NIX_CMD_PATH/nix-pull $manifest + +echo adding packages +export NIX_ROOT=$root +unset NIX_DATA_DIR +unset NIX_LOG_DIR +unset NIX_STATE_DIR +unset NIX_CONF_DIR + +#storeExpr=$(echo '(import /tmp/scripts/pkgs.nix).everything' | $NIX_CMD_PATH/nix-instantiate -v -v -) +#storeExpr=$(echo '(import ./pkgs.nix).everything' | $NIX_CMD_PATH/nix-instantiate -v -v -) +#$NIX_CMD_PATH/nix-store -r $storeExpr +#echo $storeExpr +#storeExpr2=$($NIX_CMD_PATH/nix-store -qR $($NIX_CMD_PATH/nix-store -r $storeExpr)) +#echo storeExpr $storeExpr +#echo $($NIX_CMD_PATH/nix-store -qR --include-outputs $storeExpr) + +echo copying store + +(while read storepaths; do + cp -fa $storepaths $root/nix/store +done) < /mnt/cdrom1/mystorepaths + +#cp -fa ../nix/store/* $root/nix/store + +#echo registering valid paths... +#(while read storepath; do +# echo PATH $storepath +# if ! $NIX_CMD_PATH/nix-store --isvalid $storepath 2> /dev/null; then +# (unset NIX_ROOT; $NIX_CMD_PATH/nix-store --dump $storepath) | $NIX_CMD_PATH/nix-store --restore $storepath +# $NIX_CMD_PATH/nix-store --validpath $storepath +# fi +#done) < /tmp/mystorepaths + +#echo registering successors... +#(while read line; do +# echo SUCC $line +# $NIX_CMD_PATH/nix-store --successor $line +#done) < /tmp/mysuccessors + +exit + +echo setting init symlink... +rm -f $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:$bootPath/bin/boot.sh" >> $root/etc/inittab +echo "ht:06:wait:$bootPath/bin/halt.sh" >> $root/etc/inittab +echo "1:2345:respawn:$bootPath/bin/login.sh /dev/ttys/0" >> $root/etc/inittab +#echo "2:2345:respawn:$bootPath/bin/login.sh /dev/ttys/1" >> $root/etc/inittab + +echo setting up networking information... +make_dir 00755 /etc/networking +echo 192.168.150.1 > $root/etc/networking/local-ip +echo 192.168.150.3 > $root/etc/networking/gateway-ip +cp /etc/resolv.conf $root/etc +rm -f $root/etc/hosts +echo "127.0.0.1 localhost" >> $root/etc/hosts +echo "192.168.150.1 uml" >> $root/etc/hosts diff --git a/make-disk.sh b/make-disk.sh index 7b2f20781f73..9d4bb589e378 100755 --- a/make-disk.sh +++ b/make-disk.sh @@ -45,11 +45,13 @@ echo $($NIX_CMD_PATH/nix-store -qR $(nix-store -r $(echo '(import ./pkgs.nix).ni utilLinux=$($NIX_CMD_PATH/nix-store -qR $(nix-store -r $(echo '(import ./pkgs.nix).utillinux' | $NIX_CMD_PATH/nix-instantiate -))) coreUtils=$($NIX_CMD_PATH/nix-store -qR $(nix-store -r $(echo '(import ./pkgs.nix).coreutils' | $NIX_CMD_PATH/nix-instantiate -))) +e2fsProgs=$($NIX_CMD_PATH/nix-store -qR $(nix-store -r $(echo '(import ./pkgs.nix).e2fsprogs' | $NIX_CMD_PATH/nix-instantiate -))) bash=$($NIX_CMD_PATH/nix-store -q $(echo '(import ./pkgs.nix).bash' | $NIX_CMD_PATH/nix-instantiate -)) coreutils=$($NIX_CMD_PATH/nix-store -q $(echo '(import ./pkgs.nix).coreutils' | $NIX_CMD_PATH/nix-instantiate -)) findutils=$($NIX_CMD_PATH/nix-store -q $(echo '(import ./pkgs.nix).findutils' | $NIX_CMD_PATH/nix-instantiate -)) utillinux=$($NIX_CMD_PATH/nix-store -q $(echo '(import ./pkgs.nix).utillinux' | $NIX_CMD_PATH/nix-instantiate -)) +e2fsprogs=$($NIX_CMD_PATH/nix-store -q $(echo '(import ./pkgs.nix).e2fsprogs' | $NIX_CMD_PATH/nix-instantiate -)) (while read storepath; do cp -fa --parents ${storepath} ${archivesDir} @@ -105,6 +107,7 @@ sed -e "s^@sysvinitPath\@^$sysvinitPath^g" \ -e "s^@findutils\@^$findutils^g" \ -e "s^@coreutils\@^$coreutils^g" \ -e "s^@utillinux\@^$utillinux^g" \ + -e "s^@e2fsprogs\@^$e2fsprogs^g" \ < $fill_disk > $fill_disk.tmp mv $fill_disk.tmp $fill_disk @@ -136,6 +139,7 @@ chmod u+x ${initdir}/init cp -fau --parents ${bashdeps} ${initdir} cp -fau --parents ${utilLinux} ${initdir} cp -fau --parents ${coreUtils} ${initdir} +cp -fau --parents ${e2fsProgs} ${initdir} (cd ${initdir}; find . |cpio -c -o) | gzip -9 > ${initrd} #(cd ${archivesDir}/initdir; find . |cpio -c -o) | gzip -9 > ${initrd} diff --git a/pkgs.nix b/pkgs.nix index d404a71e4969..23573c7aedb3 100644 --- a/pkgs.nix +++ b/pkgs.nix @@ -10,5 +10,8 @@ rec { less screen openssh binutils strace shadowutils iputils gnumake curl gnused gnutar gnugrep gzip mingetty grub parted;}; - everything = [boot sysvinit kernel]; + init = (import ./init) {inherit stdenv bash coreutils + utillinux e2fsprogs nix shadowutils mingetty grub parted;}; + + everything = [boot init sysvinit kernel]; }