Мережева установка робочих місць на базі Debian GNU / Linux

    Здравствуйте.
 
Автоматичне розгортання робочого місця — завдання, можна сказати, типова. Напевно дуже багато вирішували її — відштовхуючись від інфраструктури мережі та вказівок начальства особистих переваг; використовуючи при цьому готові рішення, або створюючи свої.
 
У цій статті я хотів би поділитися з співтовариством своїм способом побудови системи автоматизованої мережевої установки робочих місць, що працюють під Debian GNU / Linux. Ніяких флешок, дисків та інших зовнішніх вінчестерів, які особисто у мене чомусь мають звичку регулярно губитися в развалах робочого бардака, що не читатися чи бути очищеними для запису якийсь неймовірно потрібної фігні.
 
Якщо для вас такий стан справ здається близьким і знайомим — ласкаво просимо під кат.
 
 

Розгортання середовища

Для роботи мережевої установки в першу чергу потрібні налаштовані DHCP і TFTP сервера. На жаль, я не можу зараз згадати, чим я керувався при їх виборі, так як перші успішні експерименти були зроблені роки півтора тому, а то й раніше. У той час і були обрані isc-dhcp-server і tftpd-hpa відповідно як dhcp і tftp серверів.
 
 
aptitude install isc-dhcp-server tftpd-hpa

Для dhcp сервера треба вказати використовуваний інтерфейс в / etc / default / isc-dhcp-server і прописати відповідні вашої мережі налаштування в / etc / dhcp / dhcpd.conf. Для мережі 192.168.121.0/24 і інтерфейсу eth0 це виглядає приблизно так:
 
 
sed -i 's/INTERFACES=""/INTERFACES="eth0"/g' /etc/default/isc-dhcp-server
 sed -i 's/#authoritative;/authoritative;/g' /etc/dhcp/dhcpd.conf
 echo -e ' 
 subnet 192.168.121.0 netmask 255.255.255.0 {
  range 192.168.121.128 192.168.121.200;
  option domain-name-servers 192.168.121.1;
  option routers 192.168.121.1;
  filename "pxelinux.0";
 }' >> /etc/dhcp/dhcpd.conf

Само собою зрозуміло, що у вас можуть бути інші параметри і налаштування. Єдина цікавить нас строчка тут — це передостання, де вказується ім'я файлу, який буде передаватися за допомогою tftpd по мережі для початкового завантаження створюваної системи.
 
tftpd я залишив на умолчальне налаштуваннях; змінив тільки параметр TFTP_DIRECTORY у файлі / etc / default / tftpd-hpa, що робити в принципі не обов'язково. Далі викачуємо в цей каталог образ для мережевої установки Debian і розпаковуємо його
 
 
wget http://ftp.debian.org/debian/dists/wheezy/main/installer-i386/current/images/netboot/netboot.tar.gz
tar -xzvf netboot.tar.gz
rm netboot.tar.gz

 На цьому етапі ми вже можемо встановлювати систему по мережі (так, ось так все просто), але поки тільки в ручному режимі. Що хоча і економить час і нерви на пошуки завантажувальної флешки / компакта, але не особливо, тому переходимо до наступної частини нашої автоматизації — створення так званого «файлу відповідей» на всі питання інсталятора.
 
 

Відповіді і питання

Файл відповідей можна вбудувати в initrd, можна розмістити на зовнішньому носії, а можна — на веб-сервері, який буде доступний в процесі установки. Останній варіант виявився для мене найзручнішим як для внесення змін (не треба перезбирати initrd), так і безпосередньо в процесі роботи (не треба шукати флешку з відповідями). Хочу зауважити, що хоча у мене все це справа крутиться на одному комп'ютері, це зовсім необов'язково.
 
Щоб інсталятор «дізнався», де шукати відповіді на всі його питання, в файл $ TFTP_DIRECTORY/debian-installer/i386/boot-screens/txt.cfg до останній сходинці (яка починається з append) потрібно додати параметри auto і url. У результаті в файлі буде приблизно наступне
 
 
default install
label install
        menu label ^Install
        menu default
        kernel debian-installer/i386/linux
        append vga=788 initrd=debian-installer/i386/initrd.gz -- quiet auto=true url=http://192.168.121.1/pxeinstall/preseed.cfg

При бажанні в конфігурації меню можна також timeout 0 змінити на timeout 5, наприклад, і позбавити себе від праці натиснути «Ентер» перед початком установки. Особисто я повернув назад «вічний» таймаут після того, як до мене прибіг весь в засмучених почуттях сусід, який відправив на перезавантаження Заглючить машину і вийшов покурити, а повернувшись, побачив свіжовстановленому Debian замість улюбленої «сімки». Мої вмовляння, що свіжовстановленому система теж сьомої версії його не втішив: (
 
Само собою, на відповідному хості потрібен веб-сервер з каталогом pxeinstall, який нам ще знадобиться. Тут я нічого придумувати не став — apache і без того стояв для внутрішніх потреб. Якщо у вас ще немає веб-сервера, команда
 
 
aptitude install apache2  && mkdir /var/www/pxeinstall 

повинна вирішити цю проблему. Так що переходимо до твору відповідей.
 
Офіційний файл-приклад можна подивитися тут . Ви також можете отримати готовий файл відповідей для вашої системи, запустивши команду
 
 
debconf-get-selections --installer > my.preseed.cfg

А за допомогою
 
 
debconf-get-selections >> my.preseed.cfg

ви доповніть цей файл також усіма відповідями, які ви давали при встановленні додаткового софту.
 
Правда, я десь зустрічав твердження, що отриманий таким чином файл може працювати неправильно і — як результат — рекомендацію виправляти оригінальний файл під свої потреби, використовуючи my.preseed.cfg лише як підказки.
 
У цілому вивчення і правка цього файлу проблем не становить — все добре прокоментовано; необхідні значення потрібних параметрів можна підглянути у файлі, який згенерував debconf. І все ж є кілька нюансів, на яких я б хотів зупинитися докладніше.
 
 
Дискова розмітка
Є два способи провести розбивку дисків на цьому етапі — вибрати попередньо автоматичний варіант розбивки, або задати розміри розділів вручну. Встановлених варіантів три — всі файли на одному розділі; окремий розділ під / home і окремі розділи під / home, / tmp, / usr і / var. Зазначається у файлі відповідей рядком
 
 
d-i partman-auto/choose_recipe select atomic

Замість atomic можна відповідно використовувати home і multi.
 
В якості експерименту, та й для багатьох типових варіантів розбивки цього цілком вистачає, але у нас використовується розмітка, при якій традиційно виділяється окремий розділ для сервісних потреб, так що
 
 
d-i partman-auto/expert_recipe string                        \
      boot-root ::                                            \
              30000 5000 40000 ext4                           \
                      $primary{ } $bootable{ }                \
                      method{ format } format{ }              \
                      use_filesystem{ } filesystem{ ext4 }    \
                      mountpoint{ / }                         \
              .                                               \
              20000 3000 40000 ext3                           \
                      method{ format } format{ }              \
                      use_filesystem{ } filesystem{ ext3 }    \
                      mountpoint{ /srv }                      \
              .                                               \
              10000 2000 10000000 ext4                        \
                      method{ format } format{ }              \
                      use_filesystem{ } filesystem{ ext4 }    \
                      mountpoint{ /home }                     \
              .                                               \
              50% 6000 200% linux-swap                        \
                      method{ swap } format{ }                \
              .


Коротенько, що є що.
 
boot-root — це якесь колдунство, без якого вся ця байда відмовляється працювати :) Після нього йдуть параметри для кожного з створюваних розділів. У першому рядку три цифри відповідно означають мінімальний розмір розділу, пріоритет для алгоритму обрахунку розділу і максимальний розмір розділу. Розмір вказується в мегабайтах, при цьому при розбитті він буде урізаний згідно розміруциліндра. Крім цілочисельних значень можна також використовувати відсотки від розміру оперативної пам'яті. Допускаються також варіанти типу «2000 +50%», тоесть 2000Мб + половина оперативки. Пріоритет — це умовне «середньопотолочний» число. Чим воно нижче, тим підсумковий розмір розділу буде ближче до мінімального значення. Рекомендується одному з розділів вказувати максимальний розмір побільше, але не більше ніж 1000000000 щоб не нарватися на переповнення: на і386 целочисленная арифметика обмежена 31 бітом. Залишилося значення — це, звичайно ж, тип файлової системи.
 
Специфікатори $ primary {} і $ bootable {} вказують відповідно що створюваний розділ буде первинним і / або завантажувальним. method {format} потрібно вказати, якщо розділ форматуватиметься. Крім «format» можуть також використовуватися значення «swap» для розділу підкачки і «keep» для збереження розділу недоторканим. Якщо вказується method {format}, потрібно також додатково поставити ще одне специфікатор format {}. Наступні специфікатори use_filesystem {} і filesystem {ext4} визначають, в яку саме файлову систему буде сформатував розділ. Останній з використовуваних специфікаторів — mountpoint — визначає точку монтування створюваного розділу. Вінчає це добро символ «крапка», який відокремлює опису розділів один від одного.
 
Всі ці параметри повинні бути вказані в одному рядку що робить правку або пошук помилки досить веселим заняттям, так що традиційно використовуємо бекслеши для додання нашій розмітці більш-мене сопровождабельного виду.
 
Більш детальний опис процесу розмітки дисків, включаючи lvm, raid і інші радощі, можна подивитися тут і тут .
 
 
Розширюємо можливості
Не дивлячись на те, що за допомогою файлу відповідей можна повністю автоматизувати процес установки системи, все ж залишаються завдання, які він не вирішує. Це і різноманітні правки конфігов, і стандартний набір документів / налаштувань, які повинні бути у користувача під рукою, ну і само собою котики корпоративний логотип на десктопі. Для вирішення цього завдання я використовую можливість виконати будь-яку команду вже після установки системи, але з усе ще змонтованим / target:
 
 
d-i preseed/late_command string \
  chroot /target sh -c "/usr/bin/wget -O /tmp/postinstall http://192.168.121.1/pxeinstall/postinstall && /bin/sh -x /tmp/postinstall"

Тоесть, просто викачуємо підготовлений скрипт і запускаємо його.
 
У файлі postinstall нічого особливо видатного нету — підключаються репозиторії з додатковим софтом, цей же софт встановлюється. Після чого підправляються кофігураціонние файли і користувачеві розкочується еталонний домашній каталог разом з усіма необхідними налаштуваннями.
 
 
#!/bin/bash
deployserver=192.168.121.1
deployconfig=/pxeinstall/configs
#
# Installing additional software
#
wget $deployserver$deployconfig/apt_sources.list -O /etc/apt/sources.list
export DEBIAN_FRONTEND=noninteractive
aptitude update
#Installing unzip with full cyryllic support
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4EEBB18420019065
aptitude -y install unzip p7zip-full
#opera has own repo
wget -O - http://deb.opera.com/archive.key | apt-key add -
aptitude update
aptitude -y install opera
#For skype we do the following
aptitude install libasound2-plugins
wget -O skype-install.deb http://www.skype.com/go/getskype-linux-deb
dpkg -i skype-install.deb
# wvdial cofig for intertelecom. Just in case.
wget $deployserver$deployconfig/wvdial.conf -O /etc/wvdial.conf
#Set adequate editor by default
update-alternatives --set editor /usr/bin/vim.basic
#
#  User profile
#
username=`cat /etc/passwd | grep 1000 | awk 'BEGIN { FS = ":" } ; { print $1 }'`
cd /home/$username
wget $deployserver$deployconfig/home.tar.gz
# This archive is made by commands 
# cd home && tar -czvf ../home.tar.gz .
# to include also hidden (config) files 
tar -xzvf home.tar.gz
chown -R $username /home/$username
rm home.tar.gz
#
# Additional system configs
#
wget $deployserver$deployconfig/10-service.rules -O /etc/udev/rules.d/10-service.rules
wget $deployserver$deployconfig/service-blacklist.conf -O /etc/modprobe.d/service-blacklist.conf
sed -i 's/#AutoLoginEnable=true/AutoLoginEnable=true/g' /etc/kde4/kdm/kdmrc
sed -i 's/#AutoLoginAgain=true/AutoLoginAgain=true/g' /etc/kde4/kdm/kdmrc
sed -i 's/#AutoLoginUser=fred/AutoLoginUser='$username'/g' /etc/kde4/kdm/kdmrc
sed -i 's/"syntax on/syntax on/g' /etc/vim/vimrc
exit 0

 
При бажанні, в preceed.cfg можна взагалі ставити тільки базову систему, а все інше робити саме з цього скрипта. Перевага такого підходу полягає в тому, що у вас буде окремий готовий скрипт, який встановлює і налаштовує робоче місце на будь-якому працюючому debian, а не тільки в середовищі інсталятора. Або може він вже є і було б непогано його зайдействовать замість того, щоб шукати потрібні ключі в preseed.cfg. У такому випадку в postinstall тільки скачується повноцінний скрипт, прикмет якого ми тільки що розглянули, і який запуститься після перезавантаження вже у встановленій системі.
 
Особисто для нас ще однією причиною саме такого двоступеневого підходу послужити дуже повільне виконання скрипта в середовищі інсталятора. Наприклад, установка пакетів приблизно на 600 МБ з репозиторію в локальній мережі плюс розпакування архіву домашнього каталогу займає більше доби. Я не зміг знайти причину такого повільного виконання скрипта, який на тій же машині після перезавантаження відпрацьовує за лічені хвилини і буду дуже радий, якщо хтось з досвідчених хабражітелей підкаже, де тут собака порився.
Останній рядок з примусовою установкою завантажувача з'явилася тут після того, як на якийсь брендованниє комп'ютер з встановленою windows7 інсталятор вперто не хотів ставити grub.
 
 
#!/bin/sh
# Get firstboot script
/usr/bin/wget -O /root/firstboot http://192.168.121.1/pxeinstall/firstboot
chmod +x /root/firstboot
# create a service that will run our firstboot script

cat > /etc/init.d/firstboot <<EOF
### BEGIN INIT INFO
# Provides:        firstboot
# Required-Start:  $networking
# Required-Stop:   $networking
# Default-Start:   2 3 4 5
# Default-Stop:    0 1 6
# Short-Description: A script that runs once
# Description: A script that runs once
### END INIT INFO
cd /root
/usr/bin/nohup sh -x /root/firstboot &
EOF

chmod +x /etc/init.d/firstboot
update-rc.d firstboot defaults 99
grub-install --recheck --no-floppy /dev/sda

 
Само собою зрозуміло, в такому випадку в нашому скрипті firstboot треба не забути видалити себе після завершення роботи:
 
update-rc.d firstboot remove

 

Висновок

Вищеописаний метод розгортання робочих місць дозволяє тримати в одному місці все, що стосується установки ОС — скрипти, конфіги, додаткові файли — що спрощує бекап і дозволяє не шукати флешку з правильною версією образу системи. Ну і цей метод досить гнучкий для того, щоб просто і швидко змінити сценарій установки.
 
З радістю розгляну ваші зауваження і відповім на що з'явилися питання.
    
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.