# Updates - Обновление системы VyOS

> Обновление VyOS - проверка версий, управление образами, процедуры обновления и отката с примерами для Yandex Cloud и VK Cloud

Source: https://opennix.org/docs/vyos/system/vyos-updates/


Данная страница описывает механизм обновления VyOS, включая автоматическую проверку обновлений, управление системными образами, процедуры обновления и отката к предыдущим версиям.

## Обзор

VyOS использует механизм обновления на основе образов (image-based updates), что обеспечивает:

- **Безопасность**: Возможность отката к предыдущей версии при проблемах
- **Предсказуемость**: Полная замена системных файлов, без частичных обновлений
- **Изоляция**: Каждая версия хранится как отдельный образ
- **Быстрый откат**: Переключение между версиями через перезагрузку
- **Тестирование**: Возможность проверки новой версии перед окончательным переходом

### Архитектура системы образов

VyOS хранит несколько системных образов на одном устройстве:

```
/boot/
├── 1.5-rolling-202401150023/    # Текущая версия (default)
├── 1.5-rolling-202312250024/    # Предыдущая версия
└── 1.4.0-sagitta/               # Старая LTS версия
```

**Ключевые особенности:**

- Все образы используют общий конфигурационный раздел `/config/`
- Конфигурация сохраняется при переключении между образами
- При загрузке можно выбрать любой установленный образ
- Удаление образа не влияет на конфигурацию

### Типы обновлений VyOS

**Rolling Release (1.5+):**
- Постоянные обновления с новыми функциями
- Ежедневные nightly builds
- Рекомендуется для тестирования и лабораторий
- Требует регулярного мониторинга обновлений

**LTS (Long Term Support):**
- Стабильные версии (например, 1.4 Sagitta)
- Только исправления безопасности и критических багов
- Рекомендуется для production
- Предсказуемый цикл обновлений

## Проверка текущей версии

### Команды проверки версии

```bash
# Показать текущую версию системы
show version

# Показать все установленные образы
show system image

# Показать детальную информацию о системе
show version all
```

### Пример вывода show version

```bash
vyos@router:~$ show version
Version:          VyOS 1.5-rolling-202401150023
Release train:    current
Release flavor:   generic

Built by:         autobuild@vyos.net
Built on:         Mon 15 Jan 2024 00:23 UTC
Build UUID:       a7b3c9d2-e4f5-6789-0abc-def123456789
Build commit ID:  abcdef123456

Architecture:     x86_64
Boot via:         installed image
System type:      KVM guest

Hardware vendor:  QEMU
Hardware model:   Standard PC (Q35 + ICH9, 2009)
Hardware S/N:     unknown
Hardware UUID:    12345678-1234-1234-1234-123456789abc

Copyright:        VyOS maintainers and contributors
```

### Пример вывода show system image

```bash
vyos@router:~$ show system image
The system currently has the following image(s) installed:

   1: 1.5-rolling-202401150023 (default boot) (running image)
   2: 1.5-rolling-202312250024
   3: 1.4.0-sagitta

Total images: 3
```

## Конфигурация автоматической проверки обновлений

### Включение автопроверки

VyOS может автоматически проверять наличие новых версий и уведомлять администратора.

```bash
# Включить автоматическую проверку обновлений
configure
set system update-check auto-check
commit
save
exit
```

### Настройка URL для проверки обновлений

```bash
configure

# URL для rolling release (1.5+)
set system update-check url 'https://raw.githubusercontent.com/vyos/vyos-rolling-nightly-builds/main/version.json'

# Включить автопроверку
set system update-check auto-check

commit
save
exit
```

### Проверка доступных обновлений

```bash
# Ручная проверка наличия обновлений
show system updates
```

### Пример вывода show system updates

```bash
vyos@router:~$ show system updates
Current version: 1.5-rolling-202312220023

Update available: 1.5-rolling-202401150023
Update URL: https://github.com/vyos/vyos-rolling-nightly-builds/releases/download/1.5-rolling-202401150023/1.5-rolling-202401150023-amd64.iso

To update, use: add system image <URL>
```

### Отключение автопроверки

```bash
configure
delete system update-check auto-check
commit
save
exit
```

## Добавление нового образа системы

### Установка образа из URL

```bash
# Добавить последнюю доступную версию
add system image latest

# Добавить образ по конкретному URL
add system image https://github.com/vyos/vyos-rolling-nightly-builds/releases/download/1.5-rolling-202401150023/1.5-rolling-202401150023-amd64.iso

# Добавить образ из локального файла
add system image /tmp/vyos-1.5-rolling-202401150023-amd64.iso
```

### Процесс установки образа

```bash
vyos@router:~$ add system image latest
Trying to fetch latest version from https://github.com/vyos/vyos-rolling-nightly-builds/releases/download/1.5-rolling-202401150023/1.5-rolling-202401150023-amd64.iso

Checking for available updates...
Found new version: 1.5-rolling-202401150023

Do you want to continue? [y/N] y

Downloading image...
######################################################################## 100.0%

Checking image... OK

What would you like to name this image? [1.5-rolling-202401150023]:
# Нажмите Enter для имени по умолчанию или введите своё

Installing new image...
Copying files... Done

Do you want to set the new image as the default boot image? [y/N] y
# Выберите 'y' чтобы новый образ загружался по умолчанию

Image installation complete.

Do you want to reboot now? [y/N] n
# Можно отложить перезагрузку для завершения текущих задач
```

### Установка образа с пользовательским именем

```bash
vyos@router:~$ add system image https://example.com/vyos-custom.iso

What would you like to name this image? [vyos-custom]: production-20240115
# Удобно для идентификации образов

Installing new image...
Copying files... Done

Image 'production-20240115' installed successfully.
```

## Управление системными образами

### Установка образа по умолчанию

```bash
# Установить образ для загрузки по умолчанию
set system image default-boot 1.5-rolling-202401150023

# Или интерактивно
vyos@router:~$ set system image default-boot
Please specify image name:
   1: 1.5-rolling-202401150023
   2: 1.5-rolling-202312250024
   3: 1.4.0-sagitta
Select image [1-3]: 1

Default boot image set to: 1.5-rolling-202401150023
```

### Переименование образа

```bash
# Переименовать образ для удобства идентификации
rename system image 1.5-rolling-202401150023 to production-current
rename system image 1.5-rolling-202312250024 to production-previous
```

### Удаление образа

```bash
# Удалить неиспользуемый образ для освобождения места
delete system image 1.4.0-sagitta

# Или интерактивно
vyos@router:~$ delete system image
The following images are available for deletion:
   1: 1.5-rolling-202312250024
   2: 1.4.0-sagitta

Select image to delete [1-2]: 2

Warning: This will permanently delete image '1.4.0-sagitta'
Continue? [y/N] y

Deleting image... Done
```

**Важно:**
- Нельзя удалить текущий загруженный образ (running image)
- Нельзя удалить образ по умолчанию (default boot) без установки нового
- Удаление образа не влияет на конфигурацию в `/config/`

### Проверка использования дискового пространства

```bash
# Проверить занятое место образами
show system storage

# Детальная информация
df -h
```

```bash
vyos@router:~$ show system storage
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2       9.5G  4.2G  4.8G  47% /
tmpfs           489M     0  489M   0% /dev/shm
/dev/sda1       497M  125M  372M  26% /boot

Images storage usage:
1.5-rolling-202401150023: 1.2G
1.5-rolling-202312250024: 1.2G
1.4.0-sagitta: 950M
Total: 3.35G
```

## Процедура обновления VyOS

### Подготовка к обновлению

**Шаг 1: Создание резервной копии конфигурации**

```bash
# Сохранить текущую конфигурацию
save /config/backup-before-update-$(date +%Y%m%d).config

# Копировать на внешний сервер (опционально)
scp /config/backup-before-update-$(date +%Y%m%d).config user@backup-server:/backups/
```

**Шаг 2: Проверка текущего состояния**

```bash
# Проверить текущую версию
show version

# Проверить установленные образы
show system image

# Проверить доступное место
show system storage

# Проверить активные сессии
show system connections

# Проверить запущенные процессы
show system processes
```

**Шаг 3: Уведомление пользователей**

```bash
# Отправить предупреждающее сообщение всем подключенным пользователям
wall "ВНИМАНИЕ: Планируется обновление системы через 10 минут. Сохраните работу."

# Или через system login banner
configure
set system login banner pre-login "Система будет перезагружена для обновления в 18:00 МСК"
commit
save
exit
```

### Выполнение обновления

**Шаг 1: Загрузка и установка нового образа**

```bash
# Проверить доступные обновления
show system updates

# Установить новый образ
add system image latest

# При появлении запросов:
# 1. Подтвердить загрузку: y
# 2. Указать имя образа (или Enter для значения по умолчанию)
# 3. Установить как default boot: y
# 4. Перезагрузить сейчас: n (отложить для планового окна)
```

**Шаг 2: Проверка установки**

```bash
# Убедиться что образ установлен
show system image

# Проверить что новый образ установлен как default
# Вывод должен показывать (default boot) у нового образа
```

**Шаг 3: Плановая перезагрузка**

```bash
# Запланировать перезагрузку (через 5 минут)
shutdown reboot +5 "Перезагрузка для применения обновления VyOS"

# Или немедленная перезагрузка
reboot now

# Или в конкретное время
shutdown reboot 18:00 "Плановое обновление VyOS"
```

**Шаг 4: Проверка после перезагрузки**

```bash
# Проверить что загружена новая версия
show version

# Проверить что конфигурация применена
show configuration

# Проверить сетевую доступность
ping 8.8.8.8

# Проверить работу сервисов
show interfaces
show protocols
show firewall
```

### Быстрая процедура обновления (single command)

```bash
# Для опытных администраторов - автоматизированное обновление
add system image latest && reboot now
```

**Внимание**: Использовать только в тестовых средах или при полном понимании рисков.

## Откат к предыдущей версии (Rollback)

### Причины для отката

- Обнаружены проблемы совместимости с оборудованием
- Критические баги в новой версии
- Проблемы с производительностью
- Несовместимость с существующей конфигурацией
- Необходимость дополнительного тестирования

### Методы отката

#### Метод 1: Выбор образа через GRUB (при загрузке)

**Когда использовать**: При невозможности загрузки или критических проблемах

**Процедура**:

1. Перезагрузить систему: `reboot`
2. При появлении GRUB меню (нажать ESC если автозагрузка)
3. Выбрать пункт с предыдущей версией VyOS
4. Нажать Enter

**Примечание**: Если GRUB меню не появляется, нажмите ESC во время загрузки.

#### Метод 2: Изменение default boot образа

**Когда использовать**: При стабильной работе системы, но необходимости вернуться к предыдущей версии

**Процедура**:

```bash
# Просмотреть доступные образы
show system image

# Вывод:
# 1: 1.5-rolling-202401150023 (default boot) (running image)
# 2: 1.5-rolling-202312250024
# 3: 1.4.0-sagitta

# Установить предыдущий образ как default
set system image default-boot 1.5-rolling-202312250024

# Перезагрузить систему
reboot now
```

#### Метод 3: Интерактивный откат

```bash
# Запустить интерактивный мастер отката
vyos@router:~$ set system image default-boot

Please specify image name:
   1: 1.5-rolling-202401150023 (current default)
   2: 1.5-rolling-202312250024
   3: 1.4.0-sagitta

Select image [1-3]: 2

Default boot image set to: 1.5-rolling-202312250024

Reboot now to apply changes? [y/N] y
```

### Проверка после отката

```bash
# Проверить версию после перезагрузки
show version

# Убедиться что конфигурация применена корректно
show configuration

# Проверить работу критичных сервисов
show interfaces
show protocols
show firewall
show nat

# Проверить логи на наличие ошибок
show log tail 100
```

### Автоматический откат через watchdog

Для критичных систем можно настроить автоматический откат при потере связи:

```bash
#!/bin/bash
# Скрипт автоматического отката при проблемах
# Размещается на внешнем monitoring сервере

VYOS_HOST="192.168.1.1"
PING_TIMEOUT=30
MAX_FAILURES=3

failures=0

while true; do
    if ! ping -c 1 -W $PING_TIMEOUT $VYOS_HOST > /dev/null 2>&1; then
        ((failures++))
        echo "Ping failed ($failures/$MAX_FAILURES)"

        if [ $failures -ge $MAX_FAILURES ]; then
            echo "Critical: VyOS not responding. Manual intervention required!"
            # Отправить алерт администратору
            # mail -s "VyOS DOWN" admin@example.com < /dev/null
        fi
    else
        failures=0
    fi

    sleep 60
done
```

## Примеры для облачных платформ

### Пример 1: Yandex Cloud - Автоматизированная проверка обновлений

В Yandex Cloud VyOS может автоматически проверять обновления и уведомлять через cloud monitoring.

#### Конфигурация для Yandex Cloud

```bash
configure

# Включить автопроверку обновлений
set system update-check auto-check
set system update-check url 'https://raw.githubusercontent.com/vyos/vyos-rolling-nightly-builds/main/version.json'

# Настроить syslog для отправки в Yandex Cloud Logging
set system syslog host 10.128.0.100 facility all level info
set system syslog host 10.128.0.100 facility all protocol tcp

# Настроить SNMP для мониторинга (если используется)
set service snmp community yc-monitoring authorization ro
set service snmp listen-address 10.128.0.10

commit
save
exit
```

#### Скрипт проверки обновлений для Yandex Cloud

```bash
#!/bin/vbash
# /config/scripts/yc-check-updates.sh
# Автоматическая проверка обновлений с логированием в Yandex Cloud

source /opt/vyatta/etc/functions/script-template

LOG_FILE="/var/log/vyos-update-check.log"
METADATA_URL="http://169.254.169.254/latest/meta-data"

# Получить информацию об инстансе
INSTANCE_ID=$(curl -s $METADATA_URL/instance-id)
ZONE=$(curl -s $METADATA_URL/placement/availability-zone)

echo "[$(date)] Checking updates for instance $INSTANCE_ID in zone $ZONE" >> $LOG_FILE

# Проверить обновления
UPDATE_INFO=$(cli-shell-api showCfg system update-check)

if [ -n "$UPDATE_INFO" ]; then
    echo "[$(date)] Update check enabled" >> $LOG_FILE

    # Выполнить проверку (команда show недоступна в скриптах, используем API)
    # В production следует использовать VyOS API или wrapper

    logger -t vyos-updates "Update check completed for $INSTANCE_ID"
else
    echo "[$(date)] Update check not configured" >> $LOG_FILE
fi

# Проверить использование дискового пространства
DISK_USAGE=$(df -h / | tail -1 | awk '{print $5}' | sed 's/%//')

if [ $DISK_USAGE -gt 80 ]; then
    logger -t vyos-updates "WARNING: Disk usage is ${DISK_USAGE}% - consider removing old images"
    echo "[$(date)] WARNING: Disk usage ${DISK_USAGE}%" >> $LOG_FILE
fi

echo "[$(date)] Update check completed" >> $LOG_FILE
```

#### Настройка планировщика задач

```bash
configure

# Запускать проверку обновлений каждый день в 2:00 UTC
set system task-scheduler task check-updates executable path '/config/scripts/yc-check-updates.sh'
set system task-scheduler task check-updates interval 1d
set system task-scheduler task check-updates start-time '02:00'

commit
save
exit
```

#### Создание snapshot перед обновлением в Yandex Cloud

```bash
#!/bin/bash
# yc-create-snapshot-before-update.sh
# Скрипт для создания snapshot диска перед обновлением VyOS

INSTANCE_NAME="vyos-router-01"
DISK_NAME="vyos-boot-disk"
SNAPSHOT_NAME="vyos-backup-$(date +%Y%m%d-%H%M%S)"

# Требуется установленный и настроенный yc CLI
yc compute snapshot create \
  --name "$SNAPSHOT_NAME" \
  --disk-name "$DISK_NAME" \
  --description "Automatic snapshot before VyOS update" \
  --labels "instance=$INSTANCE_NAME,type=pre-update"

echo "Snapshot $SNAPSHOT_NAME created successfully"

# После успешного создания snapshot можно обновлять VyOS
ssh vyos@$INSTANCE_NAME "add system image latest"
```

### Пример 2: VK Cloud - Поэтапное развертывание с rollback

VK Cloud позволяет создавать несколько инстансов для blue-green deployment.

#### Сценарий: Blue-Green обновление

**Архитектура**:
- Blue environment: Текущая production версия (VyOS 1.4)
- Green environment: Новая версия для тестирования (VyOS 1.5)
- Load balancer переключает трафик между окружениями

**Подготовка Green environment**:

```bash
# На новом инстансе VK Cloud
configure

# Базовая конфигурация
set system host-name vyos-router-green
set system domain-name vkcloud.internal

# Проверить текущую версию
show version

# Если требуется обновление - установить latest
exit

# Установить образ
add system image latest

# Скопировать конфигурацию с Blue
scp vyos@blue-instance:/config/config.boot /tmp/blue-config.boot

# Загрузить конфигурацию
configure
load /tmp/blue-config.boot

# Изменить hostname для Green
set system host-name vyos-router-green

commit
save
exit
```

**Тестирование Green environment**:

```bash
#!/bin/bash
# vkcloud-test-green-env.sh
# Тестирование нового окружения перед переключением трафика

GREEN_IP="10.0.1.101"
TESTS_PASSED=0
TESTS_FAILED=0

echo "Testing Green environment at $GREEN_IP"

# Тест 1: Ping connectivity
if ping -c 5 $GREEN_IP > /dev/null 2>&1; then
    echo "PASS: Ping connectivity"
    ((TESTS_PASSED++))
else
    echo "FAIL: Ping connectivity"
    ((TESTS_FAILED++))
fi

# Тест 2: SSH доступность
if ssh -o ConnectTimeout=5 vyos@$GREEN_IP "show version" > /dev/null 2>&1; then
    echo "PASS: SSH access"
    ((TESTS_PASSED++))
else
    echo "FAIL: SSH access"
    ((TESTS_FAILED++))
fi

# Тест 3: Routing table
if ssh vyos@$GREEN_IP "show ip route" | grep -q "default"; then
    echo "PASS: Default route present"
    ((TESTS_PASSED++))
else
    echo "FAIL: Default route missing"
    ((TESTS_FAILED++))
fi

# Тест 4: NAT rules
if ssh vyos@$GREEN_IP "show nat source rules" | grep -q "rule"; then
    echo "PASS: NAT rules configured"
    ((TESTS_PASSED++))
else
    echo "FAIL: NAT rules missing"
    ((TESTS_FAILED++))
fi

# Тест 5: Firewall rules
if ssh vyos@$GREEN_IP "show firewall" | grep -q "rule"; then
    echo "PASS: Firewall rules configured"
    ((TESTS_PASSED++))
else
    echo "FAIL: Firewall rules missing"
    ((TESTS_FAILED++))
fi

echo ""
echo "Results: $TESTS_PASSED passed, $TESTS_FAILED failed"

if [ $TESTS_FAILED -eq 0 ]; then
    echo "All tests passed - safe to proceed with traffic switchover"
    exit 0
else
    echo "Tests failed - do not switch traffic, investigate issues"
    exit 1
fi
```

**Переключение трафика (через VK Cloud Load Balancer)**:

```bash
#!/bin/bash
# vkcloud-switch-to-green.sh
# Переключение трафика на Green environment

# Проверить тесты
if ! ./vkcloud-test-green-env.sh; then
    echo "Pre-flight tests failed. Aborting switchover."
    exit 1
fi

# Постепенное переключение (canary deployment)
echo "Phase 1: Switching 10% traffic to Green..."
# Настроить Load Balancer для 10% трафика на Green
# (выполняется через VK Cloud API или панель управления)

sleep 300  # 5 минут мониторинга

echo "Phase 2: Switching 50% traffic to Green..."
# 50% трафика на Green

sleep 300

echo "Phase 3: Switching 100% traffic to Green..."
# 100% трафика на Green

echo "Switchover complete. Blue environment remains as rollback option."
```

**Rollback процедура**:

```bash
#!/bin/bash
# vkcloud-rollback-to-blue.sh
# Откат на Blue environment при проблемах

echo "EMERGENCY ROLLBACK: Switching all traffic to Blue environment"

# Немедленное переключение 100% трафика на Blue
# (через VK Cloud Load Balancer API)

echo "All traffic redirected to Blue. Green environment available for investigation."

# Отправить уведомление команде
wall "ROLLBACK EXECUTED: All traffic returned to Blue environment"
```

#### Автоматический мониторинг и rollback

```bash
#!/bin/bash
# vkcloud-auto-rollback-monitor.sh
# Автоматический откат при обнаружении проблем

GREEN_IP="10.0.1.101"
BLUE_IP="10.0.1.100"
FAILURE_THRESHOLD=3
CHECK_INTERVAL=30

failures=0

while true; do
    # Проверка доступности Green
    if ! ping -c 3 -W 5 $GREEN_IP > /dev/null 2>&1; then
        ((failures++))
        echo "$(date): Green environment check failed ($failures/$FAILURE_THRESHOLD)"

        if [ $failures -ge $FAILURE_THRESHOLD ]; then
            echo "$(date): CRITICAL - Initiating automatic rollback to Blue"
            ./vkcloud-rollback-to-blue.sh

            # Отправить критическое уведомление
            curl -X POST https://monitoring.vkcloud.example/alert \
                -d "severity=critical&message=Auto-rollback to Blue executed"

            # Прекратить мониторинг после rollback
            exit 1
        fi
    else
        # Сброс счетчика при успешной проверке
        if [ $failures -gt 0 ]; then
            echo "$(date): Green environment recovered"
        fi
        failures=0
    fi

    sleep $CHECK_INTERVAL
done
```

### Пример 3: Гибридная облачная среда - Multi-cloud update strategy

```bash
#!/bin/bash
# multi-cloud-update-strategy.sh
# Обновление VyOS роутеров в multi-cloud среде

# Роутеры в разных облаках
YANDEX_ROUTERS="10.128.0.10 10.128.0.11"
VK_ROUTERS="10.0.1.10 10.0.1.11"
ONPREM_ROUTERS="192.168.1.10 192.168.1.11"

# Функция обновления одного роутера
update_router() {
    local ROUTER_IP=$1
    local ENV_NAME=$2

    echo "[$ENV_NAME] Updating router $ROUTER_IP"

    # Создать backup конфигурации
    ssh vyos@$ROUTER_IP "save /config/backup-$(date +%Y%m%d).config"

    # Скачать backup на локальный сервер
    scp vyos@$ROUTER_IP:/config/backup-$(date +%Y%m%d).config ./backups/$ENV_NAME-$ROUTER_IP-$(date +%Y%m%d).config

    # Обновить образ
    ssh vyos@$ROUTER_IP "add system image latest" < /dev/null

    # Запланировать перезагрузку через 5 минут (для возможности отмены)
    ssh vyos@$ROUTER_IP "shutdown reboot +5 'Automatic update'"

    echo "[$ENV_NAME] Router $ROUTER_IP scheduled for update"
}

# Обновление поэтапно: сначала Yandex Cloud
echo "Stage 1: Updating Yandex Cloud routers"
for ROUTER in $YANDEX_ROUTERS; do
    update_router $ROUTER "Yandex Cloud"
    sleep 600  # 10 минут между роутерами
done

sleep 1800  # 30 минут для проверки

# Затем VK Cloud
echo "Stage 2: Updating VK Cloud routers"
for ROUTER in $VK_ROUTERS; do
    update_router $ROUTER "VK Cloud"
    sleep 600
done

sleep 1800

# Наконец, on-premise
echo "Stage 3: Updating on-premise routers"
for ROUTER in $ONPREM_ROUTERS; do
    update_router $ROUTER "On-Premise"
    sleep 600
done

echo "All routers updated. Monitor for next 24 hours."
```

## Команды проверки и мониторинга

### Проверка версии и образов

```bash
# Текущая версия
show version

# Короткая версия (только номер)
show version brief

# Все установленные образы
show system image

# Детальная информация
show version all
```

### Проверка обновлений

```bash
# Проверить доступность обновлений
show system updates

# Показать конфигурацию update-check
show configuration system update-check

# Показать URL для проверки обновлений
show configuration system update-check url
```

### Мониторинг дискового пространства

```bash
# Общее использование
show system storage

# Детально по файловым системам
df -h

# Размер каждого образа
du -sh /boot/*/

# Топ-10 больших файлов в /config
du -ah /config | sort -rh | head -10
```

### Проверка истории загрузок

```bash
# Последние перезагрузки
last reboot

# Uptime текущей сессии
show system uptime

# Дата последней загрузки
who -b
```

### Логи обновлений

```bash
# Логи установки образов
show log | match image

# Системные логи
show log tail 100

# Логи загрузки
show log boot

# Поиск ошибок при обновлении
show log | match -i "error\|fail" | match image
```

## Устранение неполадок (Troubleshooting)

### Проблема 1: Недостаточно места для установки нового образа

**Симптомы**:
```
Error: Not enough disk space to install new image
Required: 1.5G, Available: 800M
```

**Диагностика**:

```bash
# Проверить доступное место
show system storage

# Показать все образы
show system image

# Размер каждого образа
du -sh /boot/*/
```

**Решение**:

```bash
# Удалить старые неиспользуемые образы
delete system image 1.4.0-sagitta

# Очистить старые логи
sudo find /var/log -type f -name "*.gz" -delete
sudo find /var/log -type f -name "*.old" -delete

# Очистить старые backups конфигураций
sudo rm /config/backup-*.config

# Проверить освобожденное место
show system storage

# Повторить установку
add system image latest
```

### Проблема 2: Загрузка нового образа зависает

**Симптомы**:
- Система зависает на экране загрузки
- GRUB показывает новый образ, но загрузка не завершается
- Появляются kernel panic сообщения

**Решение через GRUB**:

1. Перезагрузить систему (физически или через IPMI/KVM)
2. Нажать ESC при появлении GRUB
3. Выбрать предыдущий работающий образ
4. После успешной загрузки:

```bash
# Установить старый образ как default
set system image default-boot 1.5-rolling-202312250024

# Удалить проблемный образ
delete system image 1.5-rolling-202401150023

# Проверить логи для диагностики
show log boot
show log kernel
```

### Проблема 3: Конфигурация не применяется после обновления

**Симптомы**:
- После обновления и перезагрузки конфигурация не применена
- Интерфейсы не настроены
- Сервисы не запущены

**Диагностика**:

```bash
# Проверить текущую версию
show version

# Проверить содержимое конфигурации
show configuration

# Проверить файл конфигурации
cat /config/config.boot

# Проверить логи загрузки
show log boot | match -i "error\|fail\|warn"
```

**Решение**:

```bash
# Загрузить конфигурацию из backup
configure
load /config/backup-before-update-20240115.config
commit
save
exit

# Если backup отсутствует - восстановить минимальную конфигурацию
configure

# Базовая конфигурация интерфейсов
set interfaces ethernet eth0 address dhcp
set interfaces ethernet eth0 description 'WAN'

set interfaces ethernet eth1 address 192.168.1.1/24
set interfaces ethernet eth1 description 'LAN'

# NAT
set nat source rule 100 outbound-interface name 'eth0'
set nat source rule 100 source address 192.168.1.0/24
set nat source rule 100 translation address masquerade

commit
save
exit
```

### Проблема 4: Ошибка загрузки образа из URL

**Симптомы**:
```
Error: Failed to download image from URL
Connection timeout or HTTP error
```

**Диагностика**:

```bash
# Проверить сетевую связность
ping -c 5 github.com

# Проверить DNS
nslookup github.com

# Проверить маршрут к интернету
show ip route

# Проверить NAT (если используется)
show nat source statistics

# Попробовать загрузить URL вручную
curl -I https://github.com/vyos/vyos-rolling-nightly-builds/releases/download/1.5-rolling-202401150023/1.5-rolling-202401150023-amd64.iso
```

**Решение**:

```bash
# Вариант 1: Использовать прямой HTTP вместо HTTPS (если возможно)
add system image http://mirror.example.com/vyos-image.iso

# Вариант 2: Загрузить образ на локальный сервер
# На внешнем сервере с доступом в интернет:
wget https://github.com/vyos/vyos-rolling-nightly-builds/releases/download/1.5-rolling-202401150023/1.5-rolling-202401150023-amd64.iso

# Запустить HTTP сервер
python3 -m http.server 8080

# На VyOS:
add system image http://192.168.1.100:8080/1.5-rolling-202401150023-amd64.iso

# Вариант 3: Загрузить через SCP
# Скопировать файл на VyOS
scp vyos-image.iso vyos@router:/tmp/

# Установить из локального файла
add system image /tmp/vyos-image.iso
```

### Проблема 5: После обновления пропал доступ к системе

**Симптомы**:
- SSH соединение обрывается после перезагрузки
- Невозможно подключиться к роутеру
- Ping не проходит

**Диагностика через консоль** (KVM/IPMI/Serial):

```bash
# Войти через консоль
# Проверить интерфейсы
show interfaces

# Проверить IP адреса
ip addr show

# Проверить routing
show ip route

# Проверить firewall
show firewall
```

**Решение**:

```bash
# Через консоль - восстановить сетевую связность
configure

# Проверить что интерфейсы настроены
show interfaces

# Если нет - настроить заново
set interfaces ethernet eth0 address 192.168.1.1/24

# Временно отключить firewall для диагностики
set firewall all-ping enable

commit
exit

# Попробовать SSH подключение снова
```

**Если консоль недоступна** - откатиться через GRUB:
1. Перезагрузить (hard reset)
2. Выбрать предыдущий образ в GRUB
3. После загрузки установить его как default

### Проблема 6: GRUB меню не появляется

**Симптомы**:
- Система автоматически загружает образ по умолчанию
- Невозможно выбрать другой образ

**Решение**:

**Метод 1: Настройка GRUB timeout**

Через SSH (перед проблемой):
```bash
# Увеличить timeout GRUB для возможности выбора образа
sudo vi /boot/grub/grub.cfg

# Найти строку:
# set timeout=0
# Изменить на:
# set timeout=10

# Сохранить и перезагрузить
```

**Метод 2: Нажатие ESC при загрузке**

- При появлении логотипа VyOS нажать ESC многократно
- GRUB меню должно появиться даже при timeout=0

**Метод 3: Через serial console**

```bash
# Настроить serial console для доступа к GRUB
configure
set system console device ttyS0 speed 9600
commit
save
exit
```

## Лучшие практики (Best Practices)

### 1. Резервное копирование перед обновлением

**Всегда создавайте backup конфигурации:**

```bash
# Автоматический backup с датой
save /config/backup-$(date +%Y%m%d-%H%M%S).config

# Копировать на внешний сервер
scp /config/backup-$(date +%Y%m%d-%H%M%S).config user@backup-server:/vyos-backups/

# Для критичных систем - snapshot диска (в облаке)
# Yandex Cloud: создать snapshot через web UI или API
# VK Cloud: создать snapshot через панель управления
```

### 2. Тестирование обновлений

**Никогда не обновляйте production без тестирования:**

```bash
# Схема тестирования:
# 1. Lab environment (изолированная сеть)
# 2. Dev environment (разработка)
# 3. Staging environment (pre-production)
# 4. Production (по графику maintenance window)

# Для каждого этапа:
# - Установить образ
# - Загрузить production конфигурацию
# - Протестировать все критичные функции
# - Мониторить производительность
# - Только после успеха - следующий этап
```

### 3. Документирование обновлений

**Ведите журнал обновлений:**

```bash
# Пример записи в журнале
# /config/update-log.txt

2024-01-15 18:00 MSK - Update started
Router: vyos-router-01
Previous version: 1.5-rolling-202312220023
New version: 1.5-rolling-202401150023
Reason: Security patches
Executed by: admin@example.com
Backup: /backups/vyos-20240115-180000.config
Rollback plan: GRUB select previous image

2024-01-15 18:15 MSK - Update completed successfully
Post-update checks: PASSED
All services operational
```

### 4. Окна обслуживания (Maintenance Windows)

**Планируйте обновления в непиковое время:**

```bash
# Определить maintenance window
# Примеры:
# - Корпоративная сеть: 22:00-02:00 в будние дни
# - Интернет-провайдер: 03:00-05:00 в будние дни
# - Критичные системы: только в выходные

# Уведомить пользователей заранее
configure
set system login banner pre-login "
MAINTENANCE WINDOW: 15.01.2024 22:00-02:00 MSK
VyOS update scheduled. Brief service interruption expected.
"
commit
save
exit
```

### 5. Поэтапное обновление (Staged Rollout)

**Для множества роутеров - обновляйте постепенно:**

```bash
# Week 1: Lab и Dev роутеры (10% fleet)
# Week 2: Staging и non-critical (30% fleet)
# Week 3: Half of production (50% fleet)
# Week 4: Remaining production (100% fleet)

# Между этапами:
# - Мониторинг 7 дней
# - Сбор feedback от пользователей
# - Анализ логов и метрик
# - При проблемах - остановка rollout
```

### 6. Мониторинг после обновления

**Усиленный мониторинг первые 24-48 часов:**

```bash
#!/bin/bash
# post-update-monitoring.sh
# Расширенный мониторинг после обновления

ROUTER_IP="192.168.1.1"
CHECK_INTERVAL=60  # секунды
DURATION=86400     # 24 часа

end_time=$(($(date +%s) + DURATION))

while [ $(date +%s) -lt $end_time ]; do
    echo "=== $(date) ==="

    # CPU usage
    ssh vyos@$ROUTER_IP "show system cpu" | grep "CPU"

    # Memory usage
    ssh vyos@$ROUTER_IP "show system memory" | grep "Mem:"

    # Interface status
    ssh vyos@$ROUTER_IP "show interfaces" | grep -E "eth[0-9]|state"

    # Connection count
    ssh vyos@$ROUTER_IP "show system connections" | wc -l

    # Errors in logs
    ERRORS=$(ssh vyos@$ROUTER_IP "show log tail 100 | grep -i error" | wc -l)
    if [ $ERRORS -gt 0 ]; then
        echo "WARNING: $ERRORS errors detected in logs"
    fi

    sleep $CHECK_INTERVAL
done
```

### 7. План отката (Rollback Plan)

**Всегда имейте готовый план отката:**

```bash
# Документ rollback-plan.md

# ROLLBACK PLAN для обновления 15.01.2024

## Условия для отката:
1. Критичные сервисы недоступны > 5 минут
2. Потеря connectivity > 3 минут
3. CPU/Memory usage > 90% в течение 10 минут
4. Обнаружены критические ошибки в логах

## Процедура отката:
1. SSH доступ: ssh vyos@192.168.1.1
2. Команда: set system image default-boot 1.5-rolling-202312220023
3. Команда: reboot now
4. Ожидание: 5 минут
5. Проверка: ping, SSH, services
6. Уведомление: команде об откате

## Контакты для эскалации:
- L1 Support: +7-xxx-xxx-xxxx
- L2 Engineering: engineering@example.com
- L3 Vendor Support: VyOS commercial support

## Backup location:
- Config: /backups/vyos-20240115.config
- Disk snapshot (Yandex Cloud): snapshot-20240115-180000
```

### 8. Версионирование и метки

**Используйте понятные имена для образов:**

```bash
# Вместо:
# 1.5-rolling-202401150023

# Используйте rename:
rename system image 1.5-rolling-202401150023 to production-current
rename system image 1.5-rolling-202312220023 to production-previous
rename system image 1.4.0-sagitta to lts-stable

# Результат:
show system image
# 1: production-current (default boot) (running image)
# 2: production-previous
# 3: lts-stable
```

### 9. Автоматизация через CI/CD

**Для больших инфраструктур - автоматизация:**

```yaml
# .gitlab-ci.yml - пример CI/CD для обновлений VyOS

stages:
  - backup
  - update
  - verify
  - rollback

variables:
  VYOS_ROUTERS: "10.0.1.10 10.0.1.11 10.0.1.12"
  IMAGE_URL: "https://downloads.example.com/vyos-latest.iso"

backup_configs:
  stage: backup
  script:
    - for router in $VYOS_ROUTERS; do
        ssh vyos@$router "save /config/backup-$(date +%Y%m%d).config";
        scp vyos@$router:/config/backup-$(date +%Y%m%d).config ./backups/;
      done
  artifacts:
    paths:
      - backups/

update_routers:
  stage: update
  script:
    - for router in $VYOS_ROUTERS; do
        ssh vyos@$router "add system image $IMAGE_URL";
        ssh vyos@$router "shutdown reboot +5";
        sleep 600;
      done
  dependencies:
    - backup_configs

verify_update:
  stage: verify
  script:
    - ./scripts/verify-routers.sh
  allow_failure: true

rollback_on_failure:
  stage: rollback
  when: on_failure
  script:
    - ./scripts/rollback-all-routers.sh
```

### 10. Безопасность при обновлениях

**Проверяйте подлинность образов:**

```bash
# Проверить checksum образа
curl -O https://downloads.vyos.io/rolling/current/vyos-1.5-rolling-202401150023-amd64.iso
curl -O https://downloads.vyos.io/rolling/current/vyos-1.5-rolling-202401150023-amd64.iso.sha256

# Проверить checksum
sha256sum -c vyos-1.5-rolling-202401150023-amd64.iso.sha256

# Только при успешной проверке - устанавливать
add system image /tmp/vyos-1.5-rolling-202401150023-amd64.iso
```

## Автоматизация обновлений

### Скрипт автоматического обновления с проверками

```bash
#!/bin/bash
# auto-update-vyos.sh
# Полностью автоматизированное обновление с проверками

set -e

ROUTER_IP="192.168.1.1"
BACKUP_DIR="/backups/vyos"
LOG_FILE="/var/log/vyos-auto-update.log"
ADMIN_EMAIL="admin@example.com"

log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE
}

send_notification() {
    local subject="$1"
    local body="$2"
    echo "$body" | mail -s "$subject" $ADMIN_EMAIL
}

# Pre-flight checks
log "Starting pre-flight checks"

# Check SSH connectivity
if ! ssh -o ConnectTimeout=5 vyos@$ROUTER_IP "show version" > /dev/null 2>&1; then
    log "ERROR: Cannot connect to router"
    send_notification "VyOS Update FAILED" "Cannot connect to router $ROUTER_IP"
    exit 1
fi

# Check disk space
DISK_USAGE=$(ssh vyos@$ROUTER_IP "df -h / | tail -1 | awk '{print \$5}' | sed 's/%//'")
if [ $DISK_USAGE -gt 70 ]; then
    log "WARNING: Disk usage is ${DISK_USAGE}%"
    send_notification "VyOS Update WARNING" "High disk usage (${DISK_USAGE}%) on $ROUTER_IP"

    # Cleanup old images if needed
    log "Cleaning up old images"
    ssh vyos@$ROUTER_IP "delete system image oldest"
fi

# Backup configuration
log "Creating configuration backup"
BACKUP_FILE="$BACKUP_DIR/$(date +%Y%m%d-%H%M%S)-$ROUTER_IP.config"
ssh vyos@$ROUTER_IP "save /tmp/backup.config"
scp vyos@$ROUTER_IP:/tmp/backup.config $BACKUP_FILE

if [ ! -f $BACKUP_FILE ]; then
    log "ERROR: Backup failed"
    send_notification "VyOS Update FAILED" "Backup creation failed for $ROUTER_IP"
    exit 1
fi

log "Backup created: $BACKUP_FILE"

# Check for updates
log "Checking for available updates"
UPDATE_INFO=$(ssh vyos@$ROUTER_IP "show system updates" 2>&1)

if echo "$UPDATE_INFO" | grep -q "Update available"; then
    NEW_VERSION=$(echo "$UPDATE_INFO" | grep "Update available" | awk '{print $3}')
    log "Update available: $NEW_VERSION"

    # Download and install new image
    log "Installing new image: $NEW_VERSION"
    ssh vyos@$ROUTER_IP "add system image latest" < /dev/null

    # Set as default boot
    log "Setting new image as default boot"
    ssh vyos@$ROUTER_IP "set system image default-boot $NEW_VERSION"

    # Schedule reboot in 5 minutes (safety window for cancellation)
    log "Scheduling reboot in 5 minutes"
    ssh vyos@$ROUTER_IP "shutdown reboot +5 'Automatic update to $NEW_VERSION'"

    send_notification "VyOS Update SCHEDULED" "Router $ROUTER_IP will reboot in 5 minutes to apply update to $NEW_VERSION"

    # Wait for reboot to complete
    log "Waiting for reboot to complete"
    sleep 360  # 6 minutes

    # Post-reboot verification
    log "Starting post-reboot verification"
    RETRIES=10
    while [ $RETRIES -gt 0 ]; do
        if ssh -o ConnectTimeout=5 vyos@$ROUTER_IP "show version" > /dev/null 2>&1; then
            log "Router is back online"
            break
        fi
        log "Waiting for router to come back online (retries left: $RETRIES)"
        sleep 30
        ((RETRIES--))
    done

    if [ $RETRIES -eq 0 ]; then
        log "ERROR: Router did not come back online after reboot"
        send_notification "VyOS Update CRITICAL" "Router $ROUTER_IP did not come back online after update. Manual intervention required!"
        exit 1
    fi

    # Verify new version is running
    CURRENT_VERSION=$(ssh vyos@$ROUTER_IP "show version | grep Version | awk '{print \$2}'")
    if [ "$CURRENT_VERSION" == "$NEW_VERSION" ]; then
        log "SUCCESS: Update completed successfully to $NEW_VERSION"
        send_notification "VyOS Update SUCCESS" "Router $ROUTER_IP successfully updated to $NEW_VERSION"
    else
        log "WARNING: Version mismatch. Expected $NEW_VERSION, got $CURRENT_VERSION"
        send_notification "VyOS Update WARNING" "Version mismatch on $ROUTER_IP. Expected $NEW_VERSION, got $CURRENT_VERSION"
    fi

    # Run post-update checks
    log "Running post-update health checks"

    # Check interfaces
    if ! ssh vyos@$ROUTER_IP "show interfaces" | grep -q "eth0"; then
        log "ERROR: Interfaces not configured properly"
        send_notification "VyOS Update ISSUE" "Interfaces not configured on $ROUTER_IP after update"
    fi

    # Check routing
    if ! ssh vyos@$ROUTER_IP "show ip route" | grep -q "default"; then
        log "ERROR: Default route missing"
        send_notification "VyOS Update ISSUE" "Default route missing on $ROUTER_IP after update"
    fi

    log "Update process completed"
else
    log "No updates available"
fi

log "Update script finished"
```

### Планирование автоматических обновлений

```bash
# Настроить cron на management сервере для еженедельных обновлений
# /etc/cron.d/vyos-updates

# Обновлять каждое воскресенье в 3:00 AM
0 3 * * 0 /opt/scripts/auto-update-vyos.sh >> /var/log/vyos-auto-update.log 2>&1
```

## Полезные команды

```bash
# Просмотр версии
show version
show version brief

# Управление образами
show system image
add system image <url|latest>
delete system image <name>
rename system image <old-name> to <new-name>
set system image default-boot <name>

# Проверка обновлений
show system updates
show configuration system update-check

# Резервное копирование
save <filename>
save /config/backup-$(date +%Y%m%d).config

# Перезагрузка
reboot
reboot now
shutdown reboot +5
shutdown reboot 18:00

# Мониторинг
show system storage
show system uptime
show log | match image
df -h

# Откат
set system image default-boot <previous-version>
# через GRUB: выбрать предыдущий образ при загрузке
```

## Заключение

Правильное управление обновлениями VyOS критично для поддержания безопасности и стабильности сетевой инфраструктуры. Механизм на основе образов обеспечивает:

- Безопасное тестирование новых версий
- Быстрый откат при проблемах
- Изоляцию версий
- Сохранение конфигурации между обновлениями

**Ключевые рекомендации:**

1. **Всегда создавайте backup** перед обновлением
2. **Тестируйте обновления** в лабораторной среде
3. **Планируйте maintenance windows** для production систем
4. **Документируйте** все изменения
5. **Мониторьте систему** после обновления
6. **Имейте план отката** на случай проблем
7. **Используйте staged rollout** для больших инфраструктур
8. **Проверяйте совместимость** конфигурации с новой версией
9. **Следите за release notes** VyOS для известных проблем
10. **Автоматизируйте** процесс где возможно, но с проверками безопасности

Для production сред рекомендуется использовать LTS версии VyOS и применять обновления только после тщательного тестирования в staging environment. Rolling release версии подходят для лабораторий и сред разработки где важен доступ к последним функциям.

