Last active
December 11, 2015 09:49
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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