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:

есть даже тикет по этому поводу, разработчики говорят это нормально, хотя я сомневаюсь.
в NanoKVM используется только один процессор RISC-V (C906) под управлением Linux, и его производительность невысока, поэтому даже небольшие задачи будут потреблять определенное количество ресурсов ЦП, что является нормальным явлением
В целом на стабильность работы вроде не особо влияет, может быть конечно просто отбражается не корректно, но бывает сеть подтупливает и привычный хендшейк происходит 5-7 секунд, а не 100ms.
Интерфейс

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



Из интересного есть в планах сделать установку tuna клиента через скрипт который загружается через UI как на скриншоте выше, чтобы вообще не ходить в консоль.
Настройка удалённого доступа
Мы тестировали данную инструкцию только на NanoKVM Cube, но вероятнее всего это будет работать на всех устройствах линейки NanoKVM.
Подготовка
Помимо установки инструкция по настройке разделена на 2 типа, в зависимости от наличия платной подписки Tuna.
Что потребуется
NanoKVM, подключённый к локальной сети и доступный по SSH или терминал в веб интерфейсе
Аккаунт на tuna.am (бесплатный или с подпиской)
Токен авторизации со страницы токена
Структура хранилища NanoKVM
NanoKVM имеет три раздела:
Раздел | Точка монтирования | Назначение | Размер |
|
| Загрузчик, ядро | 16.0M |
|
| Корневая ФС | 7.6G |
|
| Данные, ISO-образы | 21.2G |
Раздел /data сохраняется при обновлениях приложения и remote rsync, поэтому мы будем хранить tuna именно там.
Установка tuna на NanoKVM
Подключитесь к NanoKVM по SSH или откройте терминал в веб интерфейсе:
ssh root@<IP-адрес-NanoKVM>

Установите 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
Пояснение флагов
Флаг | Описание |
|---|---|
| Отключает инспектор запросов (не нужен для KVM), чтобы не расходовать RAM |
| Дополнительная HTTP-авторизация (подробнее) |
| Перенаправляет HTTP на HTTPS |
| Порт веб-интерфейса 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-туннеля
Флаг | Описание |
|---|---|
| Фиксирует постоянный адрес туннеля (только с подпиской) |
| Отключает инспектор трафика (не нужен для KVM), чтобы не расходовать RAM |
| Дополнительная HTTP-авторизация (подробнее) |
| Перенаправляет HTTP на HTTPS |
| Порт веб-интерфейса 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-туннеля
Флаг | Описание |
|---|---|
| Фиксирует порт SSH-туннеля. Без этого флага порт будет назначаться случайно при каждом запуске. Алиас для порта нужно зарезервировать заранее перед запуском. |
| Запрещает подключение по паролю — доступ только по 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 монитора
Перейдите в личный кабинет → Мониторы
Нажмите "Создать монитор"
Выберите тип Heartbeat
Задайте параметры:
Описание: NanoKVM availability
Интервал: 5 минут (на бесплатном тарифе минимальный 30 минут)
Grace Period: 1 минута (время ожидания перед алертом)
Настройте каналы уведомлений
Сохраните монитор и скопируйте 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
Пояснение параметров:
Параметр | Описание |
|---|---|
| ID монитора из личного кабинета (обязательно) |
| Идентификатор устройства в логах мониторинга (опционально) |
| Интервал между сигналами в секундах (должен соответствовать настройке монитора) |
Настройка автозапуска мониторинга
Добавьте строку в /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 перестал работать
Проверьте, не обновлялась ли прошивка — после remote rsync нужно восстановить записи в
/etc/inittab(см. Восстановление после перепрошивки)Убедитесь, что токен всё ещё действителен в личном кабинете
На этом настройка мониторинга закончена, всегда актуальная инструкция есть у нас в документации.
Итоги
Сам девайз очень приятный, рекомендую! Но лично мне нехватает serial console и встроенного прерывателя питания. Всё никак не могу найти полноценную замену aten kn1000a и если serial console приколхозить в NanoKVM ещё можно, то для управления питания нужна ещё дополнительная железка вроде NetPing 2/PWR-220 v32/ETH.
На этом у меня всё, спасибо что дочитали до конца 🙂
Тут я хочу напомнить, что Tuna - это платформа для разработчиков и их команд, нацеленная на ускорение разработки, упрощение командного взаимодействия и безопасность.
Контакты
Если возникли вопросы, можете задать их нам по почте info@tuna.am, тут в коментариях или нашем чате в telegram.
