Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash -Eu
- # dependencies: avfs
- STAGE3_URL="http://distfiles.gentoo.org/releases/x86/autobuilds/current-iso/stage3-i686-20100216.tar.bz2"
- SNAPSHOT_URL="http://distfiles.gentoo.org/releases/snapshots/current/portage-latest.tar.bz2"
- function usage {
- echo Usage: $0 CMD
- echo where CMD in
- echo init PATH Create new GentooUSB in PATH
- echo enter PATH Enter GentooUSB env in PATH
- }
- function setup_vars {
- CLEANING_UP=
- DSTPATH=$1
- STAGE3=$DSTPATH/downloads/stage3
- SNAPSHOT=$DSTPATH/downloads/portagesnapshot
- DISTFILES=$DSTPATH/downloads/distfiles
- ROOT=$DSTPATH/rootfs
- DATA=$DSTPATH/data
- DATA_STAGE3=$DATA/stage3
- DATA_SNAPSHOT=$DATA/snapshot/usr
- DATA_SNAPS=$DATA/snaps
- # list of temporary directories (are stored in DATA_TMP)
- TMP_DIRS="tmp var/tmp"
- }
- function init {
- setup_vars $1
- if [ -z $DSTPATH ]; then
- echo ERROR: Please specify path!
- usage
- return
- fi
- echo "Creating directory $DSTPATH (if it does not already exists)..."
- mkdir -p $DSTPATH
- mkdir -p $ROOT
- rm -Rf $DATA
- mkdir -p $DATA_SNAPS
- mkdir -p $DATA_STAGE3
- mkdir -p $DATA_SNAPSHOT
- mkdir -p $DISTFILES/usr/portage/distfiles
- # get and unpack stage3
- if [ ! -e $STAGE3 ]; then
- echo Downloading latest stage3...
- wget $STAGE3_URL -O $STAGE3
- fi
- echo tar xjvpf -C $DATA_STAGE3 $STAGE3
- tar xjvpf $STAGE3 -C $DATA_STAGE3
- # get and unpack portage snapshot
- if [ ! -e $SNAPSHOT ]; then
- echo Downloading latest Portage snapshot...
- wget $SNAPSHOT_URL -O $SNAPSHOT
- fi
- tar xjvpf $SNAPSHOT -C $DATA_SNAPSHOT
- }
- function prepare_chroot {
- echo "Preparing chroot..."
- # prepare cleanup trap
- trap cleanup_chroot ERR
- # build unionfs args
- # standard dirs
- FS=""
- FS="$FS:$DATA_SNAPSHOT/..=RO" # portage needs to be in /usr, thats why '..'
- FS="$FS:$DATA_STAGE3=RO"
- FS="$FS:$DISTFILES=RW"
- # append existings snaps
- SNAP_LIST=`ls -1 $DATA_SNAPS | sort -n`
- for i in $SNAP_LIST; do FS="$DATA_SNAPS/$i=RO:$FS"; done
- # create new snap
- LAST_SNAP=`ls -1 $DATA_SNAPS | sort -n | tail -n 1 | awk -F- {'print $1'}`
- NEWSNAP=$DATA_SNAPS/$[$LAST_SNAP + 1]
- mkdir $NEWSNAP
- FS="$NEWSNAP=RW:$FS:"
- # some output
- echo Using these overlays:
- echo "$FS" | tr : '\n'
- unionfs-fuse -o cow $FS $ROOT
- # mount standard directories
- mount -t proc proc $ROOT/proc
- mount -o bind /dev $ROOT/dev
- cp -L /etc/resolv.conf $ROOT/etc/
- }
- function cleanup_chroot {
- if [ -z $CLEANING_UP ]; then
- set -e
- CLEANING_UP=1
- umount $ROOT/proc
- umount $ROOT/dev
- umount $ROOT
- set +e
- fi
- }
- function enter {
- setup_vars $1
- prepare_chroot
- chroot $ROOT /bin/bash
- cleanup_chroot
- }
- ### main ###
- # check if root
- if [ `id -u` -ne 0 ]; then
- echo "Please start this program as root!"
- exit
- fi
- # check if any parameter is given
- if [ $# == 0 ]; then
- usage
- exit
- fi
- # dispatch
- case $1 in
- init)
- init $2;;
- enter)
- enter $2;;
- *)
- usage;;
- esac
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement