Kategorien
CL-35B2 Linux

mtd-utils für NAND Sicherung übersetzen

Es gibt im Netz viele Anleitungen zum Übersetzen der mtd-utils. Leider ist keine Einziger von mir aufgefundener Artikel auf meine Anforderungen zugeschnitten. Die meisten Anleitungen sind für sehr alte Versionen der mtd-utils verfasst, so das sie zum Beispiel davon ausgehen das kein ./configure Script für diese Software existiert oder die Anleitungen beziehen sich auf die besonderheiten des Cross-Compilings und lassen alles andere weg.

Hier ist meine Anleitung für das übersetzen der mtd-utils auf der NAS CL-35B2. Diese Anleitung wird benötigt um die Werkzeuge nanddump und nandwrite zu erhalten welche für ein Backup und Restore der NAS benötigt werden.

Die Anleitung kann direkt nach dem vorbereiten eines Buildsystems für die CL-35B2, und einem chroot in das Buildysystem, verwendet werden.

Die Bibliotheken werden direkt in das Buildsystem geschrieben und ich verwende das Paketmanagement nicht da es sich nur um das Buildsystem handelt, welches nach dem erfolgreichen übersetzten der Quellen wieder gelöscht wird. Sollte Dein Buildsystem Dauerhaft bestehen sollen empfehle ich Dir rpm-Pakete entsprechend dieser Anleitung zu erstellen.

1.) Vorbereitungen und Download der Sourcecodes

cd /usr/src
wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz
wget http://www.zlib.net/zlib-1.2.11.tar.gz
git clone git://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git
git clone git://git.infradead.org/mtd-utils.git

2.) zlib erstellen

tar xzf zlib-1.2.11.tar.gz
cd /usr/src/zlib-1.2.11
./configure
make
make install
cd /usr/src
rm -r zlib-1.2.11
rm zlib-1.2.11.tar.gz

3.) lzo erstellen

tar xzf lzo-2.10.tar.gz
cd /usr/src/lzo-2.10
./configure
make
make check
make install
cd /usr/src
rm -r lzo-2.10
rm lzo-2.10.tar.gz

4.) e2sfprogs erstellen

cd /usr/src/e2fsprogs
./configure
make
make install
make install-libs
cd /usr/src
rm -r e2fsprogs

5.) Die mtd-utils übersetzen

cd /usr/src/mtd-utils
./autogen.sh
./configure --disable-tests
make
make install

nach der Installation sind folgende Werkzeuge zusätzlich verfügbar.:

ToolNutzen
ubiupdatevol
ubimkvol
ubirmvol
ubicrc32
ubinfo Ausgabe von Informationen zum NAND Speicher und zur Partitionierung und zu den Details einer UBI-Partition
ubiattach
ubidetach
ubinize
ubiformat
ubirename
mtdinfoAusgabe von Informationen zum NAND Speicher und zur Partitionierung und zu den Details einer MTD-Partition
ubirsvol
ubiblock
ftl_format
doc_loadbios
ftl_check
mtd_debug
docfdisk
serve_image
recv_image
flash_erase
flash_lock
flash_unlock
flash_otp_info
flash_otp_dump
flash_otp_lock
flash_otp_write
flashcp
mtdpart Partitionierungswerkzeug für einen NAND Speicher
nanddump Export des Inhalts einer NAND-Partition
nandwrite zurückschreiben einer Sicherung in den NAND Speicher
nandtest
nftldump
nftl_format
rfddump
rfdformat
mkfs.ubifs
mkfs.jffs2
jffs2dump
jffs2reader
sumtool
Kategorien
Linux Windows

Textdateien mit Windows & DOS Zeilenumbrüchen für Linux korrigieren

Shellscripte mit Windows / DOS Zeilenumbrüchen funktionieren leider nur eingeschränkt unter Linux. Die einfache Zeile „wget bla“ in einer Textdatei mit DOS Zeilenumbrüchen führt zu der Fehlermeldung das die Datei „bla%0D“ nicht gefunden wurde.
Dies entsteht da die Linux Zeilenumbrüche nur aus einem Zeilenumbruch-Zeichen (newline[\n]) bestehen. Unter DOS und Windows steht am ende jeder Zeile vor dem Zeilenumbruch-Zeichen noch ein Wagenrücklauf-Zeichen (carriage return [CR, \r, 0x0d}). (Merkhilfe für die Reihenfolge beim Zeilenumbruch return)

Ich habe mit mehrere Beispiele herausgesucht wie die Zeilenumbrüche korrigiert werden können.

Die Original Datei:

$ cat infile
Hallo
Tschues

Der Inhalt der Datei:

$ od -c infile
0000000 H a l l o \r \n T s c h u e s \r \n
0000020

Die mir bekannten Varianten die Zeilenumbrüche in der Datei zu korrigieren:

dos2unix (Der Standard weg um die Zeilenumbrüche umzuwandeln!)

$ cat infile |dos2unix |od -c
0000000 H a l l o \n T s c h u e s \n
0000016

Umwandlung mit Hilfe von sed (stream editor):

$ cat infile | sed 's/\r$//' | od -c
0000000 H a l l o \n T s c h u e s \n
0000016

Wenn es auch kein sed auf dem System geben sollte geht auch tr:

$ cat infile|tr -d '\r'|od -c
0000000 H a l l o \n T s c h u e s \n
0000016

oder awk:

$ cat infile| awk '{sub("\r$", ""); print}' | od -c
0000000 H a l l o \n T s c h u e s \n
0000016

und in Perl:

$ cat infile| perl -pe 's/\r//'|od -c
0000000 H a l l o \n T s c h u e s \n
0000016

im Editor vi und vim geht es mit folgender Eingabe:
:%s/\r//g
oder
:1,$ s/^M//

Es gibt noch viele weitere Möglichkeiten!
Ich freue mich über Deinen Kommentar, welche Möglichkeit Du gefunden hast die Zeilenumbrüche zu korrigieren!

Kategorien
Linux

git als static binary compilieren

Was ist eine „static binary“?

Während der Übersetzung eines Quellcodes in ein ausführbares Programm verknüpft der Compiler die ausführbare Datei des Programms, um später bei der Ausführung des Programms Arbeitsspeicher zu sparen, mit „shared dynamic libraries“.

Diese Bibliotheken sind eine Sammlung von Funktionen welche von mehreren Programmen geteilt verwendet werden um bestimmte Aufgaben zu zu erfüllen. Durch die gemeinsame Nutzung dieser Bibliotheken kann der Arbeitsspeicher des Computers geschont werden, da nur eine Kopie der Bibliothek für viele verschiedene Programme im Speicher geladen sein muss. Um ein unerwartetes Verhalten von Programmen zu vermeiden, ist es manchmal unumgänglich das Programm mit einer bestimmten Version einer Bibliothek zu Übersetzen. Auch um die Portabilität eines Programms zu verbessern ist es wichtig die Abhängigkeit vom vorhanden sein einer dynamischen Bibiothek zu vermeiden. In Linux Systemen sorgt ein Paketmanager dafür, dass Versionsabhängigkeiten korrekt erfüllt werden. Wenn Du auf einem Computer arbeitest über den Du keine Administrative Kontrolle besitzt kannst Du die Version der verwendeten Bibliothek nicht bestimmen oder eine aktualisiert verhindern.
Programme können, wenn sie mit „shared dynamic libraries“ übersetzt wurden nur auf andere Computer übertragen werden auf der, die gleiche Prozessorarchitektur und die gleichen Bibliotheken verfügbar sind.
Falls die Bibliotheken des Computers auf den das Programm übertragen wurde aktualisiert werden, eine Bibliothek entfernt wird oder eine der Bibliotheken auf dem Zielrechner werden kompromittiert oder durch bösartige Versionen ersetzt. Hier kommt das bauen einer „static binary“ ins Spiel.   Wie wird GIT als „static binary“ übersetzt?

in diesem Beispiel gehe ich davon aus das auf der NAS, entsprechend meiner Anleitung, bereits mit dem hier notwendigen Buildsystem ausgestattet wurde. Im Anschluss kann die entstehende GIT Binärdatei auf allen identischen ARM Prozessoren verwendet werden.
Die aktuellste GIT Version kann auf http://git-scm.com gefunden werden.

Die Folgenden 3 Schritte sind auszuführen:

1) Lade den GIT Quellcode herunter, entpacke die tar.gz-Datei und wechsle in das GIT Buildverzeichnis:

wget --no-check-certificate https://kernel.org/pub/software/scm/git/git-2.9.5.tar.gz
tar xzf git-2.9.5.tar.gz
cd git-2.9.5

2) Setze die Compilervariablen und konfiguriere ihn mittels ./configure. Hierbei kannst du ein  separates Verzeichnis zum übersetzen angeben.:

mkdir /usr/src/git-static
CHOST="armv6j-hardfloat-linux-gnueabi"
CFLAGS="-Os -march=arm1136jf-s -mfpu=vfp -mfloat-abi=hard -pipe -fomit-frame-pointer"
CXXFLAGS="${CFLAGS}"
./configure --prefix=/usr/src/git-static CFLAGS="${CFLAGS} -static"

3) übersetze GIT:

make

…und installiere GIT in das Zielverzeichnis

make install

4) Prüfe anschließend das deine neue GIT-Version wie erwartet funktioniert

cd /usr/src/git-static
./git --version
Kategorien
Linux Raspberry Pi

Raspberry Pi: Animiertes Bootlogo (splash screen)

Ich suchte für meinen MAME-Retro-Arcasde Automaten nach einer Möglichkeit ein Bootlogo anzuzeigen, so das ersichtlich ist das der Automat noch startet. (und nicht etwa hängen geblieben ist)

Leider dauert das laden des Linux-Systems und des MAME mehrere Minuten auf dem Raspberry Pi, so das ein stehendes Bild wie ein abgestürztes System erscheinen. Die Linux Boot-Meldungen hingegen passen nicht zu einem Spielautomaten.

Ich persönlich verwende für meinen Spielautomaten ein statisches Bild, das MAME-Logo, vor welches ich einen loading spinner! gelegt habe.
Sehr schön für einen Spielautomaten sind auch animierte Charaktere aus klassischen Spielen, wie die Eule aus Apydia. Suche bei der Suchmaschine deine Wahl nach „animated gif sprites“ um einige zu finden.Agony (1992) Art & Magic / Psygnosis

Die Bootmeldungen können über die drei Einträge „consoleblank=0 loglevel=1 quiet“ in der Datei cmdline.txt im Verzeichnis /boot abgeschaltet werden.
Ebenfalls in der Datei cmdline.txt kann das Bootlogo, die Himbeeren die oben links erscheinen, mittels „logo.nologo“ abgeschaltet werden.
Mit dem Eintrag disable_splash=1 in der Datei config.txt im Ordner /boot schaltet Ihr auch noch das Regenbogen-Startbild des Raspberry Pi ab.

Splashscreen Werkzeuge wie FbiPlymouth oder FMI unterstützen leider keine Animationen. Das Werkzeug bannerd von Alexander Lukichev füllt genau diese Lücke und bietet die Möglichkeit eine Serie von BMP-Bildern als Animation wiederzugeben. (Die Letzte Aktualisierung des von bannerd ist leider aus dem September 2012)

Im Raspbian Repository ist bannerd aktuell leider nicht vorhanden, kann jedoch einfach aus den Quellen übersetzt werden.
Hierzu holen wir den Quellcode aus dem GIT-Repository und übersetzen es im Anschluss mittels make.:

git clone https://github.com/alukichev/bannerd.git
cd bannerd
make

Im Anschluss muss die entstandene Datei bannerd in den Ordner /usr/local/bin/ oder /bin kopiert werden, ausführbar gemacht werden sowie der Eigentümer und die Gruppe auf root geändert werden.

sudo cp bannerd /usr/local/bin/
sudo chown root:root /usr/local/bin/bannerd
sudo chmod 755 /usr/local/bin/bannerd

Als Bootanimation ist bei bannerd ausschließlich eine Sequenz von BMP Bildern möglich. Wenn die Boot-Animation bereits als Videodatei oder als animiertes Gif vorliegt kann diese mittels ffmpeg in eine Bildsequenz umgewandelt werden.

ffmpeg -i original_animation.gif %04d.bmp

Da mein Beispiel GIF eine Transparenz hat und ffmpeg leider automatisch weiß als Hintergrundfarbe bei der Umwandlung in Dateiformate ohne Apha Kanal.
Wenn Du eine andere Hintergrundfarbe als weiß benötigst können solche animierte GIFs leider nicht direkt umgewandelt werden.
Mit dem Umweg über PNG Bilder mit Alpha Transparenz können den BMPs auch andere Hintergundfarben gegeben werden.:

ffmpeg -i original_animation.gif %04d.png
mogrify -background black -flatten -format bmp *.png

Wenn das animierte GIF als kleine Animation in der unteren rechten Ecke des Bootbildes angezeigt werden soll können die Animationphasen mit folgenden Befehlen mit einem Hintergrundbild zusammengefügt werden. (Das Hintergrundbild wird im folgenden Beispiel mittels Imagemagic als leeres schwarzes Bild erzeugt.)

convert -size 800x480 xc:black hintergrund.jpg
wget https://loteks.de/wp-content/uploads/2017/10/agonyamiga.gif
ffmpeg -i agonyamiga.gif %04d.png
for f in *.png ; do composite -gravity southeast -geometry +25+25 "$f" hintergrund.jpg "${f%.png}.bmp" ; done
sudo mkdir /etc/bootanimation
sudo mv *.bmp /etc/bootanimation/
sudo chown root:root /etc/bootanimation -R

Nach dem wir jetzt den Dienst bannerd haben und die anzuzeigende Animation abgelegt haben brauchen wir noch einen systemd Service der im Bootvorgang bannerd startet.

der Service kann in Form der folgenden Datei /etc/systemd/system/bootlogo.service erzeugt werden:

[Unit]
Description=bootlogo
DefaultDependencies=no
After=local-fs.target

[Service]
ExecStart=/bin/sh -c '/usr/local/bin/bannerd -vD /etc/bootanimation/*.bmp'
StandardInput=tty
StandardOutput=tty

[Install]
WantedBy=sysinit.target

Jetzt muss der nrur Dienst noch aktualisiert werden.: sudo systemctl enable bootlogo
Das Bootlogo kann mit dem Befehl systemctl start bootlogo oder mit einem neustart des Computers getestet werden.

Kategorien
Linux Postfix

Postfix Konfiguration main.cf aufräumen

Leider wird die Postfix konfiguration /etc/postfix/main.cf häufig mit vielen Daten der Defaultkonfiguration „vermüllt“ und wird damit unübersichtlich.

Vorüberlegung: Wir müssen die main.cf also irgendwie Filtern, eine Feste Reihenfolge zu erhalten wäre ein positiver Nebeneffekt da sich die Regeln so besser einpägen.

Mit dem Befehl postconf können wir die aktuell verwendete Postfix Konfiguration ausgeben lassen. In dieser Ausgabe sind alle Konfigurationsparameter enthalten, ob manuell gesetzt oder der Defaultwert, in dieser Ausgabe ist er enthalten.

Mit der Option „-d“ kann man von postconf auch die Defaultkonfiguration verlangen. Das an den Beiden Ausgaben ist, das postconf die Konfiguration Optionen immer in der gleichen Reihenfolge Ausgibt und somit mittels diff die beiden Konfigurationen verglichen werden können.

Nach dem diff der beiden konfigurationen müssen alle Zeilen die sich verändert haben, diese Beginnen mit einem Größer als Zeichen „>“ beibehalten werden und die beiden ersten Zeichen, Das Größer als Zeichen und das Leerzeichen, verworfen werden um eine vollständige und Funktionierende main.cf als Ausgabe zu erhalten.

OLD=$(mktemp); trap 'rm "$OLD"' 0;\
NEW=$(mktemp); trap 'rm "$NEW"' 0;\
/usr/sbin/postconf -d > "$OLD";\
/usr/sbin/postconf > "$NEW";\
diff "$OLD" "$NEW"|\
grep '^>'|\
awk '{print substr($0,3)}';\
rm "$OLD" "$NEW"

Die aus der Ausführung dieses Einzeilers entstandene main.cf Datei kann die alte Konfigurationsdatei bedenkenlos ersetzen.

Nachtrag:

Bei mir wurde der Hostname überraschend nicht mit in die Konfiguration übernommen, es muss nach dem Ersetzen der Konfiguration noch mittels postconf der Hostname in die Konfiguration eingetragen werden.:

postconf myhostname=DNS-Reverse/PRT Record

 

Kategorien
Linux

Benutzerverzeichnis beim Löschen des Benutzers sichern

Es ist mir bereits passiert das, nachdem ein Mitarbeiter das Unternehmen verlassen hat, und der Unix-Benutzer des Mitarbeiters nach 14 Tagen aus dem Testsystem entfernt wurde, er sich bei mir meldete da er noch Dateien aus seinem Benutzerverzeichnis benötigte.

Unter Linux kann ich die Benutzer entfernen und direkt vom deluser ein Backup des Benutzerverzeichnisses anlegen lassen.

In der Datei /etc/deluser.conf bit es 3 Optionen, die dafür sorgen das das Benutzerverzeichnis gelöscht wird (REMOVE_HOME), ein Backup angelegt wird (BACKUP). Es kann auch ein Verzeichnis BACKUP_TO angegeben werden, in dem Festgelegt wird wo die Sicherung abgelegt werden soll.

In der Manpage zum deuser.conf wird folgendes für die Optionen REMOVE_HOME, BACKUP und BACKUP_TO angegeben.:

REMOVE_HOME
Löscht das Home-Verzeichnis und den E-Mail-Puffer des zu entfernenden Benutzers. Mögliche Werte sind 0 (nicht löschen) oder 1 (löschen).

BACKUP
Wenn eine der Optionen REMOVE_HOME oder REMOVE_ALL_FILES aktiviert ist, wird von allen Dateien eine Sicherungskopie angelegt, bevor sie entfernt werden. Die Backup-Datei trägt standardmäßig den Namen »username.tar(gz|Bz2)« und wird in dem durch BACKUP_TO vorgegebenen Verzeichnis gespeichert. Als Kompressionsmethode wird die beste verfügbare gewählt. Mögliche Werte sind 0 oder 1.

BACKUP_TO
Wenn BACKUP aktiviert ist, legt BACKUP_TO das Verzeichnis fest, in das der Backup geschrieben wird. Der Standardwert hierfür ist das aktuelle Verzeichnis.

Der Inhalt der Datei /etc/deluser.conf sollte wie folgt angegeben werden:

REMOVE_HOME = 1
REMOVE_ALL_FILES = 0
BACKUP = 1
BACKUP_TO = "/home"
ONLY_IF_EMPTY = 0
EXCLUDE_FSTYPES = "(proc|sysfs|usbfs|devpts|tmpfs|afs)"

Die Option REMOVE_ALL_FILES enfernt alle Dateien des Benutzers aus dem Dateisystem. Diese Option zu aktivieren kann etwas gefährlich sein, grade wenn es sich um ein Entwicklungssystem mit gemeinsam bearbeiteten Projekten handelt.

Die Option ONLY_IF_EMPTY entfernt die Benutzergruppe des Benutzers und die Option EXCLUDE_FSTYPES macht für die Dateien das Benutzers eine Ausnahme wenn sie auf Datenträgern mit einem der genannten Dateisysteme abgelegt wurde.

Beilspiel für das löschen eines Benutzers Namens „blub“ unter Ubuntu 16.04 mit der oben angegebenen /etc/deluser.conf

~# ls -l /home/
drwxr-xr-x 2 blub      blub            4096 Sep  8 17:05 blub

~# deluser blub
Looking for files to backup/remove ...
Backing up files to be removed to . ...
backup_name = /home/blub.tar
/bin/tar: Removing leading `/' from member names
Removing files ...
Removing user `blub' ...
Warning: group `blub' has no more members.
Done.

~# ls -l /home/
-rw------- 1 root      root            2328 Sep  8 17:16 blub.tar.bz2
Kategorien
Linux

aufs – zusammenfügen was zusammen gehört

AuFS – Another Union File System (Ein anderes vereinigendes Dateisystem).

Ein solches „Union Dateisystem“ nimmt Existierende Dateisysteme und zeigt ein anderes Dateisystem „darüber“ an. Es ermöglicht das Dateien und Verzeichnisse von verschiedenen Dateisystemen im gleichen Mountpfad angezeigt zu werden. Bei dieses Verfahren landen neue und neuere Dateien im „darüber“ eingebundenen Dateisystem. Dateien gleichen Namens im „darüber“ liegenden Dateisystem versperren den Zugriff auf die Dateien gleichen Namens im „darunter“ liegenden Dateisystem.

Das Dateisystem AuFS wird auch von vielen Open Source Projekten wie Knoppix und Slax sowie vielen anderen Linux LiveCDs und USB Distributionen.

In meinem Beispiel verwende ich Debian, auf allen Debian basierten Linux Distributionen wie Ubuntu und Linux Mint kannst Du genauso vorgehen.

sudo apt install aufs-tools

Wie AuFS funktioniert

Das erste Beispiel zeigt wie zwei Verzeichnisse, /tmp/dir1 und /tmp/dir2  in gleichen Verzeichnis Pfad /tmp/aufs gemounted, also eingebunden werden.

mkdir /tmp/{dir1,dir2,aufs}
touch /tmp/{dir1/eins,dir2/zwei}
mount -t aufs -o br=/tmp/dir1:/tmp/dir2 none /tmp/aufs/

Der erste der beiden Befehle, mkdir,  erstellt die beiden Verzeichnisse im Verzeichnis tmp. Der zweite Befehl legt je eine Testdatei in die beiden im Dritten, dem Befehl mount -t aufs eingebundenen beiden Verzeichnisse, die zu dem Verzeichnis /tmp/aufs eingebunden werden.

Dieser mount-Befehl spezifiziert die beiden Verzeichnisse “/tmp/dir1″ und „/tmp/dir2” welche in das Verzeichnis “/tmp/aufs” eingebunden wird. Das Zielverzeichnis “/tmp/aufs” wird nach dem erfolgreichen mount-Befehl den Inhalt der beiden Verzeichnisse “/tmp/dir1” und “/tmp/dir2” enthalten.

In dem oben angegebenen mount-Befehl werden die folgenden Optionen verwendet.:

  • -t aufs Der typ des Dateisystems ist aufs
  • -o gibt an, das die Optionen für das zuvor angegebene Dateisystem folgen
  • br= steht für „branch“, was am besten mit Verzweigung übersetzt werden kann. Die einzelnen Zweige werden mit einem Semikolon getrennt. Eine beim Befehl mount angegebene verzweigung bezeichnet ein Verzeichnis im Dateisystem.
  • none bezieht sich darauf das kein Dateisystem sondern Verzeichnisse eingebunden werden sollen

Da wir vor dem Einbinden der Verzeichnisse mittels touch zwei Dateien angelegt haben können wir mittels ls -l nachschauen was genau passiert ist.

ls -l /tmp/dir1/
-rw-r--r-- 1 root root 0 Sep 3 18:29 eins

ls -l /tmp/dir2/
-rw-r--r-- 1 root root 0 Sep 3 18:29 zwei

ls -l /tmp/aufs/
-rw-r--r-- 1 root root 0 Sep 3 18:29 eins
-rw-r--r-- 1 root root 0 Sep 3 18:29 zwei

Die beiden Dateien namens eins und zwei erscheinen auch im Verzeichnis /tmp/aufs.

Wenn wie in diesem ersten Beispiel keine anderen Rechte festgelegt wurden ist das erste angegebene Verzeichnis beschreibbar und das zweite Verzeichnis nur zum lesen eingebunden.

Beim anlegen zweier Dateien im Ordner /tmp/aufs werden diese im Verzeichnis /tmp/dir1 abgelegt.

touch /tmp/aufs/test{1,2}
ls -l /tmp/aufs/

-rw-r--r-- 1 root root 0 Sep  3 18:29 eins
-rw-r--r-- 1 root root 0 Sep  3 18:37 test1
-rw-r--r-- 1 root root 0 Sep  3 18:37 test2
-rw-r--r-- 1 root root 0 Sep  3 18:29 zwei

ls -l /tmp/dir{1,2}/
/tmp/dir1/:
total 0
-rw-r--r-- 1 root root 0 Sep  3 18:29 eins
-rw-r--r-- 1 root root 0 Sep  3 18:37 test1
-rw-r--r-- 1 root root 0 Sep  3 18:37 test2

/tmp/dir2/:
total 0
-rw-r--r-- 1 root root 0 Sep  3 18:29 zwei

Beim löschen einer Datei vom Laufwerk /tmp/aufs erscheint diese nicht mehr im Verzeichnis /tmp/aufs ist jedoch noch immer im Verzeichnis /tmp/dir2 vorhanden. Bei dem Löschen einer Datei welche im Verzeichnis /tmp/dir1 abgelegt wurde wird diese auch im Verzeichnis /tmp/dir1 gelöscht.:

rm /tmp/aufs/{eins,zwei}
ls /tmp/{dir1,dir2,aufs}
/tmp/aufs:
test1  test2

/tmp/dir1:
test1  test2

/tmp/dir2:
zwei

Vereinheitlichte Heimatverzeichnisse

Nach einiger Zeit in Betrieb enden die meisten Systemeadministratoren mit Systemen mit vienen Festplatten über die die Daten der Benutzer verteilt liegen. Manchmal ist es jedoch sinnvoll sich einen einfachen Überblick zu verschaffen und die Administration auf diese weise zu vereinfachen.

In diesem Heispiel gibt es die beiden Datenträger /home und /home1 mit den Heimatverzeichnissen der Benutzer:

  • /home das Heimatverzeichnis der Benutzer „metzger“ und “metzger” und “sysadmin” auf der Festplatte /dev/sdb1
  • /home1 das Heimatverzeichnis des Benutzers „test“ auf der Festplatte /dev/sdb2
mount -t aufs -o br=/home=rw:/home1=rw -o udba=reval  none /common/
ls -l /common/
drwxr-xr-x 39 metzger metzger  4096 Sep 3 18:44 metzger
drwxr-xr-x 26 sysadmin   sysadmin    4096 Sep 3 18:51 sysadmin
drwxr-xr-x  2 root       root        4096 Sep 3 19:36 test

Der oben mount Befehl in diesem aufruf enthält die extra Option “udba” welche ausgeschrieben auf den “User’s Direct Branch Access” verweisst, den direkten Zugriff eines Benutzers auf das Dateisytem. Nicht der Zugriff über das AuFS ist damit gemeint, sondern in diesem Beispiel der direkte Zugriff auf das Verzeichnis /home oder /home1.

Die folgenden Werte sind für die Option udba möglich.:

  • udba=none Mit dieser Option ist der Zugriff auf das Dateisystem am schnellsten, es wird aber veränderungen durch das erstellen von Ordnern oder Dateien im Verzeichnis /home oder /home1 nicht im AuFS Verzeichnis /common anzeigen.
  • udba=reval Mit dieser Option wird AuFS bei jedem Zugriff auf das Verzeichnis /common die Verzeichnisse und Unterverzeichnisse von den Ordnern /home und /home1 auf Veränderungen prüfen und die Änderungen im Verzeichnis /common berücksichtigen.
  • udba=notify Mit dieser Option nutzt AuFS die Linux Funktion inotify für alle Ordner in den verknüpften Verzeichnissen. Diese Option bietet die Vorteile der Option udba=reval ohne die Performance so stark wie diese Otion zu beeinflussen.
touch /home/metzger/test

ls -l /common/metzger/
.
..
-rw-r--r-- 1 root       root             0 Mar 25 17:17 test

Der Befehl touch erstellt die Datei „test“ im Heimatverzeichnis meines Benutzers „metzger“. Da beim einbinden des Dateisystems die Option “udba=retval” verwendet wurde wird die Datei sowohl unter /home/metzger als auch im Ordner /common/metzger angezeigt sobald die Datei erstellt wurde.

Zusätzlich haben wir die Option „rw“ (readwrite) für beide Dateisysteme angelegt. Eine Datei die im Ordner /common/test/ angelegt wird wird Physisch im Ordner “/home1/test/” angelegt werden. Dies trifft auf alle Verzeichnisse existierenden Verzeichnisse zu. Neu angelegte Dateien oder Verzeichnisse im Verzeichnis /common landen auf erste angegebenen Dateisystem /home

touch /common/test/Testing

ls -l /home1/test/
-rw-r--r-- 1 root root  0 Mar 25 18:26 Testing

Nur lesend mounten

Beim mounten kann für jeden auch für jede Verzweigung, jeden branches einzeln festgelegt werden welche ob nur leserechte (ro) oder lese und Schreibrechte (rw) vergeben werden sollen.

mount -t aufs -o br=/tmp/dir1=rw:/tmp/dir2=ro -o udba=reval none /tmp/aufs/

In dem obigen Aufruf wird festgelegt das das Verzeichnis /tmp/aufs das Verzeichnis /tmp/dir1 beschreibbar und das Verzeichnis “/tmp/dir2” nur zum lesen engebunden bekommt. Jedwede Änderungen im Verzeichnes /tmp/aufs landet auf dem Datenträger /tmp/dir1 da dies das zum schreiben geöffnete Verzeichnis ist. Die Dateien im Verzeichnis /tmp/dir2 können über das Verzeichnis /tmp/aufs nicht verändert werden.

Mit den Folgenden Aufrufen kann dies geprüft werden.

echo "Eine neue Datei" > /tmp/dir2/1.txt
cat /tmp/aufs/1.txt
Eine neue Datei
echo "Diese Datei wurde geändert" >> /tmp/aufs/1.txt
cat /tmp/dir2/1.txt
Eine neue Datei
cat /tmp/dir1/1.txt
Eine neue Datei
Diese Datei wurde geändert

Erläuterung zur obigen Befehlsabfolge im Deteil:

  • Im Verzeichnis /tmp/dir2/ wird eine Datei mit dem Namen 1.txt und dem Inhalt „Eine neue Datei“ angelegt
  • Diese neue Datei wird auch im „union mount Verzeichnis“ /tmp/aufs angezeigt da beim mounten die Option udba=retval angegeben wurde (die Beschreibung ist einige Zeilen weiter oben im Text)
  • Wir schreiben zusätzlich den Text „Diese Datei wurde geändert“ in die Datei 1.txt im über das AuFS im Verzeichnis /tmp/aufs
  • Da das Dateisystem /tmp/dir2 nur zum lesen eingebunden ist nimmt sich AuFS den Inhalt aus der Datei /tmp/dir2 und legt den Inhalt, zusammen mit der Ergänzung im Verzeichnis /tmp/dir1 ab.
  • Im Verzeichnis /tmp/dir2 erscheint die soeben gemachte änderung nicht in der Datei 1.txt
  • Im Verzeichnis /tmp/dir1 erscheint der vollständige, ergänzte Inhalt der Datei “1.txt”

Round Robin – abwechselnd wechselnde Ziele

Wen wir mehr als zwei Dateisysteme einbinden welche wir als beschreibbar deklarieren können wir aus mehreren vordefinierten Regeln währen wo und nach welchen Regeln die Dateien auf den Dateisytemen angelegt werden sollen.

mount -t aufs -o br=/tmp/dir1=rw:/home/metzger=rw -o udba=reval -o create=rr none /tmp/aufs-root/

Mit der Option “create=rr” legen wir fest das die Dateien im Rundlauf-Verfahren, oder in der englischen Bezeichnung Round-Robin, gespeichert werden sollen. Im Rundlauf-Verfahren wird die erste gespeicherte Datei im ersten Dateisystem, die zweite Datei im zweiten Dateisystem und die dritte Datei wieder im ersten Dateisystem abgelegt. Wenn ich fünf Dateien erstelle landen die erste, dritte und fünfte Datei im Dateisystem “/tmp/dir1” sowie die zweite und vierte Datei im zweiten Dateisytem “/home/metzger”.

touch /tmp/aufs/first-round-robin
touch /tmp/aufs/second-round-robin
ls -l /tmp/dir1/first-round-robin
-rw-r--r-- 1 root root 0 Mar 25 21:53 /tmp/dir1/first-round-robin
ls -l /home/metzger/second-round-robin
-rw-r--r-- 1 root root 0 Mar 25 21:54 /home/metzger/second-round-robin

Links

Kategorien
Linux

Hilfe, ich habe kein uuencode!!!

Ich wollte mir vor kurzem Schadcode zur Analyse von einem Computer ohne Netzwerk über die Serielle Console kopieren, musste jedoch leider feststellen das kein uuencode auf dem Server vorinstalliert war.

Nach einer kurzen suche suche bin ich auf xxd gestoßen, mit dem sich Binärdaten in hexadezimalcodes, und wieder zurück, umwandeln lässt.

Eine Datei „Datei“ kann mit dem folgenden Aufruf in Hex-Dump gewandelt werden.:

xxd -p Datei > Datei.txt

Ich schalte bei der Seriellen Console im anschluss das Logging ein, schreibe die Ausgaben also in eine Datei. und gebe mit „cat Datei.txt“ die Hex-Dump-Datei aus.

Nach dem die überzähligen Zeilen aus dem Mitschnitt entfernt wurden kann mit dem folgenden Befehl der Hex-Dump wieder in die Ursprungsdatei zurück umgewandelt werden.

xxd -p -r Datei.txt > Datei-eins

Die beiden Dateien „Datei-eins“ und die auf dem ursprünglichen Computer liegende Datei „Datei“ sind identisch. Der Dateiname und die Dateirechte werden bei dieser Methode jedoch im gegensatz zu uuencode nicht übernommen.

Bei einem Größenvergleich mit uuencode schneidet xxd erwartungsgemäß nicht besonders gut ab,

Test zum Speicherbedarf:

  • Anlegen einer binären Testdatei mit:
dd if=/dev/urandom of=bintest bs=1024 count=1024
  • Erzeugen der Testdateien für uuencode, xxd, base32 und base64:
uuencode bintest bintest > bintest-1.txt
xxd -p bintest > bintest-2.txt
base32 bintest > bintest-3.txt
base64 bintest > bintest-4.txt

Die Sicherung der Datei ist als Hex-Dump, xxd deutlich größer als mit uuencode oder base64, sogar noch größer als eine Umwandlung in ASCII via base32:

~$ ls -lhA bintest*
-rw-r----- 1 metzger users 1,0M Apr 25 19:19 bintest
-rw-r----- 1 metzger users 1,4M Apr 25 19:27 bintest-1.txt
-rw-r----- 1 metzger users 2,1M Apr 25 19:37 bintest-2.txt
-rw-r----- 1 metzger users 1,7M Apr 26 16:32 bintest-3.txt
-rw-r----- 1 metzger users 1,4M Apr 26 16:32 bintest-4.txt

 

Kategorien
Forensik Linux

Inotify: Dateien überwachen

Du kannst in Linux Systemen die Veränderungen an Dateien im Dateisystem mit inotify überwachen.

Um, sobald Dateien verändert wurden ein .tar.gz-Archiv zur Datensicherung zu erstellen oder die veränderte Datei auf einen anderen Server hochladen, oder auch an ein Filter / Beautifier zu übergeben oder auch einfach nur um auf meinem NAS eine LED anschalten ist inotify das Werkzeug auf das alle die es noch nicht kennen gewartet haben.

Ich bin schon vor einigen Jahren auf ein Problem gestoßen für das inotify die richtige Lösung gewesen wäre. Damals konnte ich nir nur eine Endlosschleife schreiben die immer wieder alle Dateien in meinen Verzeichnissen durchgegangen ist, keine schöne Lösung und endlose Festplattenzugriffe.
Diese Endlosschleife gefiel meinem damaligen Provider garnicht, da diese zu häufig auf die zu überwachenden Dateien Zugriff und die Festplatten am einschlafen hinderten und die Lebensdauer der Festplatten reduzierte.
Damals konnte ich die Schleife einfach mit einer längeren pause() zügeln, bin bald auf einen Cronjob gewechselt der noch seltener lief.

Auf meines eigenen NAS und meinen eigenen Servern bin ich jedoch nicht auf eine Schleife oder Cronjobs angewiesen! Mit einem Inotify Event kann ich die Änderungen direkt im Dateisystem abpassen und die gewünschte Anktion direkt nach der änderung starten.

apt install inotify-tools
Inotify-Events
KürzelFormat
ACCESSZugriff auf die Datei
ATTRIBMetadaten geändert
CLOSE_WRITEzum Schreiben geöffnete Datei geschlossen, sie muss nicht geändert worden sein
CLOSE_NOWRITEEine Datei wurde geschlossen nachdem sie schreibgeschützt geöffnet wurde
CREATENeue Datei angelegt
DELETEDatei gelöscht
DELETESELFÜberwachtes Verzeiuchnis gelöscht
MODIFYDatei modifiziert
MODIFYSELFÜberwachtes Verzeichnis modifiziert
MOVEDFROMDatei aus dem überwachten Verzeichnis verschoben
MOVEDTODatei in das überwachte Verzeichnis verschoben
OPENDatei geöffnet
inotifywait -mrq -e create --format %w%f /pfad/zum/verzeichnis/ | while read FILE
do
echo "neue Datei: $FILE"
done

Um zum Beispiel das WordPress Verzeichnises auf neue Dateien zu überwachen kann ich folgendes Snippet nutzen:

inotifywait -mrq -e create --format %w%f /home/customer/der_metzger/loteks_de/www/ | while read FILE;
 do
  echo "neue Datei: $FILE";
done

Dirch dieses Snippet werden alle im WordPressverzeichnis  neu erstellten Dateien ausgegeben.

In meinem Verzeichnis vor allem viele Dateien wp-content/temp-write-test-1492771373. (Die Zahl an ende ändert sich bei jedem Aufruf)
Jedoch werden auch alle Updates, Uploads, Plugin und Theme Installationen und auch all die neuen Dateien an die ich grade nicht denke.

Um herauszufinden welche Dateien „angefasst“ werden wird nur der Parameter „-e create“ auf „-e access“ geändert:

inotifywait -mrq -e access --format %w%f /pfad/zum/verzeichnis/ | while read FILE
do
echo "zugriff auf Datei: $FILE"
done

Inotify ist unter Linux ein sehr nützliches Werkzeug, auch für die Fehleranalyse. 😉

Kategorien
Linux security

Reverse SSH Tunnel

Seit der Deaktivierung extern erreichbarer IPv4 Adressen, von den Providers Dual-Stack Lite oder DS-Lite genannt, bei meinem und auch vielen anderen Internetzugängen lassen sich die heimischen Computer und Router nicht mehr ohne weiteres mittels OpenSSH erreichen.

Die Alternativen, wie Beispielsweise einen VPN Tunnel und die teilweise recht obskuren Shell sharing-Dienste (Nach aufruf einer URL habe zugriff auf die Shell als der Benutzer der die Shell freigegeben hat, ohne Passwort, ohne Key), überzeugen mich einfach nicht. Besonders zur Administration meines heimischen Servers und der NAS verlange ich einfach mehr vertraulichkeit von meiner Verbindung.

In diesem Blogbeitrag zeige ich Schritt für Schritt wie ein reverser, mit anderen Worten umgekehrter, SSH Tunnel errichtet werden kann.

Revers SSH-Tunnel? Das ist wenn Bob eine Verbindung zur Shell des Computers von Alice herstellen möchte, der Computer von Alice ist jedoch wegen einem NAT oder einer Firewall nicht erreichbar ist. Alice muss dann zuerst eine Verbindung zu Bobs Computer herstellen und in dieser die Verbindung zu ihrem eigene Computer mitbringen.

Für mein Beispiel nehmen wir an, das der Computer von Alice die IP-Adresse 10.0.0.2 und der Computer von Bob die IP-Adresse 192.168.0.2 hat, und zwar eine Verbindung von Alice zu Bob, jedoch umgekehrt keine Verbindung möglich ist.

1.) SSH Verbindung von Alice zu Bob herstellen. (Vom Zielcomputer zu dem Computer auf dem eine Verbindung auf die Shell eigentlich hergestellt werden soll)

ssh -R 49152:localhost:22 benutzer@192.168.0.2

Der Port 49152 den ich hier verwende ist ein beliebiger, auf Bobs Computer nicht verwedeter Port.

2.) Nun kann Bob eine SSH-Verbindung zum Computer von Alice über den jetzt aufgebauten SSH-Tunnel herstellen.

ssh localhost -p 49152

Wenn die von Alice hergestellte Verbindung zu Bob jedoch abbricht verliert auch Bob seine Verbindung zu Alice.
Bob sollte aus diesem Grund due Konfiguration seines SSH-Servers so anpassen, das die Verbindung nicht wegen eines Timeout getrennt wird.

Die Daten /etc/ssh/sshd_config kann zu diesem Zweck wie folgt angepasst werden.:
TCPKeepAlive no
ClientAliveInterval 30
ClientAliveCountMax 100