28-Feb-2024 11:00
Make cursors great again#
I switched recently my Laptop to a ThinkPad P52 with a 4k display. The display resolution is 3840x2160 pixels on a 15" display - this makes all graphical objects very tiny. I cannot use the NVidia driver at the moment (very likely a buffer being to small in the illumos kernel), I have to use the VESA driver. Also I do use the NsCDE desktop, so I don't have fancy settings available for cursor sizes.

The cursor sizes were not a big deal, since NsCDE has a nice font selector, other things became a bit more difficult like firefox (about:config, layout.css.devPixelsPerPx=1.4).

For LibreOffice I needed to set SAL_FORCEDPI=200 in the environment, for generic QT applications I had to set QT_SCALE_FACTOR=2.

For GTK applications, I changed ~/.gtkrc-2.0 and ~/.config/gtk-3.0/settings.init to include especially

gtk-cursor-theme-size = 20
gtk-double-click-time = 750
For the mouse cursors it was pretty complicated. NsCDE ships some custom cursors in /usr/local/share/NsCDE/icons/cursors which I have resized with ImageMagick.

The basic cursor instead got changed with some other ways. In $HOME/.fonts/ I have created a file called fonts.alias, the file contains:

cursor -xfree86-cursor-medium-r-normal--0-180-218-218-p-0-adobe-fontspecific
Query with xset q and look at the Font Path. In my case $HOME/.fonts was not in it, so I would add it with xset +fp ~/.fonts .Initially you want to rehash your font cache:
fc-cache -r && xset fp rehash
For testing you could now set your new cursor:
xsetroot -cursor_name left_ptr

However you need to persist this in ~/.NsCDE/Xset.conf, append the following two lines to it:

xset +fp ~/.fonts
xsetroot -cursor_name left_ptr
Log out and log in again and enjoy big cursors.
Posted by Olaf Bohlen  Permalink
13-Feb-2023 22:15
OpenWRT software appliance on OpenIndiana#

I got myself a ThinkPad T470 and unfortunately the WiFi chip is not supported by illumos. Since my kernel driver porting skills are not so good ;) I decided to do a different thing.

I'm going to run a bhyve VM, pass through the WiFi card to it, and run OpenWRT inside the VM.

Download OpenWRT#

Go to https://downloads.openwrt.org/releases/ pick a version and download the openwrt*x86-64-generic-ext4-combined-efi.img image, I used https://downloads.openwrt.org/releases/22.03.3/targets/x86/64/openwrt-22.03.3-x86-64-generic-ext4-combined-efi.img.gz.

Setup the bhyve zone#

# zonecfg -z router
create -b
set zonepath=/export/zones/router
set brand=bhyve
set autoboot=true
set ip-type=exclusive
add net
set physical="routerint0"
add device
set match="/dev/zvol/rdsk/rpool/export/bhyve/routerd0"
add device
set match="/dev/ppt0"
add attr
set name="bootrom"
set type="string"
set value="BHYVE_RELEASE"
add attr
set name="bootdisk"
set type="string"
set value="rpool/export/bhyve/routerd0"
add attr
set name="vcpus"
set type="string"
set value="1"
add attr
set name="ram"
set type="string"
set value="1G"
add attr
set name="vnc"
set type="string"
set value="on"
add attr
set name="extra"
set type="string"
set value="-S -s 8:0,passthru,/dev/ppt0"

Now we need to create the VNIC, the disk and the passthru device.

The Disk ist easy:

# zfs create -V 1G -o compression=lz4 rpool/export/bhyve/routerd0
# dd if=openwrt-22.03.3-x86-64-generic-ext4-combined-efi.img of=/dev/zvol/rdsk/rpool/export/bhyve/routerd0 bs=1024k

Now, let's set up the networking. We are going to create an Etherstub with two interfaces, one for the laptops global zone and one for the router vm.

First ensure that nwam (NetWork AutoMagic) is turned off:

# svcadm enable svc:/network/physical:default
# svcadm disable svc:/network/physical:nwam

Now we will create the Etherstub (SDN switch) and the virtual NICs:

# dladm create-etherstub dmz0
# dladm create-vnic -l dmz0 routerint0
# dladm create-vnic -l dmz0 dmzint0

We need to create an IP interface, configure a static IP on that interface and set the new default route persistent ("route -p") to the later configured OpenWRT:

# ipadm create-if dmzint0
# ipadm create-addr -T static -a local= dmzint0/v4
# route -p add default

Boot OpenWRT the first time#

Open two different xterms. In the first we install the zone and then open the zones console:
# zoneadm -z router install
# zlogin -C router

In the other xterm we boot up the zone:

# zoneadm -z router boot

After ca. 60 seconds or even less, OpenWRT should be booted completely and if you hit "return" in the zones console, you should get the OpenWRT root shell:


At this prompt, we need to configure the Ethernet first. VNICs on illumos have a MTU of 9000 by default, so we should configure the same MTU for the eth0 in the OpenWRT config also. At the same time we change the LAN IP to the one we chose before. For that we open with vi the /etc/config/network file on the OpenWRT and change the relevant parts:

config device                         
        option name 'br-lan'          
        option type 'bridge'          
        list ports 'eth0'             
        option mtu '9000'             
        option mtu6 '9000'  

config interface 'lan'                         
        option device 'br-lan'                 
        option proto 'static'                  
        option netmask ''         
        option ip6assign '60'         
        option ipaddr ''  
config device                         
        option name 'eth0'            
        option mtu '9000'             
        option mtu6 '9000'            

after that reboot the OpenWRT instance:

root@OpenWrt:~# reboot

After that step, you need to configure the wifi card correctly, for that you need to install the correct packages to OpenWRT with okpg, please consult the OpenWRT documentation.

After setting up this stuff, I realised that DrScream also already did something very similar here: https://www.cyber-tec.org/2019/05/29/using-bhyve-pci-passthrough-on-omnios/

Posted by Olaf Bohlen  Permalink
16-Feb-2022 18:15
Running OpenShift Container Platform in bhyve containers on OpenIndiana#


The scenario is as following, we have two physical machines:
  • sin (runs various stuff like NFS)
  • spin (only runs bhyve VMs for OCP)

Both run OpenIndiana. On "sin" we run multiple zones for LDAP, DNS, DHCP, etc...I'm not going into full detail here.

The host "spin" is actually empty. It's an old Sun X4270 M2 machine with 2 Sockets, 6 Cores X5675 @ 3.07GHz and 144GB RAM. The chassis has twelve disks and I also added two (consumer) NVMe's on PCIe adapters.

Two disks form a ZFS boot mirror (rpool), the other disks form a raidz stripe (localstripe) which has 2 hotspares, one slog device (NVMe) and one l2arc (also NVMe):

root@spin:~# zpool status
  pool: localstripe
 state: ONLINE
  scan: none requested

	NAME                     STATE     READ WRITE CKSUM
	localstripe              ONLINE       0     0     0
	  raidz1-0               ONLINE       0     0     0
	    c8t2d0               ONLINE       0     0     0
	    c8t3d0               ONLINE       0     0     0
	    c8t4d0               ONLINE       0     0     0
	    c8t5d0               ONLINE       0     0     0
	  raidz1-1               ONLINE       0     0     0
	    c8t6d0               ONLINE       0     0     0
	    c8t7d0               ONLINE       0     0     0
	    c8t8d0               ONLINE       0     0     0
	    c8t9d0               ONLINE       0     0     0
	  c5t0026B7682D581035d0  ONLINE       0     0     0
	  c6t0026B7682D1B8DA5d0  ONLINE       0     0     0
	  c8t10d0                AVAIL   
	  c8t11d0                AVAIL   

errors: No known data errors

  pool: rpool
 state: ONLINE
  scan: resilvered 19.2G in 0 days 00:03:25 with 0 errors on Mon Feb 14 21:29:12 2022

	rpool       ONLINE       0     0     0
	  mirror-0  ONLINE       0     0     0
	    c8t0d0  ONLINE       0     0     0
	    c8t1d0  ONLINE       0     0     0

errors: No known data errors
The disks are standard 600GB SAS II drives.

The machine has a 10G ixgbe NIC, where I configured the VNICs on.
root@spin:~# dladm show-vnic
LINK         OVER         SPEED  MACADDRESS        MACADDRTYPE         VID
spinpub0     ixgbe0       10000  2:8:20:d2:1f:63   random              100
bootstrapint0 ixgbe0      10000  2:8:20:3b:26:2    random              100
master02int0 ixgbe0       10000  2:8:20:22:c1:10   random              100
master00int0 ixgbe0       10000  2:8:20:61:3b:13   random              100
master01int0 ixgbe0       10000  2:8:20:28:b3:a8   random              100
worker02int0 ixgbe0       10000  2:8:20:7c:12:3a   random              100
worker03int0 ixgbe0       10000  2:8:20:62:e:e0    random              100
worker00int0 ixgbe0       10000  2:8:20:ad:2b:6c   random              100
bastionint0  ixgbe0       10000  2:8:20:f9:2e:58   random              100
worker01int0 ixgbe0       10000  2:8:20:12:51:4d   random              100

Setup Zones#


I took an ansible playbook to create the bhyve zones, but to have it more generic I'll show you the zone config here. All zones have the same config, except for bastion, this has less RAM and CPU.

For OpenShift we need to have:

  • 1 bastion node (if you don't have any other linux machine)
  • 1 bootstrap node
  • 1 LoadBalancer zone
  • 3 master servers
  • 2 workers


The bastion will be used to run the OpenShift installer, which is only available for Linux/x64 and MacOS X/x64.

The zone config for the bastion looks like this:

root@spin:~# zonecfg -z bastion export
create -b
set zonepath=/localstripe/zones/bastion
set brand=bhyve
set autoboot=true
set ip-type=exclusive
add fs
set dir="/localstripe/install/rhel-8.4-x86_64-dvd.iso"
set special="/localstripe/install/rhel-8.4-x86_64-dvd.iso"
set type="lofs"
add options ro
add options nodevices
add net
set physical="bastionint0"
add device
set match="/dev/zvol/rdsk/localstripe/vm/bastiond0"
add attr
set name="bootdisk"
set type="string"
set value="localstripe/vm/bastiond0"
add attr
set name="vnc"
set type="string"
set value="on"
add attr
set name="vcpus"
set type="string"
set value="2"
add attr
set name="ram"
set type="string"
set value="6G"
add attr
set name="cdrom"
set type="string"
set value="/localstripe/install/rhel-8.4-x86_64-dvd.iso"

I took a RedHat Enterprise Linux 8.4 DVD, but CentOS or Fedora would do the job also. This zone gets access to a ZVOL:

root@spin:~# zfs get volsize localstripe/vm/bastiond0
NAME                      PROPERTY  VALUE    SOURCE
localstripe/vm/bastiond0  volsize   20G      local

No other special attributes are set on this, so that's it. Start booting the zone, attach socat to the vnc socket and install Linux the usual way:

root@spin:~# socat TCP-LISTEN:5905,reuseaddr,fork UNIX-CONNECT:/localstripe/zones/bastion/root/tmp/vm.vnc

(1227) x230:/export/home/olbohlen$ vncviewer spin::5905


OpenShift runs on different nodes (bhyve VMs) and we need an external LoadBalancer to access the Kubernetes API and the OpenShift Router. In production environment you would want to make that LoadBalancer HA with VRRP, but in this scenario we go the simple way.

First set up a standard ipkg OI zone (I did that on the other Hardware, "sin"):

root@sin:~# zonecfg -z api export
create -b
set zonepath=/localstripe/zones/api
set brand=ipkg
set autoboot=true
set ip-type=exclusive
add net
set physical="api0"
root@sin:~# zoneadm -z api install
We don't need anything fancy.
Once the api zone is installed, we install the OpenIndiana integrated LoadBalancer (ilb) and start it:
root@api:~# pkg install service/network/load-balancer/ilb
root@api:~# svcadm enable ilb

The configuration I use looks like the following:

root@api:~# ilbadm export-cf
create-servergroup masters
add-server -s server= masters
add-server -s server= masters
add-server -s server= masters
create-servergroup workers
add-server -s server= workers
add-server -s server= workers
create-healthcheck -n -h hc-test=tcp,hc-timeout=3,hc-count=3,hc-interval=60 hc-masters
create-healthcheck -n -h hc-test=tcp,hc-timeout=3,hc-count=3,hc-interval=60 hc-workers
create-rule -e -p -i vip=,port=6443,protocol=tcp -m lbalg=roundrobin,type=NAT,proxy-src=,pmask=/32 -h hc-name=hc-masters,hc-port=6443 -t conn-drain=70,nat-timeout=70,persist-timeout=70 -o servergroup=masters mastersrule
create-rule -e -p -i vip=,port=22623,protocol=tcp -m lbalg=roundrobin,type=NAT,proxy-src=,pmask=/32 -h hc-name=hc-masters,hc-port=22623 -t conn-drain=70,nat-timeout=70,persist-timeout=70 -o servergroup=masters mcsrule
create-rule -e -p -i vip=,port=80,protocol=tcp -m lbalg=roundrobin,type=NAT,proxy-src=,pmask=/32 -h hc-name=hc-workers,hc-port=80 -t conn-drain=70,nat-timeout=70,persist-timeout=70 -o servergroup=workers httprule
create-rule -e -p -i vip=,port=443,protocol=tcp -m lbalg=roundrobin,type=NAT,proxy-src=,pmask=/32 -h hc-name=hc-workers,hc-port=443 -t conn-drain=70,nat-timeout=70,persist-timeout=70 -o servergroup=workers httpsrule

Save this output to a file and import it with "ilbadm import-cf -p filename". I use full NAT here for Load-Balancing as the API loadbalancer and the node are in the same IP range.

bootstrap, master and worker zones#

These zones look identical, just replace the host name:
root@spin:~# zonecfg -z master00 export
create -b
set zonepath=/localstripe/zones/master00
set brand=bhyve
set autoboot=true
set ip-type=exclusive
add net
set physical="master00int0"
add device
set match="/dev/zvol/rdsk/localstripe/vm/master00d0"
add attr
set name="bootdisk"
set type="string"
set value="localstripe/vm/master00d0"
add attr
set name="vnc"
set type="string"
set value="on"
add attr
set name="ram"
set type="string"
set value="16G"
add attr
set name="vcpus"
set type="string"
set value="4"
They all have access to their own ZVOL:
root@spin:~# zfs get volsize localstripe/vm/master00d0
NAME                       PROPERTY  VALUE    SOURCE
localstripe/vm/master00d0  volsize   250G     local

Thankfully bhyve will try PXE if the bootdisk ZVOL is empty, so we don't have to setup additional things here.

Install all the zones with "zoneadm -z zonename install", which should be pretty fast for bhyve zones. Just don't boot them up yet.

We will follow the OpenShift installation instruction for UPI installations, see the appropriate docs for your OpenShift Version on https://docs.openshift.com.

Installing OpenShift#

Download required material#

You need to login to https://cloud.redhat.com, select "OpenShift" and "Create Cluster". There scroll down to "Platform agnostic". This will take you to a page where you have to download:
  • The Openshift installer (openshift-install)
  • The OpenShift client (oc)
  • The pull secret (access tokens for Red Hat registries)

Save these files on the bastion node which we created earlier.

Setup up install-config.yaml#

Create a empty directory as a non-root user somewhere, inside this directory create a file called "install-config.yaml":
[localadm@bastion ~]$ cat install-config.yaml 
apiVersion: v1
baseDomain: home.eenfach.de
- hyperthreading: Enabled
  name: worker
  replicas: 2
  hyperthreading: Enabled
  name: master
  replicas: 3
  name: ocp4
  - cidr:
    hostPrefix: 23
  networkType: OpenShiftSDN
  none: {}
fips: false
pullSecret: |
  {paste pull secret in here}
sshKey: |
  {paste a ssh public key in here}

Copy this file into a backup location somewhere, as the openshift-install command will consume the file and delete it. If you need to restart, you can use the backup.

Create Ignition Files#

After creating the install-config.yaml we can process this and create ignition files for Red Hat CoreOS. We first create manifests (which you could review or customize, but we don't) and then we create ignitions:

[localadm@bastion ocp4]$ ls
[localadm@bastion ocp4]$ openshift-install create manifests
[localadm@bastion ocp4]$ openshift-install create ignition-configs
[localadm@bastion ocp4]$ ls
auth  metadata.json  worker.ign  bootstrap.ign  master.ign

The ignition files (*.ign) need to be pushed to a web-server that is accessible for the OpenShift nodes.

Set up PXE boot#

The relevant part of my dhcpd4.conf looks like this:
subnet netmask {
  option routers;
  option domain-name "srv.home.eenfach.de";
  option domain-search "srv.home.eenfach.de","home.eenfach.de","eenfach.de";
  option domain-name-servers;
  option subnet-mask;
  option ntp-servers,,;
  group {
    filename "shimx64.efi";
    host master00.ocp4.home.eenfach.de {
      hardware ethernet 2:8:20:61:3b:13;
      option host-name "master00";
Of course you want to put all masters, workers and the bootstrap in there also.

Then you need to get the shimx64.efi and grubx64.efi from the RHEL shim-x64.x86_64 rpm. I just installed it on the bastion and copied it to the /tftpboot on my DHCP Server.

The reason is that bhyve boots UEFI only and the classic pxelinux from RHEL only supports BIOS boots, so we use the grub shim boot.

Create grub configs for every MAC.

An example for a Master:

root@skirnir:/tftpboot# cat grub.cfg-01-02-08-20-22-c1-10
menuentry 'Master: Install Red Hat Enterprise Linux CoreOS' --class fedora --class gnu-linux --class gnu --class os {
        linuxefi rhcos-4.6.1-x86_64-live-kernel-x86_64 coreos.inst.install_dev=/dev/vda coreos.live.rootfs_url= coreos.inst.ignition_url= console=tty0 console=ttyS0
        initrdefi rhcos-4.6.1-x86_64-live-initramfs.x86_64.img

An example for a worker:

root@skirnir:/tftpboot# cat grub.cfg-01-02-08-20-12-51-4d
menuentry 'Worker: Install Red Hat Enterprise Linux CoreOS' --class fedora --class gnu-linux --class gnu --class os {
        linuxefi rhcos-4.6.1-x86_64-live-kernel-x86_64 coreos.inst.install_dev=/dev/vda coreos.live.rootfs_url= coreos.inst.ignition_url= console=tty0 console=ttyS0
        initrdefi rhcos-4.6.1-x86_64-live-initramfs.x86_64.img

And an example for the bootstrap node:

root@skirnir:/tftpboot# cat grub.cfg-01-02-08-20-3b-26-02
menuentry 'Bootstrap: Install Red Hat Enterprise Linux CoreOS' --class fedora --class gnu-linux --class gnu --class os {
        linuxefi rhcos-4.6.1-x86_64-live-kernel-x86_64 coreos.inst.install_dev=/dev/vda coreos.live.rootfs_url= coreos.inst.ignition_url= console=tty0 console=ttyS0
        initrdefi rhcos-4.6.1-x86_64-live-initramfs.x86_64.img

Ensure that you have rhcos-4.6.1-x86_64-live-initramfs.x86_64.img and rhcos-4.6.1-x86_64-live-kernel-x86_64 in the /tftpboot as well, and that rhcos-4.6.1-x86_64-live-rootfs.x86_64.img is accessible from the specified web url (try with curl for example).

Setting up DNS#

My DNS zone looks like this:

root@voluspa:/var/named# cat ocp4.home.eenfach.de
$TTL    3600
@       IN      SOA     ocp4.home.eenfach.de. hostmaster.eenfach.de.  (
                                2022021500      ; Serial
                                3600            ; Refresh
                                300             ; Retry
                                3600000         ; Expire
                                3600 )          ; Minimum
                IN      NS      voluspa.srv.home.eenfach.de.
bastion         IN      A
bootstrap       IN      A
master00        IN      A
etcd00          IN      A
_etcd-server-ssl._tcp.ocp4      IN      SRV     0 10 2380 etcd00
master01        IN      A
etcd01          IN      A
_etcd-server-ssl._tcp.ocp4      IN      SRV     0 10 2380 etcd01
master02        IN      A
etcd02          IN      A
_etcd-server-ssl._tcp.ocp4      IN      SRV     0 10 2380 etcd02
worker00        IN      A
worker01        IN      A
*.apps          IN      A
api             IN      A
api-int         IN      A
dns             IN      CNAME   voluspa.srv.home.eenfach.de.

Ensure that you set up matching PTR records also.

That should be it, we could kick off the installations.

Starting the RHCOS installation#

Boot your bootstrap zone, zlogin -C bootstrap and watch the console. When the grub menu appears, hit return (or put timeout values in the grub.cfg files) and let the boot proceed. The bootstrap will reboot after a while and finally it will show a login prompt.

Now also boot your master zones, also observe the console and wait until they show the login prompt, after that do the same with the workers.

Observing the installation#

On the bastion node, observe the installation with

 openshift-install wait-for bootstrap-complete 

At some point it should say that it is now safe to remove the bootstrap node. Log in to the loadbalancer zone and remove the bootstrap from the masters servergroup. Then shut down the bootstrap.

Again on the bastion run

 openshift-install wait-for install-complete --log-level=debug 

Open another shell to the bastion and watch the cluster:

export KUBECONFIG=$HOME/ocp4/auth/kubeconfig
oc get nodes; oc get csr

You should see the nodes getting read. If CSRs are in a pending state, approve them with "oc adm certificate approve". Depending on your hardware and network this takes some time, but finally your cluster should be ready.

Posted by Olaf Bohlen  Permalink
04-Jan-2022 22:02
Running podman containers in bhyve in OpenIndiana Zones#

First you need a running OpenIndiana installation on an amd64 system that supports bhyve. You can check bhyve compability with https://downloads.omnios.org/misc/bhyve/bhhwcompat.

(709) x230:/root# ./bhhwcompat   
CPU vendor string: GenuineIntel
... CPU supports VMX
... VMX support is enabled in BIOS
... VMX supports TSC Offsetting
... VMX supports VM Exit on MWAIT
... VMX supports VM Exit on MONITOR
... VMX supports VM Exit on CR8 Load
... VMX supports VM Exit on CR8 Store
... VMX supports Unconditional I/O exiting
... VMX supports MSR bitmap
... VMX supports Interrupt-window exiting
... VMX supports NMI-window exiting
... VMX supports Secondary VMX controls
... VMX supports EPT
... VMX supports VPID
... VMX supports Unrestricted Guest
... VMX supports single INVEPT
... VMX supports all INVEPT

bhyve is supported on this system.

If bhyve is supported, install a few packages:

# pkg install system/bhyve system/bhyve/firmware \
> system/library/bhyve system/zones/brand/bhyve

Now you need a Linux ISO image. I chose RHEL 8.5 in my case, but you can pick any other. Just one word of attention here: some Linux distros have issues with the EFI firmware of bhyve, RHEL 8.2 refused to boot. The issue was fixed in 8.5 at least.

Set up a vnic for networking:

# dladm create-vnic -l e1000g0 bhyvevm0

Set up a ZFS volume for the VM image:

# zfs create -V 20G -o compression=lz4 rpool/bhyvevol0

Now we set up a zone:

# zonecfg -z bhyvevm <<EOF
create -b
set zonepath=/export/zones/bhyvevm
set brand=bhyve
set autoboot=false
set ip-type=exclusive
add net
set physical="bhyvevm0"
add fs
set dir=/rpool/iso/rhel-8.5-x86_64-boot.iso
set special=/rpool/iso/rhel-8.5-x86_64-boot.iso
set type=lofs
add options ro
add options nodevices
add attr
set name=cdrom
set type=string
set value=/rpool/iso/rhel-8.5-x86_64-boot.iso
add device
set match="/dev/zvol/rdsk/rpool/bhyvevm0"
add attr
set name="bootdisk"
set type="string"
set value="rpool/bhyvevm0"
add attr
set name="vnc"
set type="string"
set value="on"
add attr
set name="acpi"
set type="string"
set value="off"
add attr
set name="bootrom"
set type="string"
set value="BHYVE_RELEASE"
# zoneadm -z bhyvevm install
# zoneadm -z bhyvevm boot
# socat TCP-LISTEN:5905,reuseaddr,fork UNIX-CONNECT:/export/zones/bhyvevm/root/tmp/vm.vnc

Now on another Terminal open vncviewer:

$ vncviewer ::5905

Follow the installation instructions of your Linux distro. After that, install podman on your Linux VM and then you can run containers in bhyve in a container ;)

Posted by Olaf Bohlen  Permalink
17-Nov-2021 11:41
Manche Personalvermittler moegen sich wirklich Muehe geben, aber viele (wenn nicht die meissten) leider nicht. Ein wirklich tolles Beispiel folgt hier. Ich bekam folgende e-Mail und haette normaler Weise nicht reagiert, wenn die Person nicht behauptet haette mein Profil auf github(!) gesehen zu haben.
Sehr geehrter Herr Bohlen,

ich bin spezialisiert auf Festanstellungen und Direktvermittlung im 
kaufmännischen Bereich und habe Ihr Profil bei Github gesehen. 
Aktuell suche ich im Auftrag eines Kunden nach einem ERP-Consultant
mit SQL und VBA-Kenntnissen. Gerne möchte ich mich mit Ihnen 
austauschen was ein neuer Job mitbringen muss, damit er für Sie
interessant ist.
Wann hätten Sie dafür Zeit?
Ich freue mich auf Ihre Rückmeldung, gerne auch telefonisch.
Mit freundlichen Grüßen / Best regards

Das klang alles so voellig falsch das ich mich genoetigt sah doch zu antworten:

Sehr geehrte Frau ...

Ich habe ihr Profil in einer eMail entdeckt und gesehen das sie
aus Muenchen sind. Aktuell bin ich auf der Suche nach einem
Dipl. Bierbrauer und moechte mich gerne mit Ihnen ueber diese
Stelle austauschen...

Entschuldigen sie, aber haben sie wirklich einen Blick *in* mein
GitHub Profil geworfen oder nur festgestellt das ich eines habe
und im Besitz einer gueltigen e-Mail Adresse bin?

Wie kommen sie aufgrund meines Profils auf die Einschaetzung das
ich SQL und VBA Kenntnisse habe? Keines meiner Repositories auf
GitHub nutzt VBA. Ebenso bin ich auch kein ERP Consultant.

Sie haben offensichtlich keinerlei Ahnung was sie da recruiten
wollen, also ersparen sie den armen Mitmenschen ihre Versuche oder
fangen sie bitte, bitte an sich mehr Muehe zu geben.

Kleiner Tipp: eine andere Formulierung kann schon Wunder wirken:


Hallo Herr Bohlen,

ich habe ueber eine Suche ihr Profil auf GitHub entdeckt.
Ich bin mir nicht sicher ob Sie in mein Suchprofil passen, denn
ich sehe dort das sie ein "Solaris Admin" sind und "SPARC
user". Ich bin aktuell auf der Suche nach einem ERP Consultant mit
SQL und VBA Kenntnissen. Ist das Teil ihres Wissens bzw, sind Sie
interessiert daran in dem Umfeld zu arbeiten?


Das war jetzt mal kostenloses HR Consulting. Die naechste e-Mail
kostet dann aber mindestens eine Tuete Gummibaerchen...

Mit freundlichen - aber leider an ihrer Vakanz uninteressierten -

Das war - glaube ich - wenig missverstaendlich und auch grade noch so hoeflich genug. In der Regel gibt es dazu keine Antwort mehr, aber in diesem Falle kam folgendes:

Sehr geehrter Herr Bohlen,

auf github sind leider nur eingeschränkt Informationen zu entnehmen, wie 
beispielsweise, dass Sie als Training Consultant tätig sind oder auch mal
als Systemadministrator tätig waren. Das sind sehr vage Informationen, die
ich durch ein Gespräch mit Ihnen gerne vervollständigt hätte. Die Stelle
des ERP-Consultant ist nur ein Beispiel gewesen bzw. ein Vorschlag, über
den wir im weiteren Verlauf genauer hätten sprechen können. Deshalb ja 
auch meine Frage, was ein Job denn mitbringen muss um für Sie interessant
zu sein, da ich eben genau nicht wissen kann, welche Kenntnisse und
Jobpräferenzen Sie mitbringen. Es tut mir sehr leid, wenn ich mich
unverständlich ausgedrückt habe. Gerne können wir uns bei Interesse
Ihrerseits über Ihren Werdegang und unsere Möglichkeiten, Sie aktiv bei
der Suche nach einer neuen Herausforderung zu unterstützen, unterhalten.

Mit freundlichen Grüßen

Nur eingeschraenkte Informationen? Auf github steht das ich Training Consultant bin? Das ist mir neu...

Sehr geehrte Frau ...,

Entschuldigen Sie bitte, aber verwechseln Sie grade github.com mit

Auf github.com steht deutlich lesbar unter meinem Bild:

Olaf Bohlen olbohlen
Solaris Admin, SPARC user, OpenIndiana contributor, Hobby sailor, Dad & Husband

Wenn Sie ein wenig Ahnung haetten was die Begriffe bedeuten, so
haetten Sie auf keinen Fall geglaubt das ich VBA Erfahrung habe.
Ausserdem koennen sie auf GitHub sehr schnell in meinen
Repositories sehen das ich kein einziges mit VB/VBA code habe.

Nehmen wir also mal an sie sind versehentlich bei LinkedIn
gelandet und glauben es ist GitHub (und mit Verlaub, das ist
wirklich etwas ganz anderes...).

Selbst ohne Login(!) auf LinkedIn koennen sie eben nicht nur
"vage" Informationen bekommen, sondern deutliche. Und das
unterscheidet gute von schlechten Recruitern: gute wissen was sie
suchen und was die Kandidaten koennen.

Gehen wir doch mal eben mein oeffentliches LinkedIn Profil durch:

Olaf Bohlen

Training Consultant bei NIIT Limited

     Bremen Area, Germany
     Education Management
     NIIT Limited, illumos
     BTC IT Services GmbH, BTC - Business Technology Consulting AG, noris network AG

     Staatl. Berufsschule III Fürth
Aha, der Olaf Bohlen ist also Training Consultant. Er scheint also
aktuell in der Erwachsenenbildung aktiv zu sein. Ausserdem ist er
bei "illumos" taetig - einen Googlehupf weiter erkennt man, das es
sich hierbei um ein nicht Windows-Betriebssystem handelt. (Und
ihre Anfrage ist absolut Windows-lastig...)

Gibt es noch mehr Indikatoren das Olaf Bohlen nicht in ihr Profil
Schauen wir mal etwas weiter unten auf der Seite:

 - UNIX of different kinds, especially illumos and Linux but also Solaris, AIX, 
 - Java EE Application servers like JBoss EAP, WebLogic, IBM WebSphere
 - Databases: Oracle, DB/2, PostgreSQL, mySQL
 - Hardware: Sun SPARC, IBM RS/6000 (pSeries), SGI MIPS, x86
 - Network Equipment: Cisco Switches (Catalyst), Cisco Routers, Foundry Networks
 Switches and Loadbalancers (Server- and BigIron), Bintec Routers, Ascend Router
s (Pipeline and MAX)
 Specialties: illumos, SPARC Hardware

Huch, das klingt nicht nach ERP, sondern ziemlich nach IT
Infrastruktur (Hardware, Betriebssysteme, Application Server). Und
auch hier taucht nirgendwo VBA oder Windows auf.

 Hiernach folgt eine Liste mit Stichpunkten meiner Taetigkeiten in
 Vergangenheit. Alles Unix Jobs...
 Bei der Liste meiner Zertifikate...vorallem RedHat
 Zertifikate...auch Linux/Unix/Infrastruktur.
 > Die Stelle des ERP-Consultant ist nur ein Beispiel
 > gewesen bzw. ein Vorschlag, über den wir im weiteren Verlauf
 > genauer hätten
 > sprechen können. Deshalb ja auch meine Frage, was ein Job denn
 > mitbringen muss um für Sie interessant zu sein, da ich eben
 > genau nicht
 > wissen kann, welche Kenntnisse und Jobpräferenzen Sie
 > mitbringen. Es tut mir sehr leid, wenn ich mich unverständlich
 > ausgedrückt habe.
 Ach wissen sie...ich bin ja nicht ganz bloed und habe eine
 Vermutung, das sie einfach ein Filter-Tool nutzen mit den
 Suchworten "Consultant, SQL" und da haben sie mich gefunden.
 Und das zeigt verschiedene Dinge:
 - Sie wissen leider ueberhaupt nicht was Sie da genau suchen
 - Sie koennen die Ihnen zur Verfuegung stehenden Daten nicht
 - eine schnelle Akquise ist Ihnen wichtiger, als sich mit dem
   Thema zu beschaeftigen und einen passenden Kandidaten zu finden
 - Sie haben sich nicht "unverstaendlich" ausgedrueckt, sondern
   einfach kein Interesse an mir oder Ihrem Kunden gezeigt, sonst
   waere ich bei Ihnen schon aus der Kandidatenliste geflogen.
 Sehen Sie, ich bin nicht sauer und ich will Ihnen nichts boeses.
 Aber ich bekomme Anfragen wie Ihre dreimal die Woche - und alle
 sind absolut unqualifiziert.
 Ueberraschen Sie mich (und andere!) beim naechsten Mal und
 bereiten Sie sich vor. Immerhin erwarten Sie das ja auch von uns
 Kandidaten, oder?
 Mit freundlichen Gruessen

Und siehe da, die gute Frau scheint mich endlich verstanden zu haben - aber vermutlich leider(!) Ihr Verhalten nicht aendern:

Guten Tag Herr Bohlen,

 vielen Dank für Ihre Antwort.
 Ich wünsche Ihnen weiterhin alles Gute.
 Freundliche Grüße
Es ist ein elendes Drama - so wird niemals gutes Personal vermittelt. Hoechstens durch absoluten Zufall.

Liebe Personalvermittler: das koennt ihr besser.
Ich weiss es. Beweist es uns.
Posted by Olaf Bohlen  Permalink
24-Aug-2021 10:21
branch always, predict not taken#

Another attempt to continue blogging, language will be mixed english and german, also mixed IT related and others...

Posted by Admin  Permalink