mag 022011
 

Come già detto più volte, con KVM si definisce il nuovo hypervisor Linux sponsorizzato principalmente da RedHat; in realtà KVM è un modulo kernel che permette di dialogare direttamente con le CPU dotate di Hardware specifico per la virtualizzazione, in modo da ottenere un “Hardware Virtualization” per ciò che riguarda la CPU; le rimanenti periferiche (ad esempio rete, dischi, porte USB, ecc.) vengono emulate attraverso qemu.
In questo HowTo eseguiremo un setup completo di KVM su Gentoo Linux e lo configureremo per far parte di un cloud OpenNebula.

Installazione di KVM
Partiamo con una installazione base di Gentoo Linux e installiamo i pacchetti necessari per KVM:

emerge -av qemu-kvm usbutils bridge-utils usermode-utilities iptables

Quindi andiamo a modificare la configurazione del kernel. Ammettendo di aver compialto il kernel in maniera manuale, digitiamo:

cd /usr/src/linux
make menuconfig

e abilitiamo il modulo KVM:

[*] Virtualization --->
    --- Virtualization
     Kernel-based Virtual Machine (KVM) support
       KVM for Intel processors support
    < >   KVM for AMD processors support

Io ho abilitato l’estensione per CPU Intel, se avete una CPU AMD ovviamente dovete utilizzare l’altro modulo.
Ora verifichiamo di aver attivato le impostazioni necessarie per la rete:

Device Drivers --->
    [*] Network device support --->
             Universal TUN/TAP device driver support

Networking support --->
    Networking options --->
        <*> 802.1d Ethernet Bridging
        <*> 802.1Q VLAN Support

   Networking options  --->
       [*] Network packet filtering framework (Netfilter)  --->
           Core Netfilter Configuration  --->
                <*> Netfilter connection tracking support
                -*- Netfilter Xtables support (required for ip_tables)
                <*>   "state" match support
           IP: Netfilter Configuration  --->
                <*> IPv4 connection tracking support (required for NAT)

Attiviamo tutti i moduli retalivi ad IPTables, quindi procediamo alla ricompilazione del kernel con:

make && make modules_install && make install

e riavviamo il server.

Installazione dei pacchetti per OpenNebula
Per dialogare con OpenNebula, è necessario installare dei pacchetti aggiuntivi:

echo "app-emulation/libvirt qemu udev" >> /etc/portage/package.use
emerge ruby libvirt sudo dnsmasq virtinst cyrus-sasl dmidecode

Ora andiamo ad aggiungere l’user “oneadmin” e i gruppi “cloud” e “libvirt”:

groupadd libvirt
groupadd --gid 1001 cloud
useradd --uid 1001 -g cloud -d /srv/cloud/one -s /bin/bash oneadmin
usermod -a -G libvirt oneadmin

Quindi modifichiamo il file /etc/libvirt/libvirt.conf in modo da consentire al gruppo libvirt a cui appartiene l’utente oneadmin di usare il demone via socket:

/etc/libvirt/libvirt.conf
listen_tls = 0
listen_tcp = 1
unix_sock_group = "libvirt"
unix_sock_ro_perms = "0777"
unix_sock_rw_perms = "0770"
unix_sock_dir = "/var/run/libvirt"

Ora modifichiamo il file /etc/conf.d/libvirtd

/etc/conf.d/libvirtd
LIBVIRTD_OPTS="--listen"
LIBVIRTD_KVM_SHUTDOWN_MAXWAIT="100"

e avviamo il demone:

rc-update add libvirtd default
/etc/init.d/libvirtd start

Ricordiamoci infine di montare la directory di rete /srv/cloud/one, che normalmente è esportata tramite NFS e di aggiungere l’host all’interno del cloud controller con:

onehost create host01 im_kvm vmm_kvm tm_nfs
apr 302011
 

Intanto, cos’è uno stage4?

stage4 è un termine che deriva dalle prime installazioni di Gentoo Linux che mettevano a disposizione tre diverse modalità di installazione con diversi gradi rispetto a ciò che veniva fornito precompilato.

In sostanza, come già detto in questo articolo, per installare Gentoo si esegue il download di un unico file in formato tar.bz che, una volta decompresso, crea un sistema base sul quale è possibile iniziare a lavorare. Oramai si utilizza sempre lo “stage3″ che, in un download di circa 150 MB, include tutti gli strumenti utili per la compilazione e il sistema di base senza il kernel.

Inizialmente, però, gentoo prevedeva anche lo stage1 e lo stage2:

  • lo stage1 è sostanzialmente il download di un file con solo gli strumenti per poter compliare il compilatore C
  • lo stage2 è il download di un file con tutti gli strumenti necessari per compilare il sistema di base
  • lo stage3, come già detto, è il download di un file contenete dia gli strumenti per compilare (stage2) con già il sistema di base precompilato.

Lo stage4 è quindi lo step successivo, cioè il file contenente il backup completo di una macchina linux compilata e operativa: vediamolo un po’ come il “disaster recovery” di un server Linux.

Questa operazione è abbastanza conosciuta su sistemi Gentoo Linux, però è comunqe adattabile a qualsiasi distribuzione in quanto utilizza strumenti standard. La cosa interessante è che, per creare uno stage4, non è necessario spegnere la macchina, ma è possibile farlo mentre la stessa è operativa.

Per creare lo stage4 di una macchina esistono numerosi script, tutti scaricabili a questo indirizzo.

Personalmente quello che preferisco è questo:

mkstage4.sh
#!/bin/bash

# Backup script for Gentoo Linux
#
# mkstage4.sh is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# mkstage4.sh is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# Copyright: Reto Glauser aka blinkeye
# Mailto: stage4 at blinkeye dot ch
# Homepage: http://blinkeye.ch
# Forum post: http://forums.gentoo.org/viewtopic-t-312817.html
# Date: 2009-04-02

version=v3.7
basename=`basename $0`

find=/usr/bin/find
tar=/bin/tar

# these are the commands we actually need for the backup
command_list=(cut date echo $find grep hostname mount sh split $tar umount uname which)

# verify that each command we use exists. if one can't be found use $PATH and make a suggestion if possible.
for command in ${command_list[@]}; do
        if [ ! -x "`which $command 2>&1`" ]; then
                echo -e "\nERROR: $command not found! "
                base=`basename $command`
                if [ "`which $base 2>&1 | grep "no \`basename $command\` in"`" != "" ]; then
                        echo -e "ERROR: $base is not in your \$PATH."
                fi
                exit -1
        fi
done

help="\nUsage:\n\nsh `basename $0` [[-v]|[--verbose]] [[-s]|[--split]] \n\nTo run the script NOT in verbose mode comes in handy if you want to see only the errors that occur during the backup.\n"

# Defaults to creating one tarball
tar_output="--file"

# split command
split_options="--suffix-length=1 --bytes=685m"

# options for the tar command
tarOptions=" --preserve-permissions --create --absolute-names --totals --ignore-failed-read"

# where to put the stage4
stage4Location=/mnt/backups/stage4

# name prefix
stage4prefix=`hostname`-stage4-`date +\%Y.\%m.\%d`

# patterns which should not be backed up (like iso files).
# example: default_exclude_pattern="*.iso *.divx"
# These pattern count only for files NOT listed in the $custom_include_list.
default_exclude_pattern=""

# these files/directories are always excluded. don't add trailing slashes.
# don't touch it unless you know what you are doing!
# /var/db and /var/cache/edb are intentionally added here. they are listed
# in $default_include_folders
default_exclude_list="
/dev
/lost+found
/mnt
/proc
/sys
/tmp
/usr/portage
/usr/src
/var/log
/var/tmp
/var/db
/var/cache/edb
$stage4Location
`echo $CCACHE_DIR`"

# files/devices/folders, which need to be backed up (preserve folder structure).
# don't touch it unless you know what you are doing! no recursive backup of folders.
# use $default_include_folders instead.
default_include_files="
/dev/null
/dev/console
/home
/mnt
`find /mnt -name .keep`
/proc
/sys
/tmp
/usr/portage
/usr/src
/var/log/emerge.log
/usr/src/linux-`uname -r`/.config"

# folders, which need to be backed up recursively on every backup.
# don't touch it unless you know what you are doing! the reason for this
# variable is that some users add /var to the $default_exclude_list. here
# we ensure that portage's memory is backed up in any case.
default_include_folders="
/var/db"

# IMPORTANT: A minimal backup will EXCLUDE files/folders listed here. A custom backup will
# include/exclude these files/folders depening on your answer.
custom_include_list="
/home/*
/usr/src/linux-`uname -r`"

# add files/folders here which are subfolders of a folder listed in $custom_include_list which should NOT
# be backed up. eg.
#custom_exclude_list="/home/foo/mp3 /home/foo/downloads /home/foo/.*"
custom_exclude_list=""

# Only files/folders within the $custom_include_list are checked against these patterns
# custom_exclude_pattern="*.mp3 *.iso"
custom_exclude_pattern=""

# the find_command
find_command="$find /*"

# don't backup anything which matches pattern listed in $default_exclude_pattern
for pattern in $default_exclude_pattern; do
        find_command="$find_command -not -name $pattern"
done

# assemble the find_command
function find_files()
{
        for folder in $default_exclude_list; do
                find_command="$find_command -path $folder -prune -o"
        done

        find_command="$find_command -print"

        for i in $default_include_files; do
                find_command="echo $i; $find_command"
        done

        for i in $default_include_folders; do
                if [ -d $i ]; then
                        find_command="$find $i; $find_command"
                else
                        find_command="echo $i; $find_command"
                fi
        done
}

# check the exclude/include variables for non-existing entries
function verify()
{
        for i in $1; do
                if [ ! -e "`echo "$i" | cut -d'=' -f2 | cut -d'*' -f1`" -a "$i" != "/lost+found" -a "$i" != "$stage4Location" ]; then
                        echo "ERROR: `echo "$i" | cut -d'=' -f2` not found! Check your "$2
                        exit 0
                fi
        done
}

# check input parameters
while [ $1 ]; do
        case  $1 in
        "-h" | "--help")
                echo -e $help
                exit 0;;
        "-v" | "--verbose")
                verbose=$1;;
        "-s" | "--split")
                tar_output="--split";;
        "");;
        *)
                echo -e $help
                exit 0;;
        esac
        shift
done

echo ""

# check folder/files listed in $default_exclude_list exist
verify "$default_exclude_list" "\$default_exclude_list"

# check files listed in $default_include_files exist
verify "$default_include_files" "\$default_include_files"

# check folder listed in $default_include_folders exist
verify "$default_include_folders" "\$default_include_folders"

#check folder listed in $custom_include_list exist
verify "$custom_include_list" "\$custom_include_list"

#check folder listed in $custom_exclude_list exist
verify "$custom_exclude_list" "\$custom_exclude_list"

# print out the version
 echo -e "\nBackup script $version"
 echo -e "=================="

# how do you want to backup?
echo -e "\nWhat do you want to do? (Use CONTROL-C to abort)\n
Fast (tar.gz):
 (1) Minimal backup
 (2) Interactive backup

Best (tar.bz2):
 (3) Minimal backup
 (4) Interactive backup\n"

while [ "$option" != '1' -a "$option" != '2' -a "$option" != '3' -a "$option" != '4' ]; do
        echo -en "Please enter your option: "
        read option
done

case $option in
[1,3])
        stage4Name=$stage4Location/$stage4prefix-minimal.tar;;

[2,4])
        stage4Name=$stage4Location/$stage4prefix-custom.tar

        for folder in $custom_include_list; do
                echo -en "\nDo you want to backup" `echo "$folder" | cut -d'=' -f2`"? (y/n) "
                read answer
                while [ "$answer" != 'y' -a "$answer" != 'n' ]; do
                        echo -en "Do you want to backup" `echo "$folder" | cut -d'=' -f2`"? (y/n) "
                        read answer
                done
                if [ "$answer" == 'n' ]; then
                        find_command="$find_command -path $folder -prune -o"
                else
                        custom_find="$find $folder"
                        for i in $custom_exclude_pattern; do
                                custom_find="$custom_find -name $i -o"
                        done
                        for i in $custom_exclude_list; do
                                custom_find="$custom_find -path $i -prune -o"
                        done
                        find_command="$custom_find -print; $find_command"
                fi
        done ;;
esac

# add $custom_include_list to the $default_exclude_list as we assembled
# $custom_find with $custom_include_list already.
default_exclude_list="$default_exclude_list $custom_include_list"

case $option in
[1,2])
        stage4postfix="gz"
        zip="--gzip";;

[3,4])
        stage4postfix="bz2"
        zip="--bzip2";;
esac

# mount boot
echo -e "\n* mounting boot"
mount /boot >/dev/null 2>&1

# find the files/folder to backup
find_files
find_command="($find_command)"

# create the final command
if [ "$tar_output" == "--file" ]; then
        tar_command="$find_command | $tar $zip $tarOptions $verbose --file $stage4Name.$stage4postfix --no-recursion -T -"
else
        tar_command="$find_command | $tar $zip $tarOptions $verbose --no-recursion -T - | split $split_options - "$stage4Name.$stage4postfix"_"
fi

if [ "$verbose" ]; then
        echo -e "\n* creating the stage4 in $stage4Location with the following command:\n\n"$tar_command
fi

# everything is set, are you sure to continue?
echo -ne "\nDo you want to continue? (y/n) "
read answer
while [ "$answer" != 'y' ] && [ "$answer" != 'n' ]; do
        echo -ne "Do you want to continue? (y/n) "
        read answer
done

if [ "$answer" == 'y' ]; then
        # check whether the file already exists.
        if [ "$tar_output" == "--split" ]; then
                overwrite="`ls "$stage4Name.$stage4postfix"_* 2>&1 | grep -v 'No such file'`"
        else
                overwrite="$stage4Name.$stage4postfix"
        fi

        if [ -a "`echo "$overwrite" | grep "$overwrite" -m1`" ]; then
                echo -en "\nDo you want to overwrite $overwrite? (y/n) "
                read answer
                while [ "$answer" != 'y' ] && [ "$answer" != 'n' ]; do
                        echo -en "Do you want to overwrite $overwrite? (y/n) "
                        read answer
                done
                if [ "$answer" == 'n' ]; then
                        echo -e "\n* There's nothing to do ... Exiting"
                        exit 0;
                fi
        fi

        # if necessary, create the stage4Location
        if [ ! -d "$stage4Location" ] ; then
                echo "* creating directory $stage4Location"
                mkdir -p $stage4Location
        fi

        echo -e "\n* Please wait while the stage4 is being created.\n"

        # do the backup.
        sh -c "$tar_command"

        # finished, clean up
        echo -e "\n* stage4 is done"
        echo "* umounting boot"
        umount /boot >/dev/null 2>&1

        # Integrity check
        echo -e "* Checking integrity"
        if [ "$zip" == "--gzip" ]; then
                zip="gzip"
        else
                zip="bzip2"
        fi

        if [ "$tar_output" == "--split" ]; then
                if [ "`cat "$stage4Name.$stage4postfix"_*"" | $zip --test 2>&1`" != "" ]; then
                        echo -e "* Integrity check failed. Re-run the script and check your hardware."
                        exit -1
                fi
        else
                if [ "`$zip --test  $stage4Name.$stage4postfix 2>&1`" != "" ]; then
                        echo -e "* Integrity check failed. Re-run the script and check your hardware."
                        exit -1
                fi
        fi

        # everything went smoothly
        echo -e "* Everything went smoothly. You successfully created a stage4."

else
        echo -e "\n* There's nothing to do ... Exiting"
fi
apr 212011
 

Riprendiamo il precedente articolo per modificare l’installazione di un nodo di calcolo Gentoo Xen per utilizzarlo con il nuovo Cloud Controller ridondato OpenNebula la cui configurazione potete trovare qui.

Innanzi tutto modifichiamo il file hosts rendendolo simile a quello presente sul cloud controller, ma levando le impostazioni relative alla rete 172.17.0.0 inacessibile dai nodi:

/etc/hosts
172.16.0.1 cloud-01.lan.local cloud-01
172.16.0.2 cloud-02.lan.local cloud-02
172.16.0.3 cloud-03.lan.local cloud-03

172.16.0.250 cloud-cc.lan.local cloud-cc
172.16.0.251 cloud-cc01.lan.local
172.16.0.252 cloud-cc02.lan.local

Installiamo i pacchetti di base per l’integrazione con il cloud controller: prestiamo attenzione al pacchetto aggiuntivo aoetools per montare i dischi LVM:

emerge ruby nfs-utils aoetools lvm2 sudo

Una volta terminata l’installazione dei pacchetti, aggiungiamo la seguente riga nel file /etc/hosts

172.16.0.250:/srv/cloud/one    /srv/cloud/one  nfs    rw,_netdev,hard,intr,rsize=8192,wsize=8192 0 0

E creiamo le directory con il mountpoint:

mkdir -p /srv/cloud/images
mkdir -p /srv/cloud/one

Il mountpoint in questo caso è /srv/cloud/one invece che solo /srv/cloud in quanto il disco DRBD sul server Cloud Controller è montato in /srv/cloud/one per cui esportando la directory padre il disco montanto non verrebbe visto correttamente dai client nfs.
Ultima cosa importante è che di default sarà utilizzato NFS4 per cui è necessiario che sia il server sia il client abbiano la medesima configurazione del dominio all’interno del file /etc/idmapd.conf:

/etc/idmapd.conf
[General]

Verbosity = 0
Pipefs-Directory = /var/lib/nfs/rpc_pipefs
Domain = lan.local # Modificare questo valore

[Mapping]

Nobody-User = nobody
Nobody-Group = nobody

Attiviamo il demone NFS in modo da far partire statd per il locking sul server:

/etc/init.d/nfs start
rc-update add nfs default

Se nel kernel non avete compilato i moduli per il server NFS riceverete un errore, però potete soprassedere in quanto a noi server NFS client e il demone serve solo per far poartire il servizio ident. Quindi, montiamo il disco nfs con:

mount /srv/cloud/one

Riguardo al demone AoE, Gentoo non richiede alcuna configurazione, pertanto è sufficiente controllare il funzionamento con aoe-stat.
Prestare inoltre attenzione al fatto che i domini LVM devono essere online (è possibile controllarlo con lvdisplay). Nel caso in cui non siano visti online, è necessario lanciare:

vgchange -a y

Al limite inserire questo comando in rc.local per eseguirlo automaticamente ad ogni avvio.

Nel caso in cui sia una nuova installazione, ricordiamoci di creare l’utente oneadmin e il gruppo cloud:

groupadd --gid 1001 cloud
useradd --uid 1001 -g cloud -d /srv/cloud/one -s /bin/bash oneadmin

A questo punto, possiamo provare a passare nella modalità non privilegiata con:

su - oneadmin

e modifichiamo il file /srv/cloud/one/.ssh/authorized_keys, duplicando la riga relativa a cloud-cc e impostando il nome host a cloud-01. ad es:

ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx oneadmin@cloud-cc
ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx oneadmin@cloud-01
ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx oneadmin@cloud-02

Spostiamoci un attimo sul cloud controller e proviamo ad accedere in SSH sul nodo di calcolo:

su - oneadmin
ssh cloud-01

Non deve chiedere la password (al primo login chiederà di salvare la chiave, rispondere di si), altrimenti c’è qualcosa che non quadra.

Torniamo sul nodo di calcolo e, come utente root, modifichiamo il file /etc/sudoers:

/etc/sudoers
%cloud    ALL=(ALL) NOPASSWD: /usr/sbin/xm *
%cloud    ALL=(ALL) NOPASSWD: /usr/sbin/xentop *
%cloud    ALL=(ALL) NOPASSWD: /sbin/lvcreate *
%cloud    ALL=(ALL) NOPASSWD: /sbin/lvremove *
%cloud    ALL=(ALL) NOPASSWD: /sbin/lvs *

Sul Cloud Controller, infine, aggiungiamo il server al cloud con:

onehost create cloud-01 im_xen vmm_xen tm_lvm
onehost create cloud-02 im_xen vmm_xen tm_lvm

Ultima cosa alla quale bisogna prestare attenzione è che XEN 4.1 include un nuovo comando (xl) che progressivamente andrà a sostituire il comando xm con il quale si amministra l’hypervisor xen. Xm è mantenuto comunque in questa versione, però non è funzionante il sottocomando “sched-cred” per cui è necessario modificare il file xenrc e sostituire

export XM_CREDITS="sudo $XM_PATH sched-cred"

con

export XM_CREDITS="sudo /usr/sbin/xl sched-cred"

Personalmente ho provato a sostituire globalmente xm con xl modificando la variabile XM_PATH, però evidentemente non è compatibile.

apr 202011
 

Dopo aver installato Xen 4.0.1 su Debian 6, mi sono accorto che il Kernel Xen di Debian a 64 bit non include il supporto per blktap2, necessario per utilizzare le definizioni dei dischi aio:tap di Xen.
Dovendo ricompilare a mano kernel e, con buona probabilità, Xen e Xen-Tools, ho deciso di provare ad usare Gentoo come distribuzione base per l’hypervisor Xen.

Partiamo quindi da una installazione di base di Xen come spiegato nell’articolo di ieri e andiamo oltre installando Xen.

Configurazione di base del sistema
E’ necessario partire dalla versione di default di Gentoo (non hardened) in quanto la compilazione di Xen-Tools ha qualche problema con le impostazione PAE della vesione Hardened.
Inoltre, se state compilando su una macchina a 32 bit, è necessario impostare il flag “-mno-tls-direct-seg-refs” in make.conf e procedere alla ricompilazione del sistema (emerge -e world).

La versione 4.1 di Xen è ancora considerata sperimentale, pertanto è necessario eseguire l’unmask dei pacchetti modificando il file :

/etc/portage/package.keywords
app-emulation/xen
app-emulation/xen-tools
sys-kernel/xen-sources

Quindi abilitiamo il flag hvm per abilitare le funzionaltà VT-X:

echo app-emulation/xen-tools hvm >> /etc/portage/package.use

Ora installiamo i prerequisiti:

emerge iasl usermode-utilities

Installazione del kernel
Innanzi tutto scarichiamo il kernel con:

emerge xen-sources

A questo punto bisogna compilare il kernel. Invece di creare un unico kernel sia per il dom0, sia per il domU, creeremo due kernel separati usando l’opzione O= del comando make.

cd /usr/src/linux
mkdir -p build/dom0 build/domU
make O=build/dom0 menuconfig

Ora creeremo la configurazione del kernel per il dom0. Abilitiamo:

  • Processor type and features -> Enable Xen compatible kernel
  • Processor type and features -> Support for hot-pluggable CPUs
  • Networking options -> 802.1d Ethernet Bridging
  • Device drivers -> XEN -> Privileged Guest (domain 0)

Ora è il turno della configurazione del kernel per il DomU. Come per il Dom0 abilitiamo:

  • Processor type and features -> Enable Xen compatible kernel
  • Processor type and features -> Support for hot-pluggable CPUs
  • Networking options -> 802.1d Ethernet Bridging
  • Bus options -> PCI support
  • Device drivers -> tutte le opzioni compreso ATA, Serial ATA, HID e USB
  • Device drivers -> supporto SCSI
  • Infine abilitiamo io driver di XEN per il domU:
  •  

A questo punto passiamo a compilare i due kernel con:

make O=build/dom0 -j24 && make O=build/domU -j24

e ad installare il kernel del dom0:

make O=build/dom0 modules_install install

Configurazione del bootloader
Editiamo il file /etc/grub/grub.conf per avviare il kernel xen aggiungerndo le seguenti righe:

title XEN 4.1
root (hd0,0)
kernel /xen-4.1.gz
module /vmlinuz-2.6.34-xen-r4 root=/dev/sda3

Ricordiamoci di modificare l’opzione “default” in modo da avviare il kernel corretto.

Installazione di Xen
Per installare i pacchetti lanciamo il comando:

emerge xen xen-tools

Al termine dell’installazione aggiungiamo il demone xend all’avvio automatico con:

rc-update add xend default
apr 192011
 

Come già detto in precedenza, quando necessito di elevata potenza lato server, tengo sempre in considerazione la distribuzione Gentoo Linux.
Sebbene nel tempo l’installazione e l’uso della distribuzione si sia semplificato, rimane sempre un “alone di mistero” sul suo funzionamento: la differenza sostanziale che Gentoo ha rispetto alle altre distribuzioni, è che non mette a disposizione dei pacchetti precompilati, ma dei file chiamati “ebuild” che istruiscono il sistema su come compilare automaticamente il pacchetto desiderato.
Quindi, sebbene sebbene “l’emerge degli ebuild” (emerge è il comando per installare e rimuovere pacchetti in gentoo) sia una procedura totalmente automatizzata, non si tratta di un semplice “download and install” ma di un “download, compile and install”: questo è il maggior pregio ma anche il maggior difetto della distribuzione (quindi è la caratteristica) perchè ne risulta un sistema altamente ottimizzato performate e stabile, ma i tempi di installazione ed aggiornamento sono molto più lunghi rispetto ad altre distribuzioni.
Giusto dare un bencmarck indicativo su una query mysql, se la query impiega “1″ su un sistema windows con il pacchetto mysql, su Linux Debian impiega 1/2 e su Gentoo impiega 1/4!

Veniamo al dunque e procediamo all’installazione di un server gentoo.

Innanzi tutto serve un CD di installazione: lo potete scaricare da un qualsiasi mirror. Una volta scaricato il CD di installazione e avviato il sistema apparirà una shell in cui avrete già i privilegi di root. Iniziamo a preparare il server per l’installazione.

Configurazione della rete
Con buone probabilità il CD autoavviante avrà già rilevato la rete tramite DHCP. Se così non fosse lanciate il comando:

net-setup ethX # Sostituite X con l'id dell'interfaccia di rete

Apparirà una interfacccia di testo in cui potrete facilmente configurare la rete

Formattazione del disco
Ammettiamo di avere un disco identificato come sda. Utilizzare cfdisk per creare 3 partizioni (boot, swap e /) lanciando

cfdisk /dev/sda

Quindi formattiamo e montiamo il tutto:

mke2fs /dev/sda1
mke2fs -j /dev/sda3
mkswap /dev/sda2
swapon /dev/sda2
mount /dev/sda3 /mnt/gentoo
mkdir /mnt/gentoo/boot
mount /dev/sda1 /mnt/gentoo/boot

Download del sistema di base
Gentoo mette a disposizione un sistema di base chiamato stage3 già precompilato sul quale agire per creare il proprio sistema ottimizzato. Scarichiamo il file dal mirror di gentoo con:

cd /mnt/gentoo
links http://www.gentoo.org/main/en/mirrors2.xml

E’ possibile scaricare lo stage 3 in due versioni: la standard adatta a qualsiasi sistema e la hardened adatta principalemte all’uso server in quanto aggiunge alcune sicurezze aggiuntive.
A questo punto scarichiamo il “portage” che è un insieme di file e directory contenenti tutti gli ebuild:

links http://www.gentoo.org/main/en/mirrors2.xml

Ora scompattiamo i due file:

tar xvpjf stage3-amd64-hardened-20110414.tar.bz2
tar xvpjf portage-latest.tar.bz2 -C usr/

Mount delle directory di sistema e chroot in gentoo
Ora facciamo gli ultimi affinamenti per rendere operativo il nostro stage3

cd /mnt/gentoo
mount -o bind /dev/ dev/
mount -t proc none proc/
cp /etc/resolv.conf etc/
chroot .
env-update
source /etc/profile

Aggiorniamo il portage
Per aggiornare l’elenco dei pacchetti installabili è necessario lanciare:

emerge --sync

Scegliamo il profilo
I profili sono degli ambienti preconfigurati adatti a diversi scopi per sceglierne uno lanciamo:

profile-config list
profile-config set X


Settaggio delle opzioni di compilazione

Il file /etc/make.conf contiene le opzioni di default del compilatore.

/etc/make.conf
# These settings were set by the catalyst build script that automatically
# built this stage.
# Please consult /usr/share/portage/config/make.conf.example for a more
# detailed example.
CFLAGS="-O2 -pipe"
CXXFLAGS="${CFLAGS}"
# WARNING: Changing your CHOST is not something that should be done lightly.
# Please consult http://www.gentoo.org/doc/en/change-chost.xml before changing.
CHOST="x86_64-pc-linux-gnu"
# These are the USE flags that were used in addition to what is provided by the
# profile used for building.
USE="mmx sse sse2"

Il CFLAG è la variabile con i flag di ottimizzazione del compilatore sulla quale agire per ottenere sistemi più o meno “spinti” o il cui spazio occupato su disco è minore.
Nel caso in cui abbiamo variato i flag, è importante ricompilare l’intero sistema con:

emerge -e world

Nel caso in cui non abbiamo variato le configurazioni di default, non è necessario ricompilare il tutto, ma è sufficiente aggiornare il sistema con

emerge -uDN world

Configurazione della timezone

cp /usr/share/zoneinfo/Europe/Rome /etc/localtime

Compilazione del kernel

emerge gentoo-sources
cd /usr/src/linux
make menuconfig

Qui è necessario attivare tutte le opzioni ed i driver necessari per far funzionare il proprio server.
Una volta ultimata la configurazione, lanciamo la compilazione vera e propria con:

make && make modules_install

e copiamo il kernel all’interno della directory /boot:

cp arch/x86_64/boot/bzImage /boot/kernel-2.6.34-gentoo-r1

Se vi trovate in difficoltà nella compilazione del kernel (che è senza dubbio il processo più complesso dell’installazione) potete affidarvi all’utility genkernel attraverso la quale avrete un kernel certamente funzionante anche se con “qualcosa di troppo”:

emerge genkernel
zcat /proc/config.gz > /usr/share/genkernel/arch/x86_64/kernel-config
genkernel all

Configurazione delle informazioni del disco
Il file /etc/fstab contiene tutte le informazioni necessari per il setup delle partizioni:

/etc/fstab
/dev/sda1   /boot        ext2    defaults,noatime     1 2
/dev/sda2   none         swap    sw                   0 0
/dev/sda3   /            ext3    noatime              0 1

/dev/cdrom  /mnt/cdrom   auto    noauto,user          0 0

proc        /proc        proc    defaults             0 0
shm         /dev/shm     tmpfs   nodev,nosuid,noexec  0 0

Informazioni di rete
La rete deve essere configurata nel file /etc/conf.d/net

/etc/conf.d/net
config_eth0=( "192.168.0.2 netmask 255.255.255.0 brd 192.168.0.255" )
routes_eth0=( "default via 192.168.0.1" )

Inoltre editare il file /etc/conf.d/hostname per assegnare il nome del server:

/etc/conf.d/hostname
HOSTNAME="tux"

Come in tutti i linux è cosa buona e giusta modificare il file /etc/hosts con il nome del proprio server

/etc/hosts
127.0.0.1 localhost
192.168.0.1 tux

Infine configurare l’avvio automatico dell’interfaccia di rete con:

rc-update add net.eth0 default

Configurazione delle impostazioni di sistema
Innanzi tutto settiamo la password di root:

passwd

Quindi editate i file /etc/rc.conf, /etc/conf.d/keymaps e /etc/conf.d/clock

Installazione dei pacchetti necessari per il boot del sistema
Installiamo il syslog:

emerge syslog-ng
rc-update add syslog-ng default

lo schedulatore

emerge vixie-cron
rc-update add vixie-cron default

Ed il bootloader:

emerge grub

Configuriamo grub editando il file /boot/grub/grub.conf

/boot/grub/grub.conf
default 0
timeout 30
splashimage=(hd0,0)/boot/grub/splash.xpm.gz

title Gentoo Linux 2.6.34-r1
root (hd0,0)
kernel /boot/kernel-2.6.34-gentoo-r1 root=/dev/sda3

title Gentoo Linux 2.6.34-r1 (rescue)
root (hd0,0)
kernel /boot/kernel-2.6.34-gentoo-r1 root=/dev/sda3 init=/bin/bb

Ed installiamolo sull’MBR del disco:

grep -v rootfs /proc/mounts > /etc/mtab
grub-install --no-floppy /dev/sda

Ora è possibile riavviare il server nel nuovo sistema operativo!