Posts from 2016-04

proxmox: mount NFS share in proxmox

posted on 2016-04-31 20:56

preliminaries

We have two servers:

  • 10.0.0.2 is the proxmox instance
  • 10.0.0.3 is the NFS server ip

create NFS share on NFS server

On the Server you want to create the NFS share:

Create the folder you want to export:

mkdir -p /srv/export/testmount

vim /etc/exports entry:

/srv/export/testmount     10.0.0.2(rw,sync,no_subtree_check,no_root_squash)

Then:

# make the export available
exportfs -ar

# show current exports
showmount -e localhost
#or
exportfs -v

If you have a firewall, allow all traffic from 10.0.0.2.

proxmox

  1. left frame, click on 'datacenter'
  2. tab 'storage', button 'add', choose 'NFS'
  3. id: "servername_of_nfs" or whatever you like
  4. server: 10.0.0.3
  5. export: /srv/export/testmount
  6. choose everything, if you do not want to filter just disk images, apply

If you then click on your newly added storage in the left frame below a hypervisor, you should be able to use all tabs. Otherwise there would happen a 'connection timeout' error of sorts.

openvpn and GNU expect

posted on 2016-04-31 20:56

Since I often need openvpn connections and I like to start them from within terminals to see what actually happens, but dislike having to enter AD credentials everytime, here is a solution with expect to this.

Security-wise that's questionable, but I don't need a lection on that.

Replace <CONFIGFILE>, <USERNAME>, <PASSWORD>, of course.

#!/usr/bin/expect -f



## SETUP

# handle ctrl-c
proc sigint_handler {} {
  # send ctrl-c to openvpn process
  send \x03
  # wait for it to die
  sleep 1
  # quit expect session
  exit
}

# catch ctrl-c
trap sigint_handler SIGINT



## RUN

# start shell...
set timeout -1
spawn $env(SHELL)
match_max 100000

# ... and openvpn within there
send -- "sudo openvpn --config <CONFIGNAME>\r"

# username prompt
expect -exact "^[\[0;1;39mEnter Auth Username: ^[\[0m"
send -- "<USERNAME>\r"

# password prompt
expect -exact "^[\[0;1;39mEnter Auth Password: ^[\[0m"
send -- "<PASSWORD>\r"

# make expect wait so it doesn not exit immediately
expect eof

Replace the ^['s above (four times in the code above) with literal escapes. You can insert these in vim by pressing ctrl-v + Esc in linux.

I always set up openvpn to also push DNS settings (resolvconf package and stuff), so there is some CTRL-c-handling necessary so it works and everything closes cleanly.

The escape codes for the expect lines I could discern by using autoexpect.

Non-functional Requirements

posted on 2016-04-24 17:11

Since I often wondered wether there exists a comprenesive list of non-functional requirements out there, here is a jab at such a list

funktionalitaet angemessenheit interoperablitaet sicherheit richtigkeit ordnungsmaessigkeit

zuverlaessigkeit reife fehlertoleranz wiederherstellbarkeit

benutzbarkeit erlernbarkeit verstaendlichkeit bedienbarkeit

effizienz zeitverhalten verbrauchsverhalten

aenderbarkeit analysierbarkeit stabilitaet pruefbarkeit modifizierbarkeit

uebertragbarkeit anpassbarkeit konformitaet installierbarkeit austauschbarkeit

On test layers

posted on 2016-04-24 15:38

After I have seen one too many diagrams on this, I decided to do my own writeup and get to know all corresponding english terms in the progress. The listing is chronologically ordered in regard to a usual project progressing.

Depending on the progress model being used, it may be less waterfall-y and more incremental. If you happen to make sense of that last sentence, you should know where to make adjustments.

This is more or less a rant from experience and just here for pure entertainment value.

development and quality assurance happening (so you know wether you need only dev's, or testers, too)

1. requirements tests

"First there has to be clear what exactly shall be built."

This can be done via:

  • prototyping (throw-away software implementations)
  • user interface designs and validating these with the customer

What shall be verified here:

  • software requirements specification to be approved by the customer afterwards as a contractual basis
  • DO NOT FORGET TO DO A PROPER PRIORIZATION OF FEATURES IN ACCORDANCE WITH THE CUSTOMER!!!
  • do not implement any nice-to-haves unless you really have free space for such gimmickry you so identified!
  • domain object models consisting of domain classes
  • user scenarios (UML might actually help here)

2. design tests

This write up may not reflect it, but errors in 1. and 2. are the most costly. Let the devs begin, but make sure the eventually get a rock solid specification and design.

"Is the current design feasible at all?"

Discussions, cost estimations, a vague feeling of despair creeps in.

The easy way to make sure most of your estimations will work is talking with your (willing AND able) devs, and ask them for estimations. Then simply double the said time (if the dev is good, 1day->2days), or double it and increase by an magnitude of order (1day->2weeks).

Start priorizing features in accordance to the results from the requirements tests, especially WRT the part which was written in CAPSLOCK above.

  • profitability (will the budget really work?)
  • correctness (will it what it should do?)
  • tracability (can each design artefact be traced back to an origin in the SRS?)

Triple-check traceability. SERIOUSLY. Each error will have a huge string of other problems following afterwards. Correctness errors should be realized in the progress, and capacity planning can be done in parallel.

Errors during this 'phase' will be costly due to all the manpower going into development, releases and acceptance testing.

development happening (testing too, if dev's don't write their unit tests)

3. unit tests, main classes

"Watch the programmers a little..."

Use the unit testing framework of your choice.

  • correctness (does it what it should do?)
  • completeness (does it everything it should?)
  • test coverage (do we test all code that was written and all use case scenarios?)

Here, all main classes should get complete test coverage.

4. unit tests, all other classes

"Watch the programmmers even more..."

Use the unit testing framework of your choice.

  • correctness (does it what is should do?)
  • completeness (does it everything it should do?)
  • test coverage (do we test all code that was written and all use case scenarios?)

Less important code may be put off for complete testing, even though 100% coverage might feel better. But you have to pay everything that gets written, the best code is the one not needed, after all.

development and quality assurance happening

5. code reviews

"Make sure no swearwords can be found anywhere..."

Best these are done by pair programming and integration people, but this depends on your version control system workflow. If all people can commit to your main repository, there will be a lot of swearing in development. Tools like gerrit will help.

  • correctness (does it what it should do?)
  • comprehensibility (will the next employee be able to fix it?)
  • accordance to coding style guide lines (a uniform code layout prevents unneeded mistakes)
  • maintainability (can the code be patched if needed in feasible time without everything breaking each time?)

quality assurance happening

6. integration tests

"Does this even work?"

Try sticking all parts together by packing all code together and compiling it or set up your web application to run.

  • stability (does it run without freezing?)
  • completeness (does it do everything it should?)
  • correctness (does it do what it should?)
  • functionality (can the customer work with it?)
  • deliverability (can we deliver the software, or is release engineering more like playing the lottery?)
  • maintainability (can the code be patched if needed in feasible time without everything breaking each time?)
  • integrability (can all modules be integrated / do the defined interfaces work?)

7. system tests

"Can we sell that?"

Actually running the product on test installations by your people..

  • requirements (is everything in the SRS covered in the product?)
  • usability (can the customer work with it EASILY? If not,your errors lie in 2. above...)
  • completeness (does it do everything it should?)
  • stability (does it run without freezing?)
  • robustness (is it failure-tolerant, or do mysql injections works...)
  • performance (does it run fast, or do you have to profile the application and exchange parts of it with C code?)

8. acceptancs tests

"Let's see how long we will be over time or budget, if we can't drop some of the open issues..."

Actually running the product and letting the customer embarras your company as he finds obvious flaws within minutes which you should have seen months' ago.

  • user acceptance testing for planning final delivery or rollout by simply running the product

For now, most relevant stuff should have gone into here. However do not believe this is complete, I doubt I really have covered here by this quick write-up.

Javascript in very short

posted on 2016-04-24 14:23

Well, here is a VERY rough js overview.

embedding

<script language="JavaScript">
    // code...
</script>

variables

Are defined with var keyword: var myvar = 'asdf';

Arrays: (are associative, too)

var myarray = new Array(20);
myarray[15] = 123;
myarray["test"] = 'asdf';

operators

  • == and != (identity checking)
  • && and ||
  • + also contatenates strings

control structures

conditionals:

  • if (...) { ...; } else { ...; }

loops:

  • while (...) { ...; }
  • for (i=0; i<10; i++) { ...; }

objects

  • document = current HTML document where your js stuff is contained within
  • history = list of last used pages, browser does the bookkeeping
  • location = address of curren site
  • navigator = represents the browser
  • window = self-explanatory. Can be used for resizing, alerts and dialogues.

document.write(...) returns stuff. To show the current cookie, which is contained within the document:

document.write(document.cookie)

Try this in the dev console of your browser, which you should get via pressing F12.

Now some often needed methods or properties of the aforementioned objects:

document

methods:

  • close : close document
  • getSelection : return selected text
  • open : open new document

properies:

  • fgColor : foreground color
  • bgColor : background color
  • cookie : create one or show its content
  • alinkColor : color of active link
  • linkColor : color of a link
  • location : get the documents address
  • title ; document's title

window

methods:

  • close : close window
  • home : load browsers home page
  • open : create new window
  • print : open printing dialogue
  • resizeTo : resize window

methods for creating checkboxes and reading user-data without forms:

  • alert : create OK pop-up dialogue box
  • confirm : create YES/NO pop-up dialogue box
  • prompt : shell dialogue, can be read andused by the js code (var xyz = prompt('enter something now');)

properties:

  • defaultStatus : default text shown in browsers status line
  • status : set or show status line text
  • innerHeight : height of the window in pixels where the document can be shown
  • innerWidth : width of the window in pixels where the document can be shown

history

methods:

  • back : go to previous page
  • forward : go to next page

navigator

properties:

  • appName : return browser name
  • appVersion : return browser version
  • language : return browser language
  • platform : return OS

Finally, javascript also has quite some functions for string handling and matching, substrings, dates. But that will be of no further concern here.

PHP in very short

posted on 2016-04-24 11:56

After having eschewed PHP for as long as I could, heres an extremely quick rundown on its syntax so I can read code more easily in the future instead of just guessing wether a linter would accept my changes. This is designed to be an EXTREMELY quick overview, so bear with me. I don't want to do stuff in php either.

So, with that out of the way, a quick look on this dynamic, weakly-typed language.

website "hello world"

<html>
    <body>
        Does PHP work here?

        <?php echo "Yes."; ?>
    </body>
<html>

Instead of <?php echo "Yes."; ?>, also this should work:

<script language="php">
    echo "Yes.";
</script>

comments

Prefixing lines with // does work.

variables and arrays

Are all prefixed by $:

$string = "I'm a string."
$number = 1234;
$decimal = 1.5;
$bool = true
$array = array(1, 2, 'three');
$associative_array = array('first_element' => 'one', 'second_entry' => '3');

$associative_array[0] is the same as $associative_array['first_element'] when referencing contents.

Arrays can be multi-dimensional, too.

Scope is usually within the contained block, except they are 'globals' or 'super-globals'.

Examples for super-globals are $_SERVER (contains server information), $_GET and $_POST (contain the respective HTTP requests) and can be used from everywhere. GET parameters can also be found in the $QUERY_STRING var as far as I read.

If you want to reference a variable within a function body, you have to make this possible through a global $varname.

To get all contents of an array outputted: var_dump($arrayname)

constants are used like this:

define("CONST_NAME", "CONST_NAME = 0.003")

Usually php does call-by-value (content is passed) instead of call-by-reference (memory address is passed, if memory changes in the background your value changes, too). To force passing references, prepend a &:

&$varname

If you want to let one variable reference another's content directly:

$new_var =& $varname

Lastly there also exist static variables. There are not globals, but they don't lose their definition in between runs of a function. Keyword is is used like 'global', and is called static.

operators

  • +=, -=, *= and /= do exist
  • as well as -- and ++, and can be pre- or appended
  • = simply defines variables
  • == is comparison with weak type checking (equality check)
  • === is comparison with strong type checks (`2 === '2' results in false, identity check)
  • and or && and or and || are also present, as well as ! and xor
  • !=, <=, >=, >, < also exist
  • . and .= concatenate strings

control structures

On conditionals:

  • if ($var) { ... } else if ($other_var == true) { ... } else { ... }
  • for one-line checks braces can be omitted
  • ternary operator also exists: condition ? result_if_yes : result_if_no;

switch-case exists, too:

switch($var) {
    case "one":
        // do something
    break;
    case "two":
        // do something else
    break;
    default:
        // do that if nothing else worked
}

On looping:

  • while ( ... ) { ... }

  • do { .... } while ( ... )

  • break can be used to escape loops, too

  • for ($i=0; $i<10; $i++) { ... }

  • foreach ($arrayname as $value) { ... }; // $value can be used in loop body

  • foreach ($assoc_array as $key => $val) { ... } // $key and $val can be used in loop body

functions

PHP comes with lot of built-in stuff, should you ever need it.

  • math functions
  • date functions
  • string operations
  • printf / formatted printing

Just a quick example how to send mails via PHP:

  • mail('address@host.tld', 'subject', $mailtext)

structuring code

To semantically group your code, you can split it into several files. include and require let you load files (usually with suffix .inc) with further php code into the current file.

'require' is used for function libraries, include for excluding certain parts of your code.

mysql database usage

connecting:

if (!mysql_connect('hostname', 'user', 'password')) die('connection to database cannot be established');

mysql code:

$my_query1 = 'insert into mytablename (row1, row2) values ('one', 'two');
$my_query2 = 'insert into mytablename (row1, row2) values ('" . $_POST['name'] . "', '". $_POST['surname'] . "')';
if (!mysql_query1($my_query)) die('insertion failed');
if (!mysql_query2($my_query)) die('insertion failed');

OO

Object-orientation is also here... Usually you load your class definitions via require instructions from seperate files.

Class definition including a constructor: (function with same name as the class)

class MyClass {
    var $class_var1 = 'asdf';
    var $class_var2 = '';

    function MyClass(){
        $this->class_var2 = 20;
    }
    ...
}

Calling the constructor:

var $obj_instance = new MyClass);

Referencing variable values inside functions within your class, as shown with the constructor:

$this->class_var

Inheritance:

class SomeOtherClass extends MyClass {
    ...
}

Anywaw, favor 'composition over inheritance' I heard somewhere...

filesystem access

Open filehandle, do stuff, close filehandle:

$file = fopen("/path/to/file");
echo fget($file, 100);
fclose($file);

Instead of fget there also exists fread, for writing use fwrite. Further there is fgetcsv for reading .csv files.

This should do for now. Maybe I will also something similar for javascript in the next posting after having grabbed something to eat.

On troubleshooting load-balanced applications

posted on 2016-04-23 23:13

When running loadbalanced applications, in particular a redundant webserver, you have several approaches at your disposal.

In the following it is assumed, that you have a setup with a dedicated Firewall facing externally like this:

* ---FIREWALL --- LOADBALANCER --- WEB SERVER 1 | WEB SERVER 2

Add a custom HTTP Header via the Webserver

  • can be witnessed in browser dev console
  • can be seen in packetdumps like tcpdumps or in wireshark
  • SetEnvIf <custom-flag> in apache, i.e. use the origin IP in question

check timeouts

In case you have had a running setup, which stopped working some times after a while:

Especially, if your configuration were complexer, like the web servers were the front-ends for an application server backend which in turn fronts a database, you might as well check all your timeouts. Maybe you have longer running queries than you did when the application was freshly set up, and you now hit certain tresholds.

A good rule of thumb is have all timeouts set up with equal values. Of course it's a nice idea to change all timeouts when changing the front-end up front...

Turn one node off

  • simply deactivate one node in the loadbalancer and see if you can spot a difference

make all nodes directly reachable

Besides setting up your main ip onto the loadbalancer, give each of the webservers dedicated ips, too. So you can reach them directly, in case you need to test nodes indepently.

Since you usually don't want the web servers to be publicly reachable, they are within their own private subnetwork. Set up further public ips up onto the firewall, that all of these let you reach the firewall.

Beside the main IP which is 1:1 NAT-ted to the LOADBALANCER, do 1:1 NAT's towards the web servers with the other two IP's. Just make sure you restrict access by filtering all IP's besides your own on the firewall.

Now even when a server is removed from the loadbalancer and thus not publicly reachable anymore, for testing purposes it can still be accessed.

terminate SSL connections at the loadbalancer

If you can terminate your HTTPS encryption at the loadbalancer, do it. Besides lessening your server load, it also helps you with not having to decrypt packets when anaylzing packetdumps.

There are scenarios where you will not want that, but if you know that to be the case, you know the solution anyway, too.

clear your cache

If you wonder wether you can reach both web servers at all, and 'sticky' sessions are enabled on the loadbalancer, clear your browser cache. Cookies are then used to lead you always onto the same webserver.

Redo it several times, if you do not succeed at first. That however implicates you know the loadbalancing strategy to work somehow alternating both servers.

If the loadbalancer is using a somehow 'fixed' distribution algorithm, it may effectively create an active-passive setup: Thus you can only reach the second webserver, if the primary one is either removed or simply turned off.

packetdump

When wondering where you lose packets, to long-running packet dumps at the firewall as well as the loadbalancer and the webservers. So you can compare where the network eats your packets or which node is misconfigured.

Don't forget to filter the packets by your local workstation IP (or the ip of the gateway where it is behind), so you don't have to put up with visual information overload.

Special bonus tip here, if you want real time server debugging with wireshark:

  • set up an ssh tunnel, so you can stream data back to your workstation
  • create a FIFO queue file
  • start netcat server locally and pipe its output to the queue
  • open this file in wireshark
  • on the server start the tcpdump piped into netcat sending all data through the tunnel so it reaches your workstation

Happy debugging. I can't do a more detailed description as I am currently in a hurry, but I might do so once I need this again when a tcpdump -vvv -XXX does not suffice.

Free Ebook: Linux Kernel in a Nutshell

posted on 2016-04-21 20:47

To get a free version of Greg Koah Hartman's 'Linux Kernel in a Nutshell', he hosts pdfs of all sections of the book on his homepage here.

There you can download the files bundled in a .zip file and merge them via pdfsam, the best PDF split/merge tool on the planet.

The assembling order of all single files is like this:

  • title.pdf
  • LKNSTOC.fm.pdf
  • part1.pdf
  • ch00.pdf
  • ch01.pdf
  • ch02.pdf
  • ch03.pdf
  • ch04.pdf
  • ch05.pdf
  • ch06.pdf
  • part2.pdf
  • ch07.pdf
  • ch08.pdf
  • part3.pdf
  • ch09.pdf
  • ch10.pdf
  • ch11.pdf
  • colo.pdf
  • part4.pdf
  • appa.pdf
  • appb.pdf
  • LKNSIX.fm.pdf

BTRFS: filesystem rebalance issues

posted on 2016-04-13 06:38

Sometimes a btrfs filesystem will show wrong usage when df -h is used. This can easily be several GB's. (In my particular case I had 1GB space left, after a rebalance it were 6GB...)

Usually a

btrfs filesystem balance /<path-if-needed>

is all you need to do.

However:

root@sjas:/# btrfs fi bal /
ERROR: error during balancing '/': No space left on device
There may be more info in syslog - try dmesg | tail
root@sjas:/#

May stop you short.

Try:

root@sjas:/# btrfs fi balance start -dusage=10 /
Done, had to relocate 0 out of 33 chunks
root@sjas:/# 

Little more explanation provided by the man page:

    usage=<percent>, usage=<range>
       Balances only block groups with usage under the given percentage. The value of 0 is allowed and will clean up
       completely unused block groups, this should not require any new work space allocated. You may want to use usage=0 in
       case balance is returnin ENOSPC and your filesystem is not too full.

       The argument may be a single value or a range. The single value N means at most N percent used, equivalent to ..N
       range syntax. Kernels prior to 4.4 accept only the single value format. The minimum range boundary is inclusive,
       maximum is exclusive.

Afterwards try re-running btrfs fi bal / for possibly even more available space, or use a bigger value for the usage flag.

mysql: mysqlcheck to test, repair and optimize all tables

posted on 2016-04-11 17:46:35

This is all you want:

mysqlcheck --auto-repair -o -A

-o is for optimizing, -A does it for all databases. Beware, might take longer than you think.

If you see in SHOW FULL PROCESSLIST; that mysql starts persisiting large temp tables, it may be in the course of locking your meta tables and thus block the whole database management system.

Kill the process then before it is too late.

A good indicator if something is awry is:

watch -n1 -d "mysql -e 'show full processlist;' | wc -l"

openvswitch: intro

posted on 2016-04-09 23:16

This is for debian testing branch, packages installed from the repository. openvswitch is used without a SDN controller.

prerequisites

Don't use regular linux bridges on your system, you will run into troubles, as far as I heard. (Didn't feel like testing this out myself.)

install packages

apt install openvswitch-switch

setup

# init database
ovs-vsctl init
# check if initialization worked
ovsdb-tool show-log
# find out db file
ovsdb-tool --help
# emergency reset in case you need it
ovs-vsctl emer-reset

# create your virtual switch
ovs-vsctl add-br ovs0
# show your virtual switch
ovs-vsctl list-br
ovs-vsctl add-port ovs0 ovs0eth0
# show your ports on the switch
ovs-vsctl list-ports ovs0

# show current configuration
ovs-vsctl show

Linux: create verifyable disk images with dcfldd

posted on 2016-04-01 20:33

dd (destroyer of disks, haha) can create block-level image copies. But you have no possibility to verify your copies, so try dcfldd (crap name, TBH):

dcfldd if=/dev/sdX of=/dev/sdY hash=sha256 hashwindow=50M hashlog=<FILEPATH>

Don't use md5 for hashing.

This blog covers .csv, .htaccess, .pfx, .vmx, /etc/crypttab, /etc/network/interfaces, /etc/sudoers, /proc, 10.04, 14.04, AS, ASA, ControlPanel, DS1054Z, GPT, HWR, Hyper-V, IPSEC, KVM, LSI, LVM, LXC, MBR, MTU, MegaCli, PHP, PKI, R, RAID, S.M.A.R.T., SNMP, SSD, SSL, TLS, TRIM, VEEAM, VMware, VServer, VirtualBox, Virtuozzo, XenServer, acpi, adaptec, algorithm, ansible, apache, apachebench, apple, applet, arcconf, arch, architecture, areca, arping, asa, asdm, autoconf, awk, backup, bandit, bar, bash, benchmarking, binding, bitrate, blackarmor, blockdev, blowfish, bochs, bond, bonding, booknotes, bootable, bsd, btrfs, buffer, c-states, cache, caching, ccl, centos, certificate, certtool, cgdisk, cheatsheet, chrome, chroot, cisco, clamav, cli, clp, clush, cluster, coleslaw, colorscheme, common lisp, configuration management, console, container, containers, controller, cron, cryptsetup, csync2, cu, cups, cygwin, d-states, database, date, db2, dcfldd, dcim, dd, debian, debug, debugger, debugging, decimal, desktop, df, dhclient, dhcp, diff, dig, display manager, dm-crypt, dmesg, dmidecode, dns, docker, dos, drivers, dtrace, dtrace4linux, du, dynamictracing, e2fsck, eBPF, ebook, efi, egrep, emacs, encoding, env, error, ess, esx, esxcli, esxi, ethtool, evil, expect, exportfs, factory reset, factory_reset, factoryreset, fail2ban, fbsd, fdisk, fedora, file, filesystem, find, fio, firewall, firmware, fish, flashrom, forensics, free, freebsd, freedos, fritzbox, fsck, fstrim, ftp, ftps, g-states, gentoo, ghostscript, git, git-filter-branch, github, gitolite, global, gnutls, gradle, grep, grml, grub, grub2, guacamole, hardware, haskell, hdd, hdparm, hellowor, hex, hexdump, history, howto, htop, htpasswd, http, httpd, https, i3, icmp, ifenslave, iftop, iis, imagemagick, imap, imaps, init, innoDB, innodb, inodes, intel, ioncube, ios, iostat, ip, iperf, iphone, ipmi, ipmitool, iproute2, ipsec, iptables, ipv6, irc, irssi, iw, iwconfig, iwlist, iwlwifi, jailbreak, jails, java, javascript, javaws, js, juniper, junit, kali, kde, kemp, kernel, keyremap, kill, kpartx, krypton, lacp, lamp, languages, ldap, ldapsearch, less, leviathan, liero, lightning, links, linux, linuxin3months, lisp, list, livedisk, lmctfy, loadbalancing, locale, log, logrotate, looback, loopback, losetup, lsblk, lsi, lsof, lsusb, lsyncd, luks, lvextend, lvm, lvm2, lvreduce, lxc, lxde, macbook, macro, magento, mailclient, mailing, mailq, manpages, markdown, mbr, mdadm, megacli, micro sd, microsoft, minicom, mkfs, mktemp, mod_pagespeed, mod_proxy, modbus, modprobe, mount, mouse, movement, mpstat, multitasking, myISAM, mysql, mysql 5.7, mysql workbench, mysqlcheck, mysqldump, nagios, nas, nat, nc, netfilter, networking, nfs, nginx, nmap, nocaps, nodejs, numberingsystem, numbers, od, onyx, opcode-cache, openVZ, openlierox, openssl, openvpn, openvswitch, openwrt, oracle linux, org-mode, os, oscilloscope, overview, parallel, parameter expansion, parted, partitioning, passwd, patch, pct, pdf, performance, pfsense, php, php7, phpmyadmin, pi, pidgin, pidstat, pins, pkill, plasma, plesk, plugin, posix, postfix, postfixadmin, postgres, postgresql, poudriere, powershell, preview, profiling, prompt, proxmox, ps, puppet, pv, pveam, pvecm, pvesm, pvresize, python, qemu, qemu-img, qm, qmrestore, quicklisp, quickshare, r, racktables, raid, raspberry pi, raspberrypi, raspbian, rbpi, rdp, redhat, redirect, registry, requirements, resize2fs, rewrite, rewrites, rhel, rigol, roccat, routing, rs0485, rs232, rsync, s-states, s_client, samba, sar, sata, sbcl, scite, scp, screen, scripting, seafile, seagate, security, sed, serial, serial port, setup, sftp, sg300, shell, shopware, shortcuts, showmount, signals, slattach, slip, slow-query-log, smbclient, snmpget, snmpwalk, software RAID, software raid, softwareraid, sophos, spacemacs, spam, specification, speedport, spi, sqlite, squid, ssd, ssh, ssh-add, sshd, ssl, stats, storage, strace, stronswan, su, submodules, subzone, sudo, sudoers, sup, swaks, swap, switch, switching, synaptics, synergy, sysfs, systemd, systemtap, tar, tcpdump, tcsh, tee, telnet, terminal, terminator, testdisk, testing, throughput, tmux, todo, tomcat, top, tput, trafficshaping, ttl, tuning, tunnel, tunneling, typo3, uboot, ubuntu, ubuntu 16.04, udev, uefi, ulimit, uname, unetbootin, unit testing, upstart, uptime, usb, usbstick, utf8, utm, utm 220, ux305, vcs, vgchange, vim, vimdiff, virtualbox, virtualization, visual studio code, vlan, vmstat, vmware, vnc, vncviewer, voltage, vpn, vsphere, vzdump, w, w701, wakeonlan, wargames, web, webdav, weechat, wget, whois, wicd, wifi, windowmanager, windows, wine, wireshark, wpa, wpa_passphrase, wpa_supplicant, x11vnc, x2x, xfce, xfreerdp, xmodem, xterm, xxd, yum, zones, zsh


Unless otherwise credited all material Creative Commons License by sjas