Создание своего образа Ubuntu Bionic Desktop

Posted by

В прошлый раз я разобрал для себя, как сделать образ системы Ubuntu 18.04 Server amd64 на основе подготовленного и разобранного файла ответов, теперь я под свои нужды тестирования (под Virtualbox) уже использую не ручную установку системы с прохождением каждого этапа и ответом на вопросы мастера инсталляции. Но теперь я по такому же принципу хочу разобрать создание своего образа на базе Ubuntu 18.04 Desktop amd64. Цель которую я преследую:

  • Разворачивание в виртуальную систему под Virtualbox, ESXi, Hyper-V
  • В последствии с помощью PXE сервера устанавливать в один клик систему, либо на виртуальную либо на физическую.

Считаю что все должно быть автоматизировано и стандартизирована. Плюс интересно и в дальнейшем будет экономить время.

Как всегда основная система — это Ubuntu 18.04 Desktop amd64 установленная на ноутбуке Lenovo E555 на которой я все обкатываю и пишу реальные заметки для своих блогов.

И пакет Virtualbox для тестирования с последующим внедрением.

Необходимые условия каким я их себе вижу:

  • Обязательно наличие интернет соединения или же настроенного на Вашем железе в Вашей локальной сети сервиса apt-cacher-ng где уже должны быть все deb-пакеты.

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

Шаг №1: Как и в прошлый раз создаю каталог isoproject под проект сборки своего образа:

ekzorchik@navy:~$ mkdir isoproject/iso

Шаг №2: Перехожу в каталог проекта isoproject

ekzorchik@navy:~$ cd isoproject/

Шаг №3: Скачиваю/Выкачиваю оригинальный образ (Размер 1.8Gb) Ubuntu 18.04 Desktop со старым установщиком системы:

ekzorchik@navy:~/isoproject$ wget http://releases.ubuntu.com/18.04/ubuntu-18.04.1-desktop-amd64.iso

Шаг №4: Создаю скрипт для распаковки образа:

ekzorchik@navy:~/isoproject$ nano isoextract.sh

#!/bin/bash

BUILD=iso

IMAGE=ubuntu-18.04.1-desktop-amd64.iso

# Распаковываем образ в директорию

rm -rf $BUILD/

mkdir $BUILD/

echo "** Mounting image..."

sudo mount -o loop $IMAGE /mnt/

echo "** Syncing..."

rsync -av /mnt/ $BUILD/

chmod -R u+w $BUILD/

После не забываем сохранить внесенные изменения.

Шаг №5: Задаю атрибуты запуска данному скрипту (isoextract.sh):

ekzorchik@navy:~/isoproject$ chmod +x isoextract.sh

Шаг №6: Создаю еще один скрипт через который распакованный образ с внесенными изменениями в него будет собираться:

ekzorchik@navy:~/isoproject$ sudo nano archiveisopreseed.sh

#!/bin/bash

IMAGE=ubuntu-18.04-desktop-custom.iso

BUILD=iso

# Запаковываем содержимое iso/ в образ ubuntu-custom.iso

echo ">>> Calculating MD5 sums..."

rm $BUILD/md5sum.txt

(cd $BUILD/ && find . -type f -print0 | xargs -0 md5sum | grep -v "boot.cat" | grep -v "md5sum.txt" > md5sum.txt)

echo ">>> Building iso image..."

mkisofs -r -V "Ubuntu OEM install" \

-cache-inodes \

-J -l -b isolinux/isolinux.bin \

-c isolinux/boot.cat -no-emul-boot \

-boot-load-size 4 -boot-info-table \

-o $IMAGE $BUILD/

После не забываем сохранить внесенные изменения.

Шаг №7: Задаю атрибуты запуска данному скрипту (archiveisopreseed.sh):

ekzorchik@navy:~/isoproject$ chmod +x archiveisopreseed.sh

Шаг №8: Запускаю первый скрипт (isoextract.sh) для распаковки дистрибутива и монтирования его в каталог iso на основной системе находящимся в проекте isoproject:

ekzorchik@navy:~/isoproject$ sudo ./isoextract.sh

Шаг №9: Удаляю преднастроенные preseed файлы:

ekzorchik@navy:~/isoproject$ sudo rm iso/preseed/*.seed

Шаг №10: Не все можно предопределить в preseed-файле на самых ранних этапах загрузки. И в этом случае в распакованном в Шаге №8 нужно изменить содержимое файла txt.cfg (удаляю все, но оставляю только это):

ekzorchik@navy:~/isoproject$ sudo nano iso/isolinux/txt.cfg

default oem

label oem

menu label ^OEM install

kernel /casper/vmlinuz

append file=/cdrom/preseed/oem.seed auto=true priority=critical debian-installer/locale=en_US keyboard-configuration/layoutcode=us ubiquity/reboot=true languagechooser/language-name=English countrychooser/shortlist=US localechooser/supported-locales=en_US.UTF-8 boot=casper automatic-ubiquity initrd=/casper/initrd.lz quiet splash noprompt noshell ---

После не забываем сохранить внесенные изменения.

Шаг №11: Когда образ указан как загрузочный и идет загрузка с него, мастер установки предлагает Вам указать язык, но я иду по пути автоматизации и следовательно чтобы данный запрос не появлялся:

ekzorchik@navy:~/isoproject$ sudo nano iso/isolinux/lang

en

На заметку: в каталоге iso/isolinux/ есть файл langlist внутри которого перечислены доступные варианты языков.

Шаг №12: Чтобы загрузчик из файла txt.cfg в автоматизированном виде выбирал каждый последующий пункт меню установки следует изменить дефолтное значение в 300 секунд до 5 (к примеру):

ekzorchik@navy:~/isoproject$ sudo nano iso/isolinux/isolinux.cfg

path

include menu.cfg

default vesamenu.c32

prompt 0

#timeout 300

timeout 50

ui gfxboot bootlogo

После не забываем сохранить внесенные изменения.

Шаг №13: Создаю собственный файл ответов на вопросы инсталлятора при установке:

На заметку: убрать символы комментария:

ekzorchik@navy:~/isoproject$ sed 's:^#.*$::g' iso/preseed/oem.seed

ekzorchik@navy:~/isoproject$ sudo nano iso/preseed/oem.seed

d-i auto-install/enable boolean true

d-i debconf/priority string critical

d-i pkgsel/update-policy select none

d-i debian-installer/locale string en_US

d-i debian-installer/language string en

d-i debian-installer/country string US

d-i console-setup/ask_detect boolean false

d-i keyboard-configuration/xkb-keymap select us

d-i keyboard-configuration/layoutcode string us

d-i netcfg/choose_interface select auto

d-i netcfg/get_hostname string srv-dbionic

d-i mirror/country string manual

d-i mirror/http/hostname string archive.ubuntu.com

d-i mirror/http/directory string /ubuntu

d-i mirror/http/proxy string

d-i passwd/user-fullname string ekzorchik

d-i passwd/username string ekzorchik

d-i passwd/user-password password 712mbddr@

d-i passwd/user-password-again password 712mbddr@

d-i user-setup/allow-password-weak boolean true

d-i user-setup/encrypt-home boolean false

d-i clock-setup/utc boolean true

d-i time/zone string Europe/Moscow

d-i clock-setup/ntp boolean true

d-i clock-setup/ntp-server string ru.pool.ntp.org

d-i partman-auto/init_automatically_partition select biggest_free

d-i partman-auto/disk string /dev/sda

d-i partman-auto/method string regular

d-i partman-lvm/device_remove_lvm boolean true

d-i partman-lvm/confirm boolean true

d-i partman-lvm/confirm_nooverwrite boolean true

d-i partman-auto/choose_recipe select atomic

d-i partman-basicfilesystems/no_swap boolean false

d-i partman/default_filesystem string ext4

d-i partman-partitioning/confirm_write_new_label boolean true

d-i partman/choose_partition select finish

d-i partman/confirm boolean true

d-i partman/confirm_nooverwrite boolean true

d-i partman-md/confirm boolean true

d-i partman-partitioning/confirm_write_new_label boolean true

d-i partman/choose_partition select finish

d-i partman/confirm boolean true

d-i partman/confirm_nooverwrite boolean true

tasksel tasksel/first multiselect ubuntu-desktop openssh-server

d-i pkgsel/include string ca-certificates openssh-server

d-i pkgsel/upgrade select full-upgrade

d-i pkgsel/update-policy select unattended-upgrades

d-i grub-installer/only_debian boolean true

d-i grub-installer/with_other_os boolean true

d-i debian-installer/add-kernel-opts string net.ifnames=0

d-i finish-install/reboot_in_progress note

d-i preseed/late_command string apt-install tmux mercurial vim lvm2 net-tools openssh-server

d-i finish-install/reboot_in_progress no

Шаг №14: Собираю образ на основе проделанных изменений шагами выше запуском созданного в Шаге №6 скрипта:

ekzorchik@navy:~/isoproject$ sudo ./archiveisopreseed.sh

ekzorchik@navy:~/isoproject$ sudo umount /mnt

Шаг №15: Сравниваю эталонный образ и свой образ:

ekzorchik@navy:~/isoproject$ ls -lh *.iso

-rw-r--r-- 1 ekzorchik ekzorchik 1,9G июл 25 06:22 ubuntu-18.04.1-desktop-amd64.iso

-rw-r--r-- 1 root root 1,9G ноя 24 16:14 ubuntu-18.04-desktop-custom.iso

Видно, что он не намного изменился в размере.

Шаг №16: Проверяю его (образа) работоспособность в Virtualbox, создаю VM (Name: UD, расшифровывается как Ubuntu Desktop), к примеру со следующими характеристиками: CPU = 1, HDD = 50, RAM = 2 и выставляю что грузиться следует с подмонтированного образа созданного из шагов с 1 под 14 включительно:

Шаг №17: По итогу разворачивания образа под Virtualbox будет в экране VM приглашение на авторизацию в системе Ubuntu 18.04 Desktop amd64, как я и хотел все на Английском.

Шаг №18: Кликаю левой кнопкой мыши по квадрату с надписью «ekzorchik» авторизуюсь в развернутой системе под зашитыми в файл oem.preseed идентификационными данными:

  • Login: ekzorchik
  • Pass: 712mbddr@

Запускаю терминал по сочетанию клавиш Ctrl + Alt + T и в консоли командной строки вывожу, какой сейчас ядро в системе и какой релиз:

ekzorchik@srv-dbionic:~$ uname -a

Linux srv-bionic 4.15.0-29-generic #31-Ubuntu SMP Tue Jul 17 15:39:52 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

ekzorchik@srv-bionic:~$ lsb_release -a

No LSB modules are available.

Distributor ID: Ubuntu

Description: Ubuntu 18.04.1 LTS

Release: 18.04

Codename: bionic

Шаг №19: Можно начинать работать с системой, как если бы она была развернута просто с оригинального образа Ubuntu Bionic Desktop. Далее произвожу преднастройку перед использования посредством своего скрипта который выкачиваю из личного Mercurial репозитария. В Вашем случае — у Вас должно быть все свое с учетом Ваших предпочтений.

ekzorchik@srv-dbionic:~$ hg clone --insecure https://172.33.33.7/hg/dproject

ekzorchik@srv-dbionic~$ sudo ./dproject/default

Итого, как впрочем как всегда я добился желаемого задавшись целью сделать собственный образ Ubuntu 18.04 Desktop amd64. Теперь у меня две заметки по созданию собственных образом. Но это уже прошлый век использовать USB носитель или привод — пора использовать PXE сервис, вот об этом я поведую своим читателям и себе составляю пошаговое руководство в следующих заметках. На этом я прощаюсь с Вами читатели моего (www.ekzorchik.ru) и конечно же Telegram канала (@ekzorchik), с уважением Олло Александр aka ekzorchik.