Бувають моменти, коли інтернету немає, а програму встановити дуже потрібно: віддалений сервер у полі, ноутбук у дорозі або сувора корпоративна мережа. Давайте разом зберемо офлайн-інсталятор для Debian/Ubuntu: завантажимо всі залежності apt, упакуємо їх у переносний репозиторій на USB і встановимо все без мережі. Це зручно, надійно і швидко — просто потрібні правильні apt команди і трохи терпіння 🙂

Що потрібно заздалегідь

Підготуйте:

  • Один комп’ютер з інтернетом (онлайн) з тією ж версією Debian/Ubuntu і архітектурою, що й офлайн-машина.
  • USB-носій або зовнішній диск з кількома гігабайтами вільного місця.
  • Доступ до термінал Linux і базові права sudo.

Перевірте кодову назву і архітектуру, щоб усе збігалося:

lsb_release -cs   # або: . /etc/os-release && echo $VERSION_CODENAME
dpkg --print-architecture

Основний How-to: збір залежностей і створення переносного репозиторію

Крок 1. Підготуйте робоче оточення (онлайн-машина)

sudo apt-get update
sudo apt-get install -y dpkg-dev apt-utils
mkdir -p ~/offline-repo/pool/main

Пакети dpkg-dev і apt-utils знадобляться, щоб згенерувати індекс репозиторію.

Крок 2. Завантажте цільний пакет і всі його залежності

Найпростіше — доручити це apt. Він підтягне всю потрібну дрібноту. Приклад для пакета examplepkg (замініть на ваш):

# Очистіть кеш, щоб не змішувати старі файли
sudo apt-get clean

# Завантажте пакети в нашу папку, не встановлюючи їх
sudo apt-get -y \
  -o Dir::Cache::archives=~/offline-repo/pool/main \
  install --download-only examplepkg

Команда install --download-only зкачає examplepkg та всі потрібні залежності у ~/offline-repo/pool/main.

Крок 3. Згенеруйте індекс Packages для локального репозиторію

Створимо мінімальну структуру "як у справжнього" репозиторію:

mkdir -p ~/offline-repo/dists/stable/main/binary-$(dpkg --print-architecture)
cd ~/offline-repo
# Згенеруйте індекс Packages і стислі версії
dpkg-scanpackages pool/main > dists/stable/main/binary-$(dpkg --print-architecture)/Packages
gzip -kf dists/stable/main/binary-$(dpkg --print-architecture)/Packages

# Не обов'язково, але красиво: Release-файл (прибере попередження)
apt-ftparchive release dists/stable > dists/stable/Release

Тепер у вас є переносний репозиторій з усіма .deb та індексом. Скопіюйте весь каталог ~/offline-repo на USB.

Крок 4. Підключіть репозиторій на офлайн-машині та встановіть пакети

Під’єднайте USB, визначте шлях (наприклад, /media/$USER/USB) і додайте джерело з типом file::

USB=/media/$USER/USB
sudo tee /etc/apt/sources.list.d/offline-usb.list > /dev/null <<EOF
deb [trusted=yes] file:${USB}/offline-repo stable main
EOF

sudo apt-get update
sudo apt-get install -y examplepkg

Прапорець [trusted=yes] потрібен, бо у нас немає підпису GPG. Це безпечно для локального USB, але не використовуйте так для мережевих репозиторіїв.

Альтернативні способи

Варіант A: apt-offline (ідеально для оновлень і офлайн-робочих місць)

apt-offline дозволяє на офлайн-хості згенерувати запит, а на онлайн-хості — отримати все потрібне (оновлення та/або конкретні пакети) в один бандл.

# На офлайн-машині (створюємо підпис-запит)
sudo apt-offline set offline.sig --install-packages examplepkg

# На онлайн-машині (завантажуємо все необхідне в архів)
apt-offline get offline.sig --bundle bundle.zip

# Назад на офлайн-машині (встановлюємо з бандлу)
sudo apt-offline install bundle.zip

Плюс: один файл, мінімум ручної роботи. Мінус: трохи інший робочий процес, потрібне встановлення apt-offline на обидві системи.

Варіант B: Пряме встановлення з купи .deb

Якщо ви вже маєте всі .deb (цільовий пакет і залежності), можна поставити їх одразу, і apt сам розв’яже порядок:

cd /path/to/debs
sudo apt install ./*.deb

Це простіше за повний репозиторій, але незручно, якщо пакетів багато або планується повторне використання USB-колекції.

GUI-спосіб (через Synaptic)

Любите графіку? Можна підключити локальний репозиторій у Synaptic (для тих, хто обирає як встановити програму в Linux без терміналу):

  1. Встановіть Synaptic на офлайн-машині заздалегідь або з вашого репозиторію USB.
  2. Відкрийте Synaptic → Налаштування → Репозиторії → Інше ПЗ → Додати.
  3. Як рядок джерела вкажіть: deb [trusted=yes] file:/media/USER/USB/offline-repo stable main і натисніть ОК.
  4. Оновіть список (Reload) і встановіть потрібний пакет як завжди.

FAQ

Що робити, якщо архітектура або версія системи не збігається?

Переконайтеся, що на онлайн- і офлайн-машині однакова dpkg --print-architecture (amd64/arm64 тощо) і один і той самий реліз (lsb_release -cs). Інакше будуть конфлікти залежностей.

Отримую помилку про відсутній Release-файл

Додайте [trusted=yes] у джерело або згенеруйте Release через apt-ftparchive release dists/stable > dists/stable/Release. Це локальний репозиторій, підпис не є обов’язковим.

Чи можна додати кілька пакетів в один офлайн-репозиторій?

Так! Просто повторіть крок завантаження для кожного пакета (або переліку пакетів), а потім перегенеруйте Packages/Packages.gz.

apt каже, що не може знайти деякі залежності

На онлайн-машині ввімкніть усі ті ж джерела, що й на офлайн (main, universe, restricted, multiverse, backports). Потім знову виконайте apt-get update і повторіть завантаження.

Чи безпечно використовувати [trusted=yes]?

Так, якщо джерело — ваш локальний USB. Не застосовуйте це для мережевих дзеркал і сторонніх репозиторіїв.

Як зекономити місце на USB?

Після інсталяції можна очистити кеш: sudo apt-get clean. Також видаляйте застарілі версії .deb з вашого офлайн-репо перед регенерацією Packages.

Порада від Kernelka

Автоматизуйте рутину невеликим bash скрипти — і ви чемпіони продуктивності 🏁

#!/usr/bin/env bash
set -euo pipefail
PKGS=("$@")
REPO=~/offline-repo
ARCH=$(dpkg --print-architecture)

sudo apt-get update
sudo apt-get install -y dpkg-dev apt-utils
mkdir -p "$REPO/pool/main" "$REPO/dists/stable/main/binary-$ARCH"

sudo apt-get clean
for p in "${PKGS[@]}"; do
  sudo apt-get -y -o Dir::Cache::archives="$REPO/pool/main" install --download-only "$p"
done

pushd "$REPO" &>/dev/null
 dpkg-scanpackages pool/main > dists/stable/main/binary-$ARCH/Packages
 gzip -fk dists/stable/main/binary-$ARCH/Packages
 apt-ftparchive release dists/stable > dists/stable/Release || true
popd &>/dev/null

echo "Готово! Скопіюйте $REPO на USB і додайте джерело:"
echo "deb [trusted=yes] file:/media/USER/USB/offline-repo stable main"

Тепер ви маєте повторюваний процес: одна команда — і готовий офлайн-набір. Це саме той випадок, коли термінал Linux працює на вас 😉

Підсумок

  • На онлайн-хості: завантажте пакет і залежності apt-get install --download-only у pool/main.
  • Згенеруйте індекс dpkg-scanpackages і (опційно) Release через apt-ftparchive.
  • Скопіюйте каталог на USB і додайте джерело типу file: з [trusted=yes].
  • На офлайн-хості: apt-get update і встановлюйте пакет як звичайно.
  • Альтернатива: apt-offline або пряма установка apt install ./*.deb.

Все! Тепер ви знаєте, як встановити програму в Linux без інтернету і тримати під рукою свій переносний репозиторій. Це не лише зручно, а й чудовий набір трюків для реального життя з Debian/Ubuntu 💡