From fe355bba78b0b0bfa78459940f77581a3644fef1 Mon Sep 17 00:00:00 2001 From: Armijn Hemel Date: Sat, 24 Dec 2005 11:50:42 +0000 Subject: [PATCH] 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 --- boot/builder.sh | 2 ++ boot/default.nix | 4 ++-- fill-disk.sh | 18 ++++++++++---- make-disk.sh | 62 ++++++++++++++++++++++++++++++------------------ pkgs.nix | 14 +++++------ 5 files changed, 64 insertions(+), 36 deletions(-) diff --git a/boot/builder.sh b/boot/builder.sh index bef4682093d7..bf7479330831 100755 --- a/boot/builder.sh +++ b/boot/builder.sh @@ -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" \ diff --git a/boot/default.nix b/boot/default.nix index 17957c934a72..12d80e54419e 100644 --- a/boot/default.nix +++ b/boot/default.nix @@ -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 diff --git a/fill-disk.sh b/fill-disk.sh index d3206a7e7fe7..3240b2b57d4f 100755 --- a/fill-disk.sh +++ b/fill-disk.sh @@ -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... diff --git a/make-disk.sh b/make-disk.sh index 831c2eed7a35..eda0f9cbd41f 100755 --- a/make-disk.sh +++ b/make-disk.sh @@ -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}/* diff --git a/pkgs.nix b/pkgs.nix index a995404f335f..e1a4288c1566 100644 --- a/pkgs.nix +++ b/pkgs.nix @@ -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]; }