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.
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...
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...
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"
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
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...
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.
NOTE: All the commands are assumed to be performed after chroot’ing to the development area!
/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
### 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
#!/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
#!/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
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 */
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!
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!
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
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
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.
../configure LDFLAGS=-static –disable-libxml –disable-cgi –disable-shared make LDFLAGS=-all-static
In order to boot your embedded environment from a cd, take the following steps:
emerge syslinux cdrtools
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/
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/