Version 0.09 Please add, delete, modify. Thanks! - fixed the password problem - wrote about the problem with kernels 2.6.11 (and latter) - fixed typos - added more options for UCLIBC_CPU - added two people to contributors list
Also I need no workarounds this time through (minus the kernel problem). Still looking for feedback on the Gentooized version of the this how-to on readability and usefullness. http://www.bulah.com/embedded-guide.html Update to my website will come shortly. http://www.bulah.com/embeddedgentoo.html Enjoy, -------------------------------------------------------------------------------- # Embedded Gentoo How-To for x86 # # A how-to guide to setup a Gentoo embedded environment, you must be root. # These commands are to be run on your development system, # any x86 Gentoo Linux computer will do. The system should be fast, # to speed development. The target can be any x86 based SBC. I'm # using a Geode based SBC. Latter I'll use a Via based SBC. # # version 0.09 # 2005.10.10 # # Heath Holcomb (heath at bulah.com) # Ned Ludd (original commands posted) # Lloyd Sargent (contributor) # Yuri Vasilevski (contributor) # Mike George (contributor) # Kammi Cazze (contributor) # Marius Schaefer (contributor) # Pierre Cassimans (contributor) # Marius Schafer (contributor) # # Definitions and Terms # system_rootfs = your regular rootfs, development computer # development_rootfs = what you use to build the embedded_rootfs # embedded_rootfs = rootfs you deploy to the target system # SBC = single board computer (here it's an x86 based) # # References # http://www.gentoo.org/doc/en/handbook/index.xml # http://www.epiawiki.org # http://epia.kalf.org # Gentoo embedded mailing list ([email protected]) # # # Overview of process (steps) # 1 - Prepare the development_rootfs from your system_rootfs # 2 - Build the development_rootfs # 3 - Build the embedded_rootfs # 4 - Build and install non-system programs to the embedded_rootfs # 5 - Build and install a kernel to the embedded_rootfs # 6 - Deploy embedded_rootfs to target # #-------------------------------------------------------------------------------- #----- Step 1 - Prepare the development_rootfs from your system_rootfs ------- # You must be root. su - cd /opt # Create the development_rootfs directory. # I use i586 because of target is a Geode processor. mkdir -p /opt/i586-gentoo-uclibc-linux/usr/portage # Download the latest stage 1 tarball. wget \ http://mirror.usu.edu/mirrors/gentoo/experimental/x86/embedded/stages/\ stage1-x86-uclibc-2005.0.tar.bz2 # Untar the stage to the development_rootfs. tar -xvjpf stage1-x86-uclibc-2005.0.tar.bz2 -C /opt/i586-gentoo-uclibc-linux/ # Mount the proc and portage directories to your development_rootfs. # Makes your system_rootfs's proc and portage directory available from inside # of your development_rootfs (after chrooting). mount --bind /proc /opt/i586-gentoo-uclibc-linux/proc/ mount --bind /usr/portage /opt/i586-gentoo-uclibc-linux/usr/portage # Copy over DNS information to the development_rootfs. cp /etc/resolv.conf /opt/i586-gentoo-uclibc-linux/etc/resolv.conf # Chroot into the development_rootfs. chroot /opt/i586-gentoo-uclibc-linux /bin/bash --login #----- Step 2 - Build the development_rootfs --------------------------------- # Create new environment and load variables into memory. env-update source /etc/profile # Set profile to use 2.6 kernel. # The current stage uses 2.4 by default, and for most cases you are going # to want a 2.6.x kernel. cd /etc/ unlink make.profile ln -s ../usr/portage/profiles/uclibc/x86/2005.1 make.profile # Modify make.conf file to your liking/needs. # This is for my target, Geode x86 processor. # Other values for UCLIBC_CPU : # 386, 486, ELAN, 586, 586MMX, 686, PENTIUMII, PENTIUMIII,PENTIUM4, K6, K7 # CRUSOE, WINCHIPC6, WINCHIP2, CYRIXIII, NEHEMIAH nano -w /etc/make.conf /* USE="bitmap-fonts minimal truetype-fonts mmx" CHOST="i586-gentoo-linux-uclibc" CFLAGS="-march=i586 -Os -pipe -fomit-frame-pointer -mmmx" CXXFLAGS="${CFLAGS}" FEATURES="buildpkg" VIDEO_CARDS="chips" UCLIBC_CPU="586MMX" */ # Start the bootstrap script. cd /usr/portage/scripts ./bootstrap.sh -p -v ./bootstrap.sh # Workaround - bootstraping # Failure compiling uclibc (gcc-config error: Could not run/locate "gcc")? # If you get a failure while bootstrap is compileing uclibc here are the steps # to work around the problem. gcc-config 1 source /etc/profile ./bootstrap.sh # Emerge the system ebuild for the development_rootfs. emerge -e system # Workaround - emerge system # During emerge -e system, python-fchksum failes complaing about # gcc-config error: Could not run/locate "i386-gentoo-linux-uclibc-gcc" # The following commands work around this problem. emerge python emerge -e system #----- Step 3 - Build the embedded_rootfs ------------------------------------ # Create the embedded_rootfs directory. mkdir /embedded_rootfs # Emerge baselayout-lite into embedded_rootfs. # This gives your system a basic file structure. # 1.0_pre1 is the only one that is stable, right? cd /usr/portage/sys-apps/baselayout-lite/ ROOT=/embedded_rootfs emerge baselayout-lite-1.0_pre1.ebuild # Required Workaround - baselayout-lite # Baselayout-lite is still beta, so a few fixes are needed. # There needs to be a directory "log" in /var. # Inittab calls for /usr/bin/tail, but it needs to /usr/bin. mkdir /embedded_rootfs/var/log nano -w /embedded_rootfs/etc/inittab /* #tty3::respawn:/usr/bin/tail -f /var/log/messages tty3::respawn:/bin/tail -f /var/log/messages */ # 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_rootfs emerge -K uclibc # Emerge busybox into the embedded_rootfs. # First you must emerge it into your development_rootfs. # This does not create the symlinks in our development embedded rootfs. emerge busybox ROOT=/embedded_rootfs emerge -K busybox # Create the symlinks for busybox in the embedded_rootfs. mkdir /embedded_rootfs/proc mount -o bind /proc/ /embedded_rootfs/proc/ chroot /embedded_rootfs /bin/busybox --install -s umount /embedded_rootfs/proc # 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 */ # Install a boot loader (usually grub or lilo). # Once you copy/deploy your embedded_rootfs to your target SBC you will # have to run grub on the command line to write to the master boot record # (MBR). # 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. emerge --nodeps grub ROOT=/embedded_rootfs emerge -K --nodeps grub cp -R /boot/grub /embedded_rootfs/boot/ # Modify your boot configure file. # The example below is for a grub, for a boot partition on /dev/hda1 and only # one partition on the target SBC system. nano -w /embedded_rootfs/boot/grub/grub.conf /* default 0 timeout 10 splashimage=(hd0,0)/boot/grub/splash.xpm.gz title=Linux 2.6.x root (hd0,0) kernel /vmlinuz-2.6.x root=/dev/hda1 vga=792 */ # Set root password for the embedded_rootfs chroot /embedded_rootfs /bin/sh passwd exit rm /embedded_rootfs/etc/passwd- # Modify fstab. # Below is mine, yours may vary. nano -w /embedded_rootfs/etc/fstab /* /dev/hda1 / reiserfs defaults 0 0 none /proc proc defaults 0 0 none /sys sysfs defaults 0 0 none /dev/shm tmpfs defaults 0 0 */ # Clean up the embedded_rootfs. # Don't know why these files are there in the first place, so if anyone # can tell me why..... rm -R /embedded_rootfs/var/db/pkg/* rm -R /embedded_rootfs/var/lib/portage/ #---- Step 4 - Build and install non-system programs to the embedded_rootfs -- # Emerge other software you need for you embedded target. # This is very wildly depending on your needs. # Also your proprietary application will be done here. emerge foo* ROOT=/embedded_rootfs emerge -K foo* #---- Step 5 - Build and install a kernel to the embedded_rootfs ------------- # Install a kernel into embedded_rootfs. # First we will emerge it into our development_rootfs, then configure and # build it. # ** Warning ** # There appears to be a bug in kernel version >2.6.12 that prevents us # from "make menuconfig" in the chroot environment. I don't know when it # will be fixed (I'll assume it has to do with uclibc, right ??). # A simple work around would be to compile a kernel outside of the # development_rootfs environment and copy the image over to the embedded_rootfs # boot directory. I'm leaving the how-to as is for now, because I feel that # this "bug" be eventually be fixed upstream. emerge vanilla-sources cd /usr/src/ cd linux make menuconfig # Configure your kernel for your TARGET SBC here. I HIGHLY suggest you # configure the kernel to compile everything into the kernel, and nothing # as a module. make ROOT=/embedded_rootfs make modules_install cp /usr/src/linux/arch/i386/boot/bzImage /embedded_rootfs/boot/vmlinuz-2.6.x # A few notes on compiling your kernel. # If deploying to Compact Flash/DiskOnChip/SD use ext2, as the journaling # filing systems "write" to much for a flash device. # If deploying to a hard drive use a journaling filing system, such as # ext3 or reiserfs. #---- Step 6 - Deploy embedded_rootfs to target ------------------------------ # Prepare a Gentoo (or any Linux distro) system on the target SBC using a # harddrive. This is known as the target development rootfs. # We will create a partition (/embedded_rootfs) that will server as our # "test" partition to deploy our embedded_rootfs that we generate on our # development_system. # # I use the following partitions to speed development (yours may vary): # /dev/hda1 - /embedded_rootfs - 1 GB # /dev/hda2 - /boot - 100 MB # /dev/hda3 - swap - (size varies, 512 MB is a good number) # /dev/hda4 - / - (what is left, at least 1.5 GB per 2005.0 install guide specs) # # Copy over your embedded_rootfs from you development system to your target # system and the directory /embedded_rootfs. This needs to be done via NFS as # need to preserve the permissions. # #The following commands are done from the # target development rootfs. mount -t reiserfs /dev/hda1 /mnt/embedded_rootfs mount -t nfs\ 192.168.0.10:/opt/i586-gentoo-uclibc-linux/embedded_rootfs\ /mnt/nfs_embedded_rootfs cp -adpR /mnt/nfs_embedded_rootfs/* /mnt/embedded_rootfs # Modify your target system's grub.conf (or lilo.conf) for allow you to boot # to the embedded_rootfs partition. # # Reboot, and if all goes well you'll be greeted with a login prompt. # # Fin. -- heath holcomb liquidcable at bulah.com www.bulah.com -- [email protected] mailing list
