COMMAND=$(basename $0)
DIRNAME=$(dirname $0)
+BUILD_DIR=$(pwd)
# pkgs parsing utilities
PATH=$(dirname $0):$PATH export PATH
. build.common
-DEFAULT_FCDISTRO=f8
+DEFAULT_FCDISTRO=f16
DEFAULT_PLDISTRO=planetlab
-DEFAULT_PERSONALITY=linux32
+DEFAULT_PERSONALITY=linux64
DEFAULT_IFNAME=eth0
COMMAND_VBUILD="vbuild-init-lxc.sh"
COMMAND_MYPLC="vtest-init-lxc.sh"
+lxc_version="lxc-0.8.0"
+lxc_git_repo="git://lxc.git.sourceforge.net/gitroot/lxc/lxc"
+
function bridge_init () {
# turn on verbosity
INTERFACE_BRIDGE=br0
# Default Value for INTERFACE_LAN
- INTERFACE_LAN=eth0
+ INTERFACE_LAN=$(netstat -rn | grep '^0.0.0.0' | awk '{print $8;}')
echo "========== $COMMAND: entering start - beg"
# take extra arg for ifname, if provided
[ -n "$1" ] && { INTERFACE_LAN=$1; shift ; }
- ### Checking
- type -p brctl &> /dev/null || { echo "brctl not found, please install bridge-utils" ; exit 1 ; }
-
#if we have already configured the same host_box no need to do it again
/sbin/ifconfig $INTERFACE_BRIDGE &> /dev/null && {
echo "Bridge interface $INTERFACE_BRIDGE already set up - $COMMAND start exiting"
sleep 2
echo "Setting bridge address=$address broadcast=$broadcast"
# static
- /sbin/ifconfig $INTERFACE_BRIDGE $address broadcast $broadcast up
+ #/sbin/ifconfig $INTERFACE_BRIDGE $address broadcast $broadcast up
+ dhclient $INTERFACE_BRIDGE
sleep 1
#Reconfigure the routing table
}
-function prepare_host() {
-
- #Bridge init
- bridge_init
-
- #install development tools
- isInstalled=$(yum grouplist "Development Tools" | grep Installed)
- if [ -z "$isInstalled" ] ; then
- echo "Installing Development Tools ..."
- yum -y groupinstall "Development Tools"
- fi
-
- #install libcap-devel, libvirt
- isInstalled=$(rpm -qa | grep libcap-devel)
- if [ -z "$isInstalled" ] ; then
- echo "Installing libcap-devel ..."
- yum -y install libcap-devel
- fi
+function check_yum_installed () {
+ package=$1; shift
+ rpm -q $package >& /dev/null || yum -y install $package
+}
- isInstalled=$(rpm -qa | grep libvirt)
- if [ -z "$isInstalled" ] ; then
- echo "Installing libvirt ..."
- yum -y install libvirt
- fi
+function check_yumgroup_installed () {
+ group="$1"; shift
+ yum grouplist "$group" | grep -q Installed || { yum -y groupinstall "$group" ; }
+}
- #retreive and install lxc from sources
- isInstalled=$(lxc-version | cut -d: -f2 | grep "0.8.0-rc1")
- if [ -z "$isInstalled" ] ; then
- echo "Installing lxc ..."
- cd /root
- git clone git://lxc.git.sourceforge.net/gitroot/lxc/lxc
- cd lxc
- ./autogen.sh
- ./configure
- make
- make install
- fi
+function prepare_host() {
- #create a symlink (just a hack to make lxc works)
- [ ! -d "/usr/local/var/lib" ] && mkdir -p /usr/local/var/lib
- #[ ! -f "/usr/local/var/lib/lxc" ] && ln -s /var/lib/lxc /usr/local/var/lib/lxc
+ #################### lxc-tools : rebuild as current fedora release has flaws
+ #install development tools
+ check_yumgroup_installed "Development Tools"
+ #install libcap-devel, libvirt
+ check_yum_installed libcap-devel
+ check_yum_installed libvirt
+
+ #retrieve and install lxc from sources
+ raw_version=$(lxc-version ||: )
+ lxc_installed_version=$(echo $raw_version | sed -e 's,.*: ,,')
+ if [ "$lxc_installed_version" != "$(echo $lxc_version | cut -d'-' -f2)" ] ; then
+ echo "Expecting version" '['$lxc_version']'
+ echo "Found version" '['$lxc_installed_version']'
+ echo "Installing lxc ..."
+ cd /root
+ [ -d lxc ] || git clone "$lxc_git_repo"
+ cd lxc
+ git pull
+ git checkout $lxc_version
+ ./autogen.sh
+ ./configure --prefix=/usr --exec-prefix=/usr --disable-apparmor
+ make
+ make install
+ mkdir -p /usr/var/lib/
+ [ -d /usr/var/lib/lxc ] || ln -s /var/lib/lxc /usr/var/lib/lxc
+ cd $BUILD_DIR
+ fi
+
+# #create a placeholder (just a hack to make lxc works)
+# [ -d "/usr/local/var/lib" ] || mkdir -p /usr/local/var/lib
+
+ #################### bride initialization
+ check_yum_installed bridge-utils
+ #Bridge init
+ isInstalled=$(netstat -rn | grep '^0.0.0.0' | awk '{print $8;}')
+ if [ "$isInstalled" != "br0" ] ; then
+ bridge_init
+ sleep 5
+ fi
- return 0
+ return 0
}
EOF
# set the hostname
+if [[ "$fcdistro" == "f18" ]] ; then
+ cat <<EOF > ${rootfs_path}/etc/hostname
+$HOSTNAME
+EOF
+else
cat <<EOF > ${rootfs_path}/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=$HOSTNAME
EOF
+fi
# set minimal hosts
# cat <<EOF > $rootfs_path/etc/hosts
function configure_fedora_systemd() {
-
unlink ${rootfs_path}/etc/systemd/system/default.target
+ ln -s /lib/systemd/system/multi-user.target ${rootfs_path}/etc/systemd/system/default.target
touch ${rootfs_path}/etc/fstab
- chroot ${rootfs_path} ln -s /dev/null //etc/systemd/system/udev.service
- chroot ${rootfs_path} ln -s /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
- #dependency on a device unit fails it specially that we disabled udev
- sed -i 's/After=dev-%i.device/After=/' ${rootfs_path}/lib/systemd/system/getty\@.service
+ ln -s /dev/null ${rootfs_path}/etc/systemd/system/udev.service
+# Thierry - Feb 2013
+# this was intended for f16 initially, in order to enable getty that otherwise would not start
+# having a getty running is helpful only if ssh won't start though, and we see a correlation between
+# VM's that refuse to lxc-stop and VM's that run crazy getty's
+# so, turning getty off for now instead
+# #dependency on a device unit fails it specially that we disabled udev
+# sed -i 's/After=dev-%i.device/After=/' ${rootfs_path}/lib/systemd/system/getty\@.service
+ ln -s /dev/null ${rootfs_path}/etc/systemd/system/"getty@.service"
+ rm -f ${rootfs_path}/etc/systemd/system/getty.target.wants/*service || :
+# can't seem to handle this one with systemctl
chroot ${rootfs_path} chkconfig network on
}
MIRROR_URL=http://mirror.onelab.eu/fedora/releases/$release/Everything/$arch/os
- RELEASE_URL="$MIRROR_URL/Packages/fedora-release-$release-1.noarch.rpm"
- echo "Fetching from $RELEASE_URL"
- curl -f "$RELEASE_URL" > $INSTALL_ROOT/fedora-release-$release.noarch.rpm
+ RELEASE_URL1="$MIRROR_URL/Packages/fedora-release-$release-1.noarch.rpm"
+ # with fedora18 the rpms are scattered by first name
+ RELEASE_URL2="$MIRROR_URL/Packages/f/fedora-release-$release-1.noarch.rpm"
+ RELEASE_TARGET=$INSTALL_ROOT/fedora-release-$release.noarch.rpm
+ found=""
+ for attempt in $RELEASE_URL1 $RELEASE_URL2; do
+ if curl -f $attempt -o $RELEASE_TARGET ; then
+ echo "Retrieved $attempt"
+ found=true
+ break
+ else
+ echo "Failed attempt $attempt"
+ fi
+ done
+ [ -n "$found" ] || { echo "Could not retrieve fedora-release rpm - exiting" ; exit 1; }
mkdir -p $INSTALL_ROOT/var/lib/rpm
rpm --root $INSTALL_ROOT --initdb
function install_fedora() {
-set -x
+ set -x
mkdir -p /var/lock/subsys/
(
lxc.network.name = $IFNAME
lxc.network.mtu = 1500
lxc.network.ipv4 = $IP/$CIDR
+lxc.network.veth.pair = $veth_pair
#cgroups
#lxc.cgroup.devices.deny = a
# /dev/null and zero
pldistro=$1; shift
personality=$1; shift
-
-
# create lxc container
copy_configuration
if [ $? -ne 0 ]; then
configure_fedora_systemd
fi
-
# Enable cgroup
mkdir $rootfs_path/cgroup
mkdir $rootfs_path/root/.ssh
cat /root/.ssh/id_rsa.pub >> $rootfs_path/root/.ssh/authorized_keys
+ # start container
lxc-start -d -n $lxc
- sleep 20
+ echo $IP is up, waiting for ssh...
+
+ # wait max 5 min for sshd to start
+ ssh_up=""
+ stop_time=$(($(date +%s) + 300))
+ current_time=$(date +%s)
+ while [ "$current_time" -lt "$stop_time" ] ; do
+ echo "ssh attempt ..."
+ ssh -o "StrictHostKeyChecking no" $IP 'uname -i' && { ssh_up=true; echo "SSHD in container $lxc is UP"; break ; } || :
+ sleep 10
+ current_time=$(($current_time + 10))
+ done
+
+ [ -z $ssh_up ] && echo "SSHD in container $lxc is not running"
+
# rpm --rebuilddb
chroot $rootfs_path rpm --rebuilddb
+ #ssh -o "StrictHostKeyChecking no" $IP "rpm --rebuilddb"
configure_yum_in_lxc $lxc $fcdistro $pldistro
echo "Unknown personality: $personality"
fi
-
+ # need lxc installed before we can run lxc-ls
+ # need bridge installed
+ prepare_host
+
if [ -n "$VBUILD_MODE" ] ; then
# Bridge IP affectation
lxc_network_type=veth
lxc_network_link=virbr0
+ veth_pair="veth$z"
echo "the IP address of container $lxc is $IP "
else
[[ -z "$REPO_URL" ]] && usage
[[ -z "$IP" ]] && usage
- NETMASK=$(ifconfig br0 | grep 'inet addr' | awk '{print $4}' | sed -e 's/.*://')
+
+ NETMASK=$(ifconfig br0 | grep 'inet ' | awk '{print $4}' | sed -e 's/.*://')
GATEWAY=$(route -n | grep 'UG' | awk '{print $2}')
[[ -z "$HOSTNAME" ]] && usage
lxc_network_type=veth
lxc_network_link=br0
+ veth_pair="i$(echo $HOSTNAME | cut -d. -f1)"
fi
CIDR=$(cidr_notation $NETMASK)
exit 1
fi
- if [ ! -z "$(lxc-ls | grep $lxc)" ];then
- echo "container $lxc exists"
- exit 1
- fi
-
-
path=/var/lib/lxc
rootfs_path=$path/$lxc/rootfs
config_path=$path/$lxc
cache_base=/var/cache/lxc/fedora/$arch
cache=$cache_base/$release
root_password=root
-
-
- prepare_host
+
+ # check whether the rootfs directory is created to know if the container exists
+ # bacause /var/lib/lxc/$lxc is already created while putting $lxc.timestamp
+ [ -d $rootfs_path ] && { echo "container $lxc already exists - exiting" ; exit 1 ; }
setup_lxc $lxc $fcdistro $pldistro $personality
devel_or_vtest_tools $lxc $fcdistro $pldistro $personality
post_install $lxc $personality
-
echo $COMMAND Done