Thématiques principales

Affichage des articles dont le libellé est linux. Afficher tous les articles
Affichage des articles dont le libellé est linux. Afficher tous les articles

mercredi 22 avril 2020

Maintenance Raid

On avait vu comment monter des disques en Raid [raid]. Mais je n'avais pas évoqué la question de comment reprendre un disque défaillant.

Data pas de panique, un disque peu très bien avoir eut un soucis de connexion et le raid l'a détecté et l'a donc placer en erreur.

Identification


Pour savoir si un disque est ko, il faut utiliser l'utilitaire mdadm:

1
$ mdadm --detail /dev/md0

Le récapitulatif qui vous sera fourni vous donnera alors l’état des disques faisant parti du Raid.

En suite une fois identifié le problème, et dans la mesure ou le disque est recupérable alors il faudra identifier le disque en question pour ensuite le réintroduire dans le raid.

Pour cela un simple!:

1
$ fdisk -l

Réparation 


Puis pour réintroduire le disque:

1
$ mdadm --manage /dev/md0 --add /dev/sdd1

(Si c'est le disque sdd1 qui était initialement dans le raid)

Alors le disque va etre resynchroniser (car peut être qu'il n'a pas ete mise a jour des dernieres infos.

Pour voir l’état de la resynhro, il suffit d'observer le fichier mdstat avec

1
$ watch cat /proc/mdstat

Et la vous aurez votre raid de nouveau opérationnel.

Références:


[raid] https://un-est-tout-et-tout-est-un.blogspot.com/2020/03/montage-raid.html
[mdadm] https://doc.ubuntu-fr.org/raid_logiciel

lundi 30 mars 2020

Montage Raid

Introduction

Aujourd'hui un article court! et qui va aussi me servir d'aide mémoire: RAID!

Besoin

RAID? Oui RAID [ubuntu-raid], pas le produit anti mouche, mais la solution de résilience du stockage! Attention, ici on ne parle pas de base de données mais d'une solution permettant de gérer la sauvegarde de données en terme de disponibilité et d’intégrité en cas de panne! Il s'agit en fait d'une technique de gestion des données au niveau le plus bas possible, entre autre, au niveau des disques!

Solutions

Ainsi Il va exister différents niveaux RAID, assurant différents types de gestions des disques, allant de RAID 0 a RAID 10:
  • RAID 0: il ne s'agit pas d'une configuration permettant d'assurer de la sauvegarde mais de pouvoir tirer le maximum des performances des disques (en distribuant les données). Cette config nécessite au moins 2 disques.
  • RAID 1: avec deux disques au moins, cette configuration permet de dupliquer a l'identique les informations sur les disques comme s'il n'y en avait qu'un. Ainsi en cas de panne, la redondance permet de garantir les données. Coté performance, vous permettrez d’améliorer le nombre d’accès disque parallèle au meilleur taux de transfert (limité a la vitesse d’accès disque classique)
  • RAID 5: le RAID 5 est une combinaison du RAID 0 et du RAID 1 et nécessite 3 disques au minimum permettant d’améliorer les perf et de se garantir de la perte d'un disque. au delà les données seront perdu.
  • RAID 6: le RAID 6, c'est du RAID 5 mais avec une gestion permettant la perte acceptable de deux disques avant la perte irrémédiable de données. Cela nécessite donc 4 disques...
  • RAID 10: Avec 4 disques, ce mode est une combinaison matricielle du RAID 1 sur n disque et du RAID 0 sur m cluster des disques RAID 1. Le RAID 1 a pour but de garantir l’intégrité des données alors que le RAID 0 se veut optimiser les performances.

Exemple


Le cas du RAID 1

Identification des disques


1
fdisk -l

Creation du RAID 1


1
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1


Formatage du disque


1
mkfs.ext4 /dev/md0

Montage du disque

Ajouter au fichier /etc/fstab la ligne suivante
/dev/md0 /mnt/raid ext4 defaults 0 1
Pour ensuite monter le disque


1
mount -a

References

[ubuntu-raid] https://doc.ubuntu-fr.org/raid_logiciel

vendredi 29 décembre 2017

Construire un paquet Debian


Dans l’article précédent, nous avions vu comment préparer un dépôt debian viable de façon a faire des installation et des déploiements sur une plateforme debian [3].

Nous allons nous intéresser dans ce présent article sur comment alimenter notre dépôt et donc comment nous allons procéder pour construire un paquet debian.

Structure du paquet debian

Un paquet debian [4] n’est initialement qu’un tar.gz dont l'extension est .deb, construit à l’aide de la commande dpkg-deb (il existe d’autre approche comme jdeb [5]) qui sera déployé à la racine /. Cela signifie qu’il sera nécessaire lors de la conception du paquet de reproduire l’arborescence cible si l’on souhaite déployer des fichiers dans des répertoires précis du système.

Ainsi par exemple si l’on souhaite construire un paquet permettant de déployer un binaire dans le système, on créera un répertoire du nom du paquet dans lequel on trouvera le chemin /usr/bin/monBinaire:
/home/moi/monPaquet/usr/bin/monBinaire
Ainsi quand l’on construira le paquet, celui ci déposera monBinaire dans /usr/bin.

Cette démarche est valable pour tout fichier déposé statiquement dans le système. A noter que lors de cette étape, dpkg, le composant procédant à l’installation, fait le listing des fichiers déposés et défini le paquet (et ses éventuelles versions futur) comme responsable du cycle de vie du fichier dans le système. Ceci a pour intérêt de détecter lors de l’installation d'éventuels conflit entre paquet qui seront à traiter par des primitives particulières quand cela est possible [2] (ce ne sera pas le cas dans cet article). Pour que dpkg puisse clairement identifier le paquet, celui ci doit obligatoirement contenir un fichier de control contenant toutes les informations sur l’identité, la version, l’utilisation du paquet. Vous verrons plus loin dans l’article ou le déposer et comment le construire

Par contre si nous avons ici un moyen simple et efficace pour déployer des fichiers, nous n’avons rien pour dynamiquement configurer l’installation en fonction du système courant.
En effet, souvent, lors de l’installation, il est nécessaire de prendre en considération au mieux des besoins et de l’environnement en initialisant des fichiers de conf selon les autres applications présentes, le contexte réseau éventuel ou même des préférences utilisateurs.

La première approche est alors d’apporter statiquement des configurations par défaut et de les modifier après l’installation. Cette approche fonctionne si et seulement si l'application ne nécessite pas une synchronisation particulière avec d’autres applications du système qui nécessite un redémarrage (par exemple la prise en compte d’un plugin par une application amené par deux paquets différents qu’il faut nécessairement redémarrer)

Les fichiers du responsable


Pour répondre à ce problème spécifique, en plus du fichier de control (obligatoire) et il est possible de définir des fichiers du responsable (postinst, preinst, postrm et prerm). Ces fichiers sont à placer dans un répertoire DEBIAN de notre paquet. Notre paquet devient alors:
(/home/moi) ./monPaquet/usr/bin/monBinaire(/home/moi) ./monPaquet/DEBIAN/control (obligatoire)(/home/moi) ./monPaquet/DEBIAN/postinst (optionnel)(/home/moi) ./monPaquet/DEBIAN/preinst (optionnel)(/home/moi) ./monPaquet/DEBIAN/postrm (optionnel)(/home/moi) ./monPaquet/DEBIAN/prerm (optionnel)
Ces fichiers sont alors exécuter automatiquement par l’outil dpkg [6] pendant l’installation ou la suppression.

Par exemple la phase d’installation exécute les phases suivantes:



De la même façon la suppression d’un paquet exécute les fichiers du responsables comme suit:



Enfin leur combinaison permet d’obtenir le comportement que l’on aura lors d’une mise à jour:



A noter que les scripts peuvent être des simples fichiers qui s'exécutent indifféremment du contexte (pas de la phase) mais qu’il est possible de leur attribuer des spécificités selon que l’on fait justement par exemple une installation ou une mise a jour. Pour cela il est conseillé de s’appuyer sur un squelette de script par défaut ou skeleton [7] (que je ne détaillerai pas ici).

Le fichier de control

Voila maintenant que l’on a construit la structure du deb, il reste finaliser le debian en définissant dans le détail le fichier de control.

Le fichier de control est comme dit sommairement au début de cet article, la pièce d’identitée du paquet debian a construire.

Il se constitue des champs suivant [8] (directement extrait de la documentation):
Package: hello
Version: 2.9-2+deb8u1
Architecture: amd64
Maintainer: Santiago Vila <sanvila@debian.org>
Depends: libc6 (>= 2.14)
Conflicts: hello-traditional
Breaks: hello-debhelper (<< 2.9)
Replaces: hello-debhelper (<< 2.9), hello-traditional
Section: devel
Priority: optional
Homepage: http://www.gnu.org/software/hello/
Description: example package based on GNU hello
      The GNU hello program produces a familiar, friendly greeting.  It
      allows non-programmers to use a classic computer science tool which
      would otherwise be unavailable to them.
      .
      Seriously, though: this is an example of how to do a Debian package.
      It is the Debian version of the GNU Project's `hello world' program
      (which is itself an example for the GNU Project).
  • Le champ « Package » contient le nom du paquet. C'est le nom par lequel les outils de gestion de paquets peuvent le manipuler. Il est habituellement similaire mais pas nécessairement le même que la première chaîne composant le nom de l'archive Debian.
  • Le champ de « Version » donne le numéro de version du composant.
  • Le champ « Architecture » indique pour quel processeur ce binaire particulier a été compilé.
  • Le champ « Depends » donne une liste des paquets qui doivent être installés afin d'installer ce paquet avec succès.
  • La ligne « Section » indique la section où le paquet Debian est conservé sur les sites FTP de Debian.
  • Le champ « Maintainer » contient l'adresse électronique de la personne actuellement responsable de la maintenance du paquet.
  • Le champ « Description » fournit un bref résumé des fonctionnalités du paquet.

Bien sur tous ces champs suivant une nomenclature et de standards pour permettre de normaliser l’utilisation des paquets. Entre autre par exemple il est important de respecter certaines règles d'écriture du numéro de version afin de permettre des mises à jours conforme a l’attendu (voir les schémas du chapitre des fichiers du responsable sur les phases du cycle de vie d’installation, désinstallation et de mise à jour des paquets).

Chaque champs peut avoir son importance même s’ils ne sont pas obligatoire. Il convient donc de bien les étudier afin de prévenir ou de gérer les conflits entre paquets.

Construction du paquet debian

Pour finir cet article, il fait maintenant finaliser le packaging en construisant le .deb. Pour cela il suffit d’appeler la commande dpkg-deb:
dpkg-deb --build $REPERTOIRE_DEBIAN $REPO_DEBIAN/
avec REPERTOIRE_DEBIAN contenant le chemin du debian a packager et REPO_DEBIAN le répertoire de destination ou mettre le deb final (on privilégiera directement le dépôt debian)

Voila le paquet est construit et déposé dans un dépôt, il ne reste qu'à l’installer après une mise a jour du dépôt et un apt-get coté client.

Références

[1] http://blog.valouille.fr/2013/10/creer-un-paquet-debian-vide/
[2] https://www.debian.org/doc/manuals/debian-handbook/sect.package-meta-information.fr.html
[3] https://www.debian.org/doc/manuals/debian-faq/index.fr.html#contents
[4] https://www.debian.org/doc/manuals/debian-faq/ch-pkg_basics.fr.html
[5] http://tcurdt.github.io/jdeb/
[6] https://www.debian.org/doc/debian-policy/#maintainer-script-flowcharts
[7] https://lists.debian.org/debian-mentors/1998/04/msg00004.html
[8] https://www.debian.org/doc/manuals/debian-faq/ch-pkg_basics.fr.html#s-controlfile

mardi 26 décembre 2017

Faire un dépôt debian

Un dépôt debian est un répertoire distant dans lequel se trouve des paquets debian [2] . Ces paquets sont accessible via les commandes apt [1] du système debian et la conjonction des deux mécanismes (apt+dépôts) permet l’installation et la maintenance des applications présent dans le système

Procédure d’installation debian

Lors de l’installation d’un paquet, on appellera la commande
apt-get install tee
La composant apt va télécharger depuis le dépôt via ftp ou http l’outil tee et le depackagera dans le système (pour les plus curieux sur la structure du paquet debian et son processus de déploiement : [4] mais je rédigerai un article à cet effet ).

L’installation n’est possible que si apt ne connait le contenu du dépôts. Pour cela, il est nécessaire de mettre à jour le référentiel connu de apt du dépôt distant en téléchargeant le package spécial : Packages.gz qui liste les paquets présent dans le dépôt. Il reste a appliquer la commande suivant:
apt-get update
Il manque encore une information importante: La localisation du dépôt qu’il est nécessaire de renseigner dans le fichier de configuration sources.list d'Apt (dans le répertoire /etc/apt)

Cependant pour renseigner ce fichier, il nous faut connaître la structure du dépôt et comment celui-ci se construit.

Structure d’un dépôt

Un dépôt debian n’est qu’un répertoire contenant des paquets debian. Ce répertoire va contraindre le nommage du dépôt. Pour que le dépôt soit viable, il doit contenir au moins un fichier Packages.gz cité plus haut dans un répertoire bien spécifique [6] . Ce répertoire est accessible via un chemin contenu dans le dépôt commençant par “dists” qui va spécifier divers informations facilitant le classement des paquets. Par exemple, il va être possible de distinguer les paquets propre à des architecture cibles différentes et des paquets pour les architectures  amd64, armhf, i386, etc.

Ce qui importe c’est d’avoir conscience que le chemin menant aux différents Packages.gz, va conditionner la façon dont on va référencer le dépôt coté client dans le sources.list.

Le fichier sources.list suit la syntaxe suivante [6] :
deb uri distribution [component1] [component2] [...]
  • la primitive deb spécifié qu’il s’agit d’un dépôt debian
  • uri est le chemin local ou réseau pour accéder au dépôt (généralement il est positionné derrière un serveur http apache)
  • distribution est le système cible mais celui ci est généralement le premier sous répertoire du chemin commençant par dists.
  • component* est un ensemble de sous répertoires au chemin suivant la distribution et avant le répertoire spécifiant l’architecture. Ils facilitent le classement des paquets selon leur utilisation (paquet de test, de sources, gratuit ou non, etc.)

Enfin le chemin se termine sur un répertoire spécifiant au moins une architecture.

Exemple si on considère un serveur apache exposant le chemin suivant:
(/var/www) ./debian/dists/maDistrib/all/binary-amd64/Packages.gz
Il faut spécifier dans le sources.list du client apt:
deb http://ipServer/debian maDistrib all 

Initialisation du dépôt

Maintenant que l’on a un dépôt debian, ou mettre nos paquets et comment procéder à son initialisation?

Dans la pratique les paquets debian produits sont déposés à la racine du paquet ou dans des sous répertoires de classement. Ces paquets sont ensuite indexés lors que la construction du Packages.gz a l’aide de la commande scanpackage [3].
cd $DEB_DIR; dpkg-scanpackages . /dev/null | gzip -9c > $DEB_DIR/dists/maDistrib/all/binary-amd64/Packages.gz
Voila les paquets sont accessibles il reste a mettre a jour le client (apt-get update) puis faire soit une installation ou une mise a jours (apt-get upgrade)

Nous intéresserons dans un autre article a la structure d'un paquet debian, a son cycle de vie et comment le produire.

References

[1] https://www.debian.org/doc/manuals/debian-faq/ch-pkgtools.fr.html#s-pkgprogs
[2] https://www.debian.org/doc/manuals/debian-faq/index.fr.html#contents
[3] https://wiki.debian.org/DebianRepository/Setup?action=show&redirect=HowToSetupADebianRepository
[4] Base sur le paquet bebian https://www.debian.org/doc/manuals/debian-faq/ch-pkg_basics.fr.html
[5] https://wiki.debian.org/DebianRepository/
[6] https://wiki.debian.org/DebianRepository/Format

jeudi 28 septembre 2017

Postgres : commandes de base

Postgres est un système de gestion de base de données relationnelle et objet. Il permet la sauvegarde et l'exploitation de données métiers et/ou applicatives. C'est un produit libre sous licence BSD. 

Il supporte une grande partie du standard SQL et offres des nombreuses autres fonctionnalités telles que la capacité de réplication, la répartition de charge, le contrôle de version concurrentes, intégrité transactionnelle, les triggers, etc... Pour plus d’informations je vous invite a consulter sa documentation.

Enfin de part sa licence libre qui facilite sa démocratisation, s'il n'y a qu'un seul SGBDR a connaitre, c'est probablement celui-ci.

Connexion au shell psql

1
$ sudo -u postgres psql 

Creation d'un utilisateur pour l'etablissement d'une connexion vers une futur base de données

1
2
3
4
5
6
7
$ sudo -i -u postgres
$ createuser -P --interactive nom_utilisateur
Enter password for new role:
Enter it again:
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) y

Suppression d'un utilisateur

1
2
$ sudo -i -u postgres
$ dropuser -U postgres nom_utilisateur

Creation/suppression d'une base de données associée a un utilisateur

1
2
3
$ sudo -i -u postgres
$ createdb -O nom_utilisateur -E UTF8 nom_de_la_db
$ dropdb -U nom_utilisateur nom_de_la_db

Execution d'une requette sur une base de données sur le compte de son l'utilisateur

1
$ sudo -u postgres psql -U nom_utilisateur nom_de_la_db -c requette

Sauvegarde d'une base de données

1
2
$ sudo -i -u postgres
$ pg_dump -f $PATH_SAVE/nom_de_la_base.sql nom_de_la_base 

 Restauration d'une base de données (attention la base doit avoir été recréer préalablement avec createdb)

1
$ sudo -u postgres psql -f $PATH_SAVE/nom_de_la_base.sql nom_de_la_base

Creation d'une table utilisateurs:

1
2
3
4
5
6
7
8
$ sudo -u postgres psql 
$ CREATE TABLE  utilisateurs (
 id SERIAL PRIMARY KEY,
 email varchar( 60 ) UNIQUE NOT NULL ,
 mot_de_passe varchar( 32 ) NOT NULL ,
 nom varchar( 20 ) NOT NULL ,
 date_inscription date NOT NULL
);

On pourra noté pour ceux qui sont plus habitué de MySQL que les requêtes SQL ne sont pas syntaxiquement identique. On reviendra sur ce "détail". Mais ici par exemple il faut savoir que SERIAL signifie juste "NOT NULL AUTO_INCREMENT"

Insersion de données dans la table

1
2
$ INSERT INTO utilisateurs (email, mot_de_passe, nom, date_inscription) VALUES ('moi@la.com', MD5('tutu'), 'BaMoi', NOW());
$ INSERT INTO utilisateurs (email, mot_de_passe, nom, date_inscription) VALUES ('toi@pas.la', MD5('utut'), 'EtToi', NOW());

Vérification de l’insertion

1
2
3
4
5
6
7
$ SELECT * FROM utilisateurs;

 id |   email    |           mot_de_passe           |  nom  | date_inscription
----+------------+----------------------------------+-------+------------------
  4 | moi@la.com | bdb8c008fa551ba75f8481963f2201da | BaMoi | 2017-09-27
  5 | toi@pas.la | 5c587bce24972d7a92e6cf1200f2001a | EtToi | 2017-09-27
(2 rows)

La vérification de la suppression nous renvoie le résultat suivant


1
2
3
4
5
6
$ delete from utilisateurs where id = 4;

 id |   email    |           mot_de_passe           |  nom  | date_inscription
----+------------+----------------------------------+-------+------------------
  5 | toi@pas.la | 5c587bce24972d7a92e6cf1200f2001a | EtToi | 2017-09-27
(1 row)