Давайте теперь попробуем понять как вообще в линуксе организована система установки.

Если помните, то я говорил вам что в линуксе вы не можете просто скачать установочный файл. На самом деле это только часть правды. На самом деле можете. Просто для установки в sparky (а также всех наследников debian) существуют специальные установочные файлы, так называемые deb пакеты.

Помните мы устанавливали git, и писали

sudo apt install git

так вот есть некая заранее установленная программа apt, с помощью которой происходит установка программ в debian. Можно глянуть где она находится:

С помощью этой программы можно получить информацию о любом пакете который доступен в репозиториях debian.

Можно, например, получить информацию о git, вот так

apt show git

а можно взять и скачать установочный пакет, но не устанавливать его

apt download git

и увидеть как у вас в папке появился файлик с расширением .deb

кстати он иногда может ругаться что не может найти пакет, в этом случае попробуйте выполнить команду sudo apt update перед запуском apt download git

Иногда кстати и это не помогает, тогда надо удалить git

sudo apt purge git

и затем по новой поставить

sudo apt install git

и после этого уже стягивать пакет

apt download git

В общем этот файлик git_1%3a2.30.2-1+deb11u2_amd64.deb и есть установочный файл в debian.

Он представляет собой архив который состоит из двух частей. Первая – это собственно сами файлы которые входят в пакет, как правило если программа сложная там целая куча этих файлов. А вторая часть – это всякая мета информация и скрипты для установки.

Файлы принято хранить таким образом, чтобы их просто можно было скопировать в корень системы, и они сразу оказались на нужном месте.

Эти файлы можно посмотреть. Для этого надо воспользоваться еще одной встроенной в линукс утилитой dpkg, собственно с помощью неё apt и устанавливает пакеты в систему.

И так, давайте разархивируем содержимое пакета в папку

dpkg -x git_1%3a2.30.2-1+deb11u2_amd64.deb my_git_data

если глянуть что в папке, то увидим там тьму файлов. Я не буду выводить все, выведу основные папки.

Найдите на картинке файл git и вы увидите что по структуре он находится в папке /usr/bin

Мы можем запросить у линукса где находится программа git и увидеть

то есть когда вы запускаете установку пакета эти файлы просто копируются по указанными местам. Тут в отличие от виндоуз нет никаких секретных реестров, из которых не понятно, как вычистить тот или иной пакет. То есть всегда известно где что лежит.

Помимо самих файлов, в архиве лежит еще дополнительная информация о пакетах, а также некоторых дополнительных bash скриптов, которые вызываются во время установки/удаления приложения.

Эту информацию можно извлечь с помощью похожей команды только вместо флага –x использовать флаг -e

dpkg -e git_1%3a2.30.2-1+deb11u2_amd64.deb my_git_META

Попробуем понять, что какие файлы значит:

  • conffiles содержит список файлов, которые после установки потенциально может изменить пользователь. То есть системные файлы, которые могут отредактированы пользователем в целях поднастройки пакета. Например, во всяких СУБД это могут быть более точные настройки базы, выбор порта для запуска и т.п.
  • control – содержит текст, который мы видим, когда пишем apt show git
  • md5sums – содержит чек суммы каждого файла который мы выше извлекали в папку my_git_data
  • postinst – скрипт который будет вызван по завершению копирования файлов в систему
  • postrm – скрипт который будет вызван после удаления пакета из системы
  • preinst – скрипт который будет вызван перед установкой пакета
  • prerm – скрипт который будет вызван после удаления пакета

Давайте удалим уже установленный нами git и попробуем поставить его из пакета. Удаляем

sudo apt purge git

теперь запускаем установку deb пакета

sudo dpkg -i git_1%3a2.30.2-1+deb11u2_amd64.deb 

Давайте попробуем поставить еще какой-нибудь пакет, например, MidnightCommander, это такой аналог проводника для консоли. Чем-то напоминает FAR, если вы с ним сталкивались.

Качаем

apt download mc

устанавливаем

sudo dpkg -i mc_3%3a4.8.26-1.1_amd64.deb

О ошибка, приехали =)

В общем проблема dpkg в том, что он не умеет управлять зависимостями. Если вызывать информацию о пакете

dpkg -I mc_3%3a4.8.26-1.1_amd64.deb

а это значит, что у нас два варианта, либо поставить зависимости вручную. То есть выкачать пакет mc-data и поставить его через dpkg. Либо использовать apt который эти самые зависимости разруливает сам.

Давайте удалим пакет

sudo dpkg -r mc

И поставим по новой, но уже через apt

sudo apt install ./mc_3%3a4.8.26-1.1_amd64.deb

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

в принципе что-то похожее происходит, когда мы просто пишем sudo apt install mc, только он еще и пакет за нас скачивает

Теперь можно запустить mc и посмотреть, как он работает

mc

увидим что-то такое

в общем вполне себе такой проводник. В него встроена поддержка просмотра содержимого deb пакетов, вы просто выбираете файл и нажимаете enter

Также есть возможность просмотреть содержимое файла, не открывая его через нажать Ctrl+X а затем Q, справа откроется окно в котором будет видно текст файла. Закрывается это окно повторным нажатием Ctrl+X Q

Можно копировать файлы из одной панельки в другую с помощью F5, перемещать файлы с помощью F6, удалять с помощью F8 или delete. Можно открыть файл для редактирования через F4. Первый раз вас скорее всего попросят выбрать редактор файлов по умолчанию

просто тыкайте enter, и он выберет уже привычный нам nano

Еще есть прикольная возможность переключаться между папкой и терминалом прямо в mc, просто тыкаете Ctrl+O (тут буква О)

это более удобный способ перемещения по папкам чем через cd

Ну и чтобы выйти надо нажать Alt+0

Список репозиториев

Ну и напоследок давайте узнаем откуда apt узнает откуда качать файлы. Информация о путях к репозиториям лежит в специальных файликах, которые находятся по следующим путям

  • /etc/apt/sources.list – файл с базовыми путями
  • /etc/apt/sources.list.d – папка в которой лежат файлы с репозиториям, которые не входят в дебиан по умолчанию, на чистой системе эта папка как правило пустая

Давайте глянем что находится в /etc/apt/sources.list

Одна такая строчка

deb http://deb.debian.org/debian/ bullseye main contrib non-free

как раз указывается откуда брать пакеты

  • deb – означает что пакеты содержат уже скомпилированный код (если присмотритесь, то увидите, что среди строчек встречаются deb-src, который означает что apt будет качать исходники пакетов и компилировать их уже прямо на вашей машине. На некоторых версиях линукса – это единственный способ поставить приложение. В целом сложность работы определяется тем насколько сложно там добавить новый пакет

  • http://deb.debian.org/debian/ – это собственно адрес в интернете где лежат дистрибутивы пакетов
  • bullseye – это название версии debian, на которой построен наша sparky, а следовательно он будет использовать те же пакеты. Проверить названия используемой версии дебиан можно следующей командой lsb_release -cs

  • main contrib non-free – это на самом деле две категории которые будут использоваться для загрузки пакетов с сервера http://deb.debian.org/debian/. Вообще пакеты в дебиан делятся на четыре категории
    • main – официально поддерживаемые пакеты разработчиками дебиан, с открытым исходным кодом, которые построены на других пакетах с открытой лицензией. Под поддержкой понимается что как только выходит критическое обновление программы то происходит ее обновление в репозитории дебиан, если обновление не критичное, то как правило пакет имеет некоторую фиксированную версию, работу которой разработчики дебиан проверили на работоспособность на данной версии дебиан. Пример такого пакета, например, встроенный браузер firefox или тот же git
    • contrib – пакеты которые имеют открытую лицензию, но зависят от пакетов с закрытой лицензией.
    • non-free – все остальные пакеты, которые могут присутствовать в репозитории, но не иметь открытых исходных кодов, или иметь закрытую лицензию. Например драйвера nvidia

То есть

deb http://deb.debian.org/debian/ bullseye main contrib non-free

говорит, что с помощью apt можно будет качать пакеты которые находятся на сервере http://deb.debian.org/debian/, для версии дебина bullseye, использовать категории main contrib non-free

Вообще, можно зайти на указанный сервер и там покопаться в папках

Сами пакеты лежат в папке pool и для удобства разбиты на подпапки по первой букве названия пакета

В папке dists – лежат так называемые индексы, то специальные файлы в которых хранятся название пакетов (те самые которые скачивает линукс когда вы пишите команду apt update), их версии, а также пути от куда их можно скачать.

Задание

Написать программу которая по названию пакета разберет содержимое deb пакета и сгенерирует markdown отчет

Отчет должен выглядить как-то так: посмотреть

Для генерации ascii графики используйте утилиту figlet (вызывать так figlet -f banner git), не забудьте ее поставить сначала. Флаг f это название шрифта. Чтобы посмотреть все доступные шрифты вызовите команду showfigfonts

Чтобы текст из apt show выдало с переносами для markdown надо написать такую команду

apt show git 2>/dev/null | sed 's/$/  /'

если хотите выделять жирным шрифтом ключи в описании то пишите так

apt show git 2>/dev/null | sed 's/$/  /' | sed -E 's/(^\b.+?:) /**\1** /g'

в вариантах задания, я прописал список пакетов на которых можно потестить