Содержание

Создание livecd с существующей системы

Автор: Pasha
Дата написания: Сентябрь 2015 г.

В созданном livecd может использоваться zram для swap и он используется если модуль zram установлен в системе, с которой создается livecd. Но, к сожалению, в Salix 14.1 этот модуль по умолчанию не собран (в Salix 14.0 собран). Я пытался собрать его и он собирается, но не загружается в ядро ругаясь в dmesg:
[ 1291.921639] zram: Unknown symbol zs_unmap_object (err 0)
[ 1291.921665] zram: Unknown symbol zs_create_pool (err 0)
[ 1291.921675] zram: Unknown symbol zs_free (err 0)
[ 1291.921684] zram: Unknown symbol zs_malloc (err 0)
[ 1291.921688] zram: Unknown symbol zs_get_total_size_bytes (err 0)
[ 1291.921693] zram: Unknown symbol zs_destroy_pool (err 0)
[ 1291.921699] zram: Unknown symbol zs_map_object (err 0)

Беглый поиск в google не принес результатов и я решил «забить» т.к. оперативной памяти для моих нужд вполне достаточно.

Написано по:

Общая картина состоит из двух этапов:

1-ый этап:

  1. Создаем виртуальную машину, на которой собираем ядро с необходимыми патчами.
  2. Собираем модуль ядра и утилиты к нему.
  3. Перегружаемся с новым ядром, пробуем загрузить собранный модуль.
  4. Если модуль загрузился, то собираем пакеты (по слакбилдам) с новым ядром, модулем, утилитами и заголовками ядра.

2-ой этап:

  1. Создаем виртуальную машину и устанавливаем на нее минимальную установку Salix. Можно и не минимальную, главное чтобы Salix была той же версии, на которой проходил первый этап.
  2. Устанавливаем созданные нами пакеты и грузимся с новым ядром.
  3. Пробуем загрузить установленный нами модуль.
  4. Если модуль загрузился, то настраиваем виртуалку как нам надо, т.е. ставим/удаляем нужный софт, производим настройку дистрибутива.
  5. Создаем livecd с настроенной виртуалки.
Можно обойтись и без второй виртуалки и создать livecd с виртуалки, на которой собирали ядро и модуль, предварительно удалив исходники ядра для уменьшения размера и каждый раз, когда понадобится новый livecd патчить ядро и собирать модуль. Но, как мне кажется, удобней создать готовые пакеты с ядром, модулем, утилитами, заголовками ядра и накатывать их на свежую установку любимого дистрибутива Slackware (в данном случае Salix).

Подробное описание каждого этапа

1-ый этап:

На виртуалку ставим Salix 14.1 с набором пакетов CORE
заходим на нее и обновляем список пакетов

# cd ~
# slapt-get --update

ставим исходники ядра

# slapt-get -i kernel-source

ставим пакет bc (нужен для сборки ядра (не уверен), но даже если и не нужен, то лишним не будет)

# slapt-get -i bc

качаем исходники модуля aufs

# git clone git://git.code.sf.net/p/aufs/aufs3-standalone
# cd ./aufs3-standalone/

переключаемся на нужную нам ветку

В README по выбору нужной ветки сказано, что нужно переключаться на ветку соответсвующую версии ядра. У нас версия ядра 3.10.17, веток для нее две: origin/aufs3.10 и origin/aufs3.10.x
Казалось бы, нам нужна ветка origin/aufs3.10.x , но патчи из этой ветки не накладываются на ядро, поэтому мы берем ветку origin/aufs3.10, патчи из которой ложатся на наше ядро без проблем.
# git checkout origin/aufs3.10

копируем патчи для ядра

# cp ./aufs3-base.patch /usr/src/linux/
# cp ./aufs3-mmap.patch /usr/src/linux/
# cp ./aufs3-standalone.patch /usr/src/linux/

переходим в каталог с исходниками ядра и накатываем патчи

# cd /usr/src/linux/
# patch -p1 < ./aufs3-base.patch
# patch -p1 < ./aufs3-mmap.patch
# patch -p1 < ./aufs3-standalone.patch

копируем конфиг ядра (патчи, что мы накатили выше, не трогают файл .config)

# cat /boot/config >/usr/src/linux/.config

собираем ядро

# make

копируем новое ядро, System.map и .config в /boot

# cp ./arch/x86/boot/bzImage /boot/vmlinuz-aufs-huge-smp-3.10.17-smp
# cp ./System.map /boot/System.map-aufs-huge-smp-3.10.17-smp
# cp ./.config /boot/config-aufs-huge-smp-3.10.17-smp

удаляем старые ссылки и создаем новые

# rm /boot/vmlinuz
# rm /boot/System.map
# rm /boot/config
# ln -s /boot/vmlinuz-aufs-huge-smp-3.10.17-smp /boot/vmlinuz
# ln -s /boot/System.map-aufs-huge-smp-3.10.17-smp /boot/System.map
# ln -s /boot/config-aufs-huge-smp-3.10.17-smp /boot/config

перезаписываем загрузчик

# lilo

ставим заголовки ядра и перегружаемся с новым ядром

# make headers_install
# reboot

собираем модуль ядра aufs.ko

# cd ~/aufs3-standalone/
# make
# make install
По умолчанию модуль aufs.ko ставится в /lib/modules/3.10.17-smp/extra/aufs.ko, но скрипты для сборки livecd ищут его в /lib/modules/3.10.17-smp/kernel/fs/aufs, поэтому если вы планируете делать livecd с этой виртуалки, то надо положить модуль в нужное место. Если же вы не планируете делать livecd с этой виртуалки, то делать следующий шаг не обязательно.
# mkdir -p /lib/modules/3.10.17-smp/kernel/fs/aufs
# cp ./aufs.ko /lib/modules/3.10.17-smp/kernel/fs/aufs/
# rm  /lib/modules/3.10.17-smp/extra/aufs.ko
# depmod -a

проверяем загружается ли модуль

# modprobe aufs
# lsmod | grep aufs
aufs                  241031  0 

модуль загружен и теперь собираем утилиты для aufs
качаем исходники утилит

# cd ~
# git clone git://git.code.sf.net/p/aufs/aufs-util
# cd ./aufs-util/

переключаемся на нужную нам ветку

# git checkout origin/aufs3.9

собираем утилиты

# make CPPFLAGS="-I /usr/src/linux/usr/include -I /root/aufs3-standalone/usr/include"
# make install
На этом, подготовка к созданию livecd закончена и если вы планируете делать livecd с этого дистрибутива, то можно настраивать дистрибутив как вам нужно и затем переходить к созданию livecd из второго этапа.

Собирем готовые пакеты с новым ядром, модулем, утилитами и заголовками ядра

Собираем пакет с ядром

# cd ~
# mkdir kernel-aufs-huge-smp
# cd ./kernel-aufs-huge-smp/
# mkdir kernel-aufs-huge-smp-3.10.17-smp

скопируем ядро

# cp /boot/vmlinuz-aufs-huge-smp-3.10.17-smp ./kernel-aufs-huge-smp-3.10.17-smp/
# cp /boot/System.map-aufs-huge-smp-3.10.17-smp ./kernel-aufs-huge-smp-3.10.17-smp/
# cp /boot/config-aufs-huge-smp-3.10.17-smp ./kernel-aufs-huge-smp-3.10.17-smp/

создадим файл ./doinst.sh

( cd boot ; rm -rf config )
( cd boot ; ln -sf config-aufs-huge-smp-3.10.17-smp config )
( cd boot ; rm -rf System.map )
( cd boot ; ln -sf System.map-aufs-huge-smp-3.10.17-smp System.map )
( cd boot ; rm -rf vmlinuz )
( cd boot ; ln -sf vmlinuz-aufs-huge-smp-3.10.17-smp vmlinuz )

создадим файл ./slack-desc

# HOW TO EDIT THIS FILE:
# The "handy ruler" below makes it easier to edit a package description.  Line
# up the first '|' above the ':' following the base package name, and the '|'
# on the right side marks the last column you can put a character in.  You must
# make exactly 11 lines for the formatting to be correct.  It's also
# customary to leave one space after the ':'.

                    |-----handy-ruler------------------------------------------------------|
kernel-aufs-huge-smp: kernel-aufs-huge-smp (aufs - http://aufs.sourceforge.net/)
kernel-aufs-huge-smp: 
kernel-aufs-huge-smp: This is a Linux kernel with built-in support for most disk
kernel-aufs-huge-smp: controllers.  If you're looking for a more stripped down kernel
kernel-aufs-huge-smp: (this one contains everything but the kitchen sink ;-), then install
kernel-aufs-huge-smp: the kernel-generic-smp in the /boot directory along with an initrd to
kernel-aufs-huge-smp: load support for your boot device and filesystem.  For instructions
kernel-aufs-huge-smp: on the initrd, see README.initrd in the /boot directory.
kernel-aufs-huge-smp: 
kernel-aufs-huge-smp: SMP is "Symmetric multiprocessing", or multiple CPU/core support.
kernel-aufs-huge-smp: 

создадим слакбилд ./kernel-aufs-huge-smp.SlackBuild (не забываем сделать его исполняемым)

#!/bin/sh
 
PRGNAM=kernel-aufs-huge-smp
VERSION=${VERSION:-3.10.17-smp}
BUILD=${BUILD:-1}
TAG=${TAG:-_krpsh}
 
if [ -z "$ARCH" ]; then
  case "$( uname -m )" in
      i?86) ARCH=i486 ;;
      arm*) ARCH=arm ;;
         *) ARCH=$( uname -m ) ;;
  esac
fi
 
CWD=$(pwd)
TMP=${TMP:-/tmp/krpsh}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}
 
if [ "$ARCH" = "i486" ]; then
  SLKCFLAGS="-O2 -march=i486 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
  SLKCFLAGS="-O2 -march=i686 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
  SLKCFLAGS="-O2 -fPIC"
  LIBDIRSUFFIX="64"
else
  SLKCFLAGS="-O2"
  LIBDIRSUFFIX=""
fi
 
set -e
 
rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
 
mkdir -p $PKG/boot
cp -a $CWD/$PRGNAM-$VERSION/System.map-aufs-huge-smp-3.10.17-smp $PKG/boot
cp -a $CWD/$PRGNAM-$VERSION/config-aufs-huge-smp-3.10.17-smp $PKG/boot
cp -a $CWD/$PRGNAM-$VERSION/vmlinuz-aufs-huge-smp-3.10.17-smp $PKG/boot
 
cd $PKG
chown -R root:root .
chmod -R u+w,go+r-w,a-s .
 
# Add docs to the proper location
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
#cp -a README $PKG/usr/doc/$PRGNAM-$VERSION
 
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
 
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
cat $CWD/doinst.sh > $PKG/install/doinst.sh
 
#cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-tgz}

собираем пакет

# ./kernel-aufs-huge-smp.SlackBuild
Собираем пакет с заголовками ядра
# cd ~
# mkdir kernel-aufs-headers
# cd ./kernel-aufs-headers/

создадим файл ./doinst.sh

( cd usr/include ; rm -rf asm )
( cd usr/include ; ln -sf asm-x86 asm )

создадим файл ./slack-desc

# HOW TO EDIT THIS FILE:
# The "handy ruler" below makes it easier to edit a package description.  Line
# up the first '|' above the ':' following the base package name, and the '|'
# on the right side marks the last column you can put a character in.  You must
# make exactly 11 lines for the formatting to be correct.  It's also
# customary to leave one space after the ':'.

                   |-----handy-ruler------------------------------------------------------|
kernel-aufs-headers: kernel-aufs-headers (aufs - http://aufs.sourceforge.net/)
kernel-aufs-headers: 
kernel-aufs-headers: These are the include files from the Linux kernel.
kernel-aufs-headers: 
kernel-aufs-headers: You'll need these to compile most system software for Linux.
kernel-aufs-headers: 
kernel-aufs-headers: 
kernel-aufs-headers: 
kernel-aufs-headers: 
kernel-aufs-headers: 
kernel-aufs-headers: 

создадим слакбилд ./kernel-aufs-headers.SlackBuild (не забываем сделать его исполняемым)

При установке заголовков ядра «make headers_install» папка «/usr/include/asm-x86» не создается, но создается папка «/usr/include/asm», а в slackware при установки пакета kernel-headers-3.10.17_smp-x86-3.txz папка «/usr/include/asm» является ссылкой на «/usr/include/asm-x86» и поэтому в слакбилде папка «/usr/include/asm» переименовывается в «/usr/include/asm-x86»
#!/bin/sh
 
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
LINUXSRC=/usr/src/linux
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
PRGNAM=kernel-aufs-headers
VERSION=${VERSION:-3.10.17}
BUILD=${BUILD:-1}
TAG=${TAG:-_krpsh}
 
if [ -z "$ARCH" ]; then
  case "$( uname -m )" in
      i?86) ARCH=i486 ;;
      arm*) ARCH=arm ;;
         *) ARCH=$( uname -m ) ;;
  esac
fi
 
CWD=$(pwd)
TMP=${TMP:-/tmp/krpsh}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}
 
if [ "$ARCH" = "i486" ]; then
  SLKCFLAGS="-O2 -march=i486 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
  SLKCFLAGS="-O2 -march=i686 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
  SLKCFLAGS="-O2 -fPIC"
  LIBDIRSUFFIX="64"
else
  SLKCFLAGS="-O2"
  LIBDIRSUFFIX=""
fi
 
set -e
 
rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
 
cd $LINUXSRC
mkdir -p $PKG/usr
make headers_install INSTALL_HDR_PATH=$PKG/usr
 
##########################################
mv $PKG/usr/include/asm $PKG/usr/include/asm-x86
##########################################
 
# Add docs to the proper location
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
 
#cp -a COPYING README sample $PKG/usr/doc/$PRGNAM-$VERSION
 
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
 
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
cat $CWD/doinst.sh > $PKG/install/doinst.sh
 
 
cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-tgz}

собираем пакет

# ./kernel-aufs-headers.SlackBuild
осталось собрать два пакета :-)
Cобираем модуль ядра в пакет
# cd ~
# mkdir aufs3-standalone_SlackBuild
# cd ./aufs3-standalone_SlackBuild/

создадим папку для модуля и скопируем нужные файлы

# mkdir aufs3-standalone-3.10-20141215
# cp -a ~/aufs3-standalone/Documentation ./aufs3-standalone-3.10-20141215/
# cp -a ~/aufs3-standalone/COPYING ./aufs3-standalone-3.10-20141215/
# cp -a ./aufs3-standalone-3.10-20141215/Documentation/filesystems/aufs/README ./aufs3-standalone-3.10-20141215/
# cp -a ~/aufs3-standalone/aufs.ko ./aufs3-standalone-3.10-20141215/
# cp -a ~/aufs3-standalone/aufs3-base.patch ./aufs3-standalone-3.10-20141215/
# cp -a ~/aufs3-standalone/aufs3-mmap.patch ./aufs3-standalone-3.10-20141215/
# cp -a ~/aufs3-standalone/aufs3-standalone.patch ./aufs3-standalone-3.10-20141215/

создадим файл ./slack-desc

# HOW TO EDIT THIS FILE:
# The "handy ruler" below makes it easier to edit a package description.  Line
# up the first '|' above the ':' following the base package name, and the '|'
# on the right side marks the last column you can put a character in.  You must
# make exactly 11 lines for the formatting to be correct.  It's also
# customary to leave one space after the ':'.

                |-----handy-ruler------------------------------------------------------|
aufs3-standalone: kernel module aufs - http://aufs.sourceforge.net/
aufs3-standalone: 
aufs3-standalone: advanced multi layered unification filesystem
aufs3-standalone: http://aufs.sf.net
aufs3-standalone: Junjiro R. Okajima
aufs3-standalone: 
aufs3-standalone: 
aufs3-standalone: 
aufs3-standalone: 
aufs3-standalone: 
aufs3-standalone: 

создадим слакбилд ./aufs3-standalone.SlackBuild (не забываем сделать его исполняемым)

#!/bin/sh
 
PRGNAM=aufs3-standalone
VERSION=${VERSION:-3.10-20141215}
BUILD=${BUILD:-1}
TAG=${TAG:-_krpsh}
 
if [ -z "$ARCH" ]; then
  case "$( uname -m )" in
      i?86) ARCH=i486 ;;
      arm*) ARCH=arm ;;
         *) ARCH=$( uname -m ) ;;
  esac
fi
 
CWD=$(pwd)
TMP=${TMP:-/tmp/krpsh}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}
 
if [ "$ARCH" = "i486" ]; then
  SLKCFLAGS="-O2 -march=i486 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
  SLKCFLAGS="-O2 -march=i686 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
  SLKCFLAGS="-O2 -fPIC"
  LIBDIRSUFFIX="64"
else
  SLKCFLAGS="-O2"
  LIBDIRSUFFIX=""
fi
 
set -e
 
rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
 
mkdir -p $PKG/lib/modules/$(uname -r)/kernel/fs/aufs
cp -a $CWD/$PRGNAM-$VERSION/aufs.ko $PKG/lib/modules/$(uname -r)/kernel/fs/aufs
 
cd $PKG
chown -R root:root .
chmod -R u+w,go+r-w,a-s .
 
 
# Add docs to the proper location
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
cd $CWD/$PRGNAM-$VERSION
cp -a COPYING Documentation README aufs3-base.patch aufs3-mmap.patch aufs3-standalone.patch $PKG/usr/doc/$PRGNAM-$VERSION
 
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
 
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
#cat $CWD/doinst.sh > $PKG/install/doinst.sh
 
cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-tgz}

собираем пакет

# ./aufs3-standalone.SlackBuild
собираем утилиты для модуля в пакет
# cd ~
# mkdir aufs-util_SlackBuild
# cd ./aufs-util_SlackBuild/

создадим файл ./slack-desc

# HOW TO EDIT THIS FILE:
# The "handy ruler" below makes it easier to edit a package description.  Line
# up the first '|' above the ':' following the base package name, and the '|'
# on the right side marks the last column you can put a character in.  You must
# make exactly 11 lines for the formatting to be correct.  It's also
# customary to leave one space after the ':'.

         |-----handy-ruler------------------------------------------------------|
aufs-util: util for kernel module aufs - http://aufs.sourceforge.net/
aufs-util: 
aufs-util: advanced multi layered unification filesystem
aufs-util: http://aufs.sf.net
aufs-util: Junjiro R. Okajima
aufs-util: 
aufs-util: 
aufs-util: 
aufs-util: 
aufs-util: 
aufs-util: 

создадим слакбилд ./aufs-util.SlackBuild (не забываем сделать его исполняемым)

#!/bin/sh
 
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
MAKEDIR=/root/aufs-util
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
PRGNAM=aufs-util
VERSION=${VERSION:-20141208}
BUILD=${BUILD:-1}
TAG=${TAG:-_krpsh}
 
if [ -z "$ARCH" ]; then
  case "$( uname -m )" in
      i?86) ARCH=i486 ;;
      arm*) ARCH=arm ;;
         *) ARCH=$( uname -m ) ;;
  esac
fi
 
CWD=$(pwd)
TMP=${TMP:-/tmp/krpsh}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}
 
if [ "$ARCH" = "i486" ]; then
  SLKCFLAGS="-O2 -march=i486 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
  SLKCFLAGS="-O2 -march=i686 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
  SLKCFLAGS="-O2 -fPIC"
  LIBDIRSUFFIX="64"
else
  SLKCFLAGS="-O2"
  LIBDIRSUFFIX=""
fi
 
set -e
 
rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
 
cd $MAKEDIR
make install DESTDIR=$PKG
 
 
# Add docs to the proper location
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
 
cp -a COPYING README sample $PKG/usr/doc/$PRGNAM-$VERSION
 
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
 
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
#cat $CWD/doinst.sh > $PKG/install/doinst.sh
 
###--------gz man page---------
cd $PKG/usr/share/man/man5
for file in * 
do
	gzip ./$file 
done
 
cd $PKG/usr/share/man/man8
for file in * 
do
	gzip ./$file 
done
###----------------------------
 
cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-tgz}

собираем пакет

# ./aufs-util.SlackBuild


В результате сборки у нас появится 4 пакета, которые мы и будем устанавливать на втором этапе.

# ls -l /tmp/ | grep aufs
-rw-r--r-- 1 root root 1669979 Sep  7 14:13 aufs-util-20141208-i486-1_krpsh.tgz
-rw-r--r-- 1 root root  181737 Sep  7 14:08 aufs3-standalone-3.10-20141215-i486-1_krpsh.tgz
-rw-r--r-- 1 root root  899340 Sep  7 13:51 kernel-aufs-headers-3.10.17-i486-1_krpsh.tgz
-rw-r--r-- 1 root root 6972133 Sep  7 13:27 kernel-aufs-huge-smp-3.10.17-smp-i486-1_krpsh.tgz

2-ой этап:

На новую виртуалку ставим Salix 14.1 с набором пакетов CORE и уcтанавливаем созданные нами пакеты

# installpkg aufs-util-20141208-i486-1_krpsh.tgz
# installpkg aufs3-standalone-3.10-20141215-i486-1_krpsh.tgz
# installpkg kernel-aufs-headers-3.10.17-i486-1_krpsh.tgz
# installpkg kernel-aufs-huge-smp-3.10.17-smp-i486-1_krpsh.tgz

создаем modules.dep

# depmod -a

обновляем загрузчик

# lilo

перегружаемся с новым ядром и пробуем загрузить модуль

# modprobe aufs
# lsmod | grep aufs
aufs                  241031  0 

Если модуль загрузился, то настраиваем дистрибутив как надо, т. е. ставим/удаляем нужный софт, производим настройку конфигов.
Как только все настроили и проверили создаем livecd:

установим зависимость скриптов (squashfs-tools)

# wget http://slackonly.com/pub/packages/14.1-x86/system/squashfs-tools/squashfs-tools-4.2-i486-1_slack.txz
# installpkg squashfs-tools-4.2-i486-1_slack.txz

качаем скрипты для сбрки livecd

# cd /tmp
# wget -O Linux_Live_Kit_v1_8.tar.gz https://github.com/Tomas-M/linux-live/tarball/v1.8
# tar -xzvf ./Linux_Live_Kit_v1_8.tar.gz
# cd ./Tomas-M-linux-live-783a0bb/
На скрипт ./initramfs/initramfs_create нужно наложить патч, который учитывает, что aufs собран модулем. Странно, что исходный скрипт этого не делает.

создадим файл ./initramfs/add_mod_aufs.patch

--- ./a/initramfs_create	2015-09-04 09:19:09.200234897 +0300
+++ ./b/initramfs_create	2015-09-03 14:04:39.000000000 +0300
@@ -68,6 +68,9 @@
 
 # TODO: add all comon filesystems which are NOT compiled in kernel already
 copy_including_deps /$LMK/kernel/fs/squashfs
+###### krpsh ###########################
+copy_including_deps /$LMK/kernel/fs/aufs
+########################################
 copy_including_deps /$LMK/kernel/drivers/staging/zsmalloc # needed by zram
 copy_including_deps /$LMK/kernel/drivers/staging/zram
 copy_including_deps /$LMK/kernel/drivers/block/loop.*

наложим патч

# cd ./initramfs/
# patch -p2 < ./add_mod_aufs.patch
# cd ..

создадим livecd

# ./build

в результате у нас создадутся два файла

# ls -lh /tmp/ | grep mylinux
-rw-r--r-- 1 root root 256M Sep  7 15:44 mylinux-i686.iso
-rw-r--r-- 1 root root 256M Sep  7 15:44 mylinux-i686.zip

mylinux-i686.iso - для записи на cd диск
mylinux-i686.zip - для создания загрузочной флешки (не пробовал)

степень сжатия очень хорошая
исходный размер системы, с которой делался licecd

# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       4.4G  1.1G  3.1G  25% /
tmpfs           241M     0  241M   0% /dev/shm

т.е. исходный размер 1.1G , а livecd получился 256M

Заключение

Вы можете подумать, а для чего создавать свой livecd, когда есть куча готовых «живых» дистрибутивов под любые нужды. Причины могут быть самыми разными: от «мне так хочется» до «есть свободное время». Я же, использую созданный таким образом livecd на бездисковом серваке, который раздает по iscsi жесткие диски для камер наблюдения.

При загрузки с этого livecd можно устанавливать пакеты и менять конфиги, но как вы понимаете, все изменения сохраняются до первой перезагрузки. И поэтому, например для конфигов, можно использовать флешку, поскольку конфиги в основном читаются в момент старта программы, то флешка будет почти вечной при условии не частого изменения конфигов и перезагрузки сервака 1-2 раза в год.