FreeBSD – Howto install VirtualBox

Installation de VirtualBOX sous FreeBSD 8 en ligne de commande.

Je voulais créer un petit lab composé de CentOS sur ma FreeBSD. C’est chose faite:

– Première étape : installer le port virtualbox-ose:

virtualbox-ose-4.0.12 A general-purpose full virtualizer for x86 hardware


lupus# cd /usr/ports/emulators/virtualbox-ose
lupus# make install clean

– Il faut cocher en plus: – QT4 – GUESTADDITIONS – X11 – VDE – VNC

– Ensuite création d’une VM:

lupus# VBoxManage createvm --name centos-pam --register
Virtual machine 'centos-pam' is created and registered.
UUID: cdb74972-15fa-4fcb-aec9-9540964abd44
Settings file: '/root/VirtualBox VMs/centos-pam/centos-pam.vbox'

– Création d’un disk de 10Gb


lupus# VBoxManage createhd --filename VirtualBox\ VMs/centos-pam/pam.vdi --size 10000
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Disk image created. UUID: 18aaa295-22a7-4f38-a400-3cb51ed50e94

– Déclaration d’un controlleur SATA

lupus# VBoxManage storagectl centos-pam  --name "SATA Controller" --add sata --controller IntelAHCI

– Affectation de l’image vdi au controlleur SATA:

lupus# VBoxManage storageattach  centos-pam --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium VirtualBox\ VMs/centos-pam/pam.vdi

– Pour installer l’OS guest, il nous faut déclarer un lecteur CD

lupus# VBoxManage storagectl centos-pam  --name "IDE Controller" --add ide

– Affectation de l’image ISO CentOS à ce nouveau contrôleur:

lupus# VBoxManage storageattach centos-pam --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium /usr/jails/CentOS-6.0-i386-minimal.iso

– Définiton de l’ordre du boot

lupus# VBoxManage modifyvm centos-pam --boot1 dvd --boot2 disk --boot3 none --boot4 none

– Il nous faut un peu de RAM

lupus# VBoxManage modifyvm centos-pam --memory 1024 --vram 128

– Ne pas oublier la carte réseau, sinon l’intérêt est limité. La première carte (eth0) est pour avoir Internet (NAT). La 2eme (eth1) est pour faire communiquer les VM ensemble (si on créer plusieurs VM). eth0 aura automatiquement une IP via le DHCP de VirtualBox. eth1 devra se voir attribuer une ip manuellement (192.168.200.1 par exemple). Cette partie se fait sur l’OS guest directement.

lupus# VBoxManage modifyvm centos-pam --nic1 nat --nictype1 82540EM
lupus# VBoxManage modifyvm centos-pam --nic2 intnet

– Afin d’avoir accès depuis l’host vers la VM, on peut faire une redirection de port (rediriger le port local 22 de la VM vers l’OS sur le port 22224).

lupus# VBoxManage modifyvm centos-pam --natpf1 "guestssh,tcp,,22224,,22"

– Démarrer la VM en activant VNC (-n) et choisir le port (-m 5901) afin de prendre le contrôle de la console par ce biais.

VBoxHeadless -n -m 5901 --startvm centos-pam

– Maintenant, il suffit depuis son pc a la maison de faire un tunnel SSH :

ssh -L 5903:lupus:5903 nico@lupus

– Depuis mon pc a la maison, je démarre une session VNC sur localhost:5903 et la console apparait permettant ainsi de procéder à l’installation de l’OS.

– Quand l’installation est terminée, il faut enlever l’image ISO

lupus# VBoxManage storageattach centos-pam --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium none

– Si jamais on souhaite enlever un NAT existant:

lupus# VBoxManage modifyvm centos-pam --natpf1 delete guestssh

– Une VM tout seule, c’est pas marrant, autant en avoir 2 mais sans se refaire l’installation from scratch.
Pour cela : CLONER l’image disque (la VM source doit être éteinte).

lupus# VBoxManage createvm --name centos-sensei --register
lupus# VBoxManage clonehd /usr/jails/VirtualBox\ VMs/centos-pam/pam.vdi /usr/jails/VirtualBox\ VMs/centos-sensei/sensei.vdi --format VDI
lupus# VBoxManage storagectl centos-sensei --name "SATA Controller" --add sata --controller IntelAHCI
lupus# VBoxManage storageattach centos-sensei --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium /usr/jails/VirtualBox\ VMs/centos-sensei/sensei.vdi

– On peut lister les VM créées:

lupus# VBoxManage list vms
"centos-pam" {cdb74972-15fa-4fcb-aec9-9540964abd44}
"centos-sensei" {3d030271-3a63-4c9b-a3b1-9a70c2b1e12a}

– On peut maintenant y aller en SSH

lupus# ssh -p 22224 localhost uname -a
root@localhost's password:
Linux centos-pam 2.6.18-274.7.1.el5 #1 SMP Thu Oct 20 16:20:37 EDT 2011 i686 i686 i386 GNU/Linux

Bon LAB !

Freebsd – Howto ZFS + Deduplication + Compression

Installation de ZFS et tests des fameuses fonctionnalités de déduplication et de compression.

Voici un test sur un axe en raid 5 séparé de la partie système d’un serveur HP DL380 G2,. L’OS fraîchement installé est un Freebsd 8.2-RELEASE.

“dmesg” informe de l’existence des volumes da0 et da1. da0 est le système. Nous nous attarderons sur da1 qui n’est pas utilisé.

tripaxcolt2# dmesg | egrep "^da"
da0 at ciss1 bus 0 scbus1 target 0 lun 0
da0: <COMPAQ RAID 1(1VOLUME OK> Fixed Direct Access SCSI-0 device
da0: 135.168MB/s transfers
da0: Command Queueing enabled
da0: 34727MB (71122560 512 byte sectors: 255H 32S/T 8716C)
da1 at ciss1 bus 0 scbus1 target 1 lun 0
da1: <COMPAQ RAID 5 VOLUME OK> Fixed Direct Access SCSI-0 device
da1: 135.168MB/s transfers
da1: Command Queueing enabled
da1: 104183MB (213367680 512 byte sectors: 255H 32S/T 26148C)

– Création d’une slice Freebsd de 102Gb.

tripaxcolt2#  gpart show da1
         34  213367613  da1  GPT  (102G)
         34  213367613       - free -  (102G)

tripaxcolt2# gpart add -t freebsd da1
da1s1 added
tripaxcolt2# gpart show da1
         34  213367613  da1  GPT  (102G)
         34  213367613    1  freebsd  (102G)

tripaxcolt2# gpart create -s BSD da1s1
da1s1 created

tripaxcolt2#  gpart show da1
         34  213367613  da1  GPT  (102G)
         34  213367613    1  freebsd  (102G)

– Chargement des kernel modules nécessaires à ZFS:

tripaxcolt2# kldload opensolaris
tripaxcolt2# kldload zfs
tripaxcolt2#

– Création du pool “data”:

tripaxcolt2# zpool create data /dev/da1s1
tripaxcolt2#

– On peut voir que le montage est effectué instantanément:

tripaxcolt2# mount
/dev/da0s1a on / (ufs, local)
devfs on /dev (devfs, local, multilabel)
/dev/da0s1e on /tmp (ufs, local, soft-updates)
/dev/da0s1f on /usr (ufs, local, soft-updates)
/dev/da0s1d on /var (ufs, local, soft-updates)
data on /data (zfs, local)

tripaxcolt2# df -h /data
data 99G 21K 99G 0% /data

zpool status nous informera du status de notre pool nouvellement créé:


tripaxcolt2# zpool status data
 pool: data
 state: ONLINE
 scrub: none requested
 config:

NAME STATE READ WRITE CKSUM
 data ONLINE 0 0 0z
 da1s1 ONLINE 0 0 0

errors: No known data errors

– zpool list nous donne la liste des pools (ici, un seul).


tripaxcolt2# zpool list
 NAME SIZE USED AVAIL CAP HEALTH ALTROOT
 data 101G 75K 101G 0% ONLINE -

– Il faut que le montage se fasse automatiquement au boot. Pour cela, il faut définir le mountpoint à ZFS.

tripaxcolt2# echo 'zfs_enable="YES"' >> /etc/rc.conf
tripaxcolt2# echo 'zfs_load="YES"' >> /boot/loader.conf
tripaxcolt2# umount /data
tripaxcolt2# zfs set mountpoint=/data data
tripaxcolt2# zpool export data

 tripaxcolt2# zpool import data
 tripaxcolt2# zfs mount -a
 tripaxcolt2# df -h
 Filesystem Size Used Avail Capacity Mounted on
 /dev/da0s1a 989M 172M 738M 19% /
 devfs 1.0K 1.0K 0B 100% /dev
 /dev/da0s1e 989M 12K 910M 0% /tmp
 /dev/da0s1f 20G 151M 18G 1% /usr
 /dev/da0s1d 7.2G 304K 6.7G 0% /var
 data 99G 21K 99G 0% /data

– Vérifions si nous avons la déduplication active:


tripaxcolt2# zpool get all data
 NAME PROPERTY VALUE SOURCE
 data size 101G -
 data used 85.5K -
 data available 101G -
 data capacity 0% -
 data altroot - default
 data health ONLINE -
 data guid 2284095815770433086 default
 data version 15 default <------------- v15
 data bootfs - default
 data delegation on default
 data autoreplace off default
 data cachefile - default
 data failmode wait default
 data listsnapshots off default
 

On voit que nous sommes en ZFS version 15, une version n’offrant pas de déduplication ni de compression.

En effet, il faut être en v28, et cette version a été margée que sous FreeBSD 8.2-STABLE et Freebsd 9-BETA.

Or ici, c’est une Freebsd 8.2-RELEASE. C’est parti pour une upgrade kernel/userland


upgrade kernel -> 8.2-STABLE (cf /usr/src/Makefile)

– Après le reboot final, nous sommes  à jour:


# tripaxcolt2# uname -a
FreeBSD tripaxcolt2 8.2-STABLE FreeBSD 8.2-STABLE #0: Tue Aug 23 13:40:45 CEST 2011     root@tripaxcolt2:/usr/obj/usr/src/sys/GENERIC  i386&lt;/pre&gt;

– Updatons le pool zfs


tripaxcolt2# zpool upgrade
 This system is currently running ZFS pool version 28.

The following pools are out of date, and can be upgraded. After being
 upgraded, these pools will no longer be accessible by older software versions.

VER POOL
 --- ------------
 15 data

Use 'zpool upgrade -v' for a list of available versions and their associated
 features.

tripaxcolt2# zpool upgrade data
 This system is currently running ZFS pool version 28.
 Successfully upgraded 'data' from version 15 to version 28

tripaxcolt2# zfs upgrade data
 1 filesystems upgraded

– Ces 2 commands (zpool upgrade & zfs upgrade) sont suffisantes pour passer de la v15 à v28.

Petite vérification :


tripaxcolt2# zpool get all data
 NAME PROPERTY VALUE SOURCE
 data size 101G -
 data capacity 0% -
 data altroot - default
 data health ONLINE -
 data guid 2284095815770433086 default
 data version 28 default <---------- v28
 data bootfs - default
 data delegation on default
 data autoreplace off default
 data cachefile - default
 data failmode wait default
 data listsnapshots off default
 data autoexpand off default
 data dedupditto 0 default
 data dedupratio 1.00x -
 data free 101G -
 data allocated 83.5K -
 data readonly off -

– Maintenant passons aux tests avec dd (avec /dev/zero) :


tripaxcolt2# dd if=/dev/zero of=/data/test1 count=100 bs=10M
 100+0 records in
 100+0 records out
 1048576000 bytes transferred in 90.750924 secs (11554439 bytes/sec)

tripaxcolt2# df -h /data
 Filesystem Size Used Avail Capacity Mounted on
 data 99G 1G 98G 1% /data

tripaxcolt2# dd if=/dev/zero of=/data/test2 count=100 bs=10M
 100+0 records in
 100+0 records out
 1048576000 bytes transferred in 87.764387 secs (11947625 bytes/sec)

tripaxcolt2# df -h /data
 Filesystem Size Used Avail Capacity Mounted on
 data 99G 2G 97G 2% /data

–> on voit que la compression n’est pas active, et oui il faut l’activer manuellement, idem pour la déduplication.

– Activation de la déduplication et de la compression:


tripaxcolt2# zfs set dedup=on data
tripaxcolt2# zfs set compression=on data
tripaxcolt2#

– Refaisons le même test avec dd (toujours avec /dev/zero) pour tester la compression:


tripaxcolt2# rm test*
tripaxcolt2# ls -la
total 4
drwxr-xr-x 2 root wheel 2 Aug 23 17:54 .
drwxr-xr-x 21 root wheel 512 Aug 23 17:28 ..

tripaxcolt2# dd if=/dev/zero of=test1 count=100 bs=10M
 100+0 records in
 100+0 records out
 1048576000 bytes transferred in 11.337030 secs (92491244 bytes/sec)
 tripaxcolt2# df -h /data
 Filesystem Size Used Avail Capacity Mounted on
 data 99G 31k 99G 0% /data

tripaxcolt2# ls -la
 total 4
 drwxr-xr-x 2 root wheel 3 Aug 23 17:54 .
 drwxr-xr-x 21 root wheel 512 Aug 23 17:28 ..
 -rw-r--r-- 1 root wheel 1048576000 Aug 23 17:54 test1
 tripaxcolt2# du -sh test1
 512B test1

tripaxcolt2# dd if=/dev/zero of=test2 count=100 bs=10M
 100+0 records in
 100+0 records out
 1048576000 bytes transferred in 11.778770 secs (89022538 bytes/sec)
 tripaxcolt2#

tripaxcolt2# df -h /data
 Filesystem Size Used Avail Capacity Mounted on
 data 99G 31k 99G 0% /data
 tripaxcolt2#

tripaxcolt2# du -sh test*
 512B test1
 512B test2
 tripaxcolt2# du -sh /data/
 2.5k /data/

–> on a donc 2 fichiers de 1Go chacun et pourtant cela prend que 2.5Ko.

La compression est un succès !

– Passons à la déduplication.

Nous allons utiliser dd avec /dev/random pour ne pas exploiter la compression mais uniquement la déduplication.


tripaxcolt2# dd if=/dev/random of=test2 count=100 bs=10M
100+0 records in
100+0 records out
1048576000 bytes transferred in 122.076469 secs (8589501 bytes/sec)
tripaxcolt2# df -h /data
Filesystem Size Used Avail Capacity Mounted on
data 99G 1G 98G 1% /data

tripaxcolt2# du -sh *
 512B test1
 1G test2

– Nous avons un fichier “test2” de 1Go. Pour tester la déduplication, il suffit de copier ce fichier vers un nouveau (avec “cp”):


tripaxcolt2# cp test2 test3 <--- 1ere copie
tripaxcolt2# du -sh *
512B test1
1G test2 <--- original
1G test3 <--- 1ere copie
tripaxcolt2# df -h /data
Filesystem Size Used Avail Capacity Mounted on
data 100G 2G 98G 2% /data <---- Passage de 99G à 100G
tripaxcolt2# cp test3 test4 <---- 2eme copie
tripaxcolt2# du -sh *
512B test1
1G test2 <--- original
1G test3 <--- 1ere copie
1G test4 <--- 2eme copie
tripaxcolt2# df -h /data
Filesystem Size Used Avail Capacity Mounted on
data 101G 3G 98G 3% /data <---- Passage de 100G à 101G

tripaxcolt2# cp test4 test5 <---- 3eme copie
tripaxcolt2# du -sh *
 512B test1
 1G test2 <--- original
 1G test3 <--- 1ere copie
 1G test4 <--- 2eme copie
 1G test5 <--- 3eme copie
tripaxcolt2# df -h /data
Filesystem Size Used Avail Capacity Mounted on
data 102G 3.9G 98G 4% /data <---- Passage de 101G à 102G

=> On voit que la taille du disque total a augmenté, passant de 99Go à 102Go après les 3 copies du fichier de 1Go. Succès !

– Quelques statistiques:


tripaxcolt2# zdb -DD data
 DDT-sha256-zap-duplicate: 8000 entries, size 268 on disk, 142 in core

DDT histogram (aggregated over all DDTs):

bucket allocated referenced
 ______ ______________________________ ______________________________
 refcnt blocks LSIZE PSIZE DSIZE blocks LSIZE PSIZE DSIZE
 ------ ------ ----- ----- ----- ------ ----- ----- -----
 4 7.81K 1000M 1000M 1000M 31.2K 3.91G 3.91G 3.91G
 Total 7.81K 1000M 1000M 1000M 31.2K 3.91G 3.91G 3.91G

dedup = 4.00, compress = 1.00, copies = 1.00, dedup * compress / copies = 4.00

tripaxcolt2# zpool list
NAME   SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
data   101G  1006M   100G     0%  4.00x  ONLINE  -

Crash Mysql -> Recovery

Ca n’a pas loupé, le dernier post au sujet de la sauvegarde de MySQL est plus que d’actualité.

En effet, hier, suite à une maj de mysql-server:

 # portupgrade mysql-server

MySQL était alors plantée avec le message suivant:

110817 21:02:23 mysqld_safe Starting mysqld daemon with databases from /var/db/mysql
110817 21:02:23 InnoDB: The InnoDB memory heap is disabled
110817 21:02:23 InnoDB: Mutexes and rw_locks use GCC atomic builtins
110817 21:02:23 InnoDB: Compressed tables use zlib 1.2.3
110817 21:02:23 InnoDB: Initializing buffer pool, size = 256.0M
110817 21:02:23 InnoDB: Completed initialization of buffer pool
InnoDB: Error: log file ./ib_logfile0 is of different size 0 5242880 bytes
InnoDB: than specified in the .cnf file 0 67108864 bytes!
110817 21:02:23 [ERROR] Plugin 'InnoDB' init function returned error.
110817 21:02:23 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
110817 21:02:23 [ERROR] Unknown/unsupported storage engine: InnoDB
110817 21:02:23 [ERROR] Aborting

110817 21:02:23 [Note] /usr/local/libexec/mysqld: Shutdown complete

110817 21:02:23 mysqld_safe mysqld from pid file /var/db/mysql/tripaxland4thot.pid ended

Etant donné que le service est en production et que les bases sont relativement petites, la restauration fut immédiate:

# rm -rf /var/db/mysql/*
# ls -la /root/_archives/mysql/db.all.201108*
-rw-r--r--  1 root  wheel  3627458 Aug 15 01:01 /root/_archives/mysql/db.all.20110815.sql.gz
-rw-r--r--  1 root  wheel  3639055 Aug 16 01:01 /root/_archives/mysql/db.all.20110816.sql.gz
-rw-r--r--  1 root  wheel  3651217 Aug 17 01:01 /root/_archives/mysql/db.all.20110817.sql.gz
# zcat /root/_archives/mysql/db.all.20110817.sql.gz | mysql
# /usr/local/etc/rc.d/mysql start

Et tout refonctionne 🙂

Script pour sauvegarder un serveur MySQL sous Linux ou FreeBSD

Avoir une base de données MySQL c’est bien, la sauvegarder c’est mieux.

Voici un petit script permettant de s’éviter des nuits de sueur après un crash de sa DB.

Le délai de conservation est de 90 jours.

#!/bin/sh

DUMP=/usr/local/bin/mysqldump
MYSQL=/usr/local/bin/mysql
OPTS="--opt"
DATE=`date "+%Y%m%d"`
ARCH_DIR=/root/_archives/mysql
DAYS=90

if [ ! -d $ARCH_DIR ]
then
        echo "error: no archive directory. Please create it or change it."
        exit 1
fi

$DUMP $OPTS  --all-databases | gzip > $ARCH_DIR/db.all.$DATE.sql.gz

if [ $? -ne 0 ]
then
        echo "error: check log"
        exit 2
fi

echo "show databases" | $MYSQL -N | while read db
do
        $DUMP $OPTS $db | gzip > $ARCH_DIR/db.$db.$DATE.sql.gz
done

find $ARCH_DIR -type f -name "db.*" -mtime +$DAYS -exec rm {} \;

exit 0

Ce script est à exécuter en crontab pour avoir une sauvegarde journalière par exemple:

tripaxland4thot# crontab -l
# Daily MySQL DUMP
1 1 * * * /root/_tools/dump_mysql.sh  > /tmp/dump_mysql.log 2>&1

Xymon – Monitorer portaudit sur un Freebsd & ses Jails

Il est important de savoir si des packages comportent des vulnérabilités sur son système.

Pour cela, FreeBSD met à disposition un outil appelé portaudit.

Couplé avec Xymon, voici ce que cela donne:

Lorsqu’il y a une alerte, la diode devient rouge et affiche le(s) package(s) présentant la faille de vulnérabilité remontée par portaudit:

Il arrive bien souvent d’avoir des jails sur un FreeBSD, et plutôt que d’installer portait sur chaque jail, il est possible de l’exécuter depuis la globale et d’analyser les jails.

Ce script s’appuie sur ce principe et reportera au nom des jails sur Xymon.

#!/bin/sh
# HOBBIT - WATCH THE SECURITY
# nlienard - 13-06-2006
#####################################################
#
TEST="portaudit"
VERSION="1.0"
COLOR="red"
PORTAUDIT="/usr/local/sbin/portaudit"

echo > $BBTMP/.portaudit.report

# Hostmaster Portaudit Check
echo "Hostmaster check:" >> $BBTMP/.portaudit.report
$PORTAUDIT -Fad >> $BBTMP/.portaudit.report
cat $BBTMP/.portaudit.report | grep  'Affected'  > /dev/null
if [ $? -ne 0 ]; then
        COLOR="green"
fi

echo "" >> $BBTMP/.portaudit.report
# FORMAT IT PROPERLY FOR BB...
LINE="status+1560 $MACHINE.$TEST $COLOR `date` - portaudit looks $COLOR `echo ; cat $BBTMP/.portaudit.report`"
$BB $BBDISP "$LINE"                     # SEND IT TO BBDISPLAY

# Jails Portaudit Check
cd $BBTMP
for JAIL in `jls | grep -v JID | awk '{print $4}'`; do
        COLOR="red"
        JIP=`basename $JAIL`
        #JNAME=`jls | grep $JIP | awk '{print $3}' | cut -d"." -f1`
        JNAME=`jls | grep $JIP | awk '{print $3}'`
        ls -1 $JAIL/var/db/pkg > $BBTMP/$JIP.paf
        echo "Jail ($JNAME) detection:" > $BBTMP/.portaudit.report
        $PORTAUDIT -f $BBTMP/$JIP.paf >> $BBTMP/.portaudit.report
        cat $BBTMP/.portaudit.report | grep  'Affected'  > /dev/null
        if [ $? -ne 0 ]; then
                COLOR="green"
        fi
        LINE="status+1560 $JNAME.$TEST $COLOR `date` - portaudit looks $COLOR `echo ; cat $BBTMP/.portaudit.report`"
        $BB $BBDISP "$LINE"                     # SEND IT TO BBDISPLAY
        rm $BBTMP/$JIP.paf
        echo ""
done
exit 0

Ce script s’installe dans ~xymon/client/ext/
Il s’active en insérant les lignes suivante dans  ~xymon/client/etc/clientlaunch.cfg

[portaudit]
        ENVFILE $XYMONCLIENTHOME/etc/xymonclient.cfg
        CMD $XYMONCLIENTHOME/ext/portaudit.sh
        LOGFILE $XYMONCLIENTLOGS/portaudit.log
        INTERVAL 60m

Ne pas oublier de redémarrer Xymon pour un résultat immédiat.

Si jamais Xymon n’est pas executé en root, il faudra utiliser sudo pour l’exécution de portaudit.

Inauguration du portail Distran

Installation de WordPress sous Freebsd.

L’installation de wordpress est plutôt simple et se résume comme suit:

cd /usr/ports/www/wordpress
make install clean
cd /usr/local/www/wordpress/
cp wp-config-sample.php wp-config.php
echo "create database wordpress"   | mysql

Configurer les identifiants sql précédemment créés.

vi wp-config.php

Pour être fonctionnel, il faut évidemment configurer Apache pour répondre sur ce nouveau documentroot (/usr/local/www/wordpress).