Un serveur de stockage à base de RaspberryPi

Un serveur de stockage à base de RaspberryPi

Il y a quelques temps, mon super serveur avait rendu l’âme (j’ai depuis commandé un serveur encore plus puissant !). J’ai donc dû très rapidement trouver une alternative pour stocker tous mes fichiers et gérer à nouveau le réseau avec de nouvelles règles. Le problème est que je ne voulais pas mettre de moyens exorbitants dans un nouveau serveur. J’ai donc trouvé une alternative qui tient la route même si elle possède de grosses lacunes.

J’utilisais donc en attendant une Raspberry Pi modèle B+ pour gérer le réseau de la maison. J’avais en stock quelques pièces de PC au cas où comme un boîtier, une alimentation et deux disques durs. J’ai donc eu l’idée de mettre en place un serveur de stockage à base d’une Raspberry ! Et….. voici la bête!

Alors oui, si peu de matériel dans un si grand boîtier, c’est à mourir de rire non ? 😀

🗒️
Note : Cet article explique dans les détails, la procédure que j’ai suivi pour réussir mon projet. Vous remarquez d’ailleurs que sur la partie Installation software est rédigée comme pour un tutoriel et c’est le cas. Cet article a pour objectif de vous aider à concevoir vous-même votre propre serveur de stockage à l’aide d’une RaspberryPi.
💡
Cet article date de 2016 et bien que le contenu reste toujours à jour, le montage fut beaucoup critiqué par certains (ce que je peux comprendre). Si la demande est élevée, une nouvelle révision de l'article avec du matériel récent pourrait être rédigé. A vos commentaires si c'est votre souhait ;)

Le matériel dont j’ai eu besoin

J’ai eu besoin pour ce projet :

  • Une RaspberryPi (Modèle B+ et d’une carte SD 16Go Classe 10) ;
  • Un boîtier (format ATX) ;
  • Une alimentation (375W) ;
  • Deux disques durs (dans mon cas, je n’avais que des disques de 500Go en SATA2)
  • Deux adaptateurs USB->SATA.

Les problèmes commencent avant le montage

Lorsque j’ai voulu essayer mes superbes adaptateurs USB->SATA, ils ne fonctionnaient pas sur mes disques durs 3.5″ mais uniquement sur des disques durs 2.5″ car le problème était qu’un disque dur 3.5″ consomme beaucoup plus qu’un disque dur 2.5″. Un disque dur 3.5″ a donc besoin d’une (bonne) ligne 12V et d’une en 5V. Je me suis donc dit que j’avais fait une dépense inutile jusqu’à ce que je découvre, sur mes deux adaptateurs, une petite prise pour accueillir une alimentation externe en 12V en plus des deux sorties USB !

Le montage de l’extrême !

Après avoir vu que les adaptateurs possédaient un connecteur pour accueillir une alimentation externe, j’ai eu l’idée de souder directement du 12V en provenance de l’alimentation ATX !

J’ai donc soudé mes deux fils venant de l’alimentation (à savoir le jaune pour le 12V et le noir pour la masse ou le 0V si vous préférez).

Untitled-Sketch_bb

Vous remarquerez que j’ai aussi ponté la masse avec le fil vert, ce qui permet de démarrer l’alimentation. Et comme j’utilise deux disques durs, il m’est donc inutile d’ajouter une résistance de puissance sur une des lignes du 12V.

J’ai ensuite branché un des deux USB de l’adaptateur à la Raspberry mais manque de bol ! C’est insuffisant pour démarrer les disques et brancher le second pourrait redémarrer la carte par sécurité (vu que l’ampérage demandé par le contrôleur USB/Ethernet est au dessus de ce que la carte est capable de supporter). J’ai donc dû couper le deuxième câble USB et raccorder le fil rouge et noir (à savoir le 5V et la masse) à l’alimentation.

Untitled-Sketch_bb-1

Et après ça, TADAM ! Le premier disque dur démarre ! Enfin ! J’ai ensuite procéder à la même méthode pour le second disque et j’ai commencé l’installation du super serveur !

L’installation du système d’exploitation et des paquets

Pour avoir une installation propre et légère, j’ai utilisé une installation Raspbian Netinstall (disponible son dépôt GitHub). J’ai ensuite fait un choix sur les paquets à installer pour le montage du RAID logiciel, du partage des fichiers et du partage DLNA.
Pour cela, j’ai installé les paquets suivants :

  • mdadm (pour la gestion du RAID de manière logicielle)
  • Samba (pour le partage de fichier avec un réseau Windows ou Linux)
  • Minidlna (serveur multimédia DLNA pour le partage des fichiers multimédia comme les images, vidéos, musiques)

J’ai bien sûr installé quelques paquets supplémentaires comme OpenVPN, Fail2ban, Nagios et un tas d’autre paquets histoire de gérer le réseau et de me connecter à distance sans trop de soucis de sécurité.

Mise en place du RAID

Tout d’abord, nous allons mettre en place le RAID et avant toute chose, nous allons nous assurer que nos deux disques sont bien détectés par Linux avec la commande ls /dev/sd*.

Ensuite nous allons configurer les disques durs pour qu’ils puissent devenir de beaux disques avec une partition Linux Raid Autodetect. Pour cela, utilisons la commande en tant que root (ou sudo) gdisk /dev/sdX (X étant la lettre du disque dur sur votre système). N’hésitez pas à faire un df -h pour être sûr que nos deux disques sont bien les deux lettres dont vous avez repéré et que leurs taille correspond bien.

En envoyant la commande ?, vous aurez la liste de toutes les commandes que l’on peut lancer avec gdisk.

Capture-du-2015-08-25-23-59-57-1

Pour commencer, nous allons créer une nouvelle table de partition (aussi nommé GPT pour GUID Partition Table) en envoyant la commande o. Et dites oui pour confirmer la commande.

Capture-du-2015-08-26-00-12-12

Puis nous allons créer la partition en envoyant la commande n. L’assistant vous demandera sur quel numéro de partition faut-il travailler (par défaut 1, appuyez donc sur entrée), ensuite le premier secteur (appuyez directement sur entrée), le dernier secteur (idem, entrée), puis choisissez le type de partition. Dans notre cas, nous souhaitons une partition de type Linux Raid Autodetect qui correspond à la valeur hexa fd00 (dans certains cas, comme dans fdisk, il correspond uniquement à fd).

Capture-du-2015-08-26-00-12-57-1

Il ne vous reste plus qu’à envoyer la commande w pour écrire les modifications. L’assistant vous demandera comme d’habitude de confirmer votre choix puis il travaillera tout seul.

Capture-du-2015-08-26-00-27-08

Note : Vous remarquerez que j’ai sauté toute la partie du choix du premier et dernier secteur car il s’agit d’un calcul à faire et qui ne nous intéresse pas dans notre cas car nous utilisons entièrement l’espace des disques.

Ensuite, il faut refaire la même configuration pour le second disque dur. Mais … il y a moyen d’éviter de devoir tout refaire surtout si les deux disques sont identiques ! Pour cela, ré-ouvrez gdisk avec la précédente commande puis choisissez la commande x (pour entrer dans le menu des commandes avancées) puis entrer la commande u (pour la réplication de la table des partitions sur un autre disque. Ne le faite uniquement si les deux disques sont identiques, de préférence, de même référence). L’assistant vous demandera l’emplacement du nouveau disque (/dev/sdX, en remplacent X par la lettre correspondante), validez puis entrez la commande w pour écrire les modifications et quitter le programme.

Si la technique ne fonctionne pas, configurez le second disque à la main.

Ensuite il faut créer le raid et pour cela, il faut utiliser la commande suivante (en root) :

mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdX1
/dev/sdX1

Rapide explication de la commande :

  • –create /dev/md0 : on donne ici le nom que l’on va donner pour notre raid (utilisez toujours cette syntaxe et modifiez uniquement le chiffre si vous créez plusieurs raid sur le système)
  • –level=1 : on dit ici que l’on souhaite un RAID de type 1 (RAID1) soit une réplication des données sur les deux disques simultanément. Vous pouvez bien sûr choisir un autre type de RAID comme le RAID0, le RAID1, le RAID5 ou RAID10. Pour connaitre le fonctionnement des différentes versions des RAID, je vous invite à lire cet article expliquant les principaux niveaux de RAID.
  • –raid-devices=2 : on dit combien de disques on utilise pour notre RAID (en fonction du type de RAID que vous avez choisi précédemment)
  • /dev/sdX1 /dev/sdX1 : on dit quels sont les deux disques utilisés et la partition utilisé (en l’occurrence, la première).

Toujours en root, envoyez ensuite la commande suivante pour que le RAID ce construise automatiquement à chaque démarrage du système :

mdadm --monitor --daemonise /dev/md0

Formatez le RAID pour qu’il devienne en ext4 avec la commande :

mkfs.ext4 /dev/md0

Déclarez le RAID dans le fichier /etc/fstab pour monter automatiquement le RAID à chaque démarrage du serveur :

/dev/md0       /Raid       ext4       defaults       0       1

Vous pouvez bien sûr changer /Raid par le dossier que vous souhaitez car il concerne le dossier dans laquelle le RAID sera monté. J’ai préféré mettre à la racine de Linux pour y accéder plus rapidement avec Git par exemple.

Il ne vous reste plus qu’à créer le dossier où sera monté votre RAID et attendre la fin du montage du RAID en regardant le statut avec la commande :

cat /proc/mdstat

Plus vos disques sont de grande taille, plus la création du RAID sera longue (surtout si vous passez par des adaptateurs USB->SATA et non un bus SATA2 ou 3 !) Puis si ça peut vous rassurez, faite le calcul de combien de temps ça prendra puis le nombre de Mo seront traité par minute, heure (et pourquoi pas jours :3).

Bien ! Après plusieurs heure (jours) plus tard, le RAID est enfin créé et monté ! Vous pouvez désormais créer vos dossiers, groupes d’utilisateurs et utilisateurs pour passer à l’étape suivante qui est la configuration de Samba. Mais avant de se lancer sur la configuration de Samba, j’aimerais vous signaler quelque chose.

Lorsque vous utilisez un disque dur sur un adaptateur USB->SATA, les données S.M.A.R.T du disque dur deviennent alors inaccessibles et donc, vous ne pouvez pas connaitre l’état des disques au cas où le disque aurait une défaillance ou encore connaitre la température du disque pour ainsi limiter la destruction à feu doux (ou à plus de 50°C) des disques durs. Pour cela, je vous recommande dans un premier temps d’avoir un bon flux d’air dans votre boitier (deux ventilateurs dont un en pull et un en push), cela permettra ainsi de bien refroidir les disques. Puis des ventillos c’est pas trop cher (sauf si on cherche en dessous de 15dB :3) En plus de ça, je vous recommande d’utiliser le GPIO de la Raspberry (ou autre carte alternative) ou bien d’une Arduino pour greffer quelques capteurs de température sur les disques dur afin d’en connaitre la température (ça donne une idée, pas la température exacte !!) et n’hésitez pas à coder un petit script qui vous enverra une ou plusieurs notifications si les disques dépassent plusieurs paliers de température. (42-45°C : utilisation modéré des disques, 45-48°C : grosse utilisation des disques, mettez en pause les processus pour refroidir les disques. +50°C : vous êtes un sauvage, vous souhaitez la mort de votre disque dur.. Pauvre disque dur :'( ..). Si vous le souhaitez, je pourrai mettre à disposition mon code source (codé avec les pieds) qui envoi des notifications avec Pushbullet.

Configuration de Samba

Après une longue configuration du RAID, passons aux choses un peu plus drôles ! Passons à la configuration de Samba !

Pour ceux qui n’ont pas encore installer samba, utilisez la commande :

apt-get install samba

Créez vos dossiers favoris dans votre RAID, créez les groupes utilisateur uniquement pour Samba et des utilisateurs. Une fois tout cela de fait, éditons le fichier /etc/samba/smb.conf.

Nous n’irons pas faire la configuration de base de Samba (workgroup, réseau, ni même la partie domaine pour éviter de tout détruire (car elle requiert avoir déjà configurer Samba de la tête aux pieds et connaissant le fonctionnement des Active Directory de Windows)). Assurez-vous uniquement que les lignes suivantes possèdent les mêmes paramètres pour sécuriser Samba :

security = user
encrypt passwords = true
unix password sync = yes

Une fois cette partie terminé, passons directement à la partie des dossiers partagés ! Copiez ce patern et modifiez-le à votre guise :

[Mon Dossier]
        comment = Mon Dossier
        path = /Raid/MonDossier
        valid users = @raid
        browseable = yes
        writeable = yes
        guest ok = no
        read only = no
  • [Mon Dossier] : Permettant d’instancier un nouveau dossier partagé pour Samba. Le nom est le nom qui sera affiché sur le réseau
  • comment = Mon Dossier : pas besoin d’expliquer cette ligne 😉
  • path = /Raid/MonDosier : Chemin vers le dossier en question
  • valid users = @raid : Autorise uniquement les utilisateurs étant dans cette liste. Pour mettre un groupe, ajoutez un `@« avant le nom du groupe.
  • browseable = yes : permet d’autoriser ou non de naviguer dans le dossier
  • writeable = yes : permet d’autoriser ou non d’écrire, modifier, supprimer les fichiers dans le dossier
  • guest ok = no : accepte ou refuse les invités (sans demande d’identifiants)
  • read only = no : met le dossier ou non en mode lecture uniquement

Ensuite n’oubliez pas de chmod (avec récursivité) chaque dossier pour éviter les problèmes de permissions (par exemple chmod 770 -R /Raid/MonDossier) et d’attribué le bon groupe à chaque dossier (chown root:groupe /Raid/MonDossier).

Vous devrez par la suite créer de nouveaux utilisateurs pour Samba avec la commande x.

Puis pour changer le mot de passe d’un utilisateur, la commande u.

Il ne reste plus qu’à essayer avec Windows (ou Linux) que le partage fonctionne et de commencer à mettre tous ses précieux fichiers ! Si en revanche ça ne fonctionne pas, vérifiez que vos dossiers/fichiers possèdent les bonnes permissions, groupes. N’hésitez pas à revoir la configuration de vos dossiers partagés et modifiez à nouveau le mot de passe de votre utilisateur.

Vous pouvez d’ailleurs faire un man samba ou cliquer ici pour lire la documentation de Samba.

Configuration de Minidlna

Il existe plein d’autres solutions alternatives à minidlna et plus puissantes (mais aussi plus gourmandes). J’ai donc choisi minidlna pour pouvoir lire mes supers épisodes de Fairy Tail mes séries favorites depuis mon smartphone ou via le Chromecast.

Note : Minidlna a été renommé en Ready Media très récemment. Il est possible que le paquet et le nom du service soit différent dans les prochains mois après la rédaction de cet article.

Pour l’installation, rien du plus simple qu’un petit w

Ensuite, il faut éditer le fichier etc/minidlna.conf et modifier les lignes suivantes :

media_dir=V,/Raid/MesVidéos
media_dir=A,/Raid/MesMusiques
media_dir=P,/Raid/MesImages

friendly_name="Mon super serveur DLNA"

Les lignes suivantes sont essentielles pour le bon fonctionnement du serveur. Mais si vous ne possédez pas de photos à partager par exemple, vous pouvez supprimer la ligne avec l’argument P par exemple.

  • media_dir=[A,V,P],[Folder] : vous aurez compris qu’une des trois lettre correspond aux fichiers audio (lettre A), les images (lettre P) et les médias vidéos (lettre V). Ensuite, on dit où sont ces fichiers.
  • friendly_name : Le nom du serveur qui sera affiché sur les clients.

Vous pouvez ensuite changer des paramètres pour avoir une configuration un peu plus personnalisé :

network_interface=eth0 # Permet d'assigner une interface spécifique à minidlna
port=8200 # Permet d'assigner le port de minidlna
presentation_url=http://example.com:80 # Permet de changer la page de présentation Web de minidlna

Bien sûr, ses lignes sont optionnelles et ne sont pas nécessaire.

Une fois la configuration terminé, mettez-y vos fichiers dans les dossiers respectifs et redémarrez le serveur dlna :

service minidlna force-reload

Attendez un petit moment que la base de données ce créée et connectez-vous avec votre ordinateur (Windows Media Player, VLC) ou via votre smartphone/tablette puis essayez de lire vos médias. Si vous n’y arrivez pas ou qu’aucuns fichiers ne sont disponibles, changez les permissions des fichiers pour qu’ils soient lisibles par minidlna.

Et voilà, le serveur est entièrement configuré, installez des services dont vous avez l’habitude d’utiliser (sans trop saturé le Raspberry car avec la lecture d’une vidéo/film avec minidlna, le SoC monte presque voire à 100%).

N’hésitez pas à le reproduire chez vous, et si vous avez des suggestions de services à ajouter, n’hésitez pas à en parler dans les commentaires 😉