Silverlake - Le blog de ADIMCOR

Aller au contenu | Aller au menu | Aller à la recherche

lundi, mai 6 2013

Configuration à 2 listeners ou plus...

Certains DBA pour faciliter la gestion de leurs bases Oracle affectent un listener à chaque instance. Ainsi il suffit de stopper le listener pour rendre la base indisponible depuis le réseau. Certes la commande "alter system enable restricted session" est plus élégante, mais la configuration à multiples listener est parfois complexe. Il faut en effet indiquer à chaque instance sur quel listener elle doit s'enregistrer. Le paramètre LOCAL_LISTENER est prévu pour cela..

Le schéma ci-dessous présente l'architecture :

2_listeners.jpg

Le principe général est d'affecter YODA à LSNR1 et LUKE à LSNR2. Ainsi YODA est accèssible via le port 1521 alors que LUKE l'est via le port 1522 en TCP/IP.

Stopper le listener actuel.

lsnrctl stop

Il faut dans un premier temps modifier le fichier $ORACLE_HOME/network/admin/listener.ora ainsi afin de créer 2 listener distincts : LIST1 et LIST2.

LIST1 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.10)(PORT = 1521))
    )
  )

ADR_BASE_LIST1 = /u01/app/oracle

LIST2 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.10)(PORT = 1522))
    )
  )

ADR_BASE_LIST2 = /u01/app/oracle

Ensuite ajouter dans $ORACLE_HOME/network/admin/tnsnames.ora des alias vers ces deux listeners. Ce sont ces alias qui serviront pour le paramètre LOCAL_LISTENER.

LSNR1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      ( ADDRESS = ( PROTOCOL = TCP ) ( HOST = 192.168.3.10 )( PORT = 1521))
    )
  )

LSNR2 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      ( ADDRESS = ( PROTOCOL = TCP ) ( HOST = 192.168.3.10 )( PORT = 1522))
    )
  )

YODA =
  (DESCRIPTION =
    (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.10)(PORT = 1521))
    )
    (CONNECT_DATA =
       (SERVICE_NAME = YODA)
    )
)

LUKE =
  (DESCRIPTION =
    (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.10)(PORT = 1522))
    )
    (CONNECT_DATA =
       (SERVICE_NAME = LUKE)
    )
)

Redémarrer les deux listeners

lsnrctl start list1
lsnrctl start list2

Activer sur chaque instance le paramètre LOCAL_LISTENER

export ORACLE_SID=YODA
sqlplus "/ as sysdba"
SQL> alter system set local_listener='LSNR1' scope=both
SQL> alter system register ;
SQL> exit;
export ORACLE_SID=LUKE
sqlplus "/ as sysdba"
SQL> alter system set local_listener='LSNR2' scope=both
SQL> alter system register ;
SQL> exit;

Vérifier l'enregistrement correct des instances auprès des listeners

lsnrctl status list1
lsnrctl status list2

dimanche, avril 28 2013

Oracle erreur sur librairie libclntsh.so.11.1

Lors de la mise en place de Oracle sur RedHat ou CentOS, il faut impérativement désactiver la gestion SELinux sinon l'erreur suivante se produit.

sqlplus: error while loading shared libraries: /u01/app/oracle/product/11.2.0/dbhome_1/lib/libclntsh.so.11.1: cannot restore segment prot after reloc: Permission denied

Pour cela éditer le fichier /etc/selinux/config et remplacer la claude SELINUX=enforcing par SELINUX=disabled

Activer la configuration par la commande setenforce 0

mercredi, avril 3 2013

Multiplexer les fichiers de contrôle en ASM

Une base de données, LUKE pour ne pas la nommer, ne comporte qu'un seul fichier de contrôle. Les fichiers de la base sont gérés en ASM et OMF. Ce billet montre comment en créer une seconde copie.

Se connecter à la base afin de connaitre le nom du fichier de contrôle actuel.

export ORACLE_SID=LUKE
sqlplus "/ as sysdba"
SQL> show parameter control_files;

La requête renverra un nom du style : +DATA/luke/controlfile/current.260.811769741

Toujours sous SQL*plus arrêter la base, la démarrer en mode nomount, tenter l'insertion d'un second fichier de contrôle avec le même nom que le premier puis stopper la base

SQL> shutdown immediate;
SQL> startup nomount;
SQL> alter system set control_files='+DATA/luke/controlfile/current.260.811769741','+DATA' scope=spfile;
SQL> shutdown immediate;
SQL> exit;

Demander ensuite une restauration des fichiers de contrôle par RMAN

rman target /
RMAN> startup nomount;
RMAN> restore controlfile from '+DATA/luke/controlfile/current.260.811769741';
Démarrage de restore dans 03/04/13
utilisation du fichier de contrôle de la base de données cible au lieu du catalogue de récupération
canal affecté : ORA_DISK_1
canal ORA_DISK_1 : SID=24 type d'unité=DISK

canal ORA_DISK_1 : copie du fichier de contrôle copiée
nom de fichier de sortie=+DATA/luke/controlfile/current.260.811769741
nom de fichier de sortie=+DATA/luke/controlfile/current.268.811779383
Fin de restore dans 03/04/13

RMAN> exit

Se reconnecter SQL*Plus ouvrir la base de données et vérifier la présence des deux fichiers de contrôle.

sqlplus "/ as sysdba"
SQL> show parameter control_files

NAME				     TYPE	 VALUE
------------------------------------         ----------- ------------------------------
control_files			     string	 +DATA/luke/controlfile/current.260.811769741, +DATA/luke/controlfile/current.268.811779383
SQL> alter database mount;

Base de données modifiée.

SQL> alter database open;

Base de données modifiée.

SQL> select name from v$controlfile;

NAME
--------------------------------------------------------------------------------
+DATA/luke/controlfile/current.260.811769741
+DATA/luke/controlfile/current.268.811779383

SQL> 

vendredi, mars 22 2013

Clonage VM KVM avec virt-manager, problème réseau.

Virt-Manager permet une gestion graphique des machines virtuelles. Depuis cette interface il est possible de cloner facilement des machines. Il y a toutefois un petit soucis sur la machine clonée avec la reconnaissance de la carte réseau en raison de la copie à l'identique d'une règle udev.

Le plus simple est de supprimer celle-ci

rm /etc/udev/rules.d/70-persistent-net.rules

Redémarrer la machine.

Dans l'idéal, il faudrait modifier la règle afin de mettre la MAC adresse correcte...

dimanche, mars 17 2013

Création d'une VM VirtualBox en ligne de commande

Il existe une interface graphique pour VirtualBox afin de faciliter la création des VM. Toutefois procéder en ligne de commande, via la commande VBoxManage, n'est pas sans intérêt.

Dans l'exemple suivant, je vais installer une VM ( ADI01 ) aux caractéristiques suivantes :

  • OS : CentOS 6.4 32 bits
  • Disque Dur : 50Go
  • RAM : 2Go
  • 1 Carte réseau en mode pont ( bridge )

L'installation se fera via le CD-ROM ISO minimal.

Création de la VM

VBoxManage createvm --name ADI01 --ostype "RedHat" --register

Configuration mémoire

VBoxManage modifyvm ADI01 --memory 2048

Configuration réseau

VBoxManage modifyvm ADI01 --nic1 bridged
VBoxManage modifyvm ADI01 --bridgeadapter1 eth0

Création et attachement du disque dur

VBoxManage createhd --filename ADI01 --size 50000
VBoxManage storagectl ADI01 --name SATA1 --add sata
VBoxManage storageattach ADI01 --storagectl SATA1 --port 0 --device 0 --type hdd --medium ADI01.vdi

Attachement du CD-ROM d'installation

VBoxManage storagectl ADI01 --name IDE1 --add ide
VBoxManage storageattach ADI01 --storagectl IDE1 --port 0 --device 0 --type dvddrive --medium CentOS-6.4-i386-minimal.iso 

Démarrage de la VM ADI01

VBoxManage startvm ADI01

Suivre l'assistant pour l'installation de la VM. L'adaptation à toute distribution est simple.

vendredi, mars 15 2013

YUM et proxy

Télécharger des packages depuis l'Internet via yum en passant un proxy peut se résoudre de deux manières :

Editer le fichier /etc/yum.conf et ajjouter les lignes suivantes :

proxy_http=http://serveur_proxy:port
proxy_username=login_proxy
proxy_password=mot_de_passe

Utiliser la variable d'environnement http_proxy

http_proxy="http://login_proxy:mot_de_passe@serveur_proxy:port"
export http_proxy

lundi, février 18 2013

ADVM/ACFS et CentOS

Lors de l'installation du Grid 11gR2 sous CentOS 5.9 un message d'erreur apparaît lors du lancement du script root.sh.

ADVM/ACFS is not supported on centos-release

Ce billet montre la résolution pour une CentOS 5.9 en 32bits. Les sources Oracle sont la version GRID 11.2.0.1 également en 32bits. L'adaptation en 64bits ou à une autre version de noyau est simple.

CentOS n'est pas exactement une RedHat et changer /etc/redhat-release ne suffit pas ( la commande utilisée est rpm -qa | grep release ) , il faut modifier un des fichiers PERL de lancement du démon acfs. Ce fichier est /u01/app/11.2.0/grid/lib/osds_acfslib.pm

cd /u01/app/11.2.0/grid/lib
vi osds_acfslib.pm

Se positionner vers la ligne 280 et rajouter CentOS dans les versions valides

...
# OK, now check to see if we support this release
  $supported = 0;
  if (($release =~ /enterprise-release-5/) ||
         ($release =~ /redhat-release-5/) ||
         ($release =~ /centos-release-5/))
  {
...

Il faut ensuite installer les modules pour le noyau Linux. Dans un premier temps créer un répertoire pour ces modules ( adapter le chemin à la version du noyau de votre machine )

mkdir -p /lib/modules/2.6.18-348.1.1.el5/extra/usm

Puis y recopier les fichiers .ko souhaités, il est naturel que les versions noyau soient différentes. Il s'agit ici d'un CD Oracle 11.2.0.1 en 32 bits ( i386 ).

cp /u01/app/11.2.0/grid/install/usm/EL5/i386/2.6.18-8/2.6.18-8.el5-i686/bin/*.ko /lib/modules/2.6.18-348.1.1.el5/extra/usm

Lancer ensuite la commande de gestion des dépendances et le démon acfs

depmod
/u01/app/11.2.0/grid/bin/acfsload start -s

Cette manipulation est à faire sur tous les noeuds du cluster;

vendredi, janvier 25 2013

Ré-installer un serveur Oracle après sinistre

Toujours dans la logique de démystifier RMAN, je vous propose ici un cas simple et banal.

Votre base et serveur Oracle est détruit. Il ne vous reste que la sauvegarde RMAN. Bien entendu ce scénario implique une perte de données, celles n'étant pas sur la sauvegarde ! Si c'est inacceptable, il faut mettre autre chose en place.

On utilise ici une version 11g mais est adaptable en 10g sans problème. Les hypothèses de départ sont les suivantes :

  • La base de données se nomme RED
  • Les fichiers sous sous /u01, /u02 et /u03
  • La norme OFA est respectée
  • On utilise une Flash Recovery Area.

Dans un premier temps ré-installer le serveur Oracle ( OS + Binaires sans créer de base de données ) voir l'article sur le wiki pour plus de détails.

Créer la structure des répertoires :

mkdir -p /u01/app/oracle/admin/RED/pfile
mkdir -p /u01/app/oracle/oradata/RED
mkdir -p /u02/app/oracle/oradata/RED
mkdir -p /u03/app/oracle/oradata/RED
mkdir -p /u01/app/oracle/flash_recovery_area/RED

Recopier toute la sauvegarde RMAN sous /u01/app/oracle/flash_recovery_area/RED

Créer un initRED.ora provisoire sous /u01/app/oracle/admin/RED/pfile

Contenu de initRED.ora

db_name=RED
db_block_size=8192
db_recovery_file_dest_size=2G
db_recovery_file_dest=/u01/app/oracle/flash_recovery_area

Au niveau du shell

export ORACLE_SID=RED
sqlplus /nolog
SQL> connect / as sysdba
SQL> startup nomount pfile='/u01/app/oracle/admin/RED/pfile/initRED.ora';
SQL> exit

Se connecter à RMAN

rman target /
RMAN> restore spfile from autobackup;
RMAN> shutdown immediate;
RMAN> startup nomount;
RMAN> restore controlfile from autobackup;
RMAN> alter database mount;
RMAN> restore database;
RMAN> recover database;
RMAN> alter database open resetlogs;
RMAN> exit;

Se connecter normalement à RED.

CentOS 5.9 et services inutiles

J'aime n'installer que ce dont j'ai besoin sur un serveur. Aussi je procède toujours aux installations minimales. Je pars du principe : si je n'utilise pas, je n'active pas.

La version 5.9 de CentOS, sortie en janvier 2013, nous réserve de petites surprises si on procède comme avec la 5.8.

Pour installer un CentOS 5.8 il suffit de tout désélectionner, mais pas en 5.9, il faut tout désélectionner sauf "Base", sinon pas de yum et encore moins de ssh.
Le résultat c'est que pas mal de choses inutiles se retrouvent au démarrage, notamment nfs, iscsi et le pare-feu ainsi que d'autres petites choses sans intérêt pour un serveur.
Ci dessous donc les commandes de désactivation des services inutiles.

chkconfig --del nfslock 
chkconfig --del rpcgssd 
chkconfig --del rpcidmapd 
chkconfig --del portmap 
chkconfig --del nfs
chkconfig --del mcstrans
chkconfig --del haldaemon
chkconfig --del hidd
chkconfig --del autofs
chkconfig --del avahi-daemon
chkconfig --del xfs
chkconfig --del bluetooth
chkconfig --del pcscd
chkconfig --del ip6tables
chkconfig --del iptables
chkconfig --del iscsi
chkconfig --del iscsid

Redémarrer simplement le serveur ensuite. Le nombre de services au démarrage est beaucoup moins important.

jeudi, janvier 24 2013

Perte du mot de passe du root mysql

Je ne fais pas souvent de billet sur MySQL, il est vrai que le SGBD est assez simple d'utilisation toutefois il semble qu'il y ai une pénurie de spécialistes sur le sujet. Ici je vais décrire comment ré-initialiser le mot de passe du root en cas de perte de celui-ci.

Le billet se base sur une Debian, mais adaptable sans problème sur toute distribution.

Dans un premier temps, stopper MySQL

/etc/init.d/mysql stop

Redémarrer le démon MySQL en tache de fond et passer outre l'identification. Pour des raisons de sécurité désactiver aussi l'écoute du réseau :

mysqld --skip-grant-tables --skip-networking &

Se connecter en root sur MySQL, il n'y a plus de mot de passe, il suffit donc de faire Entrée au prompt demandant le mot de passe.

mysql -u root -p

Au prompt MySQL réinitialiser le mot de passe, j'utilise ici motdepasse via la fonction password qui le crypte.

mysql> use mysql;
mysql> update user set password=password('motdepasse') where user="root";
mysql> flush privileges;
mysql> exit;

Très important ne pas oublier flush privileges, sinon ça ne marche pas !

Redémarrer MySQL normalement.

/etc/init.d/mysql restart

Rien de plus à faire.

vendredi, janvier 11 2013

Démystifier RMAN

Introduction

Un titre un peu accrocheur pour ce blllet. Je suis toujours surpris quand je donne un cours Oracle de rencontrer beaucoup de stagiaires utilisant import/export pour effectuer les sauvegardes Oracle. Ils ont certes entendu parler de RMAN, mais le produit semble faire "peur".

Ce billet présente une sauvegarde à froid et une restauration avec RMAN.

Sauvegarde à froid

Oracle emploi le mot de sauvegarde cohérente. La base doit donc être stoppée afin que tous les fichiers soit au même niveau de transaction, c'est à dire que toutes les informations sont bien écrites dans les fichiers de données. Les fichiers sont donc en cohérence les uns avec les autres.

Sauvegarder une base avec RMAN à froid est simple surtout si un Flash Recovery Area est en place. Voici les commandes à passer

export ORACLE_SID=YODA
rman target /
RMAN> shutdown immediate;
RMAN> startup mount;
RMAN> backup database;
RMAN> alter database open;
RMAN> exit;

On peut difficilement faire plus simple...

La base doit être stopée et redémarrée en mode MOUNT car les informations de sauvegarde sont stockées dans le fichier de contrôle. La commande backup database sauvegarde l'ensemble des fichiers, en fin de sauvegarde la base est ouverte pour exploitation.

Restauration

"Sauvegarder à rien ne sert, si restaurer ne peut ce faire". Dans l'exemple suivant nous allons supposer que tous les fichiers de données sont perdus.

Voici les commandes à passer :

export ORACLE_SID=YODA
rman target /
RMAN> startup mount;
RMAN> restore database;
RMAN> recover database;
RMAN> alter database open resetlogs;
RMAN> exit;

Conclusion

RMAN est un produit très complet, de plus il est livré avec toute licence Oracle Database, y compris la version XE gratuite. Son utilisation demande de l'apprentissage, il existe chez Orsys ( oui je fais un peu de pub pour un client... ) un cours de 3 jours sur ce sujet.

Ce billet ne fait d'effleurer RMAN, mettre en place juste la sauvegarde est une bonne précotion. Et si vous n'arrivez pas à restaurer, nous les DBA nous saurons !!!

jeudi, novembre 1 2012

Logiciels obsolètes

Le CERTA a diffusé en juin 2012 une note sur l'obsoléscence de certains logiciels, en particulier les OS Linux et Oracle Voir le lien suivant

Oracle annonce la fin de maintenance pour les versions de bases de données inférieures à 11.1.

La version 10G largement diffusée, ne sera plus maintenue à partir de juillet 2013. Le lien suivant permet de connaitre la position de Oracle sur ses produits

versions_oracle.png

jeudi, octobre 18 2012

Connaître le schéma sur lequel on travaille avec oracle

La commande set alter session current_schema permet de passer d'un schéma à un autre simplement.

La requête suivante permet de connaître sous quel user on est identifié et sous quel schéma on travaille.

select sys_context('USERENV','SESSION_USER') current_user, sys_context('USERENV','SESSION_SCHEMA') current_schema from dual;

mercredi, octobre 3 2012

Fonction de calcul du dimanche de Pâques en PL/SQL

Bien que n'étant pas vraiment programmeur, il m'arrive de donner des formations sur PL/SQL. Afin de faire souffrir mes stagiaires, je leur demande d'écrire une fonction calculant le jour de Pâques.

Pâques est une fête mobile qui permet de calculer d'autres jours fériés

  • Lundi de Pâques, le lendemain.
  • L'ascension, 40 jours après Pâques,
  • La Pentecôte, 50 jours après Paques
  • Le lundi de Pentecôte, lendemain du précédent.

La fonction suivante est exacte pour les années 1955 à 2048.

Pour rédiger ce billet, j'ai pris un des algorythmes sur la page suivante Calcul de Pâques - Wikipédia

create or replace function calc_paques( annee in number ) return date is
a number;b number;c number;d number;e number;de number;
paques date;
begin
a := mod( annee,19 );b := mod( annee,4 );c := mod( annee,7 );
d := mod(( (19 * a) + 24 ),30 );
e := mod(( (2 * b) + (4 * c) + (6 * d) + 5 ), 7);
de := d + e;
if de > 9 then
select to_date( to_char( de - 9 ) ||'/04/' || to_char( annee ), 'DD/MM/YYYY') into paques from dual;
else
select to_date( to_char( 22 + de ) ||'/03/' || to_char( annee ), 'DD/MM/YYYY') into paques from dual;
end if;
if paques > to_date( '25/04/' || to_char( annee ), 'DD/MM/YYYY') then
paques := paques - 7;
end if;
return paques;
end;
/

Son utilisation sous SQL*Plus reste basique

select calc_paques( to_number(to_char(sysdate,'YYYY'))) from dual;

Fonction à intégrer dans un package de gestion des dates bien pratique aux DRH et autres logiciels de logistique...

jeudi, septembre 6 2012

Ajouter des cartes réseau à une VM sous XEN

Par défaut une VM sous XEN est configurée avec une carte réseau. Il est très facile d'en rajouter. Ce billet montre le rajout à chaud et aussi de manière définitive.

Pour visualiser les cartes réseau d'une VM

xm network-list vm01

Résultat

Idx BE     MAC Addr.     handle state evt-ch tx-/rx-ring-ref BE-path
0   0  00:16:3e:40:45:49    0     4      8     768  /769     /local/domain/0/backend/vif/32/0 

Ajouter une carte réseau

xm network-attach vm01 bridge=xenbr0 script=vif-bridge

Résultat

xm network-list vm01
Idx BE     MAC Addr.     handle state evt-ch tx-/rx-ring-ref BE-path
0   0  00:16:3e:40:45:49    0     4      8     768  /769     /local/domain/0/backend/vif/32/0  
2   0  00:16:3e:03:46:f9    2     4      9     1281 /1280    /local/domain/0/backend/vif/32/2

Retirer une carte réseau, on utilise le champ Idx de la commande précente, par exemple 2.

xm network-detach vm01 2
xm network-list vm01

Résultat

Idx BE     MAC Addr.     handle state evt-ch tx-/rx-ring-ref BE-path
0   0  00:16:3e:40:45:49    0     4      8     768  /769     /local/domain/0/backend/vif/32/0

Pour rendre la configuration permanente, éditer le fichier de configuration de la VM sous /etc/xen

name = "vm01"
uuid = "cedf4879-53b8-77cc-114a-5c0f5c0e5fe5"
maxmem = 256
memory = 256
vcpus = 1
bootloader = "/usr/bin/pygrub"
on_poweroff = "destroy"
on_reboot = "restart"
on_crash = "restart"
disk = [ "tap:aio:/home/disks/vm011.img,xvda,w", "tap:aio:/home/disks/vm012.img,xvdb,w" ]
vif = [ "mac=00:16:3e:40:45:49,bridge=xenbr0,script=vif-bridge", "mac=00:16:3e:03:46:f9,bridge=xenbr0,script=vif-bridge" ]

Il suffit de rajouter les informations dans la section vif, attention à bien définir une adresse MAC différente. A titre personnel, je connecte à chaud une carte réseau et je relève l'adresse MAC générée pour l'incorporer dans la configuration.

mardi, septembre 4 2012

Création rapide de VM avec CentOS

Quand on commence à savoir créer des VM avec XEN, on souhaite que ceci aille le plus vite possible. Dans le cadre de mes activités de formation, je dois pour un TP cluster déployer 5 VM sur un serveur CentOS 5.8. L'objectif de ce billet est de présenter un script faisant tout seul le travail et en profiter pour faire autre chose.

Principe

Pour que la méthode soit efficace, le mieux est de disposer d'un mirroir de la distribution ou encore de monter l'image du DVD. Dans cet exemple je vais supposer qu'il existe sur le réseau un mirroir de la distribution. Mettre en place un mirroir CentOS est simple, c'est juste long la première fois en téléchargement Voir le billet suivant.

Les VM seront créées en 5.8 et 32 bits. Le mirroir CentOS sera donc accessible sur le réseau par l'URL suivante : http://192.168.1.100/centos/5/os/i386

Un second serveur apache sera monté sur la machine supportant les VM afin de mettre à disposition les fichiers kickstart qui permettent l'installation automatique de CentOS. Le serveur des VM, donc supportant le Dom0 portera l'adresse IP : 192.168.1.101 et portera le nom de srv1.formation.fr

Installer un serveur apache sur CentOS est simple :

yum -y install httpd
service httpd start
chkconfig httpd on

A faire sur le serveur supportant les VM Les 5 VM porterons des IP suivantes :

  • vm01 : 192.168.1.201
  • vm02 : 192.168.1.202
  • vm03 : 192.168.1.203
  • vm04 : 192.168.1.204
  • vm05 : 192.168.1.205

La commande virt-install sera utilisée, une des options de cette commande permet de donner l'emplacement d'un fichier kickstart. L'essentiel du script est donc la création de ce kickstart puis l'appel de la commande virt-install pour créer la VM.

La mise au point d'un kickstart est simple, certains font une instalaltion manulle de CentOS avec la configuration ad hoc et utilise le fichier /root/anaconda-ks.cfg qui est généré lors de l'installation comme base de travail.

Chaque VM sera créée avec 2 disques durs de 10Go, 1 carte réseau et 256Mo de RAM. Le premier disque dur sera partitionné, le second sera laissé vierge pour un usage futur.

Le script accepte 2 paramètres :

  • L'adresse IP
  • Le nom DNS ou fqdn, la première partie de ce nom sera attribué au nom d'hôte ( hostname ).

Il est possible de définir les IP codées en dur via des variables et aussi de faire des tests sur des paramètres.

Le script createVM.sh

#!/bin/sh

IP=$1
NOM_DNS=$2
VM=$(echo $(echo $NOM_DNS | cut -d '.' -f1))


echo "La VM portera le nom : $VM et aura pour nom DNS : $NOM_DNS et pour IP : $IP"

# On supprime ici toute configuration antérieure de la VM
rm -f /etc/xen/$VM

# On génère ainsi un kickstart personnalisé pour la VM
# L'adaptation est simple, il suffit de remplacer les IP par les valeurs que l'on souhaite.
cat <<EOF > /var/www/html/${VM}-ks.cfg

install
url --url http://192.168.1.100/centos/5/os/i386
lang fr_FR.UTF-8
keyboard fr-latin9
text

# nameserver donne l'IP du DNS, ici celui de Orange.
network --device eth0 --bootproto static --ip $IP  --netmask 255.255.255.0 --gateway 192.168.1.1 --nameserver 80.10.246.2 --hostname $VM

# Le mot de passe du root est azerty.
rootpw azerty

firewall --disabled
authconfig --enableshadow --enablemd5
selinux --disabled
timezone --utc Europe/Paris
# Le bootloader sera sur le premier disue dur
bootloader --location=mbr --driveorder=xvda
# En fin d'installation la machine est rebootée.
reboot
#Toute partition présente éventuellment est supprimée sur les deux disques durs ( xvda et xvdb )
clearpart --all --initlabel --drives=xvda,xvdb
part /boot --fstype ext2 --size=100 --asprimary --ondisk=xvda
part / --fstype ext3 --size=500 --asprimary --ondisk=xvda
part swap --size=512 --asprimary --ondisk=xvda
part /usr --fstype ext3 --size=2000 --ondisk=xvda
part /var --fstype ext3 --size=1000 --ondisk=xvda
part /tmp --fstype ext3 --size=500 --ondisk=xvda
part /home --fstype ext3 --size=1 --grow --ondisk=xvda
# Liste des package à installer, les deux lignes suivantes installe le minimum.
%packages --excludedocs --nobase
@core
# Ici il est possible de mettre tout ce que l'on souhaite installer en plus, a titre personnel j'installe en plus vim, wget et le protocole ntp
vim-enhanced
wget
ntp

# A partir d'ici il est possible de définir autant de scripts que l'on souhaite pour affiner la configuration
%post
# Dans un premier temps, dire aux VM que le dépôt est local
echo "[local]" > /etc/yum.repos.d/CentOS-Base.repo
echo "name=local" >> /etc/yum.repos.d/CentOS-Base.repo
echo "baseurl=http://192.168.3.100/centos/5/os/i386" >> /etc/yum.repos.d/CentOS-Base.repo
echo "enabled=1" >> /etc/yum.repos.d/CentOS-Base.repo
echo "gpgcheck=0" >> /etc/yum.repos.d/CentOS-Base.repo
echo " " >> /etc/yum.repos.d/CentOS-Base.repo
echo "[local-updates]" >> /etc/yum.repos.d/CentOS-Base.repo
echo "name=local-updates" >> /etc/yum.repos.d/CentOS-Base.repo
echo "baseurl=http://192.168.3.100/centos/5/updates/i386" >> /etc/yum.repos.d/CentOS-Base.repo
echo "enabled=1" >> /etc/yum.repos.d/CentOS-Base.repo
echo "gpgcheck=0" >> /etc/yum.repos.d/CentOS-Base.repo
echo " " >> /etc/yum.repos.d/CentOS-Base.repo
echo "[local-extras]" >> /etc/yum.repos.d/CentOS-Base.repo
echo "name=local-extras" >> /etc/yum.repos.d/CentOS-Base.repo
echo "baseurl=http://192.168.3.100/centos/5/extras/i386" >> /etc/yum.repos.d/CentOS-Base.repo
echo "enabled=1" >> /etc/yum.repos.d/CentOS-Base.repo
echo "gpgcheck=0" >> /etc/yum.repos.d/CentOS-Base.repo
# Les mises à jour sont appliquées de suite
yum -y update

# Par défaut les démons iscsi sont actifs, les désactiver sauf besoin bien sur.
chkconfig --del iscsi
chkconfig --del iscsid

# Configuration de la synchro horaire
chkconfig ntpd on
ntpdate fr.pool.ntp.org
service ntpd start

# La sécurité SELINUX ne résoud que les problèmes qu'elle génère ( opinion personnelle ), surtout sur une VM donc disabled.
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0

# Change le nom fqdn en nom d'hôte
sed -i 's/${NOM_DNS}/${VM}/g' /etc/sysconfig/network

# Création propre d'un /etc/hosts
echo "127.0.0.7 localhost" > /etc/hosts
echo '$IP $NOM_DNS $VM' >> /etc/hosts
%end
EOF
# A ce stade le fichier kickstart est disponible sous le répertoire /var/www/html et porte un nom type vm01-ks.cfg

# La commande virt-install complète
virt-install --name $VM -p -r 256 --disk path=/home/disks/${VM}1.img,size=10,sparse=false --disk path=/home/disks/${VM}2.img,size=10,sparse=false --location http://192.168.3.100/centos/5/os/i386 -x "cmdline ks=http://192.168.3.11/${VM}-ks.cfg ip=$IP netmask=255.255.255.0 gateway=192.168.3.1 dns=80.10.246.2 hostname=${VM}" --noautoconsole

L'option sparse=false de --disk permet de créé de suite le fichier, c'est ( vraiment ) plus long mais plus efficace après.

Rendre le script executable

chmod u+x createVM.sh

Pour créer 5 VM il suffit d'une boucle qui peut faire l'objet d'un script aussi, par exemple vm.sh

#!/bin/sh
for i in $(seq 1 5)
do
  /root/createVM.sh 192.168.1.20${i} vm0${i}.srv1.formation.fr
done

Le rendre exécutable et lancer la création des 5 VM

chmod u+x vm.sh
/root/vm.sh

Et ensuite ? C'est de l'utilisation de XEN simplement, donc une autre histoire...

lundi, août 13 2012

Graver une image ISO en ligne de commande

Période estivalle oblige, billet succint et sans prétention. L'exemple présenté ici s'appuie sur Ubuntu mais est transposable dans toute distribution.

Prérequis

Disposer du package wodim qui permet de tout faire et qui anciennement se nommait cdrecord.

sudo aptitude install wodim

Trouver le device du graveur

La commande est simple :

wodim --devices

wodim: Overview of accessible drives (1 found) :
-------------------------------------------------
 0  dev='/dev/scd0'	rwrw-- : 'hp' 'CDDVDW TS-H653T'
-------------------------------------------------

Le graveur est donc /dev/scd0

Gravure

Ici aussi la commande est simple

wodim -v speed=1 dev=/dev/scd0 -eject image.iso

L'option -v ( verbose ) explique à l'écran ce qui se passe. La clause speed=1 permet de graver à la vitesse maximale. La clause eject permet d'ejecter le CD en fin de gravure.

Pour rédiger ce billet, je me suis inspiré du lien suivant

jeudi, août 2 2012

Apache et fichier favicon.ico

En regardant le fichier des erreurs Apache, le message suivant apparait souvent :

File does not exist: /var/www/favicon.ico

Il existe deux solutions

  • soit créer avec un logiciel de dessin ce fichier,
  • soit ne pas tracer l'erreur.

Ce billet présente cette seconde solution.

Ajouter dans chaque définition de VirtualHost les lignes suivantes :

Redirect 404 /favicon.ico
<Location /favicon.ico>
 ErrorDocument 404 "No favicon"
</Location>

Pour appliquer ce principe à tous les sites hébergés et ne pas modifier chaque VirtualHost, créer sous /etc/apache2/conf.d/ un fichier nommé nofavicon.conf et contenant les lignes ci-dessus.

Ne pas oublier de recharger la configuration de Apache pour prise en compte.

vendredi, juillet 6 2012

Export avec exp et tables vides en Oracle 11gR2.

Bien que déprécié l'utilitaire exp est toujours très utilisé. Il existe un "bug" en version 11gR2 relatif aux tables vides qui ne sont pas exportées.

Attention ce phénomène ne se produit pas en 11.2.0.3 qui est la release actuelle au moment de la rédaction de ce billet.

Pour éviter ce désagrément, il faut positionner le paramètre Oracle DEFERRED_SEGMENT_CREATION à FALSE.

alter system set deferred_segment_creation=false scope=both;

Utiliser, selon les recommendations de Oracle, datapump pour les exports ne produit pas de dysfonctionnement.

jeudi, juin 28 2012

Heartbeat et CentOS

Il existe un billet sur ce blog concernant la mise en place de Heartbeat sous Debian. J'ai du récemment procéder à une installation de ce type mais sous CentOS 5.8. Il existe de petites différences signalées ici.

Il faut dans un premier temps activer le depôt extras,surtout si on veut en plus utiliser DRBD.

Il faut de plus vérifier l'installation de which qui n'est pas toujours faite, surtout si comme moi vous faites des installations minimales.

yum -y install heartbeat which

J'ai de plus constaté qu'il faut réinstaller deux fois heartbeat par la commande yum, car la première ne fonctionne pas ( bug ? )

Il faut aussi configurer correctement iptables si on utilise UDP port 694 ( valeur par défaut ) pour le "beat". Le plus simple est de désactiver iptables. A titre personnel je n'ai jamais compris pourquoi le pare-feu est systématiquement activé en CentOS 5, ce qui n'est plus le cas en CentOS 6...

chkconfig --del iptables
service iptables stop

Très important mettre selinux à disable en modifiant le fichier /etc/selinux/config. La commande ci-dessous utilise sed, mais on peut utiliser vi aussi ;-)

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0

Se reporter au billet sous Debian cité plus haut pour plus de détail. Heartbeat est un produit certes ancien mais qui fonctionne parfaitement dans une configuration cluster à deux noeuds type actif/passif. De plus sa configuration est simple.

- page 1 de 8