Tag Archives: fileserver

Große Datenbestände mit lftp synchronisieren

Im letzten Artikel zum File Transfer Protocol wurde die moderne Einrichtung eines FTP-Servers vorgestellt. Jetzt soll ein Verzeichnis des FTP-Servers mit einem lokalen Server synchronisiert werden.

Besonders der Maximaldurchsatz soll dabei errreicht werden. Dazu bieten viele Windows FTP-Clients zwei Modi an.

  • Segmentiert
    bedeutet, dass eine Datei in logische Abschnitte geteilt und mit mehreren Verbindungen heruntergeladen und auf dem Zielcomputer zusammengesetzt wird.
  • Threaded
    bedeutet mehrere Dateien gleichzeitig über mehrere Datenverbindungen herunterzuladen.

Sowohl Threaded wie auch Segmented Übertragungen sollen gegebenfalls vorhandene Durchsatzprobleme bei Verwendung einer einzigen Verbindung umgehen. Das geht doch auch mit Linux?

Im folgenden wird ein Skript vorgestellt, dass lftp so in einer screen Sitzung startet, dass die Vorteile der Segmented und Threaded Verfahren zusammen mit den Vorteilen einer Hintergrundsitzung bietet. Dabei kommt der FTP-Client lftp zum Einsatz, der sich zur Automatisierung besonders gut eignet, weil er umfangreiche Konfigurationsmöglichkeiten bietet.

lftp Konfigurieren

Zuerst muss die notwendige Software installiert werden.

apt-get install lftp screen

Bevor das Skript eingesetzt werden kann, muss lftp konfiguriert werden, indem im Verzeichnis ~/.lftp/ des ausführenden Benutzers eine Datei rc mit folgendem Inhalt angelegt wird.

# GENERAL
set color:use-color true

# FTP
set ftp:list-options -a
set ftp:passive-mode true
# Send multiple commands async.
set ftp:sync-mode false

# SEGMENTED
set pget:default-n 4
set pget:save-status 30

# DIRECTORES
set mirror:order "*.txt [rR]eadme"
set mirror:use-pget-n 4
set mirror:parallel-transfer-count 2
set mirror:parallel-directories true

# Always SSL!
set ftp:ssl-force true

# Foreground cmds first!
set net:connection-takeover true
# Disconnect after 30mins idle!
set net:idle 1800
# Max 32 connections to everywhere!
set net:connection-limit 32

Synchronisations-Skript

Das folgende Skript synchronisiert das Verzeichnis REMOTE_DIR mit dem Verzeichnis LOCAL_DIR. Dafür wird eine screen Sitzung mit dem Namen lftp-sync im Hintergrund gestartet, in der lftp gestartet wird. An diese Sitzung sendet das Skript den mirror Befehl und beendet sich nach dem sichergestellt ist, dass eine solche Sitzung auch existiert.

#!/bin/bash

# Information about the source
HOST="123.123.123.123"
PORT=21
USER="sync"
PASS="foobar"

# download target
LOCAL_DIR="/mnt/123.123.123.123/forschungsdaten"

# source dir
REMOTE_DIR="/forschungsdaten"

function lftpcmd()
{
screen -S lftp-sync -p 0 -X stuff "$1"`echo -ne '\015'` 2>&1 >> /dev/null
}
function lftpkill()
{
screen -ls lftp-sync | grep lftp-sync | cut -d "." -f 1 | sed -e 's/^[ \t]*//' | xargs kill -9 $1
screen -wipe
}

# Start background lftp session if none or more than 1 is found running
if ! [ "`screen -ls lftp-sync | lftp-sync | wc -l`" -eq 1 ]; then
if [ "`screen -ls lftp-sync | grep lftp-sync | wc -l`" -gt 1 ]; then
lftpkill
fi
# Start a new session
screen -dmS lftp-sync lftp
# Set up the connection using commands sent to screen
lftpcmd "open ftp://$USER:$PASS@$HOST:$PORT/"
fi

# Add a new sync to the queue
lftpcmd "queue mirror -x ^\Incoming/$ -p \"${REMOTE_DIR}\" \"${LOCAL_DIR}\""

vsftpd mit virtuellen Benutzern, FXP und Verschlüsselung in 5 Minuten

Manchmal möchte man Benutzern einen FTP-Zugang zur Verfügung stellen, aber nicht gleich einen Systemzugang anlegen. Das geht mit vsftpd besonders einfach. Vorraussetzung ist eine funktionierende Installation von vsftpd und einige kleine Anpassungen. Natürlich darf auch die Sicherheit und nützliche Zusatzfunktionen wie FXP nicht zu kurz kommen.

Zuerst werden alle nötigen Programme installiert.

apt-get install vsftpd apache2-utils ssl-cert libpam-pwdfile

Es muss die Datei /etc/vsftpd.conf wie folgt angepasst werden.

listen=YES
local_enable=YES
write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/private/vsftpd.pem

# Virtuelle Benutzer verwenden
nopriv_user=shared
virtual_use_local_privs=YES
guest_enable=YES
user_sub_token=$USER
local_root=/home/shared/pub
chroot_local_user=YES
hide_ids=YES

# FXP erlauben
pasv_promiscuous=YES
pasv_enable=YES
pasv_min_port=49152
pasv_max_port=50000
port_promiscuous=YES

# SSL fuer Daten- und Kontrollverbindung erzwingen
ssl_enable=YES
force_local_data_ssl=YES
force_local_logins_ssl=YES

# Kleiner Scherz ;) (http://www.exploit-db.com/exploits/15449/)
ftpd_banner=ProFTPD 1.3.3a

Diese Konfigurationsdatei erlaubt es allen angelegten Benutzern das Verzeichnis /home/shared zu sehen. Soll jeder Benutzer nur ein eigenes Verzeichnis sehen können, muss die Option local_root auf den Wert /home/shared/pub/$USERgesetzt werden.

Dann wird das selbst-signierte SSL-Zertifikat für vsftpd angelegt.

make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/ssl/private/vsftpd.pem

Nun muss die PAM-Authentifizierung von vsftpd angepasst werden, sodass vsftpd die Daten aus einer Datei liest. Dafür wird der Inhalt der Datei /etc/pam.d/vsftpd gelöscht und durch folgenden Inhalt ersetzt.

auth required pam_pwdfile.so pwdfile /etc/ftpd.passwd
account required pam_permit.so

Die genannte Datei /etc/ftpd.passwd kann durch das Werkzeug htpasswd mit Benutzern und Passwörtern befüllt werden.

# Für den ersten Benutzer
htpasswd -c /etc/ftpd.passwd user1
# Für alle folgenden Benutzer
htpasswd /etc/ftpd.passwd userN

Nach einem Neustart von vsftpd mittels dem Befehl /etc/init.d/vsftpd restart ist der neue FTP-Server einsatzbereit.

Transmission uTP and UDP buffer optimizations

Recently in debug mode on a box running Transmission to seed BackTrack Torrents:

[17:42:40.319] UDP Failed to set receive buffer: requested 4194304, got 262142 (tr-udp.c:75)
[17:42:40.319] UDP Please add the line "net.core.rmem_max = 4194304" to /etc/sysctl.conf (tr-udp.c:80)
[17:42:40.319] UDP Failed to set send buffer: requested 1048576, got 262142 (tr-udp.c:86)
[17:42:40.319] UDP Please add the line "net.core.wmem_max = 1048576" to /etc/sysctl.conf (tr-udp.c:91)

This message tries to tell us, that for some reason, Transmission would like to have 4 Megabytes of receive buffer and 1 Megabyte send buffer for it’s UDP socket. It turns out that the support for uTP, the uTorrent transport protocol, is implemented using a single socket.

By tuning the two variables, higher throughput can be achieved more easily using uTP.

Here is the relevant part from the changeset:

Since we’re using a single UDP socket to implement multiple uTP sockets,
and since we’re not always timely in servicing an incoming UDP packet,
it’s important to use a large receive buffer. The send buffer is probably
less critical, we increase it nonetheless.

Four Megabyte might seem huge for embedded clients, but running behind a fast dedicated connection, it might even be too small when Transmission has to handle hundreds of connections. I recommend to use 16 Megabyte for receive buffering and 4 for the send buffer. That is, because uTP implements a retransmission algorithm and by scaling up the buffers we achieve less retransmits because of dropped datagrams. Let’s set it up that way.

echo 'net.core.rmem_max = 16777216' >> /etc/sysctl.conf
echo 'net.core.wmem_max = 4194304' >> /etc/sysctl.conf
sysctl -p

OVH Server from Scratch mit Debian und dm-crypt Verschlüsselung

Diese Anleitung entspricht nicht mehr dem maximal möglichen Standard an Sicherheit. Dafür empfehle ich mein Konzept Tauchfahrt mit Linux.

1. Grundsätzliches

Dieses Howto beschreibt die Installationen von Debian Squeeze auf einem OVH Server im Rescue Modus. Der Server ist nach der Installation weder abgesichert noch entspricht er dem ‘Standard’ von OVH.

Das bedeutet:

  • Kein Supportkey von OVH
  • Kein Realtime-Monitoring durch OVH
  • Kein OVH-Kernel
  • Download von Paketen nicht über OVH
  • Direkter SSH-Zugang als Superuser root

Darum empfehle ich dringend die Authentifikation per SSH Publickey. Einen Artikel darüber gibt es hier.

Das Ergebnis ist ein Minimalsystem für einen Fileserver, der folgende Eigenschaften hat.

  • Möglichst unabhängig von OVH-Infrastruktur
  • Minimalsystem
  • Großer verschlüsselter Datenbereich in /home

Das HowTo basiert auf dem Squeeze from Scratch HowTo von Sven Richter.

Weiterlesen

TeVii S470 Probleme unter Linux

Problem

Die TeVii S470 ist eine von Linux unterstützte TV-Karte für DVB-S und DVB-S2. Möchte man meinen, denn die unterschiedlichen Qualitäten von unterstützt variieren recht stark. Die Karte meldet sich beim ersten Start mit einem Kernel, der den cx23885 Treiber enthält, wie folgt.

[ 1013.287267] ds3000_firmware_ondemand: Waiting for firmware upload (dvb-fe-ds3000.fw)...
[ 1013.288650] ds3000_firmware_ondemand: Waiting for firmware upload(2)...
[ 1013.288716] ds3000_firmware_ondemand: No firmware uploaded (timeout or file not found?)
[ 1013.288800] ds3000_initfe: Unable initialize firmware

Lösung

Die Firmware fehlt, was sich leicht mit den folgenden Befehlen aus dem LinuxTV Wiki beheben lässt.

wget -c http://tevii.com/tevii_ds3000.tar.gz
tar xfv tevii_ds3000.tar.gz
sudo cp tevii_ds3000/dvb-fe-ds3000.fw /lib/firmware/

Ein beherztes rmmod cx23885;modprobe cx23885 später sieht es so aus, als würde die Karte korrekt initialisiert werden, wie folgt abgebildet.

[ 1888.760338] cx23885 driver version 0.0.3 loaded
[ 1888.761407] CORE cx23885[0]: subsystem: d470:9022, board: TeVii S470 [card=15,autodetected]
[ 1888.889528] cx23885_dvb_register() allocating 1 frontend(s)
[ 1888.889563] cx23885[0]: cx23885 based dvb card
[ 1888.890963] DS3000 chip version: 0.192 attached.
[ 1888.890994] DVB: registering new adapter (cx23885[0])
[ 1888.891026] DVB: registering adapter 0 frontend 0 (Montage Technology DS3000/TS2020)...
[ 1888.919252] TeVii S470 MAC= 00:18:bd:5b:28:2e
[ 1888.919284] cx23885_dev_checkrevision() Hardware revision = 0xb0
[ 1888.919319] cx23885[0]/0: found at 0000:05:00.0, rev: 2, irq: 19, latency: 0, mmio: 0xfe000000

Dem ist aber nicht so. Der Trick mit dieser Karte besteht darin, einen Kaltstart durchzuführen. Also einmal den Computer komplett ausschalten und händisch wieder in Betrieb nehmen.

Erst dann wird die Firmware auf die Karte geladen und die Karte kann benutzt werden. Die Lösung des Problems ist bereits durch Nico dokumentiert worden. Schade, dass es mir erst zwei Stunden nach Lösung ins Auge fiel.

rsync,ssh,tar und socat – Große Datenbestände kopieren

Manchmal muss es etwas schneller sein als sonst. Gerade wenn man mit einem zehn Jahre alten Datenbestand von einem Computer auf einen anderen umziehen möchte.

Wie ist dabei der Maximaldurchsatz zu erreichen?

Am Transfer großer Datenbestände sind in erster Linie zwei Komponenten zwangsweise beteiligt. Das Festplatten-Subsystem und das Netzwerk-Subsystem der zu synchronisierenden Computer.

Standardlösung

Da das Problem nicht neu ist und sich selbst in Lehrbüchern wiederfindet gibt es eine Standardlösung: rsync.

rsync -ar --stats --progress /home/meinBenutzer/*Ü meinBenutzer@neuerComputer:~/

Soll es mit rsync, dass auf SSH für den Transfer setzt, schneller gehen, passt man die Chiffre an. Das funktioniert durch die Option -e "ssh -c arcfour", die den RC4 Stromchiffre verwendet. Der Durchsatz steigt, aber erreicht aufgrund des Overheads der Verschlüsselung und der Integritätsprüfungen, die rsync bietet nicht Netzwerk- oder Festplatten-Maximaldurchsatz.

Mehr Power!

Der Maximaldurchsatz der Festplatte lässt sich erreichen, indem die lesenden und schreibenden Operationen sequentiell durchgeführt werden. Ein Programm, dass die Daten sequentiell liest ist tar. Indem man tar anweist, das erzeugte Archiv auf die Standardausgabe zu senden, kann es über das LAN transportiert werden. Um hierbei den Prozessor nicht einzuspannen, erfolgt die Übertragung unverschlüsselt und unkomprimiert mit socat.

Das geht wie folgt:

Auf dem Server (Empfänger)

socat tcp-listen:31337,rcvbuf=67108864,dontroute stdout | tar xvf - -C ./

Auf dem Client (Sender)

tar cvf - ./* | socat stdin tcp:192.168.my.ip:31337,sndbuf=67108864,dontroute

Erwähnenswert ist besonders die Option dontroute, durch die sichergestellt wird, dass der Datenverkehr der sensiblen privaten Daten nicht das lokale Netz verlässt. Mit den Optionen rcbuf und sndbuf werden die TCP-Puffer auf beiden Seiten vergrößert und das Auto-Tuning des Kernels umgangen.

Fazit

Durch die Vermeidung von Verschlüsselung, Komprimierung und der manuellen Vergrößerung der Sende- und Empfangspuffer sollte theoretisch jetzt der Maximaldurchsatz erreicht werden können. Bei einem sehr unwissenschaftlichen Test bestätigte sich die Vermutung, dass socat mit tar schneller ist.

Beim Kopieren von 560 Gigabyte von einem mit 170 MB/sec lokal gemessenen Software-RAID1 zu einem 411 MB/sec lokal gemessenen Software-RAID1 erreichte rsync einen Maximaldurchsatz von 340 MBit/sec, tar mit socat reizte die vollen 988 MBit/sec aus.

Transmission auto-delete Quota Skript

Möchte man immer die aktuellsten frei zugänglichen Linux-Distributions Torrents herunterladen, um andere Nutzer durch die eigene Bandbreite zu unterstützen, wird irgendwann die Festplatte voll. Dieses Skript schafft Abhilfe.

#!/bin/bash
# transmission-quota.bash
#
# FIFO quota for transmission-daemon.
# This script forces a maximum size upon
# your transmission download directory
# by deleting the oldest torrent, until
# the quota is met again.
#
# Run regularily from cron:
# */5 * * * *     /home/torrent/transmission-quota.bash
#

# Where is your transmission download directory?
TR_DIR="/path/to/your/transmission/downloads"

# How big in bytes may the download directory grow?
TR_MAXBYTES=1879048192000

# Wheres your transmission-remote binary?
CLIPATH="/usr/bin/transmission-remote"

# Login:Password, if applicable
TR_UPASS="myUsername:myPassword"

# URL to Transmission RPC Interface (usually http://X:9091/transmission/rpc)
TR_URL="http://localhost:9091/transmission/rpc"

# # # No Configuration needed below here # # #

while [ "`du -sb ${TR_DIR} | awk '{print $1}'`" -gt "${TR_MAXBYTES}" ]; do
        CURRENT_SEEDING=`${CLIPATH} ${TR_URL} -n ${TR_UPASS} -l | awk '{ if ($2 == "100%") print $1 }' | sed 's/*$//'`
        OLDEST_TIMESTAMP=`date +%s`

        for torrent in ${CURRENT_SEEDING}
        do
                DATE_ADDED=`${CLIPATH} ${TR_URL} -n ${TR_UPASS} -t ${torrent} -i |grep "Date added:" | sed 's/Date added://g'`
                TIMESTAMP_ADDED=`date --date "${DATE_ADDED}" +%s`
                if [ "${TIMESTAMP_ADDED}" -lt "${OLDEST_TIMESTAMP}" ]; then
                        OLDEST_TIMESTAMP=${TIMESTAMP_ADDED}
                        OLDEST_ID=${torrent}
                fi
        done
        ${CLIPATH} ${TR_URL} -n ${TR_UPASS} -t ${OLDEST_ID} --remove-and-delete &> /dev/null
        DAYS_AGO=`echo $(( ( $(date +%s) - $OLDEST_TIMESTAMP ) / 3600 / 24 ))`
        echo deleted torrent id ${OLDEST_ID} from ${DAYS_AGO} days ago | logger -t transmission-quota
done

Linux Software-RAID für unternehmenskritische Anwendungen

Inhalt

Motivation

Seit den 80er Jahren (Erstes Paper zu RAID,PDF, Carnegie Mellon University) spielt RAID eine Rolle im Serverbetrieb. In den meisten Fällen wird dabei eine Menge von Festplatten durch eine weitere Abstraktionsebene (den RAID-Adapter) als eine Einheit ins Betriebssystem abgebildet (den RAID-Verbund) . Die selbe Funktion kann aber seit mindestens 13 Jahren (Software-RAID für Linux von Ingo Molnar) auch vom Linux-Kernel bewältigt werden.

In Servern und auch Desktops wird immer öfter über ein RAID nachgedacht und die bestehende Meinung in vielen Foren und Magazinen ist, dass in unternehmenskritischen Systemen Hardware-RAID besser geeignet ist, als Software-RAID. Stimmt das so, oder vollzieht sich eine Wende in diesem Bereich?
Weiterlesen