Linux выживальщика
В сегодняшней реальности практически не бывает IT без интернета. Всё, чем мы пользуемся, ставится и обновляется из интернета, заливается обратно в интернет. А если доступа к интернету вдруг не станет?
Если вдруг вас позовут в срочную миссию на Марс. Или в длительную IT-робинзонаду на таинственный остров, куда каждому участнику можно взять на флешке только что-то одно из софта. Или вообще никуда не позовут, а просто заботливо и скрепно-надзорно будут пытаться обрубить все неуставные каналы связи с внешним миром.
Пусть это будет остров — там тепло, кокосы и вкусные креветки. И речь не про выживание в физическом плане; еда, жильё, оборудование и развлечения — всё там есть. А про выживание в качестве IT-специалиста, которому нужно относительно комфортно пережить время без связи с внешним миром и при этом быть работоспособным и продуктивным.
Что если взять с собой. Arch Linux? Да, определённо, это может быть Арч!
Почему Arch Linux?
Арч простой и удобный; сам по себе не имеет версии, но в его репозиториях всегда более-менее свежие стабильные версии софта. Официальные репозитории не так велики, но в них встречаются полезные вещи, которые в остальных линуксах приходится скачивать и устанавливать по-отдельности (либо подключая сторонние репозитории). Да, в Арче есть проприетарный софт. Но это удобно. И честно. Это отличает его от многих дистрибутивов, которые формально содержат и пропагандируют только «free software», но тут же лицемерно предлагают официальную инструкцию и лазейку как эти принципы обойти и нарушить. Копия репозиториев Арча умещается (пока что) на 64GB флешке.
Создание локального зеркала Arch Linux репозиториев
Самый простой способ создать себе локальную копию репозитория с пакетами — сделать rsync с одним из живых официальных зеркал. Узнать список и проверить статус зеркала можно на страничке Mirror Status. Их там сотни. Для примера взят сервер яндекса. Создать зеркало можно вот таким простым скриптом:
#!/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:
Суммарная статистика за некоторые даты в прошлом:
И сравнение их с 2022.02.22:
Пакеты постоянно добавляются, свежие версии заменяют собой старые (старые при этом удаляются), иногда пакеты просто удаляются (не оставляя себе альтернативы). За пару лет меняется порядка 98% содержимого репозиториев.
Итак, для хранения файлов зеркала понадобится около 60 гигабайт места на диске. Можно скачать всё, а можно сэкономить немного, исключив заведомо ненужные пакеты с локализациями приложений (типа «firefox-developer-edition-i18n-jp» или «gimp-help-zh_cn»). Кроме того в Арч, к сожалению, иногда пролазит лютая дичь, исключение которой тоже сохранит место на диске. Для фильтрации файлов в предыдущем скрипте можно добавить параметр —filter=»merge archlinux-mirror-filter.txt» и создать рядом файл с include/exclude шаблонами типа этих:
- **.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. Поэтому некоторые исключения со временем могут стать невалидными. Чтобы проверить, какие файлы были действительно исключены во время создания зеркала, можно воспользоваться таким скриптом:
#!/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
После того как зеркало скачано, нужно прописать его в конфигах пакетного менеджера.
- Pacman может брать пакеты напрямую из файловой системы, тогда в файле «/etc/pacman.d/mirrorlist» надо прописать:
Server=file:///mirror/archlinux/$repo/os/$arch
- Либо зеркало можно захостить на локальном веб-сервере, чтобы оно было доступно другим машинам в локальной сети. Тогда в «/etc/pacman.d/mirrorlist» запись будет иметь вид:
Server=http://mirror.local/archlinux/$repo/os/$arch
Надо только не забыть прописать «mirror.local» в hosts-файл или локальный DNS.
Для хостинга зеркала удобно использовать nginx. Его конфиг при этом выглядит совсем просто:
После этого пакеты можно устанавливать стандартно: 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:
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» модели, почти всё новое и свежее. Но в нём сложно сказать, что было несколько дней назад. С Арчем можно нестись в этом непрерывном потоке. А можно создавать себе острова стабильности за счёт локальных зеркал, обновляясь когда удобно, или когда есть возможность.
Такой питомец, у каждого свой.