Linux

...now browsing by category

Verschiedene Artikel zum Thema Linux

 

SEO-Redirect

Freitag, September 28th, 2018

Im Sinne der Search Engine Optimierung sollen alle Zugriffe auf den Webserver auf eine ausgezeichnete URL weitergeleitet werden.

Die folgenden Code Schnipsel beschreiben einen möglichen Ansatz für den apache-Webserver.

Dazu müssen alle Zugriffe einfangen und auf das Ziel weitergeleitet werden:

# redirect all requests
RewriteEngine on
RewriteRule ^/(.*)$ https://zeus.m57.de/$1 [L,R]

Für das gewünschte Ziel (im SSL-VirtualHost Kontext) Zugriffe vor weiteren Redirects schützen und nur den Rest weiterleiten:

# redirect all requests, but our distinguished target
RewriteEngine on
RewriteCond %{HTTP_HOST} !^zeus.m57.de$
RewriteRule ^/(.*)$ https://zeus.m57.de/$1 [L,R]

Klassisches GNOME unter fedora 20

Mittwoch, März 19th, 2014

Das was früher das GNOME war heißt jetzt wohl MATE man kann das unter aktiviren indem man folgendes eingibt:

yum install gnome-classic-session.noarch
yum groups install "MATE Desktop"

UEFI mit vmware

Donnerstag, August 9th, 2012

Um eine virtuelle Maschine mit EFI BIOS unter vmware zu erzeugen muss man, nachdem man die virtuelle Instanz erzeugt hat, in die Konfiguration eingreifen und den Parameter:

firmware = "efi"

die NAME.vmx Datei einfügen, durch Angabe des Parameters:

firmware = "bios"

stellt man das gewohnte Verhalten wieder her. Dieser Parameter steht nicht über das GUI zur Verfügung.
Wenn man die virtuelle Maschine startet kann man durch Drücken der ESC-Taste den Boot Manager aufrufen.

Das ganze funktioniert mit VMware Workstation ab Version 8.0 und VMware Player ab Version 3.0.

add md5sum to shell scripts

Montag, August 6th, 2012

Sometime it is desired to add a hash to scripts to avoid scripts altered by someone, this can be done in the following way:

#!/bin/bash
#MD5SUM=6b780d787ef345256c3a1faa35d3f1d5
 
function add_md5sum() {
  tmpf=$(mktemp /tmp/$(basename $0).XXXXXX)
  grep -v "^#MD5SUM=" $1 >$tmpf
  md5sum=$(md5sum $tmpf | cut -d ' ' -f1)
  sed -e "s|^\(#!/bin/bash.*\)$|\1\n#MD5SUM=$md5sum|" < $tmpf > $1
  rm -f $tmpf
}
 
function chk_md5sum() {
  osum=$(grep -v "^#MD5SUM=" $1 | md5sum | cut -d ' ' -f1)
  isum=$(grep "^#MD5SUM=" $1 | head -1 | cut -d= -f2)
  if [ "$isum" = "$osum" ]; then
    echo "sum ok: $isum"
    exit 0
  else
    echo "sums differ o:$osum i:$isum"
    exit 1
  fi
}
 
function usage() {
  echo "$0 add|chk file"
}
 
if [ -z "$2" ]; then
  usage
else
  case $1 in
    add) add_md5sum $2 ;;
    chk) chk_md5sum $2 ;;
    *)   usage ;;
  esac
fi

Blaues Video im Flash-Player

Mittwoch, Juli 18th, 2012

To fix blue video on Linux Flashplayer run the following code as root and reboot.

cat << EOF > /etc/profile.d/nv_no_overlay.sh
export VDPAU_NVIDIA_NO_OVERLAY=1
EOF

mkdir -p /etc/adobe
cat << EOF > /etc/adobe/mms.cfg
# tell the flashplayer to use hw to display video content:
AVHardwareDisable = 0
FullScreenDisable = 0
EnableLinuxHWVideoDecode = 1
EOF

Skype unter Centos 6.2 installieren

Freitag, März 9th, 2012

Nachdem man das RPM von Skype heruntergeladen hat, muss man noch einige
Libraries installieren, die binding sind im Skype-RPM nicht drin (oder tun nicht, weil das rpm eigentlich für Fedora ist). Mit yum geht das am einfachsten über:

yum install libasound.so.2 libXv.so.1 libXss.so.1 libSM.so.6 libXi.so.6 \
libXrender.so.1 libXrandr.so.2 libfreetype.so.6 libfontconfig.so.1 libz.so.1 \
libgthread-2.0.so.0 libstdc++.so.6 libQtDBus.so.4 libQtGui.so.4 \
pulseaudio-libs.i686
yum localinstall --nogpgcheck skype-2.2.0.35-fedora.i586.rpm

Linux-Software RAID: Intent Bitmap aktivieren

Freitag, März 2nd, 2012

In der „Intent Bitmap“ merkt sich der md-Treiber welche Blöcke noch nicht gesynced sind, dadurch muss im Falle eines „unclean“ Shutdowns nicht das gesamte RAID resynced werden.

Der Superblock muss persistent und der Status muss aktiv sein, prüfen mit

mdadm -D /dev/md1 | egrep "(Persistence|State) :"
# erwarteter Output:
#    Persistence : Superblock is persistent
#          State : active

Aktiviert werden die „Intent Bitmap“s mit dem folgenden Kommando:

mdadm /dev/md1 -Gb internal --bitmap-chunk=262144

Aus Performance Gründen sollte die Chunk Size möglichst groß sein, weil die Tabelle vor jedem Schreibzugriff aktualisiert werden muss. (262144 steht für 256MB)

Überprüfen:

cat /proc/mdstat 
#Personalities : [raid1] 
# md0 : active raid1 sdb1[1] sda1[0]
#       104320 blocks [2/2] [UU]
#       
# md1 : active raid1 sdb2[1] sda2[0]
#       1465031488 blocks [2/2] [UU]
#       bitmap: 3/3 pages [12KB], 262144KB chunk

Deaktiviert werden die „Intent Bitmap“s mit dem folgenden Kommando:

mdadm /dev/md1 -Gb none

LUKS Partitionen verwalten

Freitag, März 2nd, 2012

Das folgende script erleichtert die Verwaltung von verschlüsselten Partitionen.

Angelegt wird die Partition durch Eingabe des Kommandos „luks.sh add private“.

Hier wird ein LV als Container angelegt, darin liegt die Partition mit einem Filesystem verschlüsselt. Die Partition wird eingetragen, nach einem Reboot kann die Partition durch Eingabe des Komandos: „luks.sh mount private“ und des Passworts gemounted werden.

Download: luks.sh

#!/bin/bash

# luks (c) Hans-Helmar Althaus 
#
#  Version 1.0 - 24.02.2012
#

# this is convention, we mount volumes in $fsbase/fsN
fsbase="/export"

# keylen and cipher to use on crypted device
cipher="aes-cbc-essiv:sha256"
keylen=256

# filesystem type and size to use on crypted device
fstype="ext4"
fssize="64G"

# try to determine system volume group:
vg=$(vgdisplay | grep "VG Name" | head -1 | awk '{print $3}')

# try to determine next unused volume mount point,
# according to our convention $fsbase/fsN for mount points.
fsnum=1
while [ -d "${fsbase}/fs${fsnum}" ]; do
  fsnum=$((${fsnum}+1))
done

##################################################################################
# shell functions ################################################################
##################################################################################

function luks_add_fs() { # add LUKS-Volume
  name=$1
  lvcreate -L${fssize} ${vg} -n ${name} || return 1
  cryptsetup luksFormat -c ${cipher} -s ${keylen} /dev/${vg}/${name} || return 2
  echo "# show: cryptsetup luksDump /dev/${vg}/${name}"
  cryptsetup luksOpen /dev/${vg}/${name} luks-${name} || return 3
  echo "# show: dmsetup info luks-${name}"
  echo "# show: cryptsetup status /dev/mapper/luks-${name}"
  mkfs.${fstype} -m0 /dev/mapper/luks-${name} || return 4
  mkdir -p ${fsbase}/fs${fsnum} || return 5
  mount /dev/mapper/luks-${name} ${fsbase}/fs${fsnum} || return 6
  cat <<-EOFFSTAB >> /etc/fstab
        #     
        /dev/mapper/luks-${name} ${fsbase}/fs${fsnum} ${fstype} defaults,noauto 0 0
        EOFFSTAB
  cat <<-EOFCRTAB >> /etc/crypttab
        #   
        luks-${name} /dev/${vg}/${name} none none
        EOFCRTAB
  return 0
}

function luks_mount_fs() { # mount LUKS-Volume
  name="$1"
  cryptsetup luksOpen /dev/${vg}/${name} luks-${name} || return 1
  mount /dev/mapper/luks-${name} || return 2
}

function luks_remove_fs() { # remove LUKS-Volume
  name=$1
  doumount=0
  mntpnt=$(mount | grep "^/dev/mapper/luks-${name} on" | awk '{print $3}' )
  if [ -z "${mntpnt}" ]; then
    doumount=1
    mntpnt=$(egrep "^/dev/mapper/luks-${name}\\s" /etc/fstab | awk '{print $2}' )
    if [ -z "${mntpnt}" ]; then
      echo "can not determine mount point."
      return 1
    fi
  fi
  [ $doumount ] && umount ${mntpnt} || return 2
  cryptsetup luksClose /dev/mapper/luks-${name} || return 3
  lvremove /dev/${vg}/${name} || return 4
  if [ ! -f /etc/luks-${name}.keyfile ]; then
    rm -f /etc/luks-${name}.keyfile
  fi
  rmdir ${fsbase}/fs${fsnum} || return 4
  sed -e "s:^luks-${name}.*:#&:g" -i /etc/crypttab
  sed -e "s:^/dev/mapper/luks-${name}.*:#&:g" -i /etc/fstab
  return 0
}

function luks_add_key() { # add a keyfile to mount LUKS-Volume
  name=$1
  if [ -f /etc/luks-${name}.keyfile ]; then
    echo "keyfile exists."
    return 1
  fi
  dd if=/dev/urandom of=/etc/luks-${name}.keyfile bs=1 count=${keylen}
  chown root.root /etc/luks-${name}.keyfile
  chmod 0600 /etc/luks-${name}.keyfile
  cryptsetup luksAddKey /dev/${vg}/${name} /etc/luks-${name}.keyfile || return 2
  sed -e "s:^luks-${name}.*:#&:g" -i /etc/crypttab
  cat <<-EOFCRTAB >> /etc/crypttab
        luks-${name} /dev/${vg}/${name} /etc/luks-${name}.keyfile none
        EOFCRTAB
  return 0
}

function luks_remove_key() { # remove key from LUKS-Volume
  name=$1
  if [ ! -f /etc/luks-${name}.keyfile ]; then
    echo "keyfile does not exist."
    return 1
  fi
  cryptsetup luksRemoveKey /dev/${vg}/${name} /etc/luks-${name}.keyfile || return 2
  rm -f /etc/luks-${name}.keyfile
  sed -e "s:^luks-${name}.*:#&:g" -i /etc/crypttab
  cat <<-EOFCRTAB >> /etc/crypttab
        luks-${name} /dev/${vg}/${name} none none
        EOFCRTAB
  return 0
}

function usage() {
  cat <<-EOUSAGE
        $(basename $0) [options] command 
        
        create logical fsume container on volume group
        and mount crypted filesystem on $fsbase/fsN
        
        options:
          --vg         - volume group (def:$vg)
          -n, --fsnum  - filesystem-number (def:$fsnum)
          -t, --fstype - filesystem-type (def:$fstype)
          -s, --fssize - volume-size (def:$fssize)
          -l, --keylen - key-length (def:$keylen)
        
        command is one of:
          add    - add a crypted volume
          mount  - mount crypted volume
          remove - remove crypted volume
          addkey - add a keyfile to volume
          delkey - remove keyfile from volume
        EOUSAGE
  exit 0
}

if [ -z "$1" ]; then
  usage
fi

##################################################################################
# main function ##################################################################
##################################################################################
  
while [ -n "$1" ]; do
  case "$1" in
    --vg) vg="$2"; shift ;;
    -n|--fsnum)  fsnum="$2"; shift ;;
    -t|--fstype) fstype="$2"; shift ;;
    -b|--fsbase) fsbase="$2"; shift ;;
    -l|--keylen) keylen="$2"; shift ;;
    -s|--fssize) fssize="$2"; shift ;;
    add)       luks_add_fs $2; break ;;
    mount)     luks_mount_fs $2; break ;;
    remove)    luks_remove_fs $2; break ;;
    addkey)    luks_add_key $2; break ;;
    removekey) luks_remove_key $2; break ;;
    *) usage ;;
  esac
done
rt=$?

if [ $rt -gt 0 ]; then
  echo "operation failed with errorcode: $rt"
fi
exit $rt

Snapshot anlegen

Freitag, März 2nd, 2012

Mit dem folgenden script läßt sich komfortabel ein Snapshot einer Partition auf einem LVM anlegen:

#!/bin/bash

# snapshot logical volume block device
# (c)2011 Hans-Helmar Althaus
# Version, Date, Who, What
# 1.0.0, 2011.12.09, HHA, initial Version
# 1.0.1, 2011.12.12, HHA, wait for udev to settle down

VERSION="1.0.1"
MPOINT="/"

# LVLIST="VGNAME:LVNAME:MOUNTDIR:SNAPSIZE"
LVLIST="data:storage:storage:32G"

snapvolume() {
  VGNAME=$1
  LVNAME=$2
  FSNAME=$3
  SNAPSIZE=$4
  [ -z $4 ] && return -1

  mkdir -p ${MPOINT}/${FSNAME}_snap || return 1

  if cat /proc/mounts | awk '{print $2}' | grep ${MPOINT}/${FSNAME}_snap ; then
    umount ${MPOINT}/${FSNAME}_snap || return 2
  fi

  # check for (and umount) bind mounts (autofs)
  for fs in $(mount | grep ${MPOINT}/${FSNAME}_snap | awk '{print $1}') ; do 
    umount $fs || return 3
  done

  if lvdisplay | grep 'LV Name' | grep /dev/${VGNAME}/${LVNAME} | grep /dev/${VGNAME}/${LVNAME}_snap ; then
    for i in {1..5}; do # try ...
      ret=4
      if lvremove -f /dev/${VGNAME}/${LVNAME}_snap; then
        ret=0
        break
      else # wait for udev to finish I/O on logical volume block device, this is a known bug see:
           # https://bugzilla.redhat.com/show_bug.cgi?id=570359
        sleep 1
        udevadm settle
      fi
    done
    [ "$ret" = "0" ] || return $ret
  fi
  sync
  lvcreate -L${SNAPSIZE} -s -n ${LVNAME}_snap /dev/${VGNAME}/${LVNAME} || return 5
  mount -o ro /dev/${VGNAME}/${LVNAME}_snap ${MPOINT}/${FSNAME}_snap || return 6
}

for LVSNAP in ${LVLIST}; do
  snapvolume $(echo ${LVSNAP} | awk -F: '{printf( "%s %s %s %s\n",$1,$2,$3,$4)}' )
done

aton und ntoa in bash

Donnerstag, März 1st, 2012

Für IPv4 Vergleiche braucht man öfter die Darstellung der IPv4 Adresse als Integer, das geht mit den folgenden BASH Funktionen:

# aton and ntoa
function ntoa() {
  local IFS=. num quad ip e
  num=$1
  for e in 3 2 1; do
    quad=$((256**$e))
    ip[$((3-$e))]=$(($num/$quad))
    num=$((num%quad))
  done
  ip[3]=${num}
  echo "${ip[*]}"
}

function aton() {
  local IFS=. ip num e
  ip=($1)
  for e in 3 2 1; do
    num=$(($num+${ip[$((3-$e))]}*256**$e))
  done
  num=$(($num+${ip[3]}))
  echo $(($num&0xFFFFFFFF))
}

Ausnutzen kann man das mit dem folgenden Beispiel:

CNW[0]=10.0.2.192  CNM[0]=255.255.255.192 CGW[0]=10.0.2.193
CNW[1]=10.0.16.0   CNM[1]=255.255.255.0   CGW[1]=10.0.16.1
CNW[2]=10.0.40.128 CNM[2]=255.255.255.128 CGW[2]=10.0.40.3

nwparams() { # fetch $2-params to ipaddr in $1
  rt=1
  i=0
  while [ $i -lt ${#CNW[*]} ]; do
    if [ "$(( $(aton $1) & $(aton ${CNM[$i]}) ))" == "$(aton {CNW[$i]})" ]; then
      rt=0
      break
    fi
    i=$((i+1))
  done
  if [ "$rt" == "1" ]; then
    return 1
  else  
    case $2 in
      nw) echo ${CNW[$i]};;
      nm) echo ${CNM[$i]};;
      gw) echo ${CGW[$i]};;
    esac
    return 0
  fi
}

if [ -z ${GW} ]; then
  if GW=$(nwparams $IP gw); then
    echo "using gw:$GW for ip:$IP."
  else
    echo "gw not found, aborting."; exit 1
  fi
fi