Artikel top billede

(Foto: Computerworld)

Byg din egen NAS

Du kan spare en pæn sum penge på selv at strikke en NAS sammen. Det er ikke særlig svært. Læs her, hvordan du gør ...

Af Torben Okholm, Alt om Data

Denne artikel er oprindeligt bragt på Alt om Data. Computerworld overtog i november 2022 Alt om Data. Du kan læse mere om overtagelsen her.

Lager bliver stadig billigere, og appetitten efter data bliver
stadig mere glubende. Derfor vil flere og flere bruge et NAS (Network Attached Storage) til at lagre deres musik, film og fotos. Man kan få alle mulige former for færdige enheder til forskellige priser. Det mest almindelige er opsætninger med to eller fire diske, for de giver en enkel, sikker og kompakt løsning til hjemmelageret.

Det kommer nok ikke som nogen overraskelse, at Linux er kernen i mange af disse teknologier, eftersom de blot er x86- eller ARM-bokse med beskedne specifikationer, som ikke desto mindre står bag smarte webinterfaces og brugervenlig konfigurationssoftware.

Man kan dog spare nogle håndører ved selv at lave en NAS-enhed. Der findes nogle få specialiserede open source-NAS-distributioner, og den mest populære trio udgør variationer over et tema: det BSD-baserede FreeNAS (en omskrivning af et ældre projekt med det samme navn), NAS4Free (en fortsættelse af den oprindelige FreeNAS-kode) og OpenMediaVault (et Debian-baseret projekt fra den oprindelige forfatter til FreeNAS).

Alle disse projekter er fortræffelige, og de klarer opsætningen for dig: fra opbygningen af arrayet til deling af dine Hansi Hinterseer-numre og andre filer. Men hvad nu, hvis du gerne vil gøre det hele selv? Du vil måske have din NAS-boks til også at fungere som mediecenter eller bruge den til at streame Steam-spil fra en Win-dows-boks – eller måske køre en OwnCloud-installation? Du vil måske blot gerne selv have hånd i hanke med sagerne, især i lyset af de Shell-shock-angreb, der har ramt NAS-bokse. Lad os altså se at komme i gang.

Når det gælder hardware, er den vigtigste del drevene. Man kan lave en simpel lagerboks med et enkelt stort drev, men det er umagen værd at investere mere for at opnå en vis redundans. Til et raid-anlæg skal man bruge mellem to og seks drev, og det hele bliver enklere og nemmere, hvis de har samme størrelse. Med to drev kan man have en raid1-konfiguration (hvor det ene drev er et mirror-image af det andet). Med tre drev kan man have raid5 (hvor data- og parityblokke er fordelt mellem drevene med henblik på større ydelse og integritet). Vi har satset på fire drev, fordi de flinke folk hos Western Digital har sendt os fire Red series 6 TB-drev.

Arranger raid

Med fire drev er der mulighed for en række raid-konfigurationer, og vi kommer kort ind på dem her. Raid10 er en kombination af niveauerne 1 og 0. Først opretter man et raid0-array med to diske (der ikke giver nogen redundans, men som fordobler ydel-sen) og laver et mirror. Raid5 er en mulighed, men kan ikke anbefales: Hvis man mister et drev, vil den I/O-intensive genopbygning i høj grad øge risikoen for, at man mister endnu et – og dermed alle ens data. Raid6 giver forsikring mod to drevfejl og leverer en lille hastighedsforøgelse takket være striping. Det er den mulighed, vi har valgt til vores projekt. Vi bør nå frem til 12 TB anvendelig lagerplads og overførselshastigheder på niveau med et enkelt drev.

Det er muligt at lægge et operativsystem på en separat partition på et af ens raid-drev, men vi kan ikke anbefale det. Man ville være nødt til at downsize alle ens raid-partitioner, og det er som regel en god ide at holde disse sager adskilte. Det er også muligt at installere operativsystemet inden i arrayet, blot din bootloader har sin egen partition, og dit initrd-image har support af mdadm (Multiple Disk Administration). Men det egner sig heller ikke til en lagerboks.

Vi brugte alle vores interne hylder (og SATA-forbindelser) i vores lille towerkabinet, og vores operativsystem måtte bo på et ganske fikst WD Black2 USB 3-hybriddrev. Det går fint, blot man ikke kommer til at frakoble USB-nøglen, mens maskinen kører. Til en simpel NAS-boks har man ikke brug for et komplet desktopmiljø, og vi lægger derfor ud med en enkel Arch Linux-installation. Hvis du på et senere tidspunkt vil tilføje mediecenterfunktionalitet, står Arch ikke din lykke i vejen.

Du kan læse alt om installation af Arch på et USB-drev på http://bit.ly/ArchOnAUSBKey. Resten af vores guide oversætter løseligt til andre distributioner såvel, og vi går ud fra, at du har foretaget en skrabet installation med en fungerende internetforbindelse. Det er en god ide at oprette SSH-server på din maskine (hvis noget skulle gå galt) og også oprette en statisk ip.

Disse skridt er veldokumenteret andre steder, og vi går derfor ud fra, at du har gennem-gået dem. Således kan du fjerne tastatur og skærm og fortsætte arbejdet på afstand. Først skal du partitionere dine diske. Hvis dine drev er større end 2,2 TB, skal du bruge en GPT-partitionstabel. Og selvom de ikke er så store, kan du lige så godt gøre det alligevel. Her har du en ven i gdisk-programmet: Det er del af gptfdisk-pakken på Arch:
# gdisk /dev/sda

Opret en ny partition ved at skrive n, og tryk så Enter for at bekræfte, at dette er den første partition. Tryk Enter igen for at acceptere standard-startsektoren [2048]. Det er en god ide at efterlade mindst 100 MB plads for enden af hvert drev, eftersom drev, der formodes at have samme kapacitet, ofte afviger med et par cy-lindre. Du kan enten regne ud, nøj-agtig hvilken sektor der skal afslutte partitionen (gang drevets størrelse i terabytes med 2 i en faktor 40, fra-træk 100 gange 2 i en faktor 20, divi-der resultatet med 512 (hver sektor er sandsynligvis på 512 bytes), adder 2.048 ... eller også kan du gætte dig vej. Lad os tage et eksempel: +5999,9 G for noget, der er omkring 100 megabyte under 6 TB. Raid-parti-tioner burde have den specielle partitionstype FD00, selvom Linux faktisk ikke bemærker det længere. Skriv den nye partitionstabel til disken med bogstavet w. Gentag det for alle de diske, du vil have med i dit array.

Opret dit array

Den mest spændende og tidskræ-vende del af opgaven består i at op-rette et array. Meget af kompleksi-teten bliver afværget af mdadm-
abstraktionslaget, men sørg for, at parametrene er korrekte – de partitioner, der angives, bliver uigenkal-deligt slettet.

Vores raid6-array blev således skabt ved hjælp af det følgende lyriske udsagn:
# mdadm --create --verbose --level=6 --metadata=1.2 --chunk=256 --raid-devices=4 /dev/md0 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1

Kommandoen vil køre længe i baggrunden (det tog 24 timer at oprette vores array), og man kan følge med i udviklingen ved at se på statusfilen:
# cat /proc/mdstat

Du kan begynde at bruge dit array i en reduceret tilstand med det samme, men tålmod er en dyd: Hvorfor ikke læse en bog eller drikke nogle kopper te? Du kan også fundere over, om 256 K var det rette valg af enhedsstørrelse. Enhedsstørrelsen angiver størrelsen på hver sektion af data, mens den bliver stripet over drevene. Standarden er 512 K, men det optimale tal afhænger af din hardware og dit brugsmønster.

Til store filer anbefaler man mindre enheder, således at data bliver spredt over flere drev, men med blot en håndfuld drev gælder denne logik ikke. Til mindre filer bør man bruge større enheder, men ikke i en størrelsesorden, der overgår størrelsen af de filer, man arbejder med. Hvis du er opsat på at finde det optimale tal, er du simpelthen nødt til at ofre nogle timer på at afprøve dit anlæg. Husk, at selvom du bruger gigabit ethernet til at få adgang til dit NAS, vil netværket højst sandsynligt stadig være flaskehalsen. Set i det lys er finjustering af raid-parametre overflødig. Men det tal, du vælger, er vigtigt, når vi skal initialisere vores filsystem.

Du er nødt til at fortælle mdadm om dit array, så man kan få nem adgang til det efter genstart. Det kan du gøre ved at køre
# mdadm --detail --scan >> /etc/mdadm.conf

som føjer en linje, der ligner noget i retning af
ARRAY /dev/md0 metadata=1.2 name=wdarray:0 UUID=35f2b7a0:91b86477:bff71c2f:abc04162

til mdadm’s config-fil.
Nu kan device-noden /dev/md0 blive behandlet som enhver anden partition, om end en krabat på 12 TB i vores tilfælde. Lad os formatere den, så den kan modtage et ordentligt læs af data. Vi vil bruge ext4, og det er måske et konservativt valg, men det er robust og velfungerende. Mere eksotiske filsystemer skalerer godt til dusinvis af drev og man styrer et array uafhængigt af mdadm, men ZFS kræver masser af hukommelse (kostbar ECC-hukommelse er varmt anbefalet), og Btrfs kan forårsage cpu-udslag. Ext4 har et par raid-specifikke funktioner, stride og stripe-width, og det er vigtigt at håndtere dem rigtigt, således at raid-blokke og filsystem-blokke bliver udlignet. Stride er det antal filsystem-blokke, som hver enhed spænder over.

Beregningerne går altså på enheds-størrelse/blokstørrelse. Ext4 bruger som standard 4 k-blokke (men man kan godt bruge mindre blokke ved hjælp af funktionen -b, hvis man vil). Hver af vores 256 k-enheder spænder over 64 blokke. Stripe-width er dette tal ganget med antallet af datadiske. I vores array med fire diske spænder hver enhed over to diske, og de to andre er afsat til enhedens paritet. Dermed er vores stripe-width på 128 blokke. Hvis vi havde brugt raid5, ville kun en disk være en paritetsdisk, men det gør vi ikke. Derfor formaterer vi vores array med det følgende:
# mkfs.ext4 -v -L wdarray -m 0.5 -E stride=64,stripe-width=128 /dev/md0

Funktionen -m angiver den procentsats af partitionen, der skal reserveres til superbrugeren. Standarden er 5 %, og det er lidt højt til store drev.

Samba: Skal vi danse?
Vi vil tilføje mindst en bruger ved navn pcfraid og ændre rettighederne på /mnt/raid, så der bliver adgang til vores datasilo:
# groupadd raidusers
# useradd -m -G raidusers -s /bin/bash pcfraid
# chown root:raidusers /mnt/raid
# chmod 775 /mnt/raid

Nu kan vi begynde at installere alle de nødvendige pakker.
# pacman -S samba

Foruden at have en systemkonto skal Samba-brugere have en tekst i smbpasswd-filen. Det opnår man med:
# smbpasswd -a pcfraid

Når du redigerer og læser filen /etc/samba/smb.conf, er der nogle få ting, du måske vil slå til og fra. Først skal du redigere hosts allow-linjen, så Samba-adgang bliver begrænset til det lokale netværk (for eksempel 192.168. eller 192.168.0.) og kun loopback-interface. Ved enden af filen finder du sektionen Share Definitions. Lav en deling af dit array ved at tilføje den følgende blok:
[raid]
comment = PCF RAID
path = /mnt/raid
public = no
valid users = pcfraid
writable = yes

Senere kan du tilføje flere og lægge dem i raidusers-gruppen og indstille rettigheder. Hvis du vil oprette et offentligt område, der ikke kræver verifikation, skal du først lave en mappe:
# mkdir /mnt/raid/public

Gæsterettigheder er som standard kortlagt til den uprivilegerede bruger nobody. Hvis der er behov for skrive-adgang, skal du chmod 777 denne mappe og uncomment den sidste linje i den følgende share-definition:
comment = Guest area
path = /mnt/raid/public
public = yes
read only = yes
;writable = yes

Du kan også tillade skriveadgang udelukkende til brugere i raidusers-gruppen:
# chown pcfraid:raidusers
# chmod 775 /mnt/raid/public

og derefter tilføje det følgende inden i [public]-definitionen:
writelist = @raidusers

Nu kan vi starte Samba-tjenesterne og teste vores server:
# systemctl start {smbd,nmbd}

Du bør kunne få adgang til Samba-delingerne fra et hvilket som helst sted på dit netværk. Med nmbd-tjenesten kan du slå op i dine Samba-delinger med \hostname (Windows) eller smb://hostname (Mac/Linux) URI’er. Men det kan være følsomt, og du har måske større held med at bruge din ip-adresse her. Med Nautilus og Dolphin kan du browse i workgroups fra Network-sektionen.

Maskiner, der vil se SMB-shares, skal i det mindste have smbclient-pakken installeret for at kunne browse og åbne netværksdelinger. Hvis du ikke kan få adgang til dine delinger, ønsker vi dig held og lykke med fejlfindingen – testparm-kommandoen er et godt sted at begynde, for den tjekker din smb.conf for anomalier. Du kan så sætte disse tjenester til at starte automatisk ved at erstatte start med enable.

Hvis du vil tilgå din server automatisk fra en anden maskine på dit netværk, kan du tilføje en /etc/fstab-tekst i stil med det følgende:
//192.168.133.225/raid /mnt/raid cifs username=pcfraid, password=pass-
word 0 0

Det er naturligvis ikke sikkert at gemme kodeord på denne måde, så du bør kun bruge det på maskiner, der ikke bliver brugt af andre. Hvis Samba-tjenesten af den ene eller anden grund ikke kører, som om boksen er slukket, vil start på en maskine med en fstab-test som denne blive langsommere.

Luk op for verden

Sommetider er det ønskeligt at gøre et NAS tilgængeligt via internettet. Det er noget, man skal være varsom med, og man bør ikke gøre det ved hjælp af Samba. En metode består i at forwarde port 22 på sin router til ens NAS og skabe forbindelse via sftp. Sørg for, at du har låst SSH-server. Navnlig er linjen PermitRootLogin without-password

en god ide. Den begrænser rodadgang til offentlig nøgle, og du skal derfor generere en med ssh-keyen og føje den til filen /root/.authorized_keys. Du kan også slå rod-logins helt fra ved at sætte den ovennævnte funktion no, men i så fald er du nødt til at udføre alle admin-opgaver lokalt, det vil sige tilslutte tastatur og skærm og styre fra din NAS-boks.

Eftersom din eksterne ip-adresse sandsynligvis ændrer sig, skal du oprette et dynamisk DNS ved hjælp af en tjeneste som DuckDNS, dyndns eller no-ip. Med disse tjenester kan man køre et script eller klientprogram på sin maskine, og det opdaterer DNS-kortlægningen for ens ip-adresse. Hvis du opretter et cron-job, der gør det regelmæssigt, vil din maskine altid være tilgængelig med et konstant domænenavn. Det er nemt at tilslutte sig en af disse tjenester, men med DuckDNS kan du opdatere sagerne med et simpelt script, der passer godt til Arch KISS-filosofien. Følg anvisningerne i boksen, når du går i gang.

Størstedelen af tiden passer dit raid sig selv. Men hold øje med proc/mdstat – en tekst som [UUUU] fortæller, at alting er i orden. Hvis et drev svigter, får du i stedet et F på denne liste. Du kan også finde masser af oplysninger fra:
# mdadm --detail /dev/md0

De, der fortrækker en mere manuel tilgang til tingene, vil nyde regelmæssigt at "skrubbe" deres array. Det er der bestemt ikke noget i vejen med. Det indebærer tjek af inkonsekvenser mellem data og paritetsblokke, og forsøg på automatisk reparation af dem. Man foretager en skrubning på denne måde:
# echo check > /sys/block/md0/md/sync_action

Husk, at det tager et stykke tid. Med mdstat-filen kan man følge udviklingen, men hvis du på noget tids-punkt får brug for at stoppe, skal du køre dette:
# echo idle > /sys/block/md0/md/sync_action

Vi er desværre løbet tør for plads, men husk, at der er så meget mere, man kan gøre med sit NAS: Man kan bruge det som e-mailserver eller som en praktisk metode til deling af medier eller streaming af musik.

Bortset fra diske behøver du ikke at bekymre dig synderligt om hardware. Maskinen behøver ikke at være kraftig; der er ikke brug for smart grafik, og medmindre du vil bruge ZFS, er 4 GB ram mere end nok. HP Microservers er et populært valg, men de er ikke de mest stilfulde maskiner at se på.

Desuden er det sjovt at bygge en selv. Du har måske i forvejen et micro-ATX-kabinet og et bundkort liggende, og hvis du ikke har det, kan du lave et æstetisk tilfredsstillende mini-ITX-system uden videre udgifter. Hvis maskinen skal køre døgnet rundt, vil du nok gerne have støj-svage komponenter. Sørg for god luftstrøm omkring drevene, for de kan godt blive varme.

Vi valgte en kontroversiel løsning, nemlig en AMD Kabini 5350-APU (quad core, 2,05 GHz, R3-grafik). Kabini-serien, der sigter på det blomstrende marked for billigt udstyr, omfatter en lillebitte TDP på 25 W TDP, og overophedning bør derfor ikke være noget problem. Den indbyggede controller understøtter kun to SATA-drev, men 2-ports pci-e-kort er billige. Sørg blot for at få et, der understøtter FIS-baseret switching (dvs. intet baseret på ASM1061-chippen). Hvis du fore-trækker chipzilla, er J1900 Celeron en lige så god og billig cpu at satse på. Der findes mas-ser af Mini-ITX-bundkort, som har den indbygget. Ligesom AM1-kortene kan nogle af dem tage imod strøm fra en standard-laptopblok på 19 V.

Du vil møde denne advarsel, hver gang du beskæftiger dig med raid, men vi gentager den alligevel: Raid er ikke det samme som backup! Raid er kun den forreste forsvarslinje og kan ikke beskytte dig mod uønskede sletninger (eller mod brand, elektromagnetisk puls eller skumle troldmænd). Hvis dine data virkelig er vigtige, skal du tage backup uden for maskinen, og det er nok umagen værd at aflive nogle myter om dette emne.

Man kan få dedikerede hardware-raid-controllere, men de er dyre. I de fleste tilfælde er de ikke nødvendige – der er en lille processorbelastning i forbindelse med beregning af paritetsbits, men på moderne hardware er det minimalt. Desuden bruger hardware-controllere typisk specielle diskformater. Hvis ens controller svigter, skal man erstatte den med en magen til for at få adgang til sine diske. Man kan få adgang til et software-raid-array fra ethvert Linux-styresystem via mdadm-kommandoen.

Hardware-raid-controllere kan også være meget følsomme over for SATA-drevkompatibilitet. Med software-raid er det sådan, at hvis styresystemet kan se drevet, kan det også raide det.

Endelig hævder dit bundkort måske at understøtte forskellige raid-konfigurationer. Det er det, der er kendt som FakeRAID eller sommetider host-raid. På trods af det lidt nedsættende navn (kortets controller videresender alle raid-beregningerne til cpu'en) er der tale om en robust løsning (selvom den som regel kun understøtter raid 0, 1 og 10), og med den kan du stripe dit bootdrev og i nogle tilfælde endda gendanne dit array fra BIOS. Sommetider kræver gendannelsen dog, at du går tilbage til Windows' trygge favn.

Du kan knytte dig til DuckDNS-tjenesten på www.duckdns.org ved at oprette en speciel konto. Skift til pcf-raid-brugeren, og opret vores DuckDNS opdater-script:
# su pcfraid
$ mkdir ~/duckdns
$ cd duckdns
$ nano duck.sh

Skriv det følgende, idet du erstatter domæner og tokens.
echo url=”https://www.duckdns.org/update?domains=your_domain&token=your_
token&ip=” | curl -k -o ~/duckdns/duck.log -K -

Så gør du det eksekverbart og laver en testkørsel:
$ chmod 700 duck.sh
$ ./duck.sh

Du bør få noget output fra curl, og forhåbentlig rummer duck.log-filen nu det opmuntrende ord OK. For at køre det automatisk skal du installere en cron daemon. Vi bruger det enkle cronie
# pacman -S cronie

Den næste kommando (der vender tilbage til pcfraid-brugeren) vil åbne en tom crontab (ved hjælp af nano-editoren):
$ EDITOR=nano crontab -e

Tilføj den følgende linje for at køre duck.sh hvert femte minut:
*/5 * * * * ~/duckdns/duck.sh >/dev/null 2>&1.

[themepacific_accordion]
[themepacific_accordion_section title="Fakta"]

Projektets mål

[/themepacific_accordion_section]
[/themepacific_accordion]