[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