Установка balenaEtcher на Debian 13, 12, 11: подробное руководство

balenaEtcher — это программа для создания загрузочных USB-накопителей и SD-карт из образов ISO, IMG и других форматов. Она особенно полезна, когда нужно установить новую операционную систему (например, другой дистрибутив Linux), создать загрузочную флешку для восстановления системы или подготовить SD-карту для Raspberry Pi. В отличие от команды dd, balenaEtcher имеет понятный графический интерфейс и автоматически проверяет, что образ записан правильно.

💡 balenaEtcher не входит в стандартные репозитории Debian, но разработчики предоставляют официальные сборки на GitHub. В этом руководстве мы разберём два способа установки: ZIP-метод (работает на всех версиях Debian, включая 11) и DEB-метод (только для Debian 12 и 13). Вы также узнаете, как создать скрипты для автоматического обновления.

⚠️ Важно об архитектуре: balenaEtcher официально поддерживает только архитектуру amd64 (x64). Версии для arm64 на GitHub нет. Если у вас Raspberry Pi или другая ARM-платформа, используйте альтернативные инструменты (например, dd, usbboot или Raspberry Pi Imager).

В этой статье вы узнаете:

  • Как скачать последнюю версию balenaEtcher с GitHub
  • Как установить через ZIP-архив (рекомендуется для Debian 11)
  • Как установить через DEB-пакет (Debian 12 и 13)
  • Как создать скрипты для автоматического обновления
  • Как решить типичные проблемы (ошибки прав, команда не найдена)

Оглавление

Оглавление

1. 🔧 Предварительные требования

Перед установкой убедитесь, что:

  • У вас установлена 64-битная (amd64/x86_64) версия Debian 11, 12 или 13
  • Подключение к интернету стабильно
  • У вас есть USB-флешка или SD-карта (для записи образов)

⚠️ ВАЖНО: Проверьте права sudo перед установкой

Если вы не уверены, есть ли у вашего пользователя права администратора, выполните в терминале:

sudo -l

Что делает: sudo -l — показывает список команд, которые ваш пользователь может выполнять с правами суперпользователя.

Ожидаемый вывод: список разрешённых команд. Если видите (ALL : ALL) ALL или другие записи, означающие полный доступ — у вас есть права sudo.

❌ Если видите ошибку user is not in the sudoers file или may not run sudo — сначала пройдите наше руководство по настройке sudo. Без этого дальнейшие шаги не сработают.

1.1 Обновление системы

Перед установкой всегда обновляйте список пакетов:

sudo apt update

Что делает: Обновляет список доступных пакетов из всех подключённых репозиториев.

Теперь обновите установленные пакеты:

sudo apt upgrade

Что делает: Обновляет все установленные пакеты до актуальных версий.

💡 Если вы уверены в своих действиях и хотите автоматически подтверждать все запросы, можно добавить флаг -y: sudo apt upgrade -y. В обучающей инструкции мы рекомендуем сначала посмотреть, что будет обновлено, и подтвердить вручную.

1.2 Установка необходимых утилит

sudo apt install ca-certificates curl jq unzip

Что делает: Устанавливает утилиты для скачивания файлов и работы с архивами.

💡 Если вы уверены в своих действиях и хотите автоматически подтверждать все запросы, можно добавить флаг -y: sudo apt install ca-certificates curl jq unzip -y.

2. 📊 Сравнение способов установки

МетодПоддерживаемые версииОбновленияДля кого
ZIP-архив
(рекомендуемый)
Debian 11, 12, 13Вручную
(скрипт-помощник)
Все пользователи, включая
Debian 11
DEB-пакетDebian 12, 13Вручную
(скрипт-помощник)
Пользователи Debian 12/13,
предпочитающие пакетную
установку

⚠️ Важно: DEB-пакет не работает на Debian 11, так как требует более новую версию dpkg. Пользователи Debian 11 должны использовать ZIP-метод.

3. 📦 Способ 1: Установка из официального ZIP-архива (Debian 11, 12, 13)

Этот метод работает на всех поддерживаемых версиях Debian, включая 11.

3.1 Проверка архитектуры

ARCH="$(dpkg --print-architecture)"
printf 'Обнаруженная архитектура: %s\n' "$ARCH"

if [ "$ARCH" != "amd64" ]; then
    echo "Ошибка: balenaEtcher поддерживает только архитектуру amd64. У вашей системы — '$ARCH'." >&2
    exit 1
fi

echo "Архитектура поддерживается для официальной загрузки Linux x64."

Что делает: Проверяет, что система 64-битная (требование для balenaEtcher).

3.2 Определение последней версии

RELEASE_JSON="$(curl -fsSL https://api.github.com/repos/balena-io/etcher/releases/latest)"
RELEASE_TAG="$(printf '%s' "$RELEASE_JSON" | jq -r '.tag_name // empty')"
PACKAGE_URL="$(printf '%s' "$RELEASE_JSON" | jq -r '.assets[] | select(.name | test("^balenaEtcher-linux-x64-[0-9.]+\.zip$")) | .browser_download_url' | head -n 1)"
CHECKSUM_URL="$(printf '%s' "$RELEASE_JSON" | jq -r '.assets[] | select(.name == "SHA256SUMS.Linux.x64.txt") | .browser_download_url')"

if [ -z "$RELEASE_TAG" ] || [ -z "$PACKAGE_URL" ] || [ "$PACKAGE_URL" = "null" ] || [ -z "$CHECKSUM_URL" ] || [ "$CHECKSUM_URL" = "null" ]; then
    echo "Не удалось найти файлы для текущей версии balenaEtcher (Linux x64)." >&2
    PACKAGE_FILE=""
else
    PACKAGE_FILE="${PACKAGE_URL##*/}"
    printf 'Версия релиза: %s\nФайл пакета: %s\n' "$RELEASE_TAG" "$PACKAGE_FILE"
fi

Что делает: Получает информацию о последнем релизе с GitHub API.

3.3 Скачивание и проверка архива

if [ -z "${PACKAGE_FILE:-}" ]; then
    echo "Ошибка: сначала определите файлы релиза (раздел 3.2)." >&2
    exit 1
else
    curl -fL --progress-bar -o "$PACKAGE_FILE" "$PACKAGE_URL"
    curl -fsSLo SHA256SUMS.Linux.x64.txt "$CHECKSUM_URL"

    # Более надёжная проверка контрольной суммы
    if ! grep -q "^[[:space:]]*[0-9a-fA-F]\{64\}\s\+${PACKAGE_FILE//./\\.}$" SHA256SUMS.Linux.x64.txt; then
        echo "Ошибка: файл $PACKAGE_FILE не найден в списке контрольных сумм." >&2
        exit 1
    fi

    sha256sum -c SHA256SUMS.Linux.x64.txt --ignore-missing
fi

Ожидаемый вывод: balenaEtcher-linux-x64-2.1.6.zip: OK

3.4 Установка в систему

if dpkg -l balena-etcher 2>/dev/null | grep -q '^ii'; then
    echo "Ошибка: сначала удалите DEB‑пакет (sudo apt remove balena-etcher)." >&2
    exit 1
elif [ -e /usr/local/bin/balena-etcher ] && ! [ -L /usr/local/bin/balena-etcher ]; then
    echo "Ошибка: не заменяю обычный файл /usr/local/bin/balena-etcher — ожидается символическая ссылка." >&2
    exit 1
elif [ ! -f "${PACKAGE_FILE:-}" ]; then
    echo "Ошибка: скачайте и проверьте ZIP‑архив перед установкой." >&2
    exit 1
else
    sudo rm -rf /opt/balenaEtcher
    sudo unzip -q "$PACKAGE_FILE" -d /opt
    sudo mv /opt/balenaEtcher-linux-x64 /opt/balenaEtcher
    sudo chmod -R a+rX /opt/balenaEtcher
    sudo ln -sf /opt/balenaEtcher/balena-etcher /usr/local/bin/balena-etcher

    # Скачивание иконки с защитой от сбоя (не критично для работы, но лучше не ломать скрипт)
    if ! sudo curl -fsSLo /opt/balenaEtcher/icon.png "https://raw.githubusercontent.com/balena-io/etcher/${RELEASE_TAG}/assets/icon.png"; then
        echo "Предупреждение: не удалось скачать иконку, программа будет работать без неё." >&2
    fi

    printf '%s\n' "${RELEASE_TAG#v}" | sudo tee /opt/balenaEtcher/.unishell-version > /dev/null

    printf '%s\n' \
        '[Desktop Entry]' \
        'Name=balenaEtcher' \
        'Comment=Запись образов ОС на SD‑карты и USB‑накопители' \
        'Exec=/usr/local/bin/balena-etcher %U' \
        'Terminal=false' \
        'Type=Application' \
        'Icon=/opt/balenaEtcher/icon.png' \
        'Categories=Utility;' | sudo tee /usr/share/applications/balena-etcher.desktop > /dev/null
fi

Что делает: Распаковывает архив в /opt/balenaEtcher, создаёт символическую ссылку и ярлык в меню.

3.5 Проверка установки

LAUNCHER_PATH="$(command -v balena-etcher 2>/dev/null)"
if [ -z "$LAUNCHER_PATH" ]; then
    echo "Ошибка: команда balena-etcher не найдена в PATH." >&2
    exit 1
else
    printf '%s\n' "$LAUNCHER_PATH"
fi

if ! test -x /opt/balenaEtcher/balena-etcher; then
    echo "Ошибка: исполняемый файл /opt/balenaEtcher/balena-etcher отсутствует или не является исполняемым." >&2
    exit 1
fi

echo "balenaEtcher executable is installed"

Ожидаемый вывод:

/usr/local/bin/balena-etcher
balenaEtcher executable is installed

3.6 Создание скрипта для обновления ZIP-версии

⚠️ Важное предупреждение: Скрипты обновления не являются официальными от balena.io и предоставляются «как есть». Для максимальной безопасности вы можете выполнять обновления вручную, используя команды из раздела 3.1–3.4. Скрипты создаются для удобства автоматизации и работают на ваш страх и риск.

if [ -e /usr/local/bin/update-balenaetcher ] && ! grep -q 'Managed balenaEtcher ZIP update helper' /usr/local/bin/update-balenaetcher 2>/dev/null; then
    echo "Ошибка: не заменяю существующий /usr/local/bin/update-balenaetcher без маркера Managed helper." >&2
    exit 1
else
    sudo tee /usr/local/bin/update-balenaetcher > /dev/null << 'SCRIPT_EOF'
#!/bin/bash
# Managed balenaEtcher ZIP update helper
set -euo pipefail

trap 'echo "Произошла ошибка на строке $LINENO." >&2' ERR

APP_DIR="/opt/balenaEtcher"
VERSION_FILE="$APP_DIR/.unishell-version"
LAUNCHER="/usr/local/bin/balena-etcher"
DESKTOP_FILE="/usr/share/applications/balena-etcher.desktop"
API_URL="https://api.github.com/repos/balena-io/etcher/releases/latest"

if [ "$(id -u)" -eq 0 ]; then
    echo "Запускайте update-balenaetcher от имени обычного пользователя; sudo будет запрошен при необходимости." >&2
    exit 1
fi

for cmd in curl grep jq unzip sha256sum dpkg mktemp sudo; do
    if ! command -v "$cmd" > /dev/null 2>&1; then
        echo "Не найдена требуемая команда: $cmd" >&2
        echo "Установите зависимости: sudo apt install ca-certificates curl jq unzip -y" >&2
        exit 1
    fi
done

ARCH="$(dpkg --print-architecture)"
if [ "$ARCH" != "amd64" ]; then
    echo "balenaEtcher официально доступен только для архитектуры amd64. Ваша система: $ARCH" >&2
    exit 1
fi

if dpkg -l balena-etcher 2>/dev/null | grep -q '^ii'; then
    echo "Сначала удалите DEB‑пакет: sudo apt remove balena-etcher" >&2
    exit 1
fi

if [ -e "$LAUNCHER" ] && [ ! -L "$LAUNCHER" ]; then
    echo "Не заменяю обычный файл $LAUNCHER — ожидается символическая ссылка." >&2
    exit 1
fi

CURRENT_VERSION="missing"
if [ -r "$VERSION_FILE" ]; then
    CURRENT_VERSION="$(cat "$VERSION_FILE" 2>/dev/null || true)"
    CURRENT_VERSION="${CURRENT_VERSION:-unknown}"
elif [ -x "$APP_DIR/balena-etcher" ]; then
    CURRENT_VERSION="installed"
fi

echo "Проверка последней версии balenaEtcher..."
RELEASE_JSON="$(curl -fsSL "$API_URL")"
LATEST_TAG="$(printf '%s' "$RELEASE_JSON" | jq -r '.tag_name // empty')"
PACKAGE_URL="$(printf '%s' "$RELEASE_JSON" | jq -r '.assets[] | select(.name | test("^balenaEtcher-linux-x64-[0-9.]+\.zip$")) | .browser_download_url' | head -n 1)"
CHECKSUM_URL="$(printf '%s' "$RELEASE_JSON" | jq -r '.assets[] | select(.name == "SHA256SUMS.Linux.x64.txt") | .browser_download_url')"

if [ -z "$LATEST_TAG" ] || [ "$LATEST_TAG" = "null" ] || [ -z "$PACKAGE_URL" ] || [ "$PACKAGE_URL" = "null" ] || [ -z "$CHECKSUM_URL" ] || [ "$CHECKSUM_URL" = "null" ]; then
    echo "Не удалось получить данные о последней версии релиза (Linux x64)." >&2
    exit 1
fi

LATEST_VERSION="${LATEST_TAG#v}"
PACKAGE_FILE="${PACKAGE_URL##*/}"

echo "Текущая версия: $CURRENT_VERSION"
echo "Доступна версия: $LATEST_VERSION"

if [ "$CURRENT_VERSION" = "$LATEST_VERSION" ]; then
    echo "balenaEtcher уже обновлён до последней версии."
    exit 0
fi

echo "Подготовка прав sudo для установки..."
sudo true

WORK_DIR="$(mktemp -d)"
trap 'rm -rf "$WORK_DIR"' EXIT

echo "Скачивание $PACKAGE_FILE..."
curl -fL --progress-bar -o "$WORK_DIR/$PACKAGE_FILE" "$PACKAGE_URL"
curl -fsSLo "$WORK_DIR/SHA256SUMS.Linux.x64.txt" "$CHECKSUM_URL"

echo "Проверка контрольной суммы..."
cd "$WORK_DIR"

# Надёжная проверка: ищем строку формата «хеш  имя_файла»
if ! grep -q "^[[:space:]]*[0-9a-fA-F]\{64\}\s\+${PACKAGE_FILE//./\\.}$" SHA256SUMS.Linux.x64.txt; then
    echo "Ошибка: запись для $PACKAGE_FILE не найдена в файле контрольных сумм." >&2
    exit 1
fi

sha256sum -c SHA256SUMS.Linux.x64.txt --ignore-missing

echo "Распаковка пакета..."
mkdir -p "$WORK_DIR/extract"
unzip -q "$WORK_DIR/$PACKAGE_FILE" -d "$WORK_DIR/extract"
EXTRACTED_DIR="$WORK_DIR/extract/balenaEtcher-linux-x64"

if [ ! -x "$EXTRACTED_DIR/balena-etcher" ]; then
    echo "Ошибка: исполняемый файл не найден в распакованной папке." >&2
    exit 1
fi

echo "Установка balenaEtcher версии $LATEST_VERSION..."
sudo rm -rf "$APP_DIR"
sudo mv "$EXTRACTED_DIR" "$APP_DIR"
sudo chmod -R a+rX "$APP_DIR"
sudo ln -sf "$APP_DIR/balena-etcher" "$LAUNCHER"

# Скачивание иконки: если не получится — предупреждение, но не ошибка
if ! sudo curl -fsSLo "$APP_DIR/icon.png" "https://raw.githubusercontent.com/balena-io/etcher/${LATEST_TAG}/assets/icon.png"; then
    echo "Предупреждение: не удалось скачать иконку. Программа будет работать без неё." >&2
fi

printf '%s\n' "$LATEST_VERSION" | sudo tee "$VERSION_FILE" > /dev/null

sudo tee "$DESKTOP_FILE" > /dev/null << DESKTOP_EOF
[Desktop Entry]
Name=balenaEtcher
Comment=Запись образов ОС на SD‑карты и USB‑накопители
Exec=/usr/local/bin/balena-etcher %U
Terminal=false
Type=Application
Icon=/opt/balenaEtcher/icon.png
Categories=Utility;
DESKTOP_EOF

# Обновление базы .desktop — только если команда есть
if command -v update-desktop-database > /dev/null 2>&1; then
    sudo update-desktop-database /usr/share/applications > /dev/null 2>&1 || true
fi

if [ ! -x "$APP_DIR/balena-etcher" ]; then
    echo "Ошибка установки: $APP_DIR/balena-etcher отсутствует или не является исполняемым." >&2
    exit 1
fi

echo "Обновление завершено: balenaEtcher $LATEST_VERSION"
echo "Ярлык: $LAUNCHER"
SCRIPT_EOF
fi

if grep -q 'Managed balenaEtcher ZIP update helper' /usr/local/bin/update-balenaetcher 2>/dev/null; then
    sudo chmod +x /usr/local/bin/update-balenaetcher
    echo "Скрипт update-balenaetcher успешно создан."
fi

Что делает: Создаёт скрипт, который автоматически проверяет, скачивает и устанавливает новые версии balenaEtcher.

4. 📦 Способ 2: Установка из DEB-пакета (Debian 12 и 13)

⚠️ Этот метод не работает на Debian 11 из-за устаревшей версии dpkg. Пользователи Debian 11 должны использовать ZIP-метод (раздел 3).

4.1 Проверка версии Debian

if [ ! -f /etc/os-release ]; then
    echo "Ошибка: файл /etc/os-release не найден." >&2
    exit 1
fi

# Безопасное чтение переменных из os-release (без eval)
while IFS='=' read -r key value; do
    case "$key" in
        VERSION_ID) VERSION_ID="${value//\"}" ;;
        VERSION_CODENAME) VERSION_CODENAME="${value//\"}" ;;
    esac
done < /etc/os-release

# Проверка, что переменные вообще определились
if [ -z "$VERSION_ID" ] || [ -z "$VERSION_CODENAME" ]; then
    echo "Ошибка: не удалось определить версию Debian из /etc/os-release." >&2
    exit 1
fi

printf 'Версия Debian: %s (%s)\n' "$VERSION_ID" "$VERSION_CODENAME"

case "$VERSION_ID" in
    13|12)
        echo "Метод установки через DEB‑пакет поддерживается для этой версии."
        ;;
    11)
        echo "Для Debian 11 используйте ZIP‑метод: текущий DEB‑пакет использует control.tar.zst."
        ;;
    *)
        echo "Используйте ZIP‑метод, если вы не проверили совместимость этой версии Debian вручную."
        ;;
esac

4.2 Скачивание DEB-пакета

RELEASE_JSON="$(curl -fsSL https://api.github.com/repos/balena-io/etcher/releases/latest)"

# Исправленное регулярное выражение: \. вместо [.]
PACKAGE_URL="$(printf '%s' "$RELEASE_JSON" | jq -r '.assets[] | select(.name | test("^balena-etcher_[0-9.]+_amd64\.deb$")) | .browser_download_url' | head -n 1)"
CHECKSUM_URL="$(printf '%s' "$RELEASE_JSON" | jq -r '.assets[] | select(.name == "SHA256SUMS.Linux.x64.txt") | .browser_download_url')"

if [ -z "$PACKAGE_URL" ] || [ "$PACKAGE_URL" = "null" ] || [ -z "$CHECKSUM_URL" ] || [ "$CHECKSUM_URL" = "null" ]; then
    echo "Ошибка: не удалось найти файлы релиза для DEB‑пакета (amd64)." >&2
    PACKAGE_FILE=""
else
    PACKAGE_FILE="${PACKAGE_URL##*/}"
    curl -fL --progress-bar -o "$PACKAGE_FILE" "$PACKAGE_URL"
    curl -fsSLo SHA256SUMS.Linux.x64.txt "$CHECKSUM_URL"

    # Надёжная проверка контрольной суммы
    if ! grep -q "^[[:space:]]*[0-9a-fA-F]\{64\}\s\+${PACKAGE_FILE//./\\.}$" SHA256SUMS.Linux.x64.txt; then
        echo "Ошибка: запись для $PACKAGE_FILE не найдена в файле контрольных сумм." >&2
        exit 1
    fi

    sha256sum -c SHA256SUMS.Linux.x64.txt --ignore-missing
fi

Ожидаемый вывод: balena-etcher_2.1.6_amd64.deb: OK

4.3 Установка пакета

if [ -d /opt/balenaEtcher ] || [ -e /usr/local/bin/balena-etcher ]; then
    echo "Ошибка: сначала удалите ZIP‑установку (папка /opt/balenaEtcher или симлинк /usr/local/bin/balena-etcher)." >&2
    exit 1
elif [ ! -f "${PACKAGE_FILE:-}" ]; then
    echo "Ошибка: скачайте и проверьте DEB‑пакет перед установкой balenaEtcher." >&2
    exit 1
else
    sudo apt install "./$PACKAGE_FILE" -y
fi

4.4 Проверка установки

dpkg -l balena-etcher
command -v balena-etcher

Ожидаемый вывод: /usr/bin/balena-etcher

4.5 Создание скрипта для обновления DEB-версии

⚠️ Важное предупреждение: Скрипты обновления не являются официальными от balena.io и предоставляются «как есть». Для максимальной безопасности вы можете выполнять обновления вручную, используя команды из раздела 4.1–4.3. Скрипты создаются для удобства автоматизации и работают на ваш страх и риск.

if [ -e /usr/local/bin/update-balenaetcher-deb ] && ! grep -q 'Managed balenaEtcher DEB update helper' /usr/local/bin/update-balenaetcher-deb 2>/dev/null; then
    echo "Ошибка: не заменяю существующий /usr/local/bin/update-balenaetcher-deb без маркера Managed helper." >&2
    exit 1
else
    sudo tee /usr/local/bin/update-balenaetcher-deb > /dev/null << 'SCRIPT_EOF'
#!/bin/bash
# Managed balenaEtcher DEB update helper
set -euo pipefail

trap 'echo "Произошла ошибка на строке $LINENO." >&2' ERR

API_URL="https://api.github.com/repos/balena-io/etcher/releases/latest"

if [ "$(id -u)" -eq 0 ]; then
    echo "Запускайте update-balenaetcher-deb от имени обычного пользователя; sudo будет запрошен при необходимости." >&2
    exit 1
fi

for cmd in apt curl dpkg dpkg-query grep jq mktemp sha256sum sudo; do
    if ! command -v "$cmd" > /dev/null 2>&1; then
        echo "Не найдена требуемая команда: $cmd" >&2
        echo "Установите зависимости: sudo apt install ca-certificates curl jq -y" >&2
        exit 1
    fi
done

# Безопасное чтение переменных из os-release (без eval)
while IFS='=' read -r key value; do
    case "$key" in
        VERSION_ID) VERSION_ID="${value//\"}" ;;
    esac
done < /etc/os-release

case "$VERSION_ID" in
    13|12) ;;
    *)
        echo "Используйте ZIP‑метод, если вы не проверили совместимость DEB‑пакета для Debian $VERSION_ID вручную." >&2
        exit 1
        ;;
esac

ARCH="$(dpkg --print-architecture)"
if [ "$ARCH" != "amd64" ]; then
    echo "balenaEtcher публикует DEB‑пакеты только для архитектуры amd64. Ваша система: $ARCH" >&2
    exit 1
fi

if [ -d /opt/balenaEtcher ] || [ -e /usr/local/bin/balena-etcher ]; then
    echo "Сначала удалите ZIP‑установку перед обновлением DEB‑пакета." >&2
    exit 1
fi

CURRENT_VERSION="$(dpkg-query -W -f='${Version}' balena-etcher 2>/dev/null || true)"
if [ -z "$CURRENT_VERSION" ]; then
    echo "balena-etcher не установлен через DEB‑метод." >&2
    exit 1
fi

echo "Проверка последней версии DEB‑релиза balenaEtcher..."
RELEASE_JSON="$(curl -fsSL "$API_URL")"
LATEST_TAG="$(printf '%s' "$RELEASE_JSON" | jq -r '.tag_name // empty')"
PACKAGE_URL="$(printf '%s' "$RELEASE_JSON" | jq -r '.assets[] | select(.name | test("^balena-etcher_[0-9.]+_amd64\.deb$")) | .browser_download_url' | head -n 1)"
CHECKSUM_URL="$(printf '%s' "$RELEASE_JSON" | jq -r '.assets[] | select(.name == "SHA256SUMS.Linux.x64.txt") | .browser_download_url')"

if [ -z "$LATEST_TAG" ] || [ "$LATEST_TAG" = "null" ] || [ -z "$PACKAGE_URL" ] || [ "$PACKAGE_URL" = "null" ] || [ -z "$CHECKSUM_URL" ] || [ "$CHECKSUM_URL" = "null" ]; then
    echo "Не удалось получить данные о последней версии DEB‑релиза (amd64)." >&2
    exit 1
fi

LATEST_VERSION="${LATEST_TAG#v}"
PACKAGE_FILE="${PACKAGE_URL##*/}"

echo "Текущая установленная версия: $CURRENT_VERSION"
echo "Доступная версия: $LATEST_VERSION"

if [ "$CURRENT_VERSION" = "$LATEST_VERSION" ]; then
    echo "DEB‑пакет balenaEtcher уже обновлён до последней версии."
    exit 0
fi

echo "Подготовка прав sudo для APT..."
sudo true

WORK_DIR="$(mktemp -d)"
trap 'rm -rf "$WORK_DIR"' EXIT

echo "Скачивание $PACKAGE_FILE..."
curl -fL --progress-bar -o "$WORK_DIR/$PACKAGE_FILE" "$PACKAGE_URL"
curl -fsSLo "$WORK_DIR/SHA256SUMS.Linux.x64.txt" "$CHECKSUM_URL"

echo "Проверка контрольной суммы..."
cd "$WORK_DIR"

# Надёжная проверка: ищем строку формата «хеш  имя_файла»
if ! grep -q "^[[:space:]]*[0-9a-fA-F]\{64\}\s\+${PACKAGE_FILE//./\\.}$" SHA256SUMS.Linux.x64.txt; then
    echo "Ошибка: запись для $PACKAGE_FILE не найдена в файле контрольных сумм." >&2
    exit 1
fi

sha256sum -c SHA256SUMS.Linux.x64.txt --ignore-missing

echo "Установка $PACKAGE_FILE через APT..."
sudo apt install "$WORK_DIR/$PACKAGE_FILE" -y

FINAL_VERSION="$(dpkg-query -W -f='${Version}' balena-etcher 2>/dev/null || true)"
echo "Обновление завершено: balenaEtcher $FINAL_VERSION"
SCRIPT_EOF
fi

if grep -q 'Managed balenaEtcher DEB update helper' /usr/local/bin/update-balenaetcher-deb 2>/dev/null; then
    sudo chmod +x /usr/local/bin/update-balenaetcher-deb
    echo "Скрипт update-balenaetcher-deb успешно создан."
fi

5. 🖱️ Запуск balenaEtcher

5.1 Запуск из терминала

balena-etcher

5.2 Запуск из меню приложений

Нажмите Super (клавиша с логотипом Windows) или кликните «Activities», введите в поиске «balenaEtcher» и нажмите на иконку.

6. 📝 Использование balenaEtcher (краткая инструкция)

Интерфейс программы состоит из трёх простых шагов:

  1. Выбрать образ (Flash from file) — нажмите на иконку с папкой и выберите ISO или IMG-файл
  2. Выбрать целевой накопитель (Select target) — выберите USB-флешку или SD-карту (будьте внимательны — все данные на ней будут удалены!)
  3. Начать запись (Flash!) — нажмите кнопку, чтобы начать запись. После завершения программа проверит, что образ записан правильно.

⚠️ Внимание: Все данные на выбранном USB-накопителе или SD-карте будут безвозвратно удалены. Перед записью убедитесь, что вы выбрали правильный диск.

Как определить правильный USB-накопитель (чтобы не ошибиться)

lsblk

Пример вывода:

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda      8:0    0 238.5G  0 disk 
├─sda1   8:1    0   512M  0 part /boot/efi
└─sda2   8:2    0   238G  0 part /
sdb      8:16   1  14.9G  0 disk 
└─sdb1   8:17   1  14.9G  0 part /media/user/USB
  • sda — ваш основной жёсткий диск (не трогайте его!)
  • sdb — это ваша USB-флешка (14.9G = примерно 16 ГБ)

⚠️ Перед записью обязательно сверяйте не только имя (sdb), но и размер! Часто бывает, что системный диск и флешка имеют похожие имена, а размер — самый надёжный ориентир. Например, если вы ожидаете флешку на 16 ГБ, а в lsblk видите диск на 500 ГБ — это точно не флешка.

💡 Если флешка уже смонтирована (есть строка /media/... в выводе lsblk), лучше её размонтировать перед записью. balenaEtcher обычно сам это делает, но явное размонтирование снижает риск ошибки:

sudo umount /dev/sdb*

(замените sdb на имя вашего устройства).

7. ⚠️ Решение типичных проблем

7.1 Ошибка: balena-etcher: command not found

Симптом: После установки команда balena-etcher не найдена.

Решение: Проверьте, что пакет установлен:

dpkg -l | grep balena

Если в начале строки стоит iU или iF вместо ii — исправьте зависимости:

sudo apt --fix-broken install

7.2 Ошибка: Permission denied при записи на USB-накопитель

Симптом: balenaEtcher не может записать образ на флешку.

⚠️ Не запускайте balenaEtcher от root (sudo). Графические приложения не стоит запускать от суперпользователя — это может привести к проблемам с конфигурацией и кэшем.

Решение:

Шаг 1: Убедитесь, что вы выбрали целевой диск (например, sdb), а не раздел (например, sdb1).

Шаг 2: Проверьте, установлен ли пакет polkit (или policykit-1):

dpkg -l | grep polkit

Шаг 3: Если polkit не установлен, установите его:

sudo apt install polkit

Зачем: balenaEtcher использует Polkit для запроса прав на запись на блочные устройства. При правильно настроенном Polkit программа сама запросит необходимые привилегии через системное окно подтверждения.

Шаг 4: Если окно подтверждения не появляется, можно попробовать запустить программу с передачей прав на устройство через PolicyKit:

pkexec balena-etcher

Что делает: pkexec — это безопасный способ запуска графических приложений с повышенными привилегиями, в отличие от sudo.

⚠️ Если после запуска pkexec balena-etcher появляется ошибка «No such file or directory» или «Failed to execute child process», это значит, что Polkit не может найти исполняемый файл.
В случае ZIP‑установки это нормально: pkexec ищет /usr/bin/balena-etcher, а у вас он лежит как /usr/local/bin/balena-etcher.
Для ZIP‑установки безопаснее вообще не использовать pkexec, а положиться на встроенную авторизацию Polkit внутри самого приложения.

7.3 Ошибка на Debian 11 при установке DEB-пакета

Симптом: При установке DEB-пакета на Debian 11 появляется ошибка:

dpkg-deb: error: archive uses unknown compression for member 'control.tar.zst'

Решение: Используйте ZIP-метод (раздел 3) — он работает на всех версиях Debian.

7.4 Старый APT-репозиторий всё ещё есть в системе

Если старые инструкции оставили файл репозитория, удалите его:

sudo rm -f /etc/apt/sources.list.d/balena-etcher.list
sudo apt update

8. 🗑️ Удаление balenaEtcher

Удаление ZIP-версии

echo "Удаление ZIP‑установки balenaEtcher..."

sudo rm -rf /opt/balenaEtcher

# Удаляем только если файлы существуют (rm -f и так не ругается, но вывод сделаем аккуратнее)
sudo rm -f /usr/local/bin/balena-etcher /usr/share/applications/balena-etcher.desktop

if grep -q 'Managed balenaEtcher ZIP update helper' /usr/local/bin/update-balenaetcher 2>/dev/null; then
    echo "Удаление скрипта обновления update-balenaetcher..."
    sudo rm -f /usr/local/bin/update-balenaetcher
fi

echo "ZIP‑установка balenaEtcher удалена."

Удаление DEB-версии

echo "Удаление DEB‑пакета balena-etcher..."

sudo apt remove balena-etcher -y
sudo apt autoremove -y

if grep -q 'Managed balenaEtcher DEB update helper' /usr/local/bin/update-balenaetcher-deb 2>/dev/null; then
    echo "Удаление скрипта обновления update-balenaetcher-deb..."
    sudo rm -f /usr/local/bin/update-balenaetcher-deb
fi

echo "DEB‑установка balenaEtcher удалена."

Удаление пользовательских данных

rm -rf ~/.config/balenaEtcher ~/.cache/balenaEtcher

⚠️ Эти команды удалят историю выбранных образов, целевых накопителей и сохранённые настройки. Если вы хотите сохранить эти данные, не выполняйте удаление папок ~/.config/balenaEtcher и ~/.cache/balenaEtcher.

9. 📝 Чек-лист: всё готово к работе

  • [ ] balenaEtcher установлен: dpkg -l balena-etcher (DEB) или test -x /opt/balenaEtcher/balena-etcher (ZIP)
  • [ ] Программа запускается из меню приложений
  • [ ] Программа запускается из терминала командой balena-etcher
  • [ ] Скрипт обновления создан: command -v update-balenaetcher (ZIP) или command -v update-balenaetcher-deb (DEB)
  • [ ] Вы можете выбрать образ ISO/IMG
  • [ ] Вы можете выбрать USB-накопитель (не перепутайте с системным диском!)

10. 🏁 Заключение

Вы успешно установили balenaEtcher на Debian. Теперь вы можете создавать загрузочные USB-флешки и SD-карты с любыми ISO-образами через простой графический интерфейс. Программа автоматически проверяет, что образ записан правильно, что избавляет от проблем при первой загрузке с флешки.

Что дальше:

  • Скачайте ISO-образ вашего любимого дистрибутива Linux и запишите его на флешку
  • Подготовьте SD-карту для Raspberry Pi
  • Изучите официальную документацию balenaEtcher