Me in IT UNIX/Linux Consultancy is een in Breukelen gebaseerd bedrijf dat zich specialiseerd in UNIX and Linux consultancy. Ervaring met Red Hat Enterprise Linux, Fedora Project, CentOS, OpenBSD en gerelateerde Open Source oplossingen, daarom is Me in IT UNIX/Linux Consultancy een goede partner voor implementatie, onderhoud en uitbreiding van uw omgeving.

Open Source software is een belangrijk aspect van elke Linux distributie. Me in IT UNIX/Linux Consultancy gebruikt Open Source software waar mogelijk en probeert dit voordeel verspreiden. In het artikel gedeelte zijn vele UNIX/Linux avonturen te vinden, die anderen hopelijk kunnen inzetten.

Een loadbalancer maken met CentOS en Linux Virtual Server

Als je nieuw bent in de Red Hat terminology, kan het best wel moeilijk zijn om te begrijpen hoe je een simpele loadbalancer kunt maken met Linux. Hier staat wat informatie om je op weg te helpen.

Lees meer op the CentOS Virtual Server Administration paginas.

Terminologie:

  • piranha This is het pakket dat je helpt met opzetten van LVS.
  • ipvs De Linux module die het mogelijk maakt te load balancen.
  • ipvsadm Een pakket en commando om de loadbalancer te beheren. Let op dat je of piranha-gui of /etc/sysconfig/ipvsadm gebruikt om de loadbalancer te configuren, niet beide..
  • LVS Linux Virtual Server - de projectnaam die hier steeds genoemd wordt.
  • pulse Een service (/etc/init.d/pulse) die op de actieve en backup machine draait en een poort opent om het mogelijk te maken checks te doen. Piranha-gui configureert alles, pulse voert alle configuraties door naar andere machines.
  • nanny Een proces gestart door pulse om de echte servers (en services) the checken.
  • nat Network Address Translation. Een gebruikelijke combinatie met LVS. Als NAT gebruikt wordt, accepteert de loadbalancer/director/LVS verkeer op een VIP en stuurt het door naar de echte servers. Let op dat de huidige implementatie van ipvsadm niet goed kan Source NATten, het source adres wordt niet goed herschreven.
  • direct routing Een methode van LVS om te routeren. Verkeer wordt ontvangen op de VIP en doorgestuurd naar de echte server, alsof het verstuurd is naar de VIP van de echte server. Hierdoor moeten de echte servers wel reageren op het VIP adres. Om dit te laten werken, moeten er een aantal "trucs" gedaan worden zodat de arp-cache gezond blijft werken.
  • wlc Weighted Least Connections, een algoritme om verkeer naar de echte servers te balancere.
  • VIP Virtual IP. Het IP-address waarop de service geconfigureerd is.
  • RIP Real (Echte) server IP. Het IP-address van de echte server.
  • realserver/echte server De server die de uiteindelijke dienst draait. Dit kan een Windows, Linux of elk soort machine zijn.

Hier is een overzicht van een mogelijke setup:

Stappen die je moet volgen voor eeuwige glorie:

Installeer piranha-gui

# yum install piranha-gui

(Verander 172.16.0.0/24 naar het netwerk dat gebruikt wordt om de echte server te bereiken.)

Configureer services

# chkconfig httpd on
# chkconfig piranha-gui on
# chkconfig pulse on
# sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/' /etc/sysctl.conf
# echo "*nat
:PREROUTING ACCEPT [46:3346]
:POSTROUTING ACCEPT [431:32444]
:OUTPUT ACCEPT [431:32534]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [4186:1094786]
:FORWARD ACCEPT [729:111992]
:OUTPUT ACCEPT [4266:388099]
-A FORWARD -i eth1 -j ACCEPT
COMMIT" > /etc/sysconfig/iptables
# chkconfig iptables on
# sed -i 's/SELINUX=enabled/SELINUX=disabled/' /etc/sysconfig/selinux

Configureer via webinterface

Voor deze stappen uit in de piranha-gui web interface:

# service httpd start
# piranha-passwd
# service piranha-gui start

Open een browser en ga naar het IP adres van 1 van de loadbalancers, de URL ziet er ongeveer zo uit: http://192.168.202.50:3636

Synchroniseer /etc/sysconfig/ha/lvs.cf

Je zult de configuratie die piranha maakt in sync moeten houden op beide machines, dit is een suggestie om dat te doen:

# ssh-keygen
# scp .ssh/id_rsa* 192.168.202.110:./.ssh/
# cp .ssh/id_rsa.pub .ssh/authorized_keys

Nu moet je kunnen verbinden met beide machines zonder het opgeven van een wachtwoord.

# cat update-lvs.cf
#!/bin/sh

copiedserialno=$(grep serial_no /tmp/lvs.cf | awk '{ print $NF }')
runningserialno=$(grep serial_no /etc/sysconfig/ha/lvs.cf | awk '{ print $NF }')

if [ "$copiedserialno" -gt "$runningserialno" ] ; then
mv /tmp/lvs.cf /etc/sysconfig/ha/lvs.cf
fi
# crontab -l
* * * * * /usr/bin/scp /etc/sysconfig/ha/lvs.cf 192.168.1.46:/tmp > /dev/null
* * * * * /root/update-lvs.cf

Reboot de server.

Om alle veranderingen te testen kun je de load-balancer rebooten.

Fedora 14 komt eraan

Het duurt niet zo lang meer voordat Fedora 14 uit komt. Eens kijken welke features Fedora 14 heeft.

  • Een Amazon EC2 Image (AIM) voor Fedorakomt uit! Eindelijk van dat oude Fedora 8 image af.
  • Voor Desktop Virtualisatie kan, Spice gebruikt worden. Dit is een KVM extensie die het mogelijk maakt super snel gebruik te maken van de desktop die virtueel draait, of het nou Windows, Linux of een andere grafische desktop is.
  • Perl, Python en Ruby zijn geupdate, leuk maar voor mij niet van groot belang.
  • OpenSCAP bekijkt of je systeem not security compiant is. Een handige tool voor veel klanten.

Al met al een best wel interessante release, ookal is het moeilijk een goede distributie te verbeteren.

Veel van de veranderingen die gedaan worden in Fedora komen in RHEL terrecht. Het lijkt erop dat RHEL 7 ongeveer zal bestaan uit Fedora 16 (op zijn vroegst) tot Fedora 19. (op zijn laatst)

Een shell script om network throughput te meten op Linux machines.

Hier is een shell script om te zien hoeveel (kilo-, mega-, giga- of terra-) bytes de netwerk kaart langs komt. De output ziet er zo uit:

$ ./network-traffic.sh --help
Usage: ./network-traffic.sh [-i INTERFACE] [-s INTERVAL] [-c COUNT]

-i INTERFACE
    The interface to monitor, default is eth0.
-s INTERVAL
    The time to wait in seconds between measurements, default is 3 seconds.
-c COUNT
    The number of times to measure, default is 10 times.
$ ./network-traffic.sh        
Monitoring eth0 every 3 seconds. (RXbyte total = 706 Mb TXbytes total = 1 Gb)
RXbytes = 104 b TXbytes = 194 b
RXbytes = 80 b TXbytes = 188 b
RXbytes = 52 b TXbytes = 146 b
RXbytes = 689 b TXbytes = 8 Kb
RXbytes = 52 b TXbytes = 146 b
RXbytes = 52 b TXbytes = 146 b
RXbytes = 52 b TXbytes = 146 b
RXbytes = 52 b TXbytes = 146 b
RXbytes = 4 Kb TXbytes = 4 Kb
RXbytes = 716 b TXbytes = 5 Kb

Hier is het scripts:

#!/bin/sh

usage(){
echo "Usage: $0 [-i INTERFACE] [-s INTERVAL] [-c COUNT]"
echo
echo "-i INTERFACE"
echo "    The interface to monitor, default is eth0."
echo "-s INTERVAL"
echo "    The time to wait in seconds between measurements, default is 3 seconds."
echo "-c COUNT"
echo "    The number of times to measure, default is 10 times."
exit 3
}

readargs(){
while [ "$#" -gt 0 ] ; do
  case "$1" in
   -i)
    if [ "$2" ] ; then
     interface="$2"
     shift ; shift
    else
     echo "Missing a value for $1."
     echo
     shift
     usage
    fi
   ;;
   -s)
    if [ "$2" ] ; then
     sleep="$2"
     shift ; shift
    else
     echo "Missing a value for $1."
     echo
     shift
     usage
    fi
   ;;
   -c)
    if [ "$2" ] ; then
     counter="$2"
     shift ; shift
    else
     echo "Missing a value for $1."
     echo
     shift
     usage
    fi
   ;;
   *)
    echo "Unknown option $1."
    echo
    shift
    usage
   ;;
  esac
done
}

checkargs(){
if [ ! "$interface" ] ; then
  interface="eth0"
fi
if [ ! "$sleep" ] ; then
  sleep="3"
fi
if [ ! "$counter" ] ; then
  counter="10"
fi
}

printrxbytes(){
/sbin/ifconfig "$interface" | grep "RX bytes" | cut -d: -f2 | awk '{ print $1 }'
}

printtxbytes(){
/sbin/ifconfig "$interface" | grep "TX bytes" | cut -d: -f3 | awk '{ print $1 }'
}

bytestohumanreadable(){
multiplier="0"
number="$1"
while [ "$number" -ge 1024 ] ; do
  multiplier=$(($multiplier+1))
  number=$(($number/1024))
done
case "$multiplier" in
  1)
   echo "$number Kb"
  ;;
  2)
   echo "$number Mb"
  ;;
  3)
   echo "$number Gb"
  ;;
  4)
   echo "$number Tb"
  ;;
  *)
   echo "$1 b"
  ;;
esac
}
 
printresults(){
while [ "$counter" -ge 0 ] ; do
  counter=$(($counter - 1))
  if [ "$rxbytes" ] ; then
   oldrxbytes="$rxbytes"
   oldtxbytes="$txbytes"
  fi
  rxbytes=$(printrxbytes)
  txbytes=$(printtxbytes)
  if [ "$oldrxbytes" -a "$rxbytes" -a "$oldtxbytes" -a "$txbytes" ] ; then
   echo "RXbytes = $(bytestohumanreadable $(($rxbytes - $oldrxbytes))) TXbytes = $(bytestohumanreadable $(($txbytes - $oldtxbytes)))"
  else
   echo "Monitoring $interface every $sleep seconds. (RXbyte total = $(bytestohumanreadable $rxbytes) TXbytes total = $(bytestohumanreadable $txbytes))"
  fi
  sleep "$sleep"
done
}

readargs "$@"
checkargs
printresults

Ssh door een proxy vanaf Apple Mac OS X

Op Linux met Corkscrew of Windows met Putty is het mogelijk om door proxies en firewalls heen te komen. Laten we eens kijken of dat ook mogelijk is op een Apple, met Mac OS X.

Om dit te laten werken, heb je Corkscrew nodig. Open het programma Terminal om deze commando's in te tikken:

$ cd Downloads
$ tar -xvzf corkscrew-x.y.tar.gz
$ cd corkscrew-x-y
$ ./configure --host=apple
$ make
$ cp corkscrew $HOME/.ssh/

Mocht je daar niet uitkomen, dan kun je proberen mijn gecompileerde versie to downloaden. (rechter muisknop, "download linked file".)

Nu moet je jouw SSH client vertellen om corkscrew te gebruiken. In de Terminal die je eerder opende kun je met bijvoorbeeld vi(1) deze commando's invoeren.

echo "Host machine-on-the-outside-network.example.com" >> $HOME/.ssh/config
echo "ProxyCommand $HOME/.ssh/corkscrew proxy.on-the-inside-network.example.com 8080 %h %p" >> $HOME/.ssh/config

Vervang machine-on-the-outside-network.example.com door de machine die je wilt bereiken, meestal een server, of je thuis computer waar de ssh daemon op draait. Vervang proxy.on-the-inside-network.example.com door de naam van de proxy die je gebruikt. Dit kun je uitvinden in Network voorkeuren in Advanced bij Proxies. Vervang 8080 door de poort waarop je proxy server te bereiken is, meestal 8080 of 3128.

Klaar is Kees, probeer maar eens in te tikken:

$ ssh machine-on-the-outside-network.example.com

Als het goed is kun je er nu wel bij.

Apple Mac OS X als syslog server

Hier is een korte howto die je helpt je Mac OS X machine logs te ontvangen van apparaten, zoals de Apple Airport Extreme. Er zijn wat howto's online te vinden, maar ik denk dat er wat verandert is sinds Mac OS X 10.5, dus die howto's werken niet perfect.

Verander de syslogd configuratie

# echo "local0.notice /var/log/airport.log" >> /etc/syslog.conf

Touch het logfile

# touch /var/log/airport.log

Verander de syslogd startup procedure

Aan het einde van het file, uncomment het gedeelte dat remote logging accepteert.

# cat /System/Library/LaunchDaemons/com.apple.syslogd.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.apple.syslogd</string>
    <key>OnDemand</key>
    <false/>
    <key>ProgramArguments</key>
    <array>
<!--
Un-comment the following lines to run syslogd with a sandbox profile.
Sandbox profiles restrict processes from performing unauthorized
operations; so it may be necessary to update the profile
(/usr/share/sandbox/syslogd.sb) if any changes are made to the syslog
configuration (/etc/syslog.conf).
-->
<!--
<string>/usr/bin/sandbox-exec</string>
<string>-f</string>
<string>/usr/share/sandbox/syslogd.sb</string>
-->
<string>/usr/sbin/syslogd</string>
    </array>
<key>MachServices</key>
<dict>
<key>com.apple.system.logger</key>
<true/>
</dict>
<key>Sockets</key>
<dict>
<key>AppleSystemLogger</key>
<dict>
<key>SockPathName</key>
<string>/var/run/asl_input</string>
<key>SockPathMode</key>
<integer>438</integer>
</dict>
<key>BSDSystemLogger</key>
<dict>
<key>SockPathName</key>
<string>/var/run/syslog</string>
<key>SockType</key>
<string>dgram</string>
<key>SockPathMode</key>
<integer>438</integer>
</dict>
<!--
Un-comment the following lines to enable the network syslog protocol listener.
-->
<key>NetworkListener</key>
<dict>
<key>SockServiceName</key>
<string>syslog</string>
<key>SockType</key>
<string>dgram</string>
</dict>
</dict>
</dict>
</plist>

Herstart syslogd

# launchctl unload /System/Library/LaunchDaemons/com.apple.syslogd.plist
# launchctl load /System/Library/LaunchDaemons/com.apple.syslogd.plist

Open de firewall

Ga naar de System Preferences, klik Security, open het Firewall tabje en klik de +. Selecteer het file /usr/bin/syslog.
Als je niet in staat bent om /usr te openen, kun je deze hack proberen in de terminal:

$ cd
$ ln -s /usr/bin
$ ln -s /usr/sbin

Nu staan de files in je homedirectory ./bin/syslog en ./sbin/syslogd

Configureer de apparaten

Vertel nu aan alle apparaten waarvan je logs wilt zien (zoals de Apple Airport Extreme) dat ze de logs kunnen dumpen op het IP adres van je Mac OS X machine.

Bekijk het resultaat

Je kunt de applicatie "Console" openen of vanaf een terminal dit commando draaien: "tail -f /var/log/airport.log".

Gebruik Putty en een HTTP proxy om overal met ssh te verbinden, door firewalls heen.

Zit je ooit in de situatie (bijvoorbeeld je werk waar Windows gebruikt wordt) waar je naar jouw machine (bijvoorbeeld je Linux/UNIX machine thuis) zou willen verbinden via SSH, maar de firewall regels laten dat niet toe? Misschien kun je de http-proxy server gebruiken om toch te verbinden.

Let wel op, deze technische truc is misshien wel mogelijk, maar het kan zijn dat het niet toegestaan is. Bespreek het eerst eens met iemand in je organisatie.

Hier zijn de ingrediënten:

  1. Een Windows machines die je gebruikt als client.
  2. Een Linux/UNIX machine die je gebruikt als (ssh) server.
  3. Download Putty of Portable Putty op je client.
  4. Zoek uit welke proxy jouw organisatie gebruikt op je client.
  5. Configureer Putty om die proxy te gebruiken op je client.

Welke proxy gebruikt jouw organisatie?
Er zijn een paar opties beschreven, van makkelijk naar moeilijk, kies er één. Kijk maar welke het beste werkt voor jou.

  1. Open Internet Explorer, klik Tools Internet Options.... Ga naar het tabblad Connections en klik LAN Settings.... In het Proxy server. gebied, zie je de proxy server en poort. Zo niet, ga door naar de volgende mogelijkheid.
  2. Op je windows machine, open een goede website en klik Start of zoiets, dan Run... en tik cmd in. Je krijgt nu een half kapotte terminal te zien. Tik netstat -rn en zoek naar ESTABLISHED verbindingen op poort 8080 of poort 3128. Het IP van de proxy server zie je staan in de derde kolom. De regel die ik zocht ziet er zo uit: TCP 192.168.1.2:2210 192.168.1.1:3128 ESTABLISHED. Het IP 192.168.1.1 is mijn proxy server, 3128 de poort.

Configureer Putty om deze proxy te gebruiken.
Nu dat je de proxy server en poort hebt, kun je Putty configureren.

  1. Open Putty en tik de Host Name waarmee je wilt verbinden. (De Linux/UNIX machine)
  2. Open het plusje voor Connections en kies Proxy. Tik de Proxy hostname en Port in.
  3. Kies nu Open. Als het goed is krijg je een password prompt te zien.

Gefeliciteerd, je bent alsnog verbonden!

Moving a single Drupal instalation into a multisite environment.

If you'd like to move a single installation of Drupal into a multisite environment, use these steps, and replace example.com for your websites name. In this example, Drupal is installed in /var/www/drupal/ .

1. Change the webserver configuration.

This one is obvious, the website was first pointing to an individual installation of Drupal, it needs to be directed to the multi-site installation of Drupal.

2. Copy templates, settings.php and files into the multisite environment.

mkdir -p /var/www/drupal/sites/example.com/
cd /var/www/example.com
cp -Rip html/sites/all/themes html/sites/default/settings.php html/sites/default/files/ /var/www/drupal/sites/example.com/

3. Update the MySQL database with the new paths.

If you have used files (including images) on your website, the path needs to be updated. Earlier files were located on "sites/default/files/", but this will become "sites/example.com/files"

mysql -u root -pPaSsWoRd
USE examplecom;
UPDATE files SET filepath=REPLACE (filepath, 'default', 'example.com');
UPDATE files SET filepath=REPLACE ('filepath', 'images', 'sites/example.com/images') WHERE filepath REGEXP '^images.*';
QUIT;

4. Change the location of the icons for the selected theme.

Go to Administer - Site building - Themes - Your Theme "configure" and change the path to reflect the right one. Mostly this means changing the word "files/" to "sites/example.com/files/".

5. Restart the web server and clean up the old environment.

For Apache, that would be:

apachectl configtest
apachectl restart

Check the website, everything should work, maybe you have to reselect your template to make it look better. If all works well, remove the old code.

rm -R /var/www/example.com

Shrinking a filesystem with LVM

After an installation you might find some file systems are too large, they are almost empty. When you want to use that space for another file system, here are the steps you can take:
Imagine /opt is now 10 Gb, but 1 Gb would be sufficient.

  1. Check if the file system is in use. Using lsof /opt you will get a list of processes that currently use /opt. Stop these processes.
  2. Find out what device is used for /opt with df -h /opt or mount. In my example, I found /dev/mapper/VolGroup/opt hold files on /opt.
  3. Unmount the filesystem, using umount /opt
  4. Resize the filesystem using resize2fs /dev/mapper/VolGroup/opt 1G. This frees the "right" part of the disk that LVM will un-allocate in a moment. All data from the file system is on the "left hand side".
  5. Run lvreduce -L 1G /dev/mapper/VolGroup-opt to shrink the logical volume. (It might warn you that you need to run e2fsck -f /dev/mapper/VolGroup-opt before you can continue.
  6. Remount the filesystem with a command as mount /opt.

For /opt or any other filesystem that can easily be freed from open file handles, the above procedure works fine, but for "busy" filesystems, like /, /var, /usr, and so on, you'd have boot the machine without mounting filesystems. One way to do this is using the installation CD and starting up the "rescue" environment.

VirtualBox fencing and Red Hat Enterprise Linux Cluster Suite

I know there is already a perl script to fence VirtualBox machines, but since I am not very familiar with Perl, a shell scripts seemed easier.

So; when you run VirtualBox and would like (virtual) cluster nodes to be able to fence, you may use this shell script on the virtual machines:

#!/bin/sh -x

# Script to stop and start a virtual machine.
# The only required argument is machinename.

eval $(cat -)

# I use Apple Mac OS X, but any OS may be used.
vboxmanage="/Applications/VirtualBox.app/Contents/MacOS/VBoxManage"

usage () {
/bin/echo "Usage: $0 -a NAME [-o ACTION]"
/bin/echo
/bin/echo " -a NAME"
/bin/echo "   The name of the virtual machine to be fenced."
/bin/echo "   In case it contains spaces, use double quotes."
/bin/echo " -o ACTION"
/bin/echo "   What to do; start|stop|reboot(default)."
/bin/echo
exit 1
}

while [ "$#" -gt 0 ] ; do
case "$1" in
  -a)
   if [ "$2" ] ; then
    vm="$2"
    shift ; shift
   else
    /bin/echo "Missing value for $1."
    /bin/echo
    usage
    shift
   fi
  ;;
  -o)
   if [ "$2" ] ; then
    action="$2"
    shift ; shift
   else
    /bin/echo "Missing value for $1."
    /bin/echo
    usage
    shift
   fi
  ;;
  *)
   /bin/echo "Not a know option, $1."
   usage
   shift
  ;;
esac
done

if [ ! "${action}" ] ; then
action=reboot
fi

if [ ! "${vm}" ] ; then
/bin/echo "Error, please specify a name."
usage
fi

check() {
ssh $host "$vboxmanage showvminfo ${vm}" > /dev/null 2>&1
if [ ${?} != 0 ] ; then
  /bin/echo "Error, VM ${vm} not found, choose one of these:"
  ssh $host "$vboxmanage list vms | sed 's/" .*/"/'"
  exit 1
fi
}


stop() {
ssh $host "$vboxmanage controlvm ${vm} poweroff > /dev/null 2>&1"
}

start() {
ssh $host "$vboxmanage startvm ${vm} > /dev/null 2>&1"
}

reboot() {
stop
sleep 3
start
}

case $action in
start)
  check
  start
;;
stop)
  check
  stop
;;
reboot)
  check
  reboot
;;
*)
  /bin/echo "Unknown action: $action"
  /bin/echo
  usage
;;
esac

To use this script, add this block to every "clusternode" in /etc/cluster/cluster.conf:

    <fence>
        <method name="1">
            <device host="[email protected]" name="vbox" vm="ClusterMember2"/>
        </method>
    </fence>

And create a shared fence device in /etc/cluster/cluster.conf:

    <fencedevices>
        <fencedevice agent="fence_vbox" name="vbox"/>
    </fencedevices>

The important variables are "host" and "vm". "host" is used to connect to the physical box running VirtualBox, "vm" is the actual name of the virtual machine, as displayed by VirtualBox.

Forwarding one port to another

Here is a very simple stick to forward a TCP port from your local workstation to another host. Can be easy to use for debugging purposes:

mkfifo pipe ; cat pipe | nc -l 8080 | nc google.com 80 > pipe ; rm pipe

What this one does:
1) Create a fifo (First in First out) file. This is a very simple type of file, you can put stuff in there with an output redirect (>) and get stuff out there with cat for example. It acts as a temporary buffer.
2) Open that newly created pipe. Anything that gets in, will be printed. (and forwarded in this example to "nc")
3) Open a listening port on your local workstation, listening on port 8080.
4) Open a connection to google.com, on port 80.
5) Send al the output to the earlier created pipe.
6) Remove the pipe when done.

Have a look the netcat homepage, it's a great tool!

Syndicate content