[Linux] Automount einer USB-HDD

Getestet wurde dieses Szenario mit der 250GB 2,5″ Platte von Western Digital

  • USB-HDD einstecken
  • per dmesg überprüfen, mit welcher Bezeichnung das Gerät erkannt wurde:


[1193554.686749] scsi 3:0:0:0: Direct-Access     WD       2500BEV External 1.05 PQ: 0 ANSI: 4
[1193554.699581] sd 3:0:0:0: [sdd] 488397168 512-byte logical blocks: (250 GB/232 GiB)
[1193554.717072] sd 3:0:0:0: [sdd] Write Protect is off
[1193554.722065] sd 3:0:0:0: [sdd] Mode Sense: 21 00 00 00
[1193554.722074] sd 3:0:0:0: [sdd] Assuming drive cache: write through
[1193554.730049] sd 3:0:0:0: [sdd] Assuming drive cache: write through
[1193554.736373]  sdd: sdd1
[1193554.793698] sd 3:0:0:0: [sdd] Assuming drive cache: write through
[1193554.800039] sd 3:0:0:0: [sdd] Attached SCSI disk

  • Hier wurde das Gerät sdd1 genannt. Da sich diese Bezeichnung aber dynamisch ändert, kann diese nicht als eindeutige Marke für das Gerrät verwendet werden.
  • Um solch eine zu finden, muss man sich mehr Informationen über das Gerät beschaffen, dies geht hiermit:


udevadm info --name /dev/sdd1 --attribute-walk

  • Jetzt muss man den Abschnitt raussuchen, welcher ATTRS{model}==”2500BEV External” enthält:


looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.3/1-1.3:1.0/host3/target3:0:0/3:0:0:0':
KERNELS=="3:0:0:0"
SUBSYSTEMS=="scsi"
DRIVERS=="sd"
ATTRS{device_blocked}=="0"
ATTRS{type}=="0"
ATTRS{scsi_level}=="3"
ATTRS{vendor}=="WD      "
ATTRS{model}=="2500BEV External"
ATTRS{rev}=="1.05"
ATTRS{state}=="running"
ATTRS{timeout}=="30"
ATTRS{iocounterbits}=="32"
ATTRS{iorequest_cnt}=="0x46"
ATTRS{iodone_cnt}=="0x46"
ATTRS{ioerr_cnt}=="0x0"
ATTRS{modalias}=="scsi:t-0x00"
ATTRS{evt_media_change}=="0"
ATTRS{queue_depth}=="1"
ATTRS{queue_type}=="none"
ATTRS{max_sectors}=="240"

  • aufgrund dieser Daten eine neue udev-regel erstellen.
  • ins Verzeichnis /dev/.udev/rules.d wechseln
  • die Datei 10-local.rules erstellen und folgenden Inhalt einfügen:


# 250 GB 2,5" WD-HDD
KERNEL=="sd*", SUBSYSTEMS=="scsi", ATTRS{model}=="2500BEV External", SYMLINK+="usb_hd%n", RUN+="/bin/mount /dev/usb_hd%n /mnt/wd_250"

  • Hier muss man nun unterscheiden. Diese Regel funktioniert in meinem Fall, weil ich keine andere Festplatte von WD besitze. Wenn man das gleiche Modell nun hätte, müsste man statt des Attributs ATTRS{model} ATTRS{serial} nehmen.
  • /mnt/wd_250 ersetzt man durch seinen eigenen Mountpoint, der heißt nur bei mir so.
  • Damit auch nach einem Neustart noch gemountet wird, muss die datei noch nach /etc/udev/rules.d kopiert werden.


cp 10-local.rules /etc/udev/rules.d/

Thats it!

Remote Backup eines Linux-Servers mit SSH

  • Lege auf dem Server, auf dem du die Backups des entsprechenden Servers ablegegen willst, den User “backupid” an.
  • der User muss per public/private Key Authentifizierung auf die zu backupende Server kommen.
  • unter dem home-Verzeichnis von backupid einen ordner für die script anlegen, zb bin.

eine Datei mit dem Namen backup-dirs.sh erstellen und folgenden Inhalt einfügen:


#!/bin/bash
HOSTNAME=$1
CONFIGDIR=`echo $(dirname $0)`
BACKUPDIR_LOCAL=/home/backupid/backupdir
DATE=`date +%d-%m-%Y`


if [ "$HOSTNAME" == "" ]
then
echo error: please enter a hostname
exit 1
else
echo hostname ok > /dev/null
fi


PORTACCESSIBLE=`nmap -p 22 $HOSTNAME | grep "22/tcp open ssh" | wc -l`


if [ "$PORTACCESSIBLE" -eq 0 ]
then
echo "error: ssh port not accessible on $HOSTNAME"
exit 1
else
echo "ssh port is reachable on $HOSTNAME" > /dev/null
fi


if [ -e "$CONFIGDIR"/"$HOSTNAME".cfg ]
then
echo "config file for $HOSTNAME found" > /dev/null
else
echo "error: no config file for $HOSTNAME found"
exit 1
fi


CONFIGLINES=`cat "$CONFIGDIR"/"$HOSTNAME".cfg | wc -l`


if [ "$CONFIGLINES" -eq 0 ]
then
echo "error: config file is empty for $HOSTNAME"
exit 1
else
echo "config file is ok for $HOSTNAME" >/dev/null
fi


mkdir -p "$BACKUPDIR_LOCAL"/$HOSTNAME


rm -rf /tmp/"$HOSTNAME"-ssh-script.sh 1>/dev/null 2>&1
rm -rf /tmp/"$HOSTNAME"-filelist 1>/dev/null 2>&1
echo "#!/bin/bash" > /tmp/"$HOSTNAME"-ssh-script.sh
touch /tmp/"$HOSTNAME"-filelist


if [ -e /tmp/"$HOSTNAME"-ssh-script.sh ]
then
echo "temporary ssh backup script for $HOSTNAME successfully created" > /dev/null
else
echo "error: creation of temporary ssh backup script for $HOSTNAME failed"
exit 1
fi


while read line
do
LINE2=`echo $line | sed 's/\//-/g'`
echo "ssh root@"$HOSTNAME" "tar -cz \"$line\"" | dd of="$BACKUPDIR_LOCAL"/"$HOSTNAME"/"$HOSTNAME"-"$DATE""$LINE2".tar.gz" >> /tmp/"$HOSTNAME"-ssh-script.sh
echo "$BACKUPDIR_LOCAL"/"$HOSTNAME"/"$HOSTNAME"-"$DATE""$LINE2".tar.gz >> /tmp/"$HOSTNAME"-filelist
done < "$CONFIGDIR"/"$HOSTNAME".cfg chmod 750 /tmp/"$HOSTNAME"-ssh-script.sh /tmp/"$HOSTNAME"-ssh-script.sh 1>/dev/null 2>/dev/null


while read line
do
TARLINECOUNT=0
TARLINECOUNT=`tar -tf $line | wc -l`


if [ "$TARLINECOUNT" -eq 0 ]
then
echo "error: $line seems to be empty"
else
echo "$line is ok" > /dev/null
LINE_TO_DEL=`echo $line | sed 's/..-..-....-/*/' | sed 's/backupdir/backupdir.backupsrv/'`
rm $LINE_TO_DEL
cp $line /home/backupid/backupdir.backupsrv/$HOSTNAME
fi


done < /tmp/"$HOSTNAME"-filelist


exit 0

 

  • danach legt man im gleichen Ordner eine Config Datei an, welche entweder der Hostname oder die Ip-Addresse des zu backupenden Hosts als Namen besitzt.

z.b 192.168.1.10.cfg

dort schreibt man die zu sichernden Verzeichnisse hinein.

zb.

/home
/etc
/var
/root

wenn man das Script automatisch einmal pro Tag ausführen will ruft man es unter dem User backupid folgendermaßen auf:


crontab -e


0 5 * * * /home/backupid/bin/backup-dirs.sh

[Ubuntu] TimeMachine Backup mit Netatalk + Avahi

Hallo,

viele Besitzer eines Macbooks/iMacs mögen sich vielleicht fragen, wie man TimeMachine dazu bringt zu sichern wenn man
a) kein QNAP-NAS o.ä besitzt
und
b) nicht auf eine USB-HDD sichern möchte

Die Lösung hierfür lautet:

Ubuntu System mit Netatalk und Avahi!

Here we go:

Zuerst holt man sich das Pgpgpg-Package, damit erkennt das System Pakete, die mit einem Schlüssel versehen wurden.
Ist möglicherweise Schwachsinn, bei mir hats einmal nicht ohne funktioniert, aber schaden kanns auf jeden Fall auch nicht.

sudo apt-get install pgpgpg

Installation Netatalk

  • Sources Verzeichnis erstellen

sudo mkdir -p ~/src/netatalk
cd ~/src/netatalk

  • Netatalk Sources über Repositorys laden

sudo apt-get source netatalk
sudo apt-get build-dep netatalk
cd netatalk-2.0.5/

  • Netatalk zusammenbauen

Anmerkung: Netatalk wird hier mit ssl gebuildet, dies ist unbedingt erforderlich, da neuere Versionen von OSX nur noch Anmeldung am Share per ssl zulassen!
sudo DEB_OPTIONS=ssl dpkg-buildpackage -us -uc
sudo debi
echo “netatalk hold” | sudo dpkg –set-selections

Netatalk konfigurieren

  • Anpassen der defaults

Folgende Anpassungen in der Datei /etc/default/netatalk vornehmen:

sudo vi /etc/default/netatalk

ATALKD_RUN=no
PAPD_RUN=no
CNID_METAD_RUN=no
AFPD_RUN=yes
TIMELORD_RUN=no
A2BOOT_RUN=no

  • Danach müssen die Apple Volumes definiert werden, dazu folgende Datei edieren:

sudo vi /etc/netatalk/AppleVolumes.default

  • Wenn man die Home-Verzeichnisse der User freigeben möchte folgende Zeile einfügen:

~/ “$u” allow:user1 cnidscheme:cdb //Der User hier ist durch einen gültigen User auf dem Ubuntu Server zu ersetzen

  • Erstellen des TimeMachine-Ordners im Homelaufwerk von User1

cd /home/user1

mkdir TimeMachine

  • Eintragen des TimeMachine-Volumes

sudo vi /etc/netatalk/AppleVolumes.default

/home/user1/TimeMachine TimeMachine allow:user1 cnidscheme:cdb options:tm,upriv

  • Netatalk neustarten

sudo /etc/init.d/netatalk restart

Nsswitch.conf konfigurieren

sudo vi /etc/nsswitch.conf

folgende Line ans Ende hinzufügen:

hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4 mdns

Avahi konfigurieren

  • neue Datei erstellen:

sudo vi /etc/avahi/services/afpd.service

  • folgendes reinkopieren:

<?xml version=”1.0″ standalone=’no’?><!–*-nxml-*–>
<!DOCTYPE service-group SYSTEM “avahi-service.dtd”>
<service-group>
<name replace-wildcards=”yes”>%h</name>
<service>
<type>_afpovertcp._tcp</type>
<port>548</port>
</service>
<service>
<type>_device-info._tcp</type>
<port>0</port>
<txt-record>model=Xserve</txt-record>
</service>
</service-group>

  • Avahi neustarten

sudo /etc/init.d/avahi-daemon restart

Portfreigaben einrichten

sudo ufw allow afpovertcp

sudo ufw allow 14013/tcp

  • auf macbook folgende zeile über terminal eingeben:

defaults write com.apple.systempreferences TMShowUnsupportedNetworkVolumes 1