Как стать автором
Обновить

Простая кастомизация Ubuntu LiveCD

Настройка Linux *
Данный топик описывает простую и быструю кастомизацицию Ubuntu LiveCD.
Включает в себя:
— установку дополнительных пакетов
— настройку прокси сервера и TimeZone

Несколько раз мне уже приходилось собирать свой LiveCD. Один для загрузки по сети с набором необходимых инструментов, другой для записи на DVD с полной поддержкой японского языка и дополнительного ПО. При сборке я руководствовался вот этой ссылкой https://help.ubuntu.com/community/LiveCDCustomization. Всё выходило замечательно за исключением затраченного времени. Такая ручная сборка иногда может занять несколько часов, особенно если предыдущая делалась достаточно давно.

В последний раз я решил не собирать руками а воспользоваться описанной на Хабре Ubuntu Customization Kit (http://habrahabr.ru/blogs/ubuntu/77331). К сожалению на тот момент, а это было несколько дней назад, версия 2.0.12 не заработала (ругается на отмонтирование .gvfs) на Ubuntu 10.04. Версия из trunk-а, на которую я возлагал надежды, так же не заработала, но уже с другой ошибкой.

В результате я решил больше не возиться с Ubuntu Customization Kit, а написать свой скрипт на основе WIKI статьи с help.ubuntu.com, который покрывает мои потребности и следует принципу KISS. Рабочая версия скрипта и описание под катом.


ubuntu-iso-customization.sh


#!/bin/bash

# get configuration from the file
[ -n "$1" ] && [ -f "$1" ] && source "$1" || exit 1

# prepare
trap "exit 1" INT
ISOMNTDIR=$LIVEDIR/mnt
EXTRACTDIR=$LIVEDIR/extract-cd
EDITDIR=$LIVEDIR/edit
sudo aptitude install -y squashfs-tools genisoimage || exit 1

# mount livecd
mkdir $LIVEDIR && cd $LIVEDIR || exit 1
mkdir $ISOMNTDIR || exit 1
sudo mount -o loop $ISODIR/ubuntu-${VERSION}.iso $ISOMNTDIR || exit 1

# extract squashfs
mkdir $EXTRACTDIR || exit 1
rsync --exclude=/casper/filesystem.squashfs -a $ISOMNTDIR/ $EXTRACTDIR
sudo unsquashfs $ISOMNTDIR/casper/filesystem.squashfs
sudo mv squashfs-root $EDITDIR

# umount livecd
sudo umount $ISOMNTDIR

# copy resolv.conf
sudo cp /etc/resolv.conf $EDITDIR/etc/

# mount dev
sudo mount --bind /dev/ $EDITDIR/dev

# configure new live cd
[ -n "$PROXY" ] && echo -e "$PROXY" | sudo tee -a $EDITDIR/etc/environment
[ -n "$TIMEZONE" ] && echo "TZ=$TIMEZONE" | sudo tee -a $EDITDIR/etc/environment

# create customization script and run it in chroot
cat >> $EDITDIR/tmp/customize.sh << EOF
#!/bin/bash

# mount proc, sysfs, devpts
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devpts none /dev/pts

# prepare choot
export HOME=/root
export LC_ALL=C
dpkg-divert --local --rename --add /sbin/initctl
ln -s /bin/true /sbin/initctl

# install packages
( which software-properties-gtk && software-properties-gtk -e universe && software-properties-gtk -e multiverse ) || \
( which software-properties-kde && software-properties-kde -e universe && software-properties-kde -e multiverse ) || \
sudoedit /etc/apt/sources.list
aptitude update
[ "$UPTODATE" -eq "1" ] && aptitude full-upgrade -y
aptitude install -Ry $PACKAGES

# clean
aptitude clean
rm -rf /tmp/* ~/.bash_history
rm /etc/resolv.conf
rm /sbin/initctl
dpkg-divert --rename --remove /sbin/initctl

# umount proc, sysfs, devpts
umount /proc
umount /sys
umount /dev/pts

# exit from chroot
exit
EOF

# make customization script executable
chmod +x $EDITDIR/tmp/customize.sh

# chroot and run customization script
sudo chroot $EDITDIR su -lc /tmp/customize.sh

# umount dev
sudo umount $EDITDIR/dev

# regenerate manifest
chmod +w $EXTRACTDIR/casper/filesystem.manifest
sudo chroot $EDITDIR dpkg-query -W --showformat='${Package} ${Version}\n' > $EXTRACTDIR/casper/filesystem.manifest
sudo cp $EXTRACTDIR/casper/filesystem.manifest $EXTRACTDIR/casper/filesystem.manifest-desktop
sudo sed -i '/ubiquity/d' $EXTRACTDIR/casper/filesystem.manifest-desktop
sudo sed -i '/casper/d' $EXTRACTDIR/casper/filesystem.manifest-desktop

# compress filesystem
[ -f $EXTRACTDIR/casper/filesystem.squashfs ] && \
	 sudo rm $EXTRACTDIR/casper/filesystem.squashs
sudo mksquashfs $EDITDIR $EXTRACTDIR/casper/filesystem.squashfs

# set an image name in $EXTRACTDIR/README.diskdefines
sudoedit $EXTRACTDIR/README.diskdefines

# remove old md5sum.txt and calculate new md5 sums
cd $EXTRACTDIR
sudo rm md5sum.txt
find -type f -print0 | sudo xargs -0 md5sum | grep -v isolinux/boot.cat | sudo tee md5sum.txt

# create iso
sudo mkisofs -D -r -V "$IMAGE_NAME" -cache-inodes -J -l -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o ../ubuntu-$VERSION-custom.iso .


config_example


VERSION=10.04-desktop-i386		# Ubuntu LiveCD version
ISODIR=/mnt/iso				# Path to original ISO
LIVEDIR=/mnt/live			# Directory for building

PACKAGES="mc htop testdisk chntpw"	# Packages that have to be installed
UPTODATE=0				# Whether "aptitude full-upgrade" have to be done
TIMEZONE="Europe/Moscow"		# Time Zone

PROXY="http_proxy=http://172.18.0.1:3128\nftp_proxy=http://172.18.0.1:3128"   # Proxy server configuration


Описание



Запуск:
  1. Необходимо загрузиться с LiveCD (хотя с LiveCD вовсе необязательно).
  2. Примонтировать файловую систему ext3 или ext4, на которой свободно хотя бы 5Gb.
  3. Сделать себя владельцем директории в которой будем собирать новый образ (LIVEDIR).
  4. Изменить config_example под свои нужды.
  5. Запустить: ubuntu-iso-customization.sh config_example.


Конфиг содержит:
  1. Версию LiveCD.
  2. Директорию где лежит оригинальный ISO.
  3. Директорию для сборки (дожна быть примонтирована с опциями exec и dev, команда mount делает это по умолчанию).
  4. Список пакетов, которые необходимо установить.
  5. Ключ UPTODATE, который говорит о том, нужно ли обновить все пакеты до текущих версий в репозитории.
  6. Time Zone


Как работает:
  1. Монтирует образ.
  2. Копирует filesystem.squashfs и распаквывает.
  3. Chroot-тится в распакованный filesystem.squashfs, выполняет установку пакетов, настройку прокси и Time Zone.
  4. Запаковывает то, что у нас получилось в новый filesystem.squashfs.
  5. Собирает новый iso.


Проверено в Ubuntu 10.04 Desktop i386

Комментарии, пожелания, предложения?
Теги:
Хабы:
Всего голосов 69: ↑49 и ↓20 +29
Просмотры 17K
Комментарии Комментарии 42