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

Serge Hallyn serge.hallyn at ubuntu.com
Wed Apr 9 15:17:40 UTC 2014


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?

> ---
>  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


More information about the lxc-devel mailing list