mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-08-16 20:25:34 +00:00
remove old lxc-create script.
Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
This commit is contained in:
parent
dc23c1c817
commit
6a2e602b1b
@ -1,415 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
#
|
|
||||||
# lxc: linux Container library
|
|
||||||
|
|
||||||
# Authors:
|
|
||||||
# Daniel Lezcano <daniel.lezcano@free.fr>
|
|
||||||
|
|
||||||
# This library is free software; you can redistribute it and/or
|
|
||||||
# modify it under the terms of the GNU Lesser General Public
|
|
||||||
# License as published by the Free Software Foundation; either
|
|
||||||
# version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
# This library is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
# Lesser General Public License for more details.
|
|
||||||
|
|
||||||
# You should have received a copy of the GNU Lesser General Public
|
|
||||||
# License along with this library; if not, write to the Free Software
|
|
||||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
. @DATADIR@/lxc/lxc.functions
|
|
||||||
|
|
||||||
verify_btrfs() {
|
|
||||||
if which btrfs >/dev/null 2>&1 && \
|
|
||||||
btrfs filesystem df "$lxc_path/" >/dev/null 2>&1; then
|
|
||||||
echo "btrfs"
|
|
||||||
else
|
|
||||||
echo "no"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
verify_zfs() {
|
|
||||||
if which zfs >/dev/null 2>&1 && zfs get all "$zfsroot" >/dev/null 2>&1; then
|
|
||||||
echo zfs
|
|
||||||
else
|
|
||||||
echo no
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
verify_lvm() {
|
|
||||||
which vgscan > /dev/null 2>&1
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo "vgscan not found (is lvm2 installed?)" >&2
|
|
||||||
echo no
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
grep -q "\<$fstype\>" /proc/filesystems
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo "$fstype is not listed in /proc/filesystems" >&2
|
|
||||||
echo no
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
vgscan | grep -q "Found volume group \"$vgname\""
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo "could not find volume group \"$vgname\"" >&2
|
|
||||||
echo no
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo lvm
|
|
||||||
}
|
|
||||||
|
|
||||||
# if no backingstore is specified, auto-detect if $lxc_path is btrfs or zfs
|
|
||||||
detect_backingstore() {
|
|
||||||
if [ `verify_btrfs` = "btrfs" ]; then
|
|
||||||
echo btrfs
|
|
||||||
elif [ `verify_zfs` = "zfs" ]; then
|
|
||||||
echo zfs
|
|
||||||
else
|
|
||||||
echo none
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
usage() {
|
|
||||||
echo "usage: $(basename $0) -n NAME [-f CONFIG_FILE] [-t TEMPLATE] [FS_OPTIONS] --" >&2
|
|
||||||
echo " [-P lxcpath] [TEMPLATE_OPTIONS]" >&2
|
|
||||||
echo >&2
|
|
||||||
echo "where FS_OPTIONS is one of:" >&2
|
|
||||||
echo " -B none" >&2
|
|
||||||
echo " -B dir [--dir rootfs_dir]" >&2
|
|
||||||
echo " -B lvm [--lvname LV_NAME] [--vgname VG_NAME] [--fstype FS_TYPE]" >&2
|
|
||||||
echo " [--fssize FS_SIZE]" >&2
|
|
||||||
echo " -B btrfs" >&2
|
|
||||||
echo " -B zfs [--zfsroot PATH]" >&2
|
|
||||||
}
|
|
||||||
|
|
||||||
help() {
|
|
||||||
usage
|
|
||||||
echo >&2
|
|
||||||
echo "Create a new container on the system." >&2
|
|
||||||
echo >&2
|
|
||||||
echo "Options:" >&2
|
|
||||||
echo " -n NAME specify the name of the container" >&2
|
|
||||||
echo " -f CONFIG_FILE use an existing configuration file" >&2
|
|
||||||
echo " -t TEMPLATE use an accessible template script" >&2
|
|
||||||
echo " -B BACKING_STORE alter the container backing store (default: none)" >&2
|
|
||||||
echo " --lxcpath path specify an alternate container patch (default: $lxc_path)" >&2
|
|
||||||
echo " --lvname LV_NAME specify the LVM logical volume name" >&2
|
|
||||||
echo " (default: container name)" >&2
|
|
||||||
echo " --dir ROOTFS_DIR specify path for custom rootfs directory location" >&2
|
|
||||||
echo " --vgname VG_NAME specify the LVM volume group name (default: lxc)" >&2
|
|
||||||
echo " --fstype FS_TYPE specify the filesystem type (default: ext4)" >&2
|
|
||||||
echo " --fssize FS_SIZE specify the filesystem size (default: 500M)" >&2
|
|
||||||
echo " --zfsroot PATH specify the zfs path for lxcpath (default: tank/lxc)" >&2
|
|
||||||
echo >&2
|
|
||||||
if [ -z "$lxc_template" ]; then
|
|
||||||
echo "To see template-specific options, specify a template. For example:" >&2
|
|
||||||
echo " $(basename $0) -t ubuntu -h" >&2
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
if [ -x ${templatedir}/lxc-$lxc_template ]; then
|
|
||||||
echo >&2
|
|
||||||
echo "Template-specific options (TEMPLATE_OPTIONS):" >&2
|
|
||||||
${templatedir}/lxc-$lxc_template -h
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
usage_err() {
|
|
||||||
[ -n "$1" ] && echo "$1" >&2
|
|
||||||
usage
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
optarg_check() {
|
|
||||||
if [ -z "$2" ]; then
|
|
||||||
usage_err "option '$1' requires an argument"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
backingstore=_unset
|
|
||||||
fstype=ext4
|
|
||||||
fssize=500M
|
|
||||||
vgname=$lxc_vg
|
|
||||||
zfsroot=$lxc_zfsroot
|
|
||||||
custom_rootfs=""
|
|
||||||
|
|
||||||
while [ $# -gt 0 ]; do
|
|
||||||
opt="$1"
|
|
||||||
shift
|
|
||||||
case "$opt" in
|
|
||||||
-h|--help)
|
|
||||||
help
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
-n|--name)
|
|
||||||
optarg_check $opt "$1"
|
|
||||||
lxc_name=$1
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-f|--config)
|
|
||||||
optarg_check $opt "$1"
|
|
||||||
lxc_config=$1
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-P|--lxcpath)
|
|
||||||
optarg_check $opt "$1"
|
|
||||||
lxc_path=$1
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-t|--template)
|
|
||||||
optarg_check $opt "$1"
|
|
||||||
lxc_template=$1
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-B|--backingstore)
|
|
||||||
optarg_check $opt "$1"
|
|
||||||
backingstore=$1
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
--dir)
|
|
||||||
optarg_check $opt "$1"
|
|
||||||
custom_rootfs=$1
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
--lvname)
|
|
||||||
optarg_check $opt "$1"
|
|
||||||
lvname=$1
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
--vgname)
|
|
||||||
optarg_check $opt "$1"
|
|
||||||
vgname=$1
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
--fstype)
|
|
||||||
optarg_check $opt "$1"
|
|
||||||
fstype=$1
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
--fssize)
|
|
||||||
optarg_check $opt "$1"
|
|
||||||
fssize=$1
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
--zfsroot)
|
|
||||||
optarg_check $opt "$1"
|
|
||||||
zfsroot=$1
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
--)
|
|
||||||
break;;
|
|
||||||
-?)
|
|
||||||
usage_err "unknown option '$opt'"
|
|
||||||
;;
|
|
||||||
-*)
|
|
||||||
# split opts -abc into -a -b -c
|
|
||||||
set -- $(echo "${opt#-}" | sed 's/\(.\)/ -\1/g') "$@"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
usage
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
# If -h or --help was passed into the container, we'll want to cleanup
|
|
||||||
# afterward
|
|
||||||
wantedhelp=0
|
|
||||||
for var in "$@"; do
|
|
||||||
if [ "$var" = "-h" ] || [ "$var" = "--help" ]; then
|
|
||||||
help
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
|
|
||||||
if [ -z "$lxc_path" ]; then
|
|
||||||
echo "$(basename $0): no configuration path defined" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -r $lxc_path ]; then
|
|
||||||
echo "$(basename $0): configuration path '$lxc_path' not found" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$lxc_name" ]; then
|
|
||||||
echo "$(basename $0): no container name specified" >&2
|
|
||||||
usage
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$lvname" ]; then
|
|
||||||
lvname="$lxc_name"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$zfsroot" ]; then
|
|
||||||
zfsroot="tank/lxc"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$(id -u)" != "0" ]; then
|
|
||||||
echo "$(basename $0): must be run as root" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$custom_rootfs" ] && [ "$backingstore" != "dir" ]; then
|
|
||||||
echo "--dir is only valid with -B dir"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# detect / verify backing store
|
|
||||||
case "$backingstore" in
|
|
||||||
btrfs)
|
|
||||||
if [ `verify_btrfs` != 'btrfs' ]; then
|
|
||||||
echo "missing 'btrfs' command or $lxc_path is not btrfs" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
zfs)
|
|
||||||
if [ `verify_zfs` != 'zfs' ]; then
|
|
||||||
echo "missing 'zfs' command or $zfsroot is not zfs" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
lvm)
|
|
||||||
if [ `verify_lvm` != 'lvm' ]; then
|
|
||||||
echo "system is missing 'lvm' support, or VG does not exist." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
rootdev=/dev/$vgname/$lvname
|
|
||||||
lvdisplay $rootdev > /dev/null 2>&1
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
echo "LV $rootdev already exists" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
_unset)
|
|
||||||
backingstore=`detect_backingstore`
|
|
||||||
;;
|
|
||||||
dir|lvm|none)
|
|
||||||
:;;
|
|
||||||
*)
|
|
||||||
echo "$(basename $0): '$backingstore' is not known (try 'none', 'dir', 'lvm', 'btrfs', 'zfs')" >&2
|
|
||||||
usage
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if [ -d "$lxc_path/$lxc_name" ]; then
|
|
||||||
echo "$(basename $0): '$lxc_name' already exists" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
rootfs="$lxc_path/$lxc_name/rootfs"
|
|
||||||
|
|
||||||
cleanup() {
|
|
||||||
if [ "$backingstore" = "lvm" ]; then
|
|
||||||
umount -l $rootfs || true
|
|
||||||
lvremove -f $rootdev || true
|
|
||||||
elif [ "$backingstore" = "btrfs" ]; then
|
|
||||||
btrfs subvolume delete "$rootfs" || true
|
|
||||||
elif [ "$backingstore" = "zfs" ]; then
|
|
||||||
zfs destroy "$zfsroot/$lxc_name" || true
|
|
||||||
fi
|
|
||||||
|
|
||||||
${bindir}/lxc-destroy -n $lxc_name -P "$lxc_path"
|
|
||||||
echo "$(basename $0): aborted" >&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
trap cleanup HUP INT TERM
|
|
||||||
|
|
||||||
# set up container dir per backing store
|
|
||||||
if [ "$backingstore" = "zfs" ]; then
|
|
||||||
zfs create -omountpoint=$lxc_path/$lxc_name/rootfs "$zfsroot/$lxc_name"
|
|
||||||
elif [ "$backingstore" = "btrfs" ]; then
|
|
||||||
mkdir "$lxc_path/$lxc_name"
|
|
||||||
if ! out=$(btrfs subvolume create "$rootfs" 2>&1); then
|
|
||||||
echo "$(basename $0): failed to create subvolume in $rootfs: $out" >&2
|
|
||||||
exit 1;
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
mkdir -p $lxc_path/$lxc_name
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$lxc_config" ]; then
|
|
||||||
lxc_config="@SYSCONFDIR@/lxc/default.conf"
|
|
||||||
echo
|
|
||||||
echo "$(basename $0): No config file specified, using the default config $lxc_config"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -r "$lxc_config" ]; then
|
|
||||||
echo "$(basename $0): '$lxc_config' configuration file not found" >&2
|
|
||||||
cleanup
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -z "$lxc_template" ]; then
|
|
||||||
# Allow for a path to be provided as the template name
|
|
||||||
if [ -x "$lxc_template" -a $(echo "$lxc_template" | cut -c 1) = '/' ]; then
|
|
||||||
template_path=$lxc_template
|
|
||||||
else
|
|
||||||
template_path=${templatedir}/lxc-$lxc_template
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! [ -x "$template_path" ]; then
|
|
||||||
echo "$(basename $0): unknown template '$lxc_template'" >&2
|
|
||||||
cleanup
|
|
||||||
fi
|
|
||||||
|
|
||||||
sum=$(sha1sum $template_path | cut -d ' ' -f1)
|
|
||||||
echo "# Template used to create this container: $lxc_template" >> $lxc_path/$lxc_name/config
|
|
||||||
if [ -n "$*" ]; then
|
|
||||||
echo "# Parameters passed to the template: $*" >> $lxc_path/$lxc_name/config
|
|
||||||
fi
|
|
||||||
echo "# Template script checksum (SHA-1): $sum" >> $lxc_path/$lxc_name/config
|
|
||||||
echo "" >> $lxc_path/$lxc_name/config
|
|
||||||
fi
|
|
||||||
|
|
||||||
cat $lxc_config >> $lxc_path/$lxc_name/config
|
|
||||||
echo "" >> $lxc_path/$lxc_name/config
|
|
||||||
|
|
||||||
if [ -n "$custom_rootfs" ]; then
|
|
||||||
if grep -q "lxc.rootfs" $lxc_path/$lxc_name/config ; then
|
|
||||||
echo "configuration file already specifies a lxc.rootfs"
|
|
||||||
cleanup
|
|
||||||
fi
|
|
||||||
if [ -d "$custom_rootfs" ]; then
|
|
||||||
echo "specified rootfs ($custom_rootfs) already exists. Bailing."
|
|
||||||
cleanup
|
|
||||||
fi
|
|
||||||
echo "lxc.rootfs = $custom_rootfs" >> $lxc_path/$lxc_name/config
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Create the fs as needed
|
|
||||||
if [ "$backingstore" = "lvm" ]; then
|
|
||||||
[ -d "$rootfs" ] || mkdir $rootfs
|
|
||||||
lvcreate -L $fssize -n $lvname $vgname || cleanup
|
|
||||||
udevadm settle
|
|
||||||
mkfs -t $fstype $rootdev || cleanup
|
|
||||||
mount -t $fstype $rootdev $rootfs
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -z "$lxc_template" ]; then
|
|
||||||
$template_path --path=$lxc_path/$lxc_name --name=$lxc_name "$@"
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo "$(basename $0): failed to execute template '$lxc_template'" >&2
|
|
||||||
cleanup
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "'$lxc_template' template installed"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$backingstore" = "lvm" ]; then
|
|
||||||
echo "Unmounting LVM"
|
|
||||||
umount $rootfs
|
|
||||||
|
|
||||||
# TODO: make the templates set this right from the start?
|
|
||||||
sed -i '/lxc.rootfs/d' $lxc_path/$lxc_name/config
|
|
||||||
echo "lxc.rootfs = $rootdev" >> $lxc_path/$lxc_name/config
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "'$lxc_name' created"
|
|
Loading…
Reference in New Issue
Block a user