Как найти вручную установленные пакеты?

Вопрос или проблема

Я установил обычный Ubuntu 10.10 на свой компьютер и установил несколько программ через apt-get. На прошлой неделе мне удалось всё сломать, и я просто начал с нуля, и мне нужно переустановить моё программное обеспечение. Есть ли способ создать список всех пакетов, которые я установил вручную?

Так, чтобы он выдал мне список, как texlive, ..., а не texlive, texlive-dep1, textlive-dep2, ... и все стандартные пакеты удалил?

Если бы я смог как-то выяснить, какие программы из стандартной установки я удалил, это тоже было бы здорово!


Обновление 2015-05-23: теперь я использую Ansible для управления конфигурациями на своих системах. Там я указываю устанавливаемые пакеты. Это служит цели установки всех программ на чистую систему, даже лучше. Так что этот вопрос может быть шагом к легкому управлению конфигурациями.

С этим предложением, я предполагаю, что ваша старая установка все еще может загрузиться!

Чтобы скопировать один набор пакетов на другую машину:

На системе A выполните:

dpkg --get-selections | grep -v deinstall > my-selections

Переместите файл my-selections на систему B.

На системе B выполните:

dpkg --set-selections < my-selections

а затем:

sudo apt-get dselect-upgrade

Важно: если вы устанавливали пакеты из нестандартных репозиториев и/или PPA, вам также нужно скопировать /etc/apt/sources.list и содержимое /etc/apt/sources.list.d/ с системы A на систему B перед выполнением обновления.

Вы также можете использовать dpkg, чтобы увидеть, что вы удалили (обратите внимание: это также будет включать пакеты, которые вы вручную установили и удалили):

dpkg --get-selections | grep deinstall

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

Эта тема с superuser.com дает это решение:

aptitude search '?installed ?not(?automatic)'

Если ваши журналы apt находятся в /var/log/apt, что-то вроде этого должно сработать:

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install"

Или если вы хотите избавиться от некоторого повторяющегося мусора в выводе:

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install" \
  | cut -f4- -d" " | sort | uniq

Вы могли бы использовать apt-mark, но я рекомендую debfoster:

sudo apt-get install debfoster
sudo debfoster

Это проверит все установленные пакеты и выяснит, какие из них удерживают другие установленные:

texlive-full удерживает следующие 161 пакетов установленных:
  cm-super cm-super-minimal context doc-base dvipng feynmf
  fonts-gfs-artemisia fonts-gfs-baskerville fonts-gfs-bodoni-classic
  ...
Сохранить texlive-full? [Ynpsiuqx?], [H]elp:

Когда вы отвечаете “y” на каждый вопрос (просто нажмите Enter, чтобы быстро двигаться), debfoster соберет список пакетов и запишет их построчно в файл. По умолчанию это находится в /var/lib/debfoster/keepers. Это выглядит так:

gnome-do
texlive-full
...

Я настраиваю debfoster через /etc/debfoster.conf, чтобы поместить этот список в /etc/debfoster-keepers и отслеживать файл с помощью etckeeper, чтобы сохранить историю и резервные копии. Ответ здесь показывает, как установить список пакетов из текстового файла, разделенного переносами строк:

sudo apt-mark manual $(cat debfoster-keepers)

Обратите внимание на ограничение: у пакетов, которые вы удалили, перед ними стоит ‘-‘. Так что вам нужно удалить эти строки перед вызовом apt-mark.

Несмотря на то, что сайт debfoster говорит, что debfoster устарел в пользу aptitude, мне больше нравится простой интерфейс и конфигурация debfoster. Он помещает вас в центр вашей базы данных пакетов и позволяет вам навести порядок, делая пакеты auto и manual более очевидными.

Наберите “h” в приглашении debfoster, чтобы объяснить свои варианты. Наберите “?” чтобы увидеть описание пакета. Как здесь может быть полезным.

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Выдает все вручную установленные пакеты (не системные пакеты, не зависимости). Например, он показывает build-essential, но не gcc.

Для тех, кто предпочитает использовать инструменты apt-*, есть утилита apt-mark, которая позволяет как запрашивать, так и изменять состояние вручную/автоматически.

apt-mark showmanual

Вы также можете указать шаблон для интересующих вас пакетов:

apt-mark showmanual qemu\*

Я наконец-то это понял:

outfile="$(mktemp)"
pattern='(\[INSTALLIEREN\]|\[INSTALL\])'

if [[ -f "/var/log/aptitude.1.gz" ]]
then
        gunzip -c /var/log/aptitude.*.gz | grep -E "$pattern" | awk '{ print $2; }' > "$outfile"
fi

if [[ -f "/var/log/aptitude" ]]
then
        grep -E "$pattern" "/var/log/aptitude" | awk '{ print $2; }' >> "$outfile"
fi

sort "$outfile"
rm "$outfile"

Я могу собрать всё, открыв журналы в /var/log/apt/

Затем я вручную фильтрую установленные пакеты apt-get. Может быть, есть способ сделать это программно, но я о нем не знаю.

cd /var/log/apt
cat history.log | grep Commandline

таким образом вы видите список команд, выполненных в прошлом.

Уберите код grep, если вам нужна дополнительная информация:

less history.log

если журнал сжат (т.е. заканчивается на gz)

gunzip <filename>

чтобы снова сжать, когда закончите, вы можете сделать:

gzip <filename>

Я не нашёл решение, которое подошло бы мне, я установил довольно много deb пакетов с помощью dpkg, и некоторые из тех, что я искал, отсутствовали.

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

export DPKG_INITIAL=$(mktemp) DPKG_INSTALLED=$(mktemp) DPKG_CUSTOM=$(mktemp) DPKG_DEPS=$(mktemp) zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print $2 }' > $DPKG_INITIAL ; awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u > $DPKG_INSTALLED ; comm -23 installed initial > $DPKG_CUSTOM ; function rdep() { apt-cache rdepends $1 | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; } ; echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > $DPKG_DEPS ; comm -23 custom deps > my-packages ; rm $DPKG_INITIAL $DPKG_INSTALLED $DPKG_CUSTOM $DPKG_DEPS

Вышеуказанная команда сохраняет список пакетов в файл в вашей текущей рабочей директории с именем my-packages.

Объяснение

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

zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print $2 }' > initial

Затем длинный список общих установленных элементов.

awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u > installed

Затем я сравнил два файла initial и installed, чтобы отобразить только элементы, уникальные для установленных.

comm -23 installed initial > custom

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

Я написал быструю функцию bash, чтобы сократить эти шаги в обработке этих элементов.

function rdep() { apt-cache rdepends $1 | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; }

После этого я передал каждую строку из моего файла custom этой функции с помощью xargs.

echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > deps

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

comm -23 custom deps > manual

И мой готовый список пакетов теперь находится в файле с именем manual, доступном для меня на просмотр.

Кто-то указал на https://unix.stackexchange.com/questions/3595/ubuntu-list-explicitly-installed-packages/3624#3624, у которого есть хорошее решение, но оно работает неправильно, так как вывод aptitude изменился.
Вот обновленная версия, основанная на сравнении в настоящее время установленных пакетов с 12.04 LTS. Вам необходимо установить aptitude, это единственное требование.

aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' > currentlyinstalled && wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f 1 | sort -u > defaultinstalled && comm -23 currentlyinstalled defaultinstalled

Чтобы разбить вышеуказанную команду на части, этот фрагмент выводит один пакет на строку для всего, что установлено в системе

aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' > currentlyinstalled

А это загружает список стандартных пакетов и обрезает избыточную информацию.

wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f 1 | sort -u > defaultinstalled

а comm сравнивает два файла и выводит пакеты, которых нет в стандартном списке.

comm -23 currentlyinstalled defaultinstalled

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

https://gist.github.com/darrenleeweber/8cc570ff402f19af7fa4

#!/bin/bash

manifest_url="http://releases.ubuntu.com/releases/trusty/ubuntu-14.04.3-desktop-amd64.manifest"
manifest_file=$(echo $manifest_url | sed -e 's#.*/##g')
if [ ! -e $manifest_file ]; then
    wget -q $manifest_url
fi
cat $manifest_file | cut -f1 | sort -u > default_installed.txt

aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currently_installed.txt

comm -23 currently_installed.txt default_installed.txt > manually_installed.txt

# сортируем пакеты 'manually_installed.txt' по архитектуре и разделу
mkdir -p package_files
while read p; do
    apt-cache show $p > info.txt
    arch=$(grep -m1 'Architecture: ' info.txt | sed -e 's/Architecture: //')
    section=$(grep -m1 'Section: ' info.txt | sed -e 's/Section: //' -e 's/\//_/g')
    file="${arch}_${section}_packages.txt"
    echo $p >> "package_files/$file"
done <manually_installed.txt

rm info.txt

#! /bin/sh
DEFAULT=`tempfile`
CURRENT=`tempfile`
cat /var/log/installer/initial-status.gz | gzip -d | grep '^Package:' | awk '{ print $2}' | sort -u > $DEFAULT
aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' | awk '{ print $1}' > $CURRENT
comm -23 $CURRENT $DEFAULT
rm $DEFAULT
rm $CURRENT

Я не нашёл подходящего для себя варианта, поэтому написал сценарий. Проанализировав содержимое /var/log/apt/history.log* и /var/log/aptitude, затем отсортировав по дате и времени, получается два списка: один с вручную установленными пакетами, другой с установленными, но удалёнными пакетами. Сценарий с проверкой ‘apt list’. небольшое отклонение, из-за использования изменённого PPA источника с dpkg.

Я разместил его здесь, https://github.com/eexpress/eexp-bin/blob/master/self-installed-pkg.pl.

Если кто-то хочет протестировать, возможно, понадобится изменить какой-то код, так как в моих журналах смешаны китайский и английский (особенно формат даты и времени RFC2822), мне нужно с этим разобраться.
введите описание изображения здесь

Я думаю, вам нужно использовать /var/log/apt/history.log и его “друзья”, чтобы получить изменения, которые были внесены:

zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline: apt(?:-get)? install (?!.*--reinstall)\K.*'

(Изменено из источник)

Это даст вам все пакеты, которые были установлены через командную строку с использованием вариации apt-get install.

Команда получает сжатые файлы из старых history.log, добавляет их к текущему history.log и обрабатывает через grep, извлекая строки с apt[-get] install [и/или переустановкой] и показывая остальную часть строки (флаг -o), что в свою очередь является названиями пакетов.

Это будет требовать небольших изменений (например, с помощью sed), если вы хотите, чтобы названия пакетов были на отдельных строках; задача для читателя!

Стоит отметить, что в менеджере пакетов synaptic (gksu synaptic или kdesudo synaptic) в разделе “статус” есть список “установленных (вручную)”. Если вы отметите весь список для удаления [не применяйте это!!], вы должны иметь возможность сохранить отмеченные изменения и получить список пакетов таким образом. Осторожно: это заблокировало synaptic для меня (вероятно, рассчитывая удаления зависимостей).

Я не уверен, сработает ли это в конкретном случае, описанном в вопросе, но в общем, чтобы увидеть ручные установленные пакеты apt, вы можете просто выполнить

apt-mark showmanual

Ответ или решение

Чтобы найти вручную установленные пакеты в системе Ubuntu, можно воспользоваться несколькими методами и командами. Ваша задача заключается в том, чтобы извлечь список пакетов, которые вы установили самостоятельно, исключая зависимости и стандартные пакеты. Далее приведены наиболее эффективные подходы для достижения этой цели.

1. Использование apt-mark

Команда apt-mark позволяет работать с флагами, которые определяют, были ли пакеты установлены вручную или автоматически. Для получения списка вручную установленных пакетов выполните следующую команду:

apt-mark showmanual

Эта команда выведет на экран список всех пакетов, которые вы установили вручную. Можете перенаправить вывод в файл:

apt-mark showmanual > manually_installed_packages.txt

2. Использование dpkg

Еще один способ — использование команды dpkg, чтобы получить список установленных пакетов и их статусов:

dpkg --get-selections | grep -v deinstall

Эта команда отобразит все пакеты, которые находятся в состоянии «установлен». Однако чтобы отделить вручную установленные пакеты от автоматических, вам необходимо сравнить с исходным списком пакетов, установленным при первой установке системы.

3. Анализ логов APT

Если у вас есть доступ к логам APT, вы можете извлечь информацию о пакетах, которые были установлены. Логи расположены в /var/log/apt/history.log и его сжатых версиях. Для получения списка установленных пакетов с использованием логов выполните следующую команду:

zcat /var/log/apt/history.log.*.gz | grep "Commandline: apt-get install" | awk '{print $4}' | sort | uniq > installed_packages.txt

Эта команда извлечет названия пакетов из логов и запишет их в файл.

4. Использование aptitude

Если вы установили aptitude, вы можете использовать его для извлечения вручную установленных пакетов с помощью следующей команды:

aptitude search '~i !~M' -F '%p' | sort -u > manual_packages.txt

Эта команда выводит список всех установленных вручную пакетов и сохраняет его в файл.

5. Фильтрация стандартных пакетов

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

  1. Получите список всех пакетов, установленных по умолчанию, сравнив его с текущими установленными пакетами.
  2. Выполните:
dpkg --get-selections | grep -v deinstall | sort > installed_packages.txt
donwload -qO - http://mirror.server.com/releases/ubuntu-manifest | awk '{print $1}' | sort > default_packages.txt
comm -23 installed_packages.txt default_packages.txt > unique_packages.txt

Эта последовательность команд создаст файл unique_packages.txt, в котором будут перечислены все пакеты, установленные отдельно от стандартной сборки Ubuntu.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...