Як ви відстежуєте, які пакунки були встановлені на Ubuntu (Linux)?


38

(Це запитання дуже схоже на 10458. Було запропоновано, що Fedora та Ubuntu / Debian досить різні, щоб гарантувати різні відповіді.)

Оскільки я використовую будь-яку установку Ubuntu, я поступово встановлюю ряд пакетів вище та вище встановлення. Якщо я перевстановлюю або якщо мені потрібно встановити нову машину, зазвичай я хочу перевстановити ці конкретні пакети, і я хочу це зробити швидко, щоб повернутися до роботи з мінімальними клопотами. Наскільки я бачив все менеджери пакетів ( apt-get, aptitudeі synaptic) може сказати мені , які встановлені пакети, і всі вони мають колоди (хоча і різних одиниць для кожного інструменту, який є клопоту). Але жоден з них не може сказати мені, які пакунки у мене євстановлено, на відміну від їх залежностей або оновлень системи. Навіть журнали хитрі в тому, що я не зовсім впевнений, що мені слід витягти з них, або як їх інтегрувати (у випадку різних інструментів сімейства сімейства). Це означає, що кожного разу, коли я перевстановлюю або навіть просто резервну копію, я не знаю, як заново створити цей список.

Я не обов'язково очікую, що будь-який інструмент зробити це для мене, але якщо вони не є, я шукаю обхідні шляхи. Навіть шаблони, з якими потрібно гребувати, хороші правила чи чітке уявлення про те, що саме реєструється, були б корисні. Тут може не бути "найкращої відповіді", але хороші будуть дуже корисні.


Більшість відповідей нижче надають деяке наближення до того, що я шукаю, і певною мірою є корисними. Вибраний - це той, хто найбільш близький до досить автоматичного способу перевстановлення моїх інструментів на нову систему, навіть з усіма її застереженнями.


Ви, швидше за все, не отримаєте одну відповідь, що легко ділиться, для всіх дистрибутивів Linux. Управління пакетами - це велика частина того, що відрізняє різні дистрибутиви Linux.
Телемах

Телемах - Правда. І це може мати сенс розділити це на два питання. Але це видалося досить спеціалізованим питанням, і я використовую обидві системи, тому я не хотів занадто звужувати його заздалегідь. Схоже, більшість відповідей тут стосуються dpkg / apt, тому окреме запитання щодо rpm / yum може мати сенс.
кварк

Перехід на NixOS :) (просто тролінг).
Олексій

Відповіді:


31

На будь-якій машині, що базується на Debian, це один поширений спосіб дублювання набору пакетів. На старій машині:

dpkg --get-selections "*" > my_favorite_packages

Скопіюйте файл my_favorite_packagesна нову машину (привід великим пальцем - хороший варіант, але scpтакож чудово працює). Потім запустіть цю послідовність (з правами root):

apt-get update
dpkg --set-selections < my_favorite_packages
apt-get -u dselect-upgrade

Це отримає не лише встановлені вами пакети. Також вони отримують свої залежності і т. Д. Також, якщо сховища між двома машинами різні, всі ставки виключаються.

Що стосується журналів, apt-getведе журнал /var/log/apt/history.log(спасибі Цхепану за оновлення цього коментаря); dpkgробить (у /var/log/dpkg.log), але, мабуть, важко розібратися і його можна читати лише з кореневими привілеями; aptitudeу нього є, /var/log/aptitudeі ви можете переглядати його за допомогою звичайних привілеїв користувача.

Наскільки я можу сказати, ви праві, що жоден з цих журналів не відстежує конкретно те, що ви встановили, на відміну від автоматично встановлених залежностей. Однак ви можете отримати цю інформацію з aptitudeпошуку. Шукайте всі встановлені пакети, які також були встановлені автоматично:

aptitude search '~i ~M'

Якщо ви хочете встановити лише встановлені (не автозалежності), заперечте ~M:

aptitude search '~i !~M'

Якщо ви хочете, щоб це було відформатовано так, що у вас є лише назви пакетів та слово "встановити", це також aptitudeможна зробити. Це дає вам список, готовий до подачі dpkg --get-selections:

aptitude search '~i !~M' -F "%p install"

(У мене немає нічого на RedHat або системах RedHat основі. До жаль. Там дійсно немає жодної відповіді на Linux сам по собі , так як управління пакетами є великою частиною того , що робить різні дистрибутиви різні .)


Схоже, поєднання ваших порад і Людвіга може зробити трюк: здатність може генерувати сценарій для подачі на dpkg, так що це автоматизовано, що є серйозною виграшею. І якби це зробити на машині ванілі, різниця в списках досить близька до того, що я прошу, щоб бути практично корисним.
кварк

3
Зверніть увагу , що APT тепер зберігає журнал в «/var/log/apt/history.log», і використовується apt-get, synapticі aptitude(наскільки я бачив). Це з початку 2010 року
tshepang

У dpkg.logзвітності не представляється, правда , в Ubuntu 14.04 як будь-який користувач я можу отримати мої вибори легко, не тривіальні, але не так вже й складно. awk '$3 != "install" { next } ; { gsub(/:.+/, "", $4) ; print $4 }' /var/log/dpkg.log | sort | uniq
Стів Бузонас

Насправді я розумію, що це не так просто, як я спочатку вважав, що недолік попереднього сценарію awk не звертає уваги на невстановлені пакети. Наступне 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робить.
Стів Бузонас

7

Використовуйте dpkg -l '*' > jaunty.originalдля повторного відображення всіх встановлених пакетів у щойно встановленій системі.

Після того, як ви встановите всі додаткові пакети, зробіть це dpkg -l '*' > mysystem.2009017.

Додаткові пакети - це лише різниця: diff jaunty.original mysystem.2009017


3
Основна ідея сильна: використовувати командний рядок, щоб скинути список встановлених програм, а потім використовувати командний рядок для встановлення цих пакетів на новій машині. З підходом ви можете бути досить креативними та конкретними.
pcapademic

1
Я віддаю перевагу dpkg --get-
select

Хоча це не відстежує пакунки, які я додав, відмінні від їх залежностей, він, безумовно, формує корисний список.
кварк

3

Здібності насправді в цьому непогані. Aptitude знає, коли щось було встановлено вручну або залежно, і ви можете сказати йому, щоб видалити речі, які більше не потрібні, і вони були встановлені лише тому, що від цього залежало щось інше, зберігаючи вашу систему як можна менше.

Існує кілька пакунків, що складають установку Ubuntu, ubuntu-мінімальний, ubuntu-desktop, ubuntu-сервер тощо. Якщо ви скажете Aptitude позначити їх як встановлені вручну та видалити все інше, тоді ви закінчите мінімальну кількість можливих пакетів.

Я пояснюю, як це зробити у двох дописах у своєму блозі: Очищення Debian GNU / Linux та очищення Debian GNU / Linux (або Ubuntu), репризування . Коротше кажучи, відповідь, яку ви шукаєте:

aptitude search ~i | grep -v "i A"

Востаннє я працював з цим, якщо ви використовували apt-get, то він не працював. Тому я завжди рекомендую здатність, і наскільки я знаю, Debian знецінює apt-get на користь здатності.

Я не знаю, як це зробити на Fedora, і ви, мабуть, повинні розлучитися, ніж в іншому питанні. Fedora та Ubuntu - це різні операційні системи, і їх слід розглядати як такі (навіть якщо вони діляться своїм ядром та деякими іншими матеріалами).


2
Я думаю, що ви можете отримати цю інформацію, не потребуючи grep: aptitude search '~i !~M'слід зробити трюк.
Телемах

1
Крім того, apt-getне застаріло. Debian рекомендує aptitudeкерувати пакетами в командному рядку, але це далеко не застаріле apt-get.
Телемах

Тут є щось тонке. Шукаючи "A" в третьому стовпчику, схоже, позначають пакунки, які, як я знаю, встановлені як залежності. Але явно не всі вони ловлять: більша частина списку точно не була встановлена ​​моїм явним запитом.
кварк

@Telemachus. Ваша команда та команда із шаблоном не роблять однаково: два списки мають різний зміст. Я не знаю достатньо про здатність, щоб сказати, чому все-таки.
кварк

@Pablo: посилання на ваш журнал здаються порушеними. Якщо ви можете їх виправити, я б точно хотів їх прочитати.
кварк

2

На debian apt-show-версіях відображаються версії встановлених пакетів.


Помічено. Здається, це не встановлено (за замовчуванням) на Ubuntu.
кварк

1

Щодо систем, що базуються на підходах, дивіться /var/log/apt/term.log. Для мене є досить чітка лінія, де можна встановити, де закінчилася установка і де почалися мої установки.


Менш корисна для мене, оскільки відбувається змішання ручних встановлень та оновлень системи. Також залежно від вашої настройки term.logs з часом буде застарілою та видаленою, тому вона не повернеться, наскільки мені потрібно.
кварк

Для тих, хто намагається це зауважити, зауважте, що проходження журналу apt здається набагато більшою роботою, ніж інші варіанти, обговорені тут. Це, звичайно, не автоматично витягувати список пакетів з журналу.
кварк

1

Від man aptitude-create-state-bundle:

aptitude-create-state-bundle створює стислий архів, який зберігає файли, необхідні для реплікації поточного стану архіву пакета.

Це збереже ту саму інформацію, aptitudeяку було встановлено вручну.

Він призначений для використання з aptitude-run-state-bundle:

aptitude-run-state-bundle розпаковує заданий пакет стану придатності, створений пакетом aptitude-create-state-bundle (1), до тимчасового каталогу, викликає його разом із доданим та видаляє тимчасовий каталог згодом.


1

Під час простого використання dpkgви не знаєте, чи пакет був встановлений користувачем вручну або автоматично (як залежність або під час початкової установки ОС). Якщо ви хочете зберегти цю інформацію, вам потрібно отримати список лише тих пакетів, які були фактично встановлені вручну.

Для цього ви можете використовувати будь-який з цих двох одноводкових. Обидва отримують такий же вихід на моїй машині і є більш точними, ніж усі рішення, запропоновані до цього часу в цьому питанні. Вони є комбінацією двох відповідей (1) та (2) . Зверніть увагу , що я спочатку відправив цю відповідь тут .

Використання apt-mark:

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

Використання aptitude:

comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Далеко не всі пакети ще падають через тріщину, хоча я підозрюю , що вони є на самому справі встановлено користувачем, або відразу після установки через настройку локалізації мови або , наприклад , через Тотем кодек інсталятор. Крім того, начебто накопичуються версії linux-header, навіть якщо я встановив лише мета-пакет, який не залежить від версії. Приклади:

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

Як це працює

  1. Отримайте список встановлених вручну пакетів. Для здатності додаткові sedвикреслюють залишки пробілу в кінці рядка.
  2. Отримайте список встановлених пакетів відразу після нової установки.
  3. Порівняйте файли, виведіть лише рядки у файлі 1, які відсутні у файлі 2.

Інші можливості також не працюють:

  • Використання ubuntu-14.04-desktop-amd64.manifestфайлу ( тут для Ubuntu 14.04) замість /var/log/installer/initial-status.gz. Більше пакетів відображається як встановлені вручну, навіть якщо їх немає.
  • Використання apt-mark showautoзамість /var/log/installer/initial-status.gz. apt-markнаприклад, не включає пакет xserver-xorg, тоді як інший файл.

Обидва перераховують більше пакетів, ніж вказане рішення.


0

Я упереджений, і рішення, яке я представляю, не завжди можливе, але я втомився від цієї ситуації. У результаті я більше нічого не встановлюю з інструментами оновлення / менеджера пакунків.

Я пройшов досить важкий маршрут (у мене були жорсткі вимоги до версій). Я створив величезний makefile, який завантажує, компілює та встановлює у свій домашній каталог кожен пакет (програму, бібліотеку і все, що мені потрібно). Я розробив його поетапно, по частинах. Makefile завантажує і компілює все, навіть компілятори.

Коли я переходжу на нову систему або перевстановлюю, я просто копіюю makefile (плюс деякі допоміжні речі), запускаю make world та повертаюсь наступного дня.

Для деяких програм, які я розробляю (тому в мене є контроль), я використовую інструмент, який я запрограмував, менеджер пакунків з каштанами . Начебто подібних .app папок на MacOSX. Все є в упаковці, тому я знаю, що встановлено в будь-який час, і я знаю, що це самодостатнє і самодостатнє (за винятком системних ліб)


Ви можете просто помістити команди встановлення менеджера пакунків у сценарій та мати такий же ефект; припускаючи, що потрібний вам код упакований. Ваш підхід дуже схожий на gentoo.
wcoenen

Приємно знати про це. Виглядає як багато додаткової роботи поза системою Ubuntu / Debian за замовчуванням. Я можу бачити підтримку деяких пакетів вручну, але підтримувати всі вони таким чином - це більше роботи, ніж я хочу зробити.
кварк

Так, але з додатковою проблемою, що матеріали ubuntu / fink / darwinports не працюють скрізь платформи (я колись був на цифровому і IBM sp4). Я не стверджую, що це хороший шлях. Я просто кажу, що це робить цю роботу, хоч і потворно, смердюче, і я постійно контролюю те, що відбувається в моїй системі.
Стефано Борині

Звичайно, я міг би вирішити в один із днів насправді серйозно поглянути, щоб з’явитись і переробити все з цим.
Стефано Борині

Цей шлях частіше зустрічається в ці дні, коли ви розглядаєте такі інструменти, як шеф-кухар та лялька.
Стів Бузонас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.