Monorailcat

Nuuo NVRmini NV-4080S/Promise NS4600

icon 06/05/2017

J'ai récupéré un NVR (Network Video Recorder) Nuuo, avec 4 emplacements pour des disques SATA, et un firmware pour enregistrer le flux de 4 ou 8 caméras IP. À première vue, le hardware est assez performant, largement assez pour un NAS fonctionnant avec Linux.

Hardware
Le boitier a une carte Promise NS4600, un bloc d'alimentation et permet de mettre 4 disques SATA.

Nuuo NVRmini

  • CPU : AMCC PowerPC 431EXr at 800 MHz (SoC)
  • RAM : 256 MiB DDR2 32bit (2 NT5TU64M16GG-AC chips)
  • Flash : NAND 128MiB 3,3V 8-bit, sector size 128 KiB
  • Alim : +12V 100W

Nuuo NVRmini motherboard

Les NAS Promise NS4600 et Patriot Javelin utilisent exactement la même carte et le même boitier. Seul le firmware change.

Debug Série
La carte-mère a un port série (3.3V, 115200bits/s) accessible sur la face de la carte-mère. Mais comme c'est un connecteur JST au pas de 2mm, il y a le choix entre souder directement des fils, ou bien déformer le connecteur pour y faire rentrer des pins Dupont femelle (pas de 2.54mm).
Le pin 1 est marqué avec un pad carré, et le connecteur a le pinout suivant :
  1. RX
  2. GND
  3. TX
  4. Vdd

En branchant un convertisseur série-USB (FTDI232 ou n'importe quoi d'autre qui sort et accepte du 3.3V), et en le configurant correctement (115200, 8N1), on devrait avoir quelques caractères au boot de la machine.
Si rien n'apparait, on peut vérifier que lex pins RX et TX ne sont pas croisés (erreur fréquente), un voltmètre en AC permet de voir des pulses à l'envoi paquet de texte (et du coup d'identifier les pins RX et TX).

Software
U-boot

U-boot a été réglé pour booter le plus vite possible, du coup on ne pourra pas facilement bricoler. Par contre le timeout est réglable.
Il suffit d'appuyer sur ctrl+c le plus vite possible au boot de la machine, avant qu'elle ne charge le noyau.

Une fois avec le prompt de U-Boot, on peut bricoler :
setenv bootdelay 10
saveenv

Après un reboot, on a un peu plus de temps pour réagir.

De la même façon, on peut avoir un shell sans connaître le mot-de-passe root :
setenv ramargs setenv bootargs root=/dev/ram rw init=/bin/sh
Ici, on a rajouté init=/bin/sh à la fin de la variable ramargs, chargée au démarrage, mais la sauvegarder n'a pas d'intérêt.

Taper printenv permet de voir l'essentiel, jusqu'à la structure de la mémoire flash.

Firmware Nuuo
Pour éviter de tout casser, on va commencer par sauvegarder le firmware original.
Avec init=/bin/sh, on a facilement un shell, et on peut tenter de dumper la flash sur une clé usb.
Après l'avoir branché, il ne faut pas oublier insmod /lib/modules/usb-storage.ko, vu qu'on n'a pas chargé d'init, aucun services comme u-dev ne sont fonctionnels.

La commande tar permet d'archiver les fichiers pour une inspection par la suite (les volumes RAID et les disques ne sont pas automatiquement montés). Il faut aussi exclure /dev, /proc et le point de montage de la clé usb, pour ne pas copier de choses volumineuses et inutiles.

Le début du bootlog contient des informations plus détaillées que u-boot sur les partitions de la flash :

10 cmdlinepart partitions found on MTD device nand0
Using command line partition definition
Creating 10 MTD partitions on "nand0":
0x00000000-0x00100000 : "u-boot"
0x00100000-0x00180000 : "dtb"
0x00180000-0x00480000 : "safe-k"
0x00480000-0x00c80000 : "safe-r"
0x00c80000-0x00f80000 : "kernel"
0x00f80000-0x01780000 : "rootfs"
0x01780000-0x02780000 : "usr"
0x02780000-0x02980000 : "data"
0x02980000-0x02a80000 : "oem"
0x02a80000-0x08000000 : "app"

Comme il y a 12 devices mtd dans /dev/, on va tout dumper pour ne rien oublier :

for i in 0 1 2 3 4 5 6 7 8 9 10 11 12; do dd if=/dev/mtd$i of=/mnt/nuuo/mtd/mtd$i; done
2048+0 records in
2048+0 records out
1024+0 records in
1024+0 records out
6144+0 records in
6144+0 records out
16384+0 records in
16384+0 records out
6144+0 records in
6144+0 records out
16384+0 records in
16384+0 records out
32768+0 records in
32768+0 records out
4096+0 records in
4096+0 records out
2048+0 records in
2048+0 records out
175104+0 records in
175104+0 records out
dd: /dev/mtd10: No such device
dd: /dev/mtd11: No such device
dd: /dev/mtd12: No such device

(c'est malin, la commande range n'a pas été installée).

Si on veut modifier quelque chose, ça sera probablement les zones "rootfs" et "usr", et peut-être "data", "app" et "kernel".

La commande binwalk est assez intéressante pour donner les offsets et la taille du code contenu dans les zones de flash, par contre l'extraction ne fonctionne pas toujours bien.
La commande vbindiff permet de vérifier que les adresses sont correctes. Dans notre cas, la partition "oem" est vide, et la partition "data" commence à l'offset 0xC0000 et finit à 0xC07FF (soit 2kiB).
On peut ensuite utiliser la commande dd pour extraire les fichiers (skip pour indiquer l'offset, count pour indiquer la taille, et bs=1 pour travailler avec des blocs de 1 octet).

Nouveau firmware
Le firmware Nuuo est assez inutilisable pour faire autre chose que de l'enregistrement de videosurveillance, et un message d'erreur rend impossible l'upgrade d'un firmware en utilisant l'interface web.

Du coup, je vais suivre ce tutoriel pour installer Debian sur ce NAS : https://github.com/alexeicolin/javelin
Si ça ne fonctionne pas, un firmware Promise ou Patriot fera sûrement l'affaire.

Notes
  • Le ventilateur est contrôlé par software. Ce n'est pas critique sans disque dur et avec le boitier ouvert, mais ça peut vite devenir un problème.

icon Tags de l'article : , ,

Comments are closed

icon Flux RSS des commentaires de cet article

Comments are closed for this entry.