Установка программного обеспечения в Linux

LinuxBeginner
Практиковаться сейчас

Введение

В Ubuntu программное обеспечение обычно поставляется в виде пакетов. Репозитории публикуют файлы пакетов и метаданные с информацией об именах, версиях, зависимостях и местах загрузки. apt работает с репозиториями и разрешает зависимости, а dpkg на более низком уровне управляет локальной базой данных установленных пакетов .deb.

В этой лабораторной работе вы обновите метаданные, выполните поиск перед установкой, проверите установленный пакет, удалите его и установите детерминированный локальный .deb-пакет. Все изменения выполняются с использованием временного учебного пакета, а результат можно проверить по состоянию пакетов, а не по истории терминала.

Просмотр состояния пакетов и источников

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

Проверьте определения включённых источников. В современных образах Ubuntu могут использоваться файлы .list или .sources. Этот конвейер только читает данные и ищет информацию в обоих расположениях: grep -R выполняет рекурсивный поиск, -h скрывает имена исходных файлов, -s подавляет сообщения об отсутствующих файлах, а -E включает расширенные регулярные выражения. head ограничивает вывод двенадцатью подходящими строками:

grep -RhsE '^(deb |Types:|URIs:|Suites:)' /etc/apt/sources.list /etc/apt/sources.list.d 2>/dev/null | head -n 12

Проверьте с помощью dpkg, установлен ли Bash. Параметр -W выбирает записи пакетов, а -f задаёт формат вывода. ${Package}, ${Version} и ${db:Status-Status} — это поля dpkg, а не переменные оболочки, поскольку формат заключён в одинарные кавычки:

dpkg-query -W -f='package=${Package} version=${Version} status=${db:Status-Status}\n' bash

dpkg-query читает локальное состояние установленных пакетов. В отличие от него, apt-cache policy сравнивает установленную версию с версиями, известными из настроенных репозиториев:

apt-cache policy bash

Сохраните стабильную информацию о состоянии установленного пакета:

mkdir -p /home/labex/project/package-lab
dpkg-query -W -f='${Package} ${db:Status-Status}\n' bash > /home/labex/project/package-lab/bash-state.txt
cat /home/labex/project/package-lab/bash-state.txt

Обновление метаданных репозиториев

На этом этапе вы обновите индекс пакетов и разберётесь, какие изменения вносит команда apt update.

Выполните:

sudo apt update

Эта команда загружает актуальные метаданные репозиториев. Она не устанавливает новые версии всех пакетов; отдельной операцией для обновления установленных пакетов является apt upgrade.

Просмотрите каталог кэша метаданных:

ls -ld /var/lib/apt/lists
find /var/lib/apt/lists -maxdepth 1 -type f | head

Подсчитайте количество обычных файлов с метаданными:

find /var/lib/apt/lists -maxdepth 1 -type f | wc -l | tr -d ' ' > /home/labex/project/package-lab/index-file-count.txt
cat /home/labex/project/package-lab/index-file-count.txt

Поиск, проверка и установка пакета из репозитория

На этом этапе вы изучите пакет перед его установкой.

Найдите в именах и описаниях пакетов утилиту для вывода содержимого каталогов в виде дерева:

apt search '^tree$'

Просмотрите её метаданные:

apt show tree

Установите пакет с обработкой зависимостей. sudo предоставляет необходимые административные права, а -y автоматически отвечает «да» на этот уже проверенный запрос установки:

sudo apt install -y tree

Проверьте состояние пакета и наличие команды, а затем запустите её:

dpkg-query -W -f='${Package} ${Version} ${db:Status-Status}\n' tree | tee /home/labex/project/package-lab/tree-installed.txt
command -v tree
tree -L 1 /home/labex/project/package-lab

Выведите список путей, установленных этим пакетом:

dpkg -L tree | head

Удаление пакета и проверка результата

На этом этапе вы удалите учебный пакет из репозитория и разберётесь с различиями между связанными операциями очистки.

Удалите tree:

sudo apt remove -y tree

Команда remove удаляет программы, установленные пакетом, но может сохранить конфигурацию пакета. purge также удаляет принадлежащую пакету конфигурацию. autoremove удаляет зависимости, которые были установлены автоматически и больше не нужны; на реальном хосте перед подтверждением следует проверить список предлагаемых к удалению пакетов.

Предварительно просмотрите, что сделает очистка зависимостей, не изменяя систему. Параметр --dry-run выполняет расчёт, но ничего не удаляет:

sudo apt autoremove --dry-run | tee /home/labex/project/package-lab/autoremove-preview.txt

Перед запуском apt autoremove без --dry-run, особенно на общем или рабочем хосте, внимательно прочитайте предлагаемые действия.

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

hash -r
command -v tree || echo "tree command is unavailable"
dpkg-query -W -f='${db:Status-Status}\n' tree 2>/dev/null || echo "not-installed" | tee /home/labex/project/package-lab/tree-removed.txt

Создайте стабильный маркер независимо от того, сохранилась ли в dpkg остаточная запись:

if dpkg-query -W -f='${db:Status-Status}' tree 2>/dev/null | grep -qx installed; then echo "still-installed"; else echo "not-installed"; fi > /home/labex/project/package-lab/tree-removed.txt
cat /home/labex/project/package-lab/tree-removed.txt

Проверка и установка локального deb-пакета

На этом этапе вы изучите подготовленный .deb-пакет, установите его через apt, запустите содержащуюся в нём команду и корректно удалите пакет.

Перейдите в рабочий каталог и просмотрите метаданные пакета и его содержимое, не устанавливая его:

cd /home/labex/project/package-lab
dpkg-deb -I labex-greeter_1.0_all.deb
dpkg-deb -c labex-greeter_1.0_all.deb

Префикс ./ сообщает apt, что перед ним локальный файл, а не имя пакета из репозитория:

sudo apt install -y ./labex-greeter_1.0_all.deb

Проверьте пакет и запустите его:

dpkg-query -W -f='${Package} ${Version} ${db:Status-Status}\n' labex-greeter
labex-greeter | tee local-package-output.txt

После проверки удалите пакет и убедитесь, что предоставленная им команда исчезла:

sudo apt remove -y labex-greeter
if command -v labex-greeter >/dev/null; then echo "still-installed"; else echo "local-package-removed"; fi > local-package-state.txt
cat local-package-state.txt

Итоги

Вы научились отличать метаданные репозиториев от состояния установленных пакетов, обновили индексы apt, изучили пакет перед установкой, проверили установленные файлы и доступность команды, удалили пакет из репозитория и прошли полный жизненный цикл проверенного локального .deb-пакета.