Собираем своего пингвина...

Feb 16, 2016 17:04




Большинство статей по созданию собственных сборок или дистрибутивов Linux, чаще начинаются со слов, что вот прямо каждый пользователь Линукса  рано или поздно задумывается над созданием собственного дистрибутива.
Говорю, как линуксойд с семилетним стажем: «не правда, не задумывается» :) Или: «не правда, не каждый» :)
Вот и у меня такого желания не возникало, потому что не было в этом потребности.
Пока на работе не появилась одна задачка.

Цель: сделать ноутбук для передвижных сотрудников, чтобы был весь набор часто используемых утилит для тестирования услуг, чтобы было всё оптимизированно, чтобы  ОС с окошечками, чтобы ничего лишнего и чтобы эти самые «младшие научные сотрудники» не могли ничего удалять\устанавливать и перенастраивать самостоятельно. А ещё чтобы дистрибутив этой ОС было легко развёртывать на другом железе.
Идеальный вариант - это какой-нибудь легковесный дистрибутив Линукса. Ну, а чтобы было легко развёртывать, чтобы был предустановленный софт и настройки, нужно собирать свой собственный.
Но вскоре от идеи собирать именно дистрибутив, я отказался в виду избыточной сложности. Это же не embedded система, в конце концов, а значит, в конечном счете, получилась бы очередная Убунта, Дебиан или ещё что-то подобное. Я не к тому, что это плохо, просто, зачем изобретать велосипед, если можно взять готовый и кастомизировать под свои задачи. Именно поэтому я остановился на варианте сделать свою сборку из какого-нибудь готового дистрибутива.
Вскоре, к своему удивлению, я обнаружил, что в стандартном репозитории Ubuntu уже есть готовая педаль для кастомизации дистрибутивов на основе образа установочного диска самой Ubuntu (Kubuntu, Lubuntu, Edubuntu и т.д.), под названием UCK (нет, не Ushtria Çlirimtare e Kosovës, свят-свят… :) a Ubuntu Customization Kit).
В качестве дистрибутива-донора решил использовать Lubuntu, т.к. сборка должна быть не только легковесная, но и не совсем аскетичная и наименее дохлая :)
Итак, приступим уже к делу.

Устанавливем UCK:
sudo apt-get install uck
Запускаем.




На первом экране ничего интересного. Только лицензионное соглашение и системные требования (не менее 5 ГБ свободного места на диске и подключение к Интернет).




Далее предлагается проинсталлить языковые пакеты. Вот тут кроются первые подводные грабли :) Если Вы препарируете не дистриб самой Убунты, а нечто производное, то проконтролируйте, чтобы на данном шаге ничего не было отмечено для установки. Иначе создание собственной сборки закончится раньше, чем Вы думаете.




Далее выбираем доступные для установки языки. Тут выбираем RU (ну, или что Вам там нужно).




Тут выбираем язык по умолчанию, при загрузке с LiveCD.




На следующем шаге выбираем образ, который будем изменять.




Придумываем имя сборки.




Хотим ли мы собрать кастомизированный образ?
Странный вопрос, смысла которого я так до сих пор и не понял.
Ну конечно! Иначе, зачем всё это?! :)




Хотите ли вы, для экономии места, удалить установочные виндовые файлы из нашей сборки?
Да!




Хотим ли мы сделать гибридный образ?
Да.




Утилита сообщает нам, где будет лежать готовый образ.
После этого скрипт попросит root-пароль. Далее пойдёт процесс распаковки образа. Процесс продолжительный и потребует времени.




Выбираем «Запустить консоль».




Откроется консоль - это, как бы, консоль нашей будущей системы, т.е. все манипуляции, которые мы тут проведём, отобразятся в нашей сборке.
Первым шагом, который нужно будет проделать - это добавить необходимые репозитории.

Приведём файл /etc/apt/sources.list к следующему виду:
                    [Spoiler (click to open)]

deb http://archive.ubuntu.com/ubuntu/ trusty main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://gb.archive.ubuntu.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://gb.archive.ubuntu.com/ubuntu/ trusty-backports main restricted universe multiverse
deb http://archive.canonical.com/ubuntu trusty partner
deb-src http://archive.canonical.com/ubuntu trusty partner
deb http://dl.google.com/linux/chrome/deb/ stable main


И ещё добавим реп для wireshark:
add-apt-repository ppa:wireshark-dev/stable

И ключик для Гугля, а то будет ругаться:
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -

Обновляем:

apt-get update

Ставим языковые пакеты, на всякий случай для всего, что может пригодиться:
apt-get install language-pack-ru language-pack-gnome-ru language-pack-kde-ru firefox-locale-ru

На всякий случай указываем русскую локаль:
update-locale LANG=ru_RU.UTF-8

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

В моём случае расклад будет следующий:
tftp - tftp-сервер
tftpgui - GUI для tftp-сервера. Требует python3 и либу python3-tk. Питон 3 уже предустановлен, а либу придётся доставить вручную.
Качаем архив со скриптом отсюда.
iWscanner - сканер сетей wi-fi, показывает окружающие сети, уровни сигналов, шифрование. Удобная утилита с GUI. Требует python2 и либу python-glade2. Питон 2 уже так же предустановлен, и либу то же придётся доставить вручную.
В репозитории его так же нет, нужно скачивать пакет отдельно.
GTKTerm - нужен для подключения консольным кабелем к различным железкам. Я раньше использовал screen, но у него есть один большой недостаток - он не поддерживает скроллинг в окне, или я просто не смог разобраться с этим моментом… не важно. В GTKTerm’е с интерфейсом всё проще.
Iperf - тестер пропускной способности канала, вообще-то мы в последнее время чаще пользуемся nuttcp заместо iperf’а, но всё равно, пусть будет.
jperf - графическая java-надстройка для Iperf. Для особо упоротых клиентов :)
nuttcp - ещё один тестер пропускной способности канала. В отличие от iperf’а умеет работать из-за NAT’а.
nuttcp-tui.sh - самописный шелл-скрипт для nuttcp. Как можно заметить по названию, скрипт предоставляет (простенький) текстовый пользовательский интерфейс для  утилиты nuttcp.
Если ещё кому-то может понадобиться этот скрипт, то его можно забрать у меня на Гитхабе (давно хотел освоить этот ресурс, и вот, тут появился повод). Там, кстати, можно почитать и более детальное описание его работы.
bwping - пингалка, которая может показывать скорость, пинговать с определённым TOS и т.д.
Распространяется только в исходнике. Качаем отсюда.
smplayer - просто неплохой плеер (на всякий случай).

remmina - удобный клиент удаленного рабочего стола. Поддерживает все основные протоколы: RDP, VNC, NX, XDMCP и SSH. Позволяет подключаться к рабочим столам: Windows, Linux и т.д. На всякий случай, пусть будет.
VLC - тоже плеер, но в нашей сборке он используется для тестирования IPTV (плейлист с различными multicast группами также прилагается).
wireshark - неплохой снифер, иногда выручает, да и вообще нужная штука для разборов полётов.
Midnight Commander - программа оболочка для терминала.
google-chrome-stable - что бы было. Кроме того, он достаточно шустро работает с флешем.
ssh - как показала практика, иметь доступ к тестовому компу на удалённой стороне, бывает очень не лишним.
default-jre, default-jdk - java нужна для jperf, ну и так, на всякий случай, мало ли чего ещё вздумается запускать.
ubuntu-restricted-extras - пакет кодеков и прочих флешей. Обязательная к установке вещь.
gcc, make - без этого мы не сможем устанавливать софт из исходников (вообще-то я так и не понял, почему оно не предустановлено).

Устанавливаем:
apt-get install tftp python3-tk python-glade2 wireshark mc
apt-get install gtkterm iperf gcc make nuttcp smplayer* ubuntu-restricted-extras remmina vlc
apt-get install google-chrome-stable ssh default-jre default-jdk
dpkg -i iwscanner-0.2.4.deb
tar -zxvf bwping-1.8.tar.gz
cd bwping-1.8
./configure
make
make install

Теперь определимся, что из стандартного набора нам не нужно:
AbiWord - текстовый процессор
Audacious - аудио-проигрыватель
Gnumeric - электронная таблица
Gnome-MPlayer - видеопроигрыватель
MTPaint - графический редактор
Pidgin - клиент мгновенного обмена сообщениями
Simple Scan - сканирование
Sylpheed - почтовый клиент
Transmission - BitTorrent-клиент
Xfburn - запись CD

Удаляем:
apt-get remove abiword audacious gnumeric gnome-mplayer mtpaint pidgin simple-scan
apt-get remove sylpheed transmission xfburn

Зачищаем систему от мусора:
apt-get autoremove

С софтом разобрались. Теперь создаём пользователей.
Минимально необходимы в системе два пользователя: один пользователь с возможностью получить права супер пользователя и один без таких прав.
Напомню, что мы юзаем производную от Убунты, а там, как таковой супер пользователь в чистом виде, доступен только в режиме рекавери. В штатном режиме есть только пользователи способные получить root-права и пользователи не способные получить root-права.

Создаём непривилегированного пользователя:
adduser user
Разрешаем вход без пароля:
passwd -d user
Добавляем в соответствующие группы:
usermod -a -G users user

Создаём привилегированного пользователя:
adduser adminko
Добавляем в соответствующие группы:
usermod -a -G adm adminko
usermod -a -G cdrom adminko
usermod -a -G sudo adminko
usermod -a -G dip adminko
usermod -a -G plugdev adminko
usermod -a -G lpadmin adminko

По adminko’й будем заходить мы, как локально, так и по SSH.
Под user’ом будут заходить все остальные.
Теперь самое муторное - настройки.
Вообще, создавать ярлыки на ходу и конфиги для приложений из консоли - это мазохизм чистейшей воды. Самое простое (как я делал) - это предварительно установить систему на отдельный комп или на виртуалку, настроить все приложения, разместить все ярлыки на рабочем столе, всё красиво причесать, потом заархивировать домашнюю папку пользователя и перенести её в образ. Домашние папки в нашем будущем образе находятся по адресу:
/home/имя_пользователя/tmp/remaster-root/home
Я сделал так. Сначала настроил всё под пользователем adminko, потом скопировал содержимое всей (почти) домашней директории в домашнюю директорию пользователя user. И подправил права. Почему почти? Ну, потому что нет необходимости держать рабочую папку скрипта для nuttcp, куда сливаются все логи, в двух местах одновременно, для неё достаточно одного расположения - в домашней папке пользователя user (/home/user/NUTTCP). То же и для рабочей папки TFTP-сервера (/home/user/TFTP и /home/user/TFTP/LOG). А, вот, папку со всякими скриптами и прочим, лучше оставить у админа (/home/adminko/Programs).

Права, при таком раскладе раздаются как-то так:
chown -hR adminko:sudo /home/adminko
chmod -R 771 /home/adminko

chmod -R 775 /home/adminko/Programs
chmod 771 /home/adminko/Programs/nuttcp-tui.sh
chmod 771 /home/adminko/Programs/start_nuttcp.sh
chmod 774 /home/adminko/Programs/IPTV.m3u
chown -hR user:users /home/user
chmod -R 775 /home/user
chmod -R 777 /home/user/TFTP
chmod 777 /home/user/NUTTCP

Конфиг для tftpgui пришлось подготовить ручками (и явно указать это в ярлыке для этой софтины), т.к. почему-то он упорно не хотел сохраняться, видимо какая-то бага в питоновском скрипте.

Но это всё частности, справедливые для моего случая. Тут главное усвоить пару простых правил:
1) Не давать пользователю, не являющемуся владельцем исполняемого файла, права на чтение этого файла. Т.к. там может содержаться какая-то конфиденциальная инфа (это я о скриптах). Только на их выполнение.
2) Не давать обычному пользователю права на запись в файл, если ему это явно не нужно.

Пользователей настроили, права раздали. Теперь осталось только сделать доводку мелким напильником :) А именно:
1) Разрешить пользователю менять сетевые настройки.
2) Разрешить пользователю выполнение некоторых программ без ввода root-пароля.
3) Настроить SSH-сервер
4) Исключить возможность простому пользователю повысить свои привилегии.
5) Отключить учётную запись гостя.

По порядку…
1) Это делается правкой файла /usr/share/polkit-1/actions/org.freedesktop.NetworkManager.policy
Нужно все строки:
auth_admin_keep
заменить на:
yes

2) Это решается правкой файла /etc/sudoers
Правильнее это делать командой visudo.
Принцип правки этого файла хорошо описан, например, тут.
В моём случае получилось как-то так:
                      [Spoiler (click to open)]

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# Host alias specification
# User alias specification
User_Alias TEST_USERS = adminko, user
# Cmnd alias specification
Cmnd_Alias TOOLS_CMDS = /usr/local/sbin/bwping, /usr/sbin/pppoeconf, /usr/share/iwscanner/iwscanner.py, /home/adminko/Programs/tftpgui/run.sh, /usr/bin/wireshark-gtk, /usr/bin/gtkterm, /usr/bin/iperf, /usr/bin/nuttcp, /home/adminko/Programs/run_nuttcp_tui.sh, /usr/bin/killall
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d
TEST_USERS ALL=(ALL) NOPASSWD: TOOLS_CMDS


Осторожнее, не делайте ошибок в этом файле, а то можно здорово осложнить себе жизнь.

3) Углубляться в тему не буду. Настройки хорошо описаны тут.

4) Тоже описано, причём мной и совсем недавно :)

5) Что бы больше никто не совался к нам в комп, отключаем учётку гостя.
Это делается добавлением в конец файла /etc/lightdm/lightdm.conf.d/20-lubuntu.conf строки:
allow-guest=false

Вот, вроде бы и всё.
С чувством выполненного долга закрываем консоль и ждём. Через непродолжительное время снова появится окошко с выбором, запустить консоль или продолжить сборку.



Выбираем продолжить сборку и запасаемся попкорном, процесс сборки образа запущен.




Если всё нормально, готовый образ можно будет найти тут:
/home/имя_пользователя/tmp/remaster-new-files
Записать файл на флешку можно, например, программкой UNetbootin.

З.Ы.: Пред тем как запустить сборку, ещё раз всё тщательно проверьте, не забыли ли ничего. А ещё лучше составьте список. Т.к. в случае чего, придётся всё переделывать «с нуля» :)

*nix, IT'шное

Previous post Next post
Up