Есть ли любой способ запросить 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
. Существует a syslog
зарегистрируйте там, и мы можем grep
это для наблюдения, какие пакеты были установлены:
grep 'Setting up' /var/log/installer/syslog
Обратите внимание, что мы ищем Установку или Распаковку, а не например, Выбор, так как мы хотим все пакеты, включая установленных как зависимости. Мы должны извлечь имена пакета из этого:
grep 'Setting up' /var/log/installer/syslog | cut -d' ' -f8
Теперь нам нужен список в настоящее время устанавливаемых пакетов, чтобы сделать a 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