Вопрос или проблема
Я хотел бы получить список пакетов, установленных вручную с помощью apt
или aptitude
, и иметь возможность выяснить, был ли пакет foobar
установлен вручную или автоматически.
Как это можно сделать из командной строки?
Вы можете использовать один из двух однострочных скриптов. Оба выдают абсолютно одинаковый результат на моей машине и более точны, чем все предложенные решения до сих пор (6 июля 2014 года) в этом вопросе.
Использование 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)
Очень немного пакетов все еще проходят незамеченными, хотя я подозреваю, что именно эти действительно были установлены пользователем, либо сразу после установки через настройки локализации языка, либо, например, через установщик кодеков Totem. Также версии linux-header также, как кажется, накапливаются, несмотря на то, что я установил только метапакет без конкретной версии. Примеры:
libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29
Как это работает:
- Получите список вручную установленных пакетов. Для aptitude дополнительная команда
sed
удаляет оставшиеся пробелы в конце строки. - Получите список пакетов, установленных сразу после новой установки.
- Сравните файлы, выводите только те строки из файла 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, тогда как другой файл включает.
Я использовал различные другие публикации StackExchange в качестве справочного материала, однако ни одна из них не работает так же хорошо, как приведенное выше решение:
Оба списка содержат больше пакетов, чем приведенное выше решение.
Редактирование: что делать, если вы обновились с предыдущей версии:
Если вы обновили Ubuntu с одной версии на другую, вам, вероятно, нужно будет скорректировать этот процесс. В этом случае я бы проверил файл manifest новой версии (см. выше) в дополнение к файлу initial-status.gz из текущей версии. Вы можете легко сделать это, просто добавив еще одно сравнение. Используя только файл manifest, не получится, так как файл manifest, к сожалению, не содержит всего того, что содержит файл initial_status.gz (я проверил).
В новых версиях пакета apt также существует команда apt-mark
apt-mark showmanual
Чтобы получить список всех пакетов (не установленных, установленных пользователем или установленных по умолчанию, через все PPA), apt
использует следующий метод:
apt list [option]
Возможные полезные опции:
--installed
для отображения только тех пакетов, которые установлены в системе (из примерно 50 000+)
--manual-installed
для перечисления пакетов, которые были эксплицитно установлены командой, либо прямо, либо как зависимости.
В качестве альтернативы, вы можете выполнить:
apt list --installed | grep -F \[installed\]
, чтобы получить список пакетов, которые установлены в результате пользовательских команд, и их зависимостей только, а также получить дополнительную информацию о них, такую как версия и поддерживаемая архитектура (x86, x86_64, amd64, все и т. д.)
Для Ubuntu 16.04 просмотрите файл журнала /var/log/apt/history.log
.
Например:
zgrep 'Commandline: apt' /var/log/apt/history.log /var/log/apt/history.log.*.gz
Это не идеально, но довольно хорошо, чтобы понять, что я установил вручную. Добавьте -B 1
в grep, чтобы увидеть, когда это было установлено.
Пример вывода
Commandline: apt install postgresql-9.5-plv8
Commandline: aptdaemon role="role-install-file" sender=":1.85"
Commandline: apt install task
Commandline: apt autoremove
Commandline: apt install atom
Commandline: apt upgrade
Commandline: apt-get install asciinema
Commandline: apt install iperf3
Commandline: apt upgrade
Commandline: apt-get install chromium-browser
Commandline: apt install joe cpanminus build-essential postgresql libdbd-pg-perl libcrypt-openssl-bignum-perl libcrypt-openssl-rsa-perl libio-socket-ssl-perl libnet-ssleay-perl libssl-dev
Commandline: aptdaemon role="role-commit-packages" sender=":1.2314"
Commandline: apt install git
Commandline: apt install sqlite
Commandline: apt install whois
Commandline: apt install libdbd-pg-perl
Commandline: apt install perl-doc
Commandline: apt upgrade
Не уверен, захватит ли это aptitude
. Кажется, оно не захватывает установки из приложения Ubuntu Software для рабочего стола.
apt-mark showauto | grep -iE '^foobar$'
выдаст “foobar”, если пакет был установлен автоматически, ничего в противном случае.
aptitude search '!~M ~i'
выдаст список пакетов, которые не были установлены автоматически. Жаль, что aptitude не будет частью стандартной установки на Ubuntu Desktop, начиная с версии 10.10.
Я хотел бы предложить решение с графическим интерфейсом.
-
Откройте Synaptic Package Manager.
-
Перейдите к Status.
-
Нажмите Installed (manual).
Это даст список пакетов, установленных вручную с помощью apt
или aptitude
.
К сожалению, я не смог найти никаких параметров в Custom Filters для выяснения, был ли пакет foobar
установлен вручную или автоматически.
Если пакет находится в Installed, но не в Installed (manual), значит он был установлен автоматически. Если пакет находится в Installed (manual), значит он был установлен вручную.
Следующий скрипт выведет все пакеты, которые не настроены на автоматическую установку, а следовательно, были установлены вручную:
#!/usr/bin/python
try:
import apt_pkg
except ImportError:
print("Ошибка при импорте apt_pkg, установлен ли python-apt?")
sys.exit(1)
apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
pkgname = tagfile.section.get("Package")
autoInst = tagfile.section.get("Auto-Installed")
if not int(autoInst):
auto.add(pkgname)
print("\n".join(sorted(auto)))
он основан на том, как apt-mark выводит автоматически установленные пакеты.
Как отмечали несколько человек, apt-mark showmanual кажется немного ошибочным (и я сообщил об этом как о ошибке 727799). Когда я его использую, он действительно сообщает о множестве вещей, которые даже не записываются в /var/lib/apt/extended_states (где это предположительно хранится), и apt-get не регистрирует их как установленные в /var/lib/apt/extended_states (только в /var/lib/dpkg/status). Представленный выше скрипт на Python от txwikinger напрямую берет данные из /var/lib/apt/extended_states, но если вы будете его использовать сегодня, синтаксис может не сработать (мой только начал генерировать ошибки с Kubuntu 13.10). Обновленный синтаксис следующий:
#!/usr/bin/python
import sys
try:
import apt_pkg
except ImportError:
print("Ошибка при импорте apt_pkg, установлен ли python-apt?")
sys.exit(1)
apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
pkgname = tagfile.section.get("Package")
autoInst = tagfile.section.get("Auto-Installed")
if not int(autoInst):
auto.add(pkgname)
print("\n".join(sorted(auto)))
Для меня это был очень короткий список из 5 элементов, который также кажется не совсем точным.
Если вы в виртуальной машине (VM), то следующее может сработать лучше для вас:
egrep 'apt(-get)? +install' /var/log/apt/history.log
Это найдет программное обеспечение, установленное вами как через apt
, так и apt-get
. Если вы хотите включить также aptitude
, это должно сработать:
egrep 'apt(-get|itude)? +install' /var/log/apt/history.log
(Но не думайте, что это найдет пакеты, установленные напрямую через dpkg
— я в любом случае этого не делаю.)
Аргументация: Если виртуальная машина уже содержала какое-то программное обеспечение, установленное мейнтейнерами VM (в базовом образе), но не вами, то этот ответ не покажет программное обеспечение, установленное ими (ну, по крайней мере, не в ВМ, которые я использую), только то, что установили вы.
Другие ответы, такие как apt-mark showmanual
или aptitude search '!~M ~i'
или apt list --manual-installed
, в моем случае, в ВМ, показывали мне 90% неинтересных пакетов, которые я не устанавливал — скорее всего, это сделали мейнтейнеры базового образа ВМ (предполагаю).
Если никто не предложит вам хороший ответ с использованием команды apr-something, вы можете сделать это сложным способом. Apt-get хранит свою информацию в /var/lib/apt/extended_states. Любой файл, который установлен автоматически, будет добавлен в этот файл. Если вы установите вручную пакет, который уже имеется в этом файле, пакет останется в этом файле, но с Auto-installed: 0 на второй строке. Он не удаляется.
Примечание: Как и ожидалось, появились лучшие ответы, которые, вероятно, будут работать, если местоположение файла изменится. Я оставляю свой просто на случай, если информация о местоположении файла будет полезной.
Обновленная версия ответа @jmiserez:
comm -23 \
<(apt-mark showmanual | sort -u) \
<(grep -oP '^(?:Package|Depends):\s+\K.*' /var/log/installer/status \
| grep -oP '[^\s,()]+?(?=(?:\s+\([^)]+\))?+(?:,|$))' \
| sort -u)
Лог больше не хранится в /var/log/installer/initial-status.gz
, и оригинал не исключал зависимые пакеты. Список, полученный с его помощью, будет включать пакеты, которые вы не устанавливали вручную, но его длина будет более управляемой и он все еще весьма полезен.
После долгих поисков я смог собрать этот скрипт. Он работает для меня нормально:
#!/bin/bash
# Список всех пакетов, установленных в данный момент
current=$(dpkg -l | awk '{print $2}' | sort | uniq)
# Список всех пакетов, установленных с системой
pre=$(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort | uniq)
# Список пакетов, которые не зависят от других пакетов
manual=$(apt-mark showmanual | sort | uniq)
# (Текущие - Предварительные) ∩ (Ручные)
packages=$(comm -12 <(comm -23 <(echo "$current") <(echo "$pre")) <(echo "$manual") )
for pack in $packages; do
packname=$(echo $pack | cut -f 1 -d ":")
desc=$(apt-cache search "^$packname$" | sed -E 's/.* - (.*)/\1/')
date=$(date -r /var/lib/dpkg/info/$pack.list)
echo "# $desc"
echo "# $date"
echo "sudo apt-get install $pack"
echo -e ""
done
Это позволит получить список пакетов, установленных вручную, и их соответствующие версии
apt list --manual-installed | sed 's/\// /' | awk '{print $1 "=" $3}'
Собрав из отличных ответов других в этой ветке и дополнительной информации из Интернета, я собрал команду, которая соответствует моим нуждам и идеально воспроизводит мою историю apt:
ls /var/log/apt/history.log* | sort --version-sort | xargs -d '\n' zgrep -B 1 'Commandline: apt'
Таким образом, она выдает историю в хронологическом порядке, например
/var/log/apt/history.log.1
/var/log/apt/history.log.2
...
/var/log/apt/history.log.10
Вы можете добавить параметр --reverse
к sort, чтобы отсортировать файлы в обратном порядке. Таким образом, у вас будут самые старые команды в верхней части списка. Плюс, он включает дату команды.
Благодарности @s1037989 и @iruvar
Как сказал Li Lo, apt-mark showauto
должен дать вам длинный список автоматически установленных пакетов.
Теперь, чтобы показать вещи, которые установлены вручную, оказывается, есть отличный простой модификатор поиска для aptitude. Но вы не хотите этого делать. Вы хотите написать огромную команду bash, которая делает какую-то ракетную науку.
Примечание: Это больше иллюстрация того, насколько круто вы будете выглядеть, выполняя огромные команды bash перед своими друзьями.
comm -3 <(dpkg-query --show -f '${Package} ${Status}\n' | \n
grep "install ok installed" | cut --delimiter=" " -f 1) <(apt-mark showauto)
Я разбил её на две строки для читабельности. Что она делает?
- Сначала мы запрашиваем dpkg для получения списка установленных пакетов.
- Мы фильтруем их для тех, которые действительно установлены (а не просто остаточная конфигурация)
- Мы отсекаем статус
- Мы сравниваем этот список с автоматическим списком из
apt-mark
- Мы радуемся, потому что можем.
Я нашел элегантный метод для этого.
Просто выведите файл ~/.bash_history
с помощью команды grep
, чтобы отсортировать их:
cat .bash_history | grep "apt install"
Удобно, вы также можете искать apt-get
.
Пример выхода, который у меня есть:
sudo apt install -f
sudo apt install vim
sudo apt install dconf
sudo apt install dconf-editors
sudo apt install dconf-editor
sudo apt install nmap
sudo apt install python-tk
sudo apt install python-tk
Не уверен, полезно ли это, но для поиска пакетов, которые были недавно установлены вручную текущим пользователем, ищите в истории. Например, для bash
:
$ history | egrep '\bapt\b'
Модифицируйте grep для проверки конкретных пакетов.
Если вы установили все свои пакеты из терминала с помощью apt, вы можете выполнить простую регулярную проверку на apt install *
в содержимом файла /var/log/apt/history.log
и посмотреть, что он найдет. Регулярное выражение может быть таким простым, как: Commandline: apt install [\w -]+
(следуя лог-синтаксису apt в Ubuntu 16.04)
Начиная с версии Ubuntu 22.04 и далее, вы могли бы позаботиться об этом, используя более современный интерфейс apt
под названием nala
(для 22.04 вы должны включить репозиторий “universe”).
sudo apt install nala
С этого момента используйте nala
для установки новых пакетов в вашу систему, используя:
sudo nala install <имя-пакета>
Оставьте обновления безопасности и т. д. для пакета unattended-upgrades
.
Теперь, когда вы запускаете команду nala history
, вы получаете список команд, выполненных с помощью nala, включая установленные пакеты. Чтобы отфильтровать только новые установки, используйте:
nala history | grep install
Дополнительным преимуществом функции истории является то, что вы можете отменить любой шаг в истории, чтобы вы могли отменить процедуры установки пакета — что непросто сделать с помощью самого apt
.
Хотя это решение мною не полностью протестировано, оно имеет преимущество перед другими ответами, так как отображает только пакеты, которые были явно запрошены пользователями. Другие ответы, кажется, включают также пакеты, которые были установлены во время установки ОС.
Трюк заключается в проверке файла журнала и поиске строки, начинающейся с Requested-By
:
$ cat /var/log/apt/history.log* | awk -v RS= '/Requested-By:/'
Start-Date: 2025-01-07 18:30:40
Commandline: apt install mdadm
Requested-By: **SOME_USER_NAME** (1000)
Install: libidn12:amd64 (1.41-1, automatic), liblockfile-bin:amd64 (1.17-1+b1, automatic), exim4-config:amd64 (4.96-15+deb12u6, automatic), psmisc:amd64 (23.6-1, automatic), exim4-base:amd64 (4.96-15+deb12u6, automatic), mdadm:amd64 (4.2-5), libevent-2.1-7:amd64 (2.1.12-stable-8, automatic), libunbound8:amd64 (1.17.1-2+deb12u2, automatic), ca-certificates:amd64 (20230311, automatic), exim4-daemon-light:amd64 (4.96-15+deb12u6, automatic), bsd-mailx:amd64 (8.1.2-0.20220412cvs-1, automatic), liblockfile1:amd64 (1.17-1+b1, automatic), libgnutls-dane0:amd64 (3.7.9-2+deb12u3, automatic), openssl:amd64 (3.0.15-1~deb12u1, automatic)
End-Date: 2025-01-07 18:31:00
Затем вы можете перенаправить вывод в sed, чтобы получить имя пакета:
$ cat /var/log/apt/history.log* | awk -v RS= '/Requested-By:/' | sed -n 's/Commandline: apt install //p'
mdadm
Ограничение:
Это перечисляет все пакеты, которые когда-либо были установлены пользователями. Если они удалены, они все равно будут в выводе.
Вы могли бы проанализировать журнал дальше, чтобы правильно их перечислить, хотя это довольно утомительно. Это потому, что последующая команда apt install
может заново установить пакеты после удаления, но на этот раз в качестве зависимости. Вам пришлось бы написать сложный скрипт для этого. В этом случае вы бы искали другие ответы, указывающие на специальный пакет Debian для этого.
На более ранних версиях Ubuntu я использовал этот метод для перечня пакетов, установленных вручную через apt.
К сожалению, файл /var/log/installer/initial-status.gz
, по-видимому, был удален из Ubuntu в версии 24.04, поэтому я не смог использовать этот метод.
Я искал в разных местах, и, комбинируя различные вещи, я нашел следующий сложный метод.
Вот вся команда оболочки:
comm -23 <(comm -12 <(apt-mark showmanual | sort -u) \
<(debfoster -s -i | tail -n +2 | tr -s ' ' '\n' | sort -u)) \
<(cat <(zcat $(ls /var/log/apt/history.log.* | sort -V | xargs)) /var/log/apt/history.log |
zgrep -m 1 -oP 'Commandline: apt.*?install\s+\K.*' | tr -s ' ' '\n' | sort -u)
Объяснение:
Команда сильно полагается на подмену процессов через конструкцию <()
.
comm -23
отображает строки, существующие только в первом вводе.
Команда comm -12
отображает строки, общие для обоих вводов.
apt-mark showmanual | sort -u
выводит список вручную установленных пакетов. Однако этот список содержит больше пакетов, чем вы фактически устанавливаете вручную.
debfoster -s -i | tail -n +2 | tr -s ' ' '\n' | sort -u
перечисляет все пакеты-сироты. Пакет debfoster
должен быть установлен с помощью sudo apt install debfoster
заранее.
С помощью операции comm -12
мы получаем вручную установленные пакеты, которые также являются сиротами. Этот шаг полезен для удаления определенных пакетов (efibootmgr
, grub-efi-amd64
и т. д.) из окончательного списка.
К настоящему моменту мы сконструировали первый ввод для внешней команды comm -23
.
Второй ввод немного сложнее, поэтому будет объяснен по частям:
cat <(zcat $(ls /var/log/apt/history.log.* | sort -V | xargs)) /var/log/apt/history.log |
zgrep -m 1 -oP 'Commandline: apt.*?install\s+\K.*' | tr -s ' ' '\n' | sort -u
apt
сохраняет свои журналы истории в каталоге /var/log/apt/
. Файл history.log
содержит последнюю историю. Тогда как файлы history.log.*.gz
содержат архивированные логи.
Команда cat <(zcat $(ls /var/log/apt/history.log.* | sort -V | xargs)) /var/log/apt/history.log
объединяет все эти журналы в хронологическом порядке, от самого старого к самому новому.
Команда zgrep -m 1 -oP 'Commandline: apt.*?install\s + \K.*' | tr -s ' ' '\n' | sort -u
затем получает все пакеты, установленные с помощью первой команды apt install
из хронологически отсортированных журналов.
Из того, что я мог заключить, первая команда apt install
содержит пакеты, которые были включены в базовую установку Ubuntu. Это предположение может быть неверным, но я считаю его разумным на данный момент, если не будет доказано обратное.
Наконец, внешняя команда comm -23
выводит пакеты, которые были вручную установлены и сироты, но не включены в первую команду apt install
.
На свежей установке Ubuntu 24.04 (с включением по умолчанию, программным обеспечением от третьих лиц и включением LVM-разметки) выход команды должен быть похож на следующий:
debfoster
linux-generic-hwe-24.04
lvm2
nvidia-driver-550
shim-signed
ubuntu-restricted-addons
Что лучшее, что я мог сделать.
Некоторые другие методы, которые не работали так хорошо, как ожидалось:
- Файл манифестов содержит большинство пакетов, которые были предустановлены, но некоторые пакеты, кажется, ускользнули (
libm17n-0
и др.) - Команда
sudo apt-mark minimize-manual
не, похоже, помогла много.
Я мог бы только пожелать, чтобы эта процедура могла быть проще, но это, похоже, невозможно на данный момент.
Это даст список всех вручную установленных пакетов без: зависимостей, удаленных пакетов, пакетов, установленных при установке системы.
unopts() {
in=`cat`
echo "$in" | sed -r 's/ --[^ ]+//g;s/ -[^ ]+//g'
}
list() {
cat '/var/log/apt/history.log' |
grep --color=never -v '\-o APT::Status-Fd=4 \-o APT::Keep-Fds::=5 \-o APT::Keep-Fds::=6' |
egrep --color=never "Commandline: apt-get.* $1" |
sed -r "s/Commandline: apt-get//;s/ $1//" |
unopts |
tr ' ' '\n' |
sed '/^$/d'
}
hapt() {
tmp=`mktemp -d`
installed=$tmp/installed
deleted=$tmp/deleted
dpkg=$tmp/dpkg
list 'install' > $installed
list '(remove|purge|autoremove)' > $deleted
dpkg --get-selections |
grep -v 'deinstall' |
cut -f 1 > $dpkg
while read package
do
sed -i "0,/$package/{//d;}" $installed
done < $deleted
while read package
do
if [ -z "`grep --color=never "^$package$" $dpkg`" ]
then
sed -i "0,/$package/{//d;}" $installed
fi
done < $installed
cat $installed
rm -r $tmp
}
.
Ответ или решение
Для IT-специалиста поддержка системы и управление установленными приложениями является важной частью работы. Это особенно актуально в контексте Unix-систем, где пакетные менеджеры, такие как apt и aptitude, играют ключевую роль в установке и управлении программными пакетами. Одной из важных задач является отладка списка пакетов, который был установлен вручную, чтобы избежать нежелательного расхода ресурсов системы.
Теория
Когда пакеты устанавливаются в Unix-системах через apt или aptitude, они могут быть помечены как установленные вручную или автоматически. Автоматическая установка часто подразумевает, что пакет был установлен как зависимость для другого, вручную установленного пакета. Если администратор системы хочет определить пакеты, установленные вручную, чтобы провести их аудит или очистку, ему нужно использовать доступные инструменты для фильтрации таких пакетов.
Пример
Для получения списка вручную установленных пакетов можно использовать команды apt-mark
и aptitude
, а также сочетания различных команд для достижения точного результата. Команда apt-mark showmanual
предоставляет список пакетов, которые были явно установлены пользователем.
Вот пример команды, использующей 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)
Применение
-
Получение списка вручную установленных пакетов:
Используйтеapt-mark showmanual
илиaptitude search '!~M ~i'
. Это поможет выделить пакеты, установленные с конкретной целью, а не как часть сложного набора зависимостей. -
Используйте скрипты для автоматизации процесса:
Для более обширного анализа и автоматизации процессов администрирования можно использовать сценарии, основанные на Python или Bash, которые читают журналы и статусы установки, такие как/var/log/apt/history.log
или/var/lib/apt/extended_states
.Пример на Python, анализирующий автоматически и вручную установленные пакеты:
import apt_pkg apt_pkg.init() STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states" auto = set() tagfile = apt_pkg.TagFile(open(STATE_FILE)) while tagfile.step(): pkgname = tagfile.section.get("Package") autoInst = tagfile.section.get("Auto-Installed") if not int(autoInst): auto.add(pkgname) print("\n".join(sorted(auto)))
-
Работа с журналами установки:
Для глубокого анамнеза использования пакетов можно просмотреть историю команд с помощью:zgrep 'Commandline: apt' /var/log/apt/history.log /var/log/apt/history.log.*.gz
Это предоставит хронологическую последовательность команд, что позволит не только увидеть установленные вручную пакеты, но и понять контекст их установки.
Итак, управляя вручную установленными пакетами, IT-специалист может эффективно оптимизировать систему, уменьшая её нагрузку и предотвращая накопление ненужных данных. Введение этих практик позволит более эффективно управлять как маленькими серверами, так и крупными корпоративными системами.