123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- __
- (___()'`; 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.
|