forked from mirrors/nixpkgs
* Don't use klibc in the initrd. It's simpler (and slightly smaller)
to use the standard (coreutils) tools. * Use util-linux's `switch_root' to switch over to the target root FS. It automatically moves over the /dev, /proc and /sys from stage 1, so stage 2 doesn't need to set them up again. svn path=/nixos/trunk/; revision=22085
This commit is contained in:
parent
eb4c33eeca
commit
dc49a0ce3f
|
@ -170,7 +170,7 @@ in
|
|||
''
|
||||
echo "" > /proc/sys/kernel/hotplug
|
||||
|
||||
mkdir -pv /var/lib/udev/rules.d
|
||||
mkdir -p /var/lib/udev/rules.d
|
||||
|
||||
# Do the loading of additional stage 2 kernel modules.
|
||||
# Maybe this isn't the best place...
|
||||
|
@ -179,7 +179,7 @@ in
|
|||
${modprobe}/sbin/modprobe $i || true
|
||||
done
|
||||
|
||||
mkdir -pv /dev/.udev # !!! bug in udev?
|
||||
mkdir -p /dev/.udev # !!! bug in udev?
|
||||
'';
|
||||
|
||||
daemonType = "fork";
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
targetRoot=/mnt-root
|
||||
|
||||
export LD_LIBRARY_PATH=@extraUtils@/lib
|
||||
export PATH=@extraUtils@/bin:@klibc@/bin
|
||||
export PATH=@extraUtils@/bin
|
||||
|
||||
|
||||
fail() {
|
||||
|
@ -53,6 +53,7 @@ mkdir -p /proc
|
|||
mount -t proc none /proc
|
||||
mkdir -p /sys
|
||||
mount -t sysfs none /sys
|
||||
mount -t tmpfs -o "mode=0755,size=@devSize@" none /dev
|
||||
|
||||
|
||||
# Process the kernel command line.
|
||||
|
@ -144,7 +145,7 @@ checkFS() {
|
|||
# Only check block devices.
|
||||
if ! test -b "$device"; then return 0; fi
|
||||
|
||||
eval $(fstype "$device")
|
||||
FSTYPE=$(blkid -o value -s TYPE "$device" || true)
|
||||
|
||||
# Don't check ROM filesystems.
|
||||
if test "$FSTYPE" = iso9660 -o "$FSTYPE" = udf; then return 0; fi
|
||||
|
@ -276,33 +277,27 @@ done
|
|||
|
||||
|
||||
# Stop udevd.
|
||||
kill $(minips -C udevd -o pid=) 2> /dev/null
|
||||
kill -- -1
|
||||
|
||||
|
||||
if test -n "$debug1mounts"; then fail; fi
|
||||
|
||||
|
||||
# `run-init' needs a /dev/console on the target FS.
|
||||
if ! test -e $targetRoot/dev/console; then
|
||||
mkdir -p $targetRoot/dev
|
||||
mknod $targetRoot/dev/console c 5 1
|
||||
fi
|
||||
|
||||
|
||||
# Restore /proc/sys/kernel/modprobe to its original value.
|
||||
echo /sbin/modprobe > /proc/sys/kernel/modprobe
|
||||
|
||||
|
||||
# Start stage 2. `run-init' deletes all files in the ramfs on the
|
||||
# current /. Note that $stage2Init might be an absolute symlink, in
|
||||
# which case "-e" won't work because we're not in the chroot yet.
|
||||
# Start stage 2. `switch_root' deletes all files in the ramfs on the
|
||||
# current root. It also moves the /proc, /sys and /dev mounts over to
|
||||
# the new root. Note that $stage2Init might be an absolute symlink,
|
||||
# in which case "-e" won't work because we're not in the chroot yet.
|
||||
if ! test -e "$targetRoot/$stage2Init" -o -L "$targetRoot/$stage2Init"; then
|
||||
echo "stage 2 init script not found"
|
||||
fail
|
||||
fi
|
||||
|
||||
umount /sys
|
||||
umount /proc
|
||||
exec run-init "$targetRoot" "$stage2Init"
|
||||
mkdir -m 0755 -p $targetRoot/proc $targetRoot/sys $targetRoot/dev
|
||||
|
||||
exec switch_root "$targetRoot" "$stage2Init"
|
||||
|
||||
fail # should never be reached
|
||||
|
|
|
@ -114,13 +114,17 @@ let
|
|||
|
||||
# Copy some utillinux stuff.
|
||||
cp -v ${pkgs.utillinux}/bin/mount ${pkgs.utillinux}/bin/umount \
|
||||
${pkgs.utillinux}/sbin/fsck ${pkgs.utillinux}/sbin/pivot_root \
|
||||
${pkgs.utillinux}/sbin/fsck ${pkgs.utillinux}/sbin/switch_root \
|
||||
${pkgs.utillinux}/sbin/blkid $out/bin
|
||||
cp -pdv ${pkgs.utillinux}/lib/libblkid*.so.* $out/lib
|
||||
cp -pdv ${pkgs.utillinux}/lib/libuuid*.so.* $out/lib
|
||||
|
||||
# Copy some coreutils.
|
||||
cp -v ${pkgs.coreutils}/bin/basename $out/bin
|
||||
cp -v ${pkgs.coreutils}/bin/mkdir $out/bin
|
||||
cp -v ${pkgs.coreutils}/bin/mknod $out/bin
|
||||
cp -v ${pkgs.coreutils}/bin/cat $out/bin
|
||||
cp -v ${pkgs.coreutils}/bin/chroot $out/bin
|
||||
|
||||
# Copy e2fsck and friends.
|
||||
cp -v ${pkgs.e2fsprogs}/sbin/e2fsck $out/bin
|
||||
|
@ -256,11 +260,9 @@ let
|
|||
|
||||
isExecutable = true;
|
||||
|
||||
klibc = pkgs.klibcShrunk;
|
||||
|
||||
inherit udevConf extraUtils;
|
||||
|
||||
inherit (config.boot) resumeDevice;
|
||||
inherit (config.boot) resumeDevice devSize;
|
||||
|
||||
inherit (config.boot.initrd) checkJournalingFS
|
||||
postDeviceCommands postMountCommands kernelModules;
|
||||
|
|
|
@ -36,13 +36,12 @@ setPath "@path@"
|
|||
mount -n -o remount,rw none /
|
||||
|
||||
|
||||
# Mount special file systems.
|
||||
# Mount special file systems. Note that /dev, /proc and /sys are
|
||||
# already mounted by `switch_root' in the initrd.
|
||||
mkdir -m 0755 -p /etc
|
||||
test -e /etc/fstab || touch /etc/fstab # to shut up mount
|
||||
test -s /etc/mtab && rm /etc/mtab # while installing a symlink is created (see man mount), if it's still there for whateever reason remove it
|
||||
rm -f /etc/mtab* # not that we care about stale locks
|
||||
mkdir -m 0755 -p /proc
|
||||
mount -n -t proc none /proc
|
||||
|
||||
rm -f /etc/mtab
|
||||
cat /proc/mounts > /etc/mtab
|
||||
|
@ -79,15 +78,11 @@ done
|
|||
|
||||
|
||||
# More special file systems, initialise required directories.
|
||||
mkdir -m 0755 -p /sys
|
||||
mount -t sysfs none /sys
|
||||
mkdir -m 0755 -p /dev
|
||||
mount -t tmpfs -o "mode=0755,size=@devSize@" none /dev
|
||||
mkdir -m 0777 /dev/shm
|
||||
mount -t tmpfs -o "rw,nosuid,nodev,size=@devShmSize@" tmpfs /dev/shm
|
||||
mkdir -m 0755 -p /dev/pts
|
||||
mount -t devpts -o mode=0600,gid=@ttyGid@ none /dev/pts
|
||||
[ -e /proc/bus/usb ] && mount -t usbfs none /proc/bus/usb # uml doesn't have usb by default
|
||||
[ -e /proc/bus/usb ] && mount -t usbfs none /proc/bus/usb # UML doesn't have USB by default
|
||||
mkdir -m 01777 -p /tmp
|
||||
mkdir -m 0755 -p /var
|
||||
mkdir -m 0755 -p /nix/var
|
||||
|
@ -113,22 +108,15 @@ rm -rf /var/lock
|
|||
rm -rf /nix/var/nix/chroots # recreated in activate-configuration.sh
|
||||
|
||||
|
||||
# Create the minimal device nodes needed for the activation scripts
|
||||
# and Upstart.
|
||||
mknod -m 0666 /dev/null c 1 3
|
||||
mknod -m 0644 /dev/urandom c 1 9 # needed for passwd
|
||||
mknod -m 0644 /dev/console c 5 1
|
||||
|
||||
|
||||
# Clear the resume device.
|
||||
if test -n "$resumeDevice"; then
|
||||
mkswap "$resumeDevice" || echo 'Failed to clear saved image.'
|
||||
fi
|
||||
|
||||
echo "running activation script..."
|
||||
|
||||
# Run the script that performs all configuration activation that does
|
||||
# not have to be done at boot time.
|
||||
echo "running activation script..."
|
||||
@activateConfiguration@ "$systemConfig"
|
||||
|
||||
|
||||
|
|
|
@ -44,7 +44,7 @@ let
|
|||
src = ./stage-2-init.sh;
|
||||
isExecutable = true;
|
||||
inherit kernel activateConfiguration;
|
||||
inherit (config.boot) devSize devShmSize;
|
||||
inherit (config.boot) devShmSize;
|
||||
ttyGid = config.ids.gids.tty;
|
||||
upstart = config.system.build.upstart;
|
||||
path =
|
||||
|
|
|
@ -160,17 +160,20 @@ in
|
|||
''
|
||||
# We need mke2fs in the initrd.
|
||||
cp ${pkgs.e2fsprogs}/sbin/mke2fs $out/bin
|
||||
|
||||
# And `ifconfig'.
|
||||
cp ${pkgs.nettools}/sbin/ifconfig $out/bin
|
||||
'';
|
||||
|
||||
boot.initrd.postDeviceCommands =
|
||||
''
|
||||
# Set up networking. Needed for CIFS mounting.
|
||||
ipconfig 10.0.2.15:::::eth0:none
|
||||
ifconfig eth0 up 10.0.2.15
|
||||
|
||||
# If the disk image appears to be empty (fstype "unknown";
|
||||
# hacky!!!), run mke2fs to initialise.
|
||||
eval $(fstype /dev/vda)
|
||||
if test "$FSTYPE" = unknown; then
|
||||
# If the disk image appears to be empty, run mke2fs to
|
||||
# initialise.
|
||||
FSTYPE=$(blkid -o value -s TYPE /dev/vda || true)
|
||||
if test -z "$FSTYPE"; then
|
||||
mke2fs -t ext3 /dev/vda
|
||||
fi
|
||||
'';
|
||||
|
|
Loading…
Reference in a new issue