Есть ли способ запросить dpkg
чтобы сказать, какие пакеты были добавлены / удалены после базовой установки системы?
Я использую Debian 5
Есть ли способ запросить dpkg
чтобы сказать, какие пакеты были добавлены / удалены после базовой установки системы?
Я использую Debian 5
Насколько я могу судить, нет простого способа сделать это. База данных dpkg
содержит только текущее состояние пакетов, поэтому любую историю придется выводить или анализировать из журналов.
dpkg-query -f='${Package}\n' -W | grep -vx "`grep 'Setting up' /var/log/installer/syslog | cut -d' ' -f8`"
debian-installer
записывает свои журналы в /var/log/installer
. Там в syslog
файл там , и мы можем grep
, что посмотреть , что были установлены пакеты:
grep 'Setting up' /var/log/installer/syslog
Обратите внимание, что мы ищем настройки или распаковки, а не например. Выбор, так как мы хотим, чтобы все пакеты, в том числе установленные как зависимости. Нам нужно извлечь имена пакетов из этого:
grep 'Setting up' /var/log/installer/syslog | cut -d' ' -f8
Теперь нам нужен список установленных на данный момент пакетов, чтобы выполнить reverse grep
. Мы хотим только имена пакетов, например. нет описаний, чтобы избежать отфильтровывания, поэтому простой dpkg -l
не очень хорош. Вместо этого мы можем использовать dpkg-query
:
dpkg-query -f='${Package}\n' -W
Осталось только отфильтровать содержимое 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"`"
Чтобы проверить, правильно ли мы получили пакеты, мы можем посчитать строки:
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). С помощью (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