Убунтариум

индекс
253,47

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

Данный топик описывает простую и быструю кастомизацицию 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

Комментарии, пожелания, предложения?
+29
8 мая 2010, 20:17
45

комментарии (42)

НЛО прилетело и опубликовало эту надпись здесь
+3
giner #
Проще чем с UCK, а главное работает :)
0
Aliot77e #
Пошел делать свой Ubuntu LiveCD
0
Qiwichupa #
+1 в карму
+1
yktoo #
Список пакетов, которые необходимо установить, есть.
А где список пакетов, которые необходимо снести?
Так, мне, например, сто лет не нужны Evolution и Empathy — я всегда их сразу же после установки удаляю.

Ещё хотелось бы сразу добавлять доп. репозитории и пакеты из них (например, Skype).
0
giner #
У меня не было такой необходимости, но могу всё это добавить со временем (или кто-нибудь ещё добавит :)).
Суть в том, что при использовании LiveCD мне всё время приходилось настраивать интернет и устанавливать необходимый софт (будь то chntpw, testdisk, smartmontools или ещё что-нибудь) и задача была в том, чтобы этот софт просто был на CD (или в моём случае — в сети) и скачивать его не нужно было.
0
giner #
Только не на CD, а в данном случае на DVD, т.к. если из образа ничего не удалять, то он получится больше 700Мб.
+1
Mezomish #
Чисто в качестве предположения: попробуйте добавить пакеты для удаления в тот же список, добавив минус в конце имени пакета. Я исхожу из того, что
$ sudo aptitude install evolution-
удалит пакет evolution.

Как и наоборот:
$ sudo aptitude remove thunderbird+
установит thunderbird.
0
yktoo #
Не знал, спасибо.
0
Mezomish #
Если будете пробовать — отпишитесь, пожалуйста, получилось ли. Самому интересно :)
0
giner #
Супер :)))
Но я рекомендую удалять с помощью purge.
0
zencd #
Предложение-вопрос. Можно ли сделать чтоб было так?

Грузишься с лайвсиди, настраиваешь её любым удобным способом, даёшь указание создать обновлённый iso-образ. Финиш.

(Это если с флэшки грузиться нельзя; а если можно, то все эти операции бесмысленны, так ведь?)
0
giner #
Теоретически да, возможно, но это не совсем то, что было нужно.
Например у меня есть кастомизованная Ubuntu 9.10 и вышла 10.04, мне так же её нужно кастомизовать. В случае с этим скриптом всё, что мне нужно сделать, это заменить в файле конфигурации версию. В случае же с ручной кастомизацией — это пол дня времени.
0
luckyredhot #
«кастомизация» — звучит просто ужасно.
0
giner #
В общем-то согласен :) Есть более подходящее русское слово?
0
yul #
тюнинг — нормальное русское слово ;)
+1
etc #
«Прокачиваем свой Ubuntu Live CD» )))
–3
Qiwichupa #
— Фууу, ребята, посмотрите на этот ужасный Live CD!!! Чувак, ты правильно сделал что заехал к нам! Иди, выпей кофе, съешь французских булок, а мы пока прокачаем твой компакт! \m/
+1
Angel2S2 #
Спасибо, очень интересно, узнал нового для себя :)

Кстати, есть сервис Reconstructor, прямо в онлайне можно собрать свой LiveCD/DVD Ubuntu/Debian. Т.ж. есть прога, для сборки в оффлайне.
0
giner #
Онлайн не пробовал, про офлайн не знал. Спасибо, обязательно посмотрю.
0
giner #
Несколько обновлённый скрипт выложен здесь: www.helplinux.ru/ubuntu-livecd-customization
Обновляться будет там же.
0
hansell #
Прошу прощения, но не понимаю как мне воспользоваться Вашим скриптом.
Моя попытка собрать дистрибутив с помощью UCK провалилась и я решил попробовать Ваш способ. Какие команды и в какой последовательности мне потребуется ввести в консоли, чтобы получить желаемый результат. Также интересует как использовать config? Создается пустой файл и туда я копирую текст из примера, который Вы описали выше, а потом редактирую? А если я уже скачал пакеты, то можно как-то упростить их установку указав например что-то типа «ставим все из директории /packages/*» А если не грузиться с LiveCD, а производить все действия из под Ubuntu 10.04 уже установленной, то что мне нужно сделать, чтобы примонтировать раздел? Я так понимаю, что мне потребуется произвести переразметку своего раздела, чтобы выделить необходимое пространство, которое потом я буду монтировать?
Еще раз извиняюсь за столь делитанские вопросы, но я очень рассчитываю на помощь автора и всего сообщества.
Пожалуйста, как можно подробнее опишите процесс кастомизации, так как никакие другие интструменты не работают (может быть руки кривые, может мозгов не хватает у меня). Попробовал UCK, remaister (вроде бы так назвается, там используют бекап системы), reconstructor (оффлайн версия так и не запустилась ссылаясь на то, что мне нужно выбрать какой-то проект — это самая первая вкладка перед выбором пути к ISO, а оннлайн версия не доступна в данный момент).
Заранее благодарен за помощь!
0
giner #
Прошу прощения, давайте по порядку.
В разделе «Описание» написано что нужно делать. Что из этого непонятно?
0
hansell #
1. Загружаюсь с LiveUSB
2. Сейчас подготовлю файловую систему и примонтирую ее.
3. Создаю в примонтированной ФС директорию LIVEDIR владельцем которой я буду являться
4. Как мне нужно изменить config_example?

хочу удалить: evolution, gwibber, emphaty, games, transmission, brasero, pitivi, rhythmbox

хочу добавить: flash player, полную поддержку воспроизведения форматов AMR и 3GP, как это сделано в linux mint (там totem их воспроизводит и mplayer), проприетарные драйвера для видеокарт ATI и беспроводных сетевых карт broadcom, добавить шрифты Arial, Verdana, Timew New Roman в общем все MS Fonts, добавить samba, полная поддержка русского языка, распаковка архивов RAR

полностью обновить все пакеты до последней стабильной версии.
5. Какой командной запускается?
+1
giner #
На счёт обновления: UPTODATE=1
По первому вопросу — в скрипте не предосмотрено удаление пакетов, но можно его добавить. Для этого в скрипте перед командой aptitude install можно добавить aptitude purge.

Про запуск:
bash ubuntu-iso-customization.sh config_example
или
chmod +x ubuntu-iso-customization.sh
./ubuntu-iso-customization.sh config_example
0
hansell #
А еще не понятно как это конфиг содержит версию LiveCD. Получается, что файл конфига берет все необходимые файлы с LiveCD, который в данный момент работает в приводе? Запутался окончательно %)
+1
giner #
Да, всё верно, но проверялось всё на 10.04.
0
hansell #
Спасибо огромное! Сейчас попробую все это реализовать под 10.04.1
Еще раз прошу прощения за столь глупые вопросы.
0
hansell #
Эх, неправильно смонтировал ФС. Пишет, что не может создать директорию '/mnt/live': Permission denied.
Подскажите пожалуйста, как правильно смонтировать ФС.
У меня есть раздел на 21 Гигабайт, который я подключил.
0
giner #
sudo chown $USER /mnt/live
0
giner #
нет, не так, вот так
sudo chown $USER /mnt
0
hansell #
mkdir: cannot create directory '/mnt/live': File exists

теперь вот такая беда
0
giner #
перед запуском скрипта директория должна быть пустая
0
hansell #
она пустая
0
giner #
Я имею ввиду подмонтированную директорию.
rm -r /mnt/*
0
hansell #
в случае, когда требуется установить пакеты, которых нет в репозиториях убунту, как следует поступить? я могу добавить репы в liveCD, чтобы скрипт скачал необходимые пакеты?
0
giner #
Вся установка софта идёт в разделе "# install packages". Там можно добавить своё. Кроме того строка в скрипте sudoedit /etc/apt/sources.list открывает открывает редактор источников, туда можно добавить свои.
0
hansell #
Спасибо! Почти закончил вписывать пакеты. Скоро буду собирать ISO. Отпишусь, когда будет результат :)
0
hansell #
/mnt/iso/ubuntu-10.04.1-desktop.iso: No such file or directory

теперь вот это мучает :(
0
hansell #
Я ведь загрузился с LiveUSB… Можно как-то отредактировать скрипт, чтобы он взял исходные файлы с флешки? Или лучше указать ему на файл iso, который я могу скинуть на подключенную ФС.
0
hansell #
вручную сделал папку iso и закинул туда файл с образом системы, запустил скрипт еще раз и теперь ошибка такая:

mkdir: cannot create directory '/mnt/live': File exists

данная папка там есть и она пустая
0
giner #
Просто удали папку live. В скрипте идёт проверка на существование этой директории, чтобы случайно второй раз скрипт не запустить.
Вот в этой строке:
mkdir $LIVEDIR && cd $LIVEDIR || exit 1

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.