Backup CH3SNAS naar aangesloten USB drive

 

Backup CH3SNAS naar aangesloten USB drive

Probleemstelling

In huis draaien twee NAS’sen van Conceptronic, beide van het type CH3SNAS. In de tijd dat er nog maar één was werd deze gebackupped met het programma IdleBackup. Met dit programma wordt een schijf gesynchroniseerd met een andere schijf op het moment dat de computer wel aanstaat maar niet wordt gebruikt. Alles is volledig te configureren ten aanzien wat wel moet of niet worden opgeslagen en waar naartoe. Een ideaal programma, maar de problemen onstonden toen de tweede NAS kwam. Met IdleBackup kan slechts één schijf worden gesynchroniseerd en om een andere te synchroniseren moet alles opnieuw worden ingesteld. Dus zette ik af en toe een andere oude PC aan om van de tweede NAS een backup te maken.

De CH3SNAS beschikt over een USB poort, maar deze is in principe alleen voor het aansluiten van een printer te gebruiken. Maar tijdens een zoektocht naar de oplossing voor mijn backup probleem stuitte ik op een paar artikelen die mijn probleem zouden oplossen.

Stap 1: Een externe harde schijf op de CH3SNAS aansluiten

Bron: http://frankveldink.wikispaces.com/Conceptronic

Funplug installatie
Onderstaande installatie installeert de Fonz funplug waarmee de CH3SNAS naar eigen wens kan worden aangepast. Naast het onderstaande kan met deze funplug nog veel meer worden gedaan. Zo gebruik ik ‘m bijvoorbeeld ook om een Twonky media server te laten draaien. Deze is namelijk een stuk uitgebreider dan de standaard media server op de CH3SNAS.

  • Download de Fonz funplug 0.5 hier en plaats ‘fun_plug’ en ‘fun_plug.tgz’ op Volume_1 van de NAS.
  • Reboot de NAS waarna ‘fun_plug.tgz’ automatisch wordt uitgepakt en vervolgens verwijderd (duurt een paar minuten).
  • Via telnet is de NAS nu bereikbaar. (dit kan ook via Putty: let op poort 23!) Telnet is niet altijd beschikbaar, maar kan via het configuratiescherm als extra windows onderdeel worden aangezet. 2013-01-12_19-52-31

 

Open een terminal scherm (Windows toets + R, dan typ ‘cmd’)

# telnet 192.168.1.41

(of een ander adres waarop je NAS is aangesloten)

Met de volgende commando’s worden een aantal internet locaties (repositories) benaderd om packages van te downloaden. Deze plaatsen we in een aan te maken custom directory.

 

# cd /mnt/HD_a2/ffp
# mkdir custom
# cd custom
# rsync -av inreto.de::dns323/fun-plug/0.5/packages .
# rsync -av –delete wolf-u.li::ffp/additional .
# rsync -av –delete inreto.de::dns323/fun-plug/0.5/extra-packages/All .

 

USB installatie
De CH3SNAS heeft geen kernelmodule voor USB en zal zelf moeten worden toegevoegd. Daarna wordt deze in het opstartproces geplaatst, zodat USB automatisch gemount wordt bij opstarten.

  • Download deze module als volgt (verwijder de brackets):

# cd /mnt/HD_a2/ffp/custom

# wget [[http://www.domaigne.com/download/dns-323/usb-storage.ko]]

  • Laad de USB module:

# insmod usb-storage.ko

  • Sluit de USB-schijf aan op de CH3SNAS en check of dit succesvol gebeurd:

# dmesg

  • Dit zou er ongeveer als volgt uit moeten zien:

usb 1-1: new high speed USB device using ehci_platform and address 3

scsi3 : SCSI emulation for USB Mass Storage devices

usb-storage: device found at 3

usb-storage: waiting for device to settle before scanning

  Vendor: Kingston  Model: DataTraveler 2.0  Rev: 1.00

  Type:   Direct-Access                      ANSI SCSI revision: 02

SCSI device sdb: 2007040 512-byte hdwr sectors (1028 MB)

sdb: Write Protect is off

sdb: Mode Sense: 23 00 00 00

sdb: assuming drive cache: write through

SCSI device sdb: 2007040 512-byte hdwr sectors (1028 MB)

sdb: Write Protect is off

sdb: Mode Sense: 23 00 00 00

sdb: assuming drive cache: write through

 sdb: unknown partition table

Attached scsi removable disk sdb at scsi3, channel 0, id 0, lun 0

Attached scsi generic sg1 at scsi3, channel 0, id 0, lun 0,  type 0

usb-storage: device scan complete

 

  • In dit geval is de USB-schijf naar sdb geconnect, omdat er 1 disk in de CH3SNAS zit die op sda is geconnect.
  • In het geval van 2 disken in de CH3SNAS, wordt de USB-schijf naar sdc geconnect en beide disken respectievelijk op sda en sdb.
  • Formateer de USB-schijf van FAT32 naar het EXT2 formaat met het commando mke2fs /dev/sdb (of sdc, maar let op!)

# mke2fs /dev/sdb

Hierna is de USB-schijf niet meer met een gewone Windows PC te lezen omdat Windows geen EXT2 ondersteunt. Dit is geen probleem wanneer u deze gewoon aangesloten houdt op de NAS, maar wanneer dat niet meer kan is het waarschijnlijk het eenvoudigst met een “live-cd” met een Linux systeem Linux op uw PC te draaien. Daarmee kan de USB schijf dan weer gewoon worden gelezen.

  • Na het formatteren moet de fun_plug worden aangepast d.m.v. vi om bij het opstarten de USB-schijf automatisch te mounten.

# vi /mnt/HD_a2/fun_plug

(VI is geen gewone editor. Met het typen van de letter a kunt u tekst toevoegen. Door dan op esc te drukken wordt deze modus weer verlaten. Door op de x te drukken worden letters verwijderd. Afsluiten met opslaan doet u met de karakters ‘:x’ en zonder opslaan met de karakters ‘:q!’)

  • De volgende code moet worden geplaatst net na het begin van de fun_plug:

insmod /mnt/HD_a2/ffp/custom/usb-storage.ko

mkdir /mnt/usb

#sleep for 15 sec to load the module

sleep 15

mount /dev/sdb /mnt/usb

  • Boot de CH3SNAS en controleer met het mount commando of de USB-schijf succesvol wordt gemount. Wanneer dat niet gebeurt kan het zijn dat 15 seconde te kort is. Verleng deze tijd om te kijken of het dan wel lukt.

Stap 2: De schijf zichtbaar maken in het netwerk

  • Vervolgens is Samba nodig om de USB-schijf toegankelijk te maken vanuit de Windows Verkenner.
  • Installeer de nieuwste versie van Samba.

# cd /ffp/custom/All

# funpkg -i samba*.tgz

# cp /etc/samba/smb.conf /mnt/HD_a2/ffp/etc/smb.conf

# vi /mnt/HD_a2/ffp/etc/smb.conf

Volgende tekst onderaan toegevoegd:

[USB_Stick]

comment = External USB stick

path = /mnt/usb

valid users =

read only = no

guest ok = yes

  • Bij het booten van de CH3SNAS wordt samba met specifieke config geladen zodat de USB-schijf automatisch gemount is. Op deze manier kan de harddisk(s) een spindown doen zodra het systeem inactief is.
  • Hiervoor moet een leeg bestand worden gemaakt, hernoemd naar restart_samba.sh en omgetoverd worden naar een script.

# cd /ffp/start

# echo > restart_samba.sh

# chmod 777 restart_samba.sh

# vi restart_samba.sh

 

Plaats de volgende tekst letterlijk in restart_samba.sh

#!/ffp/bin/sh

cp /ffp/etc/smb.conf /etc/samba/smb.conf

/usr/bin/smb restart

Stap 3: Een automatische backup laten maken

Bron: http://dns323.kood.org/howto:backup

Het onderstaande gaat er van uit dat funplug 0,5 of later is geïnstalleerd. Zo niet dan moet rsync nog worden geïnstalleerd:

Start dan een terminal sessie met telnet en type het volgende (dus niet nodig bij versie 0.5 of later):

cd /mnt/HD_a2

mkdir tmp

cd tmp

wget http://www.inreto.de/dns323/fun-plug/0.4/addons/rsync-2.6.9.tgz

funpkg.sh rsync-2.6.9.tgz

Nu zijn de volgende programma’s aanwezig:

  • vi – text editor
  • rsync – the backup program
  • cron – the scheduler

Snapshots aanmaken (RSync Time Machine)

Wanneer het erg veel bestanden zijn die moeten worden meegenomen in de backup wil je niet elke keer alle bestanden kopiëren. Daarom wordt gebruik gemaakt van hard-links. Hierbij wordt elke dag gekeken naar de backup directory van de vorige dag en gekeken of het betreffende bestand dat moet worden gekopieerd in die backup directory al aanwezig is. Als dat zo is dan wordt het bestand niet opnieuw gekopieerd maar wordt er alleen een hard link naar dat betreffende bestand op de back-up schijf gezet. Vanaf dat moment wordt er naar de feitelijke data vanuit meerdere backup-directories gewezen. Deze data wordt pas verwijderd wanneer er geen link meer naartoe bestaat.

Wanneer een bestand dat gebackupped moet worden nog niet bestaat in de backup directory van de vorige dag dan wordt dit bestand wel gekopieerd en wordt er alleen vanuit de nieuwe backup directory naar gewezen.

Deze functionaliteit zit in het rsync commando.

Om te bepalen met welke backup directory moet worden vergeleken wordt er een “symbolic link” met de naam current aangemaakt. Als de dagelijkse backup is afgerond wordt deze “symbolic link” verplaatst naar deze nieuwe backup directory

aanmaken snapshot.sh

De file snaphot.sh wordt aangemaakt in de /ffp/bin directory met vi /ffp/bin/snapshot.sh

Plaats daarin het volgende:

#!/bin/sh

 

# Set Source Path

# Back up the A drive (HD_a2)  by identifying the source path as /mnt/HD_a2

srcpath=/mnt/HD_a2

# Back up multiple directories by surrounding a list with single quotes (i.e., srcpath=’/mnt/HD_a2/Music /mnt/HD_a2/Docs’)

# srcpath=’/mnt/HD_a2/Music /mnt/HD_a2/Docs’

 

# Set the Destination Path

dstpath=/mnt/HD_b2/Backup_NAS

 

# Set path to Fun_Plug files

# Fun_Plug 3.0 or 4.0

# ffppath=/mnt/HD_a2/fun_plug.d

# Fun_Plug 5.0

ffppath=/ffp

 

date=`date “+%Y%m%d_%H%M%S”`

mkdir $dstpath/$date

 

$ffppath/bin/rsync -avx –link-dest=$dstpath/current $srcpath $dstpath/$date > $ffppath/log/snapshot.log 2>&1

 

var=`ls -1A $dstpath/$date | wc -l`

 

if [ $var -ne 0 ]

then

  rm $dstpath/current

  ln -s $date $dstpath/current

fi

De bovenstaande instructies tonen alleen het geval date en complete schijf A wordt gebackupped op een andere schijf B. Je kunt meerdere directories backuppen door deze tussen enkele quotes te plaatsen:

srcpath=’/mnt/HD_a2/Music /mnt/HD_a2/Docs’

Hetzelfde geldt voor de directory waar de backup naar toe moet:

dstpath=/mnt/HD_b2/backup

maak het script vervolgens “executable” door de attributen aan te passen:

chmod a+x /ffp/bin/snapshot.sh

Check tevens of de /ffp/log directory al bestaat en indien dat niet het geval is, maak deze aan:

mkdir /ffp/log


 

Stap 4: Automatisch laten starten

 

Vervolgens moet de file met de naam ‘editcron.sh’ worden aangemaakt, welke wordt gebruikt om de taak dagelijks uit te voeren met ‘cron’ Deze file wordt aangemaakt en opslagen in de start directory in de ffp directory. Hierdoor wordt deze automatisch opgestart.

Nadat je via telnet bent aangesloten op de CH3SNAS type je het volgende in:

vi /mnt/HD_a2/ffp/start/editcron.sh

Daarmee wordt de file aangemaakt en geopend om aan te passen. Ga door middel van de letter a naar de edit modus en type de volgende tekst ( of kopieer met kopiëren en plakken onder de rechter muistoets in het terminal scherm)

#!/bin/sh

CRONTXT=/mnt/HD_a2/crontab.txt

# start with existing crontab

/bin/crontab -l > $CRONTXT

# add the Rsync job to execute at 2:05 am

/bin/echo “5 2 * * * /ffp/bin/snapshot.sh” >> $CRONTXT

# install the new crontab

/bin/crontab $CRONTXT

# clean up

/bin/rm $CRONTXT

In dit voorbeeld wordt de backup taak elke nacht om 2:05 uur aangezet. Op deze manier kan elke willekeurige tijd worden opgegeven. Zo is ’30 18 * * *’bijvoorbeeld 18:30 of half zeven ’s avonds.

Ook deze code moet “executable” worden gemaakt:

chmod a+x /mnt/HD_a2/ffp/start/editcron.sh

Stap 5: Controleer of de taak is toegevoegd

Als het bovenstaande is uitgevoerd controleer dan of alles werkt

 1) Reboot de CH3SNAS.

2) Start Telnet en type crontab –l (kleine letter L). Als alles goed is gelukt moet er een volgende regel bij staan:

5 2 * * * /ffp/bin/snapshot.sh

Er zullen nog een aantal andere regels bij staan, deze zijn door de CH3SNAS zelf zijn toegevoegd en dat is correct.

Wanneer de geplande tijd nu voorbij komt zal de backup starten, elke nacht weer.

Step 6: Verifieer de backup

Wanneer je, onafhankelijk van de geplande backup wilt controleren of het werkt, kun je de backup starten met het commando /ffp/bin/snapshot.sh.

De eerste backup zal langer duren. Door af en toe de log file op HD_a2/ffp/log te bekijken kan goed worden bijgehouden wat de status is. Daarna kan worden gekeken hoe de backups worden opgeslagen:

# cd /mnt/HD_b2

# ls -al

Je ziet nu de eerste backup en de link naar deze zelfde backup met de naam current:

20080427_155301

current -> 20080427_155301

 

Na een aantal dagen zal het er als volgt uitzien:

20080427_155301

20080428_020001

20080429_020001

current -> 20080429_020001

Omdat ook hard links ruimte innemen is het verstandig af en toe wat backup directories te verwijderen (commando rm –rf  20080427_155301)

Mogelijke problemen

Bij hele grote hoeveelheden of hele grote bestanden kan de eerste backup enkele dagen duren. Omdat ’s nachts de backup nogmaals wordt gestart raakt het hierboven beschreven systeem wat van slag. Het is daarom aan te bevelen de cron file niet eerder te activeren dan dat de eerste backup een keer is gemaakt. Verplaats hiertoe het bestand editcron.sh tijdelijk naar een andere locatie dan de start directory.

Verdere verbeteringen

Probleem bij de bovenstaande aanpak is dat er erg veel backups worden gemaakt die je handmatig moet verwijderen. Daarom is gezocht naar een andere oplossing. Met de volgende aanpak worden de volgende backups gemaakt:

– dagelijks, resulterend in de backups met de namen Monday, Tuesday, Wednesday, Thursday, Friday, Saturday en Sunday. Elke backup wordt eenmaal per week verwijderd en opnieuw gemaakt
– 4 x per maand: 7, 14, 21 en 28 welke elke maand worden verwijderd en opnieuw worden gemaakt- elke maand: January, February etc. welke elk jaar worden vervangen. Deze backup wordt elke 1e van de maand gemaakt.

Voor de dagelijkse backup is in snapshot.sh (in /ffp/bin) de volgende aanpassing gemaakt:

# Set Source Path
# Back up the A drive (HD_a2)  by identifying the source path as /mnt/HD_a2
srcpath=/mnt/HD/HD_a2
# Back up multiple directories by surrounding a list with single quotes (i.e., s
# srcpath=’/mnt/HD_a2/Music /mnt/HD_a2/Docs’

# Set the Destination Path
dstpath=/mnt/USB/HD_c/Backup_NAS_W

# Set path to Fun_Plug files
# Fun_Plug 3.0 or 4.0
# ffppath=/mnt/HD_a2/fun_plug.d
# Fun_Plug 5.0
ffppath=/ffp

# date=`date “+%Y%m%d_%H%M%S”`
date=`date “+%A”`
dvar=`ls -1A $dstpath/$date | wc -l`
if [ $dvar -ne 0 ]
   then
   rm -r $dstpath/$date
fi

mkdir $dstpath/$date
$ffppath/bin/rsync -avx –link-dest=$dstpath/current $srcpath $dstpath/$date > $
var=`ls -1A $dstpath/$date | wc -l`
# if [ $var -ne 0 ]
# then
rm $dstpath/current
ln -s $date $dstpath/current
cp $srcpath/ffp/log/snapshot.log $dstpath/$date/

# fi

Voor de 4 maandelijkse backup is deze file gekopieerd naar snapshot_week.sh en is het aangepaste stuk als volgt:

# date=`date “+%Y%m%d_%H%M%S”`
date=`date “+%d”`
dvar=`ls -1A $dstpath/$date | wc -l`
if [ $dvar -ne 0 ]
   then
   rm -r $dstpath/$date
fi

En voor de maandelijkse backup is dat snapshot_month.sh met

# date=`date “+%Y%m%d_%H%M%S”`
date=`date “+%B”`
dvar=`ls -1A $dstpath/$date | wc -l`
if [ $dvar -ne 0 ]
   then
   rm -r $dstpath/$date
fi

De verschillen zitten alleen in de definitie van date. %A geeft de dag, %d de dag van de maand en %B de naam van de maand

Vervolgens worden deze bestanden op verschillende momenten aangeroepen. Dat gebeurt editcron.sh in /ffp/start waar een aantal regels worden toegevoegd. Het derde cijfer daarin is de dag van de maand.

/bin/echo “0 1 * * * /ffp/bin/snapshot.sh” >> $CRONTXT
/bin/echo “0 5 1 * * /ffp/bin/snapshot_month.sh” >> $CRONTXT
/bin/echo “0 5 7 * * /ffp/bin/snapshot_week.sh” >> $CRONTXT
/bin/echo “0 5 14 * * /ffp/bin/snapshot_week.sh” >> $CRONTXT
/bin/echo “0 5 21 * * /ffp/bin/snapshot_week.sh” >> $CRONTXT
/bin/echo “0 5 28 * * /ffp/bin/snapshot_week.sh” >> $CRONTXT

Opgetreden problemen en oplossingen

Natuurlijk ontstaan er in de loop van de tijd problemen. De backupschijf liep na verloop van tijd toch vol. Omdat het 2 TB betreft duurde het minimaal 3 dagen om een volledige nieuwe backup te maken op een nieuwe USB schijf. Daarom heb ik de gehele directory vanaf een linux systeem gekopieerd naar de nieuwe schijf.

Helaas werkte rsync daarna niet zoals gewenst. Ik heb allerlei dingen geprobeerd om het weer goed te laten lopen, waarbij ik niet meer weer welke oplossing de echte was. Maar vermoedelijk was het de wijziging van de owners van directories en bestanden. De directories moest root:root zijn en die van de bestanden nobody:501

Dit heb ik gewijzigd door boven in het commando chown -R nobody:501 <directory> te geven en daarna met find <directory> -type d -exec chown root:root ‘{}’ \;

alle directories aan te passen. En daarna deed die het weer, zij het dat in de log ook alle directories worden vermeld.

Achteraf bleek dat de directories nadat ze volledig waren ook de eigenaar nobody:501 kregen, dus de find actie was overbodig, maar blijft wel leuk om te vermelden