JensDiemer

chroot Umgebung erstellen

debootstrap Paket installieren:

1
~$ sudo apt-get install debootstrap

Ziel Verzeichnis für alle späteren Schritte festlegen:

1
2
3
4
~$ target=/chroots/btsync

# Nötigen Verzeichnisse anlegen:
~$ sudo mkdir -p ${target}

Minimal System erzeugen:

1
2
3
4
5
~$ sudo debootstrap --variant=minbase wheezy ${target} http://ftp.de.debian.org/debian

# Sollte so enden:
...
I: Base system installed successfully.

Kleines skript um in chroot Umgebung zu wechseln (Kann man praktischerweise als /chroots/chroot_btsync.sh speichern):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/bin/bash

# http://www.jensdiemer.de/permalink/458/btsync-chroot

target=/chroots/btsync

if [ $(whoami) != 'root' ]; then
    echo "ERROR: You must start this script as root or with sudo!"
    exit 1
fi


# mount only, if not already mounted
for source in /dev /dev/pts /proc /sys; do
    mount_point=${target}${source}
    dev=$(mount | grep "${mount_point} type")
    if [ "${dev}" = "" ]; then
        if [ ! -d ${mount_point} ]; then
            mkdir -v ${mount_point}
        fi
        (
            set +x
            mount -vB ${source} ${mount_point}
        )
    else
        echo "Skip ${mount_point}"
    fi
done


echo
(
    set -x
    chroot ${target}
)
echo


# unmoount only if no chroot is running
active=$(ps aux | grep "[c]hroot ${target}")
if [ "${active}" = "" ]; then
    for i in /dev/pts /dev /proc /sys; do (
        set -x
        umount -v ${target}$i
    ) done
else
    echo "Don't unmount: at least one chroot is running"
fi

Mit dem Skript in chroot Umgebung wecheln und dann weiter:

1
2
3
4
5
6
7
# root passwort setzten:
root@chroot:/# passwd

# neuen Namen vergeben bsp:
root@chroot:/# echo "btsync-chroot">/etc/hostname
root@chroot:/# echo "127.0.0.1 localhost btsync-chroot">/etc/hosts
root@chroot:/# echo "btsync-chroot">/etc/debian_chroot

Ist der neue Name gesetzt, einfach nochmal aus chroot raus und wieder rein, dann sollte der Prompt sich auch geändert haben.

Weiter geht die Einrichtung:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# sources.list anpassen bsp:
(btsync-chroot)root@foobar:/# cat <<EOT > /etc/apt/sources.list
deb http://ftp.de.debian.org/debian wheezy main contrib non-free
deb http://ftp.de.debian.org/debian stable-updates main contrib non-free
EOT

# Aktualisieren
(btsync-chroot)root@foobar:/# apt-get update
(btsync-chroot)root@foobar:/# apt-get dist-upgrade

# minimal Einrichtung
(btsync-chroot)root@foobar:/# apt-get install wget adduser locales dialog
(btsync-chroot)root@foobar:/# dpkg-reconfigure locales

btsync in chroot einrichten

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# Neuer Benutzergruppe erstellen:
(btsync-chroot)root@foobar:/# addgroup btsync
Lege Gruppe »btsync« (GID 1000) an ...
Fertig.

# Neuen Benutzer erstellen:
(btsync-chroot)root@foobar:/# adduser btsync --ingroup btsync
Lege Benutzer »btsync« an ...
Lege neuen Benutzer »btsync« (1000) mit Gruppe »btsync« an ...
Erstelle Home-Verzeichnis »/home/btsync« ...
Kopiere Dateien aus »/etc/skel« ...
Geben Sie ein neues UNIX-Passwort ein:
...

btsync:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Benutzer wechseln:
(btsync-chroot)root@foobar:/# su btsync
(btsync-chroot)btsync@foobar:/# cd ~

# Architektur-Anhabe kann sein u.a.: i386, x64 oder arm
(btsync-chroot)btsync@foobar:~$ arch=i386

(btsync-chroot)btsync@foobar:~$ wget -O btsync.tar.gz http://download-lb.utorrent.com/endpoint/btsync/os/linux-${arch}/track/stable
(btsync-chroot)btsync@foobar:~$ tar xzfv btsync.tar.gz
(btsync-chroot)btsync@foobar:~$ rm btsync.tar.gz
(btsync-chroot)btsync@foobar:~$ mv btsync btsync_${arch}

Siehe auch: http://www.bittorrent.com/sync/downloads

Konfiguration erstellen

Beispiel Konfigurationsdatei erstellen:

1
(btsync-chroot)btsync@foobar:~$ ./btsync_${arch} --dump-sample-config > btsync.conf

(Auf dem CubieTruck musste ich übrigens ln -sf /lib/ld-linux-armhf.so.3 /lib/ld-linux.so.3 machen, damit die Datei aus ausgeführt wurde. Ansonsten erhält man nur ein nichtssagendes Fehlermeldung wie bash: ./btsync_arm: Datei oder Verzeichnis nicht gefunden)

Wichtigste Zeilen, die man dann in der .conf ändern sollte:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
...
  "storage_path" : "/home/btsync/.btsync_storage", // Pfad für interne Dateien (Ist keine Freigabe!)
...
  "download_limit" : 0,
  "upload_limit" : 0, // <-- kB/s Wert setzten, damit DSL Zugang nicht "verstopft", bsp: auf 900 kB/s begrenzen
...
  "webui" :
  {
    "listen" : "0.0.0.0:8888", // <-- Bei bedarf
    "login" : "admin",         // <-- Hier den WebGUI Usernamen angeben
    "password" : "password"    // <-- Sicheres Passwort für den WebGUI User einsetzten
  }
...

Einige Werte (Wie Up-/Download-Limit) kann man auch später in der WebGUI ändern.

Den Zweig "shared_folders" ist auskommentiere und das auch so lassen. Es ist einfacher Syncronisierungs-Freigaben in der WebGUI einzurichten. Siehe auch den Hinweis in der .conf Datei:

1
2
3
4
/* !!! if you set shared folders in config file WebUI will be DISABLED !!!
   shared directories specified in config file
   override the folders previously added from WebUI.
*/

Das Verzeichnis welches bei storage_path angegeben wurde erstellen:

1
(btsync-chroot)btsync@foobar:~$ mkdir .btsync_storage

btsync server manuell starten

Dann die btsync.conf anpassen und damit starten:

1
2
3
4
(btsync-chroot)btsync@foobar:~$ ./btsync_${arch} --config btsync.conf

# oder zu testzwecken:
(btsync-chroot)btsync@foobar:~$ ./btsync_${arch} --nodaemon --config btsync.conf

Ist dann über 127.0.0.1:8888 bzw. die öffentliche IP Adresse auf Port 8888 erreichbar. (Wenn 'listen' auf "0.0.0.0:8888" belassen wurde)

btsync server automatisiert starten

Nun gibt es einige Varianten, wie man den btsync server automatisiert starten kann.
Ich starte es über rc.local und lasse den prozess in einer screen session laufen.

Dazu habe ich zwei Skripte:

  • /chroots/btsync_rc_local_startup.sh
  • /chroots/btsync/home/btsyncstart_btsync.sh

Das erste Skript startet das zweite. Die Trennung ist dazu da, das man auch manuell start_btsync.sh aufrufen kann, ohne das eine screen session daraus wird.

In der /etc/rc.local kommt nur diese Zeile:

1
/chroots/btsync_rc_local_startup.sh

Inhalt von btsync_rc_local_startup.sh für das Verzeichniss /chroots/ sieht so aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/bin/bash

# http://www.jensdiemer.de/permalink/458/btsync-chroot

TARGET=/chroots/btsync
LOG_FILE=/chroots/btsync_startup_$(date +"%Y-%m").log


print() {
    echo $* | tee -a ${LOG_FILE}
}
print "[$(date +"%d.%m.%Y %H:%M:%S")] $(whoami) --- $0 ---"


if [ $(whoami) != 'root' ]; then
    print "ERROR: You must start this script as root or with sudo!"
    exit 1
fi


TEST=$(screen -list | grep btsync)
if [ "${TEST}" != "" ]; then
    print
    print "ERROR: btsync screen session is already running:"
    print
    print ${TEST}
    print
    exit 1
fi


# mount only, if not already mounted
for source in /dev /dev/pts /proc /sys; do
    mount_point=${TARGET}${source}
    dev=$(mount | grep "${mount_point} type")
    if [ "${dev}" = "" ]; then
        if [ ! -d ${mount_point} ]; then
            mkdir -v ${mount_point}
        fi
        (
            set +x
            mount -vB ${source} ${mount_point}
        )
    else
        echo "Skip ${mount_point}"
    fi
done

(
    set -x
    chroot ${TARGET} su -l btsync -c "/home/btsync/start_btsync.sh" 2>&1 | tee -a ${LOG_FILE}
)

Inhalt von start_btsync.sh für das Verzeichnis /chroots/btsync/home/btsync/ sieht so aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/bash

# http://www.jensdiemer.de/permalink/458/btsync-chroot

BASE_DIR=/home/btsync
CONFIG=${BASE_DIR}/btsync.conf

echo "[$(date +"%d.%m.%Y %H:%M:%S")] $(whoami) --- $0 ---"

if [ $(whoami) != 'btsync' ]; then
    echo "ERROR: This script should run from the user 'btsync' !"
    exit 1
fi

ARCH=$(uname -m)
if [ "${ARCH}" == "x86_64" ]; then
    EXE=${BASE_DIR}/btsync_64
elif [ "${ARCH}" == "i686" ]; then
    EXE=${BASE_DIR}/btsync_i386
elif [ "${ARCH}" == "armv7l" ]; then
    EXE=${BASE_DIR}/btsync_arm
else
    echo "ERROR: Architecture '${ARCH}' is unknown!"
fi

if [ ! -f ${EXE} ]; then
    echo "ERROR: binary file '${EXE}' not found!"
fi

(
    set -x
    nice -n 19 ionice -c3 ${EXE} --config ${CONFIG}
)

Diagnose

Ein paar Handreichungen, um zu sehen was btsync macht:

Sehen ob es läuft:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Prozesse:
foo@bar:/chroots$ aux | grep [b]tsync.conf
foo     10973 15.8  5.1 119280 50840 ?        SNsl 18:43   0:54 /home/btsync/btsync_i386 --config /home/btsync/btsync.conf

# Netzwerkverbindungen:
foo@bar:/chroots$ netstat -vplan | grep [b]tsync
...
tcp        0      0 0.0.0.0:12345           0.0.0.0:*               LISTEN      10973/btsync_i386
tcp        0      0 0.0.0.0:8888            0.0.0.0:*               LISTEN      10973/btsync_i386
...

Die shell Skripte zum starten, erzeugen eine Log Datei hier:

1
2
3
4
foo@bar:/chroots$ cat btsync_startup_2014-05.log 
[11.05.2014 18:43:55] root --- ./btsync_rc_local_startup.sh ---
[11.05.2014 16:43:56] btsync --- /home/btsync/start_btsync.sh ---
+ nice ionice -n7 /home/btsync/btsync_i386 --config /home/btsync/btsync.conf

BtSync speichert seine log hier:

1
foo@bar:/chroots$ sudo tail -f /chroots/btsync/home/btsync/.btsync_storage/sync.log

Netzwerk Priorisierung

Wenn man BtSync Server über DSL verbinden sind die Beschränkungen der Up-/Down-Bandbreite wenig hilfreich. Das normale Surfen wird dennoch gelähmt.

Eine Priorisierung auf Port Basis ist da hilfreicher:

  • in btsync.conf den listening_port explizit festlegen
  • Im Router den Traffic über den UDP Port als Hintergrund-Dienst festlegen

In der Fritzbox kann man dazu einen neue Netzwerkanwendungen festlegen und so btsync als Hintergrundanwendungen festlegen.
Zusätzlich kann man "Sufen" als Priorisierte Anwendungen aufnehmen und Internettelefonie als Echtzeitanwendungen.

Links