Installation et configuration d’un NAS (partie 1/2)
Grâce à la distribution NAS4Free, nous allons transformer un HP Proliant MicroServer N40L en NAS et configurer ses paramètres pour que ses fonctions aillent bien au-delà d’un simple stockage de données.
Nas4Free est une distribution open-source basée sur FreeBSD 9 qui permet de transformer quasi n’importe quelle machine en NAS (Network Attached Storage). Le projet initial a donné naissance à FreeNas et s’est poursuivi jusqu’à la version 7. Plus tard, suite à des avis divergences sur l’évolution de la distribution, une partie des développeurs a décidé de continuer le projet à leur façon et ont créé ce qu’on appelle un « fork », qui a permis à Nas4Free de voir le jour.
Après avoir testé pas mal de distributions, basées sur FreeBSD (FreeNas7, FreeNas8) ou sur Linux (OpenMediaVault, OpenFiler) ou sur Synology, mon choix final s’est porté sur Nas4Free pour plusieurs raisons:
- Est gratuit!
- Est basé sur un noyau FreeBSD récent
- Supporte ZFS
- Dispose d’une communauté active
- Propose des menus intuitifs (pas aussi beaux que ceux de Synology)
- Fournit un environnement stable
- Fournit les meilleures performances après comparaisons (et après avoir changé la carte réseau mais j’en reparlerai plus loin)
Hardware
Au niveau du matériel, la machine idéale est sans aucun doute le Proliant MicroServer de HP (N38L ou N40L) pour son silence, sa faible consommation et son prix aussi mini que son encombrement, auquel il faut ajouter les éléments suivants selon votre usage:
- 8GB de Ram (PC3 10600). Un passage à 16GB est possible en flashant un bios modifié mais par précaution j’ai préféré conserver celui d’origine. Ca fait beaucoup de mémoire mais comme vous le savez sûrement, ZFS en raffole!
- Une clé USB compacte de minimum 4GB. Dans mon cas, j’ai pris une Kingston DataTraveller de 8GB que j’ai branchée sur le port USB interne.
- Une carte réseau gigabit low-profile compatible FreeBSD, comme par exemple la Intel Pro 1000.
- Des disques durs, minimum 1, maximum 5 si vous retirer le graveur DVD. Pour mon projet, j’ai pris 4 Western Digital Red de 2To conçus spécialement pour tourner 24h/24 dans un NAS. Si par manque de bol vous avez opté pour des WD Green, sachez que vous risquer de les flinguer en quelques mois en faisant exploser leur Load_Cycle_Count et de vous retrouver avec des erreurs SMART rendant vos disques inutilisables. Une petite recherche de WDIdle3 sur google vous donnera plus d’informations.
- Un SSD de petite capacité si vous souhaitez ajouter un cache en lecture pour ZFS. J’ai choisi de ne pas en installer, il est de toute façon possible de le rajouter par la suite.
- Un écran LCD 4×20 de chez LCDModKit pour la « Jacky-Touch » mais aussi pour afficher en direct l’état de vos disques.
Consommation mesurée
A l’arrêt: 4W
Allumé: 45W en idle et 50W en activité (disques compris)
Le constat est clair, ce NAS ne consomme pas grand chose. Son silence est également remarquable, il est quasi inaudible en journée avec le bruit ambiant, notamment grâce aux disques durs qui tournent à 5600rpm.
Installation de Nas4Free
Une fois le serveur monté, allez directement dans le bios pour désactiver la carte réseau interne et d’autoriser le boot sur périphérique USB. Vous pouvez ensuite installer Nas4Free en suivant le guide d’installation qui se trouve sur leur site. Il suffit de graver l’iso et d’installer Nas4Free sur la clé USB.Choisissez la version « embedded », elle permet d’installer les mises-à-jour à partir de l’interface web, contrairement à la version « full » qui nécessite d’avoir un accès physique à la machine pour faire l’upgrade à partir d’un support externe.
Un reboot vous amènera à l’écran de console. Suivez les points 1, 2 et 3 pour configurer l’interface réseau et le mot de passe admin.
Une fois ces étapes complétées, vous pouvez laisser tourner votre MicroServer en « headless », c-à-d sans écran ni clavier/souris. La suite de la configuration se fera via son interface web, à l’adresse IP que vous lui avez attribué.
Premiers pas
System
Dans le menu « System > General », configurez les paramètres généraux. Pour le serveur de temps, j’ai choisi be.pool.ntp.org (serveurs NTP belges).
Dans le menu « System > Advanced », conifgurez les paramètres à votre convenance. Plutôt qu’un simple « Welcome » pour le MOTD (Message Of The Day: message qui s’affiche lors de l’ouverture d’une session console), j’ai préféré mettre quelque chose d’un peu plus… hostile:
Dans la partie « Firmware », vous trouverez votre version de Nas4Free. Si une version plus récente existe, le lien de téléchargement vous sera proposé, ainsi que le bouton pour uploader un nouveau firmware pour peu que vous ayez installé la version embedded.
Si vous souhaitez être notifié par email des diférents évènements qui peuvent avoir lieu sur le NAS (crash disk, smart reporting, etc.), il est nécessaire de configurer l’envoi de mail dans la section « System > advanced > email ».
Network
Dans la partie network, le menu « Interface management » propose de gérer les cartes réseaux ainsi que différentes configurations matérielles:
- VLAN: permet d’attribuer un tag VLAN à une interface (802.1Q)
- LAGG ou link aggregation and failover: combiner 2 liens ethernet pour n’en faire qu’un seul et gérer la façon dont les paquets sont distribués.
- BRIDGE: permet de bridger des interfaces
- CARP ou Common Address Redundancy Protocol: correspond au clustering. Plusieurs hôtes partagent une même adresse IP mais un seul est maître alors que les autres sont esclaves.
Dans le menu « LAN management », vous devez configurer l’adresse IP de votre NAS ainsi que son subnet et son gateway. Les autres paramètres peuvent être laissés tels quels (sauf si vous souhaitez activer le Wake On Lan mais c’est un peu paradoxal pour un Nas).
Les autres menus vous permettent d’éditer le fichier /etc/hosts, de modifier les routes statiques (dans le cas où vous avez plusieurs gateways et/ou routeurs) et de configurer les règles du firewall interne IPFW (qui est désactivé par défaut).
La configuration des règles est stockées dans le fichier /etc/rc.firewall.auxrules, celles qui sont en blanc sont actives, celles qui sont grisées sont désactivées. L’activation du firewall a pour effet d’ajouter dans le rc.conf les lignes suivantes:
firewall_type="CLIENT" firewall_script_auxrules="/etc/rc.firewall.auxrules" firewall_enable="YES"
Le firewall interne est surtout utile lorsque la machine est connectée directement sur le net. Dans le cas où un firewall existe déjà, son utilisation est redondante.
Création du système de stockage de données
Configuration des disques
Dans « Disks > Management », vous devriez voir apparaître vos disques et leurs informations (serial number, status, etc.). Si des disques apparaissent en rouge, vous pouvez cliquer sur « clear config and import disks ».
Pour une gestion plus aisée, j’ai mis une description plus explicite et j’ai activé le SMART monitoring pour chacun des disques.
Configuration du système de stockage de données
Si vous n’avez pas lu mon article sur ZFS, vous comprendrez aisément pourquoi le choix pour le format (UFS, FAT32 ou EXT2) n’est plus à faire, ZFS étant loin devant ses concurrents.
Pour que les disques soient reconnus dans le gestionnaire ZFS, il faut d’abord les « formater » en allant dans « Disks > Format ». Choisissez les disques un à un et sélectionnez « ZFS storage pool device » comme filesystem:
Vos disques sont maintenant reconnus par ZFS, on peut maintenant créer les vdevs nécessaires à notre pool. Pour celà, il faut aller dans « Disks > ZFS > Pools > Virtual device ».
Comme je souhaite utiliser mes 4 disques en Raid-Z, je vais créer 1 seul vdev. D’autres configurations sont possibles, si j’avais voulu un Raid0 avec un disque spare et un disque de cache, j’aurais dû créer 3 vdevs.
L’ajout d’un vdev se fait de manière très simple et consiste surtout à donner un nom au vdev (ce que nous ne faisions pas en ligne de commande):
Pour savoir si vos disques ont des secteurs de 4KB, vous pouvez suivre la procédure expliquée dans le spoiler ci-dessous.
Il ne nous reste plus qu’à créer le pool dans la section « Disks > ZFS > Pools > Management » en utilisant le vdev précédemment créé:
J’ai laissé les paramètres par défaut afin que le pool soit monté sous /mnt et je lui ai donné le nom raidpool (raidpool te donne des aiiiles).
# df -h Filesystem Size Used Avail Capacity Mounted on /dev/md0 206M 203M 2.6M 99% / devfs 1.0k 1.0k 0B 100% /dev procfs 4.0k 4.0k 0B 100% /proc /dev/md1 30M 744k 28M 2% /var /dev/da0a 103M 96M 6.5M 94% /cf raidpool 5.2T 209k 5.2T 0% /mnt/raidpool
L’espace disponible affiché est de 5.2TB, ce qui correspond au calcul
(taille d’un disque X (nombre de disques -1) X 63/64)
ou
( 1.8TB X (4-1) X 63/64) = 5.315TB
Vous pouvez aussi en profiter pour vérifier la configuration de votre zpool et exiger que ZFS accède aux disques en mode RAW sans passer par l’émulateur GNOP (uniquement si vos disques ont des secteurs de 4KB et que vous avez coché le « advanced format »!):
# zpool status pool: raidpool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM raidpool ONLINE 0 0 0 raidz1-0 ONLINE 0 0 0 ada0.nop ONLINE 0 0 0 ada1.nop ONLINE 0 0 0 ada2.nop ONLINE 0 0 0 ada3.nop ONLINE 0 0 0 errors: No known data errors # zdb | grep ashift ashift: 12 # zpool export raidpool # gnop destroy /dev/ada0.nop /dev/ada1.nop /dev/ada2.nop /dev/ada3.nop # zpool import raidpool # zpool status pool: raidpool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM raidpool ONLINE 0 0 0 raidz1-0 ONLINE 0 0 0 ada0 ONLINE 0 0 0 ada1 ONLINE 0 0 0 ada2 ONLINE 0 0 0 ada3 ONLINE 0 0 0 errors: No known data errors
Les disques émulés *.nop (GEOM logical drives) seront recréés au prochain démarrage mais votre pool ZFS continuera d’utiliser les disques en RAW, sans passer par l’intermédiaire GNOP, ce qui est plus fiable et plus facile à récupérer en cas de crash ou de changement de disque.
Pour que Nas4Free soit au courant des changements exécutés en ligne de commande, il est nécessaire d’aller dans le menu « Disks > ZFS > Configuration > Synchronize » et de cliquer sur « Synchronize » tout en bas (uniquement si votre pool est healthy). Cette étape est cruciale si vous utilisez principalement l’interface web car elle permet de synchroniser la situation réelle de votre Nas avec ce qui est mémorisé dans la base de donnée de Nas4Free.
Le ashift=12 correspond à des secteurs de 4096B, tandis que le ashift=9 correspond à des secteurs de 512B.
Maintenance du pool
Dans l’immédiat, on peut vérifier les propriétés du pool (les valeurs par défaut sont déjà optimales) et lancer un scrub:
# zpool get all raidpool # zpool scrub raidpool # zpool status raidpool ... scan: scrub repaired 0 in 0h0m with 0 errors on Fri Jul 12 10:16:56 2013
On peut également ajouter la commande scrub au crontab (« System > Advanced > Cron ») pour la faire tourner une fois par semaine pendant les heures creuses:
Remplacer un disque défectueux
Si votre pool apparaît comme dégradé dans « Disks > ZFS > Pool > Information » (ou zpool status), il est temps de remplacer le(s) disque(s) défaillant(s) avant qu’un autre disque ne lâche et que votre pool passe en status « faulted » (plus assez de redondance pour pouvoir récupérer les données). N’hésitez donc pas à faire un backup au cas où (la procédure de backup sera expliquée dans la seconde partie de cet article).
Les commandes ci-dessous peuvent être lancées à partir de l’interface graphique via « Disks > ZFS > Pools > Tools », mais personnellement je me sens plus en confiance devant une console.
Première étape, identifier le coupable: lancez un zpool status et repérez le disque affichant un status « faulted ».
Si vous avez prévu un disque spare et que le remplacement n’est pas automatique, vous pouvez immédiatement lancer la commande « zpool replace <poolname> <old_disk> <new_disk>« . L’ancien disque sera ensuite automatiquement détaché du pool.
Pour remplacer le disque défectueux, mettez le disque en offline (zpool offline <poolname> <disk>) s’il n’est pas encore détaché du pool. Si votre système n’est pas hot-plug, éteignez la machine pour remplacer le disque.
Si le nouveau disque se trouve dans le même emplacement que le précédent, vous pouvez simplement le mettre online et faire un « zpool replace <poolname> <disk> » pour lancer le resilvering. C’est fait automatiquement si le paramètre autoreplace est mis à « on ».
Création des datasets
Dans ma configuration, les datasets que je vais créer vont correspondre à des dossiers partagés qui auront chacun une utilisation spécifique:
- datashare: contient les données accessibles à tous les utilisateurs (documents scannés, musique, documents génériques, etc.)
- companyshare: contient les données professionnelles (factures, offres, etc.)
- clientshare: contient les répertoires clients (backups, données clients) qui sont en fait des sous-datasets (nested datasets)
La création des datasets se fait dans le menu « Disks > ZFS > Datasets > Dataset »:
Le paramètre dedup (pour « deduplicate ») sert à repérer les blocs identiques pour ne stocker qu’un seul de ces blocs au lieu d’en avoir plusieurs identiques. L’activation de ce paramètre est intéressante lorsque des fichiers doublons ou similaires sont nombreux. Néanmoins, l’utilisation du dedup peut poser problème lors de la suppression du pool et peut mener à un freeze de la machine dû à une trop grande utilisation de la mémoire (un minimum de 32GB de RAM). Pour éviter ce genre de problème, vous devez préalablement supprimer les données du pool, ainsi que ses snapshots et ses clones.
Le paramètre sync contrôle la façon dont les données sont écrites sur le disque. Always permet de synchroniser en permanence mais crée des I/O massivement et diminue le taux de transfert (le système attend que les données soient écrites sur le disque avant de continuer), tandis que standard va avoir pour effet de stocker en mémoire tous les changements, qui ne seront flushés vers le disque qu’à la prochaine transaction (environ toutes les 5 secondes). Le mode disabled se contente de stocker les modifications en mémoire, le commit vers les disques étant géré par les applications concernées (O_DSYNC, fsync, NFS commit, etc.). Dans le cas d’un simple partage réseau, le paramètre standard est optimal.
J’ai désactivé les atime (access time) car ce sont des I/O inutiles.
Comme les datasets peuvent être imbriqués (nested), il peut être intéressant dans le cas de profils utilisateurs ou de répertoires clients, de créer des sous-datasets spécifiques. Lorsque vous créez un sous-dataset, spécifiez le path dans le nom du dataset:
On peut laisser les autres paramètres et les permissions telles quelles, nous les modifierons par la suite.
Utilisateurs et groupes
Constitution des groupes
En allant dans le menu « Access > Users and Groups > Groups », vous verrez que plusieurs groupes sont déjà présents et correspondent chacun à un service spécifique (ftp, ssh, etc.).
Pour une utilisation personnelle, vous aurez juste besoin de créer un groupe « utilisateurs » et un user pour chaque personne ou utilisateur fonctionnel qui aura besoin d’accéder au Nas. Pour une utilisation professionnelle, vous pouvez créer un groupe pour chaque département.
Dans mon cas, j’ai créé plusieurs groupes selon les ressources à accéder:
- un groupe « mycompany », pour les employés de ma société.
- un groupe « clients », pour qu’ils puissent accéder aux ressources communes.
- un groupe spécifique pour chaque client, afin que certaines ressources ne soient accessibles que par eux.
- un groupe « external », pour les personnes qui auraient besoin d’accéder à des ressources mais qui ne font partie d’aucun des groupes nommés ci-dessus, typiquement quelqu’un d’externe.
- un groupe « administrators », pour regrouper les administrateurs.
- des groupes supplémentaires pour l’accès à des fonctionnalités spécifiques. Ces groupes seront créés par la suite, lorsque nous en aurons besoin.
Les groupes ne peuvent pas être imbriqués comme c’est le cas dans un Active Directory. Les permissions Unix sont spécifiques aux systèmes Unix et nécessitent une réflexion différente, les utilisateurs peuvent être membre de plusieurs groupes et représentent une personne physique ou un utilisateur fonctionnel (par exemple, l’utilisateur « scanner » permet au scanner de se connecter à une resource, ftp en l’occurence, et d’envoyer les documents scannés vers le dossier partagé correspondant).
Ajout des utilisateurs
La première chose à faire est de créer un utilisateur administrateur afin de ne plus employer directement l’utilisateur root par la suite.
Dans mon cas, l’utilisateur administrateur est membre du groupe « companyadmins » mais aussi des groupes « sshd » pour l’accès en ssh, et « wheel » afin de pouvoir lancer la commande su et ainsi exécuter des commandes en tant que root. Nous pouvons également l’assigner à d’autres groupes selon les accès qui seront nécessaires. Cocher la case « grant access to user portal » ne vous donnera qu’un accès très restreint à l’interface web de management sur laquelle vous vous trouvez, l’accès complet étant uniquement réservé à l’utilisateur admin configurable via le menu « System > general ».
Pour la création des autres utilisateurs, suivez le même principe en prenant soin de sélectionner « nologin » pour le shell, ce qui les empêchera d’avoir accès à une console. Evitez également de les mettre dans les groupes sshd et wheel.
Ajustement des permissions sur les datasets
A l’aide d’une connection ssh, placez-vous à la racine du pool et utilisez les commande chown et chmod pour définir les permissions des datasets (et ls pour les vérifier):
# chown <user>:<group> <dataset> # chmod 770 <dataset> # ls -lh
Sécurisation et derniers règlages de Nas4Free
1. Changez l’identifiant admin de l’interface web
Dans la section « System > General », vous pouvez changer le login de l’admin du WebGui, ainis que son mot de passe. Même si le login est différent, il s’agit bien de l’utilisateur root. Choississez-lui un mot de passe sécurisé.
2. Ne donnez un accès shell qu’aux utilisateurs qui en ont besoin
Dans la section « Access > Users and Groups », pour chaque utilisateur non autorisé, le shell doit être mis à « nologin ».
3. N’utilisez pas FTP mais SSH ou SFTP
Les mots de passe FTP transitent en clair sur le réseau, évitez donc de l’utiliser en provenance d’internet et limitez son usage en interne. Nous verrons dans la deuxième partie comment mettre en place une solution SSH ou SFTP.
4. Préférez l’authentification par clé pour SSH plutôt que par password.
Ce sujet sera couvert dans un prochain article.
5. N’autorisez pas l’utilisateur root à se connecter en SSH.
Dans le menu « Services > SSH », vérifiez que la case « permit root login » est décochée. Il est en effet recommandé de se connecter avec un utilisateur standard autorisé sur SSH et d’ensuite utiliser la commande su pour lancer des commandes en tant que root.
6. N’ouvrez pas le WebGui de votre Nas à l’internet.
Pour y accéder, préférez l’utilisation d’un tunnel SSH ou tout autre accès sécurisé. N’hésitez pas non plus à forcer le https plutôt que l’http (« System > General »).
7. Checkez les logs régulièrement.
Même si Nas4Free est résistant à la plupart des attaques brute-force, il est toujours conseillé de garder un oeil sur les accès dans « Diagnostics > Logs ».
8. Vérifiez la sécurité de votre réseau.
Un firewall hardware efficace n’est pas du luxe, les firewalls intégrés aux modems/routeurs sont souvent inefficaces. Vérifiez bien quels ports sont ouverts et vers quelles adresses ils sont forwardés. Si vous voulez vous protéger d’une attaque interne, n’hésitez pas à également configurer le firewall intégré à Nas4Free.
Dans la deuxième partie, nous allons mettre en place les accès au stockage, que ce soit au travers de partages CIFS (smb), AFP, iSCSI, etc. ainsi que les backups.
Tags: freebsd, Nas, Nas4Free, zfs
Trackback from your site.
Comments (5)
taxitain
| #
Bonjour et merci de partager ces infos utiles.
Pour info j’ai découvert votre site en recherchant sur google « hp microserveur proliant n40l 802.1q », en première ligne. hourra !
Ma config est identique à la votre hormis les disques, j’ai 4 wd green, le Load_Cycle_Count est à présent modifié à 300s graçe à votre dossier donc je suis tranquille pour un moment je pense (ça touche les 200 000 quasiment) .
J’ai la carte réseau d’origine, vous non car apparemment elle ne serait pas compatible !?
Moi ça fonctionne en utilisation de base mais est-ce pour ça que je galère avec les vlans (802.1q) ?
J’attends avec impatience de pouvoir consulter la 2ème partie.
Cordialement
Florent
Reply
Sebastien Lambot
| #
Bonjour,
La deuxième partie couvrira les partages réseaux et devrait sortir prochainement (dans un mois maximum).
Un troisième article à propos de cette config devrait sortir dans le même délai, celui-ci sera beaucoup plus technique car j’ai fait l’achat de 2 cartes quad-port gigabit qui me permettront de monter un SAN séparé et de connecter un ESXi en MPIO (même si ça paraît être du chinois, tout sera clairement expliqué).
à bientôt!
Reply
Sebastien Lambot
| #
Après quelques tests, il s’avère qu’une configuration en RAID10 (un stripe de 2 mirrors, à ne pas confondre avec un RAID01) procure de meilleures performances. De plus, la maintenance en cas de crash disque est plus aisée.
Reply
Sebastien Lambot
| #
Pour une install sous vmware, il faut ajouter les entrées suivantes dans le rc.conf (via System > advanced > rc.conf):
– vmguestd_enable = « YES » (améliore les fonctions stop/start du serveur)
– vmsetup_enable = « YES » (permet de charger le driver des NICs VMXNet3)
Reply
Pascal
| #
Bonjour,
Pour commencer un remerciement s’impose pour vos tutorielles.
Je viens du monde des synology DS1515+, DS916+ et DS413j mais depuis quelques temps, j’ai mis en service un nas basé sur une carte mère abit ip35 pro, core2duo 8500 avec 6g de RAM et 6x2t en disque dur avec nas4free.
Mon revirement sur ce système c’est que les synology deviennent un gouffre financiers.
De plus, depuis février certains syno sont une bombe à retardement suite au bug du c2000. DS1515+ par exemple ( celui-ci à été changer par synology et modifier sur le PCB)
Donc j’ai décider d’arrêter les synology.
Venant tous de suite au nas4free.
Le paramétrage des diverses interface et installations se sont bien passer et le pool zfs en raidz1 c’est bien initialiser. CMB/CIFS (samba) est paramétré.
Mais il y a un point ou je ne peux pas suivre, Les datasets sont un gros point noir avec les droits et les dossiers de partage.
Sur synology c’est très clair création du volume en btrfs, création des dossier partagés ensuite création de groupe et utilisateurs et paramétrage des droits.
Sur nas4free je suis complément dans le potage si j’ose m’exprimer de la sorte.
Donc je souhaite crée 16 dossiers partager (documents, sauvegarde, tuto, formations, photo, vidéo, etc…)
j’ai besoin de 2 groupes famille et amis qui vont avoir des droits croisées, et 7 utilisateurs.
Ma question : Comment faire cela ? et les data set ?
Un grand merci de votre réponse.
Reply