Kategori public

fdisk Festplatten vergrößert

Dienstag, August 11th, 2015

Ab und zu kommt es vor das bei VMs Festplatten vergrößert werden müssen. Bei den alten Systemen ohne LVM im Gastsystem muss dies leider noch offline geschehen.
Zur Sicherheit sollte man ein snappshot des LVs machen und/oder den MBR zuvor sichern.

lvcreate -L 500M --snapshot -n mysnap /dev/vg/lv

Zunächst wird das LV auf dem Träger System vergrößert:

# lvresize -L +20G vg/lv
Size of logical volume vg/lv changed from 80,00 GiB (20480 extents) to 100,00 GiB (25600 extents).
Logical volume lv successfully resized

Danach kann man den MBR neu anlegen. Hier ist auf folgende Fehler Meldung in fdisk zu achten:

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').

bzw. erschient nach dem anlegen der Partition folgender hinweise, welcher auch auf den falschen Modus hinweist.
Partition 2 does not start on physical sector boundary.

Dann muss wie im Beispiel fdisk mit -c für den DOS-compatible Modus angegeben werden:

fdisk -c /dev/mapper/vg-lv

Befehl (m für Hilfe): d
Partitionsnummer (1-4): 2

Befehl (m für Hilfe): d
Partition 1 ausgewählt

Befehl (m für Hilfe): n
Befehl Aktion
e Erweiterte
p Primäre Partition (1-4)
p
Partitionsnummer (1-4): 1
Erster Zylinder (1-13054, Vorgabe: 1): 1
Last Zylinder, +Zylinder or +size{K,M,G} (1-13054, Vorgabe: 13054): +95G

Zunächst wurden die Vorhandenen Partitionen gelöscht. Dabei braucht man keine Sorge haben das alle Daten weg sind. (Das Löschen der Daten würde wesentlich länger dauern)
Dann wird eine „neue“ größere Partition angelegt.


Befehl (m für Hilfe): p

Platte /dev/mapper/vg-lv: 107.4 GByte, 107374182400 Byte
255 Köpfe, 63 Sektoren/Spur, 13054 Zylinder
Einheiten = Zylinder von 16065 × 512 = 8225280 Bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 524288 bytes
Disk identifier: 0x00059ca1

Gerät boot. Anfang Ende Blöcke Id System
/dev/mapper/vg-lvp1 1 12402 99617792 83 Linux

Befehl (m für Hilfe): n
Befehl Aktion
e Erweiterte
p Primäre Partition (1-4)
p
Partitionsnummer (1-4): 2
Erster Zylinder (12402-13054, Vorgabe: 12402):
Benutze den Standardwert 12402
Last Zylinder, +Zylinder or +size{K,M,G} (12402-13054, Vorgabe: 13054):
Benutze den Standardwert 13054

Nach einer Überprüfung der Partition habe ich auch die zweite Partition über den Rest der Festplatte angelegt.


Befehl (m für Hilfe): a
Partitionsnummer (1-4): 1

Befehl (m für Hilfe): t
Partitionsnummer (1-4): 2
Hex code (L um eine Liste anzuzeigen): 82
Der Dateisystemtyp der Partition 2 ist nun 82 (Linux Swap / Solaris)

Befehl (m für Hilfe): w
Die Partitionstabelle wurde verändert!

Rufe ioctl() um Partitionstabelle neu einzulesen.

WARNING: Re-reading the partition table failed with error 22: Das Argument ist ungültig.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Synchronisiere Platten.

Anschließend habe ich noch den Boot Modi a und die Art der Partition 82 angegeben. Nur wenn man sich wirklich Sicher ist sollte man w zum Speichen angeben.

# partprobe
Warning: WARNING: the kernel failed to re-read the partition table on /dev/sda (Das Gerät oder die Ressource ist belegt). As a result, it may not reflect all of your changes until after reboot.

Um den Kernel noch bekannt zugeben, dass es eine neue Partitionstabelle gibt, muss einmal partprobe ausgeführt werden. Alternativ kann man auch die VM Booten und das vergrößern Online durchführen. (Achtung: dann sollte die Partition aber im Readonly Modus mountet sein)

# resize2fs -p /dev/mapper/vg-lv
resize2fs 1.41.12 (17-May-2010)
Bitte zuerst »e2fsck -f /dev/mapper/vg-lv« laufen lassen.

# e2fsck -f -y /dev/mapper/vg-lv
...
/dev/mapper/vg-lv: ***** DATEISYSTEM WURDE VERÄNDERT *****
/dev/mapper/vg-lv: 512061/4825088 Dateien (0.1% nicht zusammenhängend), 18926485/19922384 Blöcke

# resize2fs -p /dev/mapper/vg-lv
resize2fs 1.41.12 (17-May-2010)
Die Grösse des Dateisystems auf /dev/mapper/vg-lv wird auf 24904448 (4k) Blöcke geändert.

Start von Durchgang 1 (max = 153)
Vergrößere die Inode-TabelleXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Das Dateisystem auf /dev/mapper/vg-lv ist nun 24904448 Blöcke groß.

SimpleHTTPServer mit PHP

Dienstag, August 4th, 2015

Heute wollte ich mir mal eben schnell Vorschaubilder auf einem Server anzeigen lassen. Der PHP Code war schnell geschrieben:

read())) {
   echo " ".chr(10);
}

$d->close();
?>

Dann die Frage wie man ohne Webserever an die Daten harren kommt. Einfachste weg ist der in Python integrere Webserver:
python -m SimpleHTTPServer 8000

Diese kann aber kein PHP. Da php5-cli in der Version >= 5.4 installiert war funktionierte folgende spannende Lösung:
php -S 127.0.0.1:8000 -t .

Quelle: docs.python.org simplehttpserver, php.net commandline.webserver

Migrieren einer root Partition im live betrieb zu einer lv

Samstag, April 25th, 2015

Für die Migration der Root Partition in ein LVM System musste ich zunächst erst mal lvm2 installieren. Dann habe ich die Partitionen angepasst.

apt-get install lvm2
fdisk /dev/sdb

Sodass meine Partition wie folgt aussieht:
Gerät boot. Anfang Ende Blöcke Id System
/dev/sdb1 2048 102658935 51328444 8e Linux LVM

Dann habe ich das LVM eingerichtet, das LV für das System angelegt und ext4 formatiert:
pvcreate /dev/sdb1
vgcreate vg /dev/sdb1
lvcreate -L system -n 40G vg
mkfs.ext4 /dev/mapper/vg-system

Anschließend konnte ich das LV mounten und mittels Rsync alle Daten kopieren. Mittels der rsync Option „x“ konnte ich /mnt und alle weiteren Filesysteme auschließen.
mount /dev/mapper/vg-system /mnt
rsync -ravPzx / /mnt/

Dann habe ich die fstab angepasst, indem ich mit blkid die neue UUID herausgesucht habe.
blkid
/dev/mapper/vg-system: UUID="ec17cda6-5809-47f1-8a62-f8c47c7103be" TYPE="ext4"
...
vim /mnt/etc/fstab
UUID=ec17cda6-5809-47f1-8a62-f8c47c7103be / ext4 errors=remount-ro 0 1

Dann habe ich mir noch eine chroot gebastelt.
mount --bind /boot /mnt/boot
mount --rbind /dev /mnt/dev
mount --bind /sys /mnt/sys
mount -t proc none /mnt/proc
chroot /mnt

Und darin die initramfs und grub neu gebaut.
update-initramfs -u
update-grub

Dann habe ich die chroot wieder verlassen und zur Sicherheit noch einmal MySQL gestoppt und nur dies noch mal synchronisiert.
/etc/init.d/mysql stop
rsync -avP /var/lib/mysql/ /mnt/var/lib/mysql

reboot
Nach dem abschließenden Reboot ist das System auf der neuen Festplatte wieder hochgekommen.

gitolite mit git hooks

Dienstag, März 31st, 2015

Da es mir nicht möglich war, mit den in Debian Wheezy oder Ubuntu Trusty enthaltenen gitolite Paketen den gitserver so anzupassen, dass man hooks ausführen kann, habe ich die Methode gewählt wie sie auf der Gitolite Webseite beschreiben ist.

Client:
Zunächst benötigt man einen Key für den Administrator.
ssh-keygen -b 4096
scp .ssh/id_rsa.pub server:/tmp/chr.pub

Server:
Dann beginnt man auf dem Server die eigentliche Installation.
apt-get install git
adduser git --disabled-password
su - git
cd /home/git
mkdir bin
git clone git://github.com/sitaramc/gitolite
gitolite/install -ln ~/bin
gitolite setup -pk /tmp/chr.pub

Dann müssen noch zwei Konfigurationseinstellungen vorgenommen werden.
vim .gitolite.rc
GIT_CONFIG_KEYS => '.*',
LOCAL_CODE => "$ENV{HOME}/.gitolite/local-code/",

Client:
Die restliche Konfiguration kann dann vom Administrator Konto aus erledigt werden.
apt-get install git
git clone git@server:gitolite-admin
cd gitolite-admin
mkdir -p /local-code/hooks/common/hooks.d/

cat > local-code/hooks/common/hooks.d/runhook.sh <<\EOF
#!/bin/bash

echo "TEST" > /tmp/runhook.log
EOF
chmod -v +x local-code/hooks/common/hooks.d/runhook.sh
cat > local-code/hooks/common/post-receive <<\EOF
#!/bin/bash
run_hook () {
  echo -en "\e[1;33m$4..\e[00m "
  echo $1 $2 $3 | $GIT_DIR/hooks/hooks.d/$4
}

echo -en "\e[1;33mRunning hooks..\e[00m "

while read oldrev newrev refname; do
  if [ "$refname" =  "refs/heads/master" ]; then
    hooks=$(git cat-file blob $newrev:.hooks 2>/dev/null)
    if [ -n "$hooks" ]; then
      # Repo-local hooks defined in .hooks.
      for hook in $hooks; do
        run_hook $oldrev $newrev $refname $hook
      done
    fi

    # Global hooks for this repo (ie. set in Gitolite config).
    hooks=$(git config --get hooks.run)
    [ -z "$hooks" ] && continue

    for hook in $hooks; do
      run_hook $oldrev $newrev $refname $hook
    done
  fi
done

echo -e "\e[1;32mDone.\e[00m"
EOF
chmod -v +x local-code/hooks/common/post-receive

Zum Testen habe ich hier ein einfaches Gitrepository mit dem hook Script eingerichtet.
vim conf/gitolite.conf
repo hooktest
RW+ = chr
config hooks.run = runhook.sh

Dieses muss man einchecken.
git add local-code conf/gitolite.conf
git commit -m "add new repo hooktest, add runhoock.sh"
git push
cd ..

Um entsprechend dies einmal zum Testen zu nutzen.

git clone git@server:hooktest
cd hooktest
echo "TEST1" > test
git add test
git commit -m "add test: TEST1"
git push

Quelle:gist.github.com

ssllabs overall rating zabbix check

Dienstag, Februar 3rd, 2015

Aktuell kann man fast jede Woche auf ssllabs.com nachschauen, ob das „rating“ einer Webseite mal wieder gefallen ist, einer der Server falsch konfiguriert ist oder einfach nur vergessen wurde Dienste neu zu starten. Um dies zu automatisieren hat ssllabs endlich eine api im development Modus freigeschaltet.

zabbix-check-ssllabs
Schade das in der api kein Feld ohne das trusted flag hinterlegt ist, so bekomme ich mit meinem CACert leider immer nur ein T.

Ich habe das mal für den Zabbix gescriptet. Alles was man braucht ist folgende ausführbare Datei im Ordner /etc/zabbix/externalscripts/zabbix-check-ssllabs.sh

#!/bin/bash
domain=$1
if [ "$domain" = "" ]; then
	exit 1
fi

tmp=$(mktemp)
#TODO: trap
wget -q -O $tmp "https://api.dev.ssllabs.com/api/fa78d5a4/analyze?host=$domain&publish=On&clearCache=On&all=done"
sed 's/,/\n/g' $tmp | grep grade | awk -F '"' '{print $4}'
rm $tmp

Und natürlich ein Schema das man im Zabbix importieren muss:
(mehr …)