[lxc-devel] [PATCH 1/1] templates/lxc-fedora Rework for distro independence.

Serge Hallyn serge.hallyn at ubuntu.com
Fri Oct 4 01:58:47 UTC 2013


Quoting Michael H. Warfield (mhw at WittsEnd.com):
> This patch reworks the Fedora template to operate in the most "distro
> agnostic" manner possible.  It should even run on distros where rpm and
> yum are not present and not available or may be incompatible.  It
> depends on the most basic set of system facilities like rsync but does
> require squashfs support also be available to mount a LiveOS runtime.
> 
> Based on comments at Linux Plumbers, what I had been referring to as a
> "run time environment" or RTE has been renamed in the code to refer to
> it as a "bootstrap".  It has been tested on Fedora (of course),
> OpenSuse, Ubuntu, and Oracle (latest host versions of each) building
> Fedora containers of F19 back through F9.  Varying levels of database
> problems were encountered from F11 and back and are "will not fix" due
> to versions being long EOL.  F15 and F16 build but do not run "out of
> the box" due to systemd version issues and those are also "will not fix"
> for the same reasons.
> 
> Signed-off-by: Michael H. Warfield <mhw at WittsEnd.com>

Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>

Thanks.  With this patch, I can create and start fedora containers.
Without it, I can't.  So I'm pushing it :)

> 
> -- 
> diff --git a/templates/lxc-fedora.in b/templates/lxc-fedora.in
> index 1386f23..d406012 100644
> --- a/templates/lxc-fedora.in
> +++ b/templates/lxc-fedora.in
> @@ -10,6 +10,7 @@
>  # Authors:
>  # Daniel Lezcano <daniel.lezcano at free.fr>
>  # Ramez Hanna <rhanna at informatiq.org>
> +# Michael H. Warfield <mhw at WittsEnd.com>
>  
>  # This library is free software; you can redistribute it and/or
>  # modify it under the terms of the GNU Lesser General Public
> @@ -29,6 +30,7 @@
>  arch=$(uname -m)
>  cache_base=@LOCALSTATEDIR@/cache/lxc/fedora/$arch
>  default_path=@LXCPATH@
> +# We really need something better here!
>  root_password=root
>  
>  # is this fedora?
> @@ -148,8 +150,19 @@ EOF
>      echo "root:$root_password" | chroot $rootfs_path chpasswd
>  
>      # specifying this in the initial packages doesn't always work.
> +    # Even though it should have...
>      echo "installing fedora-release package"
> -    chroot ${rootfs_path} yum --releasever=${release} -y install fedora-release
> +    mount -o bind /dev ${rootfs_path}/dev
> +    mount -t proc proc ${rootfs_path}/proc
> +    # Always make sure /etc/resolv.conf is up to date in the target!
> +    cp /etc/resolv.conf ${rootfs_path}/etc/
> +    # Rebuild the rpm database based on the target rpm version...
> +    rm -f ${rootfs_path}/var/lib/rpm/__db*
> +    chroot ${rootfs_path} rpm --rebuilddb
> +    chroot ${rootfs_path} yum -y install fedora-release
> +    # This just makes sure the rpm db is synced to that version...
> +    umount ${rootfs_path}/proc
> +    umount ${rootfs_path}/dev
>  
>      # silence some needless startup errors
>      touch ${rootfs_path}/etc/fstab
> @@ -198,6 +211,396 @@ configure_fedora_systemd()
>          for i in 1 2 3 4 ; do ln -sf ../getty\@.service getty at tty${i}.service; done )
>  }
>  
> +### BEGIN Bootstrap Environment Code...  Michael H. Warfield /\/\|=mhw=|\/\/
> +
> +# Ok...  Heads up.  If you're reading these comments, you're either a
> +# template owner or someone wondering how the hell I did this (or, worse,
> +# someone in the future trying to maintain it).  This code is slightly
> +# "evil coding bastard" code with one significant hack / dirty trick
> +# that you would probably miss just reading the code below.  I'll mark
> +# it out with comments.
> +# 
> +# Because of what this code does, it deserves a lot of comments so people
> +# can understand WHY I did it this way...
> +#
> +# Ultimate Objective - Build a Fedora container on a host system which does
> +# not have a (complete compatible) version of rpm and/or yum.  That basically
> +# means damn near any distro other than Fedora and Ubuntu (which has rpm and
> +# yum available).  Only requirements for this function are rsync and
> +# squashfs available to the kernel.  If you don't have those, why are you
> +# even attempting to build containers?
> +#
> +# Challenge for this function - Bootstrap a Fedora install bootstrap
> +# run time environment which has all the pieces to run rpm and yum and
> +# from which we can build targets containers even where the host system
> +# has no support for rpm, yum, or fedora.
> +#
> +# Steps:
> +#       Stage 0 - Download a Fedora LiveOS squashfs core (netinst core).
> +#       Stage 1 - Extract filesystem from Stage 0 and update to full rpm & yum
> +#       Stage 2 - Use Stage 1 to build a rootfs with python, rpm, and yum.
> +#
> +#       Stage 2 becomes our bootstrap file system which can be cached
> +#       and then used to build other arbitrary vesions of Fedora of a
> +#       given architecture.  Not that this only has to run once for
> +#       Fedora on a given architecture since rpm and yum can build other
> +#       versions.  We'll arbitrarily pick Fedora 19 to build this.  This
> +#       will need to change as time goes on.
> +
> +# Programmers Note...  A future fall back may be to download the netinst
> +#       iso image instead of the LiveOS squasfs image and work from that.
> +#       That may be more general but will introduce another substep
> +#       (mounting the iso) to the stage0 setup.
> +
> +# This system is designed to be as autonomous as possible so all whitelists
> +# and controlls are self-contained.
> +
> +# Initial testing - Whitelist nobody.  Build for everybody...
> +# Initial deployment - Whitelist Fedora.
> +# Long term - Whitelist Fedora, Debian, Ubuntu, CentOs, Scientific, and NST.
> +
> +# List of distros which do not (should not) need a bootstrap (but we will test
> +# for rpm and yum none the less...  OS SHOULD be taken from CPE values but
> +# Debian / Ubuntu doesn't support CPE yet.
> +
> +# BOOTSTRAP_WHITE_LIST=""
> +BOOTSTRAP_WHITE_LIST="fedora"
> +# BOOTSTRAP_WHITE_LIST="fedora debian ubuntu centos scientific sl nst"
> +
> +BOOTSTRAP=0
> +BOOTSTRAP_DIR=
> +BOOTSTRAP_CHROOT=
> +
> +fedora_get_bootstrap()
> +{
> +    echo "Bootstrap Environment testing..."
> +
> +    WHITE_LISTED=1
> +
> +    # We need rpm.  No rpm - not possible to white list...
> +    if ! which rpm > /dev/null 2>&1
> +    then
> +        WHITE_LISTED=0
> +    fi
> +
> +    # We need yum  No yum - not possible to white list...
> +    if ! which yum > /dev/null 2>&1
> +    then
> +        WHITE_LISTED=0
> +    fi
> +
> +    if [[ ${WHITE_LISTED} != 0 ]]
> +    then
> +        for OS in ${BOOTSTRAP_WHITE_LIST}
> +        do
> +            if [[ ${ID} = ${OS} ]]
> +            then
> +                echo "
> +OS ${ID} is whitelisted.  Installation Bootstrap Environment not required.
> +"
> +                return 0;
> +            fi
> +        done
> +    fi
> +
> +    echo "
> +Fedora Installation Bootstrap Build..."
> +
> +    if ! which rsync > /dev/null 2>&1
> +    then
> +        echo "
> +Unable to locate rsync.  Cravely bailing out before even attempting to build
> +an Installation Bootstrap  Please install rsync and then rerun this process.
> +"
> +
> +        return 255
> +    fi
> +
> +    [[ -d ${cache_base} ]] || mkdir -p ${cache_base}
> +
> +    cd ${cache_base}
> +
> +    # We know we don't have a cache directory of this version or we
> +    # would have never reached this code to begin with.  But we may
> +    # have another Fedora cache directory from which we could run...
> +    # We'll give a preference for close matches prefering higher over
> +    # lower - which makes for really ugly code...
> +
> +    # Is this a "bashism" that will need cleaning up????
> +    BOOTSTRAP_LIST="$(( $release + 1 ))/rootfs $(( $release - 1 ))/rootfs \
> +$(( $release + 2 ))/rootfs $(( $release - 2 ))/rootfs \
> +$(( $release + 3 ))/rootfs $(( $release - 3 ))/rootfs \
> +bootstrap"
> +
> +    for bootstrap in ${BOOTSTRAP_LIST}
> +    do
> +        if [[ -d ${bootstrap} ]]
> +        then
> +            echo "
> +Existing Bootstrap found.  Testing..."
> +
> +            mount -o bind /dev ${bootstrap}/dev
> +            mount -t proc proc ${bootstrap}/proc
> +            # Always make sure /etc/resolv.conf is up to date in the target!
> +            cp /etc/resolv.conf ${bootstrap}/etc/
> +            rm -f ${bootstrap}/var/lib/rpm/__db*
> +            chroot ${bootstrap} rpm --rebuilddb
> +            chroot ${bootstrap} yum -y update
> +            RC=$?
> +            umount ${bootstrap}/proc
> +            umount ${bootstrap}/dev
> +
> +            if [[ 0 == ${RC} ]]
> +            then
> +                BOOTSTRAP=1
> +                BOOTSTRAP_DIR="${cache_base}/${bootstrap}"
> +                BOOTSTRAP_CHROOT="chroot ${BOOTSTRAP_DIR} "
> +                BOOTSTRAP_INSTALL_ROOT=/run/install
> +
> +            echo "
> +Functional Installation Bootstrap exists and appears to be completed.
> +Will use existing Bootstrap:  ${BOOTSTRAP_DIR}
> +"
> +            return 0
> +        fi
> +        echo "
> +Installation Bootstrap in ${BOOTSTRAP_DIR} exists
> +but appears to be non-functional.  Skipping...  It should be removed.
> +"
> +    fi
> +    done
> +
> +    TMP_BOOTSTRAP_DIR=$( mktemp -d --tmpdir=${cache_base} bootstrap_XXXXXX )
> +
> +    cd ${TMP_BOOTSTRAP_DIR}
> +
> +    mkdir squashfs stage0 stage1 bootstrap
> +
> +### Stage 0 setup.
> +#       Download the LiveOS squashfs image
> +#       mount image to "squashfs"
> +#       mount contained LiveOS to stage0
> +
> +# We're going to use the kernel.org mirror for the initial stages...
> +#       1 - It's generally up to date and comnplete
> +#       2 - It's has high bandwidth access
> +#       3 - It supports rsync and wildcarding (and we need both)
> +#       4 - Not all the mirrors carry the LiveOS images
> +
> +    if [[ ! -f ../LiveOS/squashfs.img ]]
> +    then
> +        echo "
> +Downloading stage 0 LiveOS squashfs file system from mirrors.kernel.org...
> +Have a beer or a cup of coffee.  This will take a bit (~300MB).
> +"
> +        sleep 3 # let him read it...
> +
> +        # Right now, we are using Fedora 19 for the inial bootstrap.
> +        # We could make this the "current" Fedora rev (F > 15).
> +
> +        rsync -av mirrors.kernel.org::fedora/releases/19/Fedora/x86_64/os/LiveOS .
> +
> +        if [[ 0 == $? ]]
> +        then
> +            echo "Download of squashfs image complete."
> +            mv LiveOS ..
> +        else
> +            echo "
> +Download of squashfs image failed.
> +"
> +            return 255
> +        fi
> +    else
> +        echo "Using cached stage 0 LiveOS squashfs file system."
> +    fi
> +
> +    mount -o loop ../LiveOS/squashfs.img squashfs
> +
> +    if [[ $? != 0 ]]
> +    then
> +        echo "
> +Mount of LiveOS squashfs image failed!  You mush have squashfs support
> +available to mount image.  Unable to continue.  Correct and retry
> +process later!  LiveOS image not removed.  Process may be rerun
> +without penalty of downloading LiveOS again.  If LiveOS is corrupt,
> +remove ${cache_base}/LiveOS before rerunning to redownload.
> +"
> +        return 255
> +    fi
> +
> +    mount -o loop squashfs/LiveOS/rootfs.img stage0
> +
> +    if [[ $? != 0 ]]
> +    then
> +        echo "
> +Mount of LiveOS stage0 rootfs image failed!  LiveOS download may be corrupt.
> +Remove ${cache_base}/LiveOS to force a new download or
> +troubleshoot cached image and then rerun process.
> +"
> +        return 255
> +    fi
> +
> +
> +### Stage 1 setup.
> +#       Copy stage0 (which is ro) to stage1 area (rw) for modification.
> +#       Unmount stage0 mounts - we're done with stage 0 at this point.
> +#       Download our rpm and yum rpm packages.
> +#       Force install of rpm and yum into stage1 image (dirty hack!)
> +
> +    echo "Stage 0 complete, building Stage 1 image...
> +This will take a couple of minutes.  Patience..."
> +
> +    echo "Creating Stage 1 r/w copy of r/o Stage 0 squashfs image from LiveOS."
> +
> +    rsync -aAHS stage0/. stage1/
> +
> +    umount stage0
> +    umount squashfs
> +
> +    cd stage1
> +
> +    # Setup stage1 image with pieces to run installs...
> +
> +
> +    mount -o bind /dev dev
> +    mount -t proc proc proc
> +    # Always make sure /etc/resolv.conf is up to date in the target!
> +    cp /etc/resolv.conf etc/
> +
> +    mkdir run/install
> +
> +    echo "Updating Stage 1 image with full rpm and yum packages"
> +
> +    # Retrieve our 2 rpm packages we need to force down the throat
> +    # of this LiveOS image we're camped out on.  This is the beginning
> +    # of the butt ugly hack.  Look close or you may missing it...
> +
> +    rsync -av mirrors.kernel.org::fedora/releases/19/Fedora/x86_64/os/Packages/r/rpm-[0-9]* \
> +        mirrors.kernel.org::fedora/releases/19/Fedora/x86_64/os/Packages/y/yum-[0-9]* .
> +
> +    # And here it is...
> +    # The --nodeps is STUPID but F15 had a bogus dependency on RawHide?!?!
> +    chroot . rpm -ivh --nodeps rpm-* yum-*
> +    # Did you catch it?
> +
> +    # The LiveOS image contains rpm (but not rpmdb) and yum (but not
> +    # yummain.py - What the hell good does yum do with no
> +    # yummain.py?!?! - Sigh...).  It contains all the supporting
> +    # pieces but the rpm database has not be initialized and it
> +    # doesn't know all the dependences (seem to) have been met.
> +    # So we do a "--nodeps" rpm install in the chrooted environment
> +    # to force the installation of the full rpm and yum packages.
> +    #
> +    # For the purists - Yes, I know the rpm database is wildly out
> +    # of whack now.  That's why this is a butt ugly hack / dirty trick.
> +    # But, this is just the stage1 image that we are going to discard as
> +    # soon as the stage2 image is built, so we don't care.  All we care
> +    # is that the stage2 image ends up with all the pieces it need to
> +    # run yum and rpm and that the stage2 rpm database is coherent.
> +    #
> +    # NOW we can really go to work!
> +
> +### Stage 2 setup.
> +#       Download our Fedora Release rpm packages.
> +#       Install fedora-release into bootstrap to initialize fs and databases.
> +#       Install rpm, and yum into bootstrap image using yum
> +
> +    echo "Stage 1 creation complete.  Building stage 2 Installation Bootstrap"
> +
> +    mount -o bind ../bootstrap run/install
> +    rsync -av mirrors.kernel.org::fedora/releases/19/Fedora/x86_64/os/Packages/f/fedora-release-19* .
> +
> +    # The --nodeps is STUPID but F15 had a bogus dependency on RawHide?!?!
> +    chroot . rpm --root /run/install --nodeps -ivh fedora-release-*
> +    chroot . yum -y --nogpgcheck --installroot /run/install install python rpm yum
> +
> +    umount run/install
> +    umount proc
> +    umount dev
> +
> +#       That's it!  We should now have a viable installation BOOTSTRAP in
> +#       bootstrap  We'll do a yum update in that to verify and then
> +#       move it to the cache location before cleaning up.
> +
> +    cd ../bootstrap
> +    mount -o bind /dev dev
> +    mount -t proc proc proc
> +    # Always make sure /etc/resolv.conf is up to date in the target!
> +    cp /etc/resolv.conf etc/
> +
> +    chroot . yum -y update
> +
> +    RC=$?
> +
> +    umount proc
> +    umount dev
> +
> +    cd ..
> +
> +    if [[ ${RC} != 0 ]]
> +    then
> +        echo "
> +Build of Installation Bootstrap failed.  Temp directory
> +not removed so it can be investigated.
> +"
> +        return 255
> +    fi
> +
> +    # We know have a working run time environment in rootfs...
> +    mv bootstrap ..
> +    cd ..
> +    rm -rf ${TMP_BOOTSTRAP_DIR}
> +
> +    echo "
> +Build of Installation Bootstrap complete!  We now return you to your
> +normally scheduled template creation.
> +"
> +
> +    BOOTSTRAP=1
> +    BOOTSTRAP_DIR="${cache_base}/bootstrap"
> +    BOOTSTRAP_CHROOT="chroot ${BOOTSTRAP_DIR} "
> +    BOOTSTRAP_INSTALL_ROOT=/run/install
> +
> +    return 0
> +}
> +
> +
> +fedora_bootstrap_mounts()
> +{
> +    if [[ ${BOOTSTRAP} -ne 1 ]]
> +    then
> +        return 0
> +    fi
> +
> +    BOOTSTRAP_CHROOT="chroot ${BOOTSTRAP_DIR} "
> +
> +    echo "Mounting Bootstrap mount points"
> +
> +    [[ -d ${BOOTSTRAP_DIR}/run/install ]] || mkdir -p ${BOOTSTRAP_DIR}/run/install
> +
> +    mount -o bind ${INSTALL_ROOT} ${BOOTSTRAP_DIR}/run/install
> +    mount -o bind /dev ${BOOTSTRAP_DIR}/dev
> +    mount -t proc proc ${BOOTSTRAP_DIR}/proc
> +    # Always make sure /etc/resolv.conf is up to date in the target!
> +    cp /etc/resolv.conf ${BOOTSTRAP_DIR}/etc/
> +}
> +
> +fedora_bootstrap_umounts()
> +{
> +    if [[ ${BOOTSTRAP} -ne 1 ]]
> +    then
> +        return 0
> +    fi
> +
> +    umount ${BOOTSTRAP_DIR}/proc
> +    umount ${BOOTSTRAP_DIR}/dev
> +    umount ${BOOTSTRAP_DIR}/run/install
> +}
> +
> +
> +# This is the code to create the initial roofs for Fedora.  It may
> +# require a run time environment by calling the routines above...
> +
>  download_fedora()
>  {
>  
> @@ -211,10 +614,24 @@ download_fedora()
>  
>      # download a mini fedora into a cache
>      echo "Downloading fedora minimal ..."
> -    YUM="yum --installroot $INSTALL_ROOT -y --nogpgcheck"
> +
> +    # These will get changed if it's decided that we need a 
> +    # boostrap environment (can not build natively)
> +
> +    BOOTSTRAP_INSTALL_ROOT=${INSTALL_ROOT}
> +    BOOTSTRAP_CHROOT=
> +
>      PKG_LIST="yum initscripts passwd rsyslog vim-minimal dhclient chkconfig rootfiles policycoreutils fedora-release"
>      MIRRORLIST_URL="http://mirrors.fedoraproject.org/mirrorlist?repo=fedora-$release&arch=$arch"
>  
> +    if [[ ${release} -lt 17 ]]
> +    then
> +        # The reflects the move of db_dump and db_load from db4_utils to
> +        # libdb_utils in Fedora 17 and above and it's inclusion as a dep...
> +        # Prior to Fedora 11, we need to explicitly include it!
> +        PKG_LIST="${PKG_LIST} db4-utils"
> +    fi
> +
>      DOWNLOAD_OK=no
>  
>      # We're splitting the old loop into two loops plus a directory retrival.
> @@ -237,9 +654,7 @@ download_fedora()
>       # This will fall through if we didn't get any URLS above
>       for MIRROR_URL in ${MIRROR_URLS}
>       do
> -        if [ "$release" -eq "19" ]; then
> -            RELEASE_URL="$MIRROR_URL/Packages/f/fedora-release-$release-2.noarch.rpm"
> -        elif [ "$release" -gt "16" ]; then
> +        if [ "$release" -gt "16" ]; then
>              RELEASE_URL="$MIRROR_URL/Packages/f"
>          else
>              RELEASE_URL="$MIRROR_URL/Packages/"
> @@ -270,12 +685,82 @@ download_fedora()
>          return 1
>      fi
>  
> -    mkdir -p $INSTALL_ROOT/var/lib/rpm
> -    rpm --root $INSTALL_ROOT  --initdb
> -    rpm --root $INSTALL_ROOT -ivh ${INSTALL_ROOT}/${RELEASE_RPM}
> -    $YUM install $PKG_LIST
> +    mkdir -p ${INSTALL_ROOT}/var/lib/rpm
>  
> -    if [ $? -ne 0 ]; then
> +    if ! fedora_get_bootstrap
> +    then
> +        echo "Fedora Bootstrap setup failed"
> +        return 1
> +    fi
> +
> +    fedora_bootstrap_mounts
> +
> +    ${BOOTSTRAP_CHROOT}rpm --root ${BOOTSTRAP_INSTALL_ROOT} --initdb
> +    # The --nodeps is STUPID but F15 had a bogus dependency on RawHide?!?!
> +    ${BOOTSTRAP_CHROOT}rpm --root ${BOOTSTRAP_INSTALL_ROOT} --nodeps -ivh ${BOOTSTRAP_INSTALL_ROOT}/${RELEASE_RPM}
> +    ${BOOTSTRAP_CHROOT}yum --installroot ${BOOTSTRAP_INSTALL_ROOT} -y --nogpgcheck install ${PKG_LIST}
> +
> +    RC=$?
> +
> +    if [[ ${BOOTSTRAP} -eq 1 ]]
> +    then
> +    # Here we have a bit of a sticky problem.  We MIGHT have just installed
> +    # this template cache using versions of yum and rpm in the bootstrap
> +    # chroot that use a different database version than the target version.
> +    # That can be a very big problem.  Solution is to rebuild the rpmdatabase
> +    # with the target database now that we are done building the cache.  In the
> +    # vast majority of cases, this is a do-not-care with no harm done if we
> +    # didn't do it.  But it catches several corner cases with older unsupported
> +    # releases and it really doesn't cost us a lot of time for a one shot
> +    # install that will never be done again for this rev.
> +    #
> +    # Thanks and appreciation to Dwight Engen and the Oracle template for the
> +    # database rewrite hint!
> +
> +        echo "Fixing up rpm databases"
> +
> +        # Change to our target install directory (if we're not already
> +        # there) just to simplify some of the logic to follow...
> +        cd ${INSTALL_ROOT}
> +
> +        rm -f var/lib/rpm/__db*
> +        # Programmers Note (warning):
> +        #
> +        # Pay careful attention to the following commands!  It
> +        # crosses TWO chroot boundaries linked by a bind mount!
> +        # In the bootstrap case, that's the bind mount of ${INSTALL_ROOT}
> +        # to the ${BOOTSTRAP_CHROOT}/run/install directory!  This is
> +        # a deliberate hack across that bind mount to do a database
> +        # translation between two environments, neither of which may
> +        # be the host environment!  It's ugly and hard to follow but,
> +        # if you don't understand it, don't mess with it!  The pipe
> +        # is in host space between the two chrooted environments!
> +        # This is also why we cd'ed into the INSTALL_ROOT directory
> +        # in advance of this loop, so everything is relative to the
> +        # current working directory and congruent with the same working
> +        # space in both chrooted environments.  The output into the new
> +        # db is also done in INSTALL_ROOT space but works in either host
> +        # space or INSTALL_ROOT space for the mv, so we don't care.  It's
> +        # just not obvious what's happening in the db_dump and db_load
> +        # commands...
> +        #
> +        for db in var/lib/rpm/* ; do
> +            ${BOOTSTRAP_CHROOT} db_dump ${BOOTSTRAP_INSTALL_ROOT}/$db | chroot . db_load $db.new
> +            mv $db.new $db
> +        done
> +        # finish up by rebuilding the database...
> +        # This should be redundant but we do it for completeness and
> +        # any corner cases I may have missed...
> +        mount -t proc proc proc
> +        mount -o bind /dev dev
> +        chroot . rpm --rebuilddb
> +        umount dev
> +        umount proc
> +    fi
> +
> +    fedora_bootstrap_umounts
> +
> +    if [ ${RC} -ne 0 ]; then
>          echo "Failed to download the rootfs, aborting."
>          return 1
>      fi
> @@ -300,8 +785,13 @@ copy_fedora()
>  
>  update_fedora()
>  {
> -    YUM="yum --installroot $cache/rootfs -y --nogpgcheck"
> -    $YUM update
> +    mount -o bind /dev ${cache}/rootfs/dev
> +    mount -t proc proc ${cache}/rootfs/proc
> +    # Always make sure /etc/resolv.conf is up to date in the target!
> +    cp /etc/resolv.conf ${cache}/rootfs/etc/
> +    chroot ${cache}/rootfs yum -y update
> +    umount ${cache}/rootfs/proc
> +    umount  ${cache}/rootfs/dev
>  }
>  
>  install_fedora()
> @@ -456,11 +946,6 @@ do
>      esac
>  done
>  
> -if [ -z "$name" ]; then
> -    usage $(basename $0)
> -    exit 1
> -fi
> -
>  if [ ! -z "$clean" -a -z "$path" ]; then
>      clean || exit 1
>      exit 0
> @@ -490,10 +975,6 @@ if [ $(expr "$utsname" : '.*\..*\.') = 0 ]; then
>  fi
>  
>  needed_pkgs=""
> -type yum >/dev/null 2>&1
> -if [ $? -ne 0 ]; then
> -    needed_pkgs="yum $needed_pkgs"
> -fi
>  
>  type curl >/dev/null 2>&1
>  if [ $? -ne 0 ]; then
> @@ -593,3 +1074,21 @@ if [ ! -z $clean ]; then
>      exit 0
>  fi
>  echo "container rootfs and config created"
> +
> +if [[ -d ${cache_base}/bootstrap ]]
> +then
> +    echo "
> +You have successfully built a Fedora container and cache.  This cache may
> +be used to create future containers of various revisions.  The directory
> +${cache_base}/bootstrap contains a bootstrap
> +which may no longer needed and can be removed.
> +"
> +fi
> +
> +if [[ -e ${cache_base}/LiveOS ]]
> +then
> +    echo "A LiveOS directory exists at ${cache_base}/LiveOS.
> +This is only used in the creation of the bootstrap run-time-environment
> +and may be removed.
> +"
> +fi
> -- 
> 
> -- 
> Michael H. Warfield (AI4NB) | (770) 985-6132 |  mhw at WittsEnd.com
>    /\/\|=mhw=|\/\/          | (678) 463-0932 |  http://www.wittsend.com/mhw/
>    NIC whois: MHW9          | An optimist believes we live in the best of all
>  PGP Key: 0x674627FF        | possible worlds.  A pessimist is sure of it!



> ------------------------------------------------------------------------------
> October Webinars: Code for Performance
> Free Intel webinars can help you accelerate application performance.
> Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most from 
> the latest Intel processors and coprocessors. See abstracts and register >
> http://pubads.g.doubleclick.net/gampad/clk?id=60134791&iu=/4140/ostg.clktrk

> _______________________________________________
> Lxc-devel mailing list
> Lxc-devel at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/lxc-devel





More information about the lxc-devel mailing list