Fixing Error “failed, reason: getaddrinfo EAI_AGAIN” in Gitlab Builds

Flattr this!

Some days ago, I detected some new errors in one of our builds pipelines. The interesting part is, that there were no changes done, that might have caused this error.
One example for this error was an DNS resolution error using npm:

#9 [4/5] RUN npm i npm@latest
#9 71.06 npm ERR! code EAI_AGAIN
#9 71.06 npm ERR! syscall getaddrinfo
#9 71.06 npm ERR! errno EAI_AGAIN
#9 71.06 npm ERR! request to https://registry.npmjs.org/npm failed, reason: getaddrinfo EAI_AGAIN registry.npmjs.org
#9 71.06 
#9 71.06 npm ERR! A complete log of this run can be found in:
#9 71.06 npm ERR!     /root/.npm/_logs/2023-02-10T08_30_43_730Z-debug-0.log
#9 ERROR: executor failed running [/bin/sh -c npm i npm@latest]: runc did not terminate sucessfully

After some digging, I found out, that the only update might have come with an updated docker build behaviour, since the docker image, used in this job is docker:latest.

Some Google queries later, I found an issue realted to this topic. It points to a blog post about a strange behaviour of docker in regards to DNS. But since, I had no issues before, I ruled out, that this might be the case here.

And indeed, a look in the latest release notes pointed out the obvious:

Alias docker build to docker buildx build

docker/cli#3314

The easiest fix was to disable buildx alltogether via these ENV Vars:

build:
  image: docker:latest
  stage: build
  variables:
    DOCKER_BUILDKIT: 0
    COMPOSE_DOCKER_CLI_BUILD: 0
  services:
    - docker:dind
  before_script:
…
  script:
…

After this change, the build job did run without any errors.

20min Handson ZFS

Flattr this!

ZFS is often called the last word in file systems.
It is a new approach to deal with large pools of disks originally invented by Sun.
It was later then ported to FreeBSD, MacOS (only 10.5) and Linux.

This text should show some of the basic feature of ZFS and demonstrate them handson by example.

Prerequisites

-> FreeBSD
-> Solaris
-> MacOS (only Userland)

In our example we use

SunOS openindiana 5.11 oi_151a5 i86pc i386 i86pc Solaris.

as an environment.

But most commands also work on the other systems.

Since we do all the work within a VM, our commands have the pattern:

Input VM:

command

Output VM:

result

Pool Creation

The first information we need is the number of disk, present in our environment.
There are several ways to get a basic disk listing. Under (Open-)Solaris this can be done with:

Input VM:

format < /dev/null

Output VM:

AVAILABLE DISK SELECTIONS:
0. c4t0d0 
/pci@0,0/pci8086,2829@d/disk@0,0
1. c5t0d0 
/pci@0,0/pci1000,8000@16/sd@0,0
2. c5t1d0 
/pci@0,0/pci1000,8000@16/sd@1,0
3. c5t2d0 
/pci@0,0/pci1000,8000@16/sd@2,0
4. c5t3d0 
/pci@0,0/pci1000,8000@16/sd@3,0
5. c5t4d0 
/pci@0,0/pci1000,8000@16/sd@4,0
6. c5t5d0 
/pci@0,0/pci1000,8000@16/sd@5,0
7. c5t6d0 
/pci@0,0/pci1000,8000@16/sd@6,0
8. c5t7d0 
/pci@0,0/pci1000,8000@16/sd@7,0

about Pools

With ZFS it is possible to create different kinds of pools on a specific number of disk.
You can also create several pools within one system.

The following Pools are possible and most commonly used:

Type Info Performance Capacity Redundancy Command
JBOD Just a bunch of disks. In theory it is possible to create on pool for each disk in the system, although this is not quite commonly used. of each disk of each disk zpool create disk1 pool1
zpool create disk1 pool2
Stripe This is equivalent to RAID0, the data is distributed over all disks in the pool. If one disks fails, all the data is lost. But you can also stripe several Pools (e.g. two raidz pools) to have better redundancy. very high N Disks no zpool create disk1 disk2 pool1
Mirror This is equivalent to RAID1, the data is written to both disks in the Pool. Restoring a pool (resilvering) is less efficient, since the data needs to be copied from the remaining disk. normal N-1 Disks +1 zpool create mirror disk1 disk2 pool1
Raidz This is equivalent to RAID5. One disk contains the parity data. Restoring a pool (resilvering) is less efficient, since the data needs to be copied from the remaining disks. high N-1 Disks +1 zpool create raidz disk1 disk2 disk3 pool1
Raidz2 This is equivalent to RAID6. Two disks containing the parity data. Restoring a pool (resilvering) is less efficient, since the data needs to be copied from the remaining disk with parity data. high N-2 Disks +2 zpool create raidz2 disk1 disk2 disk3 disk4 pool1
Raidz3 There is no real equivalent existing for that one. You have basically three disks with parity data. high N-3 Disks +3 zpool create raidz3 disk1 disk2 disk3 disk4 disk5 pool1

You can also add hot-spares for a better fallback behaviour, SSDs for caching reads (cache) and writes (logs).
I also created a benchmark with various combinations.

create a basic Pool (raidz)

Input VM:

zpool create tank raidz c5t0d0 c5t1d0 c5t2d0
...
zpool status

Output VM:

  pool: tank
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            c5t0d0  ONLINE       0     0     0
            c5t1d0  ONLINE       0     0     0
            c5t2d0  ONLINE       0     0     0

errors: No known data errors

(Raid5)

You already can access the newly created pool:

Input VM:

ls -al /tank

Output VM:

 
...
total 4
drwxr-xr-x  2 root root  2 2012-10-23 22:02 .
drwxr-xr-x 25 root root 28 2012-10-23 22:02 ..

create a basic Pool (raidz) with one spare drive

Input VM:

zpool create tank raidz1 c5t0d0 c5t1d0 c5t2d0 spare c5t3d0
...
zpool status

Output VM:

  pool: tank
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            c5t0d0  ONLINE       0     0     0
            c5t1d0  ONLINE       0     0     0
            c5t2d0  ONLINE       0     0     0
        spares
          c5t3d0    AVAIL   

errors: No known data errors

List the availibe Layout

Input VM:

zpool list

Output VM:

NAME     SIZE  ALLOC   FREE  EXPANDSZ    CAP  DEDUP  HEALTH  ALTROOT
tank    1,46G   185K  1,46G         -     0%  1.00x  ONLINE  -

*The 1,5G does not reflect the real availible space. If you copy a 1G File to the Pool it will use 1,5G (1G + 512M Parity).

create a stripped pool

Input VM:

zpool create tank raidz1 c5t0d0 c5t1d0 c5t2d0 raidz1 c5t4d0 c5t5d0 c5t6d0

Output VM:

  pool: tank
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            c5t0d0  ONLINE       0     0     0
            c5t1d0  ONLINE       0     0     0
            c5t2d0  ONLINE       0     0     0
          raidz1-1  ONLINE       0     0     0
            c5t4d0  ONLINE       0     0     0
            c5t5d0  ONLINE       0     0     0
            c5t6d0  ONLINE       0     0     0

errors: No known data errors

(Raid50 = Raid5 + Raid5)

deal with disk failures

Input VM:

zpool create tank raidz1 c5t0d0 c5t1d0 c5t2d0 spare c5t3d0

Failure Handling

Input Host:

echo /dev/random >> 1.vdi

Wait for it…
or Input VM:

  pool: tank
 state: DEGRADED
status: One or more devices has experienced an unrecoverable error.  An
        attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
        using 'zpool clear' or replace the device with 'zpool replace'.
   see: http://illumos.org/msg/ZFS-8000-9P
  scan: resilvered 66K in 0h0m with 0 errors on Tue Oct 23 22:14:19 2012
config:

        NAME          STATE     READ WRITE CKSUM
        tank          DEGRADED     0     0     0
          raidz1-0    DEGRADED     0     0     0
            spare-0   DEGRADED     0     0     0
              c5t0d0  DEGRADED     0     0    64  too many errors
              c5t3d0  ONLINE       0     0     0
            c5t1d0    ONLINE       0     0     0
            c5t2d0    ONLINE       0     0     0
        spares
          c5t3d0      INUSE     currently in use

errors: No known data errors

Input VM:

zpool clear tank
...
zpool detach tank c5t0d0
zpool replace tank c5t0d0 c5t7d0

Create File systems

Input VM:

zfs create tank/home
zfs create tank/home/user1
...
chown -R user:staff /tank/home/user1
...
zfs get all tank/home/user1
...
zfs set sharesmb=on tank/home/user1
...
zfs set quota=500M tank/home/user1

Copy File from MacOS into SMB Share.

Snapshot

Input VM:

zfs snapshot tank/home/user1@basic
...
zfs list
...
zfs list -t snapshot

Output VM:

NAME                              USED  AVAIL  REFER  MOUNTPOINT
rpool1/ROOT/openindiana@install  84,0M      -  1,55G  -
tank/home/user1@basic                0      -  42,6K  -

Input VM:

zfs snapshot -r tank/home@backup
...
zfs list -t snapshot

Output VM:

NAME                              USED  AVAIL  REFER  MOUNTPOINT
rpool1/ROOT/openindiana@install  84,0M      -  1,55G  -
tank/home@backup                     0      -  41,3K  -
tank/home/user1@basic                0      -  42,6K  -
tank/home/user1@backup               0      -  42,6K  -

Input VM:

zfs clone tank/home/user1@basic tank/home/user2

Output VM:

tank/home/user2          1,33K   894M  70,3M  /tank/home/user2

Restoring Snapshots

Delete ZIP File in SMB-Share.

Input VM:

ls -al tank/home/user1
...
zfs rollback tank/home/user1@backup

Output VM:

ls -al tank/home/user1

Resizing a Pool

Input VM:

zpool list
...
zpool replace tank c5t0d0 c5t4d0
zpool replace tank c5t1d0 c5t5d0
zpool replace tank c5t2d0 c5t6d0
...
zpool scrub tank
...
zpool list

Output VM:

NAME     SIZE  ALLOC   FREE  EXPANDSZ    CAP  DEDUP  HEALTH  ALTROOT
tank    1,46G   381K  1,46G     1,50G     0%  1.00x  ONLINE  -

Input VM:

zpool set autoexpand=on tank

Using ZFS for Backups

Bash-Script

rsync -avrz --progress --delete /Users/user root@nas.local::user-backup/
backupdate=$(date "+%Y-%m-%d")
ssh root@nas.local zfs snapshot tank/backup@$backupdate

Managing Mac OS Software with Munki and Subversion

Flattr this!

At the Lisa ’13, some folks from Google did a talk how they managing all their Desktop (and Server?) Macs at Google. Besides obvious things (like using Puppet), they mentioned another Tool, Munki, for rolling out Software and Software Updates to different Clients. Since i am using several Mac Machines (Laptop, Workstation and some VMs) that used to have a quite similar Software Stack, i decided to give Munki a try. Instead of using a dedicated Webserver, i decided to go with a Subversion Repository, for having User Authentication and Versioning at the Backend.

Munki uses some concepts for organising its stuff:

  • catalogs: these are basically the Listings of Applications. Each Catalog contains some Applications to be installed.
  • manifests: these are configurations for the specific client setups – e.g. Java-Dev. You can combine several Manifest Files while including one in another. You can also define mandatory and optional Packages here.
  • pkgs: here are the basic DMG/PGK Packages stored. All Filenames are unique so you can have several Versions of one Program in one Repository.
  • pkgsinfo: Here the Basic Application Info is stored. You can have Dependencies between Packages, as well as Requirements for installing Packages.

There is an excellent Starting Guide here and a description for a Demo-Setup, how to setup a basic Munki Installation. So i won’t repeat it here.

pkgs and pkgsinfo can be strcutured into sub-folders.
My actuals setup looks like this:

> tree -L 2
.
├── catalogs
│   ├── all
│   └── testing
├── manifests
│   ├── developer_munki_client
│   └── test_munki_client
├── pkgs
│   ├── dev
│   ├── media
│   ├── utils
│   └── work
└── pkgsinfo
    ├── dev
    ├── media
    ├── utils
    └── work

So you basically configure your munki-client towards

bash-3.2$ /usr/local/munki/munkiimport --configure
Path to munki repo (example: /Users/philipp/munki  
Repo fileshare URL (example:  afp://munki.example.com/repo): https://example.com/svn/munki
pkginfo extension (Example: .plist): 
pkginfo editor (examples: /usr/bin/vi or TextMate.app): TextMate.app 
Default catalog to use (example: testing): testing

After that you can use munkiimport ##path-to-dmg## for importing Applications to Munki. After you did the final Import, you can use a Tool like MunkiAdmin to configure your Client-Setup and Application Dependencies.

The next step is to commit your changes to a Repository (that is reachable under https://example.com/svn/munki). You need to update every change to the Munki Repository to keep all Clients actual. The last Step is to implement the HTTP Basic Auth Access to the Subversion Repository. There is a good Description for that as well. You need to update your /Library/Preferences/ManagedInstalls.plist Files – that should actually be moved to /private/var/root/Library/Preferences/ManagedInstalls.plist, since it now contains some User Credentials. To add this Credentials you should use this Command, where You need to have username:password as a Base64 encoded String.

defaults write /Library/Preferences/ManagedInstalls AdditionalHttpHeaders -array "Authorization: Basic V...Q="

Workstation Vorschlag, Dezember 2011

Flattr this!

Vorwort

Hallo zusammen,

da ich in letzter Zeit von vielen Seiten nach Vorschlägen und Ideen für eine aktuelle Workstation gefragt werde, habe ich mir mal die Zeit genommen, um so ein System unter aktuellen Gegebenheiten zusammen zu stellen:

Das System soll folgende Anforderungen erfüllen:

  1. Ausreichend Speicher und CPU, um eine oder mehrere Test-VMs neben den Entwicklungstools zu betreiben.
  2. Es soll aktuelle Hardware verwendet werden, allerdings sollen die Ausgaben im vertretbaren Rahmen bleiben.
  3. Das System sollte zukänftige Erweiterungen ermöglichen.

Anforderungen die das System nicht erfüllen soll:

  1. Das System bietet keine interne Backupfunktion, d.h. es enthält keinerlei redundantes Raid, oder nutzt separate Backupplatten – dies lässt sich am besten über externe Laufwerke bewerkstelligen
  2. Keine High-End Maschine, die mit größeren Servern miteifern möchte
  3. Keine High-End Maschine, die mit High-End Gaming Systemen miteifern möchte

Mainboard

Bei dem Mainboard habe ich mich für das Intel® DH67GDB3. Unter anderem bietet es, neben der Unterstützung für die aktuelle Sandy Bridge Architektur, auch weitere Features wie:

  • FW, SATA3, USB 3.0, eSATA
  • max. 32GB Ram
  • DVI, HDMI und Display-Port


Quelle: http://www.intel.com

Preis: ca. 100 EUR

CPU

Als CPU habe ich mich – passend zum Mainboard – für einen Intel® CoreTM i5-2500K “Sandy Bridge”. Diese CPU enthält, wie einiger der neueren Modelle, einen Grafikkern, sodass die Ausgänge des Mainboards vollständig unterstütz werden. Weiterhin bietet diese CPU 4 Kerne und alle aktuellen Intel-Befehlserweiterungen. Das ganze mit einem TDP von 95W. Weiterhin bietet diese CPU einen flexiblen Multiplikator. Damit lässt sich – rein theoretisch die Taktfreqzenz von 3.3 bis auf 3.7 GHz hochschrauben.


Quelle: http://www.intel.com

Preis: ca. 200 EUR

Arbeitsspeicher

Beim Arbeitsspeicher fiel die Wahl auf 16GB (4x4GB) – unspektakuläre, aber verlässliche – Bausteine von Kingston. Und zwar zweimal das Kingston ValueRAM DIMM 8 GB DDR3-1333 Kit.
Das dieses System kein ECC unterstützt, lässt sich das Geld hier beim Speicher sparen.

Preis: ca. 80 EUR

Grafikkarte

Die Grafikkarte ist hier optional, da CPU und Mainboard zusammen, eine ausreichend schnelle Darstellung bieten.

Festplatte

Aktuell sicherlich ein heikles Thema, da aufgrund des Hochwasser in Thailand die Festplattenpreise arg angestiegen sind. Das bringt uns in die seltsame Lage, dass SSDs aktuell in einem guten Preis-/Leistungs-Verhältnis zu Festplatten stehen. Ich würde für dieses System demnach eine Mischung aus schneller SSD und kleinerer HDD empfehlen. Meine Wahl fiel hier auf die Intel® 510 Series 2,5″ SSD 120 GB und die Western Digital WD3200AAKS 320 GB.


Quelle: http://www.wdc.com


Quelle: http://www.intel.com

Preis: ca. 230 EUR (SSD) und 100 EUR (HDD)

Laufwerke

Für die Installation von Software (bis die Nutzung von netboot.me soweit ist) und das Ausliefern von Software-Deployments bietet es sich immer noch an einen DVD-Brenner zu verbauen. Meine Wahl fiel hier auf das LG GH22LS70. Neben den gängigen Funktionen bietet das Laufwerk unter anderem auch Lightscribe, welches – bei geeigneten Medien – ein einfaches Beschriften ermöglicht.

Preis: ca. 25 EUR

Gehäuse

Ich habe mich bei der Auswahl der Komponenten an den alten “Pizzaschachteln” (z.B. alte Sun/SGI-Workstations) orientiert. Aktuell teilt sich die Masse an Systemen für Entwickler sowieso in Tower-Workstations oder Notebooks – von einigen hippen Buden, die iMacs nutzen mal abgesehen. War es bis vor wenigen Jahren noch einigermaßen schwierig ein Gehäuse dieser Bauart von der Stange zu bekommen, gibt es Dank des Trends hin zu HTPC Systemen (Wohnzimmer-Multimedia-Video-Systeme), einie eingermaßen große Auswahl.
Meine Wahl fiel hier auf das Lian Li PC-C37B, welches trotz der geringen Abmessungen ein normales ATX-Netzteil, sowie ein Standard Micro-ATX Mainboard aufnehmen kann. Weiterhin sind Steckkarten in halber Bauhöhe möglich.


Quelle: http://www.lian-li.com

Preis: ca. 100 EUR

Netzteil

Mit 530W ist das be quiet! Pure Power L7 530W für dieses System vollkommen ausreichend. Zudem belastet es die Umwelt nicht mit störenden Geräuschen und bietet eine stabile Stromversorung.


Quelle: http://www.be-quiet.net

Preis: ca. 60 EUR

Fazit

Für knapp 900 EUR bietet das System ausreichend Leistung – auch für anspruchsvolle Aufgaben. Durch den Kauf von größeren Festplatten, mehr Arbeitsspeicher und das Hinzufügen einer leistungsstarken Grafikkarte, bietet das System auch noch genug Raum für Erweiterungen. Im Preis nicht enthalten ist allerdings die notwendige Peripherie wie Tastatur und Maus, hier empfehle ich persönlich die Standardtastaturen von Cherry, daneben nutze ich schon seit Jahre eine einfache Logitech Kabelmause (MX 310).

Ein Wort zur Software

Ich bin seit einiger Zeit begeisterter Nutzer von Linux Mint. Diese Distribution verbindet die erfolgreichen Sourcen von Ubuntu (aktuell Ubuntu 11.10) mit einem einheitlichen und ansprechbarem Äußeren. Nett ist auch die gute Vorauswahl an installieren Programmen. So ist es zum Beispiel möglich, nach der Installation all seiner Anwendungen, sich ein DVD Image mit allen notwendigen Packages zu erstellen, um im Falle einer Neuinstallation schnell seinen alten Stand wieder zu erhalten.


Quelle: http://www.linuxmint.com

Startup mit dem Play Framework

Flattr this!

Wie einige vielleicht ja schon wissen beschäftige ich mich jetzt schon seit einige Zeit mit dem recht neuen, aber mittlerweile immer bekannterem, Java-basiertem Web-Framework Play!. Anders als bei vielen neueren Frameworks wird nicht durch die Mittel einer dynamischen Sprache, sondern durch die Vereinfachung der bestehenden Sprachmittel von java versucht die Entwicklung einer Web-Anwendung zu beschleunigen und zu vereinfachen. Das bedeuten unter anderem das konsequente Weglassen der bisherigen Package-Struktur. Auf der anderen Seite werden altbewährte Bibliotheken aus der Java-Welt verwendet (z.B. JPA, Hibernate, Lucene, usw.). Da es eine ganze Menge an englischsprachigen Tutorials gibt und ich mir schon länger vorgenommen habe in einem kleinen Tutorial die grundlegenden Züge einer Play!-Anwendung zu beschreiben, wird dieser Text mal wieder in Deutsch sein :-).

Play verwendet – wie fast alle aktuellen Web-Frameworks ein MVC-Pattern,

So sollte es einem Entwickler (egal ob Ruby, Java oder Python), der mit der aktuellen Techniken vertraut ist, relativ leicht fallen, sich mit dem typischen Aufbaue einer Play-Anwendung zurecht zu finden.

Die Installation des Frameworks ist auf der Seite des Projektes gut erklärt. Neben einer aktuellen JVM sind keine weiteren Vorausetzungen zu erfüllen. Wichtig ist nur, dass das “play” Script im aktuellen Pfad erreichbar ist.

Nachfolgend möchte ich eine kleine Bookmark-Verwaltung erstellen.

Mit einem

# play new bookmarks

Wird die Grundstruktur einer Play-Anwendung erstellt.

Folder Structure

Das oberste Verzeichnis enthält alle Modelle, Controller und Views der Anwendung (dazu später mehr). Unter “conf” befinden sich folgende Dateien:

– application.conf: Konfiguration der Anwendung – Art der DB, Caching, Konfiguration der Module
– dependencies.yml: Play unterstützt Module, die verschiedene Funktionen kapseln können. Seit Version 1.2 werden die Abhängigkeiten einer Anwendung durch Einträge in dieser Datei gesetzt.
– messages: Diese Datei wird für die Internationalisierung einer Anwendung benötigt (amerikanische Strings). Um eine neue Sprache hinzu zu fügen legt man eine neue Datei mit dem entsprechenden Ländercode an – z.B. messages.de für deutsch.
– routes: Play ermöglicht es, durch Einträge in dieser Datei, das Routing der Anwendung zu beeinflussen. Es erfolgt ein Mapping von URL auf Controller-Actions (dazu später mehr).

Das lib Verzeichnis kann verwendet werden um Java Libs zu verwenden, die nicht als Modul für Play! zur Verfügung stehen. Alle Jars im libs-Verzeichnis werden automatisch in den Classpath der Anwendung aufgenommen.

Das test Verzeichnis enthält die die Testdateien (Junit-/Selenium-Tests sowie ew. Fixures mit Testdaten).

Nach dem ersten Start der Anwendung werden noch zwei weitere Verzeichnisse erstellt:
Ein tmp-Verzeichnis (welches die kompilierten Klassen, sowie Caching Dateien enthält) und ein
db-Verzeichnis, welches bei der Wahl einer h2 Datenbank, die entsprechende Datenkbankdatei enthält (auch dazu später mehr).

Dies soll für die ersten 5 Minuten genügen :-).

FreeNAS 8

Flattr this!

Wie einige ja vielleicht wissen, betreibe ich schon seit einiger Zeit ein NAS auf FreeNAS Basis.
Da mir die Verschlüsselung sehr wichtig war und ich bedingt anfangs schwache Speicherausstattung auf Nummer sicher gehen wollte, nutze ich hier aktuell ein FreeBSD Raid5 mit ELI Verschlüsselung.

Aber eigentlich bin ich ja schon immer ein großer FAN von ZFS gewesen. Da der Support von FreeNAS 7 ja scheinbar in absehbarer Zeit nicht mehr gesichert ist, habe ich mich gleich der aktuellsten Version “FreeNAS 8” zugewandt.

Allerdings muss ich sagen, dass ich nach einigen ersten Tests in einer VirtualBox VM doch arg enttäuscht bin.
Natürlich ist nicht zu erwarten, dass die Mädels und Jungs von IX Systems (die sonst einen Prima Job machen), eine neue Version mit allen Features von 7.x raus bringen.
Aber zumindest das was sie dann als final Version 8 raus bringen sollte doch das tun, was es verspricht.

Aber zuerst einmal die positiven Aspekte:

The Good

1. Installation

Im Vergleich zu FreeNAS 7 ist die Installation von FreeNAS 8 in einem Bruchteil der Zeit durchführbar. Da in der offiziellen Empfehlung auch eine Installation auf einem USB Stick empfohlen wird, ist nicht damit zu rechnen, dass solche unschönen Bugs auftauchen, wie in der letzten Version (von 7.2) der Bug mit den Samba-Usern (SMB User müssen nach jedem Neustart per smbpasswd -a neu angelegt werden, da das System ein paar Einstellungen scheinbar “vergißt”).

2. Boot

Der Boot-Prozess wurde ebenfalls deutlich beschleunigt. Im Gegensatz zu den paar Minuten dauerndem Boot-Prozess von 7.2 ist das Booten von 8 in unter einer Minute durch.

3. UI

Das UI wirkt zumindest moderner als die Version 7.2. Es wird viel JS/CSS Foo geboten. Aber irgendwie haben es die Entwickler zu gut gemeint: an einigen Stellen gibt es deutliche Redundanzen in der Navigation – einige Verhaltensweisen des UIs sind in meinen Augen unlogisch. Was sehr schön ist, ist dass sich das UI die geöffneten Tabs merkt – und das überhaupt Tabs benutzt werden (ein Feature, was seit Firefox ja scheinbar zum Standard gehört 😉 ).

The Bad

Irgendwie habe ich das Gefühl, dass zumindest der Unix (FreeBSD?) Unterbau nur sehr schwach mit dem UI (Python/DOJO) verbunden ist. So gibt es über die Shell noch nicht mal einfache Tools wie FDISK. Zudem scheinen ZFS Pools, die über die Web UI angelegt wurden, über die CLI-Tools Zpool und ZFS unauffindbar zu sein.

Was mir persönlich auch fehlt ist die Möglichkeit, Log-Meldungen über das Web UI einzusehen. Scheinbar ist das auch noch so eine Baustelle die da offen ist :-).

Fazit

Zu guter Letzt lässt sich sagen, dass der Anfang schon sehr gut aussieht. Allerdings hat die Software noch so arge Fehler und Probleme, dass ich sie die nächsten paar Monate wohl nicht mehr anfassen werde. Das ich schon bei der einfachsten und essentiellen Funktion, nämlich dem Anlegen eines simplen RAIDZ Pools auf solche Probleme treffe, hätte ich eigentlich nicht erwartet. Mein Test-System bestand wirklich nur aus einer einfachen VM mit 1x4GB Boot Device und 4x2GB Data-Devices. Wieso es hierbei zu solchen Problemen kommt ist mir schleierhaft.

VirtualBox VMs auf Dual-Boot Systemen (FAT32 & 2GB Split Images)

Flattr this!

Die Nutzung von Dual-Boot Systemen (Linux/Windows oder Mac-OS/Windows) bietet sich manchmal an, um vielleicht neben der gängigen Arbeit auch noch mal ein Spiel zocken zu können.
Oder es ist einfach notwendig, eine VM auf einem mobilen Datenträge für die Nutzung auf unterschiedlichen Betriebssystemen zu verwenden.
Das einzige Dateisystem, welches auf allen aktuellen OS-Version ohne die Nutzung von irgendwelchen zusätzlichen Treibern für Schreib- und Lese-Zugriffe verwendet werden kann, ist immer noch FAT32.
Das Problem an der Sache ist nur, dass FAT32 Architektur-bedingt nur eine maximale Dateigröße von 2GB erlaubt.
Virtualbox nutzt standardmäßig das VDI Format, welches leider kein splitten der Image-Dateien erlaubt.

Allerdings fand ich auf der Seite von wischonline.de einen Post in dem erläutert wird, wie man mit dem CLI-Tool VBoxManage .vmdk Dateien erstellt werden können, welche sich in 2GB splitten lassen, aber ebenfalls auch mit Virtualbox nutzbar sind. Das .vmdk Format stammt ja eigentlich von VMWare, allerdingst unterstützt VirtualBox seit einigen Version auch dieses Format.

Als erstes sollte man dafür sorgen, dass VBoxManage im Pfad erreichbar ist (so das noch nicht der Fall ist). Unter Windows habe ich hierzu die Variabel VBOX_HOME auf C:\Program Files\Oracle\VirtualBox gesetzt und anschließend die Umgebungsvariabel PATH um %VBOX_HOME% erweitert (Trennzeichen ; nicht vergessen). Dieses Vorgehen erleichtern
ungemein die Lesbarkeit der PATH Variabel.
Um ein (mitwachsendes) Volume mit 64GB Größe zu erstellen, welche in 32 x 2GB Dateien gesplittet wird, reicht folgender Aufruf:

VBoxManage createhd --filename Win2k8-r2-disk1.vmdk --size 65536 --format vmdk --variant split2g

Anschließend reicht es aus, das neue Image in die vorhandene VM einzubinden und dann mit Imaging-Tools (z.b. gparted oder mit einem simplen DD) eine Copy der größeren Image-Datei durchzuführen. Hierbei sollte man immer stehts dran denken, das Boot-Flag auch in der neuen Partition mit zu setzen. Anschließen entfernt man das alte Image und bootet neu von dem neu erstellten VMDK Image.

“System Fehler 67 aufgetreten ist. Der Netzwerkname wurde nicht gefunden”

Flattr this!

Gerade durchlebte ich mal wieder eine der interessanteren Geschichten im Zusammenhang mit Microsoft-Produkten.
Ziel der Übung war, das der Zugriff von einem Windows Server 2008 auf die Sharepoint-Webdav Freigabe eines anderen WIndows 2008 Servers klappt.

Der Zugriff von einer Sharepoint Instanz auf die andere funktionierte ohne Probleme.

Nur von dem dritten Windows 2008 Server (ohne installiertem Sharepoint) erhielt man beim Versuch die Webdav Freigabe einzubinden die mehr oder minder mehrdeutige Meldung

“System Fehler 67 aufgetreten ist. Der Netzwerkname wurde nicht gefunden” / “System error 67 has occurred. The network name cannot be found”

Die erste Suche brachte uns zu folgender Seite:
http://support.microsoft.com/kb/843156/de
und
http://support.microsoft.com/kb/928692/en

Interessant war der zweite Link… Nein… der brachte nicht die wirkliche Lösung, allerdings zeigte uns der fehlende Eintrag, dass der Webclient Dienst weder lief/noch installiert war….

Eine kurze Recherge brachte hervor, dass dieser Client im Feature “Desktop-Experience” enthalten ist oder halt mit Sharepoint mitinstalliert wird.

Nach der Installation des Desktop-Experience war unser Server dann um Virenscanner, Media-Player und halt auch einem WebClient reicher….

danach klappte dann auch die Verbindung…

Wieso allerdings bei den Beispielen immer eine Webdav Freigabe angeboten wird (http://…) obwohl der Client nicht vorhanden ist, wird wohl auf ewig das Geheimnis des Entwicklers bleiben.

Mass Conversion of different video files with handbreak-CLI

Flattr this!

I am currently converting all my videos to a fixed format using handbrake. If you have a lot of videos to convert, the UI version of handbrake is not always the best solution. Handbrake offers a CLI, sometimes you it needs to be installed separately.

It has a lot of options ( https://trac.handbrake.fr/wiki/CLIGuide ). So the best is to go with your preferred preset.
I want to encode all video files in a given folder to the preset “universal”.
So i wrote a short bash script, to to the work:


#!/bin/bash
# Folder Setup
OUT_FOLDER=/home/media/out
IN_FOLDER=/home/media/in
DONE_FOLDER=$OUT_FOLDER/videos_done

if [ ! -f $DONE_FOLDER  ] ; then mkdir -p $DONE_FOLDER; fi
if [ ! -f $OUT_FOLDER  ] ; then mkdir -p $OUT_FOLDER; fi

#All Extensions of the input files
EXTS=( mp4 flv )
#Find Handbrake CLI
HB=`which HandBrakeCLI`

for ext in ${EXTS[@]}; do
	echo "for $ext"
	for FILENAME in `ls $IN_FOLDER/*.$ext`; do
		#echo $FILENAME
		$HB -i $FILENAME  -o $OUT_FOLDER/`basename "$FILENAME" .$ext`.mp4  --preset="Universal"
		mv $FILENAME $DONE_FOLDER/`basename "$FILENAME"`
	done
done

Another use-case might the conversion of some videos to flv for a web playback (or the other way round flv->mp4 for playback on iOS Devices)