| __ |
| (___()'`; Rusty's Remarkably Unreliable Guide to Lguest |
| /, /` - or, A Young Coder's Illustrated Hypervisor |
| \\"--\\ http://lguest.ozlabs.org |
| |
| Lguest is designed to be a minimal 32-bit x86 hypervisor for the Linux kernel, |
| for Linux developers and users to experiment with virtualization with the |
| minimum of complexity. Nonetheless, it should have sufficient features to |
| make it useful for specific tasks, and, of course, you are encouraged to fork |
| and enhance it (see drivers/lguest/README). |
| |
| Features: |
| |
| - Kernel module which runs in a normal kernel. |
| - Simple I/O model for communication. |
| - Simple program to create new guests. |
| - Logo contains cute puppies: http://lguest.ozlabs.org |
| |
| Developer features: |
| |
| - Fun to hack on. |
| - No ABI: being tied to a specific kernel anyway, you can change anything. |
| - Many opportunities for improvement or feature implementation. |
| |
| Running Lguest: |
| |
| - The easiest way to run lguest is to use same kernel as guest and host. |
| You can configure them differently, but usually it's easiest not to. |
| |
| You will need to configure your kernel with the following options: |
| |
| "General setup": |
| "Prompt for development and/or incomplete code/drivers" = Y |
| (CONFIG_EXPERIMENTAL=y) |
| |
| "Processor type and features": |
| "Paravirtualized guest support" = Y |
| "Lguest guest support" = Y |
| "High Memory Support" = off/4GB |
| "Alignment value to which kernel should be aligned" = 0x100000 |
| (CONFIG_PARAVIRT=y, CONFIG_LGUEST_GUEST=y, CONFIG_HIGHMEM64G=n and |
| CONFIG_PHYSICAL_ALIGN=0x100000) |
| |
| "Device Drivers": |
| "Block devices" |
| "Virtio block driver (EXPERIMENTAL)" = M/Y |
| "Network device support" |
| "Universal TUN/TAP device driver support" = M/Y |
| "Virtio network driver (EXPERIMENTAL)" = M/Y |
| (CONFIG_VIRTIO_BLK=m, CONFIG_VIRTIO_NET=m and CONFIG_TUN=m) |
| |
| "Virtualization" |
| "Linux hypervisor example code" = M/Y |
| (CONFIG_LGUEST=m) |
| |
| - A tool called "lguest" is available in this directory: type "make" |
| to build it. If you didn't build your kernel in-tree, use "make |
| O=<builddir>". |
| |
| - Create or find a root disk image. There are several useful ones |
| around, such as the xm-test tiny root image at |
| http://xm-test.xensource.com/ramdisks/initrd-1.1-i386.img |
| |
| For more serious work, I usually use a distribution ISO image and |
| install it under qemu, then make multiple copies: |
| |
| dd if=/dev/zero of=rootfile bs=1M count=2048 |
| qemu -cdrom image.iso -hda rootfile -net user -net nic -boot d |
| |
| Make sure that you install a getty on /dev/hvc0 if you want to log in on the |
| console! |
| |
| - "modprobe lg" if you built it as a module. |
| |
| - Run an lguest as root: |
| |
| Documentation/virtual/lguest/lguest 64 vmlinux --tunnet=192.168.19.1 \ |
| --block=rootfile root=/dev/vda |
| |
| Explanation: |
| 64: the amount of memory to use, in MB. |
| |
| vmlinux: the kernel image found in the top of your build directory. You |
| can also use a standard bzImage. |
| |
| --tunnet=192.168.19.1: configures a "tap" device for networking with this |
| IP address. |
| |
| --block=rootfile: a file or block device which becomes /dev/vda |
| inside the guest. |
| |
| root=/dev/vda: this (and anything else on the command line) are |
| kernel boot parameters. |
| |
| - Configuring networking. I usually have the host masquerade, using |
| "iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE" and "echo 1 > |
| /proc/sys/net/ipv4/ip_forward". In this example, I would configure |
| eth0 inside the guest at 192.168.19.2. |
| |
| Another method is to bridge the tap device to an external interface |
| using --tunnet=bridge:<bridgename>, and perhaps run dhcp on the guest |
| to obtain an IP address. The bridge needs to be configured first: |
| this option simply adds the tap interface to it. |
| |
| A simple example on my system: |
| |
| ifconfig eth0 0.0.0.0 |
| brctl addbr lg0 |
| ifconfig lg0 up |
| brctl addif lg0 eth0 |
| dhclient lg0 |
| |
| Then use --tunnet=bridge:lg0 when launching the guest. |
| |
| See: |
| |
| http://www.linuxfoundation.org/collaborate/workgroups/networking/bridge |
| |
| for general information on how to get bridging to work. |
| |
| - Random number generation. Using the --rng option will provide a |
| /dev/hwrng in the guest that will read from the host's /dev/random. |
| Use this option in conjunction with rng-tools (see ../hw_random.txt) |
| to provide entropy to the guest kernel's /dev/random. |
| |
| There is a helpful mailing list at http://ozlabs.org/mailman/listinfo/lguest |
| |
| Good luck! |
| Rusty Russell rusty@rustcorp.com.au. |