Pi-TV

# Arch Linux, Linux, Mirror, Pacman, RUS, pacman, rsync, nginx 2022-02-26

Linux выживальщика

В сегодняшней реальности практически не бывает IT без интернета. Всё, чем мы пользуемся, ставится и обновляется из интернета, заливается обратно в интернет. А если доступа к интернету вдруг не станет?

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

Пусть это будет остров - там тепло, кокосы и вкусные креветки. И речь не про выживание в физическом плане; еда, жильё, оборудование и развлечения - всё там есть. А про выживание в качестве IT-специалиста, которому нужно относительно комфортно пережить время без связи с внешним миром и при этом быть работоспособным и продуктивным.

Что если взять с собой… Arch Linux? Да, определённо, это может быть Арч!

Почему Arch Linux?

Арч простой и удобный; сам по себе не имеет версии, но в его репозиториях всегда более-менее свежие стабильные версии софта. Официальные репозитории не так велики, но в них встречаются полезные вещи, которые в остальных линуксах приходится скачивать и устанавливать по-отдельности (либо подключая сторонние репозитории). Да, в Арче есть проприетарный софт. Но это удобно. И честно. Это отличает его от многих дистрибутивов, которые формально содержат и пропагандируют только “free software”, но тут же лицемерно предлагают официальную инструкцию и лазейку как эти принципы обойти и нарушить. Копия репозиториев Арча умещается (пока что) на 64GB флешке.

Создание локального зеркала Arch Linux репозиториев

Самый простой способ создать себе локальную копию репозитория с пакетами - сделать rsync с одним из живых официальных зеркал. Узнать список и проверить статус зеркала можно на страничке Mirror Status. Их там сотни. Для примера взят сервер яндекса. Создать зеркало можно вот таким простым скриптом:

archlinux-mirror.sh

#!/bin/bash

REMOTE=rsync://mirror.yandex.ru/archlinux
LOCAL=/mirror/archlinux

mirror() {
  echo "Mirroring $1"
  rsync --recursive --hard-links --safe-links --copy-links --times \
    --delete-after --delete-excluded \
    --info=progress2 --stats --human-readable \
    $REMOTE/$1 $LOCAL
}

mirror core
mirror extra
mirror community
mirror multilib
mirror iso

В данном случае скачиваются только стабильные (не тестовые) пакеты из официальных Арч-репозиториев. Такое зеркало не содержит пользовательских AUR (Arch User Repository) пакетов. В каталоге “iso” находится актуальный образ Арча для установки.

Чтобы оценить размер и количество скачиваемых файлов, можно добавить параметр --dry-run. При этом реального скачивания не произойдёт, но покажется статистика, насколько локальное зеркало отстаёт от удалённого.

Репозитории Арча обновляется очень интенсивно. Вот немного статистики по репозиториям за 2022-02-22:

Репозиторий Количество пакетов Размер, MB
core 247 1070
extra 2986 9363
community 9049 42964
multilib 277 407
всего 12559 53805

Суммарная статистика за некоторые даты в прошлом:

Дата Количество пакетов Размер, MB
2020-12-25 11436 45182
2022-02-02 12497 53598
2022-02-20 12542 53769

И сравнение их с 2022.02.22:

Дата Дни Изменилось пакетов Размер изменения, MB
2020-12-25 424 10521, 84% 48497, 90%
2022-02-02 20 2950, 23% 15188, 28%
2022-02-20 2 188, 1.5% 870, 2%

Пакеты постоянно добавляются, свежие версии заменяют собой старые (старые при этом удаляются), иногда пакеты просто удаляются (не оставляя себе альтернативы). За пару лет меняется порядка 98% содержимого репозиториев.

Итак, для хранения файлов зеркала понадобится около 60 гигабайт места на диске. Можно скачать всё, а можно сэкономить немного, исключив заведомо ненужные пакеты с локализациями приложений (типа “firefox-developer-edition-i18n-jp” или “gimp-help-zh_cn”). Кроме того в Арч, к сожалению, иногда пролазит лютая дичь, исключение которой тоже сохранит место на диске. Для фильтрации файлов в предыдущем скрипте можно добавить параметр --filter="merge archlinux-mirror-filter.txt" и создать рядом файл с include/exclude шаблонами типа этих:

archlinux-mirror-filter.txt

- **.old

- /community/os/x86_64/kea-devel-docs-*

+ /community/os/x86_64/firefox-developer-edition-i18n-en-us-*
+ /community/os/x86_64/firefox-developer-edition-i18n-ru-*
- /community/os/x86_64/firefox-developer-edition-i18n-*
+ /community/os/x86_64/gimp-help-en-*
+ /community/os/x86_64/gimp-help-ru-*
- /community/os/x86_64/gimp-help-*
+ /community/os/x86_64/vim-spell-en-*
+ /community/os/x86_64/vim-spell-ru-*
- /community/os/x86_64/vim-spell-*

+ /extra/os/x86_64/firefox-i18n-en-us-*
+ /extra/os/x86_64/firefox-i18n-ru-*
- /extra/os/x86_64/firefox-i18n-*
+ /extra/os/x86_64/hunspell-en_us-*
- /extra/os/x86_64/hunspell-[a-z]*
+ /extra/os/x86_64/libreoffice-fresh-en-*
+ /extra/os/x86_64/libreoffice-fresh-ru-*
- /extra/os/x86_64/libreoffice-fresh-[a-z]*
+ /extra/os/x86_64/libreoffice-still-en-*
+ /extra/os/x86_64/libreoffice-still-ru-*
- /extra/os/x86_64/libreoffice-still-[a-z]*
+ /extra/os/x86_64/thunderbird-i18n-en-us-*
+ /extra/os/x86_64/thunderbird-i18n-ru-*
- /extra/os/x86_64/thunderbird-i18n-*

- /iso/latest/arch
+ /iso/latest
+ /iso/latest/*
- /iso/**

Тут ещё стоит упомянуть, что в Арче пакеты могут прыгать из extra в community и наоборот. А могут и вообще вернуться обратно в AUR. Поэтому некоторые исключения со временем могут стать невалидными. Чтобы проверить, какие файлы были действительно исключены во время создания зеркала, можно воспользоваться вот таким скриптом:

archlinux-mirror-check.sh

#!/bin/bash

REMOTE=rsync://mirror.yandex.ru/archlinux
LOCAL=/mirror/archlinux

check() {
  echo "Checking $1"
  rsync --recursive --verbose --dry-run --copy-links --stats --human-readable \
    $REMOTE/$1 $LOCAL >archlinux-mirror-check-$1.log
}

check core
check extra
check community
check multilib
check iso

После того как зеркало скачано, нужно прописать его в конфигах пакетного менеджера.

Server=file:///mirror/archlinux/$repo/os/$arch
Server=http://mirror.local/archlinux/$repo/os/$arch

Надо только не забыть прописать “mirror.local” в hosts-файл или локальный DNS.

Для хостинга зеркала удобно использовать nginx. Его конфиг при этом выглядит совсем просто:

/etc/nginx/conf.d/mirror.conf

server {
    listen 80;
    server_name mirror.local;

    location /archlinux/ {
        alias /mirror/archlinux/;
        autoindex on;
        expires 1d;
    }
}

После этого пакеты можно устанавливать стандартно: pacman -Sy package-name

Софт выживальщика-разработчика в Arch Linux

Имея под рукой зеркало Арча, можно отлично жить, устанавливая всё единообразно с одного локального источника. Для разработчиков в нём есть всё то же, что и в большинстве других дистрибутивов: компиляторы/интерпретаторы для множества языков программирования, инструменты для сборки, системы контроля версий, библиотеки в ассортименте и т.д. Но есть и свои эксклюзивы (*этот лишь малая часть, упомянутая на основании собственных потребностей и предпочтений), как то:

Есть небольшая проблема в том, что в изоляции будут недоступны внешние репозитории с библиотеками, пакетами и модулями, на которых обычно строятся современные проекты:

Разработчику придётся либо перестроиться и девелопить без них. Либо надеяться, что у кого-то из коллег на флешке будет nexus или artifactory с кешем, под завязку набитым нужными либами. Ну, или выкручиваться как-то ещё.

Вот, кстати, разработчики на python окажутся в самом выгодном положении, потому что в репозиториях Арча до дури пакетов с питоновскими модулями. И вместо pip install django-rest-framework можно ставить всё глобально через pacman -Sy python-django-rest-framework, не заботясь о версиях и virtualenv.

А java разработчики от большой любви могут помародёрничать по Арч-пакетам в поисках нужных библиотек в составе других приложений (типа pacman -F -x "log4j.*jar" для поиска предмета недавнего всеобщего обожания).

Инфраструктура выживальщика на Arch Linux

Арч великолепен в качестве утилитарного линукса, рабочей станции и площадки для экспериментов. Но любимца энтузиастов практически не встретишь на корпоративных серверах, где всё оккупировали Red Hat и Ubuntu. Там ему на самом деле не место. Суровый энтерпрайз жаждет стабильности, чего сложно требовать от Арча.

Тем не менее в нём есть почти всё, что нужно для развёртывания IT инфраструктуры (но это не точно). Вот кое-что из пакетов, которые есть в Арче:

С базами данных всё стандартно:

Многое из софта устанавливается в базовом виде, и для полноценной работы требует установки плагинов и экстеншенов, которых чаще всего нет в официальных репозиториях Арча.

Та же проблема с контейнерами. Инструмент вроде бы есть, но привычные образы в изоляции не доступны. Можно с нуля собрать образы на базе Арча. Это не очень удобно и образы далеки от идеала в плане размера. Шутка ли, официальный базовый докер-образ Арча почти в сотню раз больше Alpine. Одни только glibc, gcc-libs, coreutils и bash, которые есть в зависимостях у большинства пакетов, занимают около 250 мегабайт. Добавляем pacman с его деревом зависимостей - и вот получается уже 350 мегабайт. Но с другой стороны - контейнер контейнеру рознь; например, на фоне 15-гигабайтного образа с tensorflow-cuda, это уже не кажется чем-то большим.

Документация выживальщика в Arch Linux

В изоляции наличие документации важно не меньше, чем сами приложения. Там не погуглить и не найти ответа на Stack Overflow. Арч же богат на документацию. Кроме стандартных манов и инфо в его репозиториях есть много доков по технологиям, инструментам и языкам программирования (типа ant, arduino, erlang, gradle, grails, groovy, julia, openjdk, python, postgresql, qt, ruby, rust, scala). И самая прелесть - это база знаний Арча Arch Wiki, упакованная в пакет arch-wiki-docs.

Большая часть документации в html виде - это копии соответствующих сайтов с разной степенью адаптации под оффлайн использование.

Всю документацию, как и зеркало, удобно хостить в том же nginx:

/etc/nginx/conf.d/docs.conf

server {
    listen 80;
    server_name docs.local;
    
    autoindex on;
    expires 1d;

    location /arch-wiki {
        alias /usr/share/doc/arch-wiki/html/;
    }

    location /arduino {
        alias /usr/share/doc/arduino/;
    }

    location /groovy {
        alias /usr/share/doc/groovy-2.5.0/html/;
    }

    location /linux {
        alias /usr/share/doc/linux/;
    }

    location /postgres {
        alias /usr/share/doc/postgresql/html/;
    }

    location /python {
        alias /usr/share/doc/python/html/;
    }
}

Если “docs.local” прописан в hosts-файле, то доки будут доступны по ссылкам типа:

А точно Arch Linux?

Арч - как питомец. Постоянно растёт и развивается, время от времени показывая что-то новое. Во всём помогает. Но может наложить кучу в углу, если не уделять ему внимание.

В обычной жизни в Арче довольно непросто получить повторяемость результата: каждая сборка системы с теми же параметрами будет чем-то новым. В отличие от LTS дистрибутивов, в которых всё предсказуемо, надёжно, годами неизменно и старо, в Арче, эволюционирующем по “rolling release” модели, почти всё новое и свежее. Но в нём сложно сказать, что было несколько дней назад. С Арчем можно нестись в этом непрерывном потоке. А можно создавать себе острова стабильности за счёт локальных зеркал, обновляясь когда удобно, или когда есть возможность.

Такой питомец, у каждого свой.