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.
- 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
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 :
- RX
- GND
- TX
- 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.
Tags de l'article : info, linux, réseau
Le serveur précédent commence à avoir des performances limitées (il date quand même de 2000), et j'ai pu récupérer un HP Compaq DC5800 de 2009 en bon état.
Hardware
La machine a un processeur Intel Pentium E5200 (2-Core, 2.5GHz, LGA775) et deux barrettes de 1Gio de DDR2 (avec deux slots libres), mais le disque dur et le lecteur optique/disquette manquent ou sont hors-service.
On commence par tout vérifier, nettoyer, puis remettre en état tout ce qui en a besoin :
- Memtest avec la mémoire,
- Flash du dernier BIOS à jour,
- Nettoyage des ventilateurs/radiateurs,
- Remplacement de la pâte thermique du processeur,
Face avant
Le lecteur de disquette est manquant et le lecteur optique ne fonctionne pas, du coup je les ai enlevés. Sauf que le refroidissement de la machine est fait de telle sorte que l'air doit être aspiré par le côté avant droit, et soufflé par le côté arrière gauche. Quand le boitier est ouvert ou que la face avant manque, le disque dur est mal refroidi, mais il est possible de découper une plaque de plexiglass pour remplacer les caches d'origine.
Disque dur
Le disque dur était manquant quand j'ai récupéré la machine, mais les vis, clips et bushings manquaient aussi, ce qu'il a fallu adapter.
J'ai pris des vis 6-32 "long sleeve" d'un rack à disques de serveur IBM et des bushings de lecteur CD. L'ensemble rentre dans l'emplacement d'origine et se clipse fermement (pas de vibration).
Software
Mot-de-passe BIOS
Les machines d'entreprises ont souvent des BIOS différents de ceux des PCs habituels. Ici, le mot-de-passe protégeant BIOS est stocké dans une mémoire EEPROM au lieu d'être dans une SRAM. Dans ce cas, enlever la pile quelques secondes n'affecte que l'horloge RTC.
- Débrancher le secteur,
- Ouvrir le capot,
- Attendre que les LEDs de la carte-mère soient éteintes,
- Enlever le cavalier vert PSWD (à côté des ports SATA),
- Brancher le secteur et démarrer la machine,
- Débrancher le secteur et attendre que les LEDs soient éteintes,
- Remettre le cavalier PSWD,
- Refermer le capot et rebrancher le secteur.
Boot-Menu
Certaines options du BIOS concernant la "sécurité" sont grisées et indisponibles. Ainsi, on ne peut booter que sur le disque SATA HDD0, alors qu'un lecteur optique, USB ou la ROM PXE (réseau) sont disponibles.
Pour cela, il est nécessaire de "protéger" l'accès au BIOS par un mot-de-passe. Le "boot menu" est aussi affecté, et permet de booter sans problème sur un serveur PXE quand un mot-de-passe est entré.
Debian Linux
Je me suis contenté d'échanger le disque dur de l'ancien serveur au nouveau, quasiment sans toucher l'installation de Debian Jessie (8.4) i386.
L'unique bricolage concerne udev et sa façon de détecter les cartes réseau par leur adresses MAC. Si l'on ne change rien, le réseau ne fonctionnera pas et sera à reconfigurer (peu pratique pour un serveur sans écran ni clavier).
Il faut commencer par trouver l'adresse MAC de la carte réseau avec l'ancien serveur en fonctionnement :
# ifconfig |grep HWaddr
eth0 Link encap:Ethernet HWaddr 00:d0:b7:xx:xx:xx
eth1 Link encap:Ethernet HWaddr 00:1e:2a:xx:xx:xx
Ici, c'est l'adresse de eth0 qui nous intéresse, mais la configuration de udev est séparée en plusieurs fichiers de configuration que l'on va chercher :
# grep -rni '00:d0:b7:xx:xx:xx' /etc/
/etc/udev/rules.d/70-persistent-net.rules:8:SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:d0:b7:xx:xx:xx", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
La recherche peut renvoyer plusieurs fichiers (DHCP, ARP, scripts d'init bricolés), mais c'est ceux qui concernent udev qui nous intéressent et que l'on va éditer :
# PCI device 0x8086:0x1229 (e100)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:d0:b7:xx:xx:xx", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
# PCI device 0x10ec:0x8169 (r8169)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:1e:2a:xx:xx:xx", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
Dans tous les cas, il faudra supprimer l'association entre chaque carte et son adresse MAC, les cartes réseau suivantes seront ajoutées à la suite (la première carte réseau sera eth2 si l'on ne touche à rien).
Pour être sûr que le réseau fonctionne du premier coup, on va remplacer l'adresse MAC de l'interface eth0 par celle de la nouvelle carte réseau (affichée à l'écran pendant une tentative de boot par PXE).
Performances
Test |
HP Compaq dc5800 (new) |
IBM PC-300GL 6288 (old) |
nbench Mem |
18.583 |
2.649 |
nbench Int |
17.233 |
2.793 |
nbench Float |
32.444 |
4.942 |
Transfert NFS |
11.20 Mio/s |
11.18 Mio/s |
Transfert SaMBa |
11.21 Mio/s |
11.00 Mio/s |
Transfert SSH |
11.2 Mio/s |
4.05 Mio/s |
Génération PHP/Blogotext |
7.6 ms |
61.9 ms |
Compression gzip |
15.43 Mio/s |
1.31 Mio/s |
Décompression gzip |
112.48 Mio/s |
10,65 Mio/s |
Compression bzip2 |
3.28 Mio/s |
0.32 Mio/s |
Déompression bzip2 |
7.18 Mio/s |
1.19 Mio/s |
Débit disque dur |
185.81 Mo/s |
40.33 Mo/s |
Débit ethernet |
94.4 Mbit/s |
94.6 Mbit/s |
La plupart des débits sont limités à 100Mbit/s par le switch. Mais il faut aussi voir que les tests ont été faits avec des gros fichiers (247Mio).
La différence la plus visible vient du processeur et du contrôleur SATA, la lenteur de l'ancien serveur posait surtout des problèmes en multitâches ou en transférant de nombreux petits fichiers (sauvegardes).
Références
Tags de l'article : info, linux, réseau, serveur
Mon routeur (WRT54G) et point d'accès wifi avait quelques problèmes de fiabilité (freezes, coupures de réseau...), j'ai essayé de voir si on pouvait trouver un remplaçant vallable.
Le Nexx WT3020 est une Chinoiserie avec deux interfaces ethernet, une interface wifi, un port usb host et un SoC compatible avec OpenWRT.
Software
Le firmware d'origine à l'air utilisable avec un noyau Linux contrôlable par telnet et une interface web en Anglais (ou en Chinois).
- Adresse IP : 192.168.8.1
- Login (http) : admin
- Mot de passe (http) : admin
- Login (telnet) : nexxadmin
- Mot de passe (telnet) : y1n2inc.com0755
On peut changer le firmware directement depuis l'interface web ou bien par telnet.
OpenWRT
Il faut d'abord connaître la quantité de mémoire flash embarquée. Comme la puce est difficile à lire, il semble que les modèles dont l'adresse MAC commence par 20:28:18 ont 8Mio de flash.
On peut ensuite télécharger l'image d'OpenWRT adaptée au routeur et utiliser l'interface web d'origine pour flasher le firmware.
Au reboot, l'adresse IP change et devient 192.168.1.1, et une fois un mot de passe choisi, on peut utiliser ssh.
Hardware
En ouvrant le boitier (quasiment impossible sans casser de clip), on voir un SoC Mediatek MT7620N, une mémoire flash SPI (8Mio), deux transformateurs d'impulsion (ethernet), de la SDRAM (64Mio), et quelques régulateurs de tension.
On voit directement que la capacité d'entrée est trop faible (400 à 900mV de ripple mesurés, en fonction de la charge). Par contre le ripple est faible après le régulateur LDO qui alimente le SoC.
J'ai préféré rajouter une capacité chimique de 220µF (16V, ESR <1Ω), ce qui limite le ripple à <20mV.
Les pads qui sont accessibles entre les deux ports ethernet et le SoC servent pour une liaison série, utile pour avoir un accès direct à u-boot en cas de problème.
Par contre il n'y a pas de JTAG, du coup en cas de brickage, il faudra dessouder la mémoire flash (SPI) pour la re-flasher.
Performances
J'ai essayé de mesurer la vitesse de transfert en copiant des fichiers par NFS et en utilisant le benchmark réseau iperf :
- Routeur -> PC : 24.9Mbit/s
- PC -> Routeur : 22.6Mbit/s
En vérifiant, le routeur fonctionne en mode 802.11g, et est théoriquement limité à 54Mbit/s (~30 en pratique). Il y a peut-être une configuration spécifique pour OpenWRT (le hardware est censé supporter la norme 802.11n à 300Mbit/s et le MIMO).
802.11n (update 06.2016)
Avec un peu de recherches, on voit que le mode 802.11n, qui suppose une bande passante de 300Mbit/s ne peut être actif que si le mode WMM (Wi-Fi Multimedia) est activé et si les données sont encryptées en WPA (j'utilisais le mode WEP depuis mon premier routeur).
Avec quelques tests :
- Routeur -> PC : 70.8Mbit/s
- PC -> Routeur : 21.6Mbit/s
On a aucune différence en upload, mais le débit en download devient intéressant.
Références
Tags de l'article : chinoiserie, hardware, info, linux, réseau
J'ai récupéré deux points d'accès D-Link DWL-G700AP hors-service, chacun de révision B3, le premier fabriqué au milieu de l'année 2006 et le 2nd au milieu de l'année 2007.
Point d'accès #1
Au branchement, il ne démarre pas et aucune LED n'est allumée.
En l'ouvrant, la tension est à 0V en sortie des selfs de choke de l'entrée d'alimentation (fonctionnelle). L'Ohm-mètre affiche un court-circuit sur le rail 3.3V (sortie du régulateur qui alimente quasiment toute la carte).
Quelques capacités sont gonflées, mais aucune n'est en court-circuit.
Point d'accès #2
Au branchement, seulement la LED D1 (Power) est allumée, mais aucune réponse par le réseau ou par le port série.
En mesurant un peu de partout, la sortie du régulateur U9 (GS1117AX-18) donne 0.95V à la place des 1.8V attendus.
Le simple échange de régulateur entre les deux points d'accès à suffit à en rendre un fonctionnel.
Notes :
- Le régulateur U9 chauffe beaucoup et a une surface de dissipation trop petite...
- Il est possible d'alimenter le routeur avec n'importe quelle tension entre 5V et 16V (tension limite des capacités, le régulateur Buck supporte au moins 20V).
Port série
Le connecteur J2 est cablé directement sur le SoC RTL8186 (signaux 3.3V) :
- 3.3V
- GND
- CTS*
- RTS*
- TX
- RX
*Non-testé et non-indispensable
La connection est en 38400, 8N1 et donne un accès au bootlog de Linux et à un shell busybox.
Flash
En cas de flash du mauvais firmware, le point d'accès à un bootblock qui permet de reflasher "facilement" le point d'accès.
- Débrancher l'alimentation
- Tenir le bouton RESET appuyé
- Brancher l'alimentation
- Lâcher le bouton RESET après 5s
- Brancher un PC en ethernet avec l'adresse 192.168.1.xx (différente de 192.168.1.6)
- uploader le firmware par tftp :
tftp 192.168.1.6
tftp> binary
tftp> put DWLG700AP_FW231b02.bin
Sent 1025832 bytes in 2.6 seconds
tftp>
Firmwares Wive et Wive-NG
Ces deux firmware alternatifs sont disponibles et permettent plus de choses que le firmware D-Link de base (qui n'a pas les commandes ls, vi, mount ou ping...).
Par contre les firmwares Wive sont un peu buggés (un des firmware détecte aléatoirement 8 ou 16Mio de RAM et plante dès qu'on utilise une zone de mémoire inexistante), très mal documentés et il y a quelques instabilités qui freezent la machine ou la redémarrent.
Firmware Realtek/D-Link Custom
Le firmware et une partie de la toolchain RTL8186 sont fournie sur le site de D-Link, et il est possible d'y modifier pas mal de choses.
Il faut juste éviter de bricker la machine en cassant le bootloader.
ÉCHEC
JTAG
Comme j'ai brické le point d'accès en cassant le bootloader, j'ai essayé de le reflasher en utilisant le bus JTAG (12 pins),
- nTRST (NC)
- GND
- TDI (D0)
- GND
- TDO (!Select)
- GND
- TMS (D2)
- GND
- TCK (D1)
- GND
- nSRST (NC)
- GND
Je n'ai pas de programmateur JTAG générique, du coup j'ai copié un programmateur Xilinx DLC5 sur port parallèle (adresse 0x378 sur ma machine), en le réglant à 250kHz (mais ça ne fonctionne pas, peu importe la fréquence).
jtag> cable DLC5 parallel 0x378
Initializing parallel port at 0x378
jtag> frequency 250000
Setting TCK frequency to 250000 Hz
requested frequency 250000, now calibrating delay loop
new real frequency 241253, delay 0
done
jtag> detect
Warning: TDO seems to be stuck at 1
ÉCHEC
Références
Tags de l'article : hardware, info, linux, reverse engineering
Premier boot
Au premier boot, Alphabios chargeait le noyau d'une redhat, mais le système de fichiers est abimé et plusieurs périphériques ne sont pas détectés. J'ai décidé d'utiliser SRM et d'installer une redhat sur un autre disque dur.
Activation de SRM
La procédure pour passer d'AlphaBIOS à SRM n'est pas forcément évidente :
- Appuyer sur F2 au démarrage de la machine (chargement d'AlphaBIOS)
- Choisir CMOS Setup
- Choisir Advanced CMOS Setup avec F6
- Changer Console Selection d'AlphaBIOS à OpenVMS Console (SRM)
- Sauvegarder avec F10
- Redémarrer en coupant l'alimentation
Il est aussi possible de repasser de SRM à AlphaBIOS en tapant au prompt de SRM :
set os_type NT
Boot sur CD
La première étape est de trouver le nom du lecteur cdrom avec la commande show device
>>> show device
dka0.0.0.15.0 DKA0 RZ1CF-BF 1614
dqb0.0.1.13.0 DQB0 COMPAQ CDR-8435 0013
dva0.0.0.0.0 DVA0
ewa0.0.0.9.0 EWA0 08-00-2B-86-26-5B
pka0.7.0.15.0 PKA0 SCSI Bus ID 7 5.57
Ici, la première lettre correspond au type de périphérique : disque, ethernet, ..., la seconde correspond au périphérique (SCSI, IDE, floppy), la troisième au canal/contrôleur, et la dernière à l'ID du périphérique.
Ainsi dqb0 est un disque sur le 2nd canal IDE. D'après son nom, on remarque que c'est un lecteur de CD.
SRM interprète les systèmes de fichiers (à travers aboot), par conséquence, il faut aussi connaître le chemin des fichiers à charger : le noyau et l'initrd (si-nécessaire).
On peut booter RedHat 6.2 avec la commande suivante :
boot dqb0 -file /kernels/generic.gz -flags "initrd=/images/ramdisk.img root=/dev/hdc"
Ou bien pour Debian Woody :
boot dqb0 -file /boot/linux -flags "root=/dev/hdc"
Partitionnement du disque
Le disque est partitionné en utilisant le disklabel d'UNIX plutôt que le MBR de DOS.
Par défaut, la slice c représente le disque entier. On va ajouter trois autres partitions :
- a : 2Gio, système de fichiers /
- b : 512Mio, swap
- c : 18.4Gio, disque complet
- d : 15+Gio, /home
Il reste à indiquer le type de chaque slice, à activer le flag de boot sur la slice a, et les formater (sauf c, évidemment).
Il faut aussi faire attention à ne pas faire commencer la première slice sur le premier secteur du disque, à priori pour laisser de la place au bootloader.
À partir de cette étape, RedHat s'installe comme sur un PC, en installant tous les paquets.
Bootloader
Avant de terminer l'installation de RedHat, il faut installer aboot sur le disque dur, avec la commande "swriteboot".
Pour booter sur le disque dur, il suffit de changer les paramètres boot_dev, boot_file et boot_osflags. Ainsi il est possible de booter directement en tapant seulement boot au prompt de SRM.
Changement de noyau
Pour une raison inexpliquée, une fois aboot installé sur le disque, il est devenu impossible pour le noyau d'origine de Redhat de détecter les disques SCSI. L'utilisation du noyau 2.2.22-generic de Debian Woody a corrigé le problème.
Il faut booter sur le cd de Debian Woody, basculer sur la console (alt + F2), puis monter la partition /, et ensuite copier le noyau présent sur le CD, pool/main/k/kernel-image-2.2.22-alpha/kernel-image-2.2.22-generic_2.2.22-2_alpha.deb, le décompresser avec ar puis tar, et enfin copier les modules dans /lib/modules/ et l'image dans /boot/ (il est nécessaire de la décompresser avec deflate ou gzip, selon la version de aboot installée).
Recompilation d'un noyau
L'USB et le réseau restent non fonctionnels.
Le contrôleur réseau est reconnu par les modules de4x5 et tulip, mais je n'ai pas réussi à les faire fonctionner.
Par contre il est possible d'ajouter une carte réseau PCI sans aucun problème, une Realtek 8139 (rtl8139 ou 8139too) a fait l'affaire.
La configuration du noyau est utilisable sur le lien précédent.
Bricolage
L'horloge système ne semble pas fonctionner correctement en 2015, en se remettant toujours en 1995. (même en la réglant dans SRM ou avec hwclock).
Une correction rapide va changer l'année à la fin du chargement d'init, en rajoutant une ligne au fichier /etc/rc.local :
date $(date +%m%d%H%M2015)
.
L'année 2015 est à adapter manuellement (on peut aussi améliorer le script pour changer automatiquement l'année).
Utilisation
(Image non-redimensionné)
Références/Liens
Tags de l'article : info, linux, vieilleries, workstation