Skip to content

Instantly share code, notes, and snippets.

@dexterbt1
Last active December 11, 2015 09:49
Show Gist options
  • Save dexterbt1/4582666 to your computer and use it in GitHub Desktop.
Save dexterbt1/4582666 to your computer and use it in GitHub Desktop.
Centos 6.3 script to automate creation of the LXC rootfs and libvirt definition
#!/bin/bash
# vim: set ts=4 sw=4 et nu
set -e
usage="Usage: $0 <name>"
name=$1
if [ -z "$name" ]; then
echo $usage
exit 1;
fi
libvirt_xml="/containers/$name/libvirt.xml"
rootfs="/containers/$name/rootfs"
echo "Initializing rootfs: $rootfs"
mkdir -p $rootfs
mkdir -p $rootfs/home
mkdir -p $rootfs/opt
mkdir -p $rootfs/proc
mkdir -p $rootfs/sys
mkdir -p $rootfs/root
mkdir -p $rootfs/media
mkdir -p $rootfs/mnt
mkdir -p $rootfs/srv
mkdir -p $rootfs/var
for d in bin etc lib lib64 mnt sbin selinux usr var; do
echo "Copying files /$d ..."
rsync -ap "/$d/" "$rootfs/$d"
done
rm -rf "$rootfs/var/cache/*"
echo "Creating /dev"
dev_path="$rootfs/dev"
rm -rf $dev_path
mkdir -p $dev_path
mknod -m 666 ${dev_path}/null c 1 3
mknod -m 666 ${dev_path}/zero c 1 5
mknod -m 666 ${dev_path}/random c 1 8
mknod -m 666 ${dev_path}/urandom c 1 9
mkdir -m 755 ${dev_path}/pts
mkdir -m 1777 ${dev_path}/shm
mknod -m 666 ${dev_path}/tty c 5 0
mknod -m 666 ${dev_path}/tty0 c 4 0
mknod -m 666 ${dev_path}/tty1 c 4 1
mknod -m 666 ${dev_path}/tty2 c 4 2
mknod -m 666 ${dev_path}/tty3 c 4 3
mknod -m 666 ${dev_path}/tty4 c 4 4
mknod -m 600 ${dev_path}/console c 5 1
mknod -m 666 ${dev_path}/full c 1 7
mknod -m 600 ${dev_path}/initctl p
mknod -m 666 ${dev_path}/ptmx c 5 2
echo "Creating network config eth0"
cat <<EOF > ${rootfs}/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
TYPE=Ethernet
USERCTL=yes
PEERDNS=yes
IPV6INIT=no
EOF
echo "Creating network config resolv.conf"
cat > $rootfs/etc/resolv.conf << END
# Google public DNS
nameserver 8.8.8.8
nameserver 8.8.4.4
END
echo "Creating network config sysconfig/network"
# set the hostname
cat <<EOF > ${rootfs}/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=${name}
EOF
echo "Creating config fstab"
#
cat <<EOF > ${rootfs}/etc/fstab
none /dev/pts devpts defaults 0 0
none /proc proc defaults 0 0
none /sys sysfs defaults 0 0
none /dev/shm tmpfs defaults 0 0
EOF
echo "Creating etc/hosts"
# set minimal hosts
cat <<EOF > $rootfs/etc/hosts
127.0.0.1 localhost $name
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
EOF
# selinux
echo "Creating selinux"
cat <<EOF > $rootfs/etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted
EOF
#
echo "Creating init for guest"
cat <<EOF > $rootfs/bin/lxc_guest_init.sh
#!/bin/bash
export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
export PS1="[\u@\h \W]\\$ "
mount -t devtmpfs none /dev
mount -t devpts none /dev/pts
mount -t tmpfs none /dev/shm
/etc/init.d/network start
/etc/init.d/sshd start
exec /bin/bash
EOF
chmod 755 "$rootfs/bin/lxc_guest_init.sh"
#
echo "Setting up sshd_config"
sed -i 's/^UsePAM\ *yes/\#&/' ${rootfs}/etc/ssh/sshd_config
sed -i 's/^GSSAPIAuthentication\ *yes/\#&/' ${rootfs}/etc/ssh/sshd_config
echo "pts/0" >> /etc/securetty
#
echo "Setting up etc/environment"
cat >> $rootfs/etc/environment <<EOM
LANG="en_US.UTF-8"
LANGUAGE="en_US:en"
PS1="[\u@\h \W]\\$ "
EOM
cat > $roofs/etc/default/locale <<EOM
LANG="en_US.UTF-8"
LANGUAGE="en_US:en"
EOM
# libvirt.xml
echo "Creating libvirt config: $libvirt_xml"
cat <<EOF > $libvirt_xml
<domain type="lxc">
<name>$name</name>
<memory>102400</memory>
<os>
<type>exe</type>
<init>/bin/lxc_guest_init.sh</init>
</os>
<vcpu>1</vcpu>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/libexec/libvirt_lxc</emulator>
<filesystem type="mount">
<source dir="$rootfs/bin/"></source>
<target dir="/bin">
</target></filesystem>
<filesystem type="mount">
<source dir="$rootfs/etc/"></source>
<target dir="/etc">
</target></filesystem>
<filesystem type="mount">
<source dir="$rootfs/lib/"></source>
<target dir="/lib">
</target></filesystem>
<filesystem type="mount">
<source dir="$rootfs/lib64/"></source>
<target dir="/lib64">
</target></filesystem>
<filesystem type="mount">
<source dir="$rootfs/mnt/"></source>
<target dir="/mnt">
</target></filesystem>
<filesystem type="mount">
<source dir="$rootfs/sbin/"></source>
<target dir="/sbin">
</target></filesystem>
<filesystem type="mount">
<source dir="$rootfs/selinux/"></source>
<target dir="/selinux">
</target></filesystem>
<filesystem type="mount">
<source dir="$rootfs/usr/"></source>
<target dir="/usr">
</target></filesystem>
<filesystem type="mount">
<source dir="$rootfs/home/"></source>
<target dir="/home">
</target></filesystem>
<filesystem type="mount">
<source dir="$rootfs/root/"></source>
<target dir="/root">
</target></filesystem>
<filesystem type="mount">
<source dir="$rootfs/media/"></source>
<target dir="/media">
</target></filesystem>
<filesystem type="mount">
<source dir="$rootfs/dev/"></source>
<target dir="/dev">
</target></filesystem>
<filesystem type="mount">
<source dir="$rootfs/var/"></source>
<target dir="/var">
</target></filesystem>
<interface type="network">
<source network="default"></source>
</interface>
<console type="pty">
</console></devices>
</domain>
EOF
echo
echo "Done."
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment