Делаем домашний сервер из: старый регистратор
Сделать мини‑сервер из 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.
Как файловый сервер оно не вытягивает, слишком мало памяти, но вот в таком варианте, для хранения например архивов или бекапов — вполне.