replace a lot of tools we initially use with statically linked versions.

This reduces the ramdisk installer size with a few megabytes when gzipped,
but with about 40 MB when unpacked in memory.

There are a few improvements possible:

- strip the binaries. This saves another few MBs.
- only copy the binaries we really need to /bin or /sbin. This could reduce
the size of the installer a lot, especially with util-linux, of which we
don't use that many tools at all.
- try to move some packages we link with glibc right now (like util-linux) to
dietlibc. This will not work for bash, already tried that.
- try to use busybox as a replacement for everything.

svn path=/nixu/trunk/; revision=4428
This commit is contained in:
Armijn Hemel 2005-12-24 11:50:42 +00:00
parent f130123af5
commit fe355bba78
5 changed files with 64 additions and 36 deletions

View File

@ -9,9 +9,11 @@ for i in $boot $halt $login $env; do
dst=$out/bin/$(basename $i | cut -c34-)
sed \
-e "s^@bash\@^$bash^g" \
-e "s^@bashStatic\@^$bashStatic^g" \
-e "s^@coreutils\@^$coreutils^g" \
-e "s^@findutilsWrapper\@^$findutilsWrapper^g" \
-e "s^@utillinux\@^$utillinux^g" \
-e "s^@utillinuxStatic\@^$utillinuxStatic^g" \
-e "s^@sysvinit\@^$sysvinit^g" \
-e "s^@e2fsprogs\@^$e2fsprogs^g" \
-e "s^@nettools\@^$nettools^g" \

View File

@ -1,4 +1,4 @@
{ stdenv, kernel, bash, coreutils, findutilsWrapper, utillinux, sysvinit, e2fsprogs
{ stdenv, kernel, bash, bashStatic, coreutils, findutilsWrapper, utillinux, utillinuxStatic, sysvinit, e2fsprogs
, nettools, nix, subversion, gcc, wget, which, vim, less, screen, openssh
, binutils, strace, shadowutils, iputils, gnumake, curl, gnused, gnugrep
, gnutar, gzip, mingettyWrapper, grubWrapper, parted, module_init_tools, hotplug
@ -12,7 +12,7 @@ derivation {
halt = ./halt.sh;
login = ./login.sh;
env = ./env.sh;
inherit stdenv kernel bash coreutils findutilsWrapper utillinux sysvinit
inherit stdenv kernel bash bashStatic coreutils findutilsWrapper utillinux sysvinit
e2fsprogs nettools nix subversion gcc wget which vim less screen
openssh binutils strace shadowutils iputils gnumake curl gnused
gnutar gnugrep gzip mingettyWrapper grubWrapper parted module_init_tools

View File

@ -1,6 +1,6 @@
#! @bash@/bin/sh -e
export PATH=@bash@/bin:@coreutilsdiet@/bin:@coreutils@/bin:@findutils@/bin:@utillinux@/bin:@utillinux@/sbin:@e2fsprogs@/sbin:@grub@/sbin:@sysvinitPath@/sbin:@gnugrep@/bin:@which@/bin:@gnutar@/bin:@eject@/bin
export PATH=@bash@/bin:@coreutilsdiet@/bin:@coreutils@/bin:@findutils@/bin:@utillinux@/bin:@utillinux@/sbin:@utilLinux@/bin:@utilLinux@/sbin:@e2fsprogs@/sbin:@grub@/sbin:@sysvinitPath@/sbin:@gnugrep@/bin:@which@/bin:@gnutar@/bin:@eject@/bin:@kudzu@/sbin
##
## In the beginning we want to have a minimalistic environment, built with
@ -194,6 +194,7 @@ mknod -m 0444 $root/dev/urandom c 1 9
rm -f $root/etc/mtab
ln -s /proc/mounts $root/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...
@ -221,6 +222,9 @@ echo switch to /nix and /nixpkgs from CD
ln -s /cdrom/nixpkgs /nixpkgs
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
@ -228,6 +232,10 @@ export NIX_STATE_DIR=$root/nix/var/nix
export NIX_CONF_DIR=$root/nix/etc
NIX_CMD_PATH=@nix@/bin
echo bringing up networking...
nic=`kudzu -p | grep eth | sort | uniq | cut -d ' ' -f 2`
echo initialising Nix DB...
$NIX_CMD_PATH/nix-store --init
@ -290,13 +298,15 @@ echo "#2:2345:respawn:$mingetty/sbin/mingetty tty2" >> $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 storing hardware information...
kudzu -p > $root/etc/sysconfig/hwconf
echo setting up initial account information...

View File

@ -53,10 +53,10 @@ do
tar -cf - $i | tar --directory=$archivesDir -xf -
done
utilLinux=$($NIX_CMD_PATH/nix-store -qR $(nix-store -r $(echo '(import ./pkgs.nix).utillinux' | $NIX_CMD_PATH/nix-instantiate -)))
utilLinux=$(nix-store -r $(echo '(import ./pkgs.nix).utillinuxStatic' | $NIX_CMD_PATH/nix-instantiate -))
coreUtilsDiet=$($NIX_CMD_PATH/nix-store -qR $(nix-store -r $(echo '(import ./pkgs.nix).coreutilsDiet' | $NIX_CMD_PATH/nix-instantiate -)))
e2fsProgs=$($NIX_CMD_PATH/nix-store -qR $(nix-store -r $(echo '(import ./pkgs.nix).e2fsprogsDiet' | $NIX_CMD_PATH/nix-instantiate -)))
modUtils=$($NIX_CMD_PATH/nix-store -qR $(nix-store -r $(echo '(import ./pkgs.nix).module_init_tools' | $NIX_CMD_PATH/nix-instantiate -)))
modUtils=$($NIX_CMD_PATH/nix-store -qR $(nix-store -r $(echo '(import ./pkgs.nix).module_init_toolsStatic' | $NIX_CMD_PATH/nix-instantiate -)))
Grub=$($NIX_CMD_PATH/nix-store -qR $(nix-store -r $(echo '(import ./pkgs.nix).grubWrapper' | $NIX_CMD_PATH/nix-instantiate -)))
#gnuSed=$($NIX_CMD_PATH/nix-store -qR $(nix-store -r $(echo '(import ./pkgs.nix).gnused' | $NIX_CMD_PATH/nix-instantiate -)))
#gnuGrep=$($NIX_CMD_PATH/nix-store -qR $(nix-store -r $(echo '(import ./pkgs.nix).gnugrep' | $NIX_CMD_PATH/nix-instantiate -)))
@ -64,13 +64,14 @@ Kernel=$($NIX_CMD_PATH/nix-store -qR $(nix-store -r $(echo '(import ./pkgs.nix).
SysVinit=$($NIX_CMD_PATH/nix-store -qR $(nix-store -r $(echo '(import ./pkgs.nix).sysvinit' | $NIX_CMD_PATH/nix-instantiate -)))
BootPath=$($NIX_CMD_PATH/nix-store -qR $(nix-store -r $(echo '(import ./pkgs.nix).boot' | $NIX_CMD_PATH/nix-instantiate -)))
bash=$($NIX_CMD_PATH/nix-store -q $(echo '(import ./pkgs.nix).bash' | $NIX_CMD_PATH/nix-instantiate -))
#bash=$($NIX_CMD_PATH/nix-store -q $(echo '(import ./pkgs.nix).bash' | $NIX_CMD_PATH/nix-instantiate -))
bash=$($NIX_CMD_PATH/nix-store -q $(echo '(import ./pkgs.nix).bashStatic' | $NIX_CMD_PATH/nix-instantiate -))
coreutilsdiet=$($NIX_CMD_PATH/nix-store -q $(echo '(import ./pkgs.nix).coreutilsDiet' | $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).findutilsWrapper' | $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).e2fsprogsDiet' | $NIX_CMD_PATH/nix-instantiate -))
modutils=$($NIX_CMD_PATH/nix-store -q $(echo '(import ./pkgs.nix).module_init_tools' | $NIX_CMD_PATH/nix-instantiate -))
modutils=$($NIX_CMD_PATH/nix-store -q $(echo '(import ./pkgs.nix).module_init_toolsStatic' | $NIX_CMD_PATH/nix-instantiate -))
grub=$($NIX_CMD_PATH/nix-store -r $(echo '(import ./pkgs.nix).grubWrapper' | $NIX_CMD_PATH/nix-instantiate -))
mingettyWrapper=$($NIX_CMD_PATH/nix-store -r $(echo '(import ./pkgs.nix).mingettyWrapper' | $NIX_CMD_PATH/nix-instantiate -))
hotplug=$($NIX_CMD_PATH/nix-store -r $(echo '(import ./pkgs.nix).hotplug' | $NIX_CMD_PATH/nix-instantiate -))
@ -82,22 +83,23 @@ which=$($NIX_CMD_PATH/nix-store -r $(echo '(import ./pkgs.nix).which' | $NIX_CMD
gnutar=$($NIX_CMD_PATH/nix-store -r $(echo '(import ./pkgs.nix).gnutar' | $NIX_CMD_PATH/nix-instantiate -))
eject=$($NIX_CMD_PATH/nix-store -r $(echo '(import ./pkgs.nix).eject' | $NIX_CMD_PATH/nix-instantiate -))
sysklogd=$($NIX_CMD_PATH/nix-store -r $(echo '(import ./pkgs.nix).sysklogd' | $NIX_CMD_PATH/nix-instantiate -))
kudzu=$($NIX_CMD_PATH/nix-store -r $(echo '(import ./pkgs.nix).kudzu' | $NIX_CMD_PATH/nix-instantiate -))
#(while read storepath; do
#cp -fa --parents ${storepath} ${archivesDir}
#done) < $storePaths
echo utillinux $utilLinux
#echo utillinux $utilLinux
for i in $utilLinux; do
echo i $i
deps=( $($NIX_CMD_PATH/nix-store -q --references $i) )
echo length ${#deps[@]}
if test "${#deps[@]}" = 0
then
echo zarro
fi
done
#for i in $utilLinux; do
# echo i $i
# deps=( $($NIX_CMD_PATH/nix-store -q --references $i) )
# echo length ${#deps[@]}
# if test "${#deps[@]}" = 0
# then
# echo zarro
# fi
#done
echo creating directories for bootimage
@ -106,6 +108,7 @@ mkdir ${initdir}/bin
mkdir ${initdir}/cdrom
mkdir ${initdir}/dev
mkdir ${initdir}/etc
mkdir ${initdir}/etc/sysconfig
mkdir ${initdir}/installimage
mkdir ${initdir}/modules
mkdir ${initdir}/proc
@ -138,7 +141,7 @@ cp -fa ${nixpkgs} ${archivesDir}
#cp -fvau --parents ${nano} ${archivesDir}
#cp -fvau --parents ${gnutar} ${archivesDir}
bashdeps=$($NIX_CMD_PATH/nix-store -qR $(nix-store -r $(echo '(import ./pkgs.nix).bash' | $NIX_CMD_PATH/nix-instantiate -)))
bashdeps=$($NIX_CMD_PATH/nix-store -qR $(nix-store -r $(echo '(import ./pkgs.nix).bashStatic' | $NIX_CMD_PATH/nix-instantiate -)))
echo copying scripts
@ -155,6 +158,7 @@ sed -e "s^@sysvinitPath\@^$sysvinitPath^g" \
-e "s^@findutils\@^$findutils^g" \
-e "s^@coreutilsdiet\@^$coreutilsdiet^g" \
-e "s^@coreutils\@^$coreutils^g" \
-e "s^@utilLinux\@^$utilLinux^g" \
-e "s^@utillinux\@^$utillinux^g" \
-e "s^@e2fsprogs\@^$e2fsprogs^g" \
-e "s^@modutils\@^$modutils^g" \
@ -163,7 +167,7 @@ sed -e "s^@sysvinitPath\@^$sysvinitPath^g" \
-e "s^@hotplug\@^$hotplug^g" \
-e "s^@gnugrep\@^$gnugrep^g" \
-e "s^@which\@^$which^g" \
-e "s^@eject\@^$eject^g" \
-e "s^@kudzu\@^$kudzu^g" \
-e "s^@sysklogd\@^$sysklogd^g" \
-e "s^@gnutar\@^$gnutar^g" \
-e "s^@mingetty\@^$mingettyWrapper^g" \
@ -177,7 +181,7 @@ sed -e "s^@sysvinitPath\@^$sysvinitPath^g" \
-e "s^@findutils\@^$findutils^g" \
-e "s^@coreutilsdiet\@^$coreutilsdiet^g" \
-e "s^@coreutils\@^$coreutils^g" \
-e "s^@utillinux\@^$utillinux^g" \
-e "s^@utillinux\@^$utilLinux^g" \
-e "s^@e2fsprogs\@^$e2fsprogs^g" \
-e "s^@modutils\@^$modutils^g" \
-e "s^@grub\@^$grub^g" \
@ -203,6 +207,10 @@ echo copying kernel
# of the kernel here.
cp -L $kernel/vmlinuz ${archivesDir}/isolinux
echo linking kernel modules
ln -s $kernel/lib $archivesDir/lib
echo creating ramdisk
rm -f ${initrd}
@ -210,16 +218,24 @@ rm -f ${initrd}
cp ${archivesDir}/scripts/fill-disk.sh ${initdir}/
cp ${archivesDir}/scripts/ramdisk-login.sh ${initdir}/
cp ${archivesDir}/scripts/init.sh ${initdir}/init
ln -s ${bash}/bin/bash ${initdir}/bin/sh
#ln -s ${bash}/bin/bash ${initdir}/bin/sh
cp ${bash}/bin/bash ${initdir}/bin/sh
chmod u+x ${initdir}/init
chmod u+x ${initdir}/fill-disk.sh
chmod u+x ${initdir}/ramdisk-login.sh
cp -fau --parents ${bashdeps} ${initdir}
#cp -fau --parents ${bashdeps} ${initdir}
#cp -fau --parents ${utilLinux} ${initdir}
#cp -fau --parents ${coreUtilsDiet} ${initdir}
#cp -fau --parents ${e2fsProgs} ${initdir}
#cp -fau --parents ${modUtils} ${initdir}
#cp -fau --parents ${hotplug} ${initdir}
cp -fau --parents ${bash} ${initdir}
cp -fau --parents ${utilLinux} ${initdir}
cp -fau --parents ${coreUtilsDiet} ${initdir}
cp -fau --parents ${e2fsProgs} ${initdir}
cp -fau --parents ${modUtils} ${initdir}
cp -fau --parents ${coreutilsdiet} ${initdir}
cp -fau --parents ${e2fsprogs} ${initdir}
cp -fau --parents ${modutils} ${initdir}
cp -fau --parents ${hotplug} ${initdir}
#cp -fau --parents ${kudzu} ${initdir}
#cp -fau --parents ${eject} ${initdir}
touch ${archivesDir}/NIXOS
@ -243,4 +259,4 @@ mkisofs -rJ -o ${bootiso} -b isolinux/isolinux.bin -c isolinux/boot.cat \
echo cleaning up
chmod -f -R +w ${archivesDir}/*
rm -rf ${archivesDir}/*
#rm -rf ${archivesDir}/*

View File

@ -1,21 +1,21 @@
rec {
inherit (import /nixpkgs/trunk/pkgs/system/i686-linux.nix)
stdenv kernel bash coreutils coreutilsDiet findutilsWrapper utillinux sysvinit
stdenv kernel bash bashStatic coreutils coreutilsDiet findutilsWrapper utillinux utillinuxStatic sysvinit
e2fsprogsDiet e2fsprogs
nettools nix subversion gcc wget which vim less screen openssh binutils
strace shadowutils iputils gnumake curl gnused gnutar gnugrep gzip
mingettyWrapper grubWrapper syslinux parted module_init_tools hotplug udev
dhcpWrapper man nano eject sysklogd;
mingettyWrapper grubWrapper syslinux parted module_init_tools module_init_toolsStatic hotplug udev
dhcpWrapper man nano eject sysklogd kudzu;
boot = (import ./boot) {inherit stdenv kernel bash coreutils findutilsWrapper
utillinux sysvinit e2fsprogs nettools nix subversion gcc wget which vim
boot = (import ./boot) {inherit stdenv kernel bash bashStatic coreutils findutilsWrapper
utillinux utillinuxStatic sysvinit e2fsprogs nettools nix subversion gcc wget which vim
less screen openssh binutils strace shadowutils iputils gnumake curl
gnused gnutar gnugrep gzip mingettyWrapper grubWrapper parted module_init_tools
hotplug udev dhcpWrapper man nano;};
init = (import ./init) {inherit stdenv bash coreutilsDiet utillinux e2fsprogsDiet
init = (import ./init) {inherit stdenv bash bashStatic coreutilsDiet utillinux e2fsprogsDiet
nix shadowutils mingettyWrapper grubWrapper parted module_init_tools hotplug
dhcpWrapper man nano eject;};
everything = [boot sysvinit kernel sysklogd];
everything = [boot sysvinit kernel sysklogd kudzu];
}