Разворачиваем рабочий образ linux с минимальным интерактивом

Эта публикация может быть интересна тем ленивым системным администраторам, которые используют что-то из нижеперечисленнго:
  • Linux — based систему на машинах-клиентах;
  • Тонкие/толстые однотипные клиенты на различном железе;
  • Сетевое хранилище клиентских данных;
  • Предустановленный регламентированный софт;
  • Openvpn/rdp к серверам приложений.
  • Плюшевый (мягкий и пушистый) мониторинг linux клиентов типа Nagios.

Речь пойдет о том, как с минимальными усилиями со стороны пользователя или штатного «эникейщика» установить на компьютер пользователя готовую систему с набором софта, настроенными сетевыми службами, предопределенными конфигами и т.д. Статья ориентирована в первую очередь на энтузиастов и начинающих линуксоидов, но приемы и скрипты вполне могут использоваться в боевом развёртывании группы из десятков машин ежедневно.

Для начала определимся с дистрибутивом. Это, конечно, зависит прежде всего от задач. Я выбрал xubuntu 14.04 по трем простым причинам:

1. ubuntu — deb based система с широчайшей поддержкой и огромным количеством форумов;
2. xubuntu — легковесный вариант без рюшек и понтов, который не тормозит на машинах от 512Мб ОЗУ (есть в моём парке и такие динозаврики);
3. 14.04 — это LTS (Long Term Support) вариант c поддержкой до 2019 года.

Есть, конечно, варианты быстрее и поменьше, но по ряду тех или иных причин выбор был сделан и сожалений на протяжении года с небольшим не вызывает.

Забегая вперед, отмечу: чтобы повторить описанное потребуется настроенный vpn сервер или «конфиг-мониторинг-сервер» в локальной сети, пара виртуальных или реальных машин, пара часов свободного времени и внимание к деталям.

Итак, первое, подготовка образа. Все этапы важны, но первый — это фундамент. Устанавливаем систему с cd/dvd/usb/сети и выбираем разметку дисков. Важно понимать, что наш образ не будет поддерживать динамического ресайза ДО развёртывания. А после, скорее всего такой ресайз и не потребуется. Под корень имеет смысл отдать 6-10 Гб.

Больший объем оправдан в случае, когда заведомо известно, что а) диски на клиентских машинах не будут меньше этого объема и б) действительно будет установлено много разных нужных пакетов.

Разметим /home и, наконец, swap разделы. В совокупности все три раздела у автора не вылезают за 30Гб (чтобы спокойно разместиться на ssd 30 Gb, это минимальная конфигурация по диску для моих клиентов). В случае, если заранее известен минимальный объём диска — приемника, имеет смысл подгонять разделы под него. Своп рекомендую размечать сразу за корнем диска, /home сразу за свопом, чтобы в случае ресайза не «возить их по диску в консоли», а сделать изящно одной командой. Устанавливаем локаль, имя пользователя, пароль, hostname и заходим в новоиспеченный Linux. Для продолжения потребуются пакеты x11vnc, ssh, rsync, openvpn, mc (обожаю mcedit, он мне родной, как нортон из девяностых).

sudo apt-get install x11vnc ssh rsync openvpn mc ntp 

В базу я на свой вкус добавил skype, icedove (thunderbird), iceweasel(firefox), chromium-browser, rdesktop калькулятор, монитор ресурсов, viber, libre office, wine и пару windows-приложений (гореть мне, конечно, за это в аду, но аналогов нет и не предвидится). Настраиваем медленно и неторопливо всё это дело. Проверяем, что всё запускается и работает.

Настраиваем vpn. У меня сеть распределенная, по два-три компьютера на одну геолокацию, больше 50 локаций по России, не наездишься. Создаем ssh-ключ к серверу и на сервере к клиенту (кому надо вводить эти пароли, подробности, к примеру, тут). На сервере создаем каталог безусловной синхронизации (для меня это рабочие скрипты, ключи openvpn, клиентский cron, служебные скрипты на python, бинарники С++). В рабочем примере это /var/sync/in, /var/sync/in/cron, /var/sync/out. В out будут логи и любая нужная нам информация с клиентов: скриншоты, отчеты по процессам, итд. В in как раз и будут скрипты синхронизации, задания cron, скрипты хартбитов для мониторинга, многочисленные конфиги системных служб (того же cups или openvpn).

Подготовка всего этого дела к тиражированию займет не многим больше времени, чем установка системы одному пользователю, но тщательная проработка деталей может существенно уменьшить время, которое админ в будущем потратит на скрипты «допиливающие» все образы в бою. Настроим openvpn на клиенте и убедимся, что пользовательский ключ[и] работа[ею]т. Не лишним будет и настроить grub2.

  • Хинт1: Хорошо, когда хостнейм, ip в openvpn и сертификат юзера содержат свой уникальный id, к примеру user10.key, x.y.z.10 и vladivostok_10 в качестве хостнейма;
  • Хинт2: Хорошо, когда копии этих файлов лежат под рукой, скажем /var/sync/hostname, /var/sync/id, /var/sync/location;
  • Хинт3: Зарезервировать 5-10 адресов под незарегистрированных пользователей тоже будет полезным.

Файлы из Хинт2 мы создавать не будем сознательно, по их отсутствию будет понятно, когда «новенькие» подключатся к нашему vpn.

Итак, всё шуршит, офис работает, калькулятор запускается, для rdp с сервером приложений уже есть ярлычок на рабочем столе.

Пришло время делать образ.

Разрешу себе отвлечься. Способов сделать образ с готовой системой под тираж я перепробовал немало. Данная статья не претендует на звание лучшего способа, скажу лишь, что способ лучший для меня и очень кратко прокомментирую другие способы и их минусы.

Clonezilla — отличная вещь, но в интерактивном режиме вводит в ступор любого эникейщика за триста миль от админа.
dd if=/dev/sda of=img.img — волшебная вещь, но вместе с данными мы получим мусор с пустой части диска, объём и скорость метода ужасают.

Norton ghost — не поддерживает ext4.

Partition copy из gparted — классная вещь, но, увы, тоже не для начинающих.

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

  • Образ должен помещаться на небольшой (в моем случае 2Гб) флешке;
  • Образ должен ставиться нажатием одной-двух кнопок;
  • После развертывания образ сам должен синхронизироваться и «докладывать» админу, что новая машина «в строю»;
  • Регистрация новой машины не должна занимать много времени;
  • (Важно!) Образ скорее всего будет записан на флешку из-под windows непрофессионалом по инструкции;
  • (АрхиВажно!) Образ скорее всего будет развиваться версионно, и его нужно периодически доделывать и быстро распространять.

Пришлось изобретать маленький велосипед, а точнее — писать разворачивающий скрипт. Для вышеупомянутых задач был выбран дистрибутив PartedMagic. Для заворачивания образа потребуется unetbootin+partedmagic или любой live-cd(usb) с линуксом и tar+b[g]zip на борту. Будем считать, что образ мы загрузили PartedMagic «run from ram» и флешка монтирована в /media/sdb1 (FAT32).

Пара напоминалок про fat/ntfs на флешках
  • Ахтунг1 Напоминаю, раздел файла в fat32 не должен быть более 4Гб, следите за объёмом образа или выбирайте ext4 раздел.
  • Ахтунг2 NTFS раздел флешки под linux хоть и работает, но забирает огромное кол-во процессорного времени.


После загрузки монтируем наш диск (скорее всего /dev/sda1) и жмём прямо с него всю нашу систему, не забываем и про /home раздел:

 mount /dev/sda1 /media/sda1

Затем сделаем архив со всем содержимым нашего диска:

tar -czvpf /media/sdb1/image.tgz /media/sda1

Тоже самое и для /home раздела:

mount /dev/sda5 /media/sda5
tar -czvpf /media/sdb1/home.tgz /media/sda5

Затем дампим таблицу разделов в файл на нашу суперфлешку:

sfdisk /dev/sda1 -d >parts.txt


Таким образом, на флешке у нас появятся архивы и файл с таблицей разделов эталонного образа.

Ну и на сладкое. Ниже скрипт c говорящим названием, который собирался по частям с разных уголков интернета буквально по строчке.

Комментарии автора прямо в тексте скрипта. Ничего сверхъестественного, просто как на уроке информатики, однако отлаживался с кровавыми слезами, разок даже убил домашнюю систему флешкой с этим скриптом. Не рекомендую оставлять как есть, т.к. это его безусловная неинтерактивная версия.

cat /pmagic/pmodules/scripts/kill_your_hdd_data.sh (путь для автозагрузочного скрипта в PartedMagic)
!#/bin/bash
#старая версия, условий и проверок нет, ломает всё на своём пути, использовать "как есть" нельзя. 
#свежая версия с проверкой и выбором завернуть/развернуть/пропустить и загрузиться в PartedMagic  будет доступна после апдейта статьи.
#и кстати в этой версии всего один раздел / , т.к. home изначально не выносился на отдельный раздел
#отменить этот скрипт нельзя, он гарантировано убьет все данные на жестком диске (надеюсь, виртуальном)
#автор не несёт никакой ответственности за потерю Ваших данных, вы делаете всё сами на свой страх и риск
#2014 (c) Urban Software LLC under GPLv3 urbansoftware.ru, usrbb.ru
dd if=/dev/zero of=/dev/sda bs=512 count=1 # затираем загрузочную область диска и информацию о разделах
sleep 1s
sfdisk /dev/sda < /media/sdb1/parts.txt # создаем новую таблицу разделов из нашего файла с нашей таблицей
sleep 1s
mkfs.ext4 -L "" /dev/sda1 -F # Создаем корневой раздел 
sleep 1s
mkdir /media/sda1 
fsck.ext4 /dev/sda1 # проверяем на наличие ошибок вновь созданный корневой раздел (эти процедуры повторяем для home)
sleep 5s
mount /dev/sda1 /media/sda1 
#mount /dev/sdb1 /media/sdb1
sleep 1s
mkdir /media/sda1/tmp
tar -xzvpf /media/sdb1/image.tgz -C / # разворачиваем архив
sleep 5s
echo "This script damn work!" # ругаемся от радости, мы на финише
mount --bind /dev /media/sda1/dev 
mount --bind /sys /media/sda1/sys
mount --bind /proc /media/sda1/proc 
chroot /media/sda1/ /bin/bash -c 'grub-install /dev/sda' # установим загрузчик в корень диска
chroot /media/sda1/ /bin/bash -c 'update-grub2' 
sleep 5s
umount /dev/sda1
umount /dev/sdb1
echo 'done, remove media, system will reboot in 30s'
sleep 30s
reboot
exit 0


Вместо эпилога:

Lанный метод используется в Urban Software для заливки информационных сенсорных киосков c веб-приложениями под управлением linux. Чаще всего это бесклавиатурные машины, которые разворачиваются десятками вдали от цивилизации нашей техподдержки, поэтому важно изначально не создать проблем при их мониторинге и вводе в работу.

P.S. Статья получилась большая. О том, как «встречать» только что развернутые компьютеры, управлять удаленным cron, синхронизировать скрипты и получать хартбиты мониторинга, будет написана вторая часть, если, конечно, первая когда-нибудь вылезет из песочницы.
Поделиться публикацией

Похожие публикации

Комментарии 12

    0
    Откройте для себя yocto
      +1
      dd if=/dev/sda of=img.img — волшебная вещь, но вместе с данными мы получим мусор с пустой части диска, объём и скорость метода ужасают.


      Добавьте bs=30M и получите ~100 Мб/c скорости копирования на сколько-нибудь приличном жестком диске.
        0
        Лучше block size делать равным или чуть меньше кэша жесткого диска, тестировал с разными размерами, 512 8k 32k 256k 1M и таким путем обнаружил, что от bs=4М современные харды уже вполне неплохо тащат. Пик скорости на 4-64М в зависимости от конфигурации железа и собственно жестких дисков (обоих, разумеется) dd — это вообще магия, как и rsync, о котором во второй части :)
        +1
        Ужасно, просто ужасно

        sleep 1s

        Я так понимаю, костыль, дабы успеть сделать ^C после ошибки? Рассказать вам про код возврата/set -x или сами найдете?
          0
          Спасибо за комментарий. Не костыль, везде стояли 10-30 секунд дабы успеть прочитать об успехе/неуспехе. Скорее просто «дебаг». В боевой версии этого нет.
            0
            А можно просто использовать nixos…
              0
              Clonezilla — отличная вещь, но в интерактивном режиме вводит в ступор любого эникейщика за триста миль от админа.
              dd if=/dev/sda of=img.img — волшебная вещь, но вместе с данными мы получим мусор с пустой части диска, объём и скорость метода ужасают.

              tar.gz изобрели уже в прошлом веке.

              //А, вижу, так и делаете в итоге.
                0
                Если не упираться в Xubuntu, то есть старые добрые anakonda и kickstart-установка в RHEL.
                  +2
                  Внезапно: preseed
                    0
                    Preseed + CFEngine. Само себя ставит, настраивает и сообщает куда надо о готовности. Плюс можно легко и непринуждённо обновлять всё, что вздумается впоследствии. Сказка, а не жизнь. И никаких открытых портов.
                  0
                  Спасибо за статью, очень интересно. Я так понимаю вы использовали рабочий стол XFCE как есть, ни какого корпоративного стиля и т.п.?
                    0
                    Лого загрузки ОС и фон рабочего стола с фирменным лого, не более. Иконки, панели штатные с автоскрытием, т.к. ОС используется на сенсорных информационных киосках. скрытие, чтобы в случае незапланированного выхода из приложения доступ к рабочему столу с помощью сенсора был невозможен.

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

                  Самое читаемое