BusyBox and uClibc based preboot environment

Preface

The information below is provided to build a Gentoo, uClibc and BusyBox based development environment. This document is based on an excelent howto by H.H. Holcomb that can be found here.

NOTE: If not stated otherwise, it is required to be root while performing the commands in this document.

Development environment

Preparation

First of all, create a base directory for the development area...

 su -
 mkdir -p /opt/data/development/uclibc

Download the latest stage 1 tarball from a local mirror and extract it into the development area.

 cd /opt/data/development/uclibc
 wget http://gentoo.mirror.intouch.nl/gentoo/experimental/x86/embedded/stages/stage1-x86-uclibc-2005.0.tar.bz2
 tar -jxpf stage1-x86-uclibc-2005.0.tar.bz2

Mount the proc and portage directories in your development area, so you can use portage from within the development area without consuming additional diskspace.

 cd /opt/data/development/uclibc
 mount -o bind /proc proc
 mount -o bind /usr/portage usr/portage

Copy resolver information to the development area

 cd /opt/data/development/uclibc
 cp /etc/resolv.conf etc/resolv.conf

There you go... A bootstrap ready embedded development area awaiting to be finished...

Build

'chroot'

Now it is time to enter (chroot) the development area and build the base development system.

 
 cd /opt/data/development/uclibc
 chroot . /bin/bash --login
 env-update
 source /etc/profile

NOTE: Remember that from here on it is assumed that you have entered the development area using chroot...

System configuration

Modify make.conf to suit the new environment.

 mkdir -p /usr/local/portage
 nano -w /etc/make.conf

An example of make.conf:

#USE="X gtk gnome -alsa"

UCLIBC_CPU="686"
CHOST="i686-gentoo-linux-uclibc"
CFLAGS="-mcpu=i686 -Os -pipe"
CXXFLAGS="${CFLAGS}"

MAKEOPTS="-j2"

GENTOO_MIRRORS="http://gentoo.mirror.intouch.nl/gentoo http://distfiles.gentoo.org http://www.ibiblio.org/pub/Linux/distributions/gentoo"
SYNC="rsync://gentoo.mirror.intouch.nl/gentoo-portage"
RSYNC_RETRIES="3"
#RSYNC_TIMEOUT=180

PORTDIR_OVERLAY=/usr/local/portage
#PORTAGE_NICENESS=3
AUTOCLEAN="yes"
PORTAGE_TMPFS="/dev/shm"

#FEATURES="sandbox buildpkg ccache distcc userpriv usersandbox notitles noclean noauto cvs keeptemp keepwork autoaddcvs"

CCACHE_SIZE="512M"
#DISTCC_DIR="${PORTAGE_TMPDIR}/.distcc"

Profile selection

Set the new profile... An important step in the process...

 cd /etc/
 unlink make.profile
 ln -s ../usr/portage/profiles/uclibc/x86/2005.1/ make.profile

Bootstrap

Now we’ve set the profile, it’s time to bootstrap the development environment... But not without a pre-flight check:

 cd /usr/portage/scripts
 ./bootstrap.sh -p -v

There should be green lights all over the screen, if not, use the Gentoo Forums to fix the problem(s). When all lights are green at last, run the bootstrap and get some coffee and/or a smoke...

 ./bootstrap.sh

Due to the fact we want to optimize the build for a specific CPU the bootstrap process might break. If the bootstrap returns an error during the process, run the following commands:

 # Check which compiler the bootstrap uses
 gcc-config -l

 # Select the 1st compiler from the list..
 gcc-config 1

 # Update the environment
 source /etc/profile

 # Rerun the bootstrap process
 ./bootstrap.sh

The bootstrap process should now continue smoothly ‘till the end, so get some more coffee and/or smokes...

Build the system

Now the development environment has been bootstrapped, it’s time to create a more complete system...

 emerge -e system

The emerge -e makes sure that portage starts with an empty environment. However if portage breaks along the way you cannot simply rerun the emerge -e command... You will get caught in a loop.

If, for whatever reason, emerge breaks at this point, simply emerge the package that breaks by hand (let’s take a likely candidate as example: python):

 # Check which compiler the bootstrap uses
 gcc-config -l

 # Select the 1st compiler from the list..
 gcc-config 1

 # Update the environment
 source /etc/profile

 # Rerun the package build (remember this example is about python)
 emerge python

 # Continue the system build
 emerge system

Congratulations: You have succesfuly created a basic development environment.


Embedded system

NOTE: All the commands are assumed to be performed after chroot’ing to the development area!

Build v2

BusyBox savedconfig

/etc/portage/savedconfig/sys-apps/busybox

#
# Automatically generated make config: don't edit
# Busybox version: 1.12.2
# Wed Apr  1 11:11:23 2009
#
CONFIG_HAVE_DOT_CONFIG=y

#
# Busybox Settings
#

#
# General Configuration
#
CONFIG_DESKTOP=y
CONFIG_EXTRA_COMPAT=y
# CONFIG_FEATURE_ASSUME_UNICODE is not set
CONFIG_FEATURE_BUFFERS_USE_MALLOC=y
# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set
# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set
CONFIG_SHOW_USAGE=y
CONFIG_FEATURE_VERBOSE_USAGE=y
CONFIG_FEATURE_COMPRESS_USAGE=y
CONFIG_FEATURE_INSTALLER=y
# CONFIG_LOCALE_SUPPORT is not set
CONFIG_GETOPT_LONG=y
CONFIG_FEATURE_DEVPTS=y
CONFIG_FEATURE_CLEAN_UP=y
CONFIG_FEATURE_PIDFILE=y
CONFIG_FEATURE_SUID=y
CONFIG_FEATURE_SUID_CONFIG=y
CONFIG_FEATURE_SUID_CONFIG_QUIET=y
# CONFIG_SELINUX is not set
# CONFIG_FEATURE_PREFER_APPLETS is not set
CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe"
CONFIG_FEATURE_SYSLOG=y
CONFIG_FEATURE_HAVE_RPC=y

#
# Build Options
#
CONFIG_STATIC=y
# CONFIG_PIE is not set
# CONFIG_NOMMU is not set
# CONFIG_BUILD_LIBBUSYBOX is not set
# CONFIG_FEATURE_INDIVIDUAL is not set
# CONFIG_FEATURE_SHARED_BUSYBOX is not set
CONFIG_LFS=y
CONFIG_CROSS_COMPILER_PREFIX=""

#
# Debugging Options
#
# CONFIG_DEBUG is not set
# CONFIG_DEBUG_PESSIMIZE is not set
# CONFIG_WERROR is not set
CONFIG_NO_DEBUG_LIB=y
# CONFIG_DMALLOC is not set
# CONFIG_EFENCE is not set
CONFIG_INCLUDE_SUSv2=y
# CONFIG_PARSE is not set

#
# Installation Options
#
# CONFIG_INSTALL_NO_USR is not set
CONFIG_INSTALL_APPLET_SYMLINKS=y
# CONFIG_INSTALL_APPLET_HARDLINKS is not set
# CONFIG_INSTALL_APPLET_SCRIPT_WRAPPERS is not set
# CONFIG_INSTALL_APPLET_DONT is not set
# CONFIG_INSTALL_SH_APPLET_SYMLINK is not set
# CONFIG_INSTALL_SH_APPLET_HARDLINK is not set
# CONFIG_INSTALL_SH_APPLET_SCRIPT_WRAPPER is not set
CONFIG_PREFIX="./_install"

#
# Busybox Library Tuning
#
CONFIG_PASSWORD_MINLEN=5
CONFIG_MD5_SIZE_VS_SPEED=2
CONFIG_FEATURE_FAST_TOP=y
CONFIG_FEATURE_ETC_NETWORKS=y
CONFIG_FEATURE_EDITING=y
CONFIG_FEATURE_EDITING_MAX_LEN=1024
# CONFIG_FEATURE_EDITING_VI is not set
CONFIG_FEATURE_EDITING_HISTORY=15
CONFIG_FEATURE_EDITING_SAVEHISTORY=y
CONFIG_FEATURE_TAB_COMPLETION=y
CONFIG_FEATURE_USERNAME_COMPLETION=y
CONFIG_FEATURE_EDITING_FANCY_PROMPT=y
CONFIG_FEATURE_VERBOSE_CP_MESSAGE=y
CONFIG_FEATURE_COPYBUF_KB=4
# CONFIG_MONOTONIC_SYSCALL is not set
CONFIG_IOCTL_HEX2STR_ERROR=y
# CONFIG_FEATURE_HWIB is not set

#
# Applets
#

#
# Archival Utilities
#
CONFIG_FEATURE_SEAMLESS_LZMA=y
CONFIG_FEATURE_SEAMLESS_BZ2=y
CONFIG_FEATURE_SEAMLESS_GZ=y
CONFIG_FEATURE_SEAMLESS_Z=y
CONFIG_AR=y
CONFIG_FEATURE_AR_LONG_FILENAMES=y
CONFIG_BUNZIP2=y
CONFIG_BZIP2=y
CONFIG_CPIO=y
CONFIG_FEATURE_CPIO_O=y
CONFIG_DPKG=y
CONFIG_DPKG_DEB=y
# CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY is not set
CONFIG_GUNZIP=y
CONFIG_GZIP=y
# CONFIG_RPM2CPIO is not set
CONFIG_RPM=y
CONFIG_TAR=y
CONFIG_FEATURE_TAR_CREATE=y
CONFIG_FEATURE_TAR_AUTODETECT=y
CONFIG_FEATURE_TAR_FROM=y
CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY=y
# CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY is not set
CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y
CONFIG_FEATURE_TAR_LONG_OPTIONS=y
CONFIG_FEATURE_TAR_UNAME_GNAME=y
CONFIG_UNCOMPRESS=y
# CONFIG_UNLZMA is not set
# CONFIG_FEATURE_LZMA_FAST is not set
CONFIG_UNZIP=y

#
# Coreutils
#
CONFIG_BASENAME=y
CONFIG_CAL=y
CONFIG_CAT=y
# CONFIG_CATV is not set
CONFIG_CHGRP=y
CONFIG_CHMOD=y
CONFIG_CHOWN=y
CONFIG_CHROOT=y
CONFIG_CKSUM=y
CONFIG_COMM=y
CONFIG_CP=y
CONFIG_CUT=y
CONFIG_DATE=y
CONFIG_FEATURE_DATE_ISOFMT=y
CONFIG_DD=y
CONFIG_FEATURE_DD_SIGNAL_HANDLING=y
CONFIG_FEATURE_DD_IBS_OBS=y
CONFIG_DF=y
CONFIG_FEATURE_DF_INODE=y
CONFIG_DIRNAME=y
CONFIG_DOS2UNIX=y
CONFIG_UNIX2DOS=y
CONFIG_DU=y
CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K=y
CONFIG_ECHO=y
CONFIG_FEATURE_FANCY_ECHO=y
CONFIG_ENV=y
CONFIG_FEATURE_ENV_LONG_OPTIONS=y
CONFIG_EXPAND=y
CONFIG_FEATURE_EXPAND_LONG_OPTIONS=y
CONFIG_EXPR=y
CONFIG_EXPR_MATH_SUPPORT_64=y
CONFIG_FALSE=y
CONFIG_FOLD=y
CONFIG_HEAD=y
CONFIG_FEATURE_FANCY_HEAD=y
CONFIG_HOSTID=y
CONFIG_ID=y
CONFIG_INSTALL=y
CONFIG_FEATURE_INSTALL_LONG_OPTIONS=y
CONFIG_LENGTH=y
CONFIG_LN=y
CONFIG_LOGNAME=y
CONFIG_LS=y
CONFIG_FEATURE_LS_FILETYPES=y
CONFIG_FEATURE_LS_FOLLOWLINKS=y
CONFIG_FEATURE_LS_RECURSIVE=y
CONFIG_FEATURE_LS_SORTFILES=y
CONFIG_FEATURE_LS_TIMESTAMPS=y
CONFIG_FEATURE_LS_USERNAME=y
CONFIG_FEATURE_LS_COLOR=y
CONFIG_FEATURE_LS_COLOR_IS_DEFAULT=y
CONFIG_MD5SUM=y
CONFIG_MKDIR=y
CONFIG_FEATURE_MKDIR_LONG_OPTIONS=y
CONFIG_MKFIFO=y
CONFIG_MKNOD=y
CONFIG_MV=y
# CONFIG_FEATURE_MV_LONG_OPTIONS is not set
CONFIG_NICE=y
CONFIG_NOHUP=y
# CONFIG_OD is not set
CONFIG_PRINTENV=y
CONFIG_PRINTF=y
CONFIG_PWD=y
CONFIG_READLINK=y
CONFIG_FEATURE_READLINK_FOLLOW=y
CONFIG_REALPATH=y
CONFIG_RM=y
CONFIG_RMDIR=y
# CONFIG_FEATURE_RMDIR_LONG_OPTIONS is not set
CONFIG_SEQ=y
CONFIG_SHA1SUM=y
CONFIG_SLEEP=y
CONFIG_FEATURE_FANCY_SLEEP=y
# CONFIG_FEATURE_FLOAT_SLEEP is not set
CONFIG_SORT=y
CONFIG_FEATURE_SORT_BIG=y
CONFIG_SPLIT=y
CONFIG_FEATURE_SPLIT_FANCY=y
CONFIG_STAT=y
CONFIG_FEATURE_STAT_FORMAT=y
CONFIG_STTY=y
CONFIG_SUM=y
CONFIG_SYNC=y
CONFIG_TAC=y
CONFIG_TAIL=y
CONFIG_FEATURE_FANCY_TAIL=y
CONFIG_TEE=y
CONFIG_FEATURE_TEE_USE_BLOCK_IO=y
CONFIG_TEST=y
CONFIG_FEATURE_TEST_64=y
CONFIG_TOUCH=y
CONFIG_TR=y
CONFIG_FEATURE_TR_CLASSES=y
CONFIG_FEATURE_TR_EQUIV=y
CONFIG_TRUE=y
CONFIG_TTY=y
CONFIG_UNAME=y
CONFIG_UNEXPAND=y
CONFIG_FEATURE_UNEXPAND_LONG_OPTIONS=y
CONFIG_UNIQ=y
CONFIG_USLEEP=y
CONFIG_UUDECODE=y
CONFIG_UUENCODE=y
CONFIG_WC=y
CONFIG_FEATURE_WC_LARGE=y
CONFIG_WHO=y
CONFIG_WHOAMI=y
CONFIG_YES=y

#
# Common options for cp and mv
#
CONFIG_FEATURE_PRESERVE_HARDLINKS=y

#
# Common options for ls, more and telnet
#
CONFIG_FEATURE_AUTOWIDTH=y

#
# Common options for df, du, ls
#
CONFIG_FEATURE_HUMAN_READABLE=y

#
# Common options for md5sum, sha1sum
#
CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y

#
# Console Utilities
#
CONFIG_CHVT=y
CONFIG_CLEAR=y
CONFIG_DEALLOCVT=y
CONFIG_DUMPKMAP=y
CONFIG_KBD_MODE=y
CONFIG_LOADFONT=y
CONFIG_LOADKMAP=y
CONFIG_OPENVT=y
CONFIG_RESET=y
CONFIG_RESIZE=y
CONFIG_FEATURE_RESIZE_PRINT=y
CONFIG_SETCONSOLE=y
CONFIG_FEATURE_SETCONSOLE_LONG_OPTIONS=y
CONFIG_SETFONT=y
CONFIG_SETKEYCODES=y
CONFIG_SETLOGCONS=y
CONFIG_SHOWKEY=y

#
# Debian Utilities
#
CONFIG_MKTEMP=y
CONFIG_PIPE_PROGRESS=y
CONFIG_RUN_PARTS=y
CONFIG_FEATURE_RUN_PARTS_LONG_OPTIONS=y
CONFIG_FEATURE_RUN_PARTS_FANCY=y
CONFIG_START_STOP_DAEMON=y
CONFIG_FEATURE_START_STOP_DAEMON_FANCY=y
CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS=y
CONFIG_WHICH=y

#
# Editors
#
CONFIG_AWK=y
CONFIG_FEATURE_AWK_MATH=y
CONFIG_CMP=y
CONFIG_DIFF=y
CONFIG_FEATURE_DIFF_BINARY=y
CONFIG_FEATURE_DIFF_DIR=y
CONFIG_FEATURE_DIFF_MINIMAL=y
# CONFIG_ED is not set
CONFIG_PATCH=y
CONFIG_SED=y
CONFIG_VI=y
CONFIG_FEATURE_VI_MAX_LEN=4096
CONFIG_FEATURE_VI_8BIT=y
CONFIG_FEATURE_VI_COLON=y
CONFIG_FEATURE_VI_YANKMARK=y
CONFIG_FEATURE_VI_SEARCH=y
CONFIG_FEATURE_VI_USE_SIGNALS=y
CONFIG_FEATURE_VI_DOT_CMD=y
CONFIG_FEATURE_VI_READONLY=y
CONFIG_FEATURE_VI_SETOPTS=y
CONFIG_FEATURE_VI_SET=y
CONFIG_FEATURE_VI_WIN_RESIZE=y
CONFIG_FEATURE_VI_OPTIMIZE_CURSOR=y
CONFIG_FEATURE_ALLOW_EXEC=y

#
# Finding Utilities
#
CONFIG_FIND=y
CONFIG_FEATURE_FIND_PRINT0=y
CONFIG_FEATURE_FIND_MTIME=y
CONFIG_FEATURE_FIND_MMIN=y
CONFIG_FEATURE_FIND_PERM=y
CONFIG_FEATURE_FIND_TYPE=y
CONFIG_FEATURE_FIND_XDEV=y
CONFIG_FEATURE_FIND_MAXDEPTH=y
CONFIG_FEATURE_FIND_NEWER=y
CONFIG_FEATURE_FIND_INUM=y
CONFIG_FEATURE_FIND_EXEC=y
CONFIG_FEATURE_FIND_USER=y
CONFIG_FEATURE_FIND_GROUP=y
CONFIG_FEATURE_FIND_NOT=y
CONFIG_FEATURE_FIND_DEPTH=y
CONFIG_FEATURE_FIND_PAREN=y
CONFIG_FEATURE_FIND_SIZE=y
CONFIG_FEATURE_FIND_PRUNE=y
CONFIG_FEATURE_FIND_DELETE=y
CONFIG_FEATURE_FIND_PATH=y
CONFIG_FEATURE_FIND_REGEX=y
# CONFIG_FEATURE_FIND_CONTEXT is not set
CONFIG_GREP=y
CONFIG_FEATURE_GREP_EGREP_ALIAS=y
CONFIG_FEATURE_GREP_FGREP_ALIAS=y
CONFIG_FEATURE_GREP_CONTEXT=y
CONFIG_XARGS=y
# CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION is not set
# CONFIG_FEATURE_XARGS_SUPPORT_QUOTES is not set
# CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT is not set
# CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM is not set

#
# Init Utilities
#
CONFIG_INIT=y
# CONFIG_DEBUG_INIT is not set
CONFIG_FEATURE_USE_INITTAB=y
CONFIG_FEATURE_KILL_REMOVED=y
CONFIG_FEATURE_KILL_DELAY=0
# CONFIG_FEATURE_INIT_SCTTY is not set
CONFIG_FEATURE_INIT_SYSLOG=y
CONFIG_FEATURE_EXTRA_QUIET=y
CONFIG_FEATURE_INIT_COREDUMPS=y
CONFIG_FEATURE_INITRD=y
CONFIG_HALT=y
CONFIG_MESG=y

#
# Login/Password Management Utilities
#
CONFIG_FEATURE_SHADOWPASSWDS=y
CONFIG_USE_BB_PWD_GRP=y
CONFIG_USE_BB_SHADOW=y
CONFIG_USE_BB_CRYPT=y
CONFIG_ADDGROUP=y
CONFIG_FEATURE_ADDUSER_TO_GROUP=y
CONFIG_DELGROUP=y
CONFIG_FEATURE_DEL_USER_FROM_GROUP=y
CONFIG_FEATURE_CHECK_NAMES=y
CONFIG_ADDUSER=y
# CONFIG_FEATURE_ADDUSER_LONG_OPTIONS is not set
CONFIG_DELUSER=y
CONFIG_GETTY=y
CONFIG_FEATURE_UTMP=y
CONFIG_FEATURE_WTMP=y
CONFIG_LOGIN=y
# CONFIG_PAM is not set
# CONFIG_LOGIN_SCRIPTS is not set
CONFIG_FEATURE_NOLOGIN=y
CONFIG_FEATURE_SECURETTY=y
CONFIG_PASSWD=y
CONFIG_FEATURE_PASSWD_WEAK_CHECK=y
CONFIG_CRYPTPW=y
CONFIG_CHPASSWD=y
CONFIG_SU=y
CONFIG_FEATURE_SU_SYSLOG=y
CONFIG_FEATURE_SU_CHECKS_SHELLS=y
CONFIG_SULOGIN=y
CONFIG_VLOCK=y

#
# Linux Ext2 FS Progs
#
CONFIG_CHATTR=y
CONFIG_FSCK=y
CONFIG_LSATTR=y

#
# Linux Module Utilities
#
CONFIG_MODPROBE_SMALL=y
CONFIG_FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE=y
CONFIG_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED=y
# CONFIG_DEPMOD is not set
# CONFIG_FEATURE_DEPMOD_PRUNE_FANCY is not set
# CONFIG_FEATURE_DEPMOD_ALIAS is not set
# CONFIG_INSMOD is not set
# CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set
# CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set
# CONFIG_FEATURE_INSMOD_LOADINKMEM is not set
# CONFIG_FEATURE_INSMOD_LOAD_MAP is not set
# CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL is not set
# CONFIG_RMMOD is not set
# CONFIG_LSMOD is not set
# CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT is not set
# CONFIG_MODPROBE is not set
# CONFIG_FEATURE_MODPROBE_MULTIPLE_OPTIONS is not set
# CONFIG_FEATURE_MODPROBE_FANCY_ALIAS is not set
# CONFIG_FEATURE_MODPROBE_BLACKLIST is not set
# CONFIG_FEATURE_CHECK_TAINTED_MODULE is not set
# CONFIG_FEATURE_2_4_MODULES is not set
# CONFIG_FEATURE_2_6_MODULES is not set
CONFIG_DEFAULT_MODULES_DIR="/lib/modules"
CONFIG_DEFAULT_DEPMOD_FILE="modules.dep"
# CONFIG_FEATURE_QUERY_MODULE_INTERFACE is not set

#
# Linux System Utilities
#
CONFIG_DMESG=y
CONFIG_FEATURE_DMESG_PRETTY=y
CONFIG_FBSET=y
CONFIG_FEATURE_FBSET_FANCY=y
CONFIG_FEATURE_FBSET_READMODE=y
CONFIG_FDFLUSH=y
CONFIG_FDFORMAT=y
CONFIG_FDISK=y
CONFIG_FDISK_SUPPORT_LARGE_DISKS=y
CONFIG_FEATURE_FDISK_WRITABLE=y
# CONFIG_FEATURE_AIX_LABEL is not set
CONFIG_FEATURE_SGI_LABEL=y
CONFIG_FEATURE_SUN_LABEL=y
CONFIG_FEATURE_OSF_LABEL=y
CONFIG_FEATURE_FDISK_ADVANCED=y
CONFIG_FINDFS=y
CONFIG_FREERAMDISK=y
# CONFIG_FSCK_MINIX is not set
# CONFIG_MKFS_MINIX is not set
# CONFIG_FEATURE_MINIX2 is not set
CONFIG_GETOPT=y
CONFIG_HEXDUMP=y
CONFIG_FEATURE_HEXDUMP_REVERSE=y
CONFIG_HD=y
CONFIG_HWCLOCK=y
CONFIG_FEATURE_HWCLOCK_LONG_OPTIONS=y
CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS=y
# CONFIG_IPCRM is not set
# CONFIG_IPCS is not set
CONFIG_LOSETUP=y
CONFIG_MDEV=y
CONFIG_FEATURE_MDEV_CONF=y
CONFIG_FEATURE_MDEV_RENAME=y
CONFIG_FEATURE_MDEV_RENAME_REGEXP=y
CONFIG_FEATURE_MDEV_EXEC=y
CONFIG_FEATURE_MDEV_LOAD_FIRMWARE=y
CONFIG_MKSWAP=y
# CONFIG_FEATURE_MKSWAP_V0 is not set
CONFIG_MORE=y
CONFIG_FEATURE_USE_TERMIOS=y
CONFIG_VOLUMEID=y
CONFIG_FEATURE_VOLUMEID_EXT=y
CONFIG_FEATURE_VOLUMEID_REISERFS=y
CONFIG_FEATURE_VOLUMEID_FAT=y
# CONFIG_FEATURE_VOLUMEID_HFS is not set
# CONFIG_FEATURE_VOLUMEID_JFS is not set
CONFIG_FEATURE_VOLUMEID_XFS=y
# CONFIG_FEATURE_VOLUMEID_NTFS is not set
CONFIG_FEATURE_VOLUMEID_ISO9660=y
# CONFIG_FEATURE_VOLUMEID_UDF is not set
# CONFIG_FEATURE_VOLUMEID_LUKS is not set
CONFIG_FEATURE_VOLUMEID_LINUXSWAP=y
CONFIG_FEATURE_VOLUMEID_CRAMFS=y
CONFIG_FEATURE_VOLUMEID_ROMFS=y
CONFIG_FEATURE_VOLUMEID_SYSV=y
# CONFIG_FEATURE_VOLUMEID_OCFS2 is not set
# CONFIG_FEATURE_VOLUMEID_LINUXRAID is not set
CONFIG_MOUNT=y
CONFIG_FEATURE_MOUNT_FAKE=y
CONFIG_FEATURE_MOUNT_VERBOSE=y
CONFIG_FEATURE_MOUNT_HELPERS=y
CONFIG_FEATURE_MOUNT_LABEL=y
CONFIG_FEATURE_MOUNT_NFS=y
# CONFIG_FEATURE_MOUNT_CIFS is not set
CONFIG_FEATURE_MOUNT_FLAGS=y
CONFIG_FEATURE_MOUNT_FSTAB=y
CONFIG_PIVOT_ROOT=y
CONFIG_RDATE=y
CONFIG_RDEV=y
CONFIG_READPROFILE=y
# CONFIG_RTCWAKE is not set
CONFIG_SCRIPT=y
# CONFIG_SETARCH is not set
CONFIG_SWAPONOFF=y
CONFIG_FEATURE_SWAPON_PRI=y
CONFIG_SWITCH_ROOT=y
CONFIG_UMOUNT=y
CONFIG_FEATURE_UMOUNT_ALL=y

#
# Common options for mount/umount
#
CONFIG_FEATURE_MOUNT_LOOP=y
CONFIG_FEATURE_MTAB_SUPPORT=y

#
# Miscellaneous Utilities
#
CONFIG_ADJTIMEX=y
CONFIG_BBCONFIG=y
# CONFIG_CHAT is not set
# CONFIG_FEATURE_CHAT_NOFAIL is not set
# CONFIG_FEATURE_CHAT_TTY_HIFI is not set
# CONFIG_FEATURE_CHAT_IMPLICIT_CR is not set
# CONFIG_FEATURE_CHAT_SWALLOW_OPTS is not set
# CONFIG_FEATURE_CHAT_SEND_ESCAPES is not set
# CONFIG_FEATURE_CHAT_VAR_ABORT_LEN is not set
# CONFIG_FEATURE_CHAT_CLR_ABORT is not set
CONFIG_CHRT=y
CONFIG_CROND=y
CONFIG_DEBUG_CROND_OPTION=y
CONFIG_FEATURE_CROND_CALL_SENDMAIL=y
CONFIG_CRONTAB=y
# CONFIG_DC is not set
CONFIG_DEVFSD=y
CONFIG_DEVFSD_MODLOAD=y
CONFIG_DEVFSD_FG_NP=y
CONFIG_DEVFSD_VERBOSE=y
CONFIG_FEATURE_DEVFS=y
CONFIG_DEVMEM=y
CONFIG_EJECT=y
# CONFIG_FEATURE_EJECT_SCSI is not set
# CONFIG_FBSPLASH is not set
# CONFIG_INOTIFYD is not set
CONFIG_LAST=y
CONFIG_FEATURE_LAST_SMALL=y
# CONFIG_FEATURE_LAST_FANCY is not set
CONFIG_LESS=y
CONFIG_FEATURE_LESS_MAXLINES=9999999
CONFIG_FEATURE_LESS_BRACKETS=y
CONFIG_FEATURE_LESS_FLAGS=y
CONFIG_FEATURE_LESS_FLAGCS=y
CONFIG_FEATURE_LESS_MARKS=y
CONFIG_FEATURE_LESS_REGEXP=y
CONFIG_HDPARM=y
CONFIG_FEATURE_HDPARM_GET_IDENTITY=y
CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF=y
CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF=y
CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET=y
CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF=y
CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA=y
CONFIG_MAKEDEVS=y
# CONFIG_FEATURE_MAKEDEVS_LEAF is not set
CONFIG_FEATURE_MAKEDEVS_TABLE=y
# CONFIG_MAN is not set
CONFIG_MICROCOM=y
CONFIG_MOUNTPOINT=y
CONFIG_MT=y
# CONFIG_RAIDAUTORUN is not set
# CONFIG_READAHEAD is not set
CONFIG_RUNLEVEL=y
CONFIG_RX=y
CONFIG_SETSID=y
CONFIG_STRINGS=y
CONFIG_TASKSET=y
CONFIG_FEATURE_TASKSET_FANCY=y
CONFIG_TIME=y
# CONFIG_TTYSIZE is not set
CONFIG_WATCHDOG=y

#
# Networking Utilities
#
# CONFIG_FEATURE_IPV6 is not set
# CONFIG_FEATURE_PREFER_IPV4_ADDRESS is not set
CONFIG_VERBOSE_RESOLUTION_ERRORS=y
CONFIG_ARP=y
CONFIG_ARPING=y
# CONFIG_BRCTL is not set
# CONFIG_FEATURE_BRCTL_FANCY is not set
# CONFIG_FEATURE_BRCTL_SHOW is not set
CONFIG_DNSD=y
# CONFIG_ETHER_WAKE is not set
CONFIG_FAKEIDENTD=y
CONFIG_FTPGET=y
CONFIG_FTPPUT=y
CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS=y
CONFIG_HOSTNAME=y
CONFIG_HTTPD=y
# CONFIG_FEATURE_HTTPD_RANGES is not set
CONFIG_FEATURE_HTTPD_USE_SENDFILE=y
CONFIG_FEATURE_HTTPD_RELOAD_CONFIG_SIGHUP=y
CONFIG_FEATURE_HTTPD_SETUID=y
CONFIG_FEATURE_HTTPD_BASIC_AUTH=y
CONFIG_FEATURE_HTTPD_AUTH_MD5=y
CONFIG_FEATURE_HTTPD_CONFIG_WITH_MIME_TYPES=y
CONFIG_FEATURE_HTTPD_CGI=y
CONFIG_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR=y
CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV=y
CONFIG_FEATURE_HTTPD_ENCODE_URL_STR=y
CONFIG_FEATURE_HTTPD_ERROR_PAGES=y
CONFIG_FEATURE_HTTPD_PROXY=y
CONFIG_IFCONFIG=y
CONFIG_FEATURE_IFCONFIG_STATUS=y
CONFIG_FEATURE_IFCONFIG_SLIP=y
CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ=y
CONFIG_FEATURE_IFCONFIG_HW=y
CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS=y
# CONFIG_IFENSLAVE is not set
CONFIG_IFUPDOWN=y
CONFIG_IFUPDOWN_IFSTATE_PATH="/var/run/ifstate"
CONFIG_FEATURE_IFUPDOWN_IP=y
CONFIG_FEATURE_IFUPDOWN_IP_BUILTIN=y
# CONFIG_FEATURE_IFUPDOWN_IFCONFIG_BUILTIN is not set
CONFIG_FEATURE_IFUPDOWN_IPV4=y
# CONFIG_FEATURE_IFUPDOWN_IPV6 is not set
CONFIG_FEATURE_IFUPDOWN_MAPPING=y
CONFIG_FEATURE_IFUPDOWN_EXTERNAL_DHCP=y
# CONFIG_INETD is not set
# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO is not set
# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD is not set
# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME is not set
# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME is not set
# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN is not set
# CONFIG_FEATURE_INETD_RPC is not set
CONFIG_IP=y
CONFIG_FEATURE_IP_ADDRESS=y
CONFIG_FEATURE_IP_LINK=y
CONFIG_FEATURE_IP_ROUTE=y
CONFIG_FEATURE_IP_TUNNEL=y
CONFIG_FEATURE_IP_RULE=y
CONFIG_FEATURE_IP_SHORT_FORMS=y
# CONFIG_FEATURE_IP_RARE_PROTOCOLS is not set
CONFIG_IPADDR=y
CONFIG_IPLINK=y
CONFIG_IPROUTE=y
CONFIG_IPTUNNEL=y
CONFIG_IPRULE=y
CONFIG_IPCALC=y
CONFIG_FEATURE_IPCALC_FANCY=y
CONFIG_FEATURE_IPCALC_LONG_OPTIONS=y
CONFIG_NAMEIF=y
CONFIG_FEATURE_NAMEIF_EXTENDED=y
CONFIG_NC=y
CONFIG_NC_SERVER=y
CONFIG_NC_EXTRA=y
CONFIG_NETSTAT=y
CONFIG_FEATURE_NETSTAT_WIDE=y
CONFIG_FEATURE_NETSTAT_PRG=y
CONFIG_NSLOOKUP=y
CONFIG_PING=y
# CONFIG_PING6 is not set
CONFIG_FEATURE_FANCY_PING=y
CONFIG_PSCAN=y
CONFIG_ROUTE=y
CONFIG_SENDMAIL=y
# CONFIG_FETCHMAIL is not set
# CONFIG_SLATTACH is not set
CONFIG_TELNET=y
CONFIG_FEATURE_TELNET_TTYPE=y
CONFIG_FEATURE_TELNET_AUTOLOGIN=y
# CONFIG_TELNETD is not set
# CONFIG_FEATURE_TELNETD_STANDALONE is not set
CONFIG_TFTP=y
# CONFIG_TFTPD is not set
CONFIG_FEATURE_TFTP_GET=y
CONFIG_FEATURE_TFTP_PUT=y
CONFIG_FEATURE_TFTP_BLOCKSIZE=y
# CONFIG_DEBUG_TFTP is not set
CONFIG_TRACEROUTE=y
CONFIG_FEATURE_TRACEROUTE_VERBOSE=y
CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE=y
CONFIG_FEATURE_TRACEROUTE_USE_ICMP=y
# CONFIG_APP_UDHCPD is not set
# CONFIG_APP_DHCPRELAY is not set
# CONFIG_APP_DUMPLEASES is not set
# CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY is not set
CONFIG_DHCPD_LEASES_FILE=""
CONFIG_APP_UDHCPC=y
CONFIG_FEATURE_UDHCPC_ARPING=y
# CONFIG_FEATURE_UDHCP_PORT is not set
# CONFIG_FEATURE_UDHCP_DEBUG is not set
CONFIG_FEATURE_RFC3397=y
CONFIG_DHCPC_DEFAULT_SCRIPT="/usr/share/udhcpc/default.script"
CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=80
CONFIG_VCONFIG=y
CONFIG_WGET=y
CONFIG_FEATURE_WGET_STATUSBAR=y
CONFIG_FEATURE_WGET_AUTHENTICATION=y
CONFIG_FEATURE_WGET_LONG_OPTIONS=y
# CONFIG_ZCIP is not set
CONFIG_TCPSVD=y
CONFIG_UDPSVD=y

#
# Process Utilities
#
CONFIG_FREE=y
CONFIG_FUSER=y
CONFIG_KILL=y
CONFIG_KILLALL=y
# CONFIG_KILLALL5 is not set
CONFIG_NMETER=y
CONFIG_PGREP=y
CONFIG_PIDOF=y
CONFIG_FEATURE_PIDOF_SINGLE=y
CONFIG_FEATURE_PIDOF_OMIT=y
CONFIG_PKILL=y
CONFIG_PS=y
CONFIG_FEATURE_PS_WIDE=y
CONFIG_FEATURE_PS_TIME=y
# CONFIG_FEATURE_PS_UNUSUAL_SYSTEMS is not set
CONFIG_RENICE=y
CONFIG_BB_SYSCTL=y
CONFIG_TOP=y
CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y
CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y
CONFIG_FEATURE_TOP_DECIMALS=y
CONFIG_FEATURE_TOPMEM=y
CONFIG_UPTIME=y
CONFIG_WATCH=y

#
# Shells
#
CONFIG_FEATURE_SH_IS_ASH=y
# CONFIG_FEATURE_SH_IS_HUSH is not set
# CONFIG_FEATURE_SH_IS_MSH is not set
# CONFIG_FEATURE_SH_IS_NONE is not set
CONFIG_ASH=y

#
# Ash Shell Options
#
CONFIG_ASH_BASH_COMPAT=y
CONFIG_ASH_JOB_CONTROL=y
CONFIG_ASH_READ_NCHARS=y
CONFIG_ASH_READ_TIMEOUT=y
CONFIG_ASH_ALIAS=y
CONFIG_ASH_MATH_SUPPORT=y
CONFIG_ASH_MATH_SUPPORT_64=y
CONFIG_ASH_GETOPTS=y
CONFIG_ASH_BUILTIN_ECHO=y
CONFIG_ASH_BUILTIN_PRINTF=y
CONFIG_ASH_BUILTIN_TEST=y
CONFIG_ASH_CMDCMD=y
CONFIG_ASH_MAIL=y
CONFIG_ASH_OPTIMIZE_FOR_SIZE=y
CONFIG_ASH_RANDOM_SUPPORT=y
CONFIG_ASH_EXPAND_PRMT=y
# CONFIG_HUSH is not set
# CONFIG_HUSH_HELP is not set
# CONFIG_HUSH_INTERACTIVE is not set
# CONFIG_HUSH_JOB is not set
# CONFIG_HUSH_TICK is not set
# CONFIG_HUSH_IF is not set
# CONFIG_HUSH_LOOPS is not set
# CONFIG_HUSH_CASE is not set
# CONFIG_LASH is not set
# CONFIG_MSH is not set

#
# Bourne Shell Options
#
CONFIG_FEATURE_SH_EXTRA_QUIET=y
# CONFIG_FEATURE_SH_STANDALONE is not set
# CONFIG_FEATURE_SH_NOFORK is not set
CONFIG_CTTYHACK=y

#
# System Logging Utilities
#
CONFIG_SYSLOGD=y
CONFIG_FEATURE_ROTATE_LOGFILE=y
CONFIG_FEATURE_REMOTE_LOG=y
CONFIG_FEATURE_SYSLOGD_DUP=y
CONFIG_FEATURE_IPC_SYSLOG=y
CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=16
CONFIG_LOGREAD=y
CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING=y
CONFIG_KLOGD=y
CONFIG_LOGGER=y

#
# Runit Utilities
#
# CONFIG_RUNSV is not set
# CONFIG_RUNSVDIR is not set
# CONFIG_SV is not set
# CONFIG_SVLOGD is not set
# CONFIG_CHPST is not set
# CONFIG_SETUIDGID is not set
# CONFIG_ENVUIDGID is not set
# CONFIG_ENVDIR is not set
# CONFIG_SOFTLIMIT is not set
# CONFIG_CHCON is not set
# CONFIG_FEATURE_CHCON_LONG_OPTIONS is not set
# CONFIG_GETENFORCE is not set
# CONFIG_GETSEBOOL is not set
# CONFIG_LOAD_POLICY is not set
# CONFIG_MATCHPATHCON is not set
# CONFIG_RESTORECON is not set
# CONFIG_RUNCON is not set
# CONFIG_FEATURE_RUNCON_LONG_OPTIONS is not set
# CONFIG_SELINUXENABLED is not set
# CONFIG_SETENFORCE is not set
# CONFIG_SETFILES is not set
# CONFIG_FEATURE_SETFILES_CHECK_OPTION is not set
# CONFIG_SETSEBOOL is not set
# CONFIG_SESTATUS is not set

#
# Print Utilities
#
# CONFIG_LPD is not set
# CONFIG_LPR is not set
# CONFIG_LPQ is not set

Emerge uGentoo

### Fix the compile environment as the toolkit can't cope
### with linking to ROOT= environment...
emerge beecrypt
 
FEATURES="noman nodoc noinfo" \
ROOT=/opt/devel/uGentoo \
USE="-* threads static minimal uclibc-compat savedconfig" \
emerge --nodeps uclibc busybox beecrypt ncurses
 
### BeWare!!! This might actualy link to glibc from the host
###   * As we don't use portage and the likes in the initrd,
###     there's no need for a Gentoo based init / baselayout
#FEATURES="noman nodoc noinfo" \
#ROOT=/opt/devel/uGentoo \
#USE="-* threads static minimal uclibc-compat savedconfig" \
#emerge --nodeps openrc baselayout virtual/init
 
### Fix missing tools for util-vserver compilation
ln -s /opt/devel/uGentoo/bin/busybox.static /usr/bin/ip
ln -s /opt/devel/uGentoo/bin/busybox.static /usr/bin/iptables
ln -s /opt/devel/uGentoo/bin/busybox.static /usr/bin/vconfig
 
FEATURES="noman nodoc noinfo" \
ROOT=/opt/devel/uGentoo \
USE="-* threads static minimal uclibc-compat savedconfig" \
emerge bash tar
 
### (Re-)Create busybox symlinks
cd /opt/devel/uGentoo
tar -xkpf usr/share/busybox/busybox-links.tar

init script

#!/bin/bash                                                                                                                                                 
echo
echo
echo " Welcome to uGentoo on host $HOSTNAME"
echo
echo

echo " * Setting umask."
umask 022

#echo " * Mounting /proc.."
#mount -t proc none /proc

echo " * Mounting metafilesystems..."
mount -t proc   proc   /proc
mount -t tmpfs  mdev   /dev && mkdir /dev/pts
mount -t devpts devpts /dev/pts
mount -t sysfs  sysfs  /sys

echo " * Populating /dev..."
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

### TODO: Store network settings on local disk
###       and read them prior to continuing to
###       the next step
echo " * Updating network environment"
for TPL in `ls -1 /etc/conf.d/*.tpl`; do
        OUTFILE=`echo $TPL | rev | cut -d / -f 1 | rev | cut -d . -f 1`
        echo "   - Updating $OUTFILE"
        sed -e "s/HOSTADDR/$HOSTNAME/" $TPL > /etc/conf.d/$OUTFILE
done

if [ -x /usr/sbin/ocsinventory 1>/dev/null 2>/dev/null ]; then
        echo " * Updating inventory"
        /usr/sbin/ocsinventory 1>/dev/null 2>/dev/null &
fi

echo " * Starting init.."
exec < dev/console > dev/console 2>&1
exec chroot . /sbin/init

echo " * !!! ERROR !!! Starting init failed."
echo "   ! Trying to start a shell..."
exec /bin/bash

Generate initrd image

#!/bin/bash

# New or existing image ?
if [ -f /initrd-image.bz2 ]; then
        bunzip2 -9 /initrd-image.bz2
else
        # Create a 32MB initrd file
        dd if=/dev/zero of=/initrd-image bs=1024k count=32
end

# Create a device node for the image, format and mount it
losetup /dev/loop0 /initrd-image
mke2fs -LRAMDISK /dev/loop0
mkdir -p /mnt/initrd 2>/dev/null
mount /dev/loop0 /mnt/initrd/

# Copy OS and clean unused data
rm -rf /mnt/initrd/lost*
cp -a /opt/devel/uGentoo/* /mnt/initrd/
rm -rf /mnt/initrd/usr/share/doc \
        /mnt/initrd/usr/share/man \
        /mnt/initrd/usr/share/info \
        /mnt/initrd/usr/share/busybox \
        /mnt/initrd/usr/share/baselayout \
        /mnt/initrd/usr/share/et \
        /mnt/initrd/usr/share/getopt \
        /mnt/initrd/usr/share/grub \
        /mnt/initrd/usr/share/openrc \
        /mnt/initrd/usr/share/ss 2>/dev/null
rm -rf /mnt/initrd/usr/include
rm -rf /mnt/initrd/tmp/* /mnt/initrd/var/tmp/* 2>/dev/null
rm -rf /mnt/initrd/var/db/pkg /mnt/initrd/var/lib/portage/*  2>/dev/null
if [ ! -d /mnt/initrd/var/spool/cron/crontabs ]; then
        mkdir -p /mnt/initrd/var/spool/cron/crontabs
fi

# Unmount image file and delete device node
umount /mnt/initrd/
losetup -d /dev/loop0

# Compress and copy image file in place for PXE boot
bzip2 -9 /initrd-image
scp /initrd-image.bz2 pxehost:/home/tftp/boot

Build

From within the chroot’ed development area, create a placeholder for the embedded environment:

 mkdir /embedded

Optional: Create a basic gentoo file structure within the development area:

 cd /usr/portage/sys-apps/baselayout-lite/
 ROOT=/embedded ebuild baselayout-lite-1.0_pre1.ebuild merge

Optional: Because the embedded Gentoo is still pre-release quality, we need to fix some minor bugs:

 # /var/log is not created from baselayout
 mkdir -p /embedded/var/log

 # Inittab calls for /usr/bin/tail, but it needs to call /bin/tail.
 nano -w /embedded_rootfs/etc/inittab
 /*
 #tty3::respawn:/usr/bin/tail -f /var/log/messages
 tty3::respawn:/bin/tail -f /var/log/messages
 */

Once the basic file structure is in place we can add packages to it... Please remember that in order to be able to use the -K option of portage, you need to emerge -B your package first.

Optional: If you want to develop on the embedded platform, you need a c-library...

 # Emerge uclibc into the embedded rootfs.
 # Use the -K option because we don't get the extra files created by the
 # build/emerge process into our embedded rootfs which needs to be as 
 # small as possible.
 ROOT=/embedded emerge -K uclibc

Required: If you want to do anything usefull without consuming tons of space, you need to install the busybox multicall binary...

 ROOT=/embedded USE="savedconfig static" emerge busybox
 cd /embedded
 mount -o bind /proc proc
 chroot . /bin/busybox --install -s

NOTE: The chroot command is needed to create the symlinks in the /embedded environment.

It occasionaly happens that the static option fails, so make sure to check if busybox is staticly linked:

 ldd /embedded/bin/busybox

This command should give the following output: not a dynamic executable If this is not the case, reemerge busybox.

Optional: If you want to be sure your time is correct on the embedded host, set a timezone

 
 # Set time zone in your embedded rootfs.
 # See http://leaf.sourceforge.net/doc/guide/buci-tz.html for details.
 # For central standard time in the US, use "CST6CDT".
 nano -w /embedded_rootfs/etc/TZ
 /*
 CST6CDT
 */

Bootloader

Optional: If you want to boot the emebedded system from a local storage device, install a bootloader like grub...

 
 # For some reason not all of /boot/grub is copied over to the 
 # embedded rootfs, so a extra manual copy step is needed.
 # The --nodeps gets rip of the run time need of ncurses.
 USE="netboot" emerge -B --nodeps grub
 ROOT=/embedded USE="netboot" emerge --nodeps grub
 cp -R /boot/grub /embedded/boot/

Now that grub is complete, you need to modify grub’s configuration:

 # Modify your boot configure file.
 # The example below is for a boot partition on /dev/hda1 and only
 # one partition on the target SBC system.
 nano -w /embedded/boot/grub/grub.conf

An example grub.conf:

splashimage=(hd0,0)/boot/grub/splash.xpm.gz

timeout 10
default 0
fallback 1

# Serial Console I/O
serial --unit=0 --speed=9600
terminal timeout=10 console serial


# For booting Gentoo Linux [Serial:9600_8N1]
title  Linux 2.6.10 - VServer 1.9.3.17 (1G+ RAM)
        root   (hd0,0)
        kernel /boot/kernels/linux-2.6.13-vs2.1.0-pre5 root=/dev/hda1 console=tty0 console=ttyS0,9600

# For booting Gentoo Linux
title  Gentoo PXE diskless via local kernel
        root   (hd0,0)
        kernel /boot/kernels/linux-2.6.13-vs2.1.0-pre5 ip=dhcp root=/dev/nfs nfsroot=172.16.253.254:/opt/data/diskless/GENTOO,rw,v3


# For installing GRUB into the hard disk
title Install GRUB into the hard disk
        root    (hd0,0)
        setup   (hd0)

Required: Time to lock down the embedded system with a password

 
 chroot /embedded /bin/sh
 passwd
 rm /embedded/etc/passwd-
 exit

Required: Let the embedded system know about the filesystem structure

 # Modify fstab.
 # Below is mine, yours may vary.
 nano -w /embedded/etc/fstab
 /*
 /dev/ram0 / ext2 defaults 0 0
 none /proc proc defaults 0 0
 none /sys sysfs defaults 0 0
 none /dev/shm tmpfs defaults 0 0

 */

Optional: Do some cleaning to reclaim wasted space...

 rm -R /embedded/var/db/pkg/*
 rm -R /embedded/var/lib/portage/

Now you have a fully functional embedded environment ready to run... Be sure to make a backup before you start playing with it, even though the setup requires limited effort and time!


'Hacks'

A few hacks are required to create a fully functional pre-boot environment... Below is some information on how to perform these yourself...

NOTE: All the commands are assumed to be executed after chroot’ing to the development area!

Static e2fsprogs

Because busybox by itself does not include ext[23] filesytems tools, we need to build them ourselves. Here’s how to build staticly linked e2fsprogs:

cd /usr/portage/sys-fs/e2fsprogs
ROOT="/uclibc-preboot/" UCLIBC_CPU="686" USE="netboot static savedconfig" FEATURES="-sandbox" \
ebuild e2fsprogs-//latest version//.ebuild compile

cd /var/tmp/portage/e2fsprogs-//latest version///work/e2fsprogs-//version//

Reconfigure e2fsprogs to create static binaries and compile:

./configure  --prefix=/usr --host=i686-gentoo-linux-uclibc --mandir=/usr/share/man \
--infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc --localstatedir=/var/lib \
--bindir=/bin --sbindir=/sbin --enable-elf-shlibs --with-ldopts= --disable-dynamic-e2fsck \
--without-included-gettext --disable-nls --enable-fsck --build=i686-gentoo-linux-uclibc \
CC=i686-gentoo-linux-uclibc-gcc CFLAGS="-mcpu=i686 -Os -pipe" build_alias=i686-gentoo-linux-uclibc \
host_alias=i686-gentoo-linux-uclibc  --no-create --no-recursion --with-ldopts=-Bstatic

make clean
make

It happens that make does not build the required libs by itself, so if make barfs errors and quits, simply cd into the offending lib directory and run make ; cd - ; make

When make completes, you have to manualy complete the creation and verification of the static binaries:

cd misc
make mke2fs.static
ldd mke2fs.static

Copy the static binary to the embedded environment by hand and create symlinks:

cd ..
cp -a misc/mke2fs.static /uclibc-preboot/sbin/mke2fs
ln -s /uclibc-preboot/sbin/mke2fs /uclibc-preboot/sbin/mkfs.ext2
ln -s /uclibc-preboot/sbin/mke2fs /uclibc-preboot/sbin/mkfs.ext2

cp -a e2fsck/e2fsck.static /uclibc-preboot/sbin/e2fsck
ln -s /uclibc-preboot/sbin/e2fsck /uclibc-preboot/sbin/fsck.ext2
ln -s /uclibc-preboot/sbin/e2fsck /uclibc-preboot/sbin/fsck.ext3

That’s a wrap ;-)

Static mail environment

To be able to send e-mail alerts from the pre-boot environment you had to install various mail tools. That is, until we found the email package...

Here is how to build a static binary of email:

cd /usr/portage/mail-client/email
ROOT="/uclibc-preboot/" UCLIBC_CPU="686" USE="netboot static savedconfig" FEATURES="-sandbox" \
ebuild email/email-//latest version//.ebuild compile

Now enter the source directory and rerun configure:

cd /var/tmp/portage/email-//latest version///work/email-//latest version//
LD_FLAGS="$LD_FLAGS -static" CFLAGS="$CFLAGS -Bstatic" ./config.status --recheck

Check the Makefile in the current directory if both flags are added and do so manualy if needed

nano -w Makefile

Add both flags to the Makefile in /src as well (this is where the email binary will be built) and compile...

cd src/
nano -w Makefile
make

This should leave you with an email binary, now first check the type of binary before continuing:

ldd email

If the ldd email command outputs not a dynamic executable your attempt create a staticly linked email client was succesfull.

Time to copy the static binary and the configfile to the embedded environment by hand:

cd ..
cp -a src/email /uclibc-preboot/usr/bin/email
cp -a email.conf /uclibc-preboot/etc/email.conf

After all files are in place, you still need to modify the config file by hand... To give a head start, here’s an example:

# This is an EXAMPLE configuration file for email.
#
# Please CHANGE THE VALUES below to suit your environment.
############################################################
SMTP_SERVER = 'smtp.domain.local'
SMTP_PORT = '25'

MY_NAME  = 'hostname'
MY_EMAIL = 'user@domain.local'
REPLY_TO = 'user@domain.local'

How to use the email binary from the commandline... well, like so:

./email -sTest -c../email.conf -cc carbon@domain.local bware@domain.local
Sending  "Test"  |**********************************************************************************| 100% of 317 Bytes
E-Mail Sent

Util-VServer toolkit

To be able to use util-vserver, be sure to add all dependencies to the development environment. To check which packages are required use:

emerge -pv util-vserver

Once you’ve taken care of all depencies, it’s time to emerge the util-vserver package:

ROOT=/embedded emerge --nodeps util-vserver

A minor inconvenience is the bash requirement of the util-vserver scripts, so emerge bash (staticly) into the embedded environment:

ROOT=/embedded USE="static" emerge --nodeps bash

NOTE This doesn’t work unfortunately... modify the bash ebuild and uncomment the ‘static section’, after reading the bug information on bugzilla.

Staticly linked php-cli

../configure LDFLAGS=-static –disable-libxml –disable-cgi –disable-shared make LDFLAGS=-all-static

Bootable ISO

In order to boot your embedded environment from a cd, take the following steps:

  • Add required tools to the development environment
emerge syslinux cdrtools
  • Create the bootcd environment
mkdir -p /bootcd/isolinux
# NOTE: Probably you copy this from outside the chrooted environment
cp -a /boot/kernels/vmlinuz bootcd
cp -a /boot/initrd.gz bootcd

# Add the isolinux binary to your image
cp usr/lib/syslinux/isolinux.bin  bootcd/isolinux/
  • Create the iso image
mkisofs -o bootcd.iso -b isolinux/isolinux.bin -c isolinux/boot.cat \
        -no-emul-boot -boot-load-size 4 -boot-info-table \
        -J -hide-rr-moved -R bootcd/
 
documents/bb_uclibc_preboot.txt · Last modified: 2009/04/06 17:03
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki