f546cad4b7
svn path=/nixu/trunk/; revision=6923
375 lines
8.5 KiB
Bash
Executable file
375 lines
8.5 KiB
Bash
Executable file
#! @bash@/bin/sh
|
|
|
|
set -e
|
|
|
|
export PATH=/bin:/sbin:@bash@/bin:@findutils@/bin:@e2fsprogs@/sbin:@grub@/sbin:@sysvinitPath@/sbin:@eject@/bin:@dhcp@/sbin:@modutils@/sbin:@busybox@/bin:@busybox@/sbin
|
|
|
|
kernel=@kernel@
|
|
xawtv=@xawtv@
|
|
|
|
narStorePaths=/cdrom/narstorepaths
|
|
|
|
sysvinitPath=@sysvinitPath@
|
|
bootPath=@bootPath@
|
|
modutils=@modutils@
|
|
mingetty=@mingetty@
|
|
|
|
nixpkgs=/nixpkgs
|
|
|
|
echo formatting target device
|
|
|
|
if test -e disklayout; then
|
|
source disklayout
|
|
else
|
|
echo no disk layout configuration present...exiting
|
|
exit 1
|
|
fi
|
|
|
|
# $targetdrive is also used by GRUB!
|
|
#targetdrive=/dev/hda
|
|
targetdrive=${TARGETDRIVE}
|
|
#device=${targetdrive}1
|
|
device=${INSTALLDEVICE}
|
|
mkfs.ext2 ${device}
|
|
#swapdevice=${targetdrive}2
|
|
swapdevice=${SWAP}
|
|
mkswap $swapdevice
|
|
|
|
echo enabling swap
|
|
|
|
swapon $swapdevice
|
|
|
|
#if ! test -n "$1"
|
|
#then
|
|
# echo "need harddisk device for installing!"
|
|
# exit
|
|
#else
|
|
# device=$1
|
|
#fi
|
|
|
|
##
|
|
## Two convenience shell functions
|
|
##
|
|
|
|
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 $root
|
|
|
|
echo mounting the target drive
|
|
|
|
mount -t ext2 $device $root
|
|
|
|
##
|
|
## Create a directory tree on the installation disk.
|
|
##
|
|
|
|
echo creating file system hierarchy on target drive
|
|
|
|
make_dir 00755 /bin
|
|
make_dir 00755 /boot
|
|
make_dir 00755 /cdrom
|
|
make_dir 00755 /dev
|
|
make_dir 00755 /dev/pts
|
|
make_dir 00755 /etc # global non-constant configuration
|
|
make_dir 00755 /etc/ssh
|
|
make_dir 00755 /etc/sysconfig
|
|
make_dir 00755 /home
|
|
make_dir 00755 /lib
|
|
make_dir 00755 /lib/modules
|
|
make_dir 00755 /mnt
|
|
make_dir 00755 /mnt/host
|
|
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/gcroots
|
|
make_dir 00755 /nix/var/nix/manifests
|
|
make_dir 00755 /nix/var/nix/profiles
|
|
make_dir 00755 /nix/var/nix/temproots
|
|
make_dir 00755 /nix/var/log
|
|
make_dir 00755 /nix/var/log/nix
|
|
make_dir 00755 /proc
|
|
make_dir 00750 /root
|
|
make_dir 00755 /sbin
|
|
make_dir 00755 /sys
|
|
make_dir 01777 /tmp
|
|
make_dir 00755 /usr
|
|
make_dir 00755 /var
|
|
make_dir 00755 /var/empty
|
|
make_dir 00111 /var/empty/sshd
|
|
make_dir 00755 /var/lock
|
|
make_dir 00755 /var/lock/subsys
|
|
make_dir 00755 /var/log
|
|
make_dir 00755 /var/run
|
|
make_dir 00755 /var/run/usb
|
|
make_dir 00755 /var/spool
|
|
make_dir 00755 /var/state
|
|
make_dir 00755 /var/state/dhcp
|
|
make_dir 00755 /var/tmp
|
|
|
|
##
|
|
## Add a few devices to /dev on the install disk. This is by far complete.
|
|
##
|
|
|
|
echo making device nodes on target drive
|
|
|
|
mknod -m 0666 $root/dev/null c 1 3
|
|
mknod -m 0600 $root/dev/console c 5 1
|
|
mknod -m 0600 $root/dev/tty c 5 0
|
|
mknod -m 0600 $root/dev/tty0 c 4 0
|
|
mknod -m 0600 $root/dev/tty1 c 4 1
|
|
mknod -m 0600 $root/dev/tty2 c 4 2
|
|
mknod -m 0600 $root/dev/tty3 c 4 3
|
|
mknod -m 0444 $root/dev/urandom c 1 9
|
|
|
|
## needed for sshd and friends. Should actually be made by udev.
|
|
mknod -m 0666 $root/dev/ptmx c 5 2
|
|
|
|
rm -f $root/etc/mtab
|
|
ln -s /proc/mounts $root/etc/mtab
|
|
|
|
# prevent df from barfing
|
|
ln -s /proc/mounts /etc/mtab
|
|
|
|
## 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...
|
|
|
|
DEVICES="/dev/hd?"
|
|
|
|
for i in ${DEVICES}
|
|
do
|
|
echo "Looking for CDROM in: $i"
|
|
if mount -t iso9660 $i /cdrom >/dev/null 2>&1
|
|
then
|
|
if test -f /cdrom/NIXOS
|
|
then
|
|
cddevice=$i
|
|
echo "Accessing NixOS CDROM at $i"
|
|
break
|
|
fi
|
|
fi
|
|
done
|
|
|
|
echo mounting /cdrom in the target
|
|
|
|
mount --bind /cdrom $root/cdrom
|
|
mount --bind /cdrom/lib /lib
|
|
|
|
echo switch to /nix from CD
|
|
## starting here it's OK to have full blown glibc
|
|
|
|
mount --bind /cdrom/nix /nix
|
|
|
|
#echo probing for hardware...
|
|
|
|
#kudzu
|
|
|
|
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=@nix@/bin
|
|
|
|
echo bringing up networking...
|
|
|
|
#labmachine has 3c59x
|
|
#modprobe 3c59x
|
|
#vmware has pcnet32
|
|
#modprobe pcnet32
|
|
#dhclient eth0
|
|
|
|
#cp /etc/resolv.conf $root/etc/resolv.conf
|
|
|
|
#nic=`kudzu -p | grep eth | sort | uniq | cut -d ' ' -f 2`
|
|
|
|
#echo "NIC: $nic"
|
|
|
|
echo initialising Nix DB...
|
|
$NIX/nix-store --init
|
|
|
|
echo verifying Nix DB...
|
|
$NIX/nix-store --verify
|
|
|
|
echo copying nixpkgs...
|
|
mkdir -p $root/nixpkgs/pkgs
|
|
tar --directory=$root/nixpkgs/pkgs -zxf /cdrom/nixpkgs.tgz
|
|
|
|
make_dir 0755 /tmp/scripts
|
|
cp -fa /cdrom/scripts $root/tmp
|
|
|
|
echo adding packages
|
|
|
|
export NIX_ROOT=$root
|
|
unset NIX_DATA_DIR
|
|
unset NIX_LOG_DIR
|
|
unset NIX_STATE_DIR
|
|
unset NIX_CONF_DIR
|
|
|
|
cp /cdrom/mystorepaths $root/tmp
|
|
|
|
echo copying store
|
|
|
|
tar --directory=$root -zxf /cdrom/nixstore.tgz
|
|
|
|
echo registering valid paths...
|
|
|
|
$NIX/nix-store --register-validity < $root/tmp/mystorepaths
|
|
|
|
unset NIX_ROOT
|
|
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
|
|
|
|
echo creating /bin/sh
|
|
ln -s @bashGlibc@/bin/sh $root/bin/sh
|
|
|
|
echo adding manifest
|
|
$NIX/nix-pull file:///cdrom/MANIFEST
|
|
|
|
export NIX_ROOT=$root
|
|
unset NIX_DATA_DIR
|
|
unset NIX_LOG_DIR
|
|
unset NIX_STATE_DIR
|
|
unset NIX_CONF_DIR
|
|
|
|
## Fix this. Probably nix-instantiate, then nix-store -r.
|
|
## Also make sure everything gets installed into an actual profile!
|
|
|
|
$NIX/nix-env -iKf $nixpkgs/pkgs/top-level/all-packages.nix -A nix
|
|
$NIX/nix-env -iKf $nixpkgs/pkgs/top-level/all-packages.nix -A coreutils
|
|
$NIX/nix-env -iKf $nixpkgs/pkgs/top-level/all-packages.nix -A gnugrep
|
|
#$NIX/nix-env -iKf $nixpkgs/pkgs/top-level/all-packages.nix -A kernel
|
|
$NIX/nix-env -iKf $nixpkgs/pkgs/top-level/all-packages.nix -A kernelscripts
|
|
$NIX/nix-env -iKf $nixpkgs/pkgs/top-level/all-packages.nix -A grub
|
|
|
|
cat $narStorePaths | xargs -n 1 -i% $NIX/nix-env -i %
|
|
|
|
echo setting init symlink...
|
|
rm -f $root/init
|
|
#ln -s $sysvinitPath/sbin/init $root/init
|
|
ln -s @sysvinitPath@/sbin/init $root/sbin/init
|
|
#ln -s @bash@/bin/bash $root/bin/bash
|
|
|
|
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/tty1" >> $root/etc/inittab
|
|
echo "#2:2345:respawn:$mingetty/sbin/mingetty tty2" >> $root/etc/inittab
|
|
echo "#3:2345:respawn:$mingetty/sbin/mingetty tty3" >> $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
|
|
#cp /etc/resolv.conf $root/etc
|
|
rm -f $root/etc/hosts
|
|
echo "127.0.0.1 localhost" >> $root/etc/hosts
|
|
|
|
echo storing hardware information...
|
|
|
|
#kudzu -p > $root/etc/sysconfig/hwconf
|
|
#cp /etc/modprobe.conf $root/etc/
|
|
|
|
echo setting up initial account information...
|
|
|
|
echo "root:x:0:root" > $root/etc/group
|
|
echo "sshd:x:74:" >> $root/etc/group
|
|
echo "root:x:0:0:root:/root:/bin/sh" > $root/etc/passwd
|
|
echo "sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin" >> $root/etc/passwd
|
|
echo "root::12757:0:99999:7:::" >> $root/etc/shadow
|
|
echo "sshd:!!:12757:0:99999:7:::" >> $root/etc/shadow
|
|
|
|
echo default profile for root
|
|
echo "source @nix@/etc/profile.d/nix.sh" > $root/root/.profile
|
|
|
|
touch_file /etc/login.defs
|
|
touch_file /etc/services
|
|
|
|
##
|
|
## Do kernel stuff here.
|
|
##
|
|
strippedName=$(basename $root/@kernel@);
|
|
if echo "$strippedName" | grep -q '^[a-z0-9]\{32\}-'; then
|
|
strippedName=$(echo "$strippedName" | cut -c34- | cut -c 7-)
|
|
fi
|
|
|
|
kernelhash=$(basename $root/@kernel@);
|
|
if echo "$kernelhash" | grep -q '^[a-z0-9]\{32\}-'; then
|
|
kernelhash=$(echo "$kernelhash" | cut -c -32)
|
|
fi
|
|
|
|
version=$strippedName-$kernelhash
|
|
|
|
ln -s @kernelscripts@/lib/modules/$version $root/lib/modules/$version
|
|
|
|
##
|
|
## init
|
|
##
|
|
|
|
ln -s $device $root/dev/root
|
|
ln -s @sysvinitPath@/sbin/init /sbin/init
|
|
|
|
##
|
|
## Do funky stuff with grub here.
|
|
##
|
|
|
|
echo installing bootloader
|
|
|
|
grub-install --root-directory=${root} --no-floppy ${targetdrive}
|
|
|
|
# FIXME "root (hd0,0)"
|
|
cat > $root/boot/grub/menu.lst << GRUBEND
|
|
default=0
|
|
timeout=5
|
|
title NixOS
|
|
kernel @kernel@/vmlinuz root=$device
|
|
GRUBEND
|
|
|
|
echo clearing substitutes
|
|
|
|
$NIX/nix-store --clear-substitutes
|
|
|
|
#echo clearing network information
|
|
|
|
#rm $root/etc/resolv.conf
|
|
|
|
#echo copying install log
|
|
|
|
#cp /tmp/install-log $root/root
|
|
|
|
# bizar. busybox umount doesn't like things with --bind it seems.
|
|
echo umounting filesystem
|
|
|
|
umount $root/cdrom
|
|
umount $root
|
|
#umount /nix
|
|
umount /cdrom
|
|
#echo ejecting $cddevice
|
|
#eject $cddevice
|
|
|
|
echo install done
|
|
echo it\'s safe to turn off your machine
|
|
echo exiting install process
|
|
|
|
#while true; do
|
|
#sleep 60;
|
|
#done
|