QEMU is a popular open source machine emulator and virtualizer.
It is a decent alternative to VMware's products. It is also used as a component of hardware virtualization (HVM) in Xen.
It can emulate AMD64 (aka x86_64 or EM64T) without actually having that hardware. In general terms, it enables software development and packaging for other platforms.
To begin working with qemu, install the packages for your operating system (see Qemu on Ubuntu for example).
Everything that follows is based on running Qemu on a Linux/UNIX host.
Now create a ~/qemu working folder.
cd ~ mkdir qemu cd qemu/
Now create the virtual disk file with qemu-img.
qemu-img create -f qcow some-os.img 10G Formatting 'some-os.img', fmt=qcow, size=10485760 kB
So now you have a 10G virtual disk in a file called some-os.img. Although the virtual disk can expand to 10G, it will only use what is needed to hold the data inside, so it starts very small.
-rw-r--r-- 1 mdf mdf 41008 2007-11-04 07:16 some-os.img
Now assuming you have some O/S installation CD or .iso lying around you can install that O/S.
So if you have a CD installation disc in /dev/hdc, the command you would run is:
qemu -cdrom /dev/scd0 -boot d some-os.img
Else if you have an .iso file for installation, the same function would be:
qemu -cdrom installer.iso -boot d some-os.img
Installing Windows 98
I'm installing Windows 98SE which needs a minimum of about 2G for practical usage (this gives enough room to install the OS and a handful of applications). qemu-img create -f qcow win98se.img 2G
OK, fire up qemu with the Win98SE installation cd in the CDROM drive (/dev/scd0).
qemu -cdrom /dev/scd0 -boot d -m 128 win98se.img
Now shutdown and start with sound enabled and cdrom accessible
qemu -cdrom /dev/scd0 -m 128 -localtime -full-screen -enable-audio win98se.img
Newer versions of Qemu appear to have a number of different/new networking options via the -net flag. To emulate the old behavior I use these options:
sudo qemu -net nic -net tap ...rest of option...
This results in the host having a tap0 network interface created. tap0 Link encap:Ethernet HWaddr 00:FF:FF:2C:13:4B
inet addr:172.20.0.1 Bcast:172.20.255.255 Mask:255.255.0.0 inet6 addr: fe80::2ff:ffff:fe2c:134b/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:6 errors:0 dropped:0 overruns:0 frame:0 TX packets:33 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:500 RX bytes:2052 (2.0 KB) TX bytes:12236 (11.9 KB)
On the guest (FreeBSD) an ed0 device is detected, and it can (presumably) be assigned a static IP in the range of 172.20.0.2-255.
If no -net options are specified, then by default a DHCP server will be started (on the host). For example, my recently booted guest was assigned 10.0.2.15/24 as it's IP address, with a default gateway of 10.0.2.2. Also the name server 10.0.2.3 appears in /etc/resolv.conf. Both the gateway and the nameserver are provided by the Qemu host. However I could not ping past the host even after the following commands were run (on the host)...
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE echo "1" >/proc/sys/net/ipv4/ip_forward