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
  • Либо зеркало можно захостить на локальном веб-сервере, чтобы оно было доступно другим машинам в локальной сети. Тогда в «/etc/pacman.d/mirrorlist» запись будет иметь вид:

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

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

  • arduino — IDE для программирования для Arduino, ESP и множества других MCU.

  • codeblocks — IDE для C/C++ проектов.

  • dbeaver — универсальный клиент для баз данных.

  • intellij-idea-community-edition — IDE для разработки на Java.

  • kicad — CAD для разработки электрических схем и печатных плат.

  • pycharm-community-edition — IDE для разработки на Python.

  • vscode — редактор и среда абсолютно для всего, но это ВСЁ в изоляции сложно получить без доступа к Extension Marketplace.

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

  • без maven-репозиториев сложно представить разработку на java.

  • без npmjs будет неоткуда взять эти бесценные 100500 нод-модулей для angular/react веб приложений.

  • без pypi-репозитория не скачать зависимости для python (хмм, или нет?).

Разработчику придётся либо перестроиться и девелопить без них. Либо надеяться, что у кого-то из коллег на флешке будет 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 инфраструктуры (но это не точно). Вот кое-что из пакетов, которые есть в Арче:

  • argocd — для управления kubernetes-кластером. На острове кластер — это же штука, крайне необходимая для выживальщика.

  • bugzilla — баг-трекер от Mozilla.

  • docker, podman — вот только на острове не будет докер-хаба, и все образы придётся лепить вручную.

  • elasticsearch, logstash и kibana — компоненты популярного стека для индексирования, поиска и визуализации всего. Нет! Ещё вчера они были в community репозитории, а сегодня их оттуда уже удалили и они остались только в AUR-репозитории. Альтернативой им предлагают opensearch.

  • gitlab — отличная платформа для разработчиков софта, карманный гитхаб со всем, что нужно: git-репозитории, пул-реквесты с кодревью, CI/CD, проектные вики, трекер задач и багов.

  • grafana — инструмент визуализации данных (метрик мониторинга, например). В её составе есть интеграция с эластиком, но для opensearch придётся ставить плагин.

  • jenkins — CI/CD сервер автоматизации сборки, тестирования и деплоя.

  • keycloak — SSO/IAM сервер для аутентификации и авторизации пользователей.

  • mediawiki — вики-движок для организации своей википедии.

  • zabbix — универсальный инструмент для мониторинга.

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

  • mysql — нет; его в Арче давно заменили на mariadb.

  • postgresql и pgadmin — безусловно, лучшие SQL сервер и интерфейс к нему.

  • mongodb — увы, снова нет; монгу выпилили из Арча пару лет назад.

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

Та же проблема с контейнерами. Инструмент вроде бы есть, но привычные образы в изоляции не доступны. Можно с нуля собрать образы на базе Арча. Это не очень удобно и образы далеки от идеала в плане размера. Шутка ли, официальный базовый докер-образ Арча почти в сотню раз больше 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 виде — это копии соответствующих сайтов с разной степенью адаптации под оффлайн использование.

  • Некоторые пакеты — отличные, типа «python-docs» (это копия https://docs.python.org/py3k/) — там даже работает поиск.

  • Некоторые — так себе, типа «arduino-docs» (это копия https://www.arduino.cc/) — от безысходности можно заглядывать в «Language Reference» или «Libraries», но половина стилей и скриптов тянутся с внешних ресурсов, поэтому в автономном режиме всё выглядит слегка кривовато.

  • А есть пакет «kea-devel-docs» — та самая лютая дичь, которая была упомянута выше. Это устаревшая документация к DHCP серверу. Балласт размером 737 MB, что больше, чем в 35 раз толще пакета с документацией по всему ядру Linux («linux-docs», 20 MB).

Всю документацию, как и зеркало, удобно хостить в том же 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» модели, почти всё новое и свежее. Но в нём сложно сказать, что было несколько дней назад. С Арчем можно нестись в этом
непрерывном потоке. А можно создавать себе острова стабильности за счёт локальных зеркал, обновляясь когда удобно, или когда есть возможность.

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

Читайте так же: