Получаем список установленных в Debian пакетов

debianeach

Опубликован:  2019-10-05T06:19:05.191631Z
Отредактирован:  2019-10-06T02:46:16.547632Z

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

Несколько слов о самой задаче...

В моём скромном хозяйстве появился второй лэптоп. Мне необходимо установить на него Debian buster, но не просто установить операционную систему, а ещё и установить все установленные на моём рабочем лэптопе программы. Для этого мне нужен список установленных в системе моего рабочего лэптопа пакетов. Имея такой список, я одной командой установлю все необходимые мне для работы программы в аналогичной системе второго лэптопа. Такой список пакетов я и буду получать в этой демонстрации. Требования к желаемому списку пакетов следующие:

  1. Список должен быть сохранён в текстовый файл;
  2. Список должен содержать только имена пакетов, без указания версии;
  3. Имя каждого пакета должно занимать одну строчку в списке.

Все манипуляции я буду демонстрировать на своей рабочей системе - Debian buster с окружением рабочего стола LXDE. Аналогичную систему мне необходимо получить на втором лэптопе.

Открываю терминал, все действия я буду выполнять в нём.

9SbXrZ6trC.png

Список установленных в системе пакетов в любой версии Debian можно получить при помощи программы dpkg, её необходимо исполнить с ключом -l. Первая проблема, которую нужно решить - это длинный выхлоп dpkg, дело в том, что в моей системе установлено слишком много пакетов, поэтому выхлоп dpkg я отправлю на stdin программы less, в которой с помощью прокрутки и клавиш со стрелками я смогу просмотреть и проанализировать полученные данные.

dpkg -l | less

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

Начало выхлопа в моём терминале выглядит следующим образом:

MtdfBEywZN.png

Запоминаю, что первый пакет в списке - accountwizard. Нажимаю клавишу End и вижу на терминале конец выхлопа dpkg.

FrdW789rTg.png

Последний пакет в списке - zlib1g-dev.

Для справки: прервать программу less можно клавишей q.

На снимках экрана видно, что в начальном состоянии полученный список установленных в системе пакетов не отвечает предъявленным моей задачей требованиям. Осюда вторая проблема, которую необходимо решить, - нужно привести выхлоп dpkg к требуемой форме.

Обращаю внимание, что список пакетов dpkg выдаёт в таблице определённой формы, форма таблицы тоже имеется в выхлопе dpkg и выглядит так:

||/ Имя                                           Версия                          Архитектура  Описание
+++-=============================================-===============================-============-===============================================================================

Каждая секция таблицы имеет свою длину, строчка с плюсами, минусами и знаками равно демонстрирует длину каждой секции таблицы. Замечаю, что в таблице в выхлопе dpkg имя пакета занимает с пятого по пятидесятый символ своей строки. Имея эти сведения просто фильтрую выхлоп dpkg при помощи программы cut и отдаю полученные данные программе less.

dpkg -l | cut -c5-50 | less

В итоге получаю следующую картину:

TnEJa0TFnt.png

Конец выхлопа выглядит так:

YwS2HQjuPx.png

Отмечаю имена первого и последнего пакетов, ничего не изменилось, это всё те же accountwizard и zlib1g-dev. В полученном списке мне мешают только первые семь строчек преамбулы выхлопа dpkg. Чтобы их удалить, мне необходимо знать, сколько в списке всего строчек.

dpkg -l | cut -c5-50 | wc -l

sKiwgCMkQ9.png

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

dpkg -l | cut -c5-50 | tail -2528 | less

wV2dS4K8tG.png

Убеждаюсь, что первый и последний пакеты в списке не изменились. Замечаю, что некоторые пакеты в списке имеют определение архитектуры, например:

kM7jKsJinM.png

Эти лишние данные можно отфильтровать и удалить при помощи потокового редактора sed.

dpkg -l | cut -c5-50 | tail -2528 | sed -e 's/:amd64//' | less

esbjQ1Knro.png

Просматриваю полученный список, убеждаюсь, что всё на месте и ничего лишнего не отфильтровалось. Теперь полученные данные можно просто отдать в файл на жестком диске.

dpkg -l | cut -c5-50 | tail -2528 | sed -e 's/:amd64//' > packages

Полученный файл packages полностью удовлетворяет предъявленным требованиям и может быть использован с командой apt на другом компьютере. Задача решена. Решение задачи в полной мере получилось возможным благодаря перенаправлению ввода/вывода и возможностям терминальных программ среды Linux. Впрочем, об этом мы ещё не раз поговорим на страницах этого блога. Полученный список попробую использовать для установки системы на втором лэптопе, о результатах проинформирую. :)

Update:

Краткий отчёт о результатах проведённого эксперимента...

Полученный список пакетов был перенесён на второй лэптоп и использован для установки программ из списка. Выплыли следующие косяки.

Первое. В списке установленных на моём рабочем лэптопе пакетов нашлись библиотеки с явным указанием архитектуры i386.

VuMuLdoHyZ.png

Как видно на снимке экрана, это динамический библиотеки. Суффикс i386 получилось убрать при помощи sed.

fmMgfn8NP5.png

Итоговая команда для получения списка в моём случае приняла следующий вид:

dpkg -l | cut -c5-50 | tail -2528 | sed -e 's/:amd64//' -e 's/:i386//' -e 's/  *$//' > packages

Второе. На моём рабочем лэптопе к Debian подключены сторонние репозитории и установлены из них некоторые программы. Имена таких пакетов тоже пришлось удалить из полученного списка. В данном случае проблему решил прямо в консоли с помощью nano и ctrl+w.

Третье. Рабочий лэптоп имеет на жестком диске таблицу msdos и работает в режиме legacy. Новый лэптоп я устанавливал на диск с таблицей gpt в режиме UEFI. В связи с этим мне пришлось удалить из полученного списка ещё и имена пакетов grub и его компонентов. Тоже nano и ctrl+w.

Четвёртое. Debian buster на моём рабочем лэптопе был установлен достаточно давно, когда buster был ещё тестовой веткой. С тех пор прошло несколько обновлений ядра. Старые ядра я всегда удаляю из системы. А вот пакеты linux-headers устаревших версий в системе остались. Их имена тоже необходимо удалить из полученного списка, а лучше удалить из системы пакеты устаревших версий. Опять nano и ctrl+w.

Установку пакетов из списка делал с опцией --no-install-recommends на полученной из netinst системы.

sudo apt install --no-install-recommends $(cat packages)

Список пакетов достаточно обширный, установка заняла довольно продолжительный период времени. И в результате всех трудов я получил на втором лэптопе абсолютно аналогичную по составу установленных пакетов систему с минимумом затраченных усилий и вводом единственной команды apt. В целом опыт считаю позитивным и даже удачным. Полученный список пакетов вполне может стать основой для возможной переустановки системы. Всё! :)

Комментарии: