Mit dem BSD-Tool mtree kann eine Datei-Hierarchie mit einer Spezifikation verglichen werden, wobei diese Spezifikation ebenfalls mit mtree erstellt werden kann. So kann man mit mtree geänderte Dateien finden, es ist jedoch auch möglich, Dateien, die nicht der Spezifikation entsprechen, zu löschen oder geänderte Dateirechte wiederherzustellen.
Nehmen wir mal an, man hat ein paar Dateien:
$ find .
.
./file2
./dir
./dir/abc
./dir/ccc
./file1
Bevor man mit mtree etwas vergleichen kann, benötigt man eine Spezifikation der Dateien. Diese erstellen wir mit mtree -c
.
$ mtree -c > ../spec
$ cat ../spec
# user: olaf
# machine: m2.fritz.box
# tree: /Users/olaf/Desktop/test
# date: Mon Dec 18 18:50:28 2017
# .
/set type=file uid=501 gid=20 mode=0644 nlink=1 flags=none
. type=dir mode=0755 nlink=5 size=160 \
time=1513618591.304192231
file1 size=6 time=1513619185.055667000
file2 size=13 time=1513619203.579709605
# ./dir
dir type=dir mode=0755 nlink=4 size=128 \
time=1513618608.749249207
abc size=6 time=1513618604.803276546
ccc size=5 time=1513618611.066866426
# ./dir
..
..
Nun hat man eine Spezifikation, mit der man später die Dateien vergleichen kann.
$ touch dir/abc
$ echo "Hello World" > file1
$ mtree < ../spec
dir/abc changed
modification time expected Mon Dec 18 18:36:44 2017.803276546 found Mon Dec 18 18:56:22 2017.582045000
file1 changed
size expected 6 found 12
modification time expected Mon Dec 18 18:46:25 2017.055667000 found Mon Dec 18 18:57:03 2017.596168115
Wie man sieht, werden standardmäßig nur wenige Eigenschaften im der Spezifikation gespeichert, man hat jedoch eine große Auswahl an sogenannten keywords, die pro Datei gespeichert werden sollen. Diese können mit der -K
-Option angegeben werden.
$ mtree -c -K sha256digest
Das Tool ist zwar ein BSD-Tool und unter Linux standardmäßig nicht anzutreffen, ich habe aber zumindestens einen Port gefunden. Und unter Ubuntu gibt es das Paket freebsd-buildutils, welches das Tool fmtree enthält.
Eine neue stabile Version von TrueOS, einem FreeBSD-basierenden Betriebsystem, wurde veröffentlicht.
Ursprünglich war TrueOS ein etwas nutzerfreundliches FreeBSD, mit einem einfacheren Installer, der ein benutzbares Desktop-OS installiert und grafische Tools für die Paketverwaltung bereitstellt. Die Entwickler haben aber daran gearbeitet, sich durch besondere Features von FreeBSD hervorzuheben. So kommt im Unterschied zu FreeBSD das OpenRC Init-System zum Einsatz. TrueOS hat auch seinen eigenen auf Qt basierten Desktop, nämlich Lumina. Zu den weiteren besonderen TrueOS Features zählen ein überarbeitetes Package-Management und die eigene SysAdm Remote Management API.
Zu den Neuerungen von 17.12 zählen:
- Basiert auf FreeBSD 12.0-CURRENT
- Verbesserung der OpenRC-Integration mit über 1100 OpenRC Services für 3rd-party Pakete
- Update des Lumina-Desktops
- Automounter-Service um entfernbare Geräte zu verwalten
- Unterstützung von bhyve, dem BSD Hypervisor
- Separate Installations-Images für Desktop und Server
Offizielle Release-Ankündigung
Um auf Extended Attributes in C zuzugreifen gibt es unter FreeBSD die extattr_*-Syscalls. Auch hier gibt es Varianten, die mit Pfaden arbeiten, welche für Filedeskriptoren und welche die im Falle eines symbolischen Links den Link selber betreffen.
Alle Funktionen erwarten als 2. Parameter ein int
für den Namespace. Hierfür gibt es die Makros EXTATTR_NAMESPACE_USER
und EXTATTR_NAMESPACE_SYSTEM
.
Um an alle Namen der Attribute zu kommen gibt es die Funktion extattr_list_file
(und noch die beiden anderen Varianten). Im Gegensatz zu Linux werden hier die Namen nicht einfach Null-terminiert hintereinander in den Buffer geschrieben, sondern vor jedem Namen steht zunächst ein einzelnes Bytes, welches die Länge des Namens angibt. Danach folgt der Name, jedoch ist dieser nicht Null-terminiert. Die anderen Funktionen sind alle recht trivial zu benutzen.
Da FreeBSD keine Tools hat, um Dateien mit ihren Extended Attributes zu kopieren, hab ich ein kleines Beispielprogramm geschrieben, dass alle Attribute aus dem User-Namespace von einer Datei auf eine andere kopiert.
Extended Attributes sind auch unter FreeBSD name/value-Paare, die man beliebig für alle Dateien setzen kann. Im Unterschied zu Linux ist die Größe nicht auf wenige Kilobyte beschränkt. Desweiteren gibt es auch hier Namespaces (user und system), diese sind jedoch nicht Teil des Attribut-Namen.
Unter FreeBSD gibt es 4 Tools für den Zugriff auf Extended Attributes: getextattr, lsextattr, rmextattr, setextattr. Diese erwarten nach den optionalen Flags als erstes Argument immer den Namespace. Hier ein kleines Beispiel:
$ echo "hello" > test.txt
$ setextattr user test "xattr test string" test.txt
$ setextattr user mime_type "text/plain" test.txt
$ lsextattr user test.txt
test.txt mime_type test
$ getextattr user test test.txt
test.txt xattr test string
Leider unterstützen die Userland-Tools wie cp und tar keine Extended Attributes.