[lxc-devel] [PATCH] lxc-oracle: allow installing from arbitrary yum repo

Michael H. Warfield mhw at WittsEnd.com
Wed Apr 9 19:20:28 UTC 2014


On Wed, 2014-04-09 at 10:17 -0500, Serge Hallyn wrote:
> Quoting Dwight Engen (dwight.engen at oracle.com):
> > With this change, you can install a container from a mounted .iso, or any
> > yum repo with the necessary packages. Unlike the --url option, the repo
> > does not need to be a mirror of public-yum, but the arch and release must
> > be specified. For example to install OL6.5 from an .iso image:
> > 
> > mount -o loop OracleLinux-R6-U5-Server-x86_64-dvd.iso /mnt
> > lxc-create -n OL6.5 -t oracle -- --baseurl=file:///mnt -a x86_64 -R 6.5
> > 
> > The template will create two yum .repo files within the container such that
> > additional packages can be installed from local media, or the container can
> > be updated from public-yum, whichever is available. Local media must be bind
> > mounted from the host onto the containers' /mnt for the former .repo to work:
> > 
> > mount --bind /mnt $LXCPATH/OL6.5/rootfs/mnt
> > 
> > Signed-off-by: Dwight Engen <dwight.engen at oracle.com>

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

> Curious though, why require -a with --baseurl, as opposed to using uname
> -m as you otherwise do if -a is not specified?

This seems very reasonable to me and I'll probably be plagerizing (err
copying) it for the Fedora and CentOS templates.  Nice job.

That can also work especially well if you have pkg-cacher running on a
local server (for either pkg or rpm / apt-get or yum) and can really
massively improve performance if you're instantiating multiple
containers.  In many ways, that can work better than the local LXC
cache, since that can span multiple arch's and hosts.

> > ---
> >  templates/lxc-oracle.in | 149 ++++++++++++++++++++++++++++++++----------------
> >  1 file changed, 101 insertions(+), 48 deletions(-)
> > 
> > diff --git a/templates/lxc-oracle.in b/templates/lxc-oracle.in
> > index 92361f8..70d90e5 100644
> > --- a/templates/lxc-oracle.in
> > +++ b/templates/lxc-oracle.in
> > @@ -492,6 +492,23 @@ container_rootfs_clone()
> >      fi
> >  }
> >  
> > +container_rootfs_repo_create()
> > +{
> > +    echo "# LXC generated .repo file" >$1
> > +    echo "[$2]" >>$1
> > +    echo "name=Oracle Linux $container_release_major.$container_release_minor ($basearch)" >>$1
> > +    echo "baseurl=$3/" >>$1
> > +    echo "enabled=1" >>$1
> > +    echo "skip_if_unavailable=1" >>$1
> > +
> > +    if [ "$4" != "" ]; then
> > +        echo "gpgkey=$yum_url/RPM-GPG-KEY-oracle-ol$container_release_major" >>$1
> > +        echo "gpgcheck=1" >>$1
> > +    else
> > +        echo "gpgcheck=0" >>$1
> > +    fi
> > +}
> > +
> >  container_rootfs_create()
> >  {
> >      cmds="rpm wget yum"
> > @@ -522,66 +539,81 @@ container_rootfs_create()
> >              die "The template is busy."
> >          fi
> >  
> > -        echo "Downloading release $container_release_major.$container_release_minor for $basearch"
> > +        echo "Yum installing release $container_release_major.$container_release_minor for $basearch"
> >  
> > -        # get yum repo file
> >          if [ -n "$repourl" ]; then
> >              yum_url=$repourl
> >          else
> >              yum_url=http://public-yum.oracle.com
> >          fi
> > -        if   [ $container_release_major = "4" ]; then
> > -            repofile=public-yum-el4.repo
> > -        elif [ $container_release_major = "5" ]; then
> > -            repofile=public-yum-el5.repo
> > -        elif [ $container_release_major = "6" ]; then
> > -            repofile=public-yum-ol6.repo
> > +        if [ $container_release_major = "4" -o $container_release_major = "5" ]; then
> > +            latest_L="el"
> > +            latest_U="EL"
> >          else
> > -            die "Unsupported release $container_release_major"
> > -        fi
> > -        mkdir -p $container_rootfs/etc/yum.repos.d
> > -        wget -q $yum_url/$repofile -O $container_rootfs/etc/yum.repos.d/$repofile
> > -        if [ $? -ne 0 ]; then
> > -            die "Failed to download repo file $yum_url/$repofile"
> > +            latest_L="ol"
> > +            latest_U="OL"
> >          fi
> >  
> > -        # yum will take $basearch from host, so force the arch we want
> > -        sed -i "s|\$basearch|$basearch|" $container_rootfs/etc/yum.repos.d/$repofile
> > -
> > -        # replace url if they specified one
> > -        if [ -n "$repourl" ]; then
> > -            sed -i "s|baseurl=http://public-yum.oracle.com/repo|baseurl=$repourl/repo|" $container_rootfs/etc/yum.repos.d/$repofile
> > -            sed -i "s|gpgkey=http://public-yum.oracle.com|gpgkey=$repourl|" $container_rootfs/etc/yum.repos.d/$repofile
> > -        fi
> > -
> > -        # disable all repos, then enable the repo for the version we are installing.
> > -        if [ $container_release_minor = "latest" ]; then
> > -            if [ $container_release_major = "4" -o $container_release_major = "5" ]; then
> > -                repo="el"$container_release_major"_"$container_release_minor
> > +        if [ -n "$baseurl" ]; then
> > +            # create .repo pointing at baseurl
> > +            repo="lxc-install"
> > +            mkdir -p $container_rootfs/etc/yum.repos.d
> > +            container_rootfs_repo_create \
> > +                $container_rootfs/etc/yum.repos.d/lxc-install.repo $repo $baseurl
> > +        else
> > +            # get public-yum repo file
> > +            if   [ $container_release_major = "4" ]; then
> > +                repofile=public-yum-el4.repo
> > +            elif [ $container_release_major = "5" ]; then
> > +                repofile=public-yum-el5.repo
> > +            elif [ $container_release_major = "6" ]; then
> > +                repofile=public-yum-ol6.repo
> > +            elif [ $container_release_major = "7" ]; then
> > +                repofile=public-yum-ol7.repo
> >              else
> > -                repo="ol"$container_release_major"_"$container_release_minor
> > +                die "Unsupported release $container_release_major"
> >              fi
> > -        elif [ $container_release_major = "6" ]; then
> > -            if   [ $container_release_minor = "0" ]; then
> > -                repo="ol"$container_release_major"_ga_base"
> > -            else
> > -                repo="ol"$container_release_major"_u"$container_release_minor"_base"
> > +
> > +            mkdir -p $container_rootfs/etc/yum.repos.d
> > +            wget -q $yum_url/$repofile -O $container_rootfs/etc/yum.repos.d/$repofile
> > +            if [ $? -ne 0 ]; then
> > +                die "Failed to download repo file $yum_url/$repofile"
> > +            fi
> > +
> > +            # yum will take $basearch from host, so force the arch we want
> > +            sed -i "s|\$basearch|$basearch|" $container_rootfs/etc/yum.repos.d/$repofile
> > +
> > +            # replace url if they specified one
> > +            if [ -n "$repourl" ]; then
> > +                sed -i "s|baseurl=http://public-yum.oracle.com/repo|baseurl=$repourl/repo|" $container_rootfs/etc/yum.repos.d/$repofile
> > +                sed -i "s|gpgkey=http://public-yum.oracle.com|gpgkey=$repourl|" $container_rootfs/etc/yum.repos.d/$repofile
> >              fi
> > -        elif [ $container_release_major = "5" ]; then
> > -            if   [ $container_release_minor = "0" ]; then
> > -                repo="el"$container_release_major"_ga_base"
> > -            elif [ $container_release_minor -lt "6" ]; then
> > +
> > +            # disable all repos, then enable the repo for the version we are installing.
> > +            if [ $container_release_minor = "latest" ]; then
> > +                repo=$latest_L""$container_release_major"_"$container_release_minor
> > +            elif [ $container_release_major = "6" -o  $container_release_major = "7" ]; then
> > +                if   [ $container_release_minor = "0" ]; then
> > +                    repo="ol"$container_release_major"_ga_base"
> > +                else
> > +                    repo="ol"$container_release_major"_u"$container_release_minor"_base"
> > +                fi
> > +            elif [ $container_release_major = "5" ]; then
> > +                if   [ $container_release_minor = "0" ]; then
> > +                    repo="el"$container_release_major"_ga_base"
> > +                elif [ $container_release_minor -lt "6" ]; then
> > +                    repo="el"$container_release_major"_u"$container_release_minor"_base"
> > +                else
> > +                    repo="ol"$container_release_major"_u"$container_release_minor"_base"
> > +                fi
> > +            elif [ $container_release_major = "4" -a $container_release_minor -gt "5" ]; then
> >                  repo="el"$container_release_major"_u"$container_release_minor"_base"
> >              else
> > -                repo="ol"$container_release_major"_u"$container_release_minor"_base"
> > +                die "Unsupported release $container_release_major.$container_release_minor"
> >              fi
> > -        elif [ $container_release_major = "4" -a $container_release_minor -gt "5" ]; then
> > -            repo="el"$container_release_major"_u"$container_release_minor"_base"
> > -        else
> > -            die "Unsupported release $container_release_major.$container_release_minor"
> > +            sed -i "s|enabled=1|enabled=0|" $container_rootfs/etc/yum.repos.d/$repofile
> > +            sed -i "/\[$repo\]/,/\[/ s/enabled=0/enabled=1/" $container_rootfs/etc/yum.repos.d/$repofile
> >          fi
> > -        sed -i "s|enabled=1|enabled=0|" $container_rootfs/etc/yum.repos.d/$repofile
> > -        sed -i "/\[$repo\]/,/\[/ s/enabled=0/enabled=1/" $container_rootfs/etc/yum.repos.d/$repofile
> >  
> >          # create rpm db, download and yum install minimal packages
> >          mkdir -p $container_rootfs/var/lib/rpm
> > @@ -620,12 +652,19 @@ container_rootfs_create()
> >          fi
> >          if [ x"$redo_pkgs" != x ]; then
> >              rpm --root $container_rootfs --nodeps -e $redo_pkgs
> > -            yum $yum_args install $redo_pkgs
> > +            lxc-unshare -s MOUNT yum -- $yum_args install $redo_pkgs
> >              if [ $? -ne 0 ]; then
> >                  die "Unable to reinstall packages"
> >              fi
> >          fi
> >  
> > +        # if installing from a baseurl, create a .repo that the container
> > +        # can use to update to _latest from http://public-yum.oracle.com
> > +        container_rootfs_repo_create \
> > +            "$container_rootfs/etc/yum.repos.d/public-yum-"$latestL""$container_release_major".repo" \
> > +            $latest_L""$container_release_major"_latest" \
> > +            $yum_url"/repo/OracleLinux/"$latest_U""$container_release_major"/latest/$basearch" gpg
> > +
> >          # these distributions put the rpm database in a place the guest is
> >          # not expecting it, so move it
> >          if [ $host_distribution = "Ubuntu" -o $host_distribution = "Debian" ]; then
> > @@ -681,7 +720,9 @@ usage()
> >    -R|--release=<release>  release to download for the new container
> >    --rootfs=<path>         rootfs path
> >    -r|--rpms=<rpm name>    additional rpms to install into container
> > -  -u|--url=<url>          replace yum repo url (ie. local yum mirror)
> > +  -u|--url=<url>          replace yum repo url (ie. Oracle public-yum mirror)
> > +     --baseurl=<url>      use package repository (ie. file:///mnt)
> > +                          arch and release must also be specified
> >    -t|--templatefs=<path>  copy/clone rootfs at path instead of downloading
> >    -P|--patch=<path>       only patch the rootfs at path for use as a container
> >    -h|--help
> > @@ -691,13 +732,12 @@ EOF
> >      return 0
> >  }
> >  
> > -options=$(getopt -o hp:n:a:R:r:u:t: -l help,rootfs:,path:,name:,arch:,release:,rpms:,url:,templatefs:,patch: -- "$@")
> > +options=$(getopt -o hp:n:a:R:r:u:t: -l help,rootfs:,path:,name:,arch:,release:,rpms:,url:,templatefs:,patch:,baseurl: -- "$@")
> >  if [ $? -ne 0 ]; then
> >      usage $(basename $0)
> >      exit 1
> >  fi
> >  
> > -arch=$(uname -m)
> >  eval set -- "$options"
> >  while true
> >  do
> > @@ -712,6 +752,7 @@ do
> >          -u|--url)		repourl=$2; shift 2;;
> >          -t|--templatefs)	template_rootfs=$2; shift 2;;
> >          --patch)		patch_rootfs=$2; shift 2;;
> > +        --baseurl)		baseurl=$2; shift 2;;
> >          --)             	shift 1; break ;;
> >          *)              	break ;;
> >      esac
> > @@ -723,6 +764,18 @@ if [ "$(id -u)" != "0" ]; then
> >      exit 1
> >  fi
> >  
> > +if [ -n "$baseurl" ]; then
> > +    if [ "$arch" = "" -o "$container_release_version" = "" ]; then
> > +        echo "The --arch and --release must be specified when using --baseurl"
> > +        usage
> > +        exit 1
> > +    fi
> > +fi
> > +
> > +if [ "$arch" = "" ]; then
> > +    arch=$(uname -m)
> > +fi
> > +
> >  if [ -n "$patch_rootfs" ]; then
> >      container_rootfs="$patch_rootfs"
> >      container_release_get $container_rootfs
> > -- 
> > 1.8.5.3
> > 
> > _______________________________________________
> > lxc-devel mailing list
> > lxc-devel at lists.linuxcontainers.org
> > http://lists.linuxcontainers.org/listinfo/lxc-devel
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel
> 

-- 
Michael H. Warfield (AI4NB) | (770) 978-7061 |  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!

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 482 bytes
Desc: This is a digitally signed message part
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20140409/baeff6c6/attachment.sig>


More information about the lxc-devel mailing list