Создание livecd с существующей системы |
---|
Автор: Pasha
Дата написания: Сентябрь 2015 г.
[ 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 не принес результатов и я решил «забить» т.к. оперативной памяти для моих нужд вполне достаточно.
Написано по:
На виртуалку ставим 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/
переключаемся на нужную нам ветку
# 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
# 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
# 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 (не забываем сделать его исполняемым)
#!/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
# 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
На новую виртуалку ставим 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/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 раза в год.