Получаем список установленных в Debian пакетов
debianeach
Опубликован: | 2019-10-05T06:19:05.191631Z |
Отредактирован: | 2019-10-06T02:46:16.547632Z |
В продолжение темы о перенаправлении ввода/вывода предлагаю вашему вниманию решение одной насущной прикладной задачи. Решать эту задачу, сформулирую её чуть ниже, я буду в терминале, и решение будет активно использовать перенаправление ввода/вывода - так называемый программный канал.
Несколько слов о самой задаче...
В моём скромном хозяйстве появился второй лэптоп. Мне необходимо установить на него Debian buster, но не просто установить операционную систему, а ещё и установить все установленные на моём рабочем лэптопе программы. Для этого мне нужен список установленных в системе моего рабочего лэптопа пакетов. Имея такой список, я одной командой установлю все необходимые мне для работы программы в аналогичной системе второго лэптопа. Такой список пакетов я и буду получать в этой демонстрации. Требования к желаемому списку пакетов следующие:
- Список должен быть сохранён в текстовый файл;
- Список должен содержать только имена пакетов, без указания версии;
- Имя каждого пакета должно занимать одну строчку в списке.
Все манипуляции я буду демонстрировать на своей рабочей системе - Debian buster с окружением рабочего стола LXDE. Аналогичную систему мне необходимо получить на втором лэптопе.
Открываю терминал, все действия я буду выполнять в нём.
Список установленных в системе пакетов в любой версии Debian можно получить при помощи программы dpkg, её необходимо исполнить с ключом -l
. Первая проблема, которую нужно решить - это длинный выхлоп dpkg, дело в том, что в моей системе установлено слишком много пакетов, поэтому выхлоп dpkg я отправлю на stdin
программы less, в которой с помощью прокрутки и клавиш со стрелками я смогу просмотреть и проанализировать полученные данные.
dpkg -l | less
Откровенно говоря, отдавать данные dpkg программе less совсем не обязательно, потому что dpkg имеет встроенный пэйджер, но для наглядной демонстрации пусть будет.
Начало выхлопа в моём терминале выглядит следующим образом:
Запоминаю, что первый пакет в списке - accountwizard. Нажимаю клавишу End
и вижу на терминале конец выхлопа dpkg.
Последний пакет в списке - zlib1g-dev.
Для справки: прервать программу less можно клавишей q
.
На снимках экрана видно, что в начальном состоянии полученный список установленных в системе пакетов не отвечает предъявленным моей задачей требованиям. Осюда вторая проблема, которую необходимо решить, - нужно привести выхлоп dpkg к требуемой форме.
Обращаю внимание, что список пакетов dpkg выдаёт в таблице определённой формы, форма таблицы тоже имеется в выхлопе dpkg и выглядит так:
||/ Имя Версия Архитектура Описание +++-=============================================-===============================-============-===============================================================================
Каждая секция таблицы имеет свою длину, строчка с плюсами, минусами и знаками равно демонстрирует длину каждой секции таблицы. Замечаю, что в таблице в выхлопе dpkg имя пакета занимает с пятого по пятидесятый символ своей строки. Имея эти сведения просто фильтрую выхлоп dpkg при помощи программы cut и отдаю полученные данные программе less.
dpkg -l | cut -c5-50 | less
В итоге получаю следующую картину:
Конец выхлопа выглядит так:
Отмечаю имена первого и последнего пакетов, ничего не изменилось, это всё те же accountwizard и zlib1g-dev. В полученном списке мне мешают только первые семь строчек преамбулы выхлопа dpkg. Чтобы их удалить, мне необходимо знать, сколько в списке всего строчек.
dpkg -l | cut -c5-50 | wc -l
Имея эти данные, я получаю возможность отфильтровать первые семь строчек выхлопа при помощи программы tail.
dpkg -l | cut -c5-50 | tail -2528 | less
Убеждаюсь, что первый и последний пакеты в списке не изменились. Замечаю, что некоторые пакеты в списке имеют определение архитектуры, например:
Эти лишние данные можно отфильтровать и удалить при помощи потокового редактора sed.
dpkg -l | cut -c5-50 | tail -2528 | sed -e 's/:amd64//' | less
Просматриваю полученный список, убеждаюсь, что всё на месте и ничего лишнего не отфильтровалось. Теперь полученные данные можно просто отдать в файл на жестком диске.
dpkg -l | cut -c5-50 | tail -2528 | sed -e 's/:amd64//' > packages
Полученный файл packages
полностью удовлетворяет предъявленным требованиям и может быть использован с командой apt на другом компьютере. Задача решена. Решение задачи в полной мере получилось возможным благодаря перенаправлению ввода/вывода и возможностям терминальных программ среды Linux. Впрочем, об этом мы ещё не раз поговорим на страницах этого блога. Полученный список попробую использовать для установки системы на втором лэптопе, о результатах проинформирую. :)
Update:
Краткий отчёт о результатах проведённого эксперимента...
Полученный список пакетов был перенесён на второй лэптоп и использован для установки программ из списка. Выплыли следующие косяки.
Первое. В списке установленных на моём рабочем лэптопе пакетов нашлись библиотеки с явным указанием архитектуры i386.
Как видно на снимке экрана, это динамический библиотеки. Суффикс i386 получилось убрать при помощи sed.
Итоговая команда для получения списка в моём случае приняла следующий вид:
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. В целом опыт считаю позитивным и даже удачным. Полученный список пакетов вполне может стать основой для возможной переустановки системы. Всё! :)