NanoKVM — это компактное IP-KVM устройство от Sipeed, позволяет удалённо управлять компьютером: видеть экран, управлять клавиатурой и мышью, монтировать образы дисков — всё через веб-интерфейс в браузере.

По умолчанию NanoKVM доступен только в локальной сети. В этой статье я расскажу как с помощью туннелей Tuna вы можете открыть доступ к нему через интернет — без «белого» IP, без VPN, без проброса портов на роутере, а также мониторить доступность устройства в целом при помощи мониторов Tuna.

Что сказать о NanoKVM?

Достаточно детальные обзоры уже были тут и тут, так что не будем останавливаться на этом подродно. Лучше расскажу о своих впечатлениях и ощущениях.

Система

Ранее я немного касаля работы с embeded устройствами вроде IP камер или домашних роутеров и всегда преследовала одна и таже проблема - ОЧЕНЬ МАЛО МЕСТА! Но тут всё иначе, кажется мы нанец-то дожили до времён когда ПЗУ на компактных и встраевамых устройствах не 8 или даже 4 мегабайта, а уже прямо много гигабайтов. По умолчанию с собой идёт SD карта на 32 ГБ, она поделена на 3 раздела:

# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/mmcblk0p2            7.6G    850.5M      6.4G  12% /
devtmpfs                 77.7M         0     77.7M   0% /dev
tmpfs                    79.0M         0     79.0M   0% /dev/shm
tmpfs                    79.0M     30.5M     48.5M  39% /tmp
tmpfs                    79.0M    128.0K     78.9M   0% /run
/dev/mmcblk0p1           16.0M     11.5M      4.5M  72% /boot
/dev/mmcblk0p3           21.2G     14.9M     21.2G   0% /data

Система на базе Buildroot. B надо сказать спасибо разработчикам имея большую флешку они не стали стесняться и положили с собой в BusyBox вообще всё, что надо и не надо 🫡.

Есть полный набор привычных утилит, вот некоторые немыслемые для embeded вещи:

  • ping

  • mtr

  • ss

  • nano

  • vim

  • htop

  • mosh

  • tmux

  • unrar

  • unzip

  • sqlite3

  • rsync

  • tailscale

  • frpc

  • python3 !!!

В общем никакого легаси, всё современно и удобно.

Оперативки тоже не поскупили 256 МБ, правда половина зарезервирована под мультимедийную подсистему (захват и обработка видео с HDMI), но и оставшегося более чем достаточно.

Из странного - это очень высокий LA:

средняя загрузка процессора 5-7 на 1 ядре
средняя загрузка процессора 5-7 на 1 ядре

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

в NanoKVM используется только один процессор RISC-V (C906) под управлением Linux, и его производительность невысока, поэтому даже небольшие задачи будут потреблять определенное количество ресурсов ЦП, что является нормальным явлением

В целом на стабильность работы вроде не особо влияет, может быть конечно просто отбражается не корректно, но бывает сеть подтупливает и привычный хендшейк происходит 5-7 секунд, а не 100ms.

Интерфейс

Тут даже придраться особо не к чему, простой UI без глюков и проблем. Ну разве что по F12 не открывается dev-tools в хроме что-то блокирует но я не стал разбираться. Из коробки есть русский язык, SSH, можно включить https (на самоподписных сертах), можно включить Tailscale, хотя он вроде плохо работает в России из-за блокировок wireguard.

Скриншоты

Из интересного есть в планах сделать установку tuna клиента через скрипт который загружается через UI как на скриншоте выше, чтобы вообще не ходить в консоль.

Настройка удалённого доступа

Мы тестировали данную инструкцию только на NanoKVM Cube, но вероятнее всего это будет работать на всех устройствах линейки NanoKVM.

Подготовка

Помимо установки инструкция по настройке разделена на 2 типа, в зависимости от наличия платной подписки Tuna.

  1. На бесплатном тарифе

  2. С платной подпиской

Что потребуется

  • NanoKVM, подключённый к локальной сети и доступный по SSH или терминал в веб интерфейсе

  • Аккаунт на tuna.am (бесплатный или с подпиской)

  • Токен авторизации со страницы токена

Структура хранилища NanoKVM

NanoKVM имеет три раздела:

Раздел

Точка монтирования

Назначение

Размер

/dev/mmcblk0p1

/boot

Загрузчик, ядро

16.0M

/dev/mmcblk0p2

/

Корневая ФС

7.6G

/dev/mmcblk0p3

/data

Данные, ISO-образы

21.2G

Раздел /data сохраняется при обновлениях приложения и remote rsync, поэтому мы будем хранить tuna именно там.

Установка tuna на NanoKVM

Подключитесь к NanoKVM по SSH или откройте терминал в веб интерфейсе:

ssh root@<IP-адрес-NanoKVM>
NanoKVM terminal
NanoKVM terminal

Установите tuna cli с помощью скрипта, указав /data/tuna в качестве директории установки:

mkdir -p /data/tuna
INSTALL_DIR=/data/tuna sh -c "$(curl -sSLf https://releases.tuna.am/tuna/get.sh)"

Раздел /data смонтирован как exFAT с fmask=0022, файлы автоматически получают права 0755 — бинарник можно запускать сразу после копирования. Кроме того, /data сохраняется ��ри обновлениях, поэтому tuna не придётся переустанавливать.

Сохраните токен авторизации:

/data/tuna/tuna --config=/data/tuna/.tuna.yml config save-token <ВАШ_ТОКЕН>

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


Тип 1. Бесплатный тариф — HTTP-туннель

На бесплатном тарифе доступен HTTP-туннель с динамическим адресом. Этого достаточно, чтобы открыть веб-интерфейс NanoKVM в интернет и управлять компьютером через браузер.

Ограничения бесплатного тарифа

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

  • Нельзя задать фиксированный поддомен

Создание скрипта запуска

cat << 'EOF' > /data/tuna/tuna-http.sh
#!/bin/sh

# Ждём сеть
while ! ip route | grep -q default; do
    sleep 1
done

exec /data/tuna/tuna \
    --config=/data/tuna/.tuna.yml \
    --log=/tmp/tuna-http.log \
    http \
    --inspect=false \
    --basic-auth=tuna:SecurePasswd \
    --https-redirect \
    80
EOF
chmod +x /data/tuna/tuna-http.sh

Пояснение флагов

Флаг

Описание

--inspect=false

Отключает инспектор запросов (не нужен для KVM), чтобы не расходовать RAM

--basic-auth=admin:ВашПароль

Дополнительная HTTP-авторизация (подробнее)

--https-redirect

Перенаправляет HTTP на HTTPS

80

Порт веб-интерфейса NanoKVM

Также можно ограничить доступ по IP-подсетям.

Настройка автозапуска

Добавьте строку в /etc/inittab, чтобы init автоматически запускал и перезапускал туннель:

cat << 'EOF' >> /etc/inittab

# Tuna HTTP tunnel (respawn = auto-restart)
tweb::respawn:/data/tuna/tuna-http.sh
EOF

Применить без перезагрузки:

kill -HUP 1

Проверка

Убедитесь, что процесс запущен:

ps -ef | grep tuna

В выводе должна быть строка с /data/tuna/tuna ... http .... Если процесса нет — смотрите раздел Диагностика неполадок.

В логах вы увидите URL вашего туннеля:

cat /tmp/tuna-http.log

Также текущий адрес доступен в личном кабинете.


Тип 2. Подписка — SSH и HTTP туннели

С подпиской вы получаете:

  • Фиксированный поддомен для HTTP-туннеля — адрес не меняется

  • SSH-туннель — прямой доступ к консоли NanoKVM из любой точки мира

Ну и в целом особо ограничений нет, можете ещё несколько туннелей запустить и прокинуть доступ например к web интерфейсу роутера, SSH или RDP управляемого или любого другого компьютера в локальной сети.

HTTP-туннель с фиксированным адресом

cat << 'EOF' > /data/tuna/tuna-http.sh
#!/bin/sh

# Ждём сеть
while ! ip route | grep -q default; do
    sleep 1
done

exec /data/tuna/tuna \
    --config=/data/tuna/.tuna.yml \
    --log=/tmp/tuna-http.log \
    http \
    --subdomain=nanokvm \
    --inspect=false \
    --basic-auth=admin:ВашПароль \
    --https-redirect \
    80
EOF
chmod +x /data/tuna/tuna-http.sh

Отличие от бесплатной версии — флаг --subdomain=nanokvm, который закрепляет за вами постоянный адрес. После перезапуска туннеля URL останется прежним.

Поддомен из примера уже занят. Зарезервируйте свой поддомен заранее в личном кабинете, затем используйте его в флаге --subdomain=ваш-поддомен.

Пояснение флагов HTTP-туннеля

Флаг

Описание

--subdomain=nanokvm

Фиксирует постоянный адрес туннеля (только с подпиской)

--inspect=false

Отключает инспектор трафика (не нужен для KVM), чтобы не расходовать RAM

--basic-auth=admin:ВашПароль

Дополнительная HTTP-авторизация (подробнее)

--https-redirect

Перенаправляет HTTP на HTTPS

80

Порт веб-интерфейса NanoKVM

Также можно ограничить доступ по IP-подсетям.

SSHd-туннель

SSHd-туннель позволяет подключаться к консоли NanoKVM через интернет. Это удобно для администрирования, обновления прошивки и диагностики.

cat << 'EOF' > /data/tuna/tuna-ssh.sh
#!/bin/sh

# Ждём сеть
while ! ip route | grep -q default; do
    sleep 1
done

exec /data/tuna/tuna \
    --config=/data/tuna/.tuna.yml \
    --log=/tmp/tuna-ssh.log \
    ssh \
    --port=nanokvm-ssh \
    --password-auth=false
EOF
chmod +x /data/tuna/tuna-ssh.sh

Пояснение флагов SSH-туннеля

Флаг

Описание

--port=nanokvm-ssh

Фиксирует порт SSH-туннеля. Без этого флага порт будет назначаться случайно при каждом запуске. Алиас для порта нужно зарезервировать заранее перед запуском.

--password-auth=false

Запрещает подключение по паролю — доступ только по SSH-ключам (подробнее)

Также можно задать статичный логин и пароль или ограничить доступ по IP-подсетям.

Настройка автозапуска обоих туннелей

Добавьте строки в /etc/inittab:

cat << 'EOF' >> /etc/inittab

# Tuna tunnels (respawn = auto-restart)
tssh::respawn:/data/tuna/tuna-ssh.sh
tweb::respawn:/data/tuna/tuna-http.sh
EOF

Применить без перезагрузки:

kill -HUP 1

Проверка туннелей

Убедитесь, что оба процесса запущены:

ps -ef | grep tuna

В выводе должны быть две строки — с http и ssh. Если какого-то процесса нет — смотрите раздел Диагностика неполадок.

Посмотрите логи:

cat /tmp/tuna-http.logcat /tmp/tuna-ssh.log

В логах HTTP-туннеля будет URL, а в логах SSH-туннеля — инструкция для подключения с указанием адреса и порта.

Управление туннелями

С inittab respawn процесс tuna автоматически перезапускается при падении. Для управления используйте следующие команды:

Проверка статуса

ps -ef | grep tuna

Остановка туннеля

Нельзя просто завершить процесс — init тут же его перезапустит. Сначала закомментируйте строку в /etc/inittab:

# Остановить HTTP-туннель
sed -i 's/^tweb:/#tweb:/' /etc/inittab && kill -HUP 1

# Остановить SSH-туннель
sed -i 's/^tssh:/#tssh:/' /etc/inittab && kill -HUP 1

Запуск туннеля

Раскомментируйте строку обратно:

# Запустить HTTP-туннель
sed -i 's/^#tweb:/tweb:/' /etc/inittab && kill -HUP 1

# Запустить SSH-туннель
sed -i 's/^#tssh:/tssh:/' /etc/inittab && kill -HUP 1

На этом настройка удалённого доступа закончена, всегда актуальная инструкция есть у нас в документации.


Мониторинг доступности (Heartbeat)

Для embedded устройств, критически важно отслеживать их работоспособность. Heartbeat-мониторинг позволяет получать уведомления, если устройство потеряло связь с интернетом или перестало отвечать.

Принцип работы

Устройство периодически отправляет сигнал "я жив" на сервер мониторинга Tuna. Если сигнал не приходит в ожидаемое время — вы получите уведомление через настроенные каналы (email, Telegram, Slack и др.).

Создание Heartbeat монитора

  1. Перейдите в личный кабинет → Мониторы

  2. Нажмите "Создать монитор"

  3. Выберите тип Heartbeat

  4. Задайте параметры:

    • Описание: NanoKVM availability

    • Интервал: 5 минут (на бесплатном тарифе минимальный 30 минут)

    • Grace Period: 1 минута (время ожидания перед алертом)

  5. Настройте каналы уведомлений

  6. Сохраните монитор и скопируйте MONITOR_ID

Подробнее о Heartbeat мониторах: документация.

Создание скрипта мониторинга

Создайте скрипт /data/tuna/tuna-heartbeat.sh:

cat << 'EOF' > /data/tuna/tuna-heartbeat.sh
#!/bin/sh

# Ждём сеть
while ! ip route | grep -q default; do
    sleep 1
done

# Бесконечный цикл отправки heartbeat
while true; do
    /data/tuna/tuna monitor ping --host=nanokvm YOUR_MONITOR_ID
    # Интервал между пингами (5 минут = 300 секунд)
    sleep 300
done
EOF
chmod +x /data/tuna/tuna-heartbeat.sh

Замените YOUR_MONITOR_ID на реальный ID монитора из личного кабинета.

Если вы хотите использовать curl то вместо строки:

/data/tuna/tuna monitor ping --host=nanokvm YOUR_MONITOR_ID

укажите вызов curl и ссылку из личного кабинета:

curl -sSLf -m 5 https://monitor.tuna.am/YOUR_MONITOR_ID/nanokvm

Пояснение параметров:

Параметр

Описание

YOUR_MONITOR_ID

ID монитора из личного кабинета (обязательно)

--host=nanokvm

Идентификатор устройства в логах мониторинга (опционально)

sleep 300

Интервал между сигналами в секундах (должен соответствовать настройке монитора)

Настройка автозапуска мониторинга

Добавьте строку в /etc/inittab для автоматического запуска и перезапуска мониторинга:

cat << 'EOF' >> /etc/inittab

# Tuna Heartbeat monitor (respawn = auto-restart)
thb::respawn:/data/tuna/tuna-heartbeat.sh
EOF

Применить без перезагрузки:

kill -HUP 1

Проверка работы

Убедитесь, что процесс мониторинга запущен:

ps -ef | grep heartbeat

В выводе должна быть строка с  /data/tuna/tuna-heartbeat.sh. Если процесса нет — проверьте /etc/inittab:

grep heartbeat /etc/inittab

Строка должна начинаться с thb::respawn, а не с #.

Проверьте статус монитора в личном кабинете — через 1-2 минуты статус должен измениться с New на Up.

Управление мониторингом

Остановка мониторинга:

sed -i 's/^thb:/#thb:/' /etc/inittab && kill -HUP 1

Запуск мониторинга:

sed -i 's/^#thb:/thb:/' /etc/inittab && kill -HUP 1

Почему не cron?

В NanoKVM существует проблема с cron. Crontabs не существуют по умолчанию, созданные crontabs не переживают перезагрузку.

Поэтому для периодических задач на NanoKVM рекомендуется использовать inittab с бесконечным циклом — этот подход надёжен и соответствует архитектуре системы.

Диагностика неполадок

Процесс heartbeat не запускается

Проверьте, что процесс присутствует в списке:

ps -ef | grep heartbeat

Если в выводе нет строк с /data/tuna/tuna-heartbeat.sh — убедитесь, что запись в /etc/inittab не закомментирована:

grep heartbeat /etc/inittab

Строка должна начинаться с thb::respawn, а не с #. Если она закомментирована — раскомментируйте и перечитайте конфигурацию:

kill -HUP 1

Монитор показывает "Down"

Причины:

  • Неверный MONITOR_ID

  • Отсутствует интернет-соединение

  • Интервал в скрипте не соответствует настройкам монитора

Проверка:

# Проверить наличие IP-адреса
ip addr

# Проверить маршрут по умолчанию
ip route

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

После обновления прошивки heartbeat перестал работать

  1. Проверьте, не обновлялась ли прошивка — после remote rsync нужно восстановить записи в /etc/inittab (см. Восстановление после перепрошивки)

  2. Убедитесь, что токен всё ещё действителен в личном кабинете


На этом настройка мониторинга закончена, всегда актуальная инструкция есть у нас в документации.


Итоги

Сам девайз очень приятный, рекомендую! Но лично мне нехватает serial console и встроенного прерывателя питания. Всё никак не могу найти полноценную замену aten kn1000a и если serial console приколхозить в NanoKVM ещё можно, то для управления питания нужна ещё дополнительная железка вроде  NetPing 2/PWR-220 v32/ETH.


На этом у меня всё, спасибо что дочитали до конца 🙂

Тут я хочу напомнить, что Tuna - это платформа для разработчиков и их команд, нацеленная на ускорение разработки, упрощение командного взаимодействия и безопасность.

Контакты

Если возникли вопросы, можете задать их нам по почте info@tuna.am, тут в коментариях или нашем чате в telegram.