Добавление пакетов к автономному установщику Lubuntu Alternate ISO

    Введение


    При создании автономных установочных носителей для автоматизированной установки ОС 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
    │   └── ubuntu-keyring-2012.05.19
    │       ├── debian
    │       └── keyrings
    ├── cd-image
    │   ├── boot
    │   │   └── grub
    │   ├── dists
    │   │   └── trusty
    │   ├── doc
    │   │   └── install
    │   ├── install
    │   │   └── netboot
    │   ├── isolinux
    │   ├── pics
    │   ├── pool
    │   │   ├── extras
    │   │   ├── main
    │   │   └── universe
    │   └── preseed
    └── 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 --accept '*-modules-3.13.0-24*i386.udeb' ftp://security.ubuntu.com/ubuntu/pool/main/l/linux/
    

    где вместо 3.13.0-24*i386 можно указать нужную версию ядра, которое вы используете для загрузки, и архитектуру модулей.

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

    скрипт
    #!/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-image.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 можно узнать версии модулей, которые требуются ядру, и которые нужно поместить в дистрибутив (см. выше).

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

    Метки:
    Поделиться публикацией
    Комментарии 1
    • 0
      При использовании опции iso-scan/filename в работе пакета iso-scan могут возникнуть проблемы с именами папок, содержащими пробел (например, "Program Files"), во время поиска iso-образов на диске.
      Подробнее о проблеме можно почитать здесь:
      https://bugs.launchpad.net/ubuntu/+source/iso-scan/+bug/838720
      https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=628991
      https://lists.debian.org/debian-boot/2011/09/msg00081.html

      Исправление для Ubuntu доступно начиная с версии xenial, которая сейчас находится на стадии альфа-тестирования, пакет iso-scan (1.55ubuntu1).

      Для trusty исправление не доступно даже в trusty-updates.

      Скачивание udeb-пакетов с зависимостями от xential, и добавление их в дистрибутив trusty не помогает. Т.к. некорректный файл iso-scan.postinst размещается в initrd в каталоге /var/lib/dpkg/info/. Т.е. чтобы исправить проблему — необходимо пересобрать initrd:

      # Создаем отдельный каталог для сохранения initrd
      mkdir -p /opt/packages/hd-media/20101020ubuntu318.36/
      cd /opt/packages/hd-media/20101020ubuntu318.36/
      
      # Скачиваем initrd.gz от соответсвующего ядра
      wget http://security.ubuntu.com/ubuntu/dists/trusty-updates/main/installer-i386/20101020ubuntu318.36/images/hd-media/initrd.gz
      
      # Распаковываем его во вложенный каталог
      mkdir initrd
      cd initrd
      zcat ../initrd.gz | cpio -i
      
      # Исправляем баг
      sed -ri 's/isolist=\$\(find \$dir/isolist=\$\(find \"\$dir\"/' var/lib/dpkg/info/iso-scan.postinst
      
      # Собираем initrd с нашими исправлениями
      find . | cpio -o -H newc | gzip -9 > ../initrd.gz.fixed

      Все, теперь можно грузить ISO-образы с дисков, даже если на этих дисках есть папки с пробелами в именах.

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