Собирать будем из бинарных пакетов

export ACCEPT_KEYWORDS="amd64"
export PORTAGE_BINHOST="ssh:///var/binpkgs/"
export ROOT=<где собираем>

Для удобства обслуживания - всё будет происходить под управлением git

mkdir -p $ROOT
git init $ROOT

Далее создаём базовую структуру каталогов и устанавливаем «минимум необходимого

USE="build" emerge --root=$ROOT -O baselayout
MAKEDEV -d $ROOT/dev console hda input ptmx std sd tty
rm -f $ROOT/dev/fd[0-9]*
rm -f $ROOT/dev/sd[a-d][a-z]* $ROOT/dev/sd[e-z]*
rm -f $ROOT/dev/tty[a-zA-Z]*

emerge --root=$ROOT -gK openrc vim bash vixie-cron gpm udev file findutils gawk grep \
groff iproute2 man man-pages-ru net-tools pciutils \
sed shadow usbutils util-linux which syslog-ng screen nfs-utils openssh wget socat rsync ntp \
gcc tar util-linux shadow udev procps psmisc cracklib gzip kbd dhcp

далее можно поставить всё что угодно, по желанию

emerge --root=$ROOT -gK <ваши пакеты>

почистим ненужный мусор

rm -rf $ROOT/var/tmp/*
rm -rf $ROOT/var/cache/*
rm -rf $ROOT/var/db
rm -rf $ROOT/tmp/*
rm -f $ROOT/etc/mtab
touch $ROOT/etc/mtab
rm -rf $ROOT/etc/portage
rm -rf $ROOT/usr/share/doc
rm -rf $ROOT/usr/src/

Далее по стандартному пути, можно сделать chroot, сменить пароль рута, прописать сервисы в автозагрузку,итд.

mount -o bind /dev $ROOT/dev
mount -t proc none $ROOT/proc
chroot $ROOT /bin/bash
<конфигурируем>
umount $ROOT/dev
umount $ROOT/proc
rm $ROOT/root/.bash_history

В сторонке можно нужно собрать ядро. Проще всего сделать это genkernel.Как то так.

rm -f /var/tmp/genkernel/*
genkernel --no-install --all-ramdisk-modules --kerneldir= --e2fsprogs --disklabel --oldconfig --busybox all --unionfs --menuconfig all

забрать результат работы можно будет в /var/tmp/genkernel/ модули поставим вручную.

cd
INSTALL_MOD_PATH=$ROOT make modules_install

создадим структуру livecd

mkdir -p ./target/boot/grub
cp /var/tmp/genkernel/initramfs* ./target/
cp /var/tmp/genkernel/kernel* ./target/
cp /var/tmp/genkernel/System* ./target/
touch ./target/livecd

создаём конфиг grub2 в ./target/boot/grub/grub.cfg, примерно следующего содержания:

set default="0"
loadfont unicode
set gfxmode=800x600x32
insmod vbe
insmod vga
insmod gfxterm
set locale_dir=$prefix/locale
set lang=ru_RU
insmod gettext

terminal_output gfxterm
set timeout=2

menuentry 'Linux livecd' {
set gfxpayload=keep
insmod gzio
insmod part_msdos
insmod ext2
set root='cd,msdos1'
echo 'Загружается Linux '
linux (cd)/kernel-genkernel root=/dev/ram0 ro real_root=/dev/loop0 looptype=squashfs loop=/root.fs cdroot video=vesafb:ywrap,mtrr:3 console=tty1 quiet net.ifnames=0
echo 'Загружается начальный виртуальный диск …'
initrd (cd)/initramfs
}

теперь всё упаковываем и собираем итоговый образ.

echo ".git" > exclude.files
mksquashfs $ROOT ./target/root.fs -comp xz -ef exclude.files
grub2-mkrescue -d /usr/lib64/grub/i386-pc/ --modules="boot cat cpuid disk echo font file fshelp gettext gfxmenu gfxterm gfxterm_menu halt help iso9660 linux loopback ls lspci msdospart normal squash4 terminal vbe vga video xzio" -o cdrom.iso ./target