240a2de945
- make symlinks to "build" and "kernel" in those directories - copy all modules.* files (like modules.dep). This is done so future add-on modules can modify these files instead of the ones in the store... Since the Nix hash is embedded in the path, this can still be considered safe and it makes modprobe work automagically. svn path=/nixu/trunk/; revision=3674
348 lines
8.3 KiB
Bash
Executable file
348 lines
8.3 KiB
Bash
Executable file
#! @bash@/bin/sh -e
|
|
|
|
export PATH=@bash@/bin:@coreutils@/bin:@findutils@/bin:@utillinux@/bin:@utillinux@/sbin:@e2fsprogs@/sbin:@grub@/sbin:@sysvinitPath@/sbin:@gnugrep@/bin
|
|
|
|
kernel=@kernel@
|
|
|
|
sysvinitPath=@sysvinitPath@
|
|
bootPath=@bootPath@
|
|
modutils=@modutils@
|
|
hotplug=@hotplug@
|
|
|
|
echo mounting special filesystems
|
|
|
|
mount -t proc proc /proc
|
|
mount -t sysfs sys /sys
|
|
|
|
# make a complete /dev filesystem
|
|
# ripped permissions and everything from anaconda (loader2/devices.h)
|
|
|
|
echo making device nodes
|
|
|
|
# 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
|
|
|
|
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/hdb b 3 64
|
|
mknod -m 0660 /dev/hdb1 b 3 65
|
|
mknod -m 0660 /dev/hdb2 b 3 66
|
|
mknod -m 0660 /dev/hdb3 b 3 67
|
|
|
|
mknod -m 0660 /dev/hdc b 22 0
|
|
mknod -m 0660 /dev/hdc1 b 22 1
|
|
mknod -m 0660 /dev/hdc2 b 22 2
|
|
mknod -m 0660 /dev/hdc3 b 22 3
|
|
|
|
mknod -m 0660 /dev/hdd b 22 64
|
|
mknod -m 0660 /dev/hdd1 b 22 65
|
|
mknod -m 0660 /dev/hdd2 b 22 66
|
|
mknod -m 0660 /dev/hdd3 b 22 67
|
|
|
|
#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
|
|
|
|
mknod -m 0600 /dev/initctl p
|
|
|
|
targetdrive=/dev/hda
|
|
device=${targetdrive}1
|
|
mkfs.ext2 ${device}
|
|
mkswap ${targetdrive}2
|
|
|
|
|
|
#if ! test -n "$1"
|
|
#then
|
|
# echo "need harddisk device for installing!"
|
|
# exit
|
|
#else
|
|
# device=$1
|
|
#fi
|
|
|
|
|
|
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 /dev
|
|
make_dir 00755 /dev/pts
|
|
make_dir 00755 /etc # global non-constant configuration
|
|
make_dir 00755 /etc-secret
|
|
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/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 /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/log
|
|
make_dir 00755 /var/run
|
|
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 $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 0444 $root/dev/urandom c 1 9
|
|
|
|
#touch_file /etc/passwd
|
|
#touch_file /etc/shadow
|
|
#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...
|
|
|
|
#devices=$(grep -r cdrom hd* | cut -d '/' -f 1 | sort | uniq)
|
|
#echo devices ${devices}
|
|
|
|
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
|
|
echo "cdrom contents"
|
|
ls /cdrom
|
|
if test -f /cdrom/NIXOS
|
|
then
|
|
cddevice=$i
|
|
echo "Accessing NixOS CDROM at $i"
|
|
break
|
|
fi
|
|
#umount /cdrom
|
|
fi
|
|
done
|
|
|
|
echo switch to /nix and /nixpkgs from CD
|
|
|
|
ln -s /cdrom/nixpkgs /nixpkgs
|
|
mount --bind /cdrom/nix /nix
|
|
|
|
|
|
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 -fLa /cdrom/pkgs $root/nixpkgs/trunk
|
|
|
|
make_dir 0755 /tmp/scripts
|
|
cp -fa /cdrom/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) < /cdrom/mystorepaths
|
|
|
|
cp -fva /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
|
|
|
|
echo setting init symlink...
|
|
rm -f $root/init
|
|
ln -s $sysvinitPath/sbin/init $root/init
|
|
ln -s @bash@/bin/sh $root/bin/sh
|
|
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:$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
|
|
|
|
echo setting up initial account information...
|
|
|
|
echo "root:x:0:root" > $root/etc/group
|
|
echo "root:x:0:0:root:/root:/bin/sh" > $root/etc/passwd
|
|
echo "root::12757:0:99999:7:::" > $root/etc/shadow
|
|
|
|
###
|
|
### Do kernel stuff here.
|
|
###
|
|
strippedName=$(basename @kernel@);
|
|
if echo "$strippedName" | grep -q '^[a-z0-9]\{32\}-'; then
|
|
strippedName=$(echo "$strippedName" | cut -c34- | cut -c 7-)
|
|
fi
|
|
|
|
kernelhash=$(basename @kernel@);
|
|
if echo "$kernelhash" | grep -q '^[a-z0-9]\{32\}-'; then
|
|
kernelhash=$(echo "$kernelhash" | cut -c -32)
|
|
fi
|
|
|
|
version=$strippedName-$kernelhash
|
|
|
|
make_dir 0755 /lib/modules/$version
|
|
|
|
ln -s @kernel@/lib/modules/$version/build $root/lib/modules/$version/build
|
|
ln -s @kernel@/lib/modules/$version/kernel $root/lib/modules/$version/kernel
|
|
cp @kernel@/lib/modules/$version/modules.* $root/lib/modules/$version
|
|
chmod 644 $root/lib/modules/$version/modules.*
|
|
|
|
###
|
|
### Do funky stuff with grub here.
|
|
###
|
|
|
|
ln -s @kernel@/vmlinuz $root/boot/vmlinuz
|
|
ln -s @sysvinitPath@/sbin/init $root/sbin/init
|
|
ln -s @hotplug@/sbin/hotplug $root/sbin/hotplug
|
|
ln -s @hotplug@/etc/hotplug $root/etc/hotplug
|
|
ln -s @hotplug@/etc/hotplug.d $root/etc/hotplug.d
|
|
ln -s $device $root/dev/root
|
|
|
|
echo installing bootloader
|
|
|
|
grub-install --root-directory=${root} --no-floppy ${targetdrive}
|
|
|
|
echo umounting filesystem
|
|
|
|
umount $root
|
|
|
|
echo install done
|
|
telinit 0
|