Nuuo NVRmini NV-4080S/Promise NS4600 (3)

Date: 2025-11-16

Tags: info linux réseau serveur

Mon NAS Nuuo NVRmini1 de récupération n’est pas utilisable out of the box, je me suis dit qu’il serait intéressant d’arriver à l’utiliser, quitte à bricoler un peu.

Le firmware original n’est pas utilisable ni modifiable, il va falloir le remplacer par une distribution de Linux, avec quelques contraintes :

Installation de Debian

J’ai suivi le guide de Alexei Colin2 qui correspond au même système hardware, mais avec un firmware et un environnement différents :

On peut commencer avec le matériel suivant :

Installation du système Debian de base

On va installer un système de base Debian avec debootstrap3, avec une machine Linux, de la même façon que proposée par le guide4, avec quelques différences :

apt-get install debootstrap
mkdir nuuo-rootfs
debootstrap --arch=powerpc --foreign --keyring=/usr/share/keyrings/debian-archive-removed-keys.gpg wheezy nuuo-rootfs/ http://archive.debian.org/debian/

La dernière version de Debian disponible avec l’architecture powerpc est Jessie 8.0, mais j’ai rencontré des soucis de compatibilité avec des noyaux plus récents que le 2.6.32, alors j’ai installé Wheezy 7.0.

Comme il s’agit d’une architecture powerpc, on ne pourra pas utiliser chroot sur la machine hôte, qui est un PC avec une architecture amd64.

Pour continuer, on crée les fichiers de périphériques pour la console série, nécessaires pour la suite de l’installation :

mknod nuuo-rootfs/dev/ttyS0 c 4 64

On utilise l’init par défaut :

cp nuuo-rootfs/usr/share/sysvinit/inittab nuuo-rootfs/etc/inittab

Que l’on modifie pour utililiser la console série, en commentant les lignes concernant les consoles clavier/écran et en décommentant la lignes concernant une console série vt100, avec un baudrate configuré à 115200 bit/s : T0:2345:respawn:/sbin/getty -L ttyS0 115200 vt100.

On choisit le hostname :

echo "nuuo" > nuuo-rootfs/etc/hostname

On configure les systèmes de fichiers en éditant le fichier nuuo-root/etc/fstab

echo "LABEL=tmp / ext3 defaults 1 1" >> nuuo-rootfs/etc/fstab
echo "proc /proc proc defaults 0 0" >> nuuo-rootfs/etc/fstab

Ensuite, on ne suit pas le reste du tutoriel de Alexei Colin puisqu’on ne va pas utiliser NFS.

Spécificité de Devuan

Si le système hôte utilise Devuan au lieu de Debian, il est possible que la commande debootstrap échoue et retourne une erreur à propos de clés introuvables E: Couldn't find these debs: devuan-keyring.

Il est possible de modifier le fichier d’installation du dossier /usr/share/debootstrap/scripts/ correspondant à la distribution, pour y remplacer les clés de Devuan par celles de Debian et corriger l’erreur. On peut par exemple utiliser les regex suivantes avec vi : :%s/devuan-keyring/debian-keyring/g et :%s/devuan-archive-keyring/debian-archive-keyring/g.

Préparation de clé USB

Partitionnement

On choisit arbitrairement une partition de 200 MB en FAT, pour y stocker les images de boot, et une partition de >800MB pour le système temporaire.

Dans mon cas, la clé USB est partitionnée de façon suivante, le boot flag n’est pas nécessaire :

Device     Boot  Start      End  Sectors  Size Id Type
/dev/sdb1  *      2048   411647   409600  200M  6 FAT16
/dev/sdb2       411648 15728639 15316992  7.3G 83 Linux

Partition boot

On va formater la partition en FAT, utilisable par U-Boot, puis copier les fichiers que l’on a récupérés précédemment5 en copiant le contenu de la mémoire flash originale :

mkfs.vfat -a /dev/sdb1
mount /dev/sdb1 /mnt
cp nuuo_mtd/mtd{0,1,2,3,4,5} /mnt/
umount /mnt

Partition root

On va formater la partition en ext3, utilisable par Linux, puis copier l’installation temporaire debootstrap :

mkfs.ext3 -L tmp /dev/sdb2
mount /dev/sdb2 /mnt
cp -a nuuo-rootfs/* /mnt/
umount /mnt

Syncronisation

Il est probable de rencontrer des erreurs qui nécessitent de modifier le contenu de la clé USB, ou le système pré-installé sur le système hôte. Rsync permet de ne copier que les fichiers qui ont été modifiés.

Pour copier du système hôte vers la clé usb, on utilise la commande suivante :

rsync -av --delete-after nuuo-rootfs/ /mnt/

Et pour syncroniser de la clé USB vers le système hôte, on utilise la commande suivante :

rsync -av --delete-after /mnt/ nuuo-rootfs/

Attention à ne pas se tromper de sens, au risque d’écraser des modifications.

Premier démarrage

On connecte la console série au connecteur J16, on alimente le NAS, et on appuie sur Ctrl-C quand U-Boot le propose.

On peut connecter la clé USB sur le port USB du NAS7, et taper la commande usb start :

(Re)start USB…

USB: scanning bus for devices… 2 USB Device(s) found

scanning bus for storage devices… 1 Storage Device(s) found

On va ensuite définir les variables d’environnement de U-Boot nécessaires au démarrage, puis charger les images en mémoire et booter :

setenv bootargs root=LABEL=tmp rw console=ttyS0,115200
fatload usb 0:1 0x1200000 mtd4; fatload usb 0:1 0x1b00000 mtd5; fatload usb 0:1 0x1a00000 mtd1
bootm 1200000 1b00000 1a00000

Difficultés

Le fonctionnement est aléatoire, j’ai essayé différentes clés USB, différentes tailles/alignements de partitions et différentes options de FAT. Il est possible que ça ne soit pas assez fiable.

J’ai aussi testé les images de Patriot Javelin et une image compilée par Alexei Colin8, cette dernière a le plus de fonctionalités.

Seconde tentative

U-boot permet de récupérer des fichiers avec le protocole TFTP. J’ai déjà le serveur tdtpd-hpa installé sur ma machine avec l’adresse 192.168.3.250, à la racine /srv/tftp/.

Il reste à copier les images :

cp nuuo_mtd/mtd{0,1,2,3,4,5} /srv/tftp/
cp javelin-alexeicolin/*.img /srv/tftp/

Il peut être nécessaire de définir les variables suivantes pour pré-configurer le réseau si on n’utilise pas le protocole DHCP :

setenv ipaddr 192.168.3.181
setenv serverip 192.168.3.250
setenv bootargs root=LABEL=tmp rw console=ttyS0,115200 init=/bin/sh

On peut ensuite charger les fichiers dans la RAM du NAS et démarrer :

tftpboot 0x1200000 192.168.3.250:kernel.img; tftpboot 0x1b00000 192.168.3.250:ramdisk.img; tftpboot 0x1a00000 192.168.3.250:dtb.img
bootm 1200000 1b00000 1a00000

Si tout fonctionne correctement, la machine doit démarrer et retourner un shell root.

Suite de l’installation

On va poursuivre l’installation et choisir un mot-de-passe root :

mount -o remount,rw /
debootstrap/debootstrap --second-stage
passwd

On redémarre pour continuer l’installation avec une init normale :

setenv ipaddr 192.168.3.181
setenv serverip 192.168.3.250
setenv bootargs root=LABEL=tmp rw console=ttyS0,115200
tftpboot 0x1200000 192.168.3.250:kernel.stock.img; tftpboot 0x1b00000 192.168.3.250:ramdisk.stock.img; tftpboot 0x1a00000 192.168.3.250:dtb.img
bootm 1200000 1b00000 1a00000

On peut se logguer en tant que root, avec le mot-de-passe choisi précédemment, et commencer par régler la date :

# date 111614302025

Sun Nov 16 14:30:00 UTC 2025

La pile de l’horloge RTC semble défectueuse, on va installer ntp et la remplacer à la prochaine occasion.

Puis on va configurer le réseau :

echo "nameserver 192.168.3.1" >> /etc/resolv.conf
ifconfig eth0 192.168.3.4
route add default gw 192.168.3.1

On va rajouter les informations correspondantes dans le fichier /etc/network/interfaces, pour rendre la configuration permanente. Ensuite, on va s’assurer que les paquets net-tools ifupdown udev util-linux mtd-utils soient bien installés, et on va installer les paquets ssh screen.

SSH permet d’utiliser le réseau plutôt que la console série, le débit y est plus rapide, et screen permet d’utiliser plusieurs terminaux.

Installation sur un disque-dur

On arrête le NAS, puis on connecte la clé USB sur le système hôte, pour la monter, copier et ensuite archiver son contenu :

mount /dev/sdb2 /mnt
rsync -av --delete-after /mnt/ nuuo-rootfs/
tar cf nuuo-rootfs.tar nuuo-rootfs/
cp nuuo-rootfs.tar /mnt/
umount /mnt/

On peut ensuite reconnecter la clé USB sur le NAS, en s’assurant que le disque dur est bien branché, et ajoutant la commande scsi init en plus des commandes du démarrage précédent :

setenv ipaddr 192.168.3.181
setenv serverip 192.168.3.250
setenv bootargs root=LABEL=tmp rw console=ttyS0,115200
scsi init
tftpboot 0x1200000 192.168.3.250:kernel.img; tftpboot 0x1b00000 192.168.3.250:ramdisk.img; tftpboot 0x1a00000 192.168.3.250:dtb.img
bootm 1200000 1b00000 1a00000

On peut ensuite se logguer en tant que root et s’intéresser aux périphériques de stockage avec la commande blkid.

# blkid

/dev/sda1: LABEL=“qwerty-123” UUID=“55b5f9b0-8b69-4ae3-ba6d-e88e97298a06” TYPE=“ext4”

/dev/sda3: LABEL=“qwertz-456” UUID=“ee406156-dd46-4d0c-a867-ce8179e49ac5” TYPE=“ext4”

/dev/sdb1: SEC_TYPE=“msdos” LABEL=“BOOT” UUID=“65FB-66D9” TYPE=“vfat”

/dev/sdb2: LABEL=“sys” UUID=“70e37124-f816-4da0-b41c-09a51ea9c273” TYPE=“ext3”

On va effacer la table de partitions et le début du disque dur avec la commande suivante :

dd if=/dev/zero of=/dev/sda bs=1k count=1k

Attention à bien identifier le disque dur et à s’assurer qu’il ne contienne pas de données utiles. Cette commande est destructrice.

On va utiliser parted pour partitionner le disque dur :

parted /dev/sda --align optimal mktable gpt
parted /dev/sda --align optimal mkpart primary 0% 200MB     # boot
parted /dev/sda --align optimal mkpart primary 200MB 20GB   # sys
parted /dev/sda --align optimal mkpart primary 20GB 22GB    # swap
parted /dev/sda --align optimal mkpart primary 22GB 100%    # storage

mkfs.ext3 /dev/sda2 -L sys
mkfs.ext3 /dev/sda4 -L storage
mkswap /dev/sda3 -L swap
mkfs.vfat /dev/sda1 -L boot

Il reste à vérifier que le disque est correctement partitionné avec blkid:

# blkid |grep sda

/dev/sda1: LABEL=“boot” UUID=“9EA9-6FD2” SEC_TYPE=“msdos” TYPE=“vfat”

/dev/sda2: LABEL=“sys” UUID=“7553bf9a-f2ca-48b2-ba04-336a2d49984e” SEC_TYPE=“ext2” TYPE=“ext3”

/dev/sda3: LABEL=“swap” UUID=“30a216ca-b0fa-4ec0-901f-326c3fe0d8cb” TYPE=“swap”

/dev/sda4: LABEL=“storage” UUID=“938d68d2-c0e9-44e5-a2e6-eb0c0a9f31f3” SEC_TYPE=“ext2” TYPE=“ext3”

C’est correct, il reste à monter la partition sda2 et extraire l’archive que l’on avait préparée :

mount /dev/sda2 /mnt/
cp /nuuo-rootfs.tar /mnt/
cd /mnt; tar xf nuuo-rootfs.tar
mv /mnt/nuuo-rootfs/* /mnt/
rm /mnt/nuuo-rootfs* -r

Il reste à configurer une subtilité : le fichier /mnt/etc/fstab :

LABEL=sys / ext3 defaults 1 1

LABEL=boot /boot vfat defaults 1 2

LABEL=swap none swap sw 0 0

LABEL=storage /media/stuff ext3 defaults 1 2

proc /proc proc defaults 0 0

Et on peut redémarrer le système et débrancher la clé USB en adaptant le nom de partition racine :

setenv bootargs root=LABEL=sys rw console=ttyS0,115200
setenv ipaddr 192.168.3.181
setenv serverip 192.168.3.250
scsi init
tftpboot 0x1200000 192.168.3.250:kernel.img; tftpboot 0x1b00000 192.168.3.250:ramdisk.img; tftpboot 0x1a00000 192.168.3.250:dtb.img
bootm 1200000 1b00000 1a00000

On peut se logguer en tant que root et vérifier que la machine fonctionne.

Configuration de U-Boot

Maintenant, on va configurer U-Boot pour se passer de serveur TFTP et de clé USB.

setenv bootargs root=LABEL=sys mtdparts=nand0:1024K(u-boot),512K(dtb),3072K(safe-k),8192K(safe-r),3072K(kernel),8192K(rootfs),16384K(usr),2048K(data),1024K(oem),87552K(app) console=ttyS0,115200

setenv newnandboot "run bootargs; scsi init; nand read.e 1200000 kernel 300000; nand read.e 1b00000 rootfs 800000; nand read.e 1a00000 dtb 3000; bootm 1200000 1b00000 1a00000"

setenv newscsiboot "run bootargs; scsi init; fatload scsi 0:1 0x1200000 kernel.img; fatload scsi 0:1 0x1b00000 ramdisk.img; fatload scsi 0:1 0x1a00000 dtb.img; bootm 1200000 1b00000 1a00000"

setenv bootcmd run newnandboot
saveenv

On a défini la commande newnandboot qui va initialiser les disques durs, puis charger les images de noyau et de ramdisk dans la mémoire flash, et on a défini cette commande par défaut. Et on sauvegarde la configuration de U-Boot.

Maintenant, on va démarrer une dernière fois avec TFTP :

setenv ipaddr 192.168.3.181
setenv serverip 192.168.3.250
scsi init
tftpboot 0x1200000 192.168.3.250:kernel.img; tftpboot 0x1b00000 192.168.3.250:ramdisk.img; tftpboot 0x1a00000 192.168.3.250:dtb.img
bootm 1200000 1b00000 1a00000

On va se logguer en tant que root, et on va copier les images de Alexei Colin9 que l’on avait copiées sur la clé USB :

mount /dev/sdb1 /mnt
cp /mnt/{kernel, ramdisk}.img /root/

Puis on va les écrire dans la mémoire flash. Attention, il faut s’assurer de ne rien écraser et d’écrire dans la bonne section.

nandwrite -p -m /dev/mtd4 /root/kernel.img
nandwrite -p -m /dev/mtd5 /root/ramdisk.img

Les redémarrages suivants fontionnent automatiquement, en tapant simplement la commande boot, sans qu’une clé USB ni qu’une connexion réseau ne soit nécessaire.

Alternative

Comme la mémoire flash n’est pas réputée fiable et n’est pas aussi facile à modifier qu’une partition de disque dur, on a crée une partition /boot formatée en FAT, et on a défini la commande newscsiboot précédent, qui charge les images depuis le disque dur.

Il suffit de copier les fichiers kernel.img, ramdisk.img et dtb.img dans /boot/, et de taper les deux commandes U-Boot :

setenv bootcmd run newscsiboot
saveenv

Suite de l’installation

Le NAS Nuuo est utilisable comme n’importe quel NAS ou serveur. Il peut-être utile de regarder l’article précédent10 pour corriger les problèmes de U-Boot.

Il est possible de suivre les articles suivants pour ajouter des fonctionalités :

Comme la distribution Debian Wheezy est ancienne et n’a plus de mises-à-jour de sécurité, il est recommandé de ne pas trop l’exposer à internet. L’utilisation de chroot avec des programmes plus récents et cloisonnés peut convenir.

Références

J’ai aussi lu ces autres guides. Ils ne sont pas applicables directement à mon cas, mais ils confirment des informations utiles :


  1. Nuuo NVRmini NV-4080S/Promise NS4600 - Monorailc.at↩︎

  2. Alexei Colin↩︎

  3. D.3. Installing Debian GNU/Linux from a Unix/Linux System - Debian↩︎

  4. Alexei Colin↩︎

  5. Nuuo NVRmini NV-4080S/Promise NS4600 - Monorailc.at↩︎

  6. Nuuo NVRmini NV-4080S/Promise NS4600 - Monorailc.at↩︎

  7. Seules les clés USB connectées au port le plus éloigné de la carte-mère sont détectées par U-Boot↩︎

  8. Alexei Colin - Proton Drive↩︎

  9. Alexei Colin - Proton Drive↩︎

  10. Nuuo NVRmini NV-4080S/Promise NS4600 (2) - Monorailc.at↩︎

Electronics Électronique puissance semiconducteur semiconductors power Hardware CPE INSA Xavier Bourgeois

Xavier