pacman (Русский)/Tips and tricks (Русский)
Полезные советы, которые расширят возможности используемых утилит и самого pacman, можно найти в статьях Базовые утилиты и Bash.
Обслуживание
grep -Fxf
и grep -Fxvf
.
Смотрите также Обслуживание системы.
Список пакетов
С версией
При составлении отчётов об ошибках или обсуждении установленных пакетов может понадобиться составить список пакетов с версиями.
- Пакеты, установленные явно:
pacman -Qe
. - Пакеты в группе
группа
:pacman -Sg группа
. - Сторонние пакеты (как правило, скачаны и установлены вручную либо были удалены из репозиториев):
pacman -Qm
. - Пакеты из базы синхронизации:
pacman -Qn
. - Пакеты из базы синхронизации, установленные явно и не являющиеся зависимостями, в том числе опциональными:
pacman -Qent
. - Пакеты по регулярному выражению (regex):
pacman -Qs regex
. - Пакеты по регулярному выражению с пользовательским форматом вывода (требуется пакет expac):
expac -s '%-30n %v' regex
.
С размером
При необходимости освободить место на жёстком диске полезно будет узнать размер установленных пакетов. Можно определить как размер каждого пакета в отдельности, так и суммарный размер пакета и его зависимостей.
По отдельности
Список установленных пакетов с размером:
$ LC_ALL=C pacman -Qi | awk '/^Name/{name=$3} /^Installed Size/{print $4$5, name}' | sort -h
С зависимостями
Размеры пакетов вместе с зависимостями (два способа):
- Установите пакет expac и выполните
expac -H M '%m\t%n' | sort -h
. - Установите пакет pacgraphAUR и выполните
pacgraph -c
.
Размер загружаемых пакетов (если пакеты
не указать, то будет выведен список всех пакетов в базе синхронизации):
$ expac -S -H M '%k\t%n' пакеты
Размер и описание явно установленных пакетов, не входящих ни в мета-пакет base, ни в группу пакетов xorg:
$ expac -H M "%011m\t%-20n\t%10d" $(comm -23 <(pacman -Qqen | sort) <({ pacman -Qqg xorg; expac -l '\n' '%E' base; } | sort -u)) | sort -n
Список пакетов, которым требуется обновление, с размером загрузки:
$ expac -S -H M '%k\t%n' $(pacman -Qqu) | sort -sh
Список только необязательных зависимостей:
$ expac -S "%o" пакет
С датой
Список последних 20 установленных пакетов при помощи expac:
$ expac --timefmt='%Y-%m-%d %T' '%l\t%n' | sort | tail -n 20
или в секундах с начала эпохи (1970-01-01 UTC):
$ expac --timefmt=%s '%l\t%n' | sort -n | tail -n 20
Не в группе или репозитории
Список явно установленных пакетов не из мета-пакета base:
$ comm -23 <(pacman -Qqe | sort) <(expac -l '\n' '%E' base | sort)
Список явно установленных пакетов, которые не входят в мета-пакет base или группу пакетов xorg:
$ comm -23 <(pacman -Qqe | sort) <({ pacman -Qqg xorg; expac -l '\n' '%E' base; } | sort -u)
Список установленных пакетов, которые не явлются зависимостями других пакетов и не принадлежат мета-пакету base или группе пакетов xorg:
$ comm -23 <(pacman -Qqt | sort) <({ pacman -Qqg xorg; echo base; } | sort -u)
То же, но с описаниями:
$ expac -H M '%-20n\t%10d' $(comm -23 <(pacman -Qqt | sort) <({ pacman -Qqg xorg; echo base; } | sort -u))
Список пакетов, установленных не из репозитория имя_репозитория
:
$ comm -23 <(pacman -Qq | sort) <(pacman -Sql имя_репозитория | sort)
Список пакетов, установленных из репозитория имя_репозитория
:
$ comm -12 <(pacman -Qq | sort) <(pacman -Sql имя_репозитория | sort)
Список пакетов Arch Linux ISO, которые не входят в мета-пакет base:
$ comm -23 <(curl https://gitlab.archlinux.org/archlinux/archiso/-/raw/master/configs/releng/packages.x86_64) <(expac -l '\n' '%E' base | sort)
comm
можно использовать combine
из пакета moreutils, который имеет более простой для запоминания синтаксис. Смотрите combine(1).В разработке
Список установленных пакетов, которые считаются нестабильными и/или находятся в стадии активной разработки:
$ pacman -Qq | grep -Ee '-(bzr|cvs|darcs|git|hg|svn)$'
Зависимости пакета
Чтобы узнать список зависимостей пакета, можно посмотреть вывод команды:
$ pacman -Qi пакет
Для использования в скриптах, чтобы не приходилось парсить вывод этой команды, можно использовать expac:
$ expac -S '%D' пакет
Просмотр пакетов
Следующая команда выведет информацию об установленных пакетах:
$ pacman -Qq | fzf --preview 'pacman -Qil {}' --layout=reverse --bind 'enter:execute(pacman -Qil {} | less)'
Утилита fzf выдаёт данные в терминал в виде двух панелей: названия пакетов слева, информация о них — справа.
Начните вводить буквы, чтобы искать пакет по названию; навигация по списку — стрелками или комбинациями клавиш Ctrl-j
/Ctrl-k
; нажатие Enter
выводит информацию о пакете в формате less.
Следующая команда fzf позволяет просматривать пакеты, о которых знает pacman (и установленные, и не установленные):
$ pacman -Slq | fzf --preview 'pacman -Si {}' --layout=reverse
Клавиши для навигации те же, но Enter
не работает.
Список файлов пакета с размером
Если какой-то пакет стал занимать слишком много места на диске и вы хотите понять, какие файлы в этом виноваты, выполните:
$ pacman -Qql пакет | grep -v '/$' | xargs -r du -h | sort -h
Поиск файлов без пакета-владельца
Если в вашей системе появились файлы, которые не принадлежат ни одному пакету (обычная ситуация, если вы не используете пакетный менеджер для установки программ), то стоит их найти и удалить.
Первый способ найти такие файлы — командой pacreport --unowned-files
(пакет pacutils) с правами root, которая, помимо прочего, выведет список "ничьих" файлов.
Второй — составить список интересующих файлов и проверить их через pacman:
# find /etc /usr /opt | LC_ALL=C pacman -Qqo - 2>&1 >&- >/dev/null | cut -d ' ' -f 5-
Отслеживание созданных пакетами файлов-сирот
Как правило, в нормально функционирующей системе со временем скапливаются файлы-призраки, вроде файлов состояний, логов, индексов и т.п.
Утилита pacreport
из пакета pacutils отслеживает такие файлы в привязке к создавшим их пакетам с помощью настроек в файле /etc/pacreport.conf
(см. pacreport(1) § FILES).
Пример настроек (сокращённо):
/etc/pacreport.conf
[Options] IgnoreUnowned = usr/share/applications/mimeinfo.cache [PkgIgnoreUnowned] alsa-utils = var/lib/alsa/asound.state bluez = var/lib/bluetooth ca-certificates = etc/ca-certificates/trust-source/* dbus = var/lib/dbus/machine-id glibc = etc/ld.so.cache grub = boot/grub/* linux = boot/initramfs-linux.img pacman = var/lib/pacman/local update-mime-database = usr/share/mime/magic
После этого команда pacreport --unowned-files
с правами root выведет список файлов-сирот, если связанные с ними пакеты были удалены (или вместо старых файлов были созданы новые).
Кроме того, утилита aconfmgr (aconfmgr-gitAUR) может отслеживать изменённые файлы и файлы без пакета-владельца с помощью скрипта настройки.
Удаление неиспользуемых пакетов
Пакеты-сироты — это пакеты, которые когда-то были установлены как зависимости других пакетов, но на данный момент не требуются ни одному установленному пакету.
Они со временем могут накапливаться в системе при удалении пакетов командой pacman -R пакет
вместо pacman -Rs пакет
, при установке зависимостей для сборки или при установке новых версий пакетов, которым больше не требуются некоторые старые зависимости.
Команда для рекурсивного удаления пакетов-сирот и их файлов настроек:
# pacman -Qtdq | pacman -Rns -
Если неиспользуемых пакетов найдено не было, pacman выведет сообщение ошибка: аргумент '-' указан без ввода в stdin
. Это нормальное поведение команды pacman -Rns
, которой не было передано аргументов. Можно избавиться от ошибки добавлением ifne(1) из пакета moreutils в начале второй команды.
-Qt
выводит только чистые пакеты-сироты. Чтобы включить список пакеты, которые являются опциональными зависимостями, укажите флаг -t
дважды (например, -Qtt
).
pacman -Qtd
в PostTransaction хук pacman, чтобы получить уведомление, если после транзакции имеются пакеты-сироты. Это позволяет узнать об удалении пакета из репозитория, поскольку любой удалённый пакет также станет сиротой в локальной установке (если он не был установлен явно). Чтобы избежать появления ошибки, если сироты не найдены, используйте следующую команду для Exec
в вашем хуке: /usr/bin/bash -c "/usr/bin/pacman -Qtd || /usr/bin/echo '=> None found.'"
Пакет pacman-log-orphans-hookAUR предоставляет такой хук с более подробными инструкциями.Более тщательное определение ненужных пакетов
Иногда описанный выше метод находит не все ненужные пакеты, например, из-за циклических зависимостей.
Для поиска таких пакетов:
$ pacman -Qqd | pacman -Rsu --print -
Для удаления всех пакетов из этого списка запустите команду без аргумента --print
.
Удаление всех пакетов, кроме базовых
Если возникла необходимость очистить систему, оставив только базовый набор пакетов, то проще всего изменить причину установки ненужных пакетов на "зависимость", после чего удалить неиспользуемые зависимости.
Сначала измените причину установки всех явно установленных пакетов на "зависимость":
# pacman -D --asdeps $(pacman -Qqe)
Затем измените причину установки пакетов, которые вы удалять не хотите, на "установлен явно":
# pacman -D --asexplicit base linux linux-firmware
- В последней команде следует указать все пакеты, которые должны остаться в системе. В статье Руководство по установке#Установка основных пакетов перечислены пакеты, которые нужны для нормального функционирования базовой системы.
- Последняя команда удалит также и пакет программы-загрузчика. Система всё ещё будет загружаться, но изменить параметры загрузки станет невозможно.
Наконец, удалите ненужные пакеты-зависимости, как описано в разделе #Удаление неиспользуемых пакетов.
Список зависимостей нескольких пакетов
Ниже приведена команда для вывода списка зависимостей нескольких пакетов, отсортированого в алфавитном порядке с удалением дубликатов.
pacman -Qi
.
$ LC_ALL=C pacman -Si пакеты | awk -F'[:<=>]' '/^Depends/ {print $2}' | xargs -n1 | sort -u
То же самое, с помощью expac:
$ expac -l '\n' %E -S пакеты | sort -u
Список изменённых файлов для резервного копирования
Чтобы получить список файлов настроек, которые могут изменяться пользователем (то есть файлы, указанные в массиве backup файла PKGBUILD) и в которых есть пользовательские изменения, используйте команду:
# pacman -Qii | awk '/^MODIFIED/ {print $2}'
Команда должна выполняться с правами root, чтобы в список вошли файлы, доступ на чтение которых есть только у суперпользователя (вроде файла /etc/sudoers
).
Это можно использовать при выборочном резервном копировании системы или при копировании конфигурацию системы с одной машины на другую.
- В разделе #Список изменённых файлов пакетов описано, как вывести список всех известных pacman изменённых файлов, а не только файлы с резервными копиями.
- В разделе #Поиск файлов без пакета-владельца описано, как вывести список файлов, которые pacman не отслеживает.
Резервная копия базы данных pacman
Следующая команда создаст резервную копию локальной базы данных pacman:
$ tar -cjf pacman_database.tar.bz2 /var/lib/pacman/local
Сохраните резервную копию на одном или нескольких внешних устройствах, вроде USB-накопителя, внешнего жесткого диска или CD-R.
Чтобы восстановить базу данных, поместите файл pacman_database.tar.bz2
в каталог /
и выполните:
# tar -xjvf pacman_database.tar.bz2
/etc/pakbak.conf
.
Просмотр списка изменений пакета
При внесении изменений в состав пакета сопроводители часто подробно комментируют произведённые правки. Утилита pacologAUR позволяет просматривать эти комментарии из командной строки. Команда pacolog пакет
выведет последние сообщения о правках для пакетов из официальных репозиториев и AUR.
Установка и восстановление
Альтернативные способы получения и восстановления пакетов.
Установка пакетов с CD/DVD или USB-накопителя
Загрузите пакеты или группы пакетов:
# cd ~/Packages # pacman -Syw --cachedir . base base-devel grub-bios xorg gimp # repo-add ./custom.db.tar.gz ./*
По умолчанию pacman работает с деревом каталогов (и базами данных) на хосте, поэтому он не сможет правильно разрешать и загружать зависимости. Если необходимы все пакеты и зависимости, лучше создать временную пустую базу данных и работать с ней через опцию --dbpath
:
# mkdir /tmp/blankdb # pacman -Syw --cachedir . --dbpath /tmp/blankdb base base-devel grub-bios xorg gimp # repo-add ./custom.db.tar.gz ./*
Затем запишите каталог Packages
на CD/DVD, USB-накопитель, внешний жёсткий диск и т.д.
Установка пакетов:
1. Примонтируйте носитель:
Для CD/DVD:
# mount --mkdir /dev/sr0 /mnt/repo
Для USB, жёсткого диска и т. п.:
# mount --mkdir /dev/sdxY /mnt/repo
2. Отредактируйте файл pacman.conf
, добавив свой репозиторий перед всеми остальными (extra, core и др.). Это необходимо, чтобы пакеты на CD/DVD/USB получили приоритет над пакетами в стандартных репозиториях:
/etc/pacman.conf
[custom] SigLevel = PackageRequired Server = file:///mnt/repo/Packages
3. В заключение, синхронизируйте базу данных pacman, чтобы получить доступ к новому репозиторию:
# pacman -Syu
Собственный локальный репозиторий
Скрипт repo-add (входит в состав pacman) может создать базу данных для личного репозитория. Команда repo-add --help
выведет краткую информацию о работе утилиты. База данных пакетов представляет собой tar-файл, возможно сжатый, с суффиксом .db или .files, за которым следует суффикс архива .tar, .tar.gz, .tar.bz2, .tar.xz, .tar.zst или .tar.Z. На момент запуска утилиты базы может ещё не быть, но родительские каталоги уже должны быть созданы.
Следующая команда добавляет новый пакет к базе данных или заменяет старую версию существующего пакета на более новую:
$ repo-add /путь/к/репозиторию.db.tar.gz /путь/к/пакету-1.0-1-x86_64.pkg.tar.zst
Для работы repo-add база данных и пакеты могут храниться в разных каталогах, но когда вы станете работать с базой через pacman, её нужно объединить с пакетами в одном месте. Хранение всех пакетов репозитория в одном каталоге также позволяет использовать подстановочные символы в командной оболочке, чтобы добавлять или обновлять несколько пакетов за раз:
$ repo-add /путь/к/репозиторию.db.tar.gz /путь/к/*.pkg.tar.zst
Если вы собираетесь поддерживать несколько версий пакета для разных архитектур, то следует соблюдать некоторые предосторожности. Под каждую архитектуру должен быть выделен отдельный каталог:
$ tree ~/customrepo/ | sed "s/$(uname -m)/архитектура/g"
/home/archie/customrepo/ └── архитектура ├── customrepo.db -> customrepo.db.tar.xz ├── customrepo.db.tar.xz ├── customrepo.files -> customrepo.files.tar.xz ├── customrepo.files.tar.xz └── personal-website-git-b99cce0-1-архитектура.pkg.tar.zst 1 directory, 5 files
При запуске repo-add проверяет, подходят ли пакеты для добавления в базу. Если нет, то появится сообщение об ошибке:
==> ERROR: '/home/archie/customrepo/архитектура/foo-архитектура.pkg.tar.zst' does not have a valid database archive extension.
Утилита repo-remove удаляет пакеты из базы данных:
$ repo-remove /путь/к/repo.db.tar.gz пакеты
После создания локальной базы данных укажите репозиторий в файле pacman.conf
на каждой системе, где он будет использоваться. Пример настроек пользовательского репозитория можно найти в самом файле. Название репозитория представляет собой имя файла базы данных без суффикса. В примере выше репозиторий называется repo
. Ссылаться на репозиторий можно по URL file://
или через HTTP http://localhost/path/to/directory
.
При желании добавьте свой репозиторий в список неофициальных репозиториев, чтобы сообщество могло извлечь из него пользу.
Сетевой кэш pacman с совместным доступом
Если в вашей локальной сети есть несколько машин с Arch Linux, сетевой кэш позволит значительно уменьшить время загрузки новых пакетов. При этом важно помнить, что в кэше не должно быть пакетов для разных архитектур (например, i686 и x86_64), иначе возникнут проблемы.
Кэш только на чтение
В качестве быстрого решения можно запустить простой временный веб-сервер, который другие компьютеры могут использовать в качестве первого зеркала.
Сперва сделайте базы данных pacman доступными в каталоге, который будет обслуживаться веб-сервером:
# ln -s /var/lib/pacman/sync/*.db /var/cache/pacman/pkg/
Затем запустите веб-сервер, раздающий файлы из этого каталога. Например, можно использовать Python-модуль http.server:
$ python -m http.server -d /var/cache/pacman/pkg/
8000
на всех сетевых интерфейсах. Для использования другого порта или привязки к конкретному интерфейсу можно добавить параметры, например:
$ python -m http.server -d /var/cache/pacman/pkg/ --bind 127.0.0.1 8080
После этого на каждом клиентском компьютере отредактируйте файл /etc/pacman.d/mirrorlist
, добавив адрес запущенного вами веб-сервера в качестве первого зеркала:
/etc/pacman.d/mirrorlist
Server = http://ip-адрес-сервера:порт ...
/repos/$repo/os/$arch
как в других зеркалах, поскольку в данном случае такая иерархия не существует и её использование не сработает.В качестве более автономного решения можно использовать darkhttpd. Замените ранее показанную команду python
, например, на такую:
$ sudo -u http darkhttpd /var/cache/pacman/pkg --no-server-id
Также для удобства можно запустить darkhttpd как службу systemd; смотрите раздел systemd (Русский)#Написание файлов юнитов.
Можно использовать miniserve — небольшой веб-сервер на Rust:
$ miniserve /var/cache/pacman/pkg
Отредактируйте /etc/pacman.d/mirrorlist
как описано выше, указав тот URL, на котором доступен mimiserve.
Если у вас уже есть веб-сервер, запущенный для каких-то других целей, можно использовать его как сервер локального репозитория вместо описанных ранее вариантов. Например, для сервера nginx добавьте в настройки блок правил server
с указанием прослушивать порт 8080:
/etc/nginx/nginx.conf
server { listen 8080; root /var/cache/pacman/pkg; server_name myarchrepo.localdomain; try_files $uri $uri/; }
Не забудьте после этого перезапустить службу nginx.service
.
Overlay-монтирование кэша только на чтение
Можно настроить использование отдельной машины в локальной сети как read-only кэш пакетов. Для этого используется overlay-монтирование каталога /var/cache/pacman/pkg
. Преимущество такой конфигурации — на сервере установлен полный набор новейших пакетов, которые используются другими машинами; в результате можно сэкономить внешнюю (из локальной сети) пропускную способность.
Пример:
# mkdir /tmp/remote_pkg /mnt/workdir_pkg /tmp/pacman_pkg # sshfs remote_username@remote_pkgcache_addr:/var/cache/pacman/pkg /tmp/remote_pkg -C # mount -t overlay overlay -o lowerdir=/tmp/remote_pkg,upperdir=/var/cache/pacman/pkg,workdir=/mnt/workdir_pkg /tmp/pacman_pkg
upperdir
. Смотрите Overlay filesystem (Русский)#Использование./tmp/pacman_pkg
выдаёт ошибки, например, "Stale file handle", попробуйте использовать опции монтирования -o redirect_dir=off -o index=off
.После этого запустите pacman с опцией --cachedir /tmp/pacman_pkg
:
# pacman -Syu --cachedir /tmp/pacman_pkg
Распределённый кэш только на чтение
В Arch Linux есть несколько инструментов, которые выполняют автоматический поиск кэша пакетов на других компьютерах в локальной сети. Среди них pacredir, pacserve, pkgdistcacheAUR и paclanAUR. pkgdistcache использует Avahi вместо чистого UDP, который может работать лучше в некоторых домашних сетях, где используется связка WiFi и Ethernet.
Также раньше использовались утилиты PkgD и multipkg, но их разработка была прекращена.
Кэш на чтение и запись
Чтобы несколько машин могли работать с общим кэшем пакетов, откройте совместный доступ к каталогу /var/cache/pacman/
с помощью любого сетевого протокола монтирования файловых систем. В этом разделе описано, как использовать SSHFS для организации совместного доступа к кэшу пакетов и некоторым каталогам с библиотеками в локальной сети. Имейте в виду, что сетевой кэш может быть довольно медленным, в том числе и из-за выбранной файловой системы.
Во-первых, установите любой пакет с поддержкой сетевых файловых систем: sshfs, curlftpfs, samba или nfs-utils.
- Полезную информацию о работе с sshfs можно найти в статье Ключи SSH.
-
smbfs по умолчанию не умеет работать с файлами, имена которых содержат двоеточия. В итоге клиент будет загружать такие пакеты заново при каждом обновлении. Чтобы это предотвратить, используйте на системе-клиенте опцию монтирования
mapchars
.
Теперь, чтобы открыть совместный доступ к пакетам, смонтируйте каталог сервера /var/cache/pacman/pkg
в каталог /var/cache/pacman/pkg
на клиентских машинах.
/var/cache/pacman/pkg
или любой из его родительских каталогов (например, /var
) символической ссылкой. Pacman ожидает, что это будут именно каталоги. Когда pacman будет переустанавливать или обновлять самого себя, он удалит все символические ссылки и создаст вместо них пустые каталоги. Однако поскольку при этом pacman полагается на некоторые файлы в этих каталогах, то процесс обновления будет нарушен. Подробнее см. FS#50298.
Двухсторонний кэш на основе rsync
Другой подход к созданию сетевого кэша — использовать rsync. Настройте сервер кэша, запустите на нём демон rsync и выполните двухстороннюю синхронизацию между сервером и клиентскими машинами по протоколу rsync. В этом случае имена файлов с двоеточиями проблемы не создадут.
Ниже приведён пример работы с кэшем на машине-клиенте. Команда uname -m
позволяет выполнить синхронизацию пакетов с учётом архитектуры:
# rsync rsync://server/share_$(uname -m)/ /var/cache/pacman/pkg/ ... # pacman ... # paccache ... # rsync /var/cache/pacman/pkg/ rsync://server/share_$(uname -m)/ ...
Динамический обратный прокси-кэш на основе nginx
Сервер nginx может работать в качестве посредника для запросов пакетов на официальные upstream-зеркала, кэшируя ответы на локальном диске. Все последующие запросы к этим пакетам будут адресоваться к локальному кэшу, минимизируя интернет-трафик при обновлении большого количества компьютеров.
В примере ниже кэширующий сервер запущен на адресе http://cache.domain.example:8080/
. Пакеты хранятся в каталоге /srv/http/pacman-cache/
.
Установите nginx на машине, предназначенной для хранения кэша. Создайте каталог кэша с необходимыми разрешениями, чтобы nginx мог записывать в него файлы:
# mkdir /srv/http/pacman-cache # chown http:http /srv/http/pacman-cache
Используйте этот файл настроек в качестве отправной точки для редактирования /etc/nginx/nginx.conf
. Проверьте, чтобы директива resolver
работала так, как ожидается. В блоках правил исходящих запросов server
укажите директиву proxy_pass
с адресами официальных зеркал (пример ожидаемого формата этой директивы можно найти в самом файле настроек). После настройки включите и запустите nginx.
Чтобы использовать кэш на каждом компьютере с Arch Linux (включая тот, который хранит кэш), нужно добавить следующую строку в начало файла mirrorlist
:
/etc/pacman.d/mirrorlist
Server = http://cache.domain.example:8080/$repo/os/$arch ...
paccache
(входит в пакет pacman-contrib) автоматизирует очистку в соответствии с различными критериями. Например, команда find /srv/http/pacman-cache/ -type d -exec paccache -v -r -k 2 -c {} \;
оставит в кэше только две последние версии каждого пакета.
Кэширующий прокси-сервер Pacoloco
Pacoloco — простой прокси-сервер, кэширующий пакеты из репозиториев pacman. Также он поддерживает автоматическую предзагрузку обновлений для ранее скачивавшихся пакетов.
Устанавливается с пакетом pacoloco. Откройте файл настроек и добавьте зеркала pacman:
/etc/pacoloco.yaml
port: 9129 repos: mycopy: urls: - http://mirror.lty.me/archlinux - http://mirrors.kernel.org/archlinux
Перезапустите pacoloco.service
и после этого прокси-репозиторий будет доступен по адресу http://сервер:9129/repo/mycopy
.
Кэширующий прокси-сервер Flexo
Flexo — ещё один кэширующий прокси для репозиториев pacman. Flexo доступен в пакете flexo-gitAUR. После установки запустите службу flexo.service
.
Flexo по умолчанию работает на порте 7878
. Добавьте строку Server = http://мой_сервер:7878/$repo/os/$arch
в самое начало файла /etc/pacman.d/mirrorlist
, чтобы pacman загружал пакеты через Flexo.
Синхронизация кэша пакетов специальными программами
Утилиты Syncthing и Resilio Sync можно использовать для синхронизации каталогов кэша pacman (например, /var/cache/pacman/pkg
).
Предотвращение нежелательной очистки кэша пакетов
По умолчанию команда pacman -Sc
очищает кэш от старых версий пакетов, которые были удалены из системы. В условиях совместного доступа к кэшу от нескольких машин в локальной сети pacman не может достоверно определить, какие пакеты установлены на каждой системе. По этой причине очистку кэша нужно ограничить.
Чтобы удалялись только старые архивы:
/etc/pacman.conf
[options] CleanMethod = KeepCurrent
Воссоздание пакета из файловой системы
С помощью пакета fakepkgAUR можно воссоздать пакет из файловой системы. Файлы будут собраться в том виде, в каком они есть, следовательно, сделанные в них изменения войдут в "собранный" пакет. По этой причине распространять пакет среди других пользователей не рекомендуется; для этого гораздо лучше подойдёт система сборки Arch или архив Arch Linux.
Список установленных пакетов
Создание списка явно установленных пакетов может оказаться полезным, если вы собираетесь сделать резервную копию системы или ускорить процесс установки на новой машине:
$ pacman -Qqe > pkglist.txt
- С параметром
-t
в список не будут включены пакеты, которые нужны другим явно установленным пакетам. При переустановке по этому списку они всё равно будут установлены, но уже как зависимости. - С опцией
-n
в список не войдут внешние пакеты (например, из AUR). - Команда
comm -13 <(pacman -Qqdt | sort) <(pacman -Qqdtt | sort) > optdeplist.txt
создаст список установленных опциональных зависимостей, которые можно будет переустановить с параметром--asdeps
. - Команда
pacman -Qqem > foreignpkglist.txt
создаст список пакетов из AUR и других внешних пакетов, которые были установлены явно.
Хук pacman позволит автоматизировать обновление списка пакетов. Пример:
[Trigger] Operation = Install Operation = Remove Type = Package Target = * [Action] When = PostTransaction Exec = /bin/sh -c '/usr/bin/pacman -Qqe > /etc/pkglist.txt'
Установка пакетов по списку
Следующая команда установит пакеты в соответствии с ранее созданным списком, при этом уже установленные пакеты переустанавливаться не будут:
# pacman -S --needed - < pkglist.txt
В списке могут оказаться внешние пакеты, из AUR или установленные локально. Чтобы их исключить, вместо предыдущей команды выполните следующую:
# pacman -S --needed $(comm -12 <(pacman -Slq | sort) <(sort pkglist.txt))
Наконец, убедитесь, что установленные в системе пакеты совпадают со списком, и удалите всё, что в него не входит:
# pacman -Rsu $(comm -23 <(pacman -Qq | sort) <(sort pkglist.txt))
Список изменённых файлов пакетов
Если вы предполагаете, что какие-то файлы были повреждены (например, из-за ошибки программы или аппаратного обеспечения), стоит проверить их хэш-суммы. Сделать это можно с помощью пакета pacutils:
# paccheck --md5sum --quiet
Восстановление базы данных описано в разделе #Восстановление локальной базы данных. Файлы mtree
можно также извлечь как .MTREE
из соответствующих файлов пакета.
Переустановка всех пакетов
Чтобы переустановить все пакеты, установленные из базы синхронизации, выполните:
# pacman -Qqn | pacman -S -
Сторонние пакеты (AUR) придётся установить отдельно; найти их можно командой pacman -Qqm
.
По умолчанию при переустановке пакета pacman оставляет причину установки без изменений.
--overwrite=*
. Учтите — это средство на самый крайний случай, см. Обслуживание системы#Избегайте определенных команд pacman.Восстановление локальной базы данных
См. pacman/Восстановление локальной базы данных.
Восстановление USB-носителя из существующей установки
Если вы установили Arch на USB-носитель и испортили его (например, выдернув носитель в процессе записи), стоит попробовать переустановить все пакеты. Возможно, это восстановит работоспособность флешки. Предположим, USB-носитель смонтирован в каталог /newarch
:
# pacman -S $(pacman -Qq --dbpath /newarch/var/lib/pacman) --root /newarch --dbpath /newarch/var/lib/pacman
Просмотр отдельного файла внутри файла .pkg
Например, вы хотите увидеть содержимое файла /etc/systemd/logind.conf
в пакете systemd:
$ bsdtar -xOf /var/cache/pacman/pkg/systemd-250.4-2-x86_64.pkg.tar.zst etc/systemd/logind.conf
Для просмотра файлов архива можно использовать vim:
$ vim /var/cache/pacman/pkg/systemd-250.4-2-x86_64.pkg.tar.zst
Список приложений, использующих устаревшие библиотеки
Внесённые обновлением изменения не применятся к ранее запущенным процессам. Они продолжат использовать старые версии библиотек даже после обновления. Если какая-то из этих библиотек содержит уязвимость или опасный баг, продолжать её использовать — не самая лучшая идея.
Процессы, зависящие от обновившихся библиотек, можно найти либо с помощью htop, который подсвечивает имена затронутых программ, либо с помощью такой команды на основе lsof, которая также выводит имена библиотек:
# lsof +c 0 | grep -w DEL | awk '1 { print $1 ": " $NF }' | sort -u
Это решение позволяет найти только файлы, которые процессы постоянно держат открытыми, так что оно подходит в основном только для поиска обновившихся библиотек (файлы .so
). Оно не покажет, например, зависимости приложений Java или Python.
Установка контента только на нужном языке
Многие пакеты по умолчанию устанавливают документацию и переводы на нескольких языках. Существует ряд программ, разработанных для удаления таких ненужных файлов. Например, утилита localepurgeAUR удалит лишние файлы локалей, если запустить её после установки пакета. Более прямой подход к этой проблеме — указать директиву NoExtract
в файле pacman.conf
, что предотвратит установку ненужных файлов.
!
.Например, чтобы не устанавливать переводы справки, кроме локали C, добавьте:
NoExtract = usr/share/help/* !usr/share/help/C/*
Чтобы не устанавливать HTML-документацию приложений GTK, добавьте:
NoExtract = usr/share/gtk-doc/html/*
Для установки только необходимых локалей:
NoExtract = usr/share/locale/* usr/share/X11/locale/*/* usr/share/i18n/locales/* opt/google/chrome/locales/* !usr/share/X11/locale/C/* NoExtract = !usr/share/X11/locale/compose.dir !usr/share/X11/locale/iso8859-1/* NoExtract = !*locale*/en*/* !usr/share/*locale*/locale.* NoExtract = !usr/share/*locales/en_?? !usr/share/*locales/i18n* !usr/share/*locales/iso* NoExtract = usr/share/i18n/charmaps/* !usr/share/i18n/charmaps/UTF-8.gz !usr/share/i18n/charmaps/ANSI_X3.4-1968.gz NoExtract = !usr/share/*locales/trans* NoExtract = !usr/share/*locales/C !usr/share/*locales/POSIX
Чтобы не устанавливать переводы man-страниц:
NoExtract = usr/share/man/* !usr/share/man/man*
Чтобы не устанавливать файлы языков в vim-runtime:
NoExtract = usr/share/vim/vim*/lang/*
Для установки только английского языка в приложениях Qt:
NoExtract = usr/share/*/translations/*.qm usr/share/*/nls/*.qm usr/share/qt/phrasebooks/*.qph usr/share/qt/translations/*.pak !*/en-US.pak
Для установки только английского языка в приложения Electron:
NoExtract = usr/share/*/locales/*.pak opt/*/locales/*.pak usr/lib/*/locales/*.pak !*/en-US.pak
Для установки только английской справки в LibreOffice:
NoExtract = usr/lib/libreoffice/help/en-US/*
Для установки только английского языка в OnlyOffice:
NoExtract = opt/onlyoffice/desktopeditors/dictionaries/* !opt/onlyoffice/desktopeditors/dictionaries/en_US/* NoExtract = opt/onlyoffice/desktopeditors/editors/web-apps/apps/*/main/locale/* !*/en.json NoExtract = opt/onlyoffice/desktopeditors/editors/web-apps/apps/*/main/resources/help/*/* !*/help/en/* NoExtract = opt/onlyoffice/desktopeditors/editors/web-apps/apps/*/main/resources/symboltable/* !*/en.json NoExtract = opt/onlyoffice/desktopeditors/editors/web-apps/apps/documenteditor/forms/locale/* !*/en.json NoExtract = opt/onlyoffice/desktopeditors/editors/web-apps/apps/spreadsheeteditor/main/resources/formula-lang/* !*/en.json !*/en_desc.json NoExtract = opt/onlyoffice/desktopeditors/converter/empty/*/* !opt/onlyoffice/desktopeditors/converter/empty/en-US/*
Для установки только английского словаря Emoji в iBus:
NoExtract = usr/share/ibus/dicts/emoji-*.dict !usr/share/ibus/dicts/emoji-en.dict
Установка пакетов при плохом соединении
При попытке скачать пакет через плохое соединение (например, в поезде с помощью мобильного телефона) используйте опцию --disable-download-timeout
, чтобы уменьшить вероятность получения подобных ошибок:
error: failed retrieving file […] Operation too slow. Less than 1 bytes/sec transferred the last 10 seconds
или
error: failed retrieving file […] Operation timed out after 10014 milliseconds with 0 out of 0 bytes received
Производительность
Увеличение скорости загрузки
При загрузке пакетов pacman использует зеркала в том порядке, в каком они перечислены в файле /etc/pacman.d/mirrorlist
. Зеркало, указанное первым, будет использоваться по умолчанию, и совсем не обязательно оно окажется для вас самым быстрым. Подробнее о выборе зеркал см. Зеркала.
Скорость загрузки пакетов можно повысить, если включить параллельную загрузку или использовать сторонние приложения для загрузки вместо встроенного в pacman менеджера закачек.
В любом случае, прежде чем делать какие-либо изменения, убедитесь, что используете последнюю версию pacman:
# pacman -Syu
Powerpill
Powerpill — обёртка для pacman, которая использует параллельную и сегментированную загрузку для повышения скорости.
wget
Эта утилита будет очень полезна, если вам нужны более сложные настройки прокси, чем это позволяют возможности pacman.
Установите пакет wget, после чего отредактируйте /etc/pacman.conf
, указав в разделе [options]
следующую строку:
XferCommand = /usr/bin/wget --passive-ftp --show-progress -c -q -N %u
Чтобы не указывать параметры wget
в файле /etc/pacman.conf
, можно отредактировать непосредственно файл настроек wget
— либо общесистемный файл /etc/wgetrc
, либо пользовательский $HOME/.wgetrc
.
aria2
aria2 — небольшая загрузочная утилита с поддержкой возобновляемой и сегментной загрузки по протоколам HTTP/HTTPS и FTP. aria2 создаёт несколько одновременных соединений с зеркалом Arch, что увеличивает скорость загрузки файлов и пакетов.
XferCommand
, то пакеты всё равно будут загружаться по очереди, а не параллельно. Pacman использует команду XferCommand
для одного пакета за раз и ожидает её завершения, прежде чем перейти к следующему. Параллельная загрузка нескольких пакетов возможна с Powerpill.Установите aria2, затем добавьте следующую строку в раздел [options]
файла /etc/pacman.conf
:
XferCommand = /usr/bin/aria2c --allow-overwrite=true --continue=true --file-allocation=none --log-level=error --max-tries=2 --max-connection-per-server=2 --max-file-not-found=5 --min-split-size=5M --no-conf --remote-time=true --summary-interval=60 --timeout=5 --dir=/ --out %o %u
Параметры aria2 описаны в руководстве aria2c(1) § OPTIONS. Некоторые разъяснения о параметрах последней команды:
-
-d, --dir
: каталог для сохранения скачиваемых файлов. -
-o, --out
: итоговые имена скачиваемых файлов. -
%o
: локальное имя файла в представлении pacman. -
%u
: URL загрузки в представлении pacman.
Другие приложения
Есть и другие загрузочные приложения, с которыми может работать pacman. Ниже приводится список в виде соответствующих настроек XferCommand
:
-
snarf
:XferCommand = /usr/bin/snarf -N %u
-
lftp
:XferCommand = /usr/bin/lftp -c pget %u
-
axel
:XferCommand = /usr/bin/axel -n 2 -v -a -o %o %u
-
hget
:XferCommand = /usr/bin/hget %u -n 2 -skip-tls false
(подробнее см. документацию на странице проекта) -
saldl
:XferCommand = /usr/bin/saldl -c6 -l4 -s2m -o %o %u
(подробнее см. документацию на странице проекта)
Утилиты
- Lostfiles — Скрипт для обнаружения файлов, не принадлежащих ни одному пакету.
- pacutils — Библиотека для программ, основанных на libalpm.
- pkgfile — Утилита, которая находит, какому пакету принадлежит файл.
- pkgtools — Коллекция скриптов для пакетов Arch Linux.
- pkgtop — Интерактивный менеджер пакетов и системный менеджер, разработанный для GNU/Linux.
- Powerpill — Использует параллельную и сегментную загрузку с помощью aria2 и Reflector, чтобы ускорить скачивание пакетов через pacman.
- repoctl — Утилита для управления локальными репозиториями.
- repose — Программа для создания репозиториев Arch Linux.
- snap-pac — Заставляет pacman использовать snapper для создания снимков до и после транзакции, как в YaST из openSUSE.
- vrms-arch — Виртуальный Ричард Столлман подсказывает тебе, какие несвободные пакеты установлены в системе.
Графические
- Apper — Менеджер пакетов на основе PackageKit; написан на C++ с использованием Qt 5. Поддержка метаданных AppStream.
- https://userbase.kde.org/Apper || apper[ссылка недействительна: package not found]
- Deepin App Store — Сторонний магазин приложений для DDE, собранный с DTK используя PackageKit. Поддерживает метаданные AppStream.
- Discover — Менеджер приложений на основе PackageKit; написан на C++/QML с использованием Qt 5. Поддержка метаданных AppStream, Flatpak и обновления прошивок.
- GNOME PackageKit — Менеджер пакетов на основе PackageKit, написан на Си с использованием GTK 3.
- GNOME Software — Менеджер пакетов на основе PackageKit, написан на Си с использованием GTK 3. Поддержка метаданных AppStream, Flatpak и обновления прошивок
- pcurses — Обёртка для pacman на C++ с текстовым интерфейсом curses.
- tkPacman — Tk-обёртка для pacman, написанная на Tcl.
- bauh — ранее известный как fpakman, - это графический интерфейс для управления программным обеспечением Linux (пакетами/приложениями). В настоящее время он поддерживает следующие форматы: AppImage, пакеты Debian и Arch Linux (включая AUR), Flatpak, Snap и веб-приложения.