Большинство статей по созданию собственных сборок или дистрибутивов Linux, чаще начинаются со слов, что вот прямо каждый пользователь Линукса рано или поздно задумывается над созданием собственного дистрибутива. Говорю, как линуксойд с семилетним стажем: «не правда, не задумывается» :) Или: «не правда, не каждый» :) Вот и у меня такого желания не возникало, потому что не было в этом потребности. Пока на работе не появилась одна задачка.
Цель: сделать ноутбук для передвижных сотрудников, чтобы был весь набор часто используемых утилит для тестирования услуг, чтобы было всё оптимизированно, чтобы ОС с окошечками, чтобы ничего лишнего и чтобы эти самые «младшие научные сотрудники» не могли ничего удалять\устанавливать и перенастраивать самостоятельно. А ещё чтобы дистрибутив этой ОС было легко развёртывать на другом железе. Идеальный вариант - это какой-нибудь легковесный дистрибутив Линукса. Ну, а чтобы было легко развёртывать, чтобы был предустановленный софт и настройки, нужно собирать свой собственный. Но вскоре от идеи собирать именно дистрибутив, я отказался в виду избыточной сложности. Это же не embedded система, в конце концов, а значит, в конечном счете, получилась бы очередная Убунта, Дебиан или ещё что-то подобное. Я не к тому, что это плохо, просто, зачем изобретать велосипед, если можно взять готовый и кастомизировать под свои задачи. Именно поэтому я остановился на варианте сделать свою сборку из какого-нибудь готового дистрибутива. Вскоре, к своему удивлению, я обнаружил, что в стандартном репозитории Ubuntu уже есть готовая педаль для кастомизации дистрибутивов на основе образа установочного диска самой Ubuntu (Kubuntu, Lubuntu, Edubuntu и т.д.), под названием UCK (нет, не Ushtria Çlirimtare e Kosovës, свят-свят… :) a Ubuntu Customization Kit). В качестве дистрибутива-донора решил использовать Lubuntu, т.к. сборка должна быть не только легковесная, но и не совсем аскетичная и наименее дохлая :) Итак, приступим уже к делу.
На первом экране ничего интересного. Только лицензионное соглашение и системные требования (не менее 5 ГБ свободного места на диске и подключение к Интернет).
Далее предлагается проинсталлить языковые пакеты. Вот тут кроются первые подводные грабли :) Если Вы препарируете не дистриб самой Убунты, а нечто производное, то проконтролируйте, чтобы на данном шаге ничего не было отмечено для установки. Иначе создание собственной сборки закончится раньше, чем Вы думаете.
Далее выбираем доступные для установки языки. Тут выбираем RU (ну, или что Вам там нужно).
Тут выбираем язык по умолчанию, при загрузке с LiveCD.
На следующем шаге выбираем образ, который будем изменять.
Придумываем имя сборки.
Хотим ли мы собрать кастомизированный образ? Странный вопрос, смысла которого я так до сих пор и не понял. Ну конечно! Иначе, зачем всё это?! :)
Хотите ли вы, для экономии места, удалить установочные виндовые файлы из нашей сборки? Да!
Хотим ли мы сделать гибридный образ? Да.
Утилита сообщает нам, где будет лежать готовый образ. После этого скрипт попросит root-пароль. Далее пойдёт процесс распаковки образа. Процесс продолжительный и потребует времени.
Выбираем «Запустить консоль».
Откроется консоль - это, как бы, консоль нашей будущей системы, т.е. все манипуляции, которые мы тут проведём, отобразятся в нашей сборке. Первым шагом, который нужно будет проделать - это добавить необходимые репозитории.
Ставим языковые пакеты, на всякий случай для всего, что может пригодиться: 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
С софтом разобрались. Теперь создаём пользователей. Минимально необходимы в системе два пользователя: один пользователь с возможностью получить права супер пользователя и один без таких прав. Напомню, что мы юзаем производную от Убунты, а там, как таковой супер пользователь в чистом виде, доступен только в режиме рекавери. В штатном режиме есть только пользователи способные получить 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
Конфиг для 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) Углубляться в тему не буду. Настройки хорошо описаны тут.
5) Что бы больше никто не совался к нам в комп, отключаем учётку гостя. Это делается добавлением в конец файла /etc/lightdm/lightdm.conf.d/20-lubuntu.conf строки: allow-guest=false
Вот, вроде бы и всё. С чувством выполненного долга закрываем консоль и ждём. Через непродолжительное время снова появится окошко с выбором, запустить консоль или продолжить сборку.
Выбираем продолжить сборку и запасаемся попкорном, процесс сборки образа запущен.
Если всё нормально, готовый образ можно будет найти тут: /home/имя_пользователя/tmp/remaster-new-files Записать файл на флешку можно, например, программкой UNetbootin.
З.Ы.: Пред тем как запустить сборку, ещё раз всё тщательно проверьте, не забыли ли ничего. А ещё лучше составьте список. Т.к. в случае чего, придётся всё переделывать «с нуля» :)