From 4abfacb46842cfadcab4563a830ee1f25a4be813 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Fri, 4 Nov 2011 18:49:59 +0000 Subject: [PATCH] * In the initrd, automatically mount all available ephemeral disks. This depends on the EC2 instance type, so we have to probe for them. svn path=/nixos/trunk/; revision=30234 --- modules/virtualisation/amazon-image.nix | 65 +++++++++++++++++-------- 1 file changed, 45 insertions(+), 20 deletions(-) diff --git a/modules/virtualisation/amazon-image.nix b/modules/virtualisation/amazon-image.nix index 9f1d475df2d3..94722bb7911a 100644 --- a/modules/virtualisation/amazon-image.nix +++ b/modules/virtualisation/amazon-image.nix @@ -66,15 +66,8 @@ with pkgs.lib; [ { mountPoint = "/"; device = "/dev/disk/by-label/nixos"; } - { mountPoint = "/ephemeral0"; - device = "/dev/xvdc"; - neededForBoot = true; - } ]; - swapDevices = - [ { device = "/dev/xvdb"; } ]; - boot.initrd.kernelModules = [ "xen-blkfront" "aufs" ]; boot.kernelModules = [ "xen-netfront" ]; @@ -85,23 +78,55 @@ with pkgs.lib; boot.loader.grub.timeout = 0; boot.loader.grub.extraPerEntryConfig = "root (hd0)"; - # Put /tmp and /var on /ephemeral0, which has a lot more space. - # Unfortunately we can't do this with the `fileSystems' option - # because it has no support for creating the source of a bind - # mount. Also, "move" /nix to /ephemeral0 by layering an AUFS - # on top of it so we have a lot more space for Nix operations. + # Mount all formatted ephemeral disks and activate all swap devices. + # We cannot do this with the ‘fileSystems’ and ‘swapDevices’ options + # because the set of devices is dependent on the instance type + # (e.g. "m1.large" has one ephemeral filesystem and one swap device, + # while "m1.large" has two ephemeral filesystems and no swap + # devices). Also, put /tmp and /var on /disk0, since it has a lot + # more space than the root device. Similarly, "move" /nix to /disk0 + # by layering an AUFS on top of it so we have a lot more space for + # Nix operations. boot.initrd.postMountCommands = '' - mkdir -m 1777 -p $targetRoot/ephemeral0/tmp - mkdir -m 1777 -p $targetRoot/tmp - mount --bind $targetRoot/ephemeral0/tmp $targetRoot/tmp + diskNr=0 + diskForAufs= + for device in /dev/xvd*; do + if [ "$device" = /dev/xvda1 ]; then continue; fi + fsType=$(blkid -o value -s TYPE "$device" || true) + if [ "$fsType" = swap ]; then + echo "activating swap device $device..." + swapon "$device" || true + elif [ "$fsType" = ext3 ]; then + mp="/disk$diskNr" + diskNr=$((diskNr + 1)) + echo "mounting $device om $mp..." + if mountFS "$device" "$mp" "" ext3; then + if [ -z "$diskForAufs" ]; then diskForAufs="$mp"; fi + fi + else + echo "skipping unknown device type $device" + fi + done - mkdir -m 755 -p $targetRoot/ephemeral0/var - mkdir -m 755 -p $targetRoot/var - mount --bind $targetRoot/ephemeral0/var $targetRoot/var + if [ -n "$diskForAufs" ]; then + mkdir -m 755 -p $targetRoot/$diskForAufs/root - mkdir -m 755 -p $targetRoot/ephemeral0/nix - mount -t aufs -o dirs=$targetRoot/ephemeral0/nix=rw:$targetRoot/nix=rr none $targetRoot/nix + mkdir -m 1777 -p $targetRoot/$diskForAufs/root/tmp $targetRoot/tmp + mount --bind $targetRoot/$diskForAufs/root/tmp $targetRoot/tmp + + mkdir -m 755 -p $targetRoot/$diskForAufs/root/var $targetRoot/var + mount --bind $targetRoot/$diskForAufs/root/var $targetRoot/var + + mkdir -m 755 -p $targetRoot/$diskForAufs/root/nix + mount -t aufs -o dirs=$targetRoot/$diskForAufs/root/nix=rw:$targetRoot/nix=rr none $targetRoot/nix + fi + ''; + + boot.initrd.extraUtilsCommands = + '' + # We need swapon in the initrd. + cp ${pkgs.utillinux}/sbin/swapon $out/bin ''; # Allow root logins only using the SSH key that the user specified