|
After waiting 6 hours for apt-get install ubuntu-desktop, this screen cap was taken. |
|
| UoG's FC5 Labs can run UML! |
The image was created using Ubuntu plus the following Makefile:
# Ubuntu Net Installer for UML
# Author: Brett Foster <fosterb@uoguelph.ca>
# Version: 1.0
#
# Major Dependencies:
# debootstrap
# ext2fs utils (mke2fs)
#
# Options:
# PREFIX=/usr/local/uml
# The path to create images, and scripts.
# VM_NAME=uml_default
# The name of the UML instance, also the name of the launch script.
# MEM=192M
# Amount of memory to provide the VM.
# SWAP=512
# Amount of disk space to allocate for swap. (Megabytes)
# ROOTSIZE=2048
# Amount of disk space to provide the root filesystem. (Megabytes)
# MIRROR=http://archive.ubuntu.com/ubuntu/
# For debootstrap -- the mirror.
# (See man debootstrap for further info.)
# DIST=edgy
# The distribution to install.
# (See man debootstrap for further info.)
# UML_KERNEL=...
# The kernel to use. If this is set, this is the path
# to the kernel's base directory.
# $(UML_KERNEL)/vmlinux -- The kernel
# $(UML_KERNEL)/lib -- Directory containing modules to be copied.
# ---> http://www.user-mode-linux.org/~blaisorblade/binaries/
# ALSO_SLIRP=y
# If defined: downloads, installs SLIRP 1.0.16 in to the PREFIX_ABS.
# ---> http://superb-west.dl.sourceforge.net/sourceforge/slirp/slirp-1.0.16.tar.gz
# SLIRP=path
# Uses the pre-installed SLIRP deamon. (Not needed if auto installing.)
# KERNEL_OPTIONS=
# Options to pass to the kernel. (Automatically appended if networking was enabled.)
# INSTALL_PACKAGES=...
# Packages to install separated by spaces.
# DISABLE_DEFAULT_PACKAGES=y
# If defined, the following packages won't be installed:
# (none)
# If networking is enabled:
# dhcp-client iproute ppp ifupdown telnet
# DISABLE_DEFAULT_CONSOLE_SETTINGS=y
# Stops xterm from being loaded. (good for CLI)
# HOSTNAME=uml
# If networking enabled, sets the hostname.
# Auto Initialize Defaults
ifndef VM_NAME
VM_NAME=uml_default
endif
ifndef UML_KERNEL
UML_KERNEL=um-linux-release-2.6.18-mod
UML_AUTO=http://www.user-mode-linux.org/~blaisorblade/binaries/2.6.18.1-bb2/uml-release-2.6.18.1-bb2.tar.bz2
endif
ifndef PREFIX
$(error Please define a PREFIX_ABS!)
endif
PREFIX_ABS=$(shell cd $(PREFIX) && pwd)/
ifndef MIRROR
MIRROR=http://archive.ubuntu.com/ubuntu/
endif
ifndef DIST
DIST=edgy
endif
ifndef MEM
MEM=192M
endif
ifndef SWAP
SWAP=512
endif
ifndef ROOTSIZE
ROOTSIZE=2048
endif
ifdef ALSO_SLIRP
SLIRP_VERSION=slirp-1.0.16
SLIRP_PATCH=fix17.patch
SLIRP_MIRROR_A=http://superb-west.dl.sourceforge.net/sourceforge/slirp/slirp-1.0.16.tar.gz
SLIRP_MIRROR_B=http://superb-west.dl.sourceforge.net/sourceforge/slirp/slirp_1_0_17_patch.tar.gz
SLIRP=$(PREFIX_ABS)/bin/slirp
ENABLE_NETWORKING=y
endif
ifdef SLIRP
ENABLE_NETWORKING=y
endif
ifdef ENABLE_NETWORKING
KERNEL_OPTIONS+=eth0=slirp,,"$(SLIRP)"
endif
ifndef DISABLE_DEFAULT_CONSOLE_SETTINGS
KERNEL_OPTIONS+=con=/dev/null con0=null,fd:2 con1=fd:0,fd:1 #con0=fd:2, con1=fd:0,fd:1
#xterm
endif
ifndef DISABLE_DEFAULT_PACKAGES
# INSTALL_PACKAGES += ubuntu-desktop
ifdef ENABLE_NETWORKING
INSTALL_PACKAGES += iproute ifupdown telnet
endif
endif
ifndef HOSTNAME
HOSTNAME=uml
endif
# Compute Sizes (in K)
RROOTSIZE:=$(shell expr 1024 "*" $(ROOTSIZE))
RSWAP :=$(shell expr 1024 "*" $(SWAP))
$(warning **** UML Installer)
$(warning Kernel: $(UML_KERNEL))
$(warning Mirror: $(MIRROR))
$(warning Dist: $(DIST))
$(warning Prefix: $(PREFIX_ABS))
$(warning Memory: $(MEM))
$(warning Swap: $(SWAP)M)
$(warning Root: $(ROOTSIZE)M)
$(warning Install: $(INSTALL_PACKAGES))
ifdef ENABLE_NETWORKING
ifdef SLIRP
$(warning Net: $(SLIRP))
$(warning Hostname: $(HOSTNAME))
ifdef ALSO_SLIRP
$(warning Making: (SLIRP only))
endif
else
$(warning Net: (unsupported))
endif
else
endif
ifneq ($(shell whoami),root)
$(error You must be root to make this work.)
endif
.PHONY: all rootfs scripts test clean networking kernel
all: "$(PREFIX_ABS)" networking kernel rootfs test scripts
@echo "*********************************************"
@echo "*********************************************"
@echo "* UML Installed: $(PREFIX_ABS)"
@echo "* Loading script: $(PREFIX_ABS)/bin/$(VM_NAME)"
@echo "*********************************************"
@echo "*********************************************"
rootfs: "$(PREFIX_ABS)/images/rootfs" "$(PREFIX_ABS)/images/swap"
@echo "**** Installing ROOTFS:"
mkdir -p "$(PREFIX_ABS)/local"
# unmount if already mounted! (Silently discard if not!)
$(shell umount "$(PREFIX_ABS)/local")
mount -o loop "$(PREFIX_ABS)/images/rootfs" "$(PREFIX_ABS)/local"
debootstrap $(DIST) "$(PREFIX_ABS)/local" $(MIRROR)
cp -r "$(PREFIX_ABS)/$(UML_KERNEL)/lib/modules/" "$(PREFIX_ABS)/local/lib/"
chmod -R 0755 "$(PREFIX_ABS)/local/lib/modules/"
chown -R root:root "$(PREFIX_ABS)/local/lib/modules/"
#Create a new FSTAB
echo -n > "$(PREFIX_ABS)/local/etc/fstab"
echo "# /etc/fstab: static file system information." >> "$(PREFIX_ABS)/local/etc/fstab"
echo "#" >> "$(PREFIX_ABS)/local/etc/fstab"
echo "# <file system> <mount point> <type> <options> <dump> <pass>" >> "$(PREFIX_ABS)/local/etc/fstab"
echo "proc /proc proc defaults 0 0" >> "$(PREFIX_ABS)/local/etc/fstab"
echo "/dev/ubda / ext3 defaults,errors=remount-ro 0 1" >> "$(PREFIX_ABS)/local/etc/fstab"
echo "/dev/ubdb none swap sw 0 0" >> "$(PREFIX_ABS)/local/etc/fstab"
echo "none /media/host hostfs defaults 0 0" >> "$(PREFIX_ABS)/local/etc/fstab"
mkdir -p "$(PREFIX_ABS)/local/media/host"
chroot "$(PREFIX_ABS)/local" \
/usr/bin/env -i \
HOME=/root \
TERM=$TERM \
PS1='\u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin \
/bin/bash -c "apt-get update"
chroot "$(PREFIX_ABS)/local" \
/usr/bin/env -i \
HOME=/root \
TERM=$TERM \
PS1='\u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin \
/bin/bash -c "apt-get dist-upgrade"
chroot "$(PREFIX_ABS)/local" \
/usr/bin/env -i \
HOME=/root \
TERM=$TERM \
PS1='\u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin \
/bin/bash -c "apt-get install $(INSTALL_PACKAGES)"
#Create networking Config
ifdef ENABLE_NETWORKING
mkdir -p "$(PREFIX_ABS)/local/etc/network/"
echo -n > "$(PREFIX_ABS)/local/etc/network/interfaces"
echo "auto lo" >> "$(PREFIX_ABS)/local/etc/network/interfaces"
echo "iface lo inet loopback" >> "$(PREFIX_ABS)/local/etc/network/interfaces"
echo "" >> "$(PREFIX_ABS)/local/etc/network/interfaces"
echo "auto eth0" >> "$(PREFIX_ABS)/local/etc/network/interfaces"
echo "iface eth0 inet static" >> "$(PREFIX_ABS)/local/etc/network/interfaces"
echo " address 10.0.2.15" >> "$(PREFIX_ABS)/local/etc/network/interfaces"
echo " netmask 255.0.0.0" >> "$(PREFIX_ABS)/local/etc/network/interfaces"
echo " gateway 10.0.2.15" >> "$(PREFIX_ABS)/local/etc/network/interfaces"
echo -n > "$(PREFIX_ABS)/local/etc/resolv.conf"
echo "domain localhost" >> "$(PREFIX_ABS)/local/etc/resolv.conf"
echo "nameserver 10.0.2.3" >> "$(PREFIX_ABS)/local/etc/resolv.conf"
echo -n > "$(PREFIX_ABS)/local/etc/hosts"
echo "127.0.0.1 localhost" >> "$(PREFIX_ABS)/local/etc/hosts"
echo "127.0.1.1 $(HOSTNAME)" >> "$(PREFIX_ABS)/local/etc/hosts"
echo -n > "$(PREFIX_ABS)/local/etc/hostname"
echo "$(HOSTNAME)" >> "$(PREFIX_ABS)/local/etc/hostname"
endif
umount "$(PREFIX_ABS)/local"
sync
sleep 1
rm -rf "$(PREFIX_ABS)/local"
scripts:
echo -n > "$(PREFIX_ABS)/bin/$(VM_NAME)"
echo "#!/bin/sh" >> "$(PREFIX_ABS)/bin/$(VM_NAME)"
echo "# Startup Script for $(VM_NAME) " >> "$(PREFIX_ABS)/bin/$(VM_NAME)"
echo "\"$(PREFIX_ABS)/$(UML_KERNEL)/vmlinux\"\\" >> "$(PREFIX_ABS)/bin/$(VM_NAME)"
echo " root=/dev/ubda \\" >> "$(PREFIX_ABS)/bin/$(VM_NAME)"
echo " ubda=\"$(PREFIX_ABS)/images/rootfs\" \\" >> "$(PREFIX_ABS)/bin/$(VM_NAME)"
echo " ubdb=\"$(PREFIX_ABS)/images/swap\" \\" >> "$(PREFIX_ABS)/bin/$(VM_NAME)"
echo " mem=$(MEM) $(KERNEL_OPTIONS) \\" >> "$(PREFIX_ABS)/bin/$(VM_NAME)"
echo " umid=\"$(VM_NAME)\"" >> "$(PREFIX_ABS)/bin/$(VM_NAME)"
chmod +x "$(PREFIX_ABS)/bin/$(VM_NAME)"
test:
cd $(PREFIX_ABS) && \
"$(PREFIX_ABS)/$(UML_KERNEL)/vmlinux" root=/dev/ubda \
ubda="$(PREFIX_ABS)/images/rootfs" \
ubdb="$(PREFIX_ABS)/images/swap" \
mem=$(MEM) $(KERNEL_OPTIONS)
clean:
rm -rf "$(PREFIX_ABS)/images/swap" "$(PREFIX_ABS)/images/rootfs" "$(PREFIX_ABS)/images/" "$(PREFIX_ABS)/local/" "$(PREFIX_ABS)/$(UML_KERNEL)"
ifdef ALSO_SLIRP
networking: "$(PREFIX_ABS)/bin/slirp"
"$(PREFIX_ABS)/bin/slirp": "$(PREFIX_ABS)/$(SLIRP_VERSION)" "$(PREFIX_ABS)/$(SLIRP_VERSION)/src/$(SLIRP_PATCH)"
# Fix bugs!
cd "$(PREFIX_ABS)/$(SLIRP_VERSION)/src/" && patch -p1 < "$(PREFIX_ABS)/$(SLIRP_VERSION)/src/$(SLIRP_PATCH)"
# Configure SLiRP
cd "$(PREFIX_ABS)/$(SLIRP_VERSION)/src/" && ./configure --prefix="$(PREFIX_ABS)/"
echo "#define FULL_BOLT" >> "$(PREFIX_ABS)/$(SLIRP_VERSION)/src/config.h"
# Make SLiRP
cd "$(PREFIX_ABS)/$(SLIRP_VERSION)/src/" && make
# hack -- doesn't install right, unless I do this first!
mkdir -p "$(PREFIX_ABS)/man/man1/slirp.1"
mkdir -p "$(PREFIX_ABS)/bin"
# Install it
cd "$(PREFIX_ABS)/$(SLIRP_VERSION)/src/" && make install
"$(PREFIX_ABS)/$(SLIRP_VERSION)": "$(PREFIX_ABS)/slirp.tgz"
tar -C "$(PREFIX_ABS)" -zxvf "$(PREFIX_ABS)/slirp.tgz"
"$(PREFIX_ABS)/$(SLIRP_VERSION)/src/$(SLIRP_PATCH)": "$(PREFIX_ABS)/slirp_patch.tgz"
tar -C "$(PREFIX_ABS)/$(SLIRP_VERSION)/src" -zxvf "$(PREFIX_ABS)/slirp_patch.tgz"
"$(PREFIX_ABS)/slirp.tgz":
wget -O "$(PREFIX_ABS)/slirp.tgz" "$(SLIRP_MIRROR_A)"
"$(PREFIX_ABS)/slirp_patch.tgz":
wget -O "$(PREFIX_ABS)/slirp_patch.tgz" "$(SLIRP_MIRROR_B)"
else
networking:
@echo Nothing to do for networking.
endif
"$(PREFIX_ABS)":
mkdir -p "$(PREFIX_ABS)"
"$(PREFIX_ABS)/images":
mkdir -p "$(PREFIX_ABS)/images"
"$(PREFIX_ABS)/images/rootfs": "$(PREFIX_ABS)/images"
@echo "**** Creating ROOTFS:"
dd if=/dev/zero of="$(PREFIX_ABS)/images/rootfs" count=1 bs=1K seek=$(RROOTSIZE)
mkfs.ext3 -F "$(PREFIX_ABS)/images/rootfs"
"$(PREFIX_ABS)/images/swap": "$(PREFIX_ABS)/images"
@echo "**** Creating SWAP:"
dd if=/dev/zero of="$(PREFIX_ABS)/images/swap" count=1 bs=1K seek=$(RSWAP)
mkswap "$(PREFIX_ABS)/images/swap"
kernel: "$(PREFIX_ABS)/$(UML_KERNEL)"
ifdef UML_AUTO
"$(PREFIX_ABS)/$(UML_KERNEL)": "$(PREFIX_ABS)/$(UML_KERNEL).tar"
tar -C "$(PREFIX_ABS)" -xvf "$(PREFIX_ABS)/$(UML_KERNEL).tar"
"$(PREFIX_ABS)/$(UML_KERNEL).tar": "$(PREFIX_ABS)/$(UML_KERNEL).tar.bz2"
bzip2 -f -d "$(PREFIX_ABS)/$(UML_KERNEL).tar.bz2"
"$(PREFIX_ABS)/$(UML_KERNEL).tar.bz2":
wget -O "$(PREFIX_ABS)/$(UML_KERNEL).tar.bz2" "$(UML_AUTO)"
else
# Copy the kernel from the local directory to the PREFIX_ABS.
"$(PREFIX_ABS)/$(UML_KERNEL)": "$(UML_KERNEL)"
cp -r "$(UML_KERNEL)" "$(PREFIX_ABS)/"
"$(UML_KERNEL)":
$(error Please install the custom kernel in the current directory.)
endif