lxc-busybox.in revision 69d66f1e729aadfcf2f47aaedaf738a888e4646d
#
# lxc: linux Container library
# Authors:
# Daniel Lezcano <daniel.lezcano@free.fr>
# 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
{
rootfs=$1
name=$2
res=0
tree="\
$rootfs/selinux \
$rootfs/dev \
$rootfs/home \
$rootfs/root \
$rootfs/etc \
$rootfs/bin \
$rootfs/sbin \
$rootfs/proc \
$rootfs/mnt \
$rootfs/tmp \
$rootfs/lib \
$rootfs/lib64 \
# minimal devices needed for busybox
# root user defined
cat <<EOF >> $rootfs/etc/passwd
root:x:0:0:root:/root:/bin/sh
EOF
cat <<EOF >> $rootfs/etc/group
root:x:0:root
EOF
# mount everything
cat <<EOF >> $rootfs/etc/init.d/rcS
#!/bin/sh
/bin/syslogd
/bin/mount -a
/bin/udhcpc
EOF
# executable
# mount points
cat <<EOF >> $rootfs/etc/fstab
proc /proc proc defaults 0 0
shm /dev/shm tmpfs defaults 0 0
EOF
# writable and readable for other
# launch rcS first then make a console available
# and propose a shell on the tty, the last one is
# not needed
cat <<EOF >> $rootfs/etc/inittab
::sysinit:/etc/init.d/rcS
tty1::respawn:/bin/getty -L tty1 115200 vt100
console::askfirst:/bin/sh
EOF
# writable and readable for other
cat <<EOF >> $rootfs/usr/share/udhcpc/default.script
#!/bin/sh
case "\$1" in
deconfig)
ip addr flush dev \$interface
;;
renew|bound)
# flush all the routes
if [ -n "\$router" ]; then
ip route del default 2> /dev/null
fi
# check broadcast
if [ -n "\$broadcast" ]; then
broadcast="broadcast \$broadcast"
fi
# add a new ip address
ip addr add \$ip/\$mask \$broadcast dev \$interface
if [ -n "\$router" ]; then
ip route add default via \$router dev \$interface
fi
[ -n "\$domain" ] && echo search \$domain > /etc/resolv.conf
for i in \$dns ; do
echo nameserver \$i >> /etc/resolv.conf
done
;;
esac
exit 0
EOF
return $res
}
{
rootfs=$1
functions="\
[ [[ addgroup adduser adjtimex ar arp arping ash awk basename \
brctl bunzip2 bzcat bzip2 cal cat catv chattr chgrp chmod \
chown chpasswd chpst chroot chrt chvt cksum clear cmp comm \
cp cpio crond crontab cryptpw cut date dc dd deallocvt \
delgroup deluser df dhcprelay diff dirname dmesg dnsd dos2unix \
du dumpkmap dumpleases echo ed egrep eject env envdir envuidgid \
ether-wake expand expr fakeidentd false fbset fdformat fdisk \
fetchmail fgrep find findfs fold free freeramdisk fsck \
fsck.minix ftpget ftpput fuser getopt getty grep gunzip gzip \
halt hdparm head hexdump hostid hostname httpd hwclock id \
ifconfig ifdown ifenslave ifup inetd init insmod install ip \
ipaddr ipcalc ipcrm ipcs iplink iproute iprule iptunnel \
kbd_mode kill killall killall5 klogd last length less linux32 \
linux64 linuxrc ln loadfont loadkmap logger login logname \
logread losetup lpd lpq lpr ls lsattr lsmod lzmacat makedevs \
md5sum mdev mesg microcom mkdir mkfifo mkfs.minix mknod mkswap \
mktemp modprobe more mount mountpoint msh mt mv nameif nc \
netstat nice nmeter nohup nslookup od openvt passwd patch \
pgrep pidof ping ping6 pipe_progress pivot_root pkill poweroff \
printenv printf ps pscan pwd raidautorun rdate readahead \
readlink readprofile realpath reboot renice reset resize rm \
rmdir rmmod route rpm rpm2cpio run-parts runlevel runsv \
runsvdir rx script sed sendmail seq setarch setconsole \
setkeycodes setlogcons setsid setuidgid sh sha1sum slattach \
sleep softlimit sort split start-stop-daemon stat strings \
stty su sulogin sum sv svlogd swapoff swapon switch_root \
sync sysctl syslogd tac tail tar taskset tcpsvd tee telnet \
telnetd test tftp tftpd time top touch tr traceroute \
true tty ttysize udhcpc udhcpd udpsvd umount uname uncompress \
unexpand uniq unix2dos unlzma unzip uptime usleep uudecode \
uuencode vconfig vi vlock watch watchdog wc wget which \
who whoami xargs yes zcat zcip"
if [ $? -ne 0 ]; then
echo "busybox executable is not accessible"
return 1
fi
if [ $? -ne 0 ]; then
echo "warning : busybox is not statically linked."
echo "warning : The template script may not correctly"
echo "warning : setup the container environment."
fi
# copy busybox in the rootfs
if [ $? -ne 0 ]; then
echo "failed to copy busybox in the rootfs"
return 1
fi
# do hardlink to busybox for the different commands
# passwd exec must be setuid
echo "No password for 'root', please change !"
return 0
}
{
path=$1
rootfs=$2
name=$3
cat <<EOF >> $path/config
lxc.utsname = $name
lxc.tty = 1
lxc.pts = 1
# When using LXC with apparmor, uncomment the next line to run unconfined:
#lxc.aa_profile = unconfined
EOF
cat <<EOF >> $path/config
lxc.mount.entry=/lib $rootfs/lib none ro,bind 0 0
lxc.mount.entry=/usr/lib $rootfs/usr/lib none ro,bind 0 0
EOF
fi
# When using LXC with apparmor, uncomment the next line to run unconfined:
#lxc.aa_profile = unconfined
libdirs="\
lib \
lib64 \
fi
done
}
usage()
{
cat <<EOF
$1 -h|--help -p|--path=<path>
EOF
return 0
}
if [ $? -ne 0 ]; then
exit 1
fi
eval set -- "$options"
while true
do
case "$1" in
--) shift 1; break ;;
*) break ;;
esac
done
echo "This script should be run as 'root'"
exit 1
fi
if [ -z "$path" ]; then
echo "'path' parameter is required"
exit 1
fi
# detect rootfs
else
fi
if [ $? -ne 0 ]; then
echo "failed to install busybox's rootfs"
exit 1
fi
if [ $? -ne 0 ]; then
echo "failed to configure busybox template"
exit 1
fi
if [ $? -ne 0 ]; then
echo "failed to write configuration file"
exit 1
fi