[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 3/3] scripts: A script to create linux container
From: |
Alexander Graf |
Subject: |
Re: [Qemu-devel] [PATCH 3/3] scripts: A script to create linux container using qemu-linux-user. |
Date: |
Thu, 24 Jan 2013 19:05:56 +0100 |
On 20.01.2013, at 00:21, Laurent Vivier wrote:
> sudo qemu-create-lxc.sh <target>
>
> This script mixes linux container, binfmt and qemu to create hybrid linux
> container : <target> container on an host kernel.
>
> It will create "light" emulated virtual machine with several steps :
> - create a linux-user qemu-<target>
> - define it as the binfmt interpreter (using qemu-update-binfmt).
> - install a base debian system under /containers/<target> using debootstrap.
> and set a minimal configuration.
> - define a linux container
>
> Then you can start the container using : sudo lxc-start -n virt<target>
>
> TARGETS STATUS:
>
> alpha: cannot run debootstrap --second stage*, but chroot is usable
> m68k: need patches from qemu-m68k, after that, all is working fine.
> mips: container can be started, but console login hangs.
> ppc: works fine*
> sparc: cannot run debootstrap --second stage (cannot fork)
> raspberrypi: (=armhf+raspbian) works*
>
> * needs patches I sent to the mailing-list previously
>
> Signed-off-by: Laurent Vivier <address@hidden>
> ---
> scripts/qemu-create-lxc.sh | 280 ++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 280 insertions(+)
> create mode 100755 scripts/qemu-create-lxc.sh
>
> diff --git a/scripts/qemu-create-lxc.sh b/scripts/qemu-create-lxc.sh
> new file mode 100755
> index 0000000..4d51e61
> --- /dev/null
> +++ b/scripts/qemu-create-lxc.sh
> @@ -0,0 +1,280 @@
> +QEMU_PATH=$(dirname $(dirname $(readlink -f $0)))
> +
> +TARGET_LIST="i386 m68k alpha sparc mips ppc raspberrypi"
> +
> +set_i386() {
> + : nothing specific
> +}
> +
> +set_m68k() {
> + DEBIAN_REPO=http://archive.debian.org/debian
> + DEBIAN_DIST=etch-m68k
> + DEBIAN_SIGN=55BE302B
> +
> + CONFIGURE_PARAMS=--m68k-default-cpu=m68040
> +}
> +
> +set_alpha() {
> + DEBIAN_REPO=http://archive.debian.org/debian
> + DEBIAN_DIST=lenny
> +}
> +
> +set_sparc() {
> + QEMU_TARGET=sparc32plus
> +}
> +
> +set_mips() {
> + : nothing specific
> +}
> +
> +set_ppc() {
> + DEBIAN_TARGET=powerpc
> +}
> +
> +set_raspberrypi() {
> + DEBIAN_REPO=http://archive.raspbian.org/raspbian
> + DEBIAN_DIST=wheezy
> + DEBIAN_SIGN=""
> + DEBIAN_TARGET=armhf
> + QEMU_TARGET=arm
> +}
> +
> +check_target() {
> + found=0
> + for available in $TARGET_LIST
> + do
> + if [ "$available" = "$TARGET" ]
> + then
> + found=1
> + break;
> + fi
> + done
> + if [ $found -eq 0 ]
> + then
> + echo "ERROR: unknown target $TARGET" 1>&2
> + exit 1
> + fi
> +
> + # generic values
> +
> + CONTAINER_NAME=virt${TARGET}
> + CONTAINER_PATH=/containers/${TARGET}
> + LXC_CONF=$HOME/lxc-${TARGET}.conf
> +
> + DEBIAN_REPO=http://ftp.debian.org/debian
> + DEBIAN_DIST=stable
> + DEBIAN_SIGN=""
> + DEBIAN_TARGET=$TARGET
> +
> + QEMU_TARGET=$TARGET
> +
> + CHECK_BIN=check_default
> +
> + # target specific values
> +
> + set_$TARGET
> +
> +
> QEMU_BIN=${QEMU_PATH}/build-${QEMU_TARGET}/${QEMU_TARGET}-linux-user/qemu-${QEMU_TARGET}
> +}
> +
> +check_m68k() {
> + if ${QEMU_BIN} -cpu help | grep -q ">m68040"
> + then
> + echo "Found an existing qemu-m68k, use it !" 1>&2
> + return 0
> + fi
> + echo "Found an existing qemu-m68k, but with no m68040 emulation" 1>&2
> + echo "Please, remove it" 1>&2
> + echo "m68040 emulation is available from " 1>&2
> + echo "git clone git://gitorious.org/qemu-m68k/qemu-m68k.git"
> + exit 1
> +}
> +
> +check_default() {
> + test -e ${QEMU_BIN}
> +}
> +
> +installed_dpkg() {
> + dpkg --status "$1" > /dev/null 2>&1
> +}
> +
> +check_env() {
> + if [ ! -e /etc/debian_version ]
> + then
> + echo "ERROR: this script works only on Debian based distro" 1>&2
> + exit 1
> + fi
> + for pkg in zlib1g gcc make debootstrap lxc
> + do
> + if ! installed_dpkg $pkg
> + then
> + echo "ERROR: $pkg is needed" 1>&2
> + exit 1
> + fi
> + done
> +}
> +
> +create_qemu() {
> + if [ -e "${QEMU_BIN}" ]
> + then
> + if ${CHECK_BIN}
> + then
> + return 0
> + fi
> + fi
> + echo "cd ${QEMU_PATH} && \
> + mkdir build-${QEMU_TARGET} && \
> + cd build-${QEMU_TARGET} && \
> + ../configure --static ${CONFIGURE_PARAMS} \
> + --target-list=${QEMU_TARGET}-linux-user && \
> + make" | sudo -i -u ${SUDO_USER}
> + if ! ${CHECK_BIN}
> + then
> + echo "ERROR: generated qemu binary is invalid !" 1>&2
> + exit 1
> + fi
> +}
> +
> +create_root() {
> + # sanity check
> +
> + if [ $(readlink -f ${CONTAINER_PATH}/) = "/" ]
> + then
> + echo "ERROR: invalid path ${CONTAINER_PATH}" 1>&2
> + exit 1
> + fi
> +
> + # check directory
> +
> + if [ -e "${CONTAINER_PATH}" ]
> + then
> + echo "${CONTAINER_PATH} already exists" 1>&2
> + echo "Please, remove it" 1>&2
> + exit 1
> + fi
> +
> + # Debian bootstrap
> +
> + mkdir -p "${CONTAINER_PATH}"
> + debootstrap --foreign \
I don't think anything running debootstrap belongs in generically sounding QEMU
source code.
Alex