Search:  
Gentoo Wiki

TIP_Faketoo

This article is part of the Tips & Tricks series.
Terminals / Shells Network X Window System Portage System Filesystems Kernel Other

Note that the most recent version of this document can be found at the Gentoo Forums
This page is updated from the forums on 14/9/2004.

I just finished setting up a "fake" Gentoo installation inside a chroot jail. Seems to work pretty well for development, I can experiment with no fear of sodding up my actual workstation. In case anyone is interested, here is my "Captain's Log" that details the commands that I ran to build my "Faketoo" instance.

You should run these commands from a working Gentoo installation. Do not reboot off of the Gentoo install CD or anything.

My Faketoo host (i.e. my actual workstation) is a Dell PowerEdge 400SC with a Pentium 4 2.4GHz CPU (hyperthreading enabled) and 512MB of RAM, running a 2.6.3-gentoo-r1 SMP kernel (hyperthreading makes the kernel think it has two processors) and Gentoo 2004.0.

And now, without further ado, here is the Captain's Log:

# ==========================================================
# Faketoo: Building a development Gentoo install inside a chroot jail
#
# Version: 1.0.2
#
# Changelog:
#   1.0.2
#     - Mounting /etc/init.d as loop,noexec
#     - Mounting /usr/portage as bind
#     - Creating PORTDIR_OVERLAY /usr/local/portage
#     - Stuff proxy-related environment variables into ~juser/.bashrc
#   1.0.1
#     - Preserving permissions when creating virgin tarball
#   1.0.0
#     - Initial revision
# ==========================================================

# Insert Gentoo i686 LiveCD (Disc 1)
mount /mnt/cdrom

# Create chroot jail
mkdir ~/faketoo

# Create loopback filesystems that we will need for the jail
mkdir ~/faketoo/loopbacks
dd if=/dev/zero of=~/faketoo/loopbacks/etc-init.d seek=5K count=16 bs=1
mkreiserfs -f ~/faketoo/loopbacks/etc-init.d

# Install Gentoo in jail
cd ~/faketoo
mkdir -p etc/init.d
sudo mount -o loop,noexec loopbacks/etc-init.d etc/init.d
sudo tar xvjpf /mnt/cdrom/stages/stage3-pentium4-20040218.tar.bz2
sudo tar xvjf /mnt/cdrom/snapshots/portage-20040223.tar.bz2 -C usr/
sudo mkdir usr/portage/distfiles/
sudo cp /mnt/cdrom/distfiles/* usr/portage/distfiles/
sudo cp -ar /lib/modules ~/faketoo/lib/modules
sudo rm -rf ~/faketoo/dev
sudo mkdir ~/faketoo/dev
sudo chown root:root ~/faketoo/dev
sudo chmod 755 ~/faketoo/dev
sudo rm -rf ~/faketoo/usr/portage
sudo mkdir ~/faketoo/usr/portage
sudo chown root:root ~/faketoo/usr/portage
sudo chmod 755 ~/faketoo/usr/portage

# Swap Gentoo Pentium4 Package CD into CDROM drive
umount /mnt/cdrom

# Enter jail
sudo mount -o bind -t devfs /dev ~/faketoo/dev
sudo mount -t proc none ~/faketoo/proc
sudo mount -o bind /usr/portage ~/faketoo/usr/portage
sudo cp /etc/resolv.conf ~/faketoo/etc/
sudo chroot ~/faketoo /bin/bash
env-update
source /etc/profile
export PS1=': \u@FAKETOO; '

# Set localtime
ln -sf /usr/share/zoneinfo/America/New_York /etc/localtime

# Create /etc/fstab
cat >/etc/fstab <<EOF
/loopbacks/etc-init.d   /etc/init.d     reiserfs        loop,noexec     0 0
/dev/cdroms/cdrom0      /mnt/cdrom      iso9660         noauto,ro,user  0 0
EOF

# Setup networking
echo faketoo >/etc/hostname
echo domain.tld >/etc/dnsdomainname

# Configure rc.conf
sed -i -e 's/^EDITOR/#EDITOR/' -e 's/^#\(EDITOR=.\+vim"\)$/\1/' /etc/rc.conf

# Fix USE flags
sed -i -e 's/^USE="\(.\+\)"$/USE="\1 -gpm"/' /etc/make.conf

# Setup Portage to use binary packages when available
mount /mnt/cdrom
export PKGDIR=/mnt/cdrom

# Install system logger and cron daemon
emerge -k syslog-ng
emerge -k vixie-cron

# Setup root's environment
passwd
cat >~/.bashrc <<EOF
export PS1=': \u@FAKETOO; '
export PS2=': ; '

mount -a &>/dev/null
EOF

# Accounts management
groupadd juser
useradd juser -m -g juser -G users,wheel,audio,games,portage -s /bin/bash
passwd juser
cat >~juser/.bashrc <<EOF
export PS1=': \u@FAKETOO; '
export PS2=': ; '
EOF
for i in `env |grep -i proxy`; do echo "export $i" >>~juser/.bashrc; done

# Install a decent editor
emerge vim

# Setup sudo
emerge -k sudo
sed -i -e 's/^# \(%wheel\tALL=(ALL)\tALL\)$/\1/' /etc/sudoers
cat >>/etc/sudoers <<EOF
Defaults        !lecture,timestamp_timeout=60
EOF

# Setup Portage overlay (for ebuild development)
mkdir /usr/local/portage
chown root:root /usr/local/portage
chmod 755 /usr/local/portage
cat >>/etc/make.conf <<EOF

## For ebuild development
#PORTDIR_OVERLAY=/usr/local/portage
#ACCEPT_KEYWORDS='~x86 ~amd64 ~sparc ~ppc ~alpha ~mips ~hppa ~ia64 ~ppc64'

## Debug options
#CFLAGS="-march=pentium4 -pipe -g"
#CXXFLAGS=""
#USE=" debug"
#FEATURES=" nostrip keeptemp keepwork noclean"
EOF

# Leave jail
umount /mnt/cdrom
exit

# Create virgin image
cd
sudo umount ~/faketoo/dev
sudo umount ~/faketoo/proc
sudo tar cvjpf ~/faketoo.tbz2 faketoo

Danger Will Robinson: the init scripts are currently too dangerous to use. Please do *not* use '/etc/init.d/foo start' to start service foo. Instead, start it by hand.

And here is a script that can be used to enter the jail:


faketoo.sh

#!/bin/bash
# ==========================================================
# faketoo.sh: Enter the Faketoo jail
#
# Version: 1.0.1
#
# Changelog:
#   1.0.1
#     - Fixing the erroneous $HOME environment variable for root
#   1.0.0
#     - Initial revision
# ==========================================================

if [ $UID -ne 0 ]; then

  echo You must be root!
  exit 1

fi # if (not root)

# Are /dev and /proc mounted inside the jail?
mounted=`mount`

# Mount /dev if it is not already
echo "${mounted}" | grep $HOME/faketoo/dev &>/dev/null
if [ $? -ne 0 ]; then

  echo mount -o bind -t devfs /dev $HOME/faketoo/dev
  mount -o bind -t devfs /dev $HOME/faketoo/dev

fi # if (mounting /dev)

# Mount /proc if it is not already
echo "${mounted}" | grep $HOME/faketoo/proc &>/dev/null
if [ $? -ne 0 ]; then

  echo mount -t proc none $HOME/faketoo/proc
  mount -t proc none $HOME/faketoo/proc

fi # if (mounting /proc)

# Mount /usr/portage if it is not already
echo "${mounted}" | grep $HOME/faketoo/usr/portage &>/dev/null
if [ $? -ne 0 ]; then

  echo mount -o bind /usr/portage $HOME/faketoo/usr/portage
  mount -o bind /usr/portage $HOME/faketoo/usr/portage

fi # if (mounting /usr/portage)

# Enter the jail
HOME=/root chroot ~/faketoo /bin/bash 
Retrieved from "http://www.gentoo-wiki.info/TIP_Faketoo"

Last modified: Fri, 05 Sep 2008 10:21:00 +0000 Hits: 23,385