summary refs log tree commit diff
path: root/pkgs/build-support/vm/default.nix
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2010-06-13 23:49:16 +0000
committerEelco Dolstra <eelco.dolstra@logicblox.com>2010-06-13 23:49:16 +0000
commit1f8e6d48140b2f938dc381b922a935cb786a8318 (patch)
tree60ffda3994559a535f5d40b8de876eb5c5f21f92 /pkgs/build-support/vm/default.nix
parent9bf1c8598320586504a4045fcd97adcdb0c7ab13 (diff)
downloadnixpkgs-1f8e6d48140b2f938dc381b922a935cb786a8318.tar
nixpkgs-1f8e6d48140b2f938dc381b922a935cb786a8318.tar.gz
nixpkgs-1f8e6d48140b2f938dc381b922a935cb786a8318.tar.bz2
nixpkgs-1f8e6d48140b2f938dc381b922a935cb786a8318.tar.lz
nixpkgs-1f8e6d48140b2f938dc381b922a935cb786a8318.tar.xz
nixpkgs-1f8e6d48140b2f938dc381b922a935cb786a8318.tar.zst
nixpkgs-1f8e6d48140b2f938dc381b922a935cb786a8318.zip
* The -smb flag in QEMU/KVM is unreliable: it doesn't work without the
  -no-kvm-irqchip flag, and on the Hydra machines only works on the
  rather old KVM 76.  So as a workaround, don't use -smb, but use
  QEMU's "guestfwd" feature to forward 10.0.2.4:139 in the guest to a
  Unix domain socket on the host connected to Samba.
* Use "cache=writeback" to improve performance a lot.
* Use "werror=report" to make QEMU crash instead of hang if the host
  filesystem is full.

svn path=/nixpkgs/trunk/; revision=22249
Diffstat (limited to 'pkgs/build-support/vm/default.nix')
-rw-r--r--pkgs/build-support/vm/default.nix67
1 files changed, 41 insertions, 26 deletions
diff --git a/pkgs/build-support/vm/default.nix b/pkgs/build-support/vm/default.nix
index a34c0fc77ca..8fef75e357a 100644
--- a/pkgs/build-support/vm/default.nix
+++ b/pkgs/build-support/vm/default.nix
@@ -1,4 +1,4 @@
-{pkgs}:
+{ pkgs }:
 
 with pkgs;
 
@@ -7,15 +7,18 @@ rec {
 
   inherit (linuxPackages_2_6_32) kernel;
 
-  kvm = pkgs.kvm76;
+  kvm = pkgs.qemu_kvm;
 
 
   modulesClosure = makeModulesClosure {
     inherit kernel;
-    rootModules = ["cifs" "virtio_net" "virtio_pci" "virtio_blk" "virtio_balloon" "nls_utf8" "ext2" "ext3" "unix"];
+    rootModules = [ "cifs" "virtio_net" "virtio_pci" "virtio_blk" "virtio_balloon" "nls_utf8" "ext2" "ext3" "unix" "sd_mod" "ata_piix" ];
   };
 
 
+  hd = "vda"; # either "sda" or "vda"
+
+
   initrdUtils = runCommand "initrd-utils"
     { buildInputs = [ nukeReferences ];
       allowedReferences = [ "out" modulesClosure ]; # prevent accidents like glibc being included in the initrd
@@ -47,8 +50,8 @@ rec {
       # Copy some other tools.
       cp ${bash}/bin/bash $out/bin
       cp ${module_init_tools}/sbin/insmod $out/bin/insmod
-      cp ${pkgs.nettools}/sbin/ifconfig $out/bin
-      cp ${pkgs.sysvinit}/sbin/halt $out/bin
+      cp ${nettools}/sbin/ifconfig $out/bin
+      cp ${sysvinit}/sbin/halt $out/bin
             
       # Run patchelf to make the programs refer to the copied libraries.
       for i in $out/bin/* $out/lib/*; do if ! test -L $i; then nuke-refs $i; fi; done
@@ -65,8 +68,8 @@ rec {
       mknod ${dev}/null c 1 3
       mknod ${dev}/zero c 1 5
       mknod ${dev}/tty  c 5 0
-      . /sys/class/block/vda/uevent
-      mknod ${dev}/vda  b $MAJOR $MINOR
+      . /sys/class/block/${hd}/uevent
+      mknod ${dev}/${hd} b $MAJOR $MINOR
     '';
 
   
@@ -123,25 +126,17 @@ rec {
     if test -z "$mountDisk"; then
       mount -t tmpfs none /fs
     else
-      mount -t ext2 /dev/vda /fs
+      mount -t ext2 /dev/${hd} /fs
     fi
-    
+
     mkdir -p /fs/hostfs
     
     mkdir -p /fs/dev
     mount -o bind /dev /fs/dev
 
-    n=.
-    echo "mounting host filesystem..."
-    while true; do
-      if mount -t cifs //10.0.2.4/qemu /fs/hostfs -o guest,username=nobody; then
-        break
-      else
-        n=".$n"
-        test ''${#n} -le 10 || exit 1
-        sleep 1
-        echo "retrying..."
-      fi
+    for ((n = 0; n < 10; n++)); do
+      echo "mounting host filesystem, attempt $n..."
+      mount -t cifs //10.0.2.4/qemu /fs/hostfs -o guest,username=nobody && break
     done
 
     mkdir -p /fs/nix/store
@@ -215,10 +210,10 @@ rec {
 
 
   qemuCommandLinux = ''
-    qemu-system-x86_64 -no-kvm-irqchip \
+    qemu-system-x86_64 \
       -nographic -no-reboot \
-      -net nic,model=virtio -net user -smb / \
-      -drive file=$diskImage,if=virtio,boot=on \
+      -net nic,model=virtio -chardev socket,id=samba,path=$TMPDIR/samba -net user,guestfwd=tcp:10.0.2.4:139-chardev:samba \
+      -drive file=$diskImage,if=virtio,boot=on,cache=writeback,werror=report \
       -kernel ${kernel}/bzImage \
       -initrd ${initrd}/initrd \
       -append "console=ttyS0 panic=1 command=${stage2Init} tmpDir=$TMPDIR out=$out mountDisk=$mountDisk" \
@@ -229,12 +224,28 @@ rec {
   vmRunCommand = qemuCommand: writeText "vm-run" ''
     export > saved-env
 
-    PATH=${coreutils}/bin:${kvm}/bin:${samba}/sbin
+    PATH=${coreutils}/bin:${kvm}/bin
 
     diskImage=''${diskImage:-/dev/null}
 
     eval "$preVM"
 
+    cat > smb.conf <<EOF
+      [global]
+        private dir=$TMPDIR
+        smb ports=0
+        socket address=127.0.0.1
+        pid directory=$TMPDIR
+        lock directory=$TMPDIR
+        log file=$TMPDIR/log.smbd
+        smb passwd file=$TMPDIR/smbpasswd
+        security = share
+      [qemu]
+        path=/
+        read only=no
+        guest ok=yes
+    EOF
+
     # Write the command to start the VM to a file so that the user can
     # debug inside the VM if the build fails (when Nix is called with
     # the -K option to preserve the temporary build directory).
@@ -242,6 +253,8 @@ rec {
     #! ${bash}/bin/sh
     diskImage=$diskImage
     TMPDIR=$TMPDIR
+    ${socat}/bin/socat unix-listen:$TMPDIR/samba exec:'${samba}/sbin/smbd -s $TMPDIR/smb.conf' &
+    while [ ! -e $TMPDIR/samba ]; do sleep 0.1; done # ugly
     ${qemuCommand}
     EOF
 
@@ -271,8 +284,8 @@ rec {
 
   createRootFS = ''
     mkdir /mnt
-    ${e2fsprogs}/sbin/mke2fs -F /dev/vda
-    ${utillinux}/bin/mount -t ext2 /dev/vda /mnt
+    ${e2fsprogs}/sbin/mke2fs -F /dev/${hd}
+    ${utillinux}/bin/mount -t ext2 /dev/${hd} /mnt
 
     if test -e /mnt/.debug; then
       exec ${bash}/bin/sh
@@ -429,6 +442,7 @@ rec {
         # Make the Nix store available in /mnt, because that's where the RPMs live.
         mkdir -p /mnt/nix/store
         ${utillinux}/bin/mount -o bind /nix/store /mnt/nix/store
+        ${utillinux}/bin/mount -o bind /tmp /mnt/tmp
         
         echo "installing RPMs..."
         PATH=/usr/bin:/bin:/usr/sbin:/sbin $chroot /mnt \
@@ -440,6 +454,7 @@ rec {
         rm /mnt/.debug
         
         ${utillinux}/bin/umount /mnt/nix/store
+        ${utillinux}/bin/umount /mnt/tmp
         ${utillinux}/bin/umount /mnt
       '';