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