Сделать мини‑сервер из TV‑бокса можно, но вот проблема: встроенная память там никакая, всего‑то 8 гигабайт.
Можно, конечно, воткнуть в него SD‑карту.
Можно подключить USB‑диск, хоть механику, хоть SSD через адаптер.

А можно подключить диск через ISCSI: в ОС появляется устройство, которое может быть смонтировано как раздел файловой системы, точно так же как если бы это был обычный диск.

При этом внешне к «коробке‑серверу» ничего не подключено, все работает через сеть. Никаких дополнительных соплей ниоткуда не висит, только маленькая черная коробочка, сеть и питание.

В случае какого‑то форс‑мажора, связанного с уничтожением самого сервера (вандализм, пожар, кража) вся информация останется на физическом диске где была, в каком‑то другом месте. Для эстетов — можно сделать и так, что кража диска тоже ничего не даст, если диск зашифрован.

Единственный минус — скорость чтения/записи ограничена.

Но для того, чтобы подключить диск по ISCSI — нужен девайс, в котором есть сам диск. Можно использовать обычный компьютер или ноутбук — но это неинтересно, все так делают.
Компьютер будет шуметь, ноутбук будет лежать, занимать место и греться...
А можно приспособить для этого старый, ненужный видеорегистратор.

Ну, так получилось: камер стало больше, регистратор начал подтормаживать, потребовались ежедневные перезагрузки, чтобы избавиться от подвисаний — в общем, пришлось поменять на новый.

А старый приспособить к делу: там как раз есть диск, есть сеть, он маленький и не шумит — то, что надо.

Первым делом потребовалось найти и подключить serial port — опять ищем на плате 3–4 гнезда под гребенку, проверяем осциллографом — оно.
Снова стандартная загрузка: SPL, U‑Boot, kernel...
Процессор Hisilicon HI3536DV100, ОЗУ 155 Мб, «диск» всего 16 Мб, всё пожато в cramfs

Тормозим перезагрузку Ctrl‑C, попадаем в U‑Boot:

hisilicon# printenv

bootcmd=sf probe 0;sf read 0x84000000 0xf60000 0x20000;logoload 0x84000000;decjpg;sf read 0x82000000 0x50000 0x500000;squashfsload 82000000;bootm 0x81000000
bootdelay=1
baudrate=115200
bootfile="uImage"
restore=1
da=mw.b 0x82000000 ff 1000000;tftp 0x82000000 u-boot.bin.img;sf probe 0;flwrite
du=mw.b 0x82000000 ff 1000000;tftp 0x82000000 user-x.cramfs.img;sf probe 0;flwrite
dr=mw.b 0x82000000 ff 1000000;tftp 0x82000000 romfs-x.cramfs.img;sf probe 0;flwrite
dw=mw.b 0x82000000 ff 1000000;tftp 0x82000000 web-x.cramfs.img;sf probe 0;flwrite
dl=mw.b 0x82000000 ff 1000000;tftp 0x82000000 logo-x.cramfs.img;sf probe 0;flwrite
dc=mw.b 0x82000000 ff 1000000;tftp 0x82000000 custom-x.cramfs.img;sf probe 0;flwrite
up=mw.b 0x82000000 ff 1000000;tftp 0x82000000 update.img;sf probe 0;flwrite
tk=mw.b 0x82000000 ff 1000000;tftp 0x82000000 zImage.img; bootm 0x82000000
dd=mw.b 0x82000000 ff 1000000;tftp 0x82000000 mtd-x.jffs2.img;sf probe 0;flwrite
ipaddr=192.168.1.10
serverip=192.168.1.1
netmask=255.255.255.0
gatewayip=192.168.0.1
ethaddr=00:0b:3f:00:00:01
appSystemLanguage=English
appVideoStandard=PAL
loadlogo=sf probe 0;sf read 0x84000000 0xF60000 0x20000;logoload 0x84000000;decjpg
bootargs=mem=155M console=ttyAMA0,115200 root=/dev/mtdblock1 rootfstype=squashfs mtdparts=hi_sfc:320K(boot),3968K(romfs),7040K(usr),1600K(web),2816K(custom),128K(logo),512K(
mtd) coherent_pool=2M
appRunningOut3Days=Dm8Hxy71
appCloudExAbility=P28fo3zPHeM=
jpeg_addr=0x8dc00000
jpeg_size=0xb85f9
vobuf=0x8dd00000
stdin=serial
stdout=serial
stderr=serial
verify=n
ver=U-Boot 2010.06-svn1560 (May 06 2021 - 19:15:51)

Environment size: 1595/65532 bytes

К счастью, тут работает чтение-запись с внешней USB-флешки.
Считываем в память "разделы" (mtdparts) и сохраняем:

sf probe 0;
sf read 0x82000000 0x50000 0x500000
fatwrite usb 0 0x82000000 0x500000 romfs.sqfs
...

Дальше разбираем на компьюютере что получилось:

unsquashfs romfs.sqfs
cd squashfs-root
ls

Там Линукс, busybox вместо стандартных утилит, при запуске выполняется файл /etc/init.d/rcS

#!/bin/sh

/etc/init.d/dnode

mkdir -p /dev/.udev
udevd --daemon
udevadm trigger
EnvPartCheck&
sleep 3
mount -t squashfs /dev/mtdblock2 /usr
mount -t squashfs /dev/mtdblock3 /mnt/web
mount -t squashfs /dev/mtdblock4 /mnt/custom
mount -t cramfs /dev/mtdblock5 /mnt/logo
mount -t jffs2 /dev/mtdblock6 /mnt/mtd
if [ $? -ne 0 ];then
 echo "Clean up the old data in the 'mtd' partition."
 /sbin/flash_eraseall -j -q /dev/mtd6
 mount -t jffs2 /dev/mtdblock6 /mnt/mtd
fi

mount -t ramfs  /dev/mem        /var
#mount -t usbfs none /proc/bus/usb/

mkdir -p /mnt/mtd/Config /mnt/mtd/Log /mnt/mtd/Config/ppp /mnt/mtd/Config/Json

....
....

unrar x /usr/bin/Sofia.rar /var/
cp /usr/bin/Sofia.tar.lzma /var/
cd /var/
tar -axf /usr/bin/Sofia.tar.lzma

chmod 777 /var/Sofia
rm /var/Sofia.tar.lzma -fr
dvrHelper /lib/modules /usr/sbin/SofiaRun.sh 127.0.0.1 9578 1

Как видим, в конце инициализации всего распаковывается и запускается собственно софт регистратора - dvrHelper и Sofia.
Проверяем, что будет если закомментировать и вызвать /etc/sh:

Сохраняем скрипт, упаковываем:
mksquashfs . ../romfs_new -comp xz

Сохраняем на флешку, снова перезапуск регистратора, вход в U-Boot:

fatread usb 0 0x82000000 romfs_new
sf probe 0;sf lock 0;
sf write 0x82000000 0x50000 0x500000

Перезапуск - ошибка. Что не так? Надо было сначала очистить флеш-память!

fatread usb 0 0x82000000 romfs_new
sf probe 0;sf lock 0;
sf erase 0x50000 0x500000
sf write 0x82000000 0x50000 0x500000

Перезапуск - загрузка - попадаем в шелл регистратора.
Спецсофт не загрузился, на экране монитора висит заставка, но вот он шелл, есть сеть, виден диск /dev/sda

Теперь надо установить софт для iscsi-сервера. Ставим tgt: https://github.com/fujita/tgt
Собираем под архитектуру arm, статически, чтобы избежать лишних зависимостей:

make CROSS_COMPILE=arm-linux-gnueabi- LDFLAGS=-static

Получили файлы tgtadm, tgtd, tgtimg.
Пишем скрипт запуска:

#!/bin/sh

mkdir -p /var/run/tgtd

tgtd &
sleep 3

tgtadm --lld iscsi --op new --mode target --tid 1 -T iqn.2001-04.nvr:d1

if [ -b /dev/sda ] ; then
tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /dev/sda
fi
if [ -b /dev/sdb ] ; then
tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 2 -b /dev/sdb
fi
if [ -b /dev/sdc ] ; then
tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 3 -b /dev/sdc
fi

tgtadm --lld iscsi --op bind --mode target --tid 1 -I ALL

Проверяется наличие дисков sda, sdb, sdc (допустим, флешек или USB‑дисков) и настраиваются LUN.

Остается всё это внедрить в romfs, запустить этот скрипт в конце скрипта /etc/init.d/rsS.
Снова запись на внутреннюю флеш‑память регистратор, перезапуск — готово, оно работает
Можно на компьютере подключить этот диск:

iscsiadm ‑m discovery ‑t st ‑p 192.168.1.X
iscsiadm ‑m node
iscsiadm ‑m node ‑l ‑T iqn.2001–04.nvr:d1

Смотрим, что получилось:
ls /dev/sd*

Должно появиться устройство, соответствующее диску (дискам): /dev/sdc, /dev/sdc1, /dev/sdd,...

И всё бы работало хорошо, но выяснилась интересная особенность: оказывается, штатный загрузчик при запуске взводит таймер watchdog, и если софт регистратора не работает (а он не работает, чтобы не занимал память) то через 30 минут система перезагружается.
Кстати, для примонтированных дисков ничего особо страшного не происходит, они просто переводятся в read‑only, и их можно просто перемонтировать, но это не хорошо.

Поэтому пришлось поискать решение: можно установить прошивку от OpenIPC.
К счастью, она нашлась, именно для этого процессора.

По сути повторяем примерно то же самое, только теперь нужно переписать все 16 Мб флеша:

fatread usb 0 0x82000000 openipc-hi3536dv100-fpv-16mb.bin
sf probe 0;sf lock 0;
sf erase 0x0 0x1000000
sf write 0x82000000 0x0 0x1000000

После перезапуска попадаем на логин: root — 12 345 
Необходимо установить свой пароль.

Система загружается с оверлеем, позволяющем сохранять пару мегабайт пользовательских данных — убираем из скриптов запуска лишнее, добавляем уже собранные ранее tgt со своим скриптом, и после перезапуска снова всё работает, теперь без перезагрузок.
К тому же — с ssh‑доступом.

И разумеется, если есть желание, можно повторить уже ранее сделанное — считывать отдельные разделы и переделывать их как вздумается, чтобы исключить возможные нежелательные вставки. По сути нужен был только U‑Boot без запуска watchdog.

Как файловый сервер оно не вытягивает, слишком мало памяти, но вот в таком варианте, для хранения например архивов или бекапов — вполне.

Комментарии (14)


  1. celladon
    16.12.2024 14:42

    Хорошо бы внутренности показали. Без этого статья выглядит не законченной.


    1. JBFW Автор
      16.12.2024 14:42

      давно было дело - хороших фото не было сделано, а теперь эта штука стоит в достаточно труднодоступном месте...

      Например, serial port тут как за не виден за красным шлейфом, слева вверху...


  1. Formyurik
    16.12.2024 14:42

    Сделать мини‑сервер из TV‑бокса можно, но вот проблема: встроенная память там никакая, всего‑то 8 гигабайт.

    Откуда Вы взяли такой бред? Вы серьезно думаете что бывает всего одна TV-приставка?

    Посмотрите например приствку H96 Max X3 или Vontar X3. Там есть версии с 4 гигами оперативки и 128 гигабайтами EMMC.

    Прекрасно ставится Armbian (как на основе Debian так и на основе Ubuntu). Отлично работает как файловый сервер, сервер телефонии Asterisk, сервер Home Assistant и даже как контроллер домена.


    1. Rubilnik
      16.12.2024 14:42

      Автор просто использует то, что есть у него в наличии, а не рассуждает о всех возможных китайских приставках)


    1. JBFW Автор
      16.12.2024 14:42

      Там ссылка на конкретный девайс у которого 1/8 Гб (1 RAM 8 MMC).
      А так-то у меня и 8/128Гб есть в хозяйстве, но про них я здесь ничего не пишу.


    1. haga777
      16.12.2024 14:42

      А про кд можно подробнее?


      1. Formyurik
        16.12.2024 14:42

        https://adminguide.ru/2020/05/10/controller-domena-ubuntu-20-04-ad-dc/

        Один из примеров. Статей куча в интернете.


  1. Kononvaler
    16.12.2024 14:42

    А просто по nfs раздать?


    1. JBFW Автор
      16.12.2024 14:42

      тут цель была не в том чтобы файлопомойку прикрутить, а в том чтобы примонтировать диск, условно говоря, /dev/sdc - блочное устройство.

      Есть некоторые различия потом в работе с ними...


      1. Kononvaler
        16.12.2024 14:42

        всё есть файл )) есть разница в скорости по сети в том и этом варианте?


        1. YDR
          16.12.2024 14:42

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


        1. JBFW Автор
          16.12.2024 14:42

          есть сомнения в способности старого регистратора со 155Мб ОЗУ обслуживать шару.

          Ну и про шифрование упоминал...


  1. safari2012
    16.12.2024 14:42

    но это неинтересно, все так делают.

    вот вам концепт для творческой фантазии:

    1. под крышкой стола, обоями, ламинатом прячем смарткарту с NFC

    2. в дно, стенку системного блока прячем/замуровываем беспроводной считыватель, чтоб незаметно было

    3. диски шифруем

    4. любое перемещение системного блока = логин по принуждению, в системе монтируется раздел с котиками...


    1. JBFW Автор
      16.12.2024 14:42

      ну тут пространство замыслов широкое - шифрованные диски по файл-ключу, хранящемуся в памяти ESP8266, упрятанной в распаечную коробку, считыватель + б/у метрошные карточки (смарткарты Mifare) и т.д.