Как сделать установочный пакет для Linux в формате Installer-SH
Предисловие
Ни для кого не секрет, что Linux в настольном сегменте непригоден для нормального использования, и проблема распространения приложений одна из самых серьёзных в линуксах.
реклама
Кто-то скажет про всякие репозитории (и центры приложений), но они заслуженно отправляется в мусорку по следующим причинам:
1) Проблема надёжности: Репозитории это централизованная штука, хранящаяся где-то в интернете, рано или поздно сервер выйдет из строя / может быть заблокирован, или владелец репозитория не продлит аренду, в итоге репозиторий умрёт, вроде есть так называемые "зеркала", но это по сути те же самые репозитории со всеми их проблемами, только в большем количестве.
2) Проблема безопасности: Со временем оригинальный репозиторий может умереть или переехать на другой сетевой адрес, но уже существующие линуксы никто не изменит, и они будут искать репозитории по старым адресам, причём это делают автоматически, часто линуксы без разрешения пользователя скачивают списки пакетов, и даже обновляются, что потенциально может позволить злоумышленникам занять "освободившиеся" старые адреса репозиториев, подсунув вредоносные клоны вместо оригиналов, хотя даже официальные репозитории порой бывают заражены вредоносными компонентами.
реклама
3) Проблема доверия: Вы доверяете репозиториям Ubuntu? А Debian? Или репозиторию стороннего ядра Linux? Я вот не доверяю, ведь владельцы репозиториев могут в любой момент изменить содержимое, например удалить по их мнению устаревшие пакеты, заменив новыми, а потом пользователь будет сидеть у разбитого корыта с поломанными компонентами, без возможности откатить всё, ведь из репозитория уже удалены "устаревшие" пакеты, по сути это принуждение к обновлению, ведь пользователь не может получить старые версии пакетов...
4) Проблема сложности: Вам нужно установить приложение из репозитория на другой компьютер с Linux? Этот компьютер не подключен к безлимитному высокоскоростному интернету? Поздравляю, у вас появилась гора проблем, начиная с такого явления как "ад зависимостей" при попытке просто перенести несколько пакетов из репозитория, и заканчивая неистовым мракобесием, через которое придётся пройти при создании и подключении локальной копии репозитория весом несколько сотен гигабайт...
5) Обман, root права и снова доверие: В линуксах центры приложений (оболочки для репозиториев) часто обманывают пользователя с размером загружаемых данных, как правило, они не учитывают объём зависимостей для скачивания, или делают это неправильно, в итоге для установки приложения размером 3 мегабайта может потребоваться почти гигабайт зависимостей, ну а требование root прав для установки программы из репозитория, даже не знаю, это по сути дать полный доступ к системе непонятно чему и для чего, ведь с объёмом загрузки уже обманули...
реклама
6) Проблема переноса: Как сделать копию уже установленного из репозитория приложения, размазанного по всему линуксу пакетным менеджером как говно по деревенскому сортиру? По-человечески никак, увы, это, как правило, сущий ад заставить всё снова работать, даже если и выйдет выковырять из линукса все куски программы.
Можно и дальше продолжать список, но и так понятно, что репозитории в настольном сегменте - мусор.
Что там еще? AppImage? Звучит прикольно, засунуть приложение в один исполняемый файл, но это один исполняемый файл, программа в таком формате нормально не кэшируется системой, что снижает общую производительность и даже порой засоряет кэш в ОЗУ, а если у приложения несколько исполняемых файлов - привет танцы с бубном через терминал, да и степень сжатия весьма паршивая:
Решаю древнюю проблему Linux с распространением ПО - выпущен Installer-SH v1.7
реклама
Про архивы вроде tar.gz вообще промолчу, они медленно распаковываются (ибо матрёшка из tar + дополнительный формат), да и разработчики просто дают исполняемые файлы, а дальше танцуйте как хотите с этим...
Так что по сути не существует действительно адекватных способов распространения софта в линуксе, разве что простые архивы можно назвать условно нормальным способом, но таких приложений очень мало, особенно адекватно скомпилированных разработчиками, такие по пальцам одной руки пересчитать можно, про компиляцию из исходного кода вообще промолчу, ибо мракобесие тотальное.
-
Installer-SH
Мне просто нужен был способ перенести приложения на другой ПК и не утонуть в характерном для линуксов болоте зависимостей, и так был рождён Installer-SH, изначально это была уникальная особенность дистрибутива Chimbalix, но позже я решил это дело сделать универсальным, и сделал, даже в Gentoo 2016 года выпуска заработал при минимальных модификациях (заменить "#!/usr/bin/env bash" в начале скрипта на понятный для Gentoo "#!/bin/sh"):
Вообще я удивлён, что мой Installer-SH даже в старом Gentoo Linux 2016 года заработал, буквально изменил одну строчку в начале скрипта, нужно будет поработать над совместимостью в следующих версиях, ведь ещё обнаружился недостаток с правами запуска, нужно будет тщательнее контролировать этот момент, хотя в других линуксах кроме Gentoo этой проблемы не было:
Впрочем, это говорит о том, что у меня ещё полно работы над своим форматом распространения ПО, хотя я не планировал поддержку вышеупомянутого дистрибутива, но почему бы и нет...
Давайте приступим к упаковке программы Mozilla Firefox 128.4.0 ESR в формат Installer-SH:
И тут сразу отмечу забавный момент, архив с 32 битной версией браузера имеет точно такое же имя, как и архив с 64 битной версией, так что сразу переименовал файлы, чтобы потом не забыть про этот нюанс:
Далее берём Installer-SH:
И переименовываем в соответствии с версией, ISH19 в конце добавил чисто ради информативности, это краткое название и версия установочного пакета:
Так же переименовываю основной скрипт:
Вспомогательные файлы тоже нужно исправить, задающие локализацию независимо от системной, по сути их можно удалить, но я решил оставить:
Далее работа в каталоге installer-data, сразу удаляю каталог user_files и архивы, первый не нужен, а архивы будут сгенерированы новые:
Удаляю все лишние примеры в каталоге program-files, так же и каталог program очищаю:
Ну а дальше просто распаковываю файлы Firefox в каталог program, не забываю про настройки "distribution", это необходимо, чтобы отключить автоматические обновления браузера:
Так как у меня уже есть готовые файлы от другой версии браузера Firefox в формате Installer-SH - просто копирую всё необходимое в каталог program-files, это пара иконок и скрипт, позволяющий управлять автоматическими обновлениями, да, Firefox не позволяет полностью отключить обновления через обычные настройки, потому был разработан костыль:
Далее системные файлы, тут в основном расположены файлы отвечающие за формирование меню:
Так как у меня уже есть готовые файлы от другой версии браузера - воспользуемся ими, обычно тут всё подготавливается автоматически используя шаблоны замены, но можно и руками дописать при необходимости:
Где посмотреть шаблоны замены? Конечно в главном установочном скрипте! После некоторых настроек можно обнаружить необычные комментарии начинающиеся с символов "#=>", они и указывают на шаблон замены, да, не совсем очевидно, но я не писал отдельной документации, потому делаю скрипт самодостаточным, чтобы даже без документации был пригоден для использования, и даже для воспроизведения из уже готового установочного пакета:
В каталоге Desktop хранятся ярлыки, предназначенные для копирования на рабочий стол, тут тоже не стесняемся использовать шаблоны замены для имени приложения, названия иконки и путей:
Каталог "xfce4/helpers" не является обязательным, но он нужен, ведь рабочее окружение Xfce использует специальные файлы для панели управления, в системе есть такой функционал как "приложения по умолчанию", там можно выбрать используемый браузер по умолчанию, так вот, без этого файла браузер не попадёт в панель управления, и его нельзя будет выбрать в качестве браузера по умолчанию, так что подготавливаем файл:
Важно заметить, в таких DE как KDE не нужны никакие специальные файлы, чтобы браузер можно было выбрать приложением по умолчанию, потому этот функционал работает только при обнаружении рабочего окружения Xfce.
Далее нужно подготовить ярлыки для меню приложений, тут нас интересует только каталог "apps", в других ничего настраивать не надо, если только не нужна специфическая структура меню, с дополнительными вложенными разделами например:
Внутри встречаем каталог, имя которого это шаблон замены, так нужно чтобы не было конфликтов имён между разными приложениями:
И вот примеры ярлыков меню:
Удаляю первые два примера (но не трогаю файл "...-uninstall.desktop") и закидываю уже подготовленные файлы от другого установочного пакета Firefox в формате Installer-SH, при необходимости вношу правки, но тут такой необходимости нет, так что оставляю как есть:
Далее настройка главного установочного скрипта, мне нужно было узнать дату выпуска браузера для полноценного заполнения информации, но информация о выпуске Mozilla Firefox ESR указана для старой 115 версии, а нужно для 128:
Потому буду смотреть дату изменения файлов браузера... Хотя ладно, в папке с приложением нашёлся файл с точной датой сборки программы:
В общем заполняю основную информацию о программе и настраиваю базовые настройки вроде архитектуры, не забываю про перевод описания в файле локализации, примерно так:
Далее настраиваю технические аспекты, что используются в основном для автоматической подмены тех самых шаблонов замены, так же указываю дополнительные категории меню в которые попадут основные ярлыки:
Если всё сделано правильно - можно упаковать архивы, устанавливаю оптимальный размер словаря (выявляется экспериментальным образом):
И упаковываю архивы:
Рядом появился файл "MD5-Hash.txt", это MD5 контрольная сумма архивов, она нужна для проверки целостности во время установки:
Прописываю эти данные в главный скрипт:
На этом собственно всё, осталось проверить установочный пакет, внимательно смотрим на каждую строчку информации предоставляемой установочным пакетом, при необходимости возвращаемся на предыдущие этапы и исправляем ошибки, но сейчас ошибок тут нет:
Проверяем ярлыки в меню и на рабочем столе, всё отлично:
Проверяем браузер, всё отлично:
А вот со скриптом управляющим обновлениями вышло досадно, моя недоработка, нужно исправить скрипт и перепаковать приложение, ведь этот скрипт находится в архиве, изменение которого не предусмотрено в принципе во время установки:
Ничего не поделать, устанавливаю ещё раз, просто чтобы лишний раз проверить необычные варианты использования Installer-SH:
Отлично, оно ругается на существующие файлы в каталогах назначения, перезаписываю:
Пара секунд и браузер установлен, включаю автоматические обновления с помощью ярлыка в меню:
И браузер начал проверять обновления, другим ярлыком могу в любой момент заблокировать проверку обновлений, чтобы даже уведомлениями о новой версии не компостировали мозги, отлично:
Теперь нужно создать установочный пакет 32 битной версии браузера, тут всё максимально просто, копирую уже готовый пакет, удаляю файлы 64 битной версии программы, заменяю 32 битным Firefox, разумеется не забываю перепаковать архивы:
Ну и осталось только настроить главный скрипт, меняю архитектуру на x86, в том числе для инструментов, ведь 32 битные дистрибутивы не смогут запустить 64 битный 7-Zip:
Обязательно добавляю x86 в уникальное имя каталога, чтобы не конфликтовало с 64 битной версией браузера, если вдруг будут установлены одновременно в одной операционной системе:
То же самое делаю и в настройках меню:
Готово, проверяем:
С ярлыками порядок:
Bin ярлыки тоже на месте в терминале, хотя важно заметить, сторонние линуксы, как правило, не способны правильно определять BIN ярлыки в домашнем каталоге пользователя, так что это можно сказать работает только в дистрибутиве Chimbalix на данный момент:
Может в будущем разработчики других линуксов и исправят эту проблему, но сейчас BIN ярлыки в пользовательском режиме установки работают только в Chimbalix (начиная с версии 24.4) среди всех известных мне линуксов.
С самим браузером тоже всё отлично:
Осталось проверить раздел приложений по умолчанию:
И тут всё отлично:
Установочные пакеты готовы, ошибок не обнаружено, осталось провести чистку, для этого есть специальный скрипт:
Просто запускаю и радуюсь чистоте:
Итого имеем два новых установочных пакета в формате Installer-SH, для удобства распространения можно упаковать в обычный zip архив:
Теперь у меня есть нормальные установочные пакеты браузера Firefox, причем места они занимают значительно меньше, чем оригинальные архивы "tar.gz", а значит на одной флешке можно расположить больше софта, за что спасибо архиватору 7-Zip и мне, человеку, который настроил параметры сжатия оптимальным образом.
Причём важно заметить, в отличие от линуксоидных репозиториев - этот установочный пакет является самодостаточным, он может пролежать хоть 10, хоть 20 лет, и останется тем же файлом где-то в хранилище у пользователя, и никакие владельцы линуксоидных репозиториев не смогут на него повлиять просто так.
И вот тут вопрос доверия, к чему будет больше доверия, к уже проверенному установочному пакету, что просто лежит пока не понадобится, или к репозиторию, что в любой момент может измениться как угодно? Вопрос, конечно, риторический.
Найти Installer-SH можно в репозитории GitHub:
https://github.com/Shedou/Chimbalix-Software-Catalog
На этом закончим статью, проверку установочного пакета в сторонних дистрибутивах Linux оставим для другой статьи.
Благодарю за внимание, больше интересных статей в блоге Hard-Workshop.
Один квадратный метр пространства...
Лента материалов
Соблюдение Правил конференции строго обязательно!
Флуд, флейм и оффтоп преследуются по всей строгости закона!
Комментарии, содержащие оскорбления, нецензурные выражения (в т.ч. замаскированный мат), экстремистские высказывания, рекламу и спам, удаляются независимо от содержимого, а к их авторам могут применяться меры вплоть до запрета написания комментариев и, в случае написания комментария через социальные сети, жалобы в администрацию данной сети.
Комментарии Правила