Делаем домашний сервер из: старый регистратор

от автора

Сделать мини‑сервер из 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.

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


ссылка на оригинал статьи https://habr.com/ru/articles/866988/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *