Введение


При создании автономных установочных носителей для автоматизированной установки ОС Lubuntu 14.04 с использованием preseed, я столкнулся с тем, что мне нужно добавить на установочный носитель пакеты, которые отсутствуют в исходном alternate-дистрибутиве. Я перепробовал много различных способов создания собственных автономных дистрибутивов, но они оказались:

  • либо неподходящими (LiveCDCustomization), т.к. мне нужен не LiveCD, а установочный preseed-дистрибутив;
  • либо очень сложными (DebianCustomCD);
  • либо работали, не как ожидалось (Simple-CDD, DebianInstaller/Modify/CD), а может я не до конца разобрался.

В итоге остановился на способе, который описан в сообществе Ubuntu.

Хочу рассказать о том, что у меня получилось.

Подготовка


Для дополнения дистрибутива нам потребуется исходный alternate-дистрибутив, к которому будем добавлять пакеты. А также компьютер под управлением Ubuntu или Lubuntu, на котором мы будем это делать.

Создание структуры каталогов и копирование файлов


Создадим каталог, в котором мы будем работать с этим дистрибутивом:

mkdir -p /opt/cd-image

Скачаем дистрибутив:

wget http://cdimages.ubuntu.com/lubuntu/releases/trusty/release/lubuntu-14.04.1-alternate-i386.iso

Распакуем скачанный iso-образ:

mkdir /mnt/iso
mount -o loop lubuntu-14.04.1-alternate-i386.iso /mnt/iso
cp -rT /mnt/iso /opt/cd-image
umount /mnt/iso

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

mkdir -p /opt/cd-image/pool/extras

Структура каталогов целиком
tree -d -L 3 /opt
/opt
+-- apt-ftparchive
+-- build
¦   L-- ubuntu-keyring-2012.05.19
¦       +-- debian
¦       L-- keyrings
+-- cd-image
¦   +-- boot
¦   ¦   L-- grub
¦   +-- dists
¦   ¦   L-- trusty
¦   +-- doc
¦   ¦   L-- install
¦   +-- install
¦   ¦   L-- netboot
¦   +-- isolinux
¦   +-- pics
¦   +-- pool
¦   ¦   +-- extras
¦   ¦   +-- main
¦   ¦   L-- universe
¦   L-- preseed
L-- indices

Подготовка ключей шифрования


Если у Вас нет пары публичный-приватный ключ, то нужно будет ее создать с помощью gpg. Ключу желательно задать комментарий вида «XXX Signing Key».

gpg --gen-key
gpg --gen-key
gpg (GnuPG) 1.4.16; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
Requested keysize is 2048 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0)
Key does not expire at all
Is this correct? (y/N) y

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Real name: Alexandr Petrenko
Email address: *********@gmail.com
Comment: My Signing Key
You selected this USER-ID:
    "Alexandr Petrenko (My Signing Key) <*********@gmail.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
You need a Passphrase to protect your secret key.


Приватный ключ будем использовать для подписывания Release-файлов репозитория.Для следующих действий потребуется пакет fakeroot, установите его, если он отсутствует в вашей системе.

Теперь нужно добавить ваш ключ в пакет ubuntu-keyring
mkdir /opt/build
cd /opt/build
# Скачаем исходники действующего пакета с ключами
apt-get source ubuntu-keyring

# Импортируем ключи из пакета
cd ubuntu-keyring-2012.05.19/keyrings/
gpg --import < ubuntu-archive-keyring.gpg

# Для просмотра ключей, содержащих "Signing Key" в комментарии, введите
gpg --list-keys "Signing Key"

pub   1024D/437D05B5 2004-09-12
uid                  Ubuntu Archive Automatic Signing Key <ftpmaster@ubuntu.com>
sub   2048g/79164387 2004-09-12

pub   1024D/FBB75451 2004-12-30
uid                  Ubuntu CD Image Automatic Signing Key <cdimage@ubuntu.com>

pub   2048R/YOURKEYID 2015-01-28
uid                  My Signing Key <*********@gmail.com>
sub   2048R/KEYID 2015-01-28

# Добавьте свой ключ в связку
gpg --export FBB75451 437D05B5 YOURKEYID > ubuntu-archive-keyring.gpg

# Перейдите на уровень выше в каталог ubuntu-keyring-2012.05.19 и соберите пакет с вашим ключом
cd .. 
dpkg-buildpackage -rfakeroot -m"Ваше имя <your.email@your.host>" -kYOURKEYID

# И скопируйте полученный пакета в репозиторий на диске
cd ..
cp ubuntu-keyring*deb /opt/cd-image/pool/main/u/ubuntu-keyring


Копирование файлов в репозиторий


Можно просто добавить несколько пакетов вручную в каталог /opt/cd-image/pool/extras.

Если требуется обновить модули ядра установщика, то это можно сделать так:

cd /opt/cd-image/pool/main/l/linux/
wget -r -nd --no-parent -A *-modules-3.13.0-67*i386.udeb ftp://security.ubuntu.com/ubuntu/pool/main/l/linux/

где вместо 3.13.0-67*i386 можно указать нужную версию ядра, которое вы используете для загрузки, и архитектуру модулей. В данном примере это 3.13.0-67, 3.16.0-52 или 3.19.0-32.

Чтобы скачать все пакеты, установленные в текущей ОС на эталонном компьютере, можно выполнить вот такой

скрипт
#!/bin/bash
dpkg --get-selections | while read line
do
  package=`expr "$line" : '\(.*\)install'`
  echo $package
  apt-get download $package
done
for i in *; do mv $i ${i/'1%3a'/''}; done


И добавить скачанные пакеты из кэша apt в репозиторий.

Создание автономного локального репозитория с помощью apt-ftparchive


Утилита apt-ftparchive содержится в пакете apt-utils.
Все настройки даны для Lubuntu 14.04 Trusty и архитектуры i386. Если версия или архитектура вашего дистрибутива отличаются, то нужно поправить соответствующие значения в конфигурационных файлах и скриптах.

Описание репозитория для apt-ftparchive


В каталоге /opt/apt-ftparchive необходимо создать следующие конфигурационные файлы:

Настройки для карманов main и universe:

apt-ftparchive-deb.conf
Dir {
  ArchiveDir "/opt/cd-image/";
};

TreeDefault {
  Directory "pool/";
};

BinDirectory "pool/main" {
  Packages "dists/trusty/main/binary-i386/Packages";
  BinOverride "/opt/indices/override.trusty.main";
  ExtraOverride "/opt/indices/override.trusty.extra.main";
};

BinDirectory "pool/universe" {
 Packages "dists/trusty/universe/binary-i386/Packages";
 BinOverride "/opt/indices/override.trusty.universe";
};

Default {
  Packages {
    Extensions ".deb";
    Compress ". gzip";
  };
};

Contents {
  Compress "gzip";
};


Настройки для модулей установщика debian-installer в карманах main и universe:
apt-ftparchive-udeb.conf
Dir {
  ArchiveDir "/opt/cd-image/";
};

TreeDefault {
  Directory "pool/";
};

BinDirectory "pool/main" {
  Packages "dists/trusty/main/debian-installer/binary-i386/Packages";
  BinOverride "/opt/indices/override.trusty.main.debian-installer";
};

BinDirectory "pool/universe" {
  Packages "dists/trusty/universe/debian-installer/binary-i386/Packages";
  BinOverride "/opt/indices/override.trusty.universe.debian-installer";
};

Default {
  Packages {
    Extensions ".udeb";
    Compress ". gzip";
  };
};

Contents {
  Compress "gzip";
};


Настройки для нашего кармана extras:
apt-ftparchive-extras.conf
Dir {
  ArchiveDir "/opt/cd-image/";
};

TreeDefault {
  Directory "pool/";
};

BinDirectory "pool/extras" {
  Packages "dists/trusty/extras/binary-i386/Packages";
};

Default {
  Packages {
    Extensions ".deb";
    Compress ". gzip";
  };
};

Contents {
  Compress "gzip";
};


Настройки для создания Release-файла репозитория:

release.conf
APT::FTPArchive::Release::Origin "Ubuntu";
APT::FTPArchive::Release::Label "Ubuntu";
APT::FTPArchive::Release::Suite "trusty";
APT::FTPArchive::Release::Version "14.04";
APT::FTPArchive::Release::Codename "trusty";
APT::FTPArchive::Release::Architectures "i386";
APT::FTPArchive::Release::Components "main restricted extras";
APT::FTPArchive::Release::Description "Ubuntu 14.04 LTS";


Загрузка индексов


get-indices.bash
#!/bin/bash
cd /opt/indices/
DIST=trusty
for SUFFIX in extra.main main main.debian-installer universe universe.debian-installer; do
  wget http://archive.ubuntu.com/ubuntu/indices/override.$DIST.$SUFFIX
done


Создание Packages и Release файлов репозитория


Скрипт, который запускает создание Packages и Release файлов репозитория утилитой apt-ftparchive с учетом наших настроек, после чего подписывает Release файл и записывает контрольные суммы файлов в md5sum.txt:

make-iso-repo.bash
BUILD=/opt/cd-image
APTCONF=/opt/apt-ftparchive/release.conf
DISTNAME=trusty

pushd $BUILD
apt-ftparchive -c $APTCONF generate /opt/apt-ftparchive/apt-ftparchive-deb.conf
apt-ftparchive -c $APTCONF generate /opt/apt-ftparchive/apt-ftparchive-udeb.conf
apt-ftparchive -c $APTCONF generate /opt/apt-ftparchive/apt-ftparchive-extras.conf
apt-ftparchive -c $APTCONF release $BUILD/dists/$DISTNAME > $BUILD/dists/$DISTNAME/Release

gpg --default-key "YOURKEYID" --output $BUILD/dists/$DISTNAME/Release.gpg -ba $BUILD/dists/$DISTNAME/Release
find . -type f -print0 | xargs -0 md5sum > md5sum.txt


Создание и использование ISO-образа


Создание ISO-образа


make-iso-repo.bash
IMAGE=custom.iso
BUILD=/opt/cd-image/

mkisofs -r -V "Custom Ubuntu Install CD"             -cache-inodes             --iso-level 3 -J -l -b isolinux/isolinux.bin             -c isolinux/boot.cat -no-emul-boot             -boot-load-size 4 -boot-info-table             -o $IMAGE $BUILD


Загрузка с ISO-образа


Теперь можно загрузиться с помощью созданного ISO-образа, записав образ на CD/DVD-диск, или со сменного носителя.

Создание загрузочного USB диска


Для загрзуки нужно отформатировать диск в FAT32. Установить на диск загрузчик, например grub2:

sudo grub-install --no-floppy --root-directory=/media/multiboot /dev/sdb


где /media/multiboot — путь к смонтированному разделу загрузочного USB-диска; /dev/sdb — устройство загрузочного диска.

После этого настроить загрузчик. Примерный конфиг grub2:

/media/multiboot/boot/grub/grub.cfg
# таймаут меню
   set timeout=10
# выбранный пункт по умолчанию
   set default=0

# загружаем модули
   insmod ext2
   insmod loopback
   insmod iso9660
   insmod fat
   insmod part_msdos
   
menuentry "Boot from first hard disk" {
   set root=(hd1)
   chainloader +1
}

set iso="/custom.iso"

menuentry "Custom.iso" {
  linux /vmlinuz debconf/priority=high shared/ask_device=manual shared/enter_device=/dev/disk/by-label/DISKLABEL iso-scan/filename=$iso auto-install/enable=true debian-installer/language=ru debian-installer/locale=ru_RU.UTF-8 debian-installer/country=RU preseed/file=/cdrom/preseed/custom.seed DEBCONF_DEBUG=5 --
  initrd /initrd.gz
}


Также нужно добавить в корень USB-диска vmlinuz и initrd.

В файле udeb.list можно узнать версии модулей, которые требуются ядру, и которые нужно поместить в дистрибутив (см. выше).

Остается загрузиться с созданного диска, и запустить установку ОС.

Комментарии (0)