Программист
0,1
рейтинг
23 августа 2012 в 19:42

Администрирование → Шпаргалка начинающего Debian/Ubuntu администратора по управлению пакетами

Долгое время меня глодало незнание того, как сделать некоторые элементарные вещи в дебиановских менеджерах пакетов, но, как часто бывает, спросить рядом было не у кого, а до написания куда-либо руки не доходили. И вот наконец вопросы вызрели и я написал свой вопрос в дебиановскую рассылку. Естественно оказалось что пропустил что-то очевидное, но и узнал много неочевидных полезностей, посему решил набросать шпаргалку, авось кому пригодится.

Краткая справка Debian администратора


Основное и общеизвестное

Получение информации о новых/обновлённых пакетах
sudo aptitude update

Обновление
sudo aptitude safe-upgrade

Поиск пакета по именам пакетов
aptitude search key_word

Поиск пакета по точному названию
aptitude search "^name$"

Поиск по описанию
aptitude search "?description("key_word")"

Информация о пакете
aptitude show package_name

Установка
sudo aptitude install package_name

Удаление
sudo aptitude remove package_name

Полное удаление (вместе с конфигами)
sudo aptitude purge package_name

Очистить кэш загруженных пакетов (освободить место)
aptitude autoclean # удалятся только пакеты неактуальных версий
aptitude clean # очистится весь кэш

Установка отдельно скачанного/созданного пакета (для создания пакета из сторонних исходников нужно использовать утилиту checkinstall с флагом -D)
sudo dpkg -i /path/to/package.deb

Для получения доп информации
man aptitude
sudo aptitude install aptitude-doc-en

и смотрим документацию (/usr/share/doc/aptitude/html/en/index.html), кому быструю справку по поисковым шаблонам, тому сюда — /usr/share/doc/aptitude/html/en/ch02s04.html. Если лень ставить доку, то в сети она есть.
Вводная на Debian Wiki: wiki.debian.org/Aptitude

А теперь то что не очевидно или требует полного прочтения документации

1. Как после update посмотреть какие пакеты будут обновлены?
aptitude search ?upgradable

также можно юзать (если поставить)
sudo daptup

но после его установки точно также будет себя вести и обычный update

2. Как узнать что изменилось в пакетах которые будут обновлены?
Можно пробовать
sudo aptitude changelog package_name

для каждого пакета.
Но лучше поставить apt-listchanges, тогда перед любой установкой обновлений будет показан список изменений, по умолчанию настройки не очень удобные, поэтому лучше перенастроить под себя, например, выбрать формат вывода (пока использую текст, при больших обновлениях наверно pager лучше), не слать писем, спрашивать подтверждения, выводить всю информацию. Для этого нужно запустить
sudo dpkg-reconfigure apt-listchanges

3. Что делать если обновление что-то поломало и нужно откатиться?
Отката нет, можно попробовать найти предыдущую версию пакета
sudo aptitude version package_name

и установить её
sudo aptitude install package_name=version

4. Как найти все пакеты установленные вручную?
есть вариант команды (aptitude search '~i!~M'), но к сожалению он не даёт желаемого результата, так что вопрос остаётся открытым, есть куча способов основанных на анализе логов
/var/log/aptitude (+ ротированные куски)
/var/log/installer/initial-status.gz
/var/log/dpkg.log (+ ротированные куски)

но простого и готового решения нет, да информация теоретически может быть потеряна при ротациях, нужно конфигурить

5. Как посмотреть список файлов в пакете?
если пакет установлен
dpkg -L package_name

для любых пакетов поставить apt-file и
apt-file list package_name

6. Как посмотреть какому пакету принадлежит файл?
dpkg -S file_name

7. Как удалить все пакеты, где есть key в названии пакета?
sudo aptitude purge ~ikey

8. Как удалить оставшиеся конфиги от удалённых пакетов?
sudo aptitude purge ~c

9. Как найти пакет пакет, в котором содержится файл lib.so:
apt-file search lib.so

10. Как сконвертировать rpm пакет в deb?
alien --to-deb /path/to/file.rpm

11. Как найти список установленных ядер?
dpkg --list linux-* | grep ii

12. Как установить пакет из testing или experimental?
На эту тему нужно писать отдельно (например так), но если кратко, то команды для этого есть
sudo aptitude -t testing package_name

или
sudo aptitude package_name/testing

13. Как удалить метапакет, но оставить одну из зависимостей?
придётся почитать документацию про ключ unmarkauto или глянуть сюда.

14. Как узнать что попало в файловую систему мимо системы управления пакетами?
Есть утилита cruft, хотя вопрос интерпретации результатов (файла report) пока открыт
sudo cruft -d / -r report --ignore /home --ignore /var --ignore /tmp

15. Какие есть дополнительные репозитории?
Debian — wiki.debian.org/UnofficialRepositories
Ubuntu — множество всяких PPA

16. Что есть ещё?
apt-cdrom
apt-spy
auto-apt. заметка на хабре
apt-key
apt-add-repository
Некоторые вещи умеет только apt-get
Есть альтернативные утилиты для управления пакетами, например wajig, который пытается вобрать в себя функционал всех остальных утилит.

17. Как найти пакеты зависящие от данного
apt-cache rdepends package_name

также может пригодится
aptitude why package_name


Благодарю всех кто помог своими советами в рассылке, жж (JackYF) и хабре ( run4way, sledopit, nazarpc, AgaFonOff, amarao, traaance, adrianopol, Karamax). Замечания и дополнения приветствуются.
worldmind @worldmind
карма
38,0
рейтинг 0,1
Программист
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Администрирование

Комментарии (64)

  • +6
    Офтоп небольшой. Почему в последнее время чаще встречается aptitude, а не apt-*? Или мне кажется?
    • +3
      Рекомендуют его как более продвинутую тулзу, ссылки с цитатами можно увидеть в этой ветке обсуждения
    • –4
      aptitude — новая тулза
      apt-* остались в новых версиях дебиана только для обратной совместимости
      • +2
        не совсем так, часть функций apt* в aptitude нет
        • +4
          И в Ubuntu удалили aptitude «из коробки».
          • 0
            12.04 server, aptitude из коробки стоит
            • 0
              в десктопной нету, пришлось доставлять руками
        • 0
          Когда-то давным давно, во времена etch, было наоборот — многих функций aptitude не было в apt. Например, не было autoremove, а при удалении пакета с помощью apt-get все зависимые пакеты оставались в системе. Затем, благодаря Убунте (хотя, скорее всего, apt обновился всё же в Debian Testing, а в убунту попал уже оттуда; просто релизы дебиана выходят реже) все эти функции появились. Такие дела.
  • +4
    Это по-моему должен знать не только администратор, но и обычный пользователь Ubuntu/Debian. Я по привычке использую apt, разницы особо не вижу.
    • +4
      Разница в разруливании зависимостей. Там где apt-get при удалении пакета предлагает снести полсистемы aptitude находит куда более элегантное решение. Бывают и обратные примеры, но реже. К тому же у aptitude есть псевдографический режим, где можно попробовать разрулить зависимости голыми руками.
      • +2
        Если нужен графический — поставьте synaptic.
        Как-то пробовал в этом псевдографическом, точно не помню, что там было не так, но помню что понятнее было просто в терминале смотреть и ручками вписывать.
  • 0
    а как же управление пользователями, работа с архивами,…
    • 0
      Уточнил заголовок
  • +1
    Тема не раскрыта.

    >5. Как посмотреть список файлов в пакете?
    >поставить apt-file и…
    dpkg -L package_name
    dpkg -c package.deb
    • 0
      Благодарю, дополнил
      • +5
        А ещё установка пакетов из файлов:
        dpkg -i /path/to/package.deb
        • 0
          Благодарю, дополнил
    • 0
      Иногда нагляднее просто «зайти» в нужный .deb как в архив из mc — и посмотреть, что да как. Например, когда собрал пакет сам и хочешь посмотреть, всё ли там на месте.
    • +1
      Только с тем нюансом, что для apt-file пакет не обязательно должен быть скачан и установлен.
      • 0
        Благодарю, важное замечание, уточнил
  • +4
    Как удалить все пакеты, где есть exim4 в названии пакета:
    aptitude purge ~iexim4

    (а то интернеты усыпанными всякими странными конструкциями из помеси aptitude + dpkg + grep + awk).

    Удалить оставшиеся конфиги от удалённых пакетов:
    aptitude purge ~c


    Скачать исходник пакета:
    подключить репозиторий с исходниками (читай продублировать строчку с обычным репозиторием и заменить deb в начале строки на deb-src)
    apt-get source package_name


    Поиск пакета, в котором содержится файл lib.so (предаврительно поставить apt-file):
    apt-file search lib.so


    Очистить кэш загруженных пакетов:
    
    aptitude autoclean # удалятся только пакеты неактуальных версий
    aptitude clean # очистится весь кэш
    
    • 0
      Также удалить можно «apt-get purge .*exim4.*»
    • +1
      >Скачать исходник пакета:
      тогда еще
      apt-get build-dep package_name
      

      чтобы установить зависимости для компиляния этих исходников.
      • 0
        С официальных исходников никогда не ставил, если напишете мини мануал, то добавлю в пост или сделаю ссылку
    • 0
      Благодарю, дополнил
  • +1
    Если скопились старые ядра, найти их пакеты можно так:

    dpkg -l linux-* | grep ii
    


    А потом удалить (я удаляю все, за исключением последних двух linux-image-* и текущего linux-headers-*):

    sudo aptitude purge <список пакетов через пробел>
    

    • 0
      Если же удалить нужно все, за исключением последнего одного, то можно обойтись и без ручного вмешательства:
      aptitude search "?and(~i~nlinux-(im|he) ?not(~n`uname -r`)) ?not(~dmeta) ?not(~ncommon)"

      ( в вашем случае вообще тоже можно, но уж шибко страшные конструкции получаются =) )
    • 0
      Благодарю, дополнил
  • +1
    Таки упомянутое в статье — это для пользователя, а не администратора.
    А как же весьма полезное для обновление машины без интернета через флешку:
    apt-get --print-uris -y dist-upgrade | grep "^'" | awk '{ print $1 }' | sed "s/'//g" > packages.lst # на целевой машине
    wget -i packages.lst # на машине с интернетом
    


    А вот как установить пакеты с зависимостями в, например, /target? Самый близкий аналог: dpkg --root /target, но он же не подгрузит из сети зависимости. Какие-либо манипуляции с аналогичными аргументами apt привели к тому, что он и /var/lib/apt/lists начинает смотреть смотреть в /target.
  • +1
    Тоже бывает полезно:

    dpkg --get--selections > packages_list.txt # помещает в файл список всех установленных пакетов
    dpkg --set-selections < packages_list.txt # Устанавтивает все пакеты перечисленные в файле
    • +1
      Не совсем. Устанавливает потом apt-get или aptitude. Последняя строчка только отмечает пакеты для установки.
    • 0
      dpkg --set-selections полезен, если нужно сделать что-то специфическое.
      Например, заморозить установленную версию пакета, чтобы на неё не было поползновений к апдейту.

      Например, наш рабочий вариант:
      $ tar -xjf bison-1.875.tar.bz2 $ cd bison-1.875 $ ./configure $ make $ sudo checkinstall $ echo 'bison hold' | sudo dpkg --set-selections

      — ставим из исходников специфическую версию bison (потому что это вроде как крайняя версия, которая нормально работает и в винде, и на линухе. А более свежие генерят чуть иной код и тем самым гадят в коммиты. И последней строчкой заможариваем установленную версию, так что все новые апдейты на неё не действуют.
      • 0
        Есть куда более простой вариант — aptitude hold %package_name%
        • 0
          К слову, уже сталкивался с такими граблями, aptitude hold помечает пакет как необновляемый только в рамках самого aptitude, а ближайший запуск apt-get'a его всё-таки обновит. Приходится таскать за собой wajig, который оказался очень удобной штукой.
          • 0
            Решение просто — не использовать apt-get, ведь aptitude лучше. :)
            • 0
              Спорный вопрос. Да проблема даже не в этом. Например Update Manager из Ubuntu пользуется конфигами apt/dpkg, и если поставить пакет на hold в aptitude, а потом обновить систему через GUI (а почему бы и нет?), пакет таки обновится.
  • НЛО прилетело и опубликовало эту надпись здесь
    • +1
      Вы, извините, Debian с Fedora не путаете?
      А хотя, бывают еще VDS и т.п., куда хостеры свои слоупочные сервера обновлений ставят, вместо дистрибутивных…
  • +2
    Про apt-file ни слова, про установку пакетов из sid/experimental ни слова.
    • 0
      Про apt-file слово было, теперь уже есть два, про установку пакетов из всяких testing нужно писать отдельную статью, хотя согласен что упомянуть нужно, благодарю — поправил
  • 0
    мои пять копеек… горжусь ими =)
    Для убунту автоматом установить не достающие ключи к репозиториям, если вы полностью доверяете им и контролируете ситуацию
    sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com `sudo apt-get update 2>&1 | grep -o '[0-9A-Z]\{16\}$' | xargs`
    

    для дебиан нужно заменить keyserver.ubuntu.com на свой — не знаю правда какой =(

    Найти все Qt (KDE) программы и убрать из вывода библиотеки. Полезно, если решитесь со временем почистить систему и убрать из неKDE рабочей среды все KDE приложения. Помните — Qt != KDE. Qt приложение не обязательно тянет по зависимостям части KDE.
    sudo aptitude search '~i!~nlib(~Dqt|~Dkde)'
    


    • 0
      subkeys.pgp.net сгодится для дебиана. ещё были какие-то, но запамятовал.
    • 0
      А в каких случаях этих ключей не достаёт? Какие репозитории нужно подключать чтобы не хватало ключей?
      • 0
        если репозитарий добавлять ручками, а не через apt-add-repository, то придётся самому разбираться с ключами.
        • 0
          ясно, просто обычно с урлом репозитория написана строка для добавления ключа
  • 0
    Я активно юзаю флаг -s, т.е. перед каждой установкой пакета проверяю:
    apt-get install packet_name -s
    Показывается, какие пакеты будут ставиться/апдейтиться, но установки не происходит. Это позволяет принять решение — ставить сейчас или добавить репы / переключиться на testing или unstable для версии поновее.
    Имхо, мастхэв.
  • 0
    Одному мне кажется что…
    image
    всю статью можно было написать одной строкой?
    $aptitude --help
    • 0
      Именно кажется, не только в хелпе, но и в мане нет упоминания иных утилит, да и много чего нет, например описания шаблонов поиска — «For more information on search patterns, see the section “Search Patterns” in the aptitude reference manual», так что только читать всё документацию.
      Ну и шпаргалка документацию не отменяет, а даёт быстрые ответы на стандартные вопросы и ориентиры.
  • 0
    Вот тут есть отличная подборка статей Debian Cleanup. Из неё можно узнать намного больше о практическом применении apt-get/aptitude
    • 0
      Насчёт «намного больше» это перегиб, там и половины упомянутого нет, но есть полезные дополнения, например про утилиту cruft (добавил в пост) или про сборку из исходников, но эту тему я ещё не исследовал — не было необходимости. За ссылку спасибо.
  • 0
    Насколько я понял, пакетные менеджеры ubuntu/debian не умеют показывать список пакетов, установленных вручную.

    aptitude search '~i!~M'
    

    выводит что-то другое.
    • 0
      В убунте действительно куча лишних пакетов помечается ручными, в дебиане должно быть нормально
      • 0
        Что значит «должно быть»? Вы это проверяли?
        • 0
          Чистого эксперимента не проводил, смотрел на одном из доступных серваков — было похоже на правду, доверился хакерам из рассылки — убеждали меня что только под убунтой криво работает. Если есть сомнения, тогда проведу эксперимент
    • 0
      Проверил на чистой установке Debian 6.0.5 — сразу после установки эта команда выдаёт кучу пакетов, так что вы правы — не то, поправил статью, благодарю за бдительность
      • 0
        Да не за что, но меня удивило отсутствие простой возможности решить такую задачу. В этом плане в rolling-release дистрибутивах дела обстоят гораздо лучше (файл world в gentoo, pacman тоже умеет выводить нужный список).
        • 0
          Меня тоже это удивляет, по сути осталось два незакрытых вопроса, это откат и список ручных пакетов. Для ручных пакетов есть ещё куча способов основанных на логах, типо таких, но похоже они все какие-то недоделанные
  • 0
    Ещё kevit подсказывает как получить все измененные конфиги по сравнению с дистрибутивными:
    dpkg-query -W -f='${Conffiles}\n' '*' | awk 'OFS="  "{print $2,$1}' | md5sum -c 2>/dev/null | awk -F': ' '$2 !~ /OK/{print $1}'
    

  • 0
    Как в убунте используя apt-get обновить все, за исключением ядра?
    • –2
      apt-get update
      apt-get upgrade
    • +1
      Зафиксировать пакет ядра, см. man aptitude по ключевым словам hold и keep, подробнее не скажу т.к. сам не пользовался
  • 0
    Как посмотреть какие пакеты входят в метапакет?
    Как сделать чтобы в результатах поиска показывались размеры пакетов?
    Как сделать поиск по содержимому, но с выводом не в формате apt-file, а aptitude ( например вывести все пакеты в составе которых есть файл /etc/init.d и в результатах вывода вывести краткое описание пакетов)?
    • 0
      Извиняюсь за поздний ответ, не до этого было:
      1. aptitude show — см список зависимостей
      2. Примерно так: aptitude search -F "%p %D %I" colordiff
      3. Видимо так: apt-file search perl.pm | cut -d' ' -f 1 | sed 's/://' | xargs aptitude search

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.