====== пакет ПО ====== //Пакет ПО// - это архив, содержащий ПО (файлы, конфиги, библиотеки и тп) и инструкции/метаданные для его установки, обновления и удаления. Распространены несколько форматов пакетов: [[deb_pkg|DEB]] и [[rpm_pkg|RPM]]. //Бинарный пакет ПО// - пакет, содержащий не исхдные коды и инструкии для их сборки, а уже готовый билд. //Исходные пакеты// (//src-пакет//) - пакет, содержащий исходные коды и инструкции по сборке и установке программы. //Метапакеты// - пакеты, которые сами по себе не содержат программ, но служат для установки других пакетов или зависимостей. Помимо классических пакетов ПО есть более современные технологии упаковки ПО: * **Flatpak**: Позволяет запускать приложения в изолированных контейнерах, что обеспечивает большую безопасность и совместимость между различными дистрибутивами. * **Snap**: Разработан компанией Canonical, Snap также использует контейнеризацию для обеспечения изоляции приложений и их зависимостей, что позволяет легко устанавливать и обновлять программы. * **AppImage**: Это формат, который позволяет запускать приложения без необходимости установки. AppImage упаковывает все необходимые зависимости в один файл, что делает его переносимым и удобным для использования на различных системах. ===== О назначениях директорий ===== (в контексте префиксов (PREFIX)) (в соответствии с "Filesystem Hierarchy Standard" (см ''man 7 hier'')) * ''/bin'' — это бинарники (т. е. испоняемые файлы), важные для работы системы на ранних стадиях загрузки. * ''/sbin'' — это то же самое с тем отличием, что эти бинарники обычно может запускать только root. * ''/lib'' — бинарные файлы библиотек, нужные для программ из ''/bin'' и ''/sbin'' * ''/usr'' — "//вторая иерархия файлов//", т. е. это как бы "ещё один ''/''" * ''/usr/bin'' — то же, что ''/bin'', но на этот раз это бинарники, некритичные для загрузки * ''/usr/sbin'' — то же, что ''/sbin'', но опять-таки, некритичные для загрузки * ''/usr/lib'' — бинарные файлы библиотек, которые не нужны для программ из ''/bin'' и ''/sbin'' * ''/usr/include'' — хедеры библиотек * ''/usr/local'' — "//третья иерархия файлов//", она опять содержит ''/usr/local/bin'', ''/usr/local/sbin'', ''/usr/local/lib'' и ''/usr/local/include'', на этот раз эти каталоги предназначены для «локального администратора». Что это значит? Это значит, что (в случае дистрибутивов GNU/Linux с пакетным менеджером) каталоги, о которых речь шла до этого, находятся под контролем пакетного менеджера. А вот каталоги внутри ''/usr/local'' находятся в распоряжении «локального администратора», т. е. вас. Если вы хотите поставить что-то из соурcов, в обход менеджера пакетов, то можно поставить туда. Подробнее об иерархиях файлов (префиксах) далее. ==== Подробнее о прификсах ==== Префикс ''/''\\ Вряд ли когда-нибудь вам придётся его выбирать. Он используется для программ, критичных для ранних стадий загрузки ОС (т. е. критичные элементы для загрузки находятся в ''/bin'', ''/lib'' и т. д.) (впрочем, даже если вам нужно установить программу в ''/'', её сперва устанавливают в /usr, т. е. собирают и устанавливают с префиксом ''/usr'', а потом перемещают необходимое в ''/'' \[т. е. перемещают из /usr/bin в /bin, скажем], во всяком случае именно так поступают авторы Linux From Scratch 7.10 с пакетом, скажем, bash). Префикс ''/usr''\\ Стандартный префикс, используемый обычно для программ, установленных через менеджер пакетов. То есть если вы установили программу через менеджер пакетов, она ведёт себя так, словно она собрана и установлена на вашей системе с префиксом ''/usr''. Самому устанавливать пакеты с префиксом ''/usr'' нельзя. Префикс ''/usr/local''\\ Отличный префикс для установки туда программ самостоятельно. Хорош тем, что ''/usr/local/bin'' есть в дефолтном PATH (во всяком случае в дебиане). То есть сразу после установки программы вы сможете просто запускать программу по названию. Потому что бинарник лежит в ''/usr/local/bin'', а ''/usr/local/bin'' есть в PATH. Префиксы, соответствующие домашним каталогам (''/home/username'')\\ Советую в случае, когда хочется поставить «только для себя», т. е. только для одного юзера. Или когда нет прав root. При любой установке пакетов в один префикс (что почти неизбежно), там все программы лежат смешанно. Вот допустим, вы установили библиотеку "foo", а потом библиотеку "bar". Обе в этот prefix. Тогда дерево может выглядеть так (в совсем упрощённом виде): /usr/local/include/foo.h /usr/local/include/bar.h /usr/local/lib/libfoo.so /usr/local/lib/libbar.so Всё смешано. Нет единой папки, которая бы содержала «всё, связанное с foo» и другой папки, которая бы содержала «всё, связанное с bar». (GoboLinux решает эту проблему) Префиксы вида ''/opt/XXX''. Папку /opt предполагается использовать следующим образом: в ней нужно создавать подкаталоги, называть их названиями пакетов и использовать эти подкаталоги как префиксы. При таком подходе указанная выше проблема сваливания в кучу (если считать это проблемой) исчезает. Каждый пакет будет установлен в свой каталог. Приведённый выше пример с "foo" и "bar" будет выглядеть так (я бы посоветовал в названии подкаталогов в ''/opt'' указывать ещё и номер версии): /opt/foo-1.0/include/foo.h /opt/foo-1.0/lib/libfoo.so /opt/bar-2.0/include/bar.h /opt/bar-2.0/lib/libbar.so Недостаток у такого решения тоже есть. Вам придётся самому добавлять все эти бесчисленные каталоги ''/opt/foo-1.0/bin'' (для каждого пакета) в PATH /* %% ## Создание простого пакета (https://habr.com/ru/articles/321468/) Сборка будет при помощи [Make](Make.md). Хотя можно использовать и более высокоуровневые программы, генерирующий конфиги для make, такие как [Cmake](Cmake.md) и autotools, но для примера использую только make. Исходный текст программы: ''''''c // hello.c #include int main (void){ printf ("Hello, world!\n"); return 0; } '''''' и Makefile: ''''''makefile # это и есть prefix (о нём ниже) # В качестве дефолтного префикса у нас указан /usr/local # (пользователь сможет его переопределить) PREFIX=/usr/local #компилятор, в данном случаи это cc. cc - анда для запуска компилятора по умолчанию в данной системе. CC=cc #флаги компиляции CFLAGS= all: hello hello: hello.c $(CC) $(CFLAGS) -o hello hello.c install: all mkdir -p $(PREFIX)/bin #install - почти как cp, но использовать стоит install install hello $(PREFIX)/bin/№ '''''' Допустим, пользователь скачал пакет. Далее его нужно собрать (тоесть скомпилировать бинарники) и установить (скопировать бинарники в место окончательного хранения в системе). > [!tip] > То есть смотрите. Вы залогинены под юзером user. Ваш домашний каталог ''/home/user''. Вы скачали пакет, распаковали его, скажем в ''/home/user/Desktop/foo''. Далее вы его собрали. Собрали в этой же папке, ''/home/user/Desktop/foo''. Либо, если речь идёт об out of tree build, вы создали ещё одну папку ''/home/user/Desktop/foo-build'' и собрали в ней. Теперь, после сборки вы решаете установить её в ''/usr/local''. Вот тут уже вам нужны права root. Вы при помощи sudo устанавливаете эту программу в ''/usr/local''. Теперь по поводу prefix. Когда вы устанавливаете какой-нибудь пакет, вы должны указать ему так называемый prefix, т. е. каталог, в который всё будет установлено. В этом каталоге будет создан подкаталог bin, в него будет установлены бинарники, будет создан подкаталог lib, туда будут установлены бинарные файлы библиотек, и т. д. То есть, например, вы устанавливаете пакет, указывая ему prefix ''/usr/local''. Тогда бинарники пойдут в ''/usr/local/bin'', бинарные файлы библиотек — в ''/usr/local/lib'' и так далее. Пример makefile для cpp кода: ''''''makefile PREFIX=/usr/local CXX=c++ CXXFLAGS= all: hello hello: hello.cpp $(CXX) $(CXXFLAGS) -o hello hello.cpp install: all mkdir -p $(PREFIX)/bin install hello $(PREFIX)/bin/ '''''' ___ */