LINUX.ORG.RU

Воспроизводимое Linux-окружение

 ,


0

2

Периодически возникает задача создания Linux-окружения по некоторому образцу. Например, хочется иметь возможность быстро развернуть новую рабочую машину или сервер. Разные версии одних и тех же пакетов могут вести себя по-разному, поэтому очень хочется избежать сюрпризов и поставить именно тот набор версий, что указан в образце.

В разных языках программирования данная проблема решена в той или ной мере. Например, в Ruby есть bundler и Gemfile.lock, в котором перечислены все версии прямых и транзитивных зависимостей, в Node.js - npm и package-lock.json. Всегда можно попросить пакетный менеджер установить фиксированные версии библиотек.

Для создания серверных воспроизводимых окружений можно использовать Docker или Podman: указываю, что хочу запустить приложение внутри контейнера на некотором образе и я точно уверен, что окружение не поменяется (ну, кроме ядра хоста, конечно).

А что насчет десктопных дистрибутивов?

Возьмем, к примеру, Ubuntu. Можно посмотреть доступные версии пакетов с помощью apt-cache madison. Если один и тот же пакет предоставляется несолькими репозиториями, то можно выбрать какую именно версию установить. Однако, для одного репозитория доступна только одна версия пакета, т.е. если у меня в официальных репах лежит nginx 1.18.0-6, то в этой репе уже нет 1.18.0-3.

Посмотрел NixOS, слоган которого «Reproducible builds and deployments». С одной стороны я могу указать список пакетов в configuration.nix, но с другой, если я подсуну конфиг на новую машину, то далеко не факт, что мне установятся те же самые версии пакетов, ведь актуальные версии в репозиториях могли измениться.

Конечно можно сделать как с Docker-ом: скопировать образ диска с помощью dd и накатить на новый хард, но, на мой взгляд, такой подход выглядит несколько костыльно, потому что предполагает, что я взаимодействую с содержимым машины, как с некоторым черным ящиком, а хочется чтобы все было прозрачно, так сказать, configuration as a code.

Понимаю, что эта проблема может быть и не проблемой вовсе в большинстве случаев: если все следуют semver-у, то пакет 1.2.3 будет совместим с 1.2.4 и ничего страшного не произойдет, но в некоторых случаях все же хочется максимального контроля.

Уважаемый ЛОР, что посоветуете по поводу дистрибутива с воспроизводимым окружением?

Только Debian. Именно они первыми стали продвигать принцип «воспроизводимых билдов» в опенсорсе.

Shushundr ★★★
()

Посмотрел NixOS, слоган которого «Reproducible builds and deployments». С одной стороны я могу указать список пакетов в configuration.nix, но с другой, если я подсуну конфиг на новую машину, то далеко не факт, что мне установятся те же самые версии пакетов, ведь актуальные версии в репозиториях могли измениться.

Можешь указать конкретную версию nixpkgs, и тогда будут ставиться всегда те же самые версии пакетов. При использовании flakes это происходит по-умолчанию из коробки. Тогда сборка правда будет (почти) полностью повторяемой, за исключением стремных особенностей железа (например, из-за разного количества ядер иногда незначительно отличаются результаты). Но даже это не так важно, если твой софт будет скачиваться с бинарных кэшей, а это скорее всего будет так.

balsoft ★★
()
Последнее исправление: balsoft (всего исправлений: 1)
Ответ на: комментарий от init_6

Может быть я что-то не понимаю, но разве пакеты не обновляются в рамках одного релиза? Допустим, релиз выходит раз в пол года, а FireFox или там Telegram обновляются раз в неделю. Они будут старые до следующего релиза или как?

Goganchic ★★
() автор топика
Ответ на: комментарий от Goganchic

Естественно, они обновляются, но старые остаются и их можно ставить, указав не просто название пакета, а ещё и его версию.

AVL2 ★★★★★
()

Настроил эталон, сделал из него tar.gz и развернул там где надо. Всё. Воспроизводимый значит всё фиксированное, значит никакие варианты кроме прямого копирования не катят (или сборка из фиксированных исходников тут это роли не играет). Есть ещё вариант с dd из эталона, но это не всегда оптимально

LINUX-ORG-RU ★★★★★
()

Однако, для одного репозитория доступна только одна версия пакета, т.е. если у меня в официальных репах лежит nginx 1.18.0-6, то в этой репе уже нет 1.18.0-3.

Чушь, посмотри на репу icinga, там есть все последние версии. В apt по умолчанию ставится свежайшая версия, но можно указать конкретную.

einhander ★★★★★
()
Ответ на: комментарий от Shushundr

Именно они первыми стали продвигать принцип «воспроизводимых билдов» в опенсорсе.

Это вообще про другое.

sudopacman ★★★★★
()

и я точно уверен, что окружение не поменяется

Чтобы хакерам работу облегчить?

sudopacman ★★★★★
()

хочется чтобы все было прозрачно, так сказать, configuration as a code.

Слишком высокая сложность для десктопа с сомнительным результатом, просто ставь систему как все или клонируй и не выделывайся)

goingUp ★★★★★
()

С одной стороны можно попробовать фигурно порегулять выхлоп dpkg -l, там вроде версии есть, и ваять скрипт восстановления с учётом версий, а с другой автор прав: в большинстве случаев никакой проблемы нет)

piyavking ★★★★★
()
Последнее исправление: piyavking (всего исправлений: 2)
Ответ на: комментарий от Goganchic

Может быть я что-то не понимаю, но разве пакеты не обновляются в рамках одного релиза?

Разверни параллельно на ста компьютерах. Одновременно обнови и у тебя в результате будет сто одинаковых дистров от версий установленных бинарников до файлов настроек.

Если у тебя там более странные задачи их стоит озвучить.

init_6 ★★★★★
()
Ответ на: комментарий от init_6

Что если по каким-то причинам обновление прямо сейчас невозможно? Допустим, перед обновлением необходимо провести анализ того, что поменялось и оценить возможные риски обновления. Пока этого не произошло - необходимо продолжать работать на текущих версиях пакетов, при этом нужно настроить еще несколько рабочих станций так, чтобы версии пакетов совпадали с образцом. Отсюда и задача про воспроизводимый дистрибутив.

Goganchic ★★
() автор топика
Ответ на: комментарий от Goganchic

Может быть я что-то не понимаю, но разве пакеты не обновляются в рамках одного релиза?

Он видимо имел в виду не такой релиз, о котором ты пишешь, а коммит в git для nixpkgs. То есть в NixOS можно выбрать любой коммит nixpkgs (за любой день грубо говоря) и ставить пакеты соответствующие ему.

James_Holden ★★★
()
Ответ на: комментарий от Goganchic

Что если по каким-то причинам обновление прямо сейчас невозможно?

Тогда тебе 100% нужна NixOS. Обновленная версия системы там ставится параллельно со старой, при загрузке в GRUB ты можешь выбрать грузиться в старую или в обновленную. Когда ты удебился, что обновленная работает, можно удалить старую.

James_Holden ★★★
()
Ответ на: комментарий от James_Holden

Насколько я понимаю, это не решает мою проблему: да, я в любой момент могу откатиться назад на предыдущий набор пакетов, но это именно что предыдущее состояние, а не какое-то конкретное. Т.е. это не nginx, tmux и vim конкретных версий, а набор пакетов, которые были до последнего обновления.

Goganchic ★★
() автор топика
Ответ на: комментарий от Goganchic

Т.е. это не nginx, tmux и vim конкретных версий, а набор пакетов, которые были до последнего обновления.

Не совсем понял в чем проблема. У тебя до обновления был набор пакетов определенных версий. Он остается. А надо как?

Нужно вручную задавать конкретную версию каждого приложения?

James_Holden ★★★
()
Последнее исправление: James_Holden (всего исправлений: 1)
Ответ на: комментарий от Shushundr

Оно нужно, чтобы ты мог доверять мейнтейнерам дистрибутива. Либо если ты сам собираешь дистрибутив из исходников и хочешь, чтобы при каждой сборке получались одинаковые бинарники. В любом случае для воспроизводимых инсталляций есть только Nix/Guix. Debian тут вообще никаким боком.

sudopacman ★★★★★
()
Ответ на: комментарий от sudopacman

Правильно, а зачем мне при каждой сборке из исходников получать одинковые бинарники? Это ведь не потому, что я сам себе не доверяю, а для чего-то нужно. Вот я всегда считал что для того, чтобы получить повторно собираемую систему.

Shushundr ★★★
()
Ответ на: комментарий от Shushundr

Повторяю ещё раз: в Debian и других традиционных дистрибутивах это нужно для повышения доверия. Воспроизводимость инсталляции там околонулевая.

sudopacman ★★★★★
()
Ответ на: комментарий от sudopacman

Воспроизводимость инсталляции там околонулевая.

Это предубеждение. Дистрибутивы бывают не только rolling, и Debian как раз не роллинг, и это неспроста, за этим подходом стоит идея.

Shushundr ★★★
()

А что насчет десктопных дистрибутивов?

А с десктопными так не выйдет, например переткнутая в другой комп система с блобом невидии вряд ли будет работать точно так же.

ya-betmen ★★★★★
()
Последнее исправление: ya-betmen (всего исправлений: 1)

Про NixOS уже сказали. Со стороны ФС помимо dd можно также попробовать снепшоты на btrfs или zfs

permafrost ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.