dpkg запроса для Всех Пакетов Установил/Удалил из Изображения По умолчанию

Есть ли любой способ запросить dpkg сказать, какие пакеты были добавлены/удалены начиная с основной установки системы?

Я выполняю Debian 5.

1
задан 03.05.2011, 09:59

1 ответ

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


Короткий ответ (иначе острота для ленивого)

dpkg-query -f='${Package}\n' -W  | grep -vx "`grep 'Setting up' /var/log/installer/syslog | cut -d' ' -f8`"

Объяснение

1. Получение списка пакетов установлено установщиком

debian-installer пишут его журналы в /var/log/installer. Существует a syslog зарегистрируйте там, и мы можем grep это для наблюдения, какие пакеты были установлены:

grep 'Setting up' /var/log/installer/syslog

Обратите внимание, что мы ищем Установку или Распаковку, а не например, Выбор, так как мы хотим все пакеты, включая установленных как зависимости. Мы должны извлечь имена пакета из этого:

grep 'Setting up' /var/log/installer/syslog | cut -d' ' -f8

2. Получение списка в настоящее время устанавливаемых пакетов

Теперь нам нужен список в настоящее время устанавливаемых пакетов, чтобы сделать a reverse grep против. Мы хотим только, чтобы имена пакета, например, никакие описания постарались не отфильтровывать слишком много настолько простое dpkg -l не является большим. Мы можем использовать dpkg-query вместо этого:

dpkg-query -f='${Package}\n' -W

3. Отфильтровывание пакетов установлено при запуске

Все, что этому оставляют сделать, должно отфильтровать содержание 1-го списка из 2-го списка. Для этого мы используем grep -vx. -v для "реверса", -x (или --line-regex) для "точного". Последний только соответствует целым строкам, который удостоверяется, что мы отфильтровываем, например, склонный, но не способность.

Таким образом, вот все это соединенное:

 # currently installed
 current="`dpkg-query -f='${Package}\n' -W`"
 # base install (let's also remove duplicates to make verification easier)
 base="`grep 'Setting up' /var/log/installer/syslog | cut -d' ' -f8 | sort | uniq`"
 # your answer
 extra="`echo "$current" | grep -vx "$base"`"
 removed="`echo "$base" | grep -vx "$current"`"

4. Проверка результатов

Чтобы проверить, получили ли мы правильные пакеты, мы можем считать строки:

 echo "$base" | wc -l         # 160
 echo "$current" | wc -l      # 1677
 echo "$extra" | wc -l        # 1517
 echo "$removed" | wc -l      # 0 (I used "netinst")

Обновление: если /var/log/installer нет ли

/var/log/installer удален из системы если пакет installation-report очищен. В этом случае мы можем добраться, пытаются получить список пакетов, которые были загружены установщиком из самого старого /var/log/dpkg.log.* файл.

Существует 2 проблемы с этим:

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

Нет ничего, что мы можем сделать приблизительно (1). С (2) мы можем вручную (метками времени, возможно), устанавливают, которым пакет завершает установку debian-installer. В моем случае это, кажется, было os-prober (которому я верю, могло бы быть распространено в некоторых случаях из-за его отношения к grub).

Вот пример кода для получения $base использование этого метода:

 last_installed="os-prober"
 base_dpkglog="`zgrep ' install ' dpkg.log.8.gz | cut -d' ' -f4 | while read pkg; do 
     [ "$pkg" != "$last_installed" ] && echo $pkg || { echo $pkg; break; }
 done | sort | uniq`"

И быстрая проверка:

 echo "$base_dpkglog" | wc -l                    # 159
 echo "$base" | wc -l                            # 160
 diff -d <(echo "$base") <(echo "$base_dpkglog") # 31d30
                                                 # < dpkg
4
ответ дан 12.12.2019, 09:14

Теги

Похожие вопросы