présente...

 

Chapitre :Administration

par tous les amis de Léa

 

 

Le copyright de chaque article est détenu par son auteur.
Le copyright du livre lui-même est détenu par Léa (Association Loi 1901).
Les articles de ce livre sont diffusés selon la license GPL (GNU General Public License), sauf mention explicite dans l'article.

Copyright (c) 2003 Association Léa.
This documentation is free documentation; 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.
This documentation 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.
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
For the purpose of applying the GPL to this document, I consider "source code" to refer to the html source.


Table des matières


Administration de Linux

Cette section contient les chapitres relatifs à l'administration de Linux.

Voir aussi la section correspondante des trucs et astuces.

Si vous avez des questions concernant l'administration vous pouvez poser votre question sur le forum.


Haut


Le shell ou le retour du C:> !
(et les commandes)

par Jean-Christophe, Marc et Anne

Le shell, un environnement écrit au temps ou les hommes étaient des hommes :-)


Introduction

Qu'est-ce que le shell me direz vous ? Certains diront que c'est ça le vrai Linux. il n'y a pas que du faux là-dedans, puisque étymologiquement parlant, "Linux" est juste le nom du noyau du système d'exploitation, et qu'on a tendance par abus de langage à utiliser "Linux" pour désigner l'ensemble de Linux, du serveur X et des nombreuses applications.

Bref, le shell c'est le bon vieux mode texte, mon copain le prompt, qui sous Linux revêt une importance capitale. En effet, la philosophie Unix veut que toute action puisse être réalisée en ligne de commande, avant d'être accessible dans une boîte de dialogue. Ainsi de nombreuses applications X ne sont en fait que des front ends (des façades) à des applications en ligne de commande, se contentant de construire la bonne ligne de commande à partir de vos clics (XCDRoast / cdrecord, mkisofs, etc. ; kppp / pppd ; etc.).

Comme Linux prône le règne de la liberté, vous n'avez pas qu'un seul shell disponible. Vous pouvez utiliser bash, tcsh, ksh, ash, sh, csh, etc. Néanmoins, la plupart des distributions actuelles proposent bash par défaut, et je vous recommande donc de l'utiliser, surtout si vous débutez sous Unix et que vous n'avez pas encore d'habitudes. Si plus tard, vous tombez sur un ordinateur ne disposant que de tcsh, ne vous inquiétez pas : la différence n'est pas flagrante, et vous pourrez toujours consulter "man tcsh" !
à noter que le choix du shell pour un utilisateur se configure dans /etc/passwd.

Le shell n'est pas seulement le prompt vous permettant de taper vos commandes, c'est aussi un puissant langage de commande, vous permettant d'automatiser des tâches, etc. via l'écriture de scripts shell. Apprendre le langage du shell peut être très enrichissant et utile ; néanmoins, cela dépasse le cadre de cette rubrique. Et pis j'ai pas le courage de taper une leçon sur bash :) Par contre, vous trouverez ici les commandes de base, ainsi que les raccourcis clavier et les raccourcis du shell, les aliases, les variables d'environnement, la configuration du shell et j'en passe. C'est déjà pas mal non ? 


Commandes pour débuter

Avant de commencer, il faut savoir que Linux est sensible à la casse (case sensitive en anglais), c'est à dire qu'il distingue les majuscules des minuscules. Ainsi, si je vous dit que la commande est 'mkdir', ce n'est pas la peine d'essayer MKDIR ou mKdiR, cela ne fonctionnera pas. De même, les noms de fichiers et de répertoires sont également sensibles à la casse.

De plus, sous Unix, les chemins sont séparés par des slash : écrivez /etc/rc.d/init.d/xfs mais jamais etc\rc.d\init.d\xfs par pitié :)

Bon c'est pas tout ça, voici les commandes de base sous Linux :

Commandes linux

équivalent MsDos

à quoi ça sert

Exemples :

cd

cd

change le répertoire courant.

cd ..
    - va dans le répertoire parent du répertoire courant

cd /home/user/.nsmail
    - va dans le répertoire désigné

ls

dir

affiche le contenu d'un répertoire

ls
    - affiche le contenu du répertoire courant

ls -l
    - affiche le contenu du répertoire courant de manière détaillée

ls -a /home/user
    - affiche le contenu du répertoire désigné (ainsi que les fichiers cachés)

cp

copy
xcopy

copie un ou plusieurs fichiers

cp toto /tmp
    - copie le fichier toto dans le répertoire /tmp

cp toto titi
    - copie le fichier toto sur le fichier titi

cp -R /home/user /tmp/bak
    - copie le répertoire /home/user ainsi que tout ce qu'il contient dans /tmp/bak

rm

del

efface un ou plusieurs fichiers

rm toto titi
    - efface les fichiers toto et titi

rm -f toto titi
    - efface les fichiers toto et titi sans demander confirmation

rm -rf

deltree

efface un répertoire et son contenu

rm -rf /tmp/*
    - efface (sans demander de confirmation) tous les fichiers et répertoire de /tmp

mkdir

md

crée un répertoire

mkdir /home/user/mes documents
    - crée le répertoire "mes documents" dans le sous répertoire /home/user

rmdir

rm

efface un répertoire s'il est vide

rmdir /home/user/.nsmail
    - efface le répertoire .nsmail de /home/user si celui-ci est vide

mv

ren
move

déplace ou renomme  un ou des fichiers

mv tata titi
    - renomme tata en titi

mv * *.bak
    - ne fonctionne pas !!!!

mv * /tmp/bak
    - déplace tous les fichiers du répertoire courant vers le répertoire  /tmp/bak

find

dir -s

trouve un fichier répondant à certains critères

find /home -name "*bash*"
    - trouve tous les fichiers contenant le mot bash dans leur nom se trouvant dans le répertoire /home

locate

dir -s

trouve un fichier d'après son nom

locate bash
    - trouve tous les fichiers contenant le mot bash dans leur nom complet (avec le répertoire) : à la différence de find, locate trouve ses informations dans une base de donnée créée par updatedb

man

help

affiche l'aide concernant une commande particulière

man ls
    - affiche l'aide (page de manuel) de la commnade ls. On quitte man en appuyant sur la touche 'q'

chmod

pas
d'équivalent

modifie les permissions d'un fichier

chmod o+r /home/user
    - autorise les autres (o=other) (ie: ceux qui ne sont ni le propriétaire, ni membre du groupe propriétaire) à lire (r=read) le répertoire /home/user

chmod a+rw /home/user/unfichier
    - autorise tout le monde (a=all) à lire et écrire (w=write) dans le fichier /home/user/unfichier

chown

pas
d'équivalent

modifie le propriétaire d'un fichier

chown user unfichier
    rend user propriétaire de unfichier.

chgrp

pas
d'équivalent

modifie le groupe proprétaire d'un fichier

chgrp -R nobody /home/httpd
    - rend le groupe : nobody (un groupe ayant très peu de droit sur un système linux) propriétaire de /home/httpd ainsi que tout les fichiers qu'il contient (-R)

ln -s

pas
d'équivalent

crée un lien vers un fichier

ln -s /dev/fd0 /dev/disquette
    crée un lien vers /dev/fd0 (le lecteur de disquette) nommé /dev/disquette. La manipulation de /dev/fd0 et /dev/disquette (sauf l'effacement).

grep

pas
d'équivalent

recherche une chaine dans un fichier (en fait recherche une expression régulière dans plusieurs fichiers)

grep chaine *.txt
    - recherche la chaine 'chaine' dans tous les fichier se terminant par .txt.

which

pas
d'équivalent

trouve le répertoire dans lequel se trouve une commande

which emacs
    - retourne le nom du répertoire dans lequel se trouve la commande emacs.

cat

type

affiche un fichier à l'écran

cat ~/.bashrc
    - affiche le contenu du fichier ~/.bashrc

Remarque :
Pour en savoir plus sur toutes ces commandes, je vous conseille de consulter leur page de man !

La commande ls

Cette commande est omniprésente, aussi il est bon d'en présenter les basiques.

Afficher le listing page par page : ls | less (less est une version améliorée de more)
Afficher le listing en couleurs : ls --color
Afficher aussi les fichiers cachés (commençant par un point) : ls -a
Mettre un '/' après les noms de répertoires : ls -p
Afficher le listing détaillé : ls -l

Tri sur la date
Pour afficher les fichiers d'un répertoire en triant sur la date de mise à jour des fichiers
Afficher les fichiers les plus récents en premier : ls -t
Afficher les fichiers les plus vieux en premier : ls -rt
Mixer avec l'option "l" afin d'afficher le listing détaillé : ls -rtl ou ls -tl

bien sûr, toutes ces options sont mixables, ainsi "ls -altp" affiche tous les fichiers, de façon détaillée, dans l'ordre chronologique, an ajoutant '/' après chaque nom de répertoire.

Exemple de listing

[jice@taz jice]$ls -alp
total 144
-rw-r--r--   1 jice  users     24 Aug  2 21:37 .bash_logout
-rw-r--r--   1 jice  users    230 Aug  2 21:37 .bash_profile
-rw-r--r--   1 jice  users    467 Aug  2 21:37 .bashrc
-rw-r--r--   1 jice  users   1452 Aug  2 21:37 .kderc
drwxr--r--  12 jice  users   1024 Aug  2 21:37 .kde/
drwxr--r--   2 jice  users   1024 Aug  2 21:37 Desktop/
-rw-r-----   1 jice  users   1728 Aug  2 21:37 adresses.txt
-rw-------   1 jice  users    144 Aug  2 21:37 motsdepasse.txt
lrwxrwxrwx   1 jice  users     14 Aug  2 21:37 linux -> /usr/src/linux

Explication :
La première ligne "total 144" est l'espace disque utilisé par l'ensemble des fichiers du répertoire.

  1. La première colonne -rw-r--r--représente les permissions associées au fichier. le premier caractère est un tiret pour un fichier, un d pour un répertoire, un l pour un lien, etc.
    ensuite, on a trois groupes de trois caractères : rw- ou r-- ou rwx ou...
    Le premier groupe représente les permissions associées à l'utilisateur (ici, jice), le deuxième celles associées à son groupe (ici : users), enfin le dernier est les permissions que tout le monde a sur ces fichiers.
    r signifie : possibilité de lire ce fichier / dans ce répertoire,
    w signifie : possibilité d'écrire dans ce fichier / répertoire,
    x signifie : possibilité d'exécuter ce fichier / d'aller dans ce répertoire.

  2. nombre d'inodes (partie élémentaire de système de fichiers) qui pointent vers le fichier/répertoire (généralement 1 pour un fichier, 2+le nombre de sous-répertoires pour un répertoire).

  3. utilisateur à qui appartient le fichier (jice)

  4. groupe auquel le fichier appartient (users)

  5. taille en octets

  6. date et heure de modification

  7. nom du fichier/répertoire.


Quelques questions et réponses

Les commandes du tableau ci-dessus permettent de répondre à quelques questions comme :
Où est cette commande (which) ? Que contient ce fichier (cat ou tac) ? Quel fichier contient tel mot (grep) ? etc.
Voici  d'autres questions et réponses qui ne nécessitent pas d'être root et vous permettront de continuer à vous familiariser avec bash et ses commandes. Elles sont regroupées en trois tableaux : Informations sur les commandes ; informations sur le système ; informations sur les fichiers.

Informations sur les commandes

Quelle commande utiliser pour faire ... ceci ou cela ?

apropos mot_clef ou man -k mot_clef
    - affiche les commandes, brièvement définies, en rapport avec mot_clef.
apropos copier
    - affiche les commandes en rapport avec la copie d'un fichier, d'une chaîne, d'une zone mémoire ...
apropos permission
    - affiche les commandes liées à la vérification et à la modification des permissions.

Notes : les noms communs et les verbes à l'infinitif permettent généralement de trouver facilement la commande recherchée. En cas d'échec, pensez aux synonymes : apropos supprimer fait apparaître la commande rmdir (supprimer un répertoire), alors que apropos effacer fait apparaître la commande rm (effacer un fichier).

Comment se définit cette commande ?

whatis nom_commande ou man -f nom_commande
    - affiche une brève définition de nom_commande.
whatis whatis
    - affiche la définition de whatis.
whatis arch
    - affiche la définition de la commande arch.
cd /bin ; for i in * ; do whatis $i ; done | more ; cd
    - se positionne dans le répertoire /bin/, affiche page par page la définition de chacune des commandes qui s'y trouve, retourne au répertoire personnel.

Notes : dans l'exemple précédant vous pouvez bien sûr remplacer /bin par /sbin ; certaines entrées échouent.

Quelles sont et comment utiliser les commandes internes ?

help
    - affiche la liste des commandes internes et leur syntaxe.
help nom_commande
    - affiche une aide sommaire sur nom_commande.
help help
   - affiche une aide sur help.
help alias
    - affiche une aide sur la commande alias.

Notes : ces commandes sont les commandes internes du shell, généralement le bash. Vous pouvez aussi en obtenir la liste en demandant à propos de l'une d'elles une page man qui n'existe pas (man :). Vous trouverez également une aide sur les commandes internes dans la page man de bash (man bash). Enfin notez que help concerne les commandes internes mais --help les commandes externes.


Où sont et quelles sont les commandes externes ?

ls /bin
    - affiche le contenu du répertoire /bin/, et donc la liste des commandes externes usuelles communes à tous les utilisateurs.
ls /sbin
    - affiche le contenu du répertoire /sbin/, et donc la liste des commandes externes usuelles réservées à l'administrateur (root).
whereis nom_commande
    - affiche le chemin de nom_commande ainsi que celui de sa page man.
whereis cat
    - affiche le chemin de la commande cat (/bin/cat) et celui de sa page man (/usr/share/man/man1/cat.1.bz2).
which nom_commande
    - affiche le chemin de nom_commande.
which tac
    - affiche le chemin de tac (/usr/bin/tac).

Notes : les répertoires /usr/bin/ et /usr/sbin/ contiennent les commandes externes moins fréquemment utilisées. Pour savoir si une commande est externe vous pouvez aussi simplement vérifier qu'elle n'est pas interne !

Comment obtenir un aide mémoire sur cette commande ?

nom_commande --help
    - affiche l'aide mémoire de nom commande.
ls --help
    - affiche l'aide mémoire de la commande ls.

Notes : --help concerne la plupart des commandes externes et help les commandes internes. echo --help affiche bien sûr ... --help.

La dernière commande s'est-elle bien terminée ?

echo $?
    - affiche le code de retour de la dernière commande effectuée, 0 si elle s'est bien terminée, un autre nombre dans le cas contraire.
clear ; echo $?
    - efface l'écran et affiche 0.
sl / ; echo $?
    - affiche un message d'erreur et le code 127 (bash ne connaît pas la commande sl).
nom_commande 2>/dev/null && echo "ok" || echo "m'enfin"
    - exécute nom_commande en redirigeant les erreurs vers /dev/null (périphérique fictif) puis affiche "ok" si tout s'est bien passé ou "m'enfin" dans le cas contraire.
: && echo "ok" || echo "m'enfin"
    - ne fait rien puis affiche "ok" (la commande : ne fait rien et se termine toujours bien).
bof 2>/dev/null && echo "ok" || echo "m'enfin"
    - affiche "m'enfin" (la commande bof n'existe pas).

Notes : commande1 && commande2 exécute commande2 que si commande1 s'est terminée normalement (0) ; commande1 || commande2 exécute commande2 que si commande1 ne s'est pas terminée correctement (<>0).

Quels sont le nom, la taille et le contenu du fichier d'historique ?

echo $HISTFILE $HISTFILESIZE
    - affiche le nom et la taille du fichier d'historique des commandes.
cat $HISTFILE | more
    - affiche le contenu du fichier d'historique page par page.
tail -n 24 $HISTFILE
    - affiche les 24 dernières lignes du fichier d'historique.

Notes : le fichier d'historique vous aide à répondre à la question : mais comment j'avais fait ? et à en conserver une trace d'une connexion à l'autre.

Quel est l'historique actuel ?

history | more
    - affiche page par page le contenu numéroté de l'historique actuel des commandes.
history 12
    - affiche les 12 dernières entrées effectuées et leurs numéros.

Notes : c'est cet historique qui défile avec les touches "flèches" de votre clavier ; au démarrage, c'est le contenu de votre fichier d'historique.

Informations sur le système

Quel est le système ?

uname ou echo $OSTYPE
    - affiche le nom du système d'exploitation.
uname -a
    - affiche diverses informations système (nom du SE, version, microprocesseur ...).
arch ou uname -m
    - affiche le type du microprocesseur.
cat /proc/cpuinfo
    - affiche des informations sur le microprocesseur (type, fréquence, cache ...).

Notes : les informations recueillies avec uname -a peuvent aussi être obtenues avec certaines variables système : echo $OSTYPE $BASH $BASH_VERSION etc.

Depuis combien de temps ce shell est-il actif ?

uptime
    - affiche l'heure, la durée d'activité du système, le nombre d'utilisateurs ...
echo $SECONDS
    - affiche la durée d'activité du shell courant en secondes.
echo $[$SECONDS/3600] h $[($SECONDS%3600)/60] mn $[$SECONDS%60] s
    - affiche cette durée en heures, minutes et secondes.

Notes : bash ne connaît que les entiers et donc que les divisions euclidiennes, / permet d'en obtenir le quotient et % d'en obtenir le reste (ou modulo). Chaque fois que vous changez de terminal, ouvrez un nouvel xterm ou faites un su, celui-ci correspond à un nouveau (sous)shell, sa variable SECONDS est donc alors à 0. Pour savoir depuis combien de temps vous êtes sous Linux, revenez à votre console de login ; pour savoir depuis quand le système est actif, utilisez uptime.

Qu'en est-il des disques, de la mémoire, du microprocesseur ?

mount
    - affiche la liste des disques montés.
df -ah
    - affiche au format humain l'espace total, occupé, libre sur tous les disques.
free ou cat /proc/meminfo
    - affiche des informations sur la mémoire (totale, libre,  swap ...).
vmstat
    - affiche les statistiques sur la mémoire virtuelle.
top
    - affiche et permet d'observer en temps réel l'activité de la mémoire et du microprocesseur.

Notes : la touche <Q> permet de quitter la commande top.

Quelles sont et que signifient les variables système ?

$<Tab>
    - affiche les noms des principales variables système.
help variables | more
    - affiche page par page la définition des principales variables système.

Notes : les noms des variables système sont généralement écrits en majuscules. A chacune de ces variables correspond une question et une réponse, quelques unes seulement ont été formulées à divers endroits dans cette page.

Que contiennent ces variables système ?

echo $NOM_VARIABLE
    - affiche le contenu de NOM_VARIABLE.
echo $USER
    - affiche le nom de l'utilisateur en cours.
echo $PS1
    - affiche la chaîne de caractères définissant le prompt.
printenv | more
    - affiche page par page l'environnement.
set | more
    - affiche page par page le contenu des principales variables système.

Notes : vous pouvez bien sûr modifier le prompt PS1="chaîne de caractères". Pour rendre cette modification générale et durable, il faut utiliser le fichier /etc/bashrc (nécessite d'être root).

Qui suis-je et qui est ou était connecté au système ?

id nom_utilisateur
    - affiche les identifications de nom_utilisateur.
id
    - affiche vos identifications : UID, GDI, groupes.
who am i
    - affiche vos coordonnées dans le système.
who -H
    - affiche avec une entête des informations (nom de login, console ... ) sur les utilisateurs connectés.

    - affiche qui est connecté (who -H) et aussi ce qu'il fait.
last -n 12
    - affiche la liste des 12 dernières connexions.

Notes : la commande who am i ne fonctionne pas toujours sous xterm, dans ce cas entrez whoami mais vous n'obtiendrez que votre nom de login. De nombreuses commandes permettent d'obtenir une partie des renseignements évoqués ci-dessus, leurs noms parlent d'eux-mêmes : logname, users, groups ...

Quelles sont la date et l'heure ?

date
    - affiche la date et l'heure. br />date +%x
    - affiche seulement la date au format jj.mm.aaaa.
date +%X
    - affiche uniquement l'heure au format hh:mm:ss.
cal
    - affiche un calendrier du mois en cours.
cal 2000
    - affiche le calendrier de l'an 2000, etc.

Y a-t-il un pingouin dans le système ?

linux_logo
    - affiche Tux et diverses informations système.
linux_logo -la
    - affiche Tux en ASCII et sans informations :-)

Notes : sur mon système, linux_logo -la produit bien l'affichage attendu (-a = ASCII et -l = pas d'informations) mais  avec linux_logo -al, l'option -l est ignorée et les informations sont affichées ... Y a-t-il un bug dans mon système ?

Informations sur les fichiers

Quel est le répertoire courant ?

pwd
    - affiche le nom complet du répertoire en cours.

Quelle est la taille de ce répertoire ?

du -sh 
    - affiche au format humain la taille du répertoire courant.
du -h ~ | more
    - affiche page par page au format humain la taille de votre répertoire personnel et de tous ses (sous)répertoires.

Notes : du ne fonctionne que sur les répertoires où vous avez droit d'accès, si nécessaire passez sous root.

Quel est le type de ce fichier ?

file nom_fichier
    - affiche le type de nom_fichier.
file *
    - affiche le type de tous les fichiers du répertoire en cours.
file /bin
    - affiche que /bin/ est un répertoire.
file /bin/sh
    - affiche que sh est un lien symbolique vers bash.
file /bin/bash
    - affiche que bash est un exécutable.
file ~/.bashrc
    - affiche que .bashrc de votre répertoire personnel est un fichier texte.
file /dev/null
    - affiche que null est un fichier spécial.

Notes : file sait reconnaître un grand nombre de types de fichiers parmi les fichiers spéciaux, exécutables, textes, données ... Il est préférable de l'utiliser avant d'entrer un "cat" au hasard.


Raccourcis

Clavier

et aussi...

Shell

Les shells Unix disposent de petits "raccourcis" très astucieux et utiles, qui vous épargnerons de taper sur quelques touches. Ne dit-on pas qu'un bon informaticien est un informaticien fainéant ? :-)

Dernière ligne de commande : !!

On a vu plus haut qu'elle était accessible par la flèche vers le haut, mais vous pouvez également la désigner par '!!', ce qui peut être très intéressant.

[user@localhost user]$ vi
[user@localhost user]$ which !!
which vi
/bin/vi

Arguments de la dernière commande : !*

Les arguments de la dernière commande peuvent être représentés par '!*'.

[user@localhost user]$ mkdir test
[user@localhost user]$ cd !
cd test

Utiliser la sortie d'une commande comme argument :

Vous pouvez réutiliser directement ce qu'une commande écrit à l'écran comme argument pour une autre commande. Pour ce faire, vous devez encadrer la commande par une cote inverse ` ou la mettre entre parenthèses précédées du signe $ ; elle sera remplacée par ce qu'elle écrit à l'écran dans la ligne de commande. Imaginez par exemple que vous vouliez voir les informations sur le fichier exécutable de emacs.

[user@localhost user]$ ls -l `which emacs`
[user@localhost user]$ ls -l $(which emacs)

est ainsi équivalent à :

[user@localhost user]$ which emacs
/usr/bin/emacs
[user@localhost user]$ ls -l /usr/bin/emacs

Cool non ? Et vous pouvez mixer les raccourcis vus précédemment :

[user@localhost user]$ emacs
[user@localhost user]$ ls -l `which !!`

C'est-y pas beau ça madame ?

Remplacer un caractère par un autre : ^

Si vous souhaitez remplacer la première occurrence d'un caractère de la ligne de commande précédente par un autre, vous pouvez utiliser le symbole ^, comme ci-dessous :

[user@localhost user]$ lpcate i486-linux-libc5
lpcate : command not found
[user@localhost user]$ ^p^o
locate i486-linux-libc5

^p^o signifie : refait la même ligne de commande que précédemment, mais remplace le premier p par un o.

Lancer un programme directement en tâche de fond : &

Il suffit de faire suivre la ligne de commande du symbole & :

[user@localhost user]$ cp -R /usr/doc /tmp &
[1] 7194
[user@localhost user]$ _

La commande est lancée en tâche de fond, c'est à dire qu'elle s'exécute, mais la main vous est rendue tout de suite. La fin de la commande est signifiée par un message :

[user@localhost user]$
[1]+ Done cp -R /usr/doc /tmp
[user@localhost user]$ _

Lancer plusieurs programmes en même temps : &, &&, ||, ;

Vous avez plusieurs solutions :

prog1 ; prog2  lance prog1, puis prog2,

prog1 & prog2  lance prog1 en arrière plan, puis immédiatement prog2 en avant plan,

prog1 && prog2 lance prog1, puis prog2 seulement si prog1 n'a pas retourné d'erreur,

prog1 || prog2 lance prog1, puis prog2 seulement si prog1 A retourné une erreur.


Redirections

Normalement, la sortie des programmes se fait à l'écran, aussi bien pour les erreurs (standard error) que pour les messages "normaux" (standard output). Vous pouvez la rediriger, soit vers un fichier avec >, soit vers l'entrée d'un autre programme avec | (ou pipe - attention, arrêtez de rigoler dans le fond :-).

De même, l'entrée standard (standard input) est habituellement constituée du clavier, mais on peut aussi la remplacer par le contenu d'un fichier, avec le symbole <.

Envoyer la sortie standard d'un programme dans l'entrée standard d'un autre

Vous avez déjà certainement vu ou utilisé une commande du type :

[user@localhost user]$ ls -la | more

ls -la envoie la version longue du listing de répertoire, avec les fichier cachés, à more qui l'affiche page par page.
Vous pouvez aussi enchaîner plusieurs redirections :

[user@localhost user]$ cat /var/log/messages | grep gpm | more

Ceci va afficher page par page l'ensemble des messages système relatifs à gpm. (voir plus haut ce que font chacune de ces commandes).

Envoi d'un fichier dans l'entrée standard

L'entrée standard (standard input) est normalement ce que vous tapez au clavier. Vous pouvez remplacer vos frappes clavier par le contenu d'un fichier, qui sera ouvert et envoyé sur l'entrée standard du programme. C'est pratique pour automatiser des tâches avec des programmes interactifs. Exemple :

[user@localhost user]$ ftp < sessiontype.txt

Ici le fichier sessiontype.txt pourra contenir par exemple :

 open ftp.lesite.com
 user jice
 pass xxxxxx
 cd /pub/linux/doc
 bin
 get jice.jpg
 bye

Et vous permettra en une seule commande de récupérer le fichier jice.jpg sur le site ftp.lesite.com (utile si ce fichier change et que vous voulez le mettre à jour régulièrement). Bref, à vous d'inventer la vie qui va avec :-)

Redirection des sorties vers un fichier

[user@localhost user]$ ls -lR /cdrom > cdrom.txt

Cette commande va lister le contenu du cdrom, et enregistrer le résultat dans le fichier cdrom.txt.
En mettant deux > de suite, vous ajoutez au fichier :

[user@localhost user]$ date >> cdrom.txt

Ceci va ajouter la date au fichier précédemment créé.

Les messages d'erreur peuvent être dirigés séparément dans un fichier avec 2> :

[user@localhost user]$ startx > startx.log 2> startx.err

ou dirigés vers le même fichier que les messages normaux :

[user@localhost user]$ startx > startx.log 2>&1


Gestion des processus

Linux est multitâches, ce qui signifie que plusieurs programmes (qui peuvent être à la fois des applications utilisateur ou des tâches système) peuvent tourner simultanément. On vient de voir qu'on pouvait lancer directement depuis un terminal texte une commande en tâche de fond, avec le symbole &.
Comment gère-t-on ensuite ces processus ?

Lister les processus : ps

La liste des processus en cours pour un terminal donné s'obtient en tapant simplement la commande ps :

 PID TTY STAT TIME COMMAND
  12  p1 S    0:00 bash
 144  p1 S    0:01 emacs
1768  p1 R    0:00 ps

Si vous voulez voir plus de processus, vous pouvez lister tous les processus d'un utilisateur par ps U root :

  PID TTY      STAT   TIME COMMAND
    1 ?        S      0:04 init
    2 ?        SW     0:00 [keventd]
    3 ?        SWN    0:00 [ksoftirqd_CPU0]
...

Vous pouvez aussi voir l'ensemble des process d'un système par ps aux

Lister les jobs et les gérer : jobs, fg, bg

"job" est un mot qui désigne ici les programmes que vous avez lancé en arrière plan (tâche de fond) dans votre terminal. Pour lancer un job en arrière plan, vous pouvez :

lancer le programme par son nom, puis taper Ctrl-Z pour le stopper, puis la commande bg pour l'envoyer en arrière plan (BackGround).

vous pouvez aussi simplement taper le nom de ce programme suivi par le symbole &.

Afin d'afficher une liste des jobs d'un terminal, tapez la commande jobs:

[user@localhost user]$ find / -name "*a*" >A &
[1] 7859
[user@localhost user]$ jobs
[1]+ Running find / -name "*a*" >A &

Pour chacun de ces jobs, vous pouvez les faire revenir en avant plan avec la commande fg ; "fg" pour le dernier programme lancé en tâche de fond, "fg %n" pour le nième.

Tuer un processus : kill, killall

Afin de terminer un processus qui ne répond plus, par exemple, on utilise la commande kill, suivie du numéro de job (%n) ou du PID du programme à tuer. Par exemple, si ps donne le résultat ci-dessus, la commande "kill 144" arrêtera la tâche emacs. "kill %1" fera la même chose.

Vous pouvez également tuer des processus par leur nom avec la commande killall suivie du nom du processus à tuer, mais attention : TOUS les processus de l'utilisateur utilisant killall et portant le même nom seront tués. Par exemple, si vous tapez "killall emacs", non seulement la fenêtre emacs lancée depuis ce terminal sera supprimée, mais aussi tous les autres emacs lancés depuis un autre terminal par l'utilisateur.

Vous pouvez aussi passer un autre argument à kill et killall, qui est le signal à envoyer à la tâche (les signaux sont une manière de communiquer avec les applications sous Unix). Par exemple, si la tâche récalcitrante ne s'arrête pas avec un simple kill 144, essayez kill -9 144, ou kill -QUIT 144.


Aliases et variables d'environnement

Aliases

Plutôt que de taper de longues commandes, ou bien parce que vous préférez vous rappeler d'un nom plutôt que du vrai nom Unix, vous pouvez définir des aliases. Pour ce faire, utilisez la commande alias comme suit :

Si votre shell est bash ou sh ou ash (par défaut) :

alias md=mkdir
alias ls='ls --color'
alias eclip2='telnet eclip2.ec-lille.fr'

Si votre shell est tcsh ou csh (par défaut) :

alias md mkdir
alias ls 'ls --color'
alias eclip2 'telnet eclip2.ec-lille.fr'

Ainsi pourrez-vous taper md au lieu de mkdir, et eclip2 pour vous connecter à cette machine via telnet ; la commande ls affichera une sortie en couleurs...

Le problème est que les aliases définis dans un terminal ne sont valables que dans celui-ci, et disparaîtrons à jamais dès que ce terminal sera fermé. Pour conserver des alias par-delà les connexions/déconnexions, regardez la configuration du shell : vous pouvez définir vos aliases dans le fichier ~/.bashrc.

Variables d'environnement, Path et Prompt

Les variables d'environnement servent à enregistrer des paramètres que les programmes peuvent lire ensuite. Elles sont désignées par un symbole $ suivi de lettres, chiffres et symboles.

Par exemple, la variable $HOME est égale au répertoire maison de l'utilisateur en cours (en général /home/user).

De même, la variable $PATH représente le chemin de recherche que le shell va parcourir afin de trouver le fichier exécutable qui correspond à la commande que vous venez de taper. Par exemple, $PATH = /bin:/usr/bin:/usr/local/bin.

Créer ou modifier une variable d'environnement
Si votre shell est bash ou sh ou ash (par défaut) :

export MAVARIABLE=mavaleur

Si votre shell est tcsh ou csh (par défaut) :

setenv MAVARIABLE mavaleur

Cette commande positionnera la variable MAVARIABLE à la valeur mavaleur. Vous pouvez le vérifier, en tapant la commande echo $MAVARIABLE qui écrira à l'écran "mavaleur".

Vous pouvez ainsi ajouter le chemin /home/user/bin à votre $PATH si vous installez des logiciels dans votre répertoire personnel par exemple. Sous bash, cela donnera : export PATH=$PATH:/home/user/bin. Cependant, de même que pour les aliases, ce nouveau PATH sera perdu dès votre déconnexion...

Attention, en général, le répertoire courant '.' ne fait pas partie du PATH pour des raisons de sécurité : imaginez qu'une personne mal intentionnée aie mis un programme destructeur appelé "ls" dans votre répertoire, vous le lanceriez dès que vous taperiez la commande ls ! C'est pourquoi il faut toujours faire précéder de son chemin complet une commande qui n'est pas dans le PATH, et ce même si vous êtes dans le même répertoire que la commande ! Ainsi,  il ne faut pas taper configure, mais ./configure (programme classique à lancer avant compilation d'un logiciel), ce qui signifie : lance le programme 'configure' qui est présent dans le répertoire courant.

Le prompt est également contenu dans une variable d'environnement : PS1.
Le prompt par défaut de la Mandrake par exemple, [user@localhost user]$, est défini comme suit : PS1="[u@h W]$ ".
u est l'utilisateur, h le nom de machine (hostname), w le chemin courant (ex : /usr/doc), W le répertoire courant (ex : doc)... voyez man bash pour l'ensemble des possibilités.

Une autre variable d'environnement utile : PROMPT_COMMAND. Cette variable contient une commande qui est exécutée à chaque fois que le prompt est affiché. Cela permet des tas de fantaisies rigolotes, comme par exemple de jouer un son (trop utile :-) ou de positionner le titre d'un xterm avec le nom du répertoire courant (voir man xterm).

Regardez la configuration du shell : vous pouvez définir vos variables dans le fichier ~/.bash_profile.


Configuration du shell

Vous pouvez enregistrer des fichiers qui seront lus et exécutés par votre shell, lors de l'ouverture d'un terminal, aussi bien que lors de sa fermeture. Cela va vous permettre d'y placer vos aliases préférés, et vos variables d'environnement.

Pour bash et consorts, ces fichiers s'appellent : .bashrc, .bash_profile pour la connexion et .bash_logout pour la déconnexion.
Pour tcsh et ses potes, ces fichiers s'appellent : .tcshrc, .login pour la connexion et .logout pour la déconnexion.
Ces fichiers se situent tous dans le répertoire maison de l'utilisateur ($HOME). Notez bien qu'ils commencent par un point : ce sont des fichiers cachés. Pour les voir, il faut faire un "ls -a".

Examinez les avec votre éditeur de texte préféré, et vous verrez comment ajouter de nouveaux aliases et variables d'environnement, ainsi que lancer tel ou tel programme automatiquement : en tant que scripts shell, ces programmes sont en fait une suite d'instructions qui sera interprétée par le shell. 


Les entrailles du shell

Vous êtes maintenant munis d'une jolie batterie d'outils qui va entre autres vous permettre d'écrire tous vos scripts shell. Toutefois même en ayant récupéré la synthaxe de commandes vous continuez à subir des erreurs... Soit la commande ne vous retourne pas le résultat attendu soit le shell vous retourne des erreurs...
Ne vous êtes vous jamais posé cette question : est-ce que je mets des simples quotes, des doubles quotes ou des back quotes ?
Pour ne plus avoir à se poser ce genre de questions, il est essentiel de bien connaitre le fonctionnement interne du shell.

Les grandes étapes de l'interprétation d'une ligne de commandes

Pour mieux comprendre le résultat obtenu, il faut savoir que le shell lit plusieurs fois la ligne avant d'exécuter la commande.
Cette lecture se fait dans l'ordre suivant :

  1. substition de variables : le shell remplace les variables par leurs valeurs

  2. substitution de commandes : le shell remplace une variable par son contenu qui est le résultat d'une commande

  3. interprétation des pipes et des redirections

  4. expansion des noms de fichiers : interprétation des caractères spéciaux pour compléter un nom de fichier et/ou de répertoire

  5. exécution de la commande

On se rend donc compte qu'un caractère spécial peut être interprété par le shell avant d'être interprété au sein de la commande.

Exemple : le caractère "*" peut être interprété par le shell (remplace 0 ou n caractères pour compléter un nom de fichier) ou par une commande comme grep (répète de 0 à n fois le caractère précédent dans une chaîne de caractères). Toutefois, sans précision dans la synthaxe, et selon les étapes ci-dessus, le caractère sera d'abord interprété par le shell. D'où quelques surprises dans le résultat de la commande.

L'interprétation des caractères spéciaux

Pour choisir de faire interpréter les caractères spéciaux par le shell ou la commande, il existe 3 possibilités :

Liste des caractères spéciaux

Ci-dessous la liste des caractères spéciaux du shell :

&

processus en arrière-plan

~

home directory

;

séparateur de commandes

\

annulation d'un caractère spécial

"

doubles quotes : encadre une chaîne de caractères et annule la signification de $, \ et '

`

back quotes : substitution de commandes

'

simples quotes : encadre une chaîne de caractères et annule la signification de tous les caractères spéciaux

#

commentaire

( )

exécution d'un shell fils

[ ]

test

|

pipe

$

variable

*

remplace 0 ou n caractères

!

négation d'un test

?

remplace 1 caractère

< >

redirections entrée, sortie

$0...$9

variables de position

Appel des commandes

Autre élément à connaître pour ne pas avoir de surprise : à quel type de commande ai-je à faire ? on distingue des grands types de commande

La difficulté c'est que le shell interprète une commande en suivant un ordre très précis :

Donc si vous tapez une commande quelleconque, un script shell par exemple, sans préciser le chemin, la consultation de la variable PATH n'arrive qu'en dernier. Attention si vous disposez d'un alias ou d'une fonction qui porte le même nom, il traitera l'alias ou la fonction.

Pour terminer 2 commandes utiles pour savoir à quel type de commande vous avez à faire :


Index des commandes

heu... bon là j'en ai marre, on verra ça plus tard ! :-)

Je place quand même ici 2 commandes qui peuvent être bien utiles :

cal : donne le calendrier du mois courant,
cal 12 1999 : donne le calendrier de décembre 1999,
cal 2000 : donne le calendrier des 12 mois de l'an 2000.

factor 12456988 : donne la décomposition en produit de facteurs premiers du nombre 12456988 (soit  2 x 2 x 17 x 183191) - c'est très mathématique, mais ultra rapide et puissant.

Pour terminer cet article, je vous renvoie vers ce petit manuel de référence, qui contient l'ensemble des commandes usuelles :

Haut


Les permissions sur les fichiers

par Jean-Christophe

Dis Papa, c'est quoi rwxr-xr-x ? Tais-toi et nage !


Un peu de théorie

Dans ce chapitre, nous allons étudier les permissions sur les fichiers. Nous allons voir rapidement sur quoi la gestion des permissions se base.

Les utilisateurs et les groupes

Les fichiers appartiennent à un utilisateur à l'intérieur d'un groupe d'utilisateurs.

Les droits possibles : R, W et X

Les droits que l'on peut attribuer à un fichier concernent :

On peut attribuer ces droits pour :


Visualiser/modifier les permissions

Ligne de commande

En ligne de commande (voir la rubrique Shell), tapez :

[username@taz username]$ ls -la
total 144
drwxr-xr-x   18 username     users        2048 jan  7 19:22 .
drwxr-xr-x    7 root     root         1024 fév  6  1996 ..
-rw-------    1 username     users         147 jan  7 19:22 .Xauthority
-rw-r--r--    1 username     users        1899 jui 28 21:01 .Xdefaults
-rw-------    1 username     users        5860 jan  7 19:22 .bash_history
-rw-r--r--    1 username     users          24 jui 28 21:01 .bash_logout
-rw-r--r--    1 username     users         262 jui 29 18:15 .bash_profile
-rw-r--r--    1 username     users         434 jui 28 21:01 .bashrc
-rw-r--r--    1 username     users        2626 jui 28 21:01 .emacs
-rw-r--r--    1 username     users         532 jui 28 21:01 .inputrc
drwxr-xr-x    3 username     users        1024 jui 28 21:01 .kde
-rw-r--r--    1 username     users        1546 jan  7 19:04 .kderc
-rwxr-xr-x    1 username     users        1166 jui 28 21:01 .kderc.rpmorig

Pour une explication détaillée des différentes colonnes, voir la rubrique Shell. Nous n'allons ici nous intéresser qu'aux éléments relatifs aux permissions.

1. La première colonne -rw-r--r-- représente les permissions associées au fichier.
(le premier caractère est le type du fichier fichier : un d pour un répertoire, un l pour un lien, etc.)
Ensuite, on a trois groupes de trois caractères : rwx. La présence de la lettre r w ou x accorde la permission, un tiret '-' la dénie.

r signifie : possibilité de lire ce fichier / dans ce répertoire,
w signifie : possibilité d'écrire dans ce fichier / répertoire,
x signifie : possibilité d'exécuter ce fichier / d'aller dans ce répertoire.

Les trois groupes de caractère s'appliquent, dans l'ordre, à :

  1. l'utilisateur auquel appartient le fichier,

  2. le groupe d'utilisateurs auquel est rattaché le fichier,

  3. les autres utilisateurs.

- r w x r - x r - x
utili-
sateur
groupe autres

2. La 3ème colonne est l'utilisateur à qui appartient le fichier. À cet utilisateur s'appliquent les permissions représentées par les trois premiers caractères de permissions de la première colonne (-rwxr-xr-x).

3. La 4ème colonne est le groupe d'utilisateurs auquel appartient le fichier. A ce groupe s'appliquent les permissions représentées par le deuxième groupe de trois caractères de permissions de la première colonne (-rwxr-xr-x).

Exemples :
1. La ligne suivante :
drwxr-xr-x  18  username  users   2048 jan  7 19:22 .
signifie pour le répertoire '.' (le répertoire HOME de l'utilisateur username) que tout le monde a le droit de lire le contenu du répertoire (le dernier 'r'), et que tout le monde peut y accéder (le dernier 'x'). Par contre, seul l'utilisateur username peut y écrire (caractère 'w'), c'est à dire y créer des fichiers, les modifier ou les supprimer.

2. La ligne :
-rw-r-----   1  username  wwwadm  1728 jan  7 19:22 projet-www
signifie que seul 'username' et les utilisateurs du groupe 'wwwadm' peuvent lire ce fichier, que seule username peut le modifier, et que les autres utilisateurs n'ont aucun droit dessus (le dernier groupe de caractères '---').

Modification

Les droits : chmod

Il existe deux façon de changer les droits d'un fichier ou répertoire.

La propriété : chown

Les droits de propriétés sont très simples à modifier. Il suffit de donner le nom du nouveau possesseur (et éventuellement le nom du nouveau groupe) et le nom du fichier. Ainsi :

[username@localhost ~] $ chown username /chemin/vers/fichier

donne le fichier /chemin/vers/fichier à l'utilisateur 'username'. Et :

[username@localhost ~] $ chown username.groupe /chemin/vers/fichier

donne le fichier /chemin/vers/fichier à l'utilisateur 'username' et au groupe 'groupe'. Comme pour chmod le paramétre '-R' permet de rendre récursive l'application de la nouvelle propriété (i.e. répertoires et sous-répertoires).

Le groupe : chgrp

Le changement de groupe uniquement peut être obtenu par :

[username@localhost ~] $ chgrp groupe /chemin/vers/fichier

qui donne /chemin/vers/fichier au groupe 'groupe'. L'argument '-R' rend cette application récursive.

Interface graphique

Dans votre gestionnaire de fichiers préféré, sous KDE ou Gnome par exemple, vous pouvez consulter et modifier les permissions sur un fichier en affichant la boîte de dialogue "Propriétés" du fichier/répertoire (en général par un clic droit).

Pour aller plus loin ...

Il existe encore deux types de droits (en fait 3 mais le troisième est devenu obsolète) : 's' (SUID bit) et 'g' (SGID bit). Si l'on active le SUID bit d'un programme, il s'exécute sur le compte du possesseur du fichier (si c'est root, sur le compte de root, d'où un danger potentiel de sécurité). Si l'on active le SGID bit, c'est sur le compte de l'utilisateur normal, mais en tant que membre du groupe du fichier. Cela rend un fichier exécutable.
À ce propos consultez l'article SUID Scripts par Xavier GARREAU sur Léa.

Ces droits s'octroient de la même manière que les autres. Par exemple :

# chmod +s /usr/bin/xmms

fera en sorte que xmms puisse obtenir les privilèges de root (le fichier /usr/bin/xmms appartenant à root. Un ls -l sur le fichier donnera ensuite :

-rwsr-xr--    1 root     root      172812 dec  12 12:12 xmms

Dans ce cas particulier, cela permet à xmms d'obtenir une priorité temps réel qui peut être nécessaire pour un son parfait.

Haut


Lancer des commandes avec les droits de root

par Fred

Comment exécuter une commande avec les droits de root sans utiliser le suid-bit.


Introduction

Supposons que vous souhaitiez lancer la commande /sbin/halt, dans ce cas vous avez plusieurs possibilités :

  1. vous lancez la commande :

    su -c /sbin/halt

    qui vous demande le mot de passe root, on peut utiliser l'astuce suivante pour s'en affranchir :

    su -c /sbin/halt < root.pw

    root.pw contient le mot de passe du root, mais cela n'est pas très sûr (si quelqu'un de mal intentionné réussit à lire ce fichier la sécurité de votre système est compromise)

  2. vous pouvez activer le suid-bit (voir : SUID Scripts):

    chmod +s /sbin/halt

    (il faut être root pour pouvoir faire cela)
    et ensuite, n'importe quelle personne ayant les droits d'exécutions sur /sbin/halt peut lancer cette commande, mais ce n'est pas très pratique (la création de groupe de personne ayant de tels droits va être fastidieuse et, activer des suid-bit pour de multiples fichiers risque d'être encore plus pénible).

  3. vous pouvez utiliser sudo, c'est ce que nous allons voir dans la suite de ce document.

La commande sudo est presque toujours fournie avec votre distribution, mais n'est parfois pas installée automatiquement. Le paquetage doit s'appeler sudo-xxxxxx.

Exemples d'utilisation

Si sudo est correctement configuré, vous serez en mesure de taper des commandes de ce type :

sudo /sbin/halt

qui lance la commande /sbin/halt en tant que root (si l'utilisateur qui tape cette commande est autorisé à la lancer par sudo).

sudo -u fred /etc/ppp/scripts/pppconnect

qui lance la commande /etc/ppp/scripts/pppdisconnect en tant qu'utilisateur 'fred'.
Il faut savoir que chacune de ces commandes peut (ou peut ne pas) nous demander le mot de passe de l'utilisateur pour lequel nous voulons nous faire passer. Comme vous pouvez le constater c'est très simple à utiliser.
La commande sudo est beaucoup plus sophistiquée que cela, cette commande :

sudo su fred

peut être autorisée, alors que :

sudo su root
sudo su fred -c ls

ne le sont pas : c'est très souple à configurer.

Comment ça marche ?

Le plus complexe est de configurer correctement sudo. La configuration passe par l'édition du fichier /etc/sudoers (voir man sudoers). La syntaxe est relativement simple, mais la page de man n'est pas très claire pour un non anglophone. Normalement l'édition de ce fichier passe par l'utilitaire visudo qui vérifie la syntaxe de ce fichier. On peut (normalement, mais pas avec la Mandrake 8.0) utiliser l'éditeur que l'on veut en conjonction avec visudo en tapant :

EDITOR="/usr/bin/monediteur" visudo

Mais, contrairement à ce que prétend la documentation de sudo, il n'est pas obligatoire de passer par visudo pour éditer ce fichier, n'importe quel éditeur fera l'affaire, en tous cas avec la Mandrake 8.0.
Ces préliminaires étant dits, passons à :

La syntaxe.

Dans un premier temps nous devons définir des groupes d'utilisateurs qui auront tous les mêmes droits (cela n'est pas obligatoire, mais simplifie l'administration d'un système ayant beaucoup d'utilisateurs potentiels). Pour cela il suffit de mettre dans /etc/sudoers une ligne du type :

User_Alias    NOM_DU_GROUP = user1, user2, ... , usern

Exemples :

User_Alias    PPPUSERS = fred, bibi, jice, serge
User_Alias    HALTUSERS = fred, bibi
User_Alias    ROOT_FRIENDS = jice, serge, fred

Ensuite, nous allons avoir besoin de groupe de machines (dans le cas où vous comptez donner des droits à des utilisateurs qui sont connectés depuis divers endroits). La syntaxe est :

Host_Alias    NOM_DU_GROUP = host1, host2, ... , hostn

Exemples :

Host_Alias    ICI = localhost, 192.168.1.1, ma.machine.fr
Host_Alias    LABAS = www.tuxfamily.org, talk.revolink.com, 233.12.66.4
Host_Alias    WWW = www*, mail*, pop*, *fr

(Le groupe WWW contient toutes les machines dont les noms commencent par www, mail et pop ou finissent par fr).

Puis, il faut créer un groupe contenant les utilisateurs pour lesquels on souhaite se faire passer :

Runas_Alias    NOM_DU_GROUP = user1, ... , usern

Exemple :

Runsas_Alias    USERPPP = pppuser, serialuser

Enfin, on peut grouper les commandes que l'on va autoriser à exécuter pour le compte de quelqu'un d'autre :

Cmnd_Alias    NOM_DU_GROUP = cmd1, ... , cmdn

Exemples :

Cmnd_Alias    STOPPC = /sbin/halt, /sbin/reboot,  !/sbin/shutdown -*, /sbin/shutdown -r, /sbin/shutdown -h
Cmnd_Alias    PPPCMD = /etc/ppp/scripts/pppconnect, /etc/ppp/scripts/pppdisconnect

Cela regroupe les commandes /sbin/halt, /sbin/reboot et /sbin/shutdown mais uniquement si celui-ci est suivi de -r ou -h (halt ou reboot tout de suite) aucune autre option ne sera acceptée (c'est le ! qui veut dire 'pas' la commande décrite par /sbin/shutdown -* , ie: toute commande shutdown ayant une option).

Maintenant, donnons des droits par :

GROUPE_DE_USER    GROUPE_D_HOST = (GROUPE_DE_RUNAS)NOPASSWD: GROUPE_DE_COMMANDES

(Le NOPASSWD: est facultatif : il signifie que le mot de passe de l'utilisateur pour lequel on veut se faire passer ne sera pas demandé ; si (GROUP_DE_RUNAS) est omis c'est que l'on n'autorise qu'à se faire passer pour root).
Exemples :

fred    localhost = (ALL) ALL, (root) !ALL

signifie que fred peut lancer pour le compte de n'importe qui (premier ALL) n'importe quelle commande (second ALL), sauf qu'il ne peut lancer aucune commande pour le compte de root (!ALL). Mais cela n'est qu'un exemple n'utilisant pas les groupes; réparons cet oubli :

PPPUSERS    MONRESEAU = (USERPPP) NOPASSWD: /sbin/pppd, PPPCMD

tous les utilisateurs listés dans PPPUSERS, s'ils se connectent depuis une machine listée dans MONRESEAU, peuvent se faire passer pour un utilisateur listé dans USERPPP pour exécuter /sbin/ppp ou une commande listée dans PPPCMD.

john           ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*

L'utilisateur john peut lancer la commande su depuis une machine listée dans ALPHA mais pas su tout seul, ni su root ni su suivi d'un quelconque flag ( [!-]* ).

+secretaires    LOCALE = PRINTING_CMDS, /usr/sbin/adduser [A-z]*

un '+' devant un nom 'd'utilisateur' signifie qu'il faut considérer les personnes appartennant à ce groupe (au sens unix du terme : c'est à dire listées dans /etc/group), ici les personnes appartenant au groupe 'secretaires' (dans /etc/group, il y a une ligne : secretaire:xxxx:user1, user2,... ,usern : ce sont les utilisateurs user1 à usern qui sont considérés) ont droit de lancer les commandes du groupe PRINTINGCMDS ainsi que la commande /usr/sbin/adduser pourvu que celui-ci soit suivi d'un nom d'utilisateur.

Vous trouverez plus d'exemples dans man sudoers.

Mon /etc/sudoers

Voilà mon /etc/sudoers :

# sudoers file.
#
# Host alias specification
Host_Alias ICI = localhost
Host_Alias LOCALNET = 192.168.1.*

# User alias specification
User_Alias ROOT_FRIENDS = fred, bibi

# Cmnd alias specification
Cmnd_Alias SOUND = /usr/bin/xmms
Cmnd_Alias SHUTDOWN = /sbin/shutdown, \
                      /sbin/halt, \
                      /sbin/reboot
Cmnd_Alias PPPCMD = /etc/ppp/scripts/pppconnect, \
                    /etc/ppp/scripts/pppdisconnect
Cmnd_Alias PRINTINGCMDS = /usr/bin/lpq, \
 /usr/bin/lprm
# Runas alias specification
# User privilege specification
# root peut tout !
root ALL=(ALL) ALL
# Les amis de root peuvent lancer les commandes
# du groupe SHUTDOWN
ROOT_FRIENDS ICI = NOPASSWD: SHUTDOWN
# ils peuvent aussi administrer l'imprimante (mais sous
# le compte de lpadmin, avec un mot de passe) :
ROOT_FRIENDS ICI = PRINTINGCMDS
# tout le monde peux lancer xmms avec les droit de root (pour le
# mode 'temps réel') en local
ALL ICI = NOPASSWD: SOUND
# tout le monde sur le réseau local peut demander l'établisement
# de la liaison internet
ALL LOCALNET = NOPASSWD: PPPCMD
 

Il n'est pas très complexe, mais permet d'éviter de mettre des programmes suid (c'est toujours dangereux) !

Vérification de /etc/sudoers.

Pour éditer /etc/sudoers le programme approprié est visudo (en fait c'est vi, emballé dans un programme pour vérifier la syntaxe du fichier. Mais, souvant vous préférerez éditer ce fichier avec votre éditeur préféré. Seulement, comment voir si la syntaxe de ce fichier est correcte ? C'est simple, après avoir modifié /etc/sudoers, tapez :

sudo -v

Si rien ne s'affiche : il est correcte, sinon vous obtiendrez quelque chose comme :

>>> sudoers file: syntax error, line 18 <<<
sudo: parse error in /etc/sudoers near line 18

Voilà, vous savez tout, enfin presque. ;-)

Haut


Associer un type de fichier avec un exécutable

par Fred

Pour faire aussi bien que Windows, mais en utilisant une méthode qui nous laisse le contrôle de tout le processus d'exécution, et en utilisant le principe des droits d'exécution cher aux systèmes Un*x.


Un problème : associer un type de fichiers avec une application

Le problème est le suivant : sur un système Un*x, l'exécution d'un programme repose sur les permissions (j'aime mieux dire droits) d'exécution. Mais les environnements actuels autorisent à gérer comme des exécutables du système, des fichiers de données, via une association. Le problème est que tous ces environnements n'utilisent pas, loin s'en faut, le même système d'association. Pour l'administrateur c'est un casse-tête chinois : il faut créer les associations pour KDE, les recréer pour Gnome, et ainsi de suite.

La solution : binfmt

La solution parait, somme toute, évidente : faire en sorte que tel fichier soit considéré par le système comme un exécutable standard. Pour cela il faut faire en sorte que le noyau de Linux soit capable de reconnaître de nouveaux exécutables.

 Pour cela il faut recompiler le noyau avec l'option : [Kernel support MISC binaries] activée (dans le noyau lui même c'est plus simple, mais pas obligatoire : vous pouvez aussi utiliser un module). Cette étape pénible mais nécessaire accomplie, on relance le noyau (autrement dit on reboote... sauf si vous avez compilé cette option en tant que module auquel cas il vous suffit de charger le dit module à grand coup de modprobe binfmt_misc).

 On peut vérifier que tout va bien en faisant :

[user@becane ~]$ cat /proc/sys/fs/binfmt_misc/status
enabled

Si vous obtenez un message d'erreur c'est que vous n'avez pas chargé le module, ou que vous n'avez pas booté sur le bon noyau. Réparez votre erreur et tout devrait rentrer dans l'ordre.

 Maintenant, supposons que vous souhaitiez à l'invocation d'un fichier .txt lancer automatiquement la commande less <le-dit-fichier>.txt. Eh bien, ce n'est pas très compliqué : il suffit maintenant de le dire au noyau par la commande (sur une seule ligne) :

[user@becane ~]$ echo ":format-txt:E::txt::/usr/bin/less:" > /proc/sys/fs/binfmt_misc/register

Attention : tous les <:> sont significatifs. On peut vérifier que tout à fonctionné comme prévu :

[user@becane ~]$ cat /proc/sys/fs/binfmt_misc/format-txt
enabled
interpreter /usr/bin/less
extension .txt

Tout message d'erreur est anormal (vérifier que vous tapez bien tout comme c'est indiqué). Il ne reste plus qu'à marquer comme exécutable un fichier .txt par une commande du type :

[user@becane ~]$ chmod a+x readme.txt

Pour «l'exécuter» il suffit maintenant, soit de cliquer dessus, soit de taper :

[user@becane ~]$ ./readme.txt

de la même façon que si c'était un exécutable. Pour rendre exécutable n'importe quel fichier .txt il suffit maintenant le marquer comme exécutable pour le système et tous vos gestionnaires de programmes quels qu'ils soient pourront les exécuter en cliquant simplement dessus.

En utilisant la même même méthode vous pouvez rendre exécutable vos images, vos fichiers de paquetages (.rpm) etc.

évidemment, il y a un petit problème : quand vous redémarrerez Linux (ce qui n'arrive que très rarement ;) toutes ces belles associations seront perdues, et il faudra les retaper à la main...

Une automatisation possible

Une solution pourrait être de mettre dans un script appelé au démarrage de Linux toutes les commandes qu'il faut pour activer ces associations. Cette solution n'est pas très souple, et nécessite de modifier un script pour chaque ajout que nous ne manquerons pas de vouloir faire. Nous retiendrons plutôt la solution d'un fichier de configuration dans /etc et d'un script un peu plus général.

Le script

Sauvez ce script sous /usr/sbin/binfmt

#!/bin/sh
if [ ! -e /etc/binfmt.conf ] ; then
        echo -n "Pas de fichier /etc/binfmt.conf,"
        echo "je n\'ai rien à faire."
        exit 0
else
        echo /etc/binfmt.conf trouvé
fi

if [ -x /sbin/modprobe ] 
   && [ ! -d /proc/sys/fs/binfmt_misc ] ; then
        echo chargement du module binfmt_misc
        /sbin/modprobe binfmt_misc ;
fi

if [ -d /proc/sys/fs/binfmt_misc ] ; then
        echo module binfmt_misc chargé

        echo -n "Effacement des associations précédentes : "
        for i in `ls /proc/sys/fs/binfmt_misc/* \
                  | grep -v -e "/status"        \
                  | grep -v -e "/register"` ; do
                echo -n "$i, "
                echo -1 > $i
        done
        echo

        for i in `cat /etc/binfmt.conf          \
                  | grep -v -e "^[\t ]*#.*"` ; do
                echo $i |    \
                  awk -F':'  \
                      '{print ("Les extensions [",$5,"] \
                      sont associées à : [",$7,"].") ; }'
                echo $i > /proc/sys/fs/binfmt_misc/register
        done

else
        echo -n "Impossible de charger le modules binfmt_misc. "
        echo -n "êtes-vous root ? "
        echo "Avez-vous compilé le noyau avec binfmt_misc activé ?"
        exit 1
fi

Explications :

Le script lit une par une les lignes du fichier /etc/binfmt.conf en rejetant les lignes commençant par un <#>, et envoie celles-ci directement dans /proc/sys/fs/binfmt_misc/register. Il nous faut donc un fichier de configuration.

Le fichier de configuration

Ce qui suit est un exemple de fichier de configuration à sauver dans /etc/binfmt.conf. Adaptez-le à vos programmes préférés.

#!/etc/binfmt.conf
# pour en savoir plus sur le format des lignes de configuration
# que l'on peut envoyer a /proc/sys/fs/binfmt_misc/register
# lire /usr/src/linux/Documentation/binfmt_misc.txt

# on associe les .pdf à acrobat reader
:pdf-acrobat:E::pdf::/opt/acrobat/bin/acroread:

# on associe les .png et .gif à ElectricEyes
:png-gimp:E::png::/opt/gnome/bin/ee:
:gif-gimp:E::gif::/opt/gnome/bin/ee:

# on associe les .rpm à kpackage
:rpm-kpackage:E::rpm::/usr/bin/kpackage:

# on associe les .txt et .doc à gless
:txt-gless:E::txt::/opt/gnome/bin/gless:
:doc-gless:E::doc::/opt/gnome/bin/gless:

Il ne reste plus qu'à ajouter la ligne : /usr/sbin/binfmt au fichier /etc/rc.d/rc.sysinit (sur une Mandrake/Red Had, ou dans le rc.local par exemple) pour que nos associations soient chargées à chaque démarrage de Linux.

Conclusion

Pour parfaire la configuration de votre boîte Linux, vous n'avez plus qu'à mettre dans /etc/binfmt.conf toutes les associations que vous souhaitez. Elles seront reconnues par tous les gestionnaires de fichiers du monde Linux sans aucun travail supplémentaire. On pourrait créer un utilitaire plus fenêtré que celui que j'ai fourni, qui serait capable de d'ajouter au vol des associations. Mais cela pas dans une optique d'administration d'un système, plus dans celui d'une machine utilisée par quelques personnes qui ne voudraient pas avoir tous les même associations.

Et n'oubliez pas de marquer comme exécutable la plupart des fichiers que vous aurez associés. C'est le cas par défaut des fichiers qui sont sur des partitions vfat et souvent iso9660.

Note de Jean-Christophe :
Vous pouvez aussi utiliser la commande umask : cette commande permet de choisir le mode par défaut associé à chaque nouveau fichier d'un utilisateur. En ajoutant dans votre $HOME/.bashrc la ligne umask mode (où mode est une combinaison de chiffres octaux ou de 'r', 'w' et 'x' comme pour chmod (voir rubrique Shell et Permissions)), tous vos nouveaux fichiers auront ce mode par défaut.

Haut


Configuration de LILO : LInux LOader (le chargeur de Linux)

par Fred

Entrez dans le monde fantastique des détails de configuration du premier programme chargé par votre PC.


Qu'est-ce que LILO.

LILO est un chargeur de systèmes d'exploitation spécialement conçu pour démarrer Linux, mais ses capacités sont bien plus grandes : il est capable de démarrer presque tout type de système d'exploitation. C'est grâce à lui que vous pourrez, si le coeur vous en dit, autoriser le MULTI BOOT (le démarrage potentiel de plusieurs systèmes d'exploitation sur votre PC), mettre un mot de passe, démarrer automatiquement après un certain temps, etc... Il faut savoir que LILO fonctionnant à un très bas niveau, il est spécifique à l'architecture x86 (que pour les PC !, pas les Mac (qui utilisent yaboot), pas les Alpha (qui utilisent MILO), etc...).

LILO autorise à passer des arguments au système d'exploitation que vous souhaitez démarrer (pour modifier son comportement par défaut). Il autorise à choisir la résolution de démarrage du système d'exploitation, etc.

Mais comment ça marche ?

Ce n'est pas très compliqué à comprendre. Lorsque votre PC démarre (ou en tout cas peu après) le BIOS essaie de trouver un système d'exploitation sur l'un des périphériques sur lesquels il est autorisé à démarrer (on dit BOOTER, à ne pas confondre avec il faut bouter l'anglais hors de france...) : en général un disque dur. Pour ce faire il lit ce que l'on appelle le MASTER BOOT RECORD (le secteur de boot maitre... ou secteur de démarrage ou encore MBR ; c'est le tout premier secteur du périphérique de démarrage, il fait 512 octets de long).
LILO peut jouer le role de MBR mais ce n'est pas obligé, dans le cas du MBR par défaut (celui installé par DOS...), le processus de démarrage recherche une partition marquée comme ACTIVE et lance le programme qui se trouve au debut de la dite partition (dans le secteur de boot de cette partition), LILO peut aussi se trouver à cet endroit, mais aussi le chargeur de NT ou celui de DOS ou celui de n'importe quel système d'exploitation.

Donc, après le chargement du MBR en mémoire, le BIOS lance l'exécution de celui-ci. Le MBR étant très petit (512 octets), cela ne suffit pas pour faire tenir le noyau de Linux (500 Ko mini), ni le chargeur lui-même (la deuxième partie de LILO fait environ 5 Ko). Si le MBR est celui de LILO, il lance la deuxième partie de LILO, sinon, il lance le MBR de LILO qui se trouve sur la partition active. Celui-ci lance à son tour la deuxième partie de LILO.
Bref, nous voilà dans la deuxième partie de LILO. C'est elle qui affiche le prompt "boot:", le menu de démarrage de LILO, etc. et qui va enfin charger et lancer le noyau de Linux et lui passer la main.

LILO est donc un chargeur de système d'exploitation (dédié surtout à Linux) mais aussi un programme de MASTER BOOT RECORD. C'est aussi le programme /sbin/lilo, qui installe le MBR de LILO.

Restauration du MBR.

Le MBR est donc vital pour le fonctionnement de votre PC. Voyons d'abord comment, en cas ce problème, restaurer le MBR par défaut de votre PC. Il suffit de booter avec une disquette DOS (FreeDOS fait très bien l'affaire) contenant FDISK.EXE. On boote avec cette disquette et à l'invite on tape :

A:\>FDISK /MBR

Voilà, votre MBR est celui par défaut du DOS.

Ou depuis Linux :

lilo -U

Cette commande désinstalle LILO en copiant dans le MBR la copie de sauvegarde que LILO a faite lors de sa première installation.

Un exemple de fichier de configuration de base.

Voilà un fichier de configuration de LILO (/etc/lilo.conf) typique :

boot=/dev/hda
prompt
other=/dev/hda1
        label=windows
        table=/dev/hda
image=/boot/vmlinuz-2.2.14
        label=linux
        root=/dev/hda2
        read-only

Voyons ces premières lignes pour comprendre un peu ce que ça veut dire.

Mise en place de LILO.

Bon, maintenant que nous avons vu un fichier de configuration (simplissime), il s'agit d'installer LILO. Cela ne peut pas être plus simple, il suffit de taper (en étant root, l'installation d'un nouveau MBR n'est pas à laisser entre toutes les mains) :

[root@xwing home]# lilo
Added windows *
Added linux

LILO nous signale que deux systèmes ont été ajoutés avec succès : windows qui est le système qui sera booté par défaut (l'astérisque nous le signale) et linux.

Remarque 1 : (obsolète, conservé pour l'historique)
Vous pouvez, si vous avez un gros disque dur obtenir quelque chose du genre :

[root@xwing home]# lilo
Added windows *
Warning: device 0x0303 exceeds 1024 cylinder limit
Fatal: geo_comp_addr: Cylinder number is too big (1101 > 1023)

Cela signifie que :
  1. vous devez installer une version récente de LILO (postérieure à 21.4.2) qui supporte de démarrer une image qui se trouve après le 1024ème cylindre.
  2. vous devez ajouter la ligne :

    lba32

    avant la première section image ou other du fichier de configuration /etc/lilo.conf pour que LILO puisse activer un noyau linux qui se trouve après le 1024ème cylindre (il faut pour cela que votre BIOS soit relativement récent : postérieur à 1998)
  3. ou alors, il faut que vous copiiez votre noyau (/boot/vmlinuz-2.2.14) avant le 1024ème cylindre : par exemple sur le disque windows dans le cas précédent, et que vous montiez CE disque avant de lancer LILO. Cette solution est la seule qui soit à votre disposition si vous installez une distribution depuis un CD qui ne possède pas un LILO à jour (toutes les distributions récentes sont à jour).

Remarque 2 :
Vous pouvez lancer LILO autant de fois que vous voulez. En conséquence, au moindre doute sur le fait que votre configuration de LILO soit à jour, n'hésitez jamais à relancer LILO (par exemple si vous utilisez, bien que cela ne soit pas très utilisé sur une partition ext2, un défragmenteur de disque pour Linux, relancez LILO à la fin de son travail car celui-ci aura sans aucun doute modifié la place de vos noyaux).

Ajouter un second noyau.

Pour ajouter un second noyau, c'est enfantin, il suffit de recopier la section :

image=/boot/vmlinuz-2.2.14
        label=linux
        root=/dev/hda2
        read-only

du fichier /etc/lilo.conf une deuxième fois en faisant en sorte de changer le label (évidemment sinon comment voulez vous pouvoir dire à LILO quel noyau vous chargez) et d'adapter le nom du noyau à celui que vous voulez charger.

Si, par exemple, vous désirez tester le tout nouveau noyau vmlinuz-2.4.0 ;-) il suffit de modifier /etc/lilo.conf pour qu'il devienne :

boot=/dev/hda
prompt
other=/dev/hda1
        label=windows
        table=/dev/hda
image=/boot/vmlinuz-2.2.14
        label=linux
        root=/dev/hda2
        read-only
image=/boot/vmlinuz-2.4.0
        label=linux24
        root=/dev/hda2
        read-only

et de relancer la commande lilo. Vous pouver avoir jusqu'a 16 systèmes d'exploitation lancé par lilo.

Un conseil : n'enlevez jamais l'entrée image que votre distribution a installée par défaut, de cette façon, même si vous avez un problème avec un nouveau noyau, rien ne vous empêchera de démarrer avec un ancien noyau dont vous savez qu'il fonctionne parfaitement.


Les options de lilo.conf.

Comment faire pour que LILO s'adapte très précisément à ce que nous voulons ? La réponse : les options de lilo.conf permettent, sinon de faire tout ce que l'on souhaiterait, du moins de modifier son comportement de manière très précise :

Default

Vous souhaitez choisir l'image qui sera bootée par défaut par LILO, mais vous ne souhaitez pas devoir modifier l'ordre des section de /etc/lilo.conf ? C'est simple il suffit d'ajouter, avant la première section image ou other, une ligne :

default=<label>

ou <label> est le label d'une section image ou other que vous souhaitez booter par défaut.

Timeout

Si vous souhaitez que LILO démarre automatiquement (sans confirmation) au bout de 2,5 secondes, c'est très simple précisez, avant la première section image ou other :

timeout=<valeur>

ou <valeur> est le nombre de millisecondes après lequel LILO doit démarrer automatiquement.

Si vous mettez 0 comme timeout, vous ne pourrez alors plus modifier la ligne de commande du kernel et ainsi empêcher de modifier (par exemple) la variable init.

VGA

Vous aimeriez que Linux démarre automatiquement avec une résolution différente des 80x25 habituels car cela vous ennuie d'avoir un écran de 21 pouces, mais d'être incapable de lire les messages du noyau ? Utilisez l'option vga :

vga=extended

ou :

vga=ext

pour utilisez le mode 80x50,

vga=ask

pour que LILO vous demande au démarage de choisir la résolution

vga=<nombre>

pour utiliser le mode <nombre> pour résolution. (Utilisez vga=ask avant pour savoir quels sont les modes disponibles...)

Vous pouvez utiliser une option vga différente pour chaque section image, ou une seule globale.

Voici une liste de mode courant que vous pourrez utiliser :


640x480 800x600 1024x768 1280x1024
8 bits vga=769 vga=771 vga=773 vga=775
16 bits vga=785 vga=788 vga=791 vga=794
32 bits vga=786 vga=789 vga=792 vga=795

Merci à Ovh du forum

Message

Vous trouvez que l'invite de LILO est pour le moins spartiate ? Utilisez l'option message :

message=<nom-de-fichier-complet>

ou <nom-de-fichier-complet> est un fichier texte pur (sans rien d'autre) qui devra servir d'invite.

Note : l'invite habituelle "boot :"  apparaîtra juste après le dernier caractère de votre fichier.

Note : voir lilomsg.pl.

Password

C'est bien joli, de pouvoir démarrer 16 noyaux différents, mais certains d'entre-eux ne doivent pas être démarrés sans la présence de l'administrateur ? Qu'à cela ne tienne, vous n'avez qu'à mettre un mot de passe !

password=<mot-de-passe>

ou <mot-de-passe> est un mot de passe en clair et tenant compte des différences majuscule/minuscule. Comme le mot de passe est en clair dans le fichier de configuration de LILO il faut que /etc/lilo.conf ne soit lisible que par l'administrateur. Ce qui n'est pas le cas par défaut.
Dans ce cas, n'oubliez donc pas de faire un :

[root@xwing home]# chown root:root /etc/lilo.conf
[root@xwing home]# chmod 600 /etc/lilo.conf

Configuration avancée.

LILO et MBR

Nous avons vu que l'option install de /etc/lilo.conf permet de choisir sur quel disque LILO doit être installé en tant que MASTER BOOT RECORD, mais cette option ne sert pas qu'à cela. On peut avec cette option faire en sorte que LILO ne touche pas à notre MBR (soit parce qu'on ne lui fait pas confiance, soit parce que LILO n'est pas capable de démarrer correctement tel ou tel système d'exploitation - je crois savoir que c'est le cas de OS/2 pour certaines versions. Dans ce cas on ne va pas préciser un disque comme /dev/hda comme option install, mais plutôt une partition comme /dev/hda2 ! Bien sur pour que le MBR original puisse démarrer sur cette partition, celle-ci doit être marquée active par fdisk !

Exemple : supposons que vous ayez Windows sur la partition /dev/hda1 et la racine de votre installation Linux sur /dev/hda2. Vous avez deux solutions pour le multiboot : soit vous laissez le MBR par défaut (option la moins dangeureuse pour Windows), soit vous installez LILO en tant que MBR.

Si vous choisissez de ne pas installez LILO comme MBR, la  directive install est :

install=/dev/hda2

et vous devez marquer comme active cette partition avec fdisk. Pour changer de système actif au boot vous devez utiliser fdisk, ou mettre une clause other pour démarrer Windows sur /dev/hda1 et laisser /dev/hda2 active (je vous recommande cette dernière option, qui fonctionne dès que votre racine Linux n'est pas sur une partition étendue).

Si vous choisissez d'installez LILO comme MBR, la directive install devient :

install=/dev/hda

(notez l'absence de numéro dans /dev/hda, cela signifie que l'on désigne un disque et non plus une partition particulière). Si vous souhaitez booter Windows il faut ajouter une clause other dans /etc/lilo.conf et relancer LILO.

Disque virtuel initial (INITial Ram Disk : initrd)

Vous avez sans doute remarqué que votre distribution utilise un fichier en complément du noyau, fichier nommé initrd. Ce fichier est en fait "une image de disque" contenant le plus souvent les modules que vous souhaitez rendre utilisable dès le démarrage de votre noyau (avant le montage de la racine) par exemple parce que vous utilisez un disque dur SCSI dont le driver n'est disponible qu'en module, ou bien vous avez mis le support IDE ou ext2 en module, ou toute autre raison qui vous est personnelle. Pour cela il faut savoir créer un tel fichier initrd. C'est très simple : supposons que vous ayez compilé un noyau 2.2.15 et que les modules soient installés (ce sera le cas par défaut) dans /lib/modules/2.2.15 la commande à lancer pour créer un tel disque virtuel initial est :

mkinitrd /boot/initrd-2.2.15.img 2.2.15

et c'est tout. Maintenant vous avez dans /boot un fichier nommé initrd-2.2.15.img qui contient tous les modules de /lib/modules/2.2.15 (en fait même l'arborescence est conservée). Comment dire à LILO (c'est ce qui nous intéresse ici) de charger cet initrd ? C'est encore très simple, il suffit d'ajouter la ligne :

initrd=/boot/initrd-2.2.15.img

à /etc/lilo.conf dans la section image correspondante (celle qui charge ce noyau 2.2.15). N'oubliez pas de relancer la commande lilo après cette modification.

Passer des paramètres au noyau Linux.

Il peut être intéressant, voire vital, de passer des paramètres au noyau de Linux pour modifier son comportement par défaut. Pour cela vous avez deux solutions :
Par la ligne de commande de LILO
Au moment du démarrage de LILO vous avez dû remarquer l'invite : "boot :" , c'est en fait une invite pour choisir quelle section de /etc/lilo.conf démarrer. Mais c'est aussi une invite pour passer des paramètres au noyau. Supposons (voir le BootPrompt-HOWTO) que vous désiriez passer au noyau linux2214 le paramètre ram=128 (en vue de signifier au noyau que vous avez 128Mo de Ram), alors à l'invite il faut taper :

boot: linux2214 ram=128

et voilà, ce n'est pas la mer à boire.
De même, si vous voulez démarrer en mode texte (runlevel 3), parce que X est momentanément hors service par exemple, tapez :

boot: linux2214 3

Dans /etc/lilo.conf
On peut aussi faire en sorte qu'une image soit toujours chargée avec les mêmes paramètres passés au noyau sans être obligé de les taper à chaque fois. C'est simple il faut les préciser au paramétre append, par exemple ajoutez la ligne suivante comme option d'une image particulière :

append="3"

pour forcer cette image à démarrer en mode texte plutot qu'en mode graphique.

Clavier AZERTY.

C'est bien de pouvoir choisir l'image au démarage, mais si vous avez mis windows comme label pour l'une d'elle, vous avez dû remarquer que vous êtes obligés de taper zindozs pour la sélectionner ! C'est pénible ! La solution est simple c'est le paramètre keytable qui permet de choisir une table de translation des touches tapées.
  1. il faut générer cette table par la commande :

    keytab-lilo.pl /usr/lib/kbd/keymaps/i386/qwerty/us.kmap.gz \
        /usr/lib/kbd/keymaps/i386/azerty/fr-latin1.kmap.gz \
        > /boot/fr-latin1.ktl


    (normalement il devrait suffir de passer seulement fr-latin1 au script mais chez moi ça ne marche pas à cause de la compression de ces tables avec la Mandrake) qui génère les conversions du clavier fr-latin1 vers us et stocke la table dans /boot/fr-latin1.klt.
  2. il faut ajouter la ligne suivant à /etc/lilo.conf :

    keytable /boot/fr-latin1.ktl

puis n'oubliez pas de relancer LILO.

Rebooter une configuration spécifique.

Si (et seulement si !) vous avez utilisé un timeout de 0, vous vous demandez sans doute comment rebooter sous (horreur!) windows, c'est simple, tapez :
lilo -R windows
reboot
et c'est tout ! Ceci permet par exemple de ne pas autoriser de choix au boot de LILO, mais uniquement après, pour bénéficier de la sécurité de Linux (n'oubliez pas dans ce cas de supprimer les lecteurs de disquette et de CDROM de votre PC ;).

Annexes.

Numérotation des disques avec LILO et Linux.

Avec Linux (et LILO) les disques ne sont pas repérés par une lettre (i.e. C: , D: etc...) mais par un nom. Ces noms reflètent très exactement votre configuration. Les disques qui sont branchés sur une nappe IDE (ou ATA, Ultra ATA etc...) sont numérotés de la manière suivante :
  1. le disque maître de la nappe 1 est nommé : /dev/hda
  2. le disque esclave de la nappe 1 est nommé : /dev/hdb
  3. le disque maître de la nappe 2 est nommé : /dev/hdc
  4. le disque esclave de la nappe 2 est nommé : /dev/hdd
  5. etc... pour les nappes IDE suivantes.
Pour les disques SCSI le principe est le même, sauf que là, il n'y a pas désignation de maître ou d'esclave, donc :
  1. le premier disque SCSI du premier controleur scsi est : /dev/sda
  2. le second disque SCSI du premier controleur (ou le premier disque du second contrôleur s'il n'y a qu'un disque sur le premier contrôleur) est : /dev/sdb
  3. etc... pour les disques suivants.
Pour les autres types de disque, le principe est le même.

Le système de partitionnement retenu n'autorise que 4 partitions principales (a priori ce sont les seules bootables avec le MBR par défaut) dont l'une peut être une partition dite étendue qui peut contenir des partitions secondaires. Au maximun vous pouvez avoir 16 partitions sur un disque IDE et 7 sur un disque SCSI. Les quatre partitions principales (que les quatre soient là ou pas) se nomment : /dev/$$$1 /dev/$$$2 /dev/$$$3 et /dev/$$$4 où $$$ est le nom du disque sur lequel se trouve la partition. Les partitions secondaires sont numérotées à partir de 5 de la même façon.

Numérotation des disques avec LILO et Linux (version devfs).

A partir des noyaux 2.4.x, linux peut utiliser devfs (ce qui limite le nombre d'entrées dans /dev). Le problème, c'est qu'alors la numérotation des disques change (même si un systéme de compatibilité est parfois présent sur les distributions).

Les disques scsi sont dans /dev/scsi et les disques ide(ou atapi) sont dans /dev/ide. Ce sont (lorsque qu'ils sont présents) tous les deux des répertoires. Chacun de ces répertoires contient un sous répertoire par controleur de ce type, numéroté : host0, host1, ... hostn. En général vous ne possédez qu'un seul controleur de chaque type (si vous avez les deux types...), et donc chacun de ces répertoire ne contient qu'un seul répertoire host0.

Chaque répertoire /dev/(ide|scsi)/hostn/, contient une ou plusieurs entrées (qui sont des répertoires) : busn. Chaque entrée correspond à un "canal" de communication (pour les périphériques ide, elles correspondent soit au controleur primaire (bus0) soit au controleur secondaire (bus1); pour les périphériques scsi chaque bus correspond à un canal (chanel) scsi), en général vous aurez l'arboressence suivante :

+/dev
+-+ ide/
| +-+ host0/
| +-+ bus0/ (controleur ide primaire)
| | +-+ ...
| +-+ bus1/ (controleur ide secondaire)
| +-+ ...
+-+ scsi/
+-+ host0/
+-+ bus0/ (premier controleur scsi, premier canal
+-+ ...

Chacun des busn contient la liste des périphériques (disque dur, cdrom, graveur, zip, etc...). Chaque disque est numéroté : targetn, en commençant par n = 0. Par exemple, le disque esclave (target1) sur la première nappe ide (bus0) du premier contrôleur ide (host0) s'appelle : /dev/ide/host0/bus0/target1/.

Chaque périphérique peut contenir plusieurs disques (par exemple un jukebox peut contenir 5 cdroms), ils sont repérés par un "lun" différent, pour un disque dur, on aura donc toujours lun0, et ce sera presque toujours le cas pour les autres types de périphérique. Donc, dans l'exemple précédant, on accédera au disque par : /dev/ide/host0/bus0/target1/lun0.

Pour les disques durs, chaque lun contient un fichier nommé disc (vers lequel un lien est mis dans /dev/discs) qui correspond au périphérique lui-même, et un fichier partn par partition de ce disque. Donc, dans l'exemple précédant, le disque lui-même s'appelle : /dev/ide/host0/bus0/target1disc/, et la première partition s'appelle : /dev/ide/host0/bus0/target1/part1.

Pour les cdrom, le lun contient un unique fichier nommé cd, un cdrom s'appellera par exemple /dev/ide/host0/bus1/target1/lun0/cd.

Mieux vaut prévenir que guérir.

Pour être sûr de pouvoir toujours booter Linux (même après une corruption de votre MBR), je vous conseille de copier votre dernier noyau à jour ainsi que l'initrd correspondant dans un répertoire de votre partition Windows (si vous en avez une ;). ainsi que loadlin.exe. Ainsi en cas de problème, vous pouvez booter sur votre partition Windows et lancer votre Linux par :

C:\LINUX> loadlin vmlinuz-2.2.15 root=/dev/hda2 initrd=initrd-2.2.15.img

Pensez aussi à vous créer un disquette de boot contenant le noyau par :

[root@becane boot]# dd if=vmlinuz-2.2.15 of=/dev/fd0 bs=1k

Attention cette façon de faire permet juste de booter si le reste du système n'est pas planté ! Car cette disquette de boot ne contient pas de système de fichier, seulement un noyau qui suppose que la racine est votre installation de Linux, elle ne fonctionnera pas forcément sur une autre machine. Pour ce qui est des disquettes de secours contenant de quoi remettre votre système en ordre, je vous conseille de voir du côté de :

tomsrtbt : une distribution linux contenant un maximun d'utilitaires pour réparer une installation qui a planté.
muLinux : une autre distribution Linux minimale tenant sur une disquette.
Il y en a beaucoup d'autres (chacune remplissant une fonctionnalité particulière).

Plusieurs Linux

Pour installer plusieurs distributions Linux et proposer le choix au démarrage de LILO, c'est assez technique. Je vais exposer un cas particulier. La configuration est la suivante :

J'ai donc deux /etc/fstab : un dans /dev/hda1 et un dans /dev/hda2. Depuis la Mandrake, ils s'appellent respectivement : /etc/fstab et /mnt/gentoo/etc/fstab. Depuis la Gentoo, ils s'appellent respectivement : /mnt/mdk/etc/fstab et /etc/fstab.

J'ai aussi deux kernels Linux : un pour la Mandrake (depuis la Mandrake:/boot/vmlinuz-2.4.18-6mdk ou depuis la Gentoo:/mnt/mandrake/boot/vmlinuz-2.4.18-6mdk), et un pour la Gentoo (depuis la Mandrake:/mnt/gentoo/vmlinuz-2.4.18 ou depuis la Gentoo:/boot/vmlinuz-2.4.18)

De la même façon j'ai deux /etc/lilo.conf. Il convient de les synchroniser. C'est à dire de mettre les mêmes sections "image" dans les deux.

Voici le /etc/lilo.conf de la Mandrake (ie: /etc/lilo.conf depuis la Mandrake, /mnt/mdk/etc/lilo.conf depuis la Gentoo) :

boot=/dev/hda
prompt
image=/boot/vmlinuz-2.2.18-6mdk
label=mandrake
root=/dev/hda1
read-only
image=/mnt/gentoo/boot/vmlinuz-2.4.0
label=gentoo
root=/dev/hda2
read-only

Voici le /etc/lilo.conf de la Gentoo (ie: /mnt/gentoo/etc/lilo.conf depuis la Mandrake, /etc/lilo.conf depuis la Gentoo) :

boot=/dev/hda
prompt
image=/mnt/mdk/boot/vmlinuz-2.2.18-6mdk
label=mandrake
root=/dev/hda1
read-only
image=/boot/vmlinuz-2.4.0
label=gentoo
root=/dev/hda2
read-only

Maintenant en tapant lilo depuis l'une ou l'autre des deux distributions vous installez le lilo de cette distribution mais qui tient compte de l'autre.

Le procédé est le même pour installer plus deux deux Linux.

On peut même activer le lilo de la Mandrake depuis la Gentoo, en utilisant chroot :

[root@gentoo ~] # chroot /mnt/mdk
[root@gentoo /] # lilo
Added mandrake *
Added gentoo
[root@gentoo /] # exit
[root@gentoo ~] # _

Bien sûr, on peut procéder de même pour installer le Lilo de la Gentoo depuis la Mandrake.


 

Bonus : lilomsg.pl (obsolète).

Cette section est maintenant largement obsolète, car les distributions modernes ont de très jolis menus de démarrage, souvent graphiques. Mais comme elle a une portée pédagogique, elle est conservée.

Voici en bonus un script qui lit les fichiers /etc/lilo.conf et /boot/message.modele et génère un fichier /boot/message (que vous pouvez ajouter à LILO via l'option message=/boot/message). L'idée est la suivante : l'invite de LILO n'est pas très sympatique car elle ne précise pas les images bootables via lilo (à moins de presser pas la touche de tabulation). Le script suivant permet celà.

Le script.

#!/usr/bin/perl

# utilisation : lilomsg.pl
#
# lit les fichiers /etc/lilo.conf et /boot/message.modele pour
# créer un fichier /etc/message en vue de l'utiliser depuis la
# commande message=/boot/message de lilo

# dans le fichier /boot/message.modele on peut trouver les
# commandes suivantes (le caractère "$" est significatif) :

# $iftimeout{chaine de caractère} :
# la "chaine de caractère" ne sera affichée que s'il existe
# un timeout dans /etc/lilo.conf

# $timeout :
# la valeur du timeout de /etc/lilo.conf en secondes
# (dans /etc/lilo.conf elle est en milisecondes)

# $config :
# les entrées (label) triées de /etc/lilo.conf
# ce qui se trouve avant et après $config sur la ligne est
# recopié pour chaque entrée à la meme place, cela permet d'avoir
# des "puces"

# $border{$type chaine de caractère}
# la "chaine de caractère" est affichée avec une bordure autour
# d'elle. $type est soit : $0, $1, $2 ... $7 ou rien
#
# $0 : bordure simple
# $1 : bordure double
# $2 : bordure horizontale double, verticale simple
# $3 : bordure horizontale simple, verticale double
# $4 : bordure simple, double en bas
# $5 : bordure simple, double en haut
# $6 : bordure simple, double à gauche
# $7 : bordure simple, double à droite

# attention, il faut modifier le source pour pourvoir ajouter des
# types $10, etc...
 

# bugs connus :

#  avec $border : il ne peut y avoir qu'une seule bordure par
#    ligne ! les autres sont tout bonnement ignorées.

#  dans toutes les options il est impossible de passer un
#  caractère "}" car ce caractère détermine la fin des options
 
 

open(LILO,"/etc/lilo.conf") ;
open(MODELE,"/boot/message.modele") ;
open(MESSAGE,">/boot/message") ;

$default = "" ;

@configs =() ;

$timeout = "" ;

# codes ascii (inaffichables sous linux...) semi graphique

@cadre = qw(218 196 191 179 179 192 196 217
            201 205 187 186 186 200 205 188
            213 205 184 179 179 212 205 190
            214 196 183 186 186 211 196 189
            218 196 191 179 179 212 205 190
            213 205 184 179 179 192 196 217
            214 196 191 186 179 211 196 217
            218 196 183 179 186 192 196 189
) ;

sub draw_cadre {
    local ($start,$msg,$type,$len1,$len2) = @_ ;

# affiche la chaine $msg dans un cadre en commençant après
# la chaine $start

    $len1 = length($start) ;
    $len2 = length($msg) ;

# utilisation de l'opérateur x : multiplication d'une chaine
# par un scalaire : c'est à dire répétition !

    print MESSAGE $start.chr($cadre[$type+0]).
        (chr($cadre[$type+1]) x $len2).
        chr($cadre[$type+2])."\n" ;
    print MESSAGE (" " x $len1).chr($cadre[$type+3]).
        $msg.chr($cadre[$type+4])."\n" ;
    print MESSAGE (" " x $len1).chr($cadre[$type+5]).
        (chr($cadre[$type+6]) x $len2).chr($cadre[$type+7]) ;
}

# on récupère les entrées de /etc/lilo.conf
#  le timeout
#  les labels
#  le label par défaut

while (<LILO>) {
    if (/timeout\s*=\s*(.*)/) {
        $timeout=$1/10 ;
    }
    if (/label\s*=\s*(.*)/) {
        if ($default eq "") {
            $default = $1 ;
        }
        push(@configs,$1) ;
    }
    if (/default\s*=\s*(.*)/) {
        $default = $1 ;
    }
}

# on parse /boot/message.modele à la recherche de quelques
# mots clefs :
#  $iftimeout{}
#  $timeout
#  $configs
#  $default
#  $border{}

while ($line = <MODELE>) {
    $line =~ s/\$default/$default/g ;
    $line =~ s/\$timeout/$timeout/g ;
    if ($timeout eq "") {
        $line =~ s/\$iftimeout\{.*?\}//g ;
    } else {
        $line =~ s/\$iftimeout\{(.*?)\}/$1/g ;
    }
    if ($line =~ /\$configs/) {
        $start =  $` ;
        $end = $' ;
        foreach (sort @configs) {
            print MESSAGE "$start$_$end" ;
        }
    } else {
        if ($line =~ /\$border\{(.*)\}/) {
            $start = $` ;
            $end = $' ;
            $msg = $1 ;
            if ($msg =~ /^\$(\d)/) {
                $msg = $' ;
                $typ = $1 ;
            } else {
                $typ = 0 ; # type par défaut : $0
            }
            draw_cadre($start,$msg,$typ*8) ;
            print MESSAGE $end ;
        } else {
            print MESSAGE $line;
        }
    }
}

close MESSAGE ;
close MODELE ;
close LILO ;

# on affiche le résultat et on demande confirmation !

system("cat /boot/message");
print "boot :\n" ;
do {
    print "\nCe message vous convient-il ? Je lance LILO ? " ;
    $rep = <STDIN>
} until ($rep =~ /^(yes|oui|non|no|n|y|o)$/i) ;

if ($rep =~ /^(y|o)/i) { # ok !
    system("/sbin/lilo") ;
}

Mode d'emploi.

Créer un fichier /boot/message.modele du style :

$border{$4 Lilo demarrera la configuration\
 $default$iftimeout{, dans $timeout secondes}. }

Vous pouvez choisir l'une des configurations suivantes :

   - $configs

Votre choix de


(les deux premières lignes sont en fait sur une seule ligne, sans le '\' final) et vous lancez lilomsg.pl qui vous demandera si cet ecran de démarrage vous convient (attention les caractères du cadre ne sont pas ceux seront affichés au boot, ceux affichés au boot seront vraiment des caractères d'encadrement...). Ce modèle vous donnera l'invite suivante (ou ressemblante) :


     +-------------------------------------------------------------+
     | Lilo demarrera la configuration linux2214, dans 5 secondes. |
     +-------------------------------------------------------------+

Vous pouvez choisir l'une des configurations suivantes :

        - floppy
        - linux
        - linux2214
        - windows

Votre choix de boot :

Remarquez que LILO à rajouté "boot :" à la fin du modèle.

Vous pouvez utilisez ce script en lieu et place de lilo (qui d'ailleurs est appelé - après confirmation - par le script).

Note : le parseur de modèle est simpliste, si quelqu'un se sent l'envie de l'améliorer, pour autoriser les cadres sur plusieurs lignes, l'ajout de paramètres de type "}" dans les options, utiliser quelque chose de plus clair que $0 .. $7 comme type de bordures etc... libre à lui, il serait sympa de m'envoyer ses modifications.

Haut


GRUB : The GRand Unified Bootloader

par fraazz

Visitez la nébuleuse du Crabe

Qu'est-ce que GRUB ?

GRUB est un chargeur de démarrage à  l'instar de LILO. Il est extrêmement flexible et peut charger un système sans enregistrer la position physique du noyau sur le disque. Vous pouvez lancer un noyau simplement en précisant son nom de fichier et le disque (et la partition) sur lequel il réside. Pour ce faire, vous pouvez utiliser l'interface ligne de commande ou l'interface menu. Il est inutile de relancer GRUB après une modification de sa configuration. Toute modification du fichier de configuration /boot/grub/menu.lst est immédiatement prise en compte. Rappelons enfin que Linux peut être installé sur n'importe quelle partition.

Conventions de numérotation

Avec GRUB la numérotation des disques et partitions est différente de ce que vous avez pu voir par ailleurs. GRUB nécessite que le nom du périphérique soit entre parenthèses.

Important : GRUB compte à  partir de zéro.

  1. premier disque : (hd0)
  2. lecteur de disquette : (fd0)
  3. second disque, troisième partition : (hd1,2)
  4. première partition logique du premier disque : (hd0,4)
  5. second disque, partition BSD 'a' : (hd1,a)

GRUB n'effectue aucune distinction entre les disques IDE et SCSI. N'oubliez pas que les partitions étendues sont nommées (hdx,4) et ce, même si vous avez moins de quatre partitions primaires.

Comment spécifier un fichier ? (hd0,0)/vmlinuz

Installation de GRUB

GRUB s'installe comme n'importe quel autre logiciel. Une fois installé sur votre disque dur, vous pouvez le démarrer avec la commande :

$ grub

Au démarrage de GRUB, vous obtenez un prompt (le shell GRUB) qui intègre un interpréteur de commande avec tabulation:

grub>

Pour afficher la liste des commandes, appuyer sur TAB, pour connaà®tre l'utilisation d'une commande :

grub>help commande

Vous pouvez également créez une disquette de démarrage GRUB.Pour ce faire, copiez les fichiers /usr/share/grub/i386-pc/stage1 (image utilisée pour lancer GRUB) et /usr/share/grub/i386-pc/stage2 (image noyau de GRUB) sur les blocs respectifs 1 et 2 de la disquette :

# cd /usr/share/grub/i386-pc
# dd if=stage1 of=/dev/fd0 bs=512 count=1
1+0 records in
1+0 records out
# dd if=stage2 of=/dev/fd0 bs=512 seek=1
153+1 records in
153+1 records out

Appelé depuis le système ou démarré à  partir d'une disquette, vous accédez au shell GRUB :

grub> root (hd0,0)

indique le disque et la partition contenant le noyau à  démarrer.

grub> setup (hd0)

cette commande installe GRUB sur le MBR du premier disque.

grub> setup (hd0,0)

et celle-ci sur le secteur de démarrage de la première partition du premier disque. Si vous installez GRUB sur une partition ou un disque autre que le premier vous devez le chaà®ner avec un autre chargeur de démarrage.

grub> quit

Charger un OS directement

GRUB peut démarrer tout OS supportant le multiboot (inclus *BSD). Comment ?

  1. indiquer le disque et la partition o๠réside l'OS, commande : root

    grub> root (hd0,0)

  2. charger l'image du noyau, commande : kernel

    grub> kernel file

  3. charger les modules (facultatif), commande : module

    grub> module file

  4. lancer le démarrage, commande : boot

    grub> boot

Des paramètres peuvent être passés au noyau, à  ajouter après la commande kernel.

Chaà®ner un OS

GRUB peut démarrer tout OS dont le noyau n'est pas supporté (ex. MS Windows 95) par chaà®nage. Comment ?

  1. indiquer le disque et la partition ou réside l'OS, commande : rootnoverify

    grub> rootnoverify (hd0,0)

  2. activer la partition, commande : makeactive

    grub> makeactive

  3. charger le chargeur tiers, commande : chainloader

    grub> chainloader +1

  4. lancer le démarrage, commande : boot

    grub> boot

Si MS Windows n'est pas installé sur le premier disque, vous devrez utiliser la technique du swapping disque qui consiste à  le leurrer en lui faisant croire qu'il est bien sur le premier disque.

grub> map (hd0) (hd1)
grub> map (hd1) (hd0)

Cette technique fonctionne si MS Windows utilise le BIOS pour accéder aux disques, mais peut échouer s'il en est autrement.

Si plusieurs systèmes MS Windows sont utilisés sur le même disque, vous devrez utiliser les commandes hide et unhide.

Exemples de fichiers de configuration

Le fichier de configuration de GRUB est : /boot/grub/menu.lst

Démarrer Linux

title GNU/Linux
kernel (hd1,0)/vmlinuz root=/dev/hdb1

Démarrer MS Windows

title MS Windows
rootnoverify (hd0,0)
makeactive
chainloader +1

Démarrer MS Windows (disque 2 / partition 2)

title MS Windows
map (hd0) (hd1)
map (hd1) (hd0)
rootnoverify (hd1,1)
makeactive
chainloader +1

Démarrer MS Windows (seconde mouture installée sur le 1er disque)

title MS Windows
unhide (hd0,0)  #la première partition est masquée
hide (hd0,1)  #la seconde partition est vue ou démasquée
rootnoverify (hd0,0)
makeactive
chainloader +1

Démarrer FreeBSD

title FreeBSD
root (hd0,2,a)
kernel /boot/loader

Linux, /boot/grub/menu.lst généré par anaconda RH 8.0 puis modifié :

default=0  #démarre la première entrée par défaut
timeout=10  #démarrage automatique après 10 secondes
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
password --md5 $ki47DRy2a1quIitvskl745sFRsm
title Red Hat Linux (2.4.18-19.8.0)
root (hd0,0)
kernel /boot/vmlinuz-2.4.18-19.8.0 ro root=LABEL=/ hdd=ide-scsi hdc=ide-scsi
initrd /boot/initrd-2.4.18-19.8.0.img

Sécurité

Vous pouvez protéger l'accès à  votre chargeur à  l'aide d'un mot de passe crypté.

Lancer le shell GRUB (su to root) :

# grub
grub> md5crypt

entrez votre mot de passe :
Password: **********
Encrypted: $ki47DRy2a1quIitvskl745sFRsm

puis, copiez le mot de passe crypté dans votre fichier de configuration /boot/grub/menu.lst :

password --md5 $ki47DRy2a1quIitvskl745sFRsm

L'argument password peut être utilisé pour restreindre certaines entrées; dans ce cas il est inséré juste sous la ligne "title" à  démarrer.

Pour en savoir plus (beaucoup plus) sur GRUB

Haut


Utilisation de LOADLIN (LOAD LINux)

par Fred

Normalement, les puristes de Linux n'utilisent que LILO, mais il y a des cas où l'utilisation de LOADLIN est la seule solution.


Qu'est-ce que LOADLIN

LOADLIN est un programme conçu pour permettre le démarrage de Linux depuis la ligne de commande de MS/DOS (et donc de la ligne de commande de Windows). Normalement, le chargement de Linux est laissé à LILO, mais parfois, il est essentiel de pouvoir démarrer Linux depuis la ligne de commande de Windows.

Par exemple, vous avez compilé un nouveau noyau, et pris par l'euphorie de l'installation de ce nouveau Linux, vous avez oublié de conserver une entrée dans /etc/lilo.conf pour l'ancien noyau (Linux c'est hyper stable et tout et tout ;), mais en compilant ce noyau vous avez oublié d'activer un driver nécessaire au démarrage du noyau. Résultat : vous obtenez un superbe : Kernel Panic (i.e. impossible de démarrer) ! Comme par hasard, la disquette de démarrage que vous avez pris soin de créer lors de l'installation de votre distribution est introuvable ? Que faire ? Si vous avez installé LOADLIN sur votre partition Windows, pas de problème : utilisez le pour démarrer votre ancien noyau.

Un autre exemple, vous utilisez une carte ISA PNP (Plug aNd Play) qui n'est pas encore reconnue par le PNP (Plug aNd Pray) de Linux. La solution : démarrez votre PC sous Windows, activez vos cartes PNP puis démarrez Linux avec LOADLIN.

Encore un autre exemple : vous n'avez pas envie d'installer LILO, ou pour une raison ou une autre, LILO refuse de fonctionner : essayez d'utiliser LOADLIN !

Installation de LOADLIN

L'installation est pour le moins triviale : cherchez sur le CD de votre distribution un fichier nommé : loadlin.exe, copiez le dans un répertoire de votre disque C: par exemple dans C:\loadlin (vous pouvez indifféremment utiliser Linux - cp /mnt/cdrom/dosutils/loadlin.exe /mnt/hda1_DOSC - ou bien DOS ou Windows pour cela).

Il vous faut aussi une image de votre noyau, vous pouvez par exemple copier celle qui est utilisée par LILO pour le démarrage de Linux de manière automatique (par exemple, depuis Linux : cp /boot/vmlinuz-2.2.14-15mdk /mnt/hda1_DOSC/loadlin/vmlinuz).

Enfin, si vous utilisez le RAM disque initial (initrd), copiez aussi /boot/initrd vers /mnt/hda1_DOSC/loadlin/initrd.

Voilà c'est tout, LOADLIN est installé !

Démarrage de Linux avec LOADLIN

Le démarrage de Linux avec LOADLIN installé comme décrit plus haut est également trivial : démarrez Windows en mode ligne de commande (pressez F8 au démarrage de Windows et choisissez le mode ligne de commande), puis à l'invite tapez :

C:\> cd loadlin
C:\LOADLIN\> loadlin vmlinuz root=/dev/hda2

si vous avez installé Linux sur la seconde partition du premier disque IDE. Pour savoir par quoi remplacer /dev/hda2 utilisez, sous Linux, la commande :

cat /etc/fstab

Vous devez voir apparaître des lignes comme :

/dev/hda1 /c: vfat user,exec,conv=binary 0 0
/dev/hda3 / ext2 defaults 1 1
/dev/hda5 /usr ext2 defaults 1 2
/dev/hda6 /home ext2 defaults 1 2
/dev/hda7 swap swap defaults 0 0
/mnt/disquette /mnt/disquette supermount fs=vfat,dev=/dev/fd0 0 0
/mnt/cdrom /mnt/cdrom supermount fs=iso9660,dev=/dev/scd0 0 0

Dans ce cas dans /etc/fstab il est précisé que /dev/hda3 est monté sur le répertoire / (c'est donc la racine de votre installation - root en anglais), vous devez donc précisez : /dev/hda3 à la place de /dev/hda2 dans la commande loadlin vue plus haut.

Normalement tout doit bien se passer et Linux doit démarrer correctement ; si ce n'est pas le cas vérifiez à nouveau que tous les fichiers ont bien été copiés comme indiqué précédemment et que vous avez indiqué la bonne partition root à LOADLIN.

évidemment cette méthode de chargement de Linux est un peu pénible, car vous devez taper une longue ligne de commande.

Première solution simple : créez un fichier linux.bat dans C:\LOADLIN contenant sur une seule ligne :

C:\LOADLIN\LOADLIN.EXE C:\LOADLIN\VMLINUZ initrd=C:\LOADLIN\INITRD root=/dev/hda2 %1 %2 %3

en adaptant bien sûr les valeurs à votre propre configuration ; la partie en italique (initrd=...) étant optionnelle.Ensuite, ajoutez le répertoire C:\LOADLIN à votre PATH (dans autoexec.bat, sur une ligne du type PATH=...).
Ainsi, pour lancer Linux, il suffira de démarrer en mode texte (touche F8 lors du boot), puis de taper simplement :

C:\> linux [Entrée]

Nous allons voir ci-dessous une autre méthode qui offrira un menu de boot plus convivial.


Automatisation

Tout ce que fait Micro$oft n'est pas forcément nul ;). Le programme de démarrage de M$ est capable de nous fournir un menu de démarrage très correct. Pour cela il faut modifier le fichier C:\CONFIG.SYS. Vous pouvez par exemple modifier votre fichier config.sys de la manière suivante :

[menu]
menuitem=windows,Démarrer Windows
menuitem=linux,Démarrer Linux
menudefault=windows,5

[windows}
REM ci-dessous doit se trouver tout ce qui ce trouvait
REM dans config.sys avant que vous n'y touchiez
....
....

[linux]
REM ici doit se trouver une copie de toutes les lignes
REM DEVICE qui initialisent des cartes PNP.
REM S'il n'y en a pas, laissez cette section vide.
...
...

Il faut aussi que vous modifiez un peu votre fichier C:\AUTOEXEC.BAT, de la manière suivante :

@echo off
goto %config%

:linux
echo Démarrage de Linux dans quelques instants
REM lancez ici les programmes qui initialisent
REM vos périphériques PNP (s'il y en a)
...
...
cd c:\loadlin
loadlin vmlinuz root=/dev/hda2

:windows
echo Démarrage de Windows dans quelques heures ;)
REM laissez ici tout votre ancien autoexec.bat
...
...

Voilà, maintenant, que vous utilisiez LILO ou pas, au démarrage de Windows, vous aurez un menu vous demandant si vous souhaitez démarrer Linux ou Windows.

Remarque : Le paramètre menudefault=<item>,<delay> dans la section menu de config.sys permet de choisir quel système on démarre par défaut, et pendant combien de secondes on affiche le menu avant de démarrer le système par défaut (ici Windows au bout de 5 secondes).

Même si vous êtes obligé de réinstaller le MBR de Windows (par exemple en tapant fdisk /mbr), ce qui supprime LILO, vous pourrez démarrer Linux grâce à LOADLIN.

Je vous conseille, même si vous préférez cette méthode pour démarrer Linux que celle utilisant LILO, d'installer LILO sur la partition racine (i.e. root) de Linux, en précisant comme paramètre boot : boot=/dev/hda2, de cette façon même en cas de problème de Windows (ce qui peut arriver, même avec un système commercial propriétaire, vous savez ;), il vous suffit d'activer, à l'aide d'une disquette bootable et de fdisk, la partition de Linux pour pouvoir démarrer Linux : deux précautions valent mieux qu'une.

Haut


Aperçu avant impression

par Fred

Utiliser le système d'impression de Linux pour offrir une prévisualisation à toutes vos applications


Objectif

Vous avez enfin réussi à configurer votre imprimante, mais vous vous êtes aperçu que beaucoup de vos logiciels n'offrent pas la fonction si pratique de l'aperçu avant impression, et que ceux qui le proposent, n'offrent que des fonctions très approximatives. C'est idiot, car sous Linux, on passe presque toujours par ghostscript pour imprimer quelque chose, et ghostscript est tout à fait capable d'afficher ce qu'il est capable d'imprimer. Qu'à cela ne tienne, nous allons utiliser ghostscript pour gérer l'aperçu avant impression.

Note : ceci ne fonctionne pas avec CUPS (du moins pas en l'état) et avec les filtres d'impression : rhs-printfilters de la RedHat (présents dans toutes les Mandrake). Cet article nécessite sans doute pas mal de travail pour l'adapter à une autre distribution.
 

Le fichier /etc/printcap

La configuration d'un service d'impression sous Linux passe par la configuration de plusieurs fichiers. Le plus important d'entre eux est /etc/printcap. Ce fichier contient une entrée pour chaque imprimante reliée à votre système. Nous allons en ajouter une autre : virtuelle. Son rôle ne sera pas d'imprimer vraiment, mais d'afficher tout ce que nous lui enverrons. Nous allons donc ajouter à /etc/printcap :

# Offrons la prévisualisation à Linux :
preview|Ghostview:\
       :sd=/var/spool/lpd/preview:\
       :mx#0:\
       :sh:\
       :lp=/dev/null:\
       :if=/var/spool/lpd/preview/filter:

La première ligne indique les différents noms sous lesquels notre nouvelle imprimante sera connue. Pour avoir la prévisualisation du fichier toto, nous ferons :

lpr -Ppreview toto

En lieu et place de preview, nous aurions pu mettre Ghostview.

 La seconde ligne indique où sont stockés les fichiers de notre nouvelle file d'attente.

 L'avant dernière ligne indique qu'il ne s'agit pas d'une véritable impression : on envoie tout sur /dev/null. Vu les modifications que nous allons apporter aux autre scripts, il est probable que nous aurions pu mettre n'importe quoi ici.

 La dernière ligne indique quel est le script qui se chargera de filtrer ce que nous allons envoyer à "l'imprimante" (en l'occurence : ghostview).
 

La configuration du filtre

Pour faire notre office, nous allons utiliser une modification du script d'impression de la Mandrake/RedHat (du paquetage rhs-printfilters qu'il vous faut avoir installé, si vous avez laissé La Mandrake/RedHat installer votre imprimante, c'est déjà fait).

 Première étape, créons le script suivant : /var/spool/lpd/preview/filter (c'est une recopie presque brutale du script original master-filter du paquetage rhs-printfilters)


#!/bin/bash
#
#
# New smart print filter
#
#
# determines input file magic
#
# looks in the default filter plugin (FPI) directory
# finds all *.fpi files, then finds a combination that will
# yield the desired file type, or will indicate this is impossible.
#
 

function filtfrom {
    echo -ne ${1%-to-*}
}

function filtto {
    echo -ne ${1#*-to-}
}

#
# given filters as input vars, find next level available given the
# first arg is the starting point
#
function nextlvl {

    local try
    local start
    local all
    local depth

#
#
# $1 is starting point, find something that will work
#
    start="$1"
    shift

    depth="$1"
    shift

    all="$@"

#
#   get out of here if too deep!
#
    if [ $depth -ge $MAX_DEPTH ]; then
        return 1
    fi
    if [ $DEBUG_TREE ]; then
       echo "Starting point = $start" >> /tmp/filter.debug
    fi

    if [ $(filtto $start) = $DESIRED_TO ]; then
        echo " DONE"
        return 0
    fi

    while [ $1 ]; do
        try=$1
        shift
        if [ $DEBUG_TREE ]; then
          echo "for $start trying $try" >> /tmp/filter.debug
        fi
        if [ $(filtfrom $try) = $(filtto $start) ]; then
            echo -n "$start.fpi:$depth:CONT "

            if [ $(filtto $try) = $DESIRED_TO ]; then
                echo -n "$try.fpi:$((depth+1)):DONE "
                return 0
            else
#               echo -n $try
                nextlvl $try $((depth+1)) $all
#               echo "|G is $G| "
                if [ $DEBUG_TREE ]; then
                   echo "|rt is $?|" >> /tmp/filter.debug
                fi
                if [ "$?" = "0" ]
                then
                   if [ $DEBUG_TREE ]; then
                      echo "for $start we are done"  >> /tmp/filter.debug
                   fi
#                  return 0
                else
                   if [ $DEBUG_TREE ]; then
                      echo "for $start we have failed" >> /tmp/filter.debug
                   fi
                   return 1
                fi
            fi
        fi
#       echo ""
    done
}
 

#
# MAIN
#
#

#
#
#   setup some global variables used by this script
#
#

#
#   FPIDIR points to where print filter plug-ins are stored
#   Normally these will be installed with a package via RPM
#
    FPIDIR=/usr/lib/rhs/rhs-printfilters/

    PATH=${FPIDIR}:${PATH}

#
#   MAX_DEPTH determines how long a string of filters will be
#   tried as a possible printing solution. How many input
#   formats will take 6 filters to output Postscript!
#   Unlikely this will need to be changed.
#
    MAX_DEPTH=6

#
#   define these to gets lots of feedback
#   output is appended on /tmp/filter.debug
#
    DEBUG_TREE=""
    DEBUG_FILTER=""

#
#   Setup variables available to all filter plug-ins
#
#

#
#   SPOOLDIR is directory which lpd is spooling from
#
    export SPOOLDIR=$(pwd)

#
#   Get queue specific information (which was written by printtool)
#
    source ${SPOOLDIR}/general.cfg

    if [ "$DEBUG_FILTER" != "" ]; then
      echo "Desired print format is $DESIRED_TO" >> /tmp/filter.debug
      echo "Paper size is $PAPERSIZE" >> /tmp/filter.debug
      echo -n "A form feed will " >> /tmp/filter.debug
      if [ "$SEND_EOF" = "" ]; then
        echo "not be sent." >> /tmp/filter.debug
      else
        echo "be sent." >> /tmp/filter.debug
      fi
    fi

    cd $FPIDIR
    fpis=$(ls *.fpi 2> /dev/null | tr '\n' ' ' | sed 's/\.fpi//g')

#
# let's see if its a compressed file first
#
#
# Figure out the magic of the input file
#
    magic=$(file -)
    $FPIDIR/rewindstdin
    magic=${magic#*: }
    if [ "$DEBUG_FILTER" != "" ]; then
      echo "Magic is |$magic|" >> /tmp/filter.debug
    fi
    case `echo $magic | tr 'A-Z' 'a-z'` in
        *bzip2*)
                                              DECOMPRESS="bunzip2 -d";;
        *bzip*)
                                              DECOMPRESS="bunzip -d";;
        *packed*|*gzip*|*compress* )
                                              DECOMPRESS="gzip -dc";;
        * )
                                              DECOMPRESS="";;
    esac

#
# Figure out the magic of the input file
#
    if [ "$DECOMPRESS" = "" ]; then
       magic=$(file -)
    else
       magic=$($DECOMPRESS | file -)
    fi
    $FPIDIR/rewindstdin
    magic=${magic#*: }
    if [ "$DEBUG_FILTER" != "" ]; then
      echo "Magic is |$magic|" >> /tmp/filter.debug
    fi
    case `echo $magic | tr 'A-Z' 'a-z'` in
        *empty* )
                                              exit;;
        "pc bitmap data"* )
                                              startpnt="INPUT-to-bmp";;
        "gif image data"* )
                                              startpnt="INPUT-to-gif";;
        "png image data"* )
                                              startpnt="INPUT-to-png";;
        "jpeg image data"* )
                                              startpnt="INPUT-to-jpeg";;
        "tiff image data"* )
                                              startpnt="INPUT-to-tiff";;
        "sun raster image data"* )
                                              startpnt="INPUT-to-rast";;
        "pgm"*|"pbm"*|"ppm"* )
                                              startpnt="INPUT-to-pnm";;
        postscript* )
                                              startpnt="INPUT-to-ps";;
        "PDF document"* )
                                              startpnt="INPUT-to-pdf";;
        "tex dvi file"* )
                                              startpnt="INPUT-to-dvi";;
        "fig image text"* )
                                              startpnt="INPUT-to-fig";;
        "troff or preprocessor"* )
                                              startpnt="INPUT-to-troff";;
        "rpm"* )
                                              startpnt="INPUT-to-rpm";;
        *ascii*|*text*|*english*|*script* )
                                              startpnt="INPUT-to-asc";;
        *data*|*escape* )
                                              startpnt="INPUT-to-prdata";;
        *pcl* )
                                              startpnt="INPUT-to-prdata";;
        "sgi image"* )
                                              startpnt="INPUT-to-sgi";;
        "kodak photo cd"* )
                                              startpnt="INPUT-to-pcd";;
        "fits image"* )
                                              startpnt="INPUT-to-fits";;
        "fit image"* )
                                              startpnt="INPUT-to-fit";;
        "iff image"* )
                                              startpnt="INPUT-to-ilbm";;
        *iff*ilbm* )
                                              startpnt="INPUT-to-ilbm";;
        "rle image"* )
                                              startpnt="INPUT-to-rle";;
        "X pixmap image"* )
                                              startpnt="INPUT-to-xpm";;
        "fbm image"* )
                                              startpnt="INPUT-to-fbm";;
         * )
                                              startpnt="INPUT-to-unknown";;
    esac
 

#
# here is where we could put in hook to call user routine(s) to
# handle extra magics they've defined filters for
#
#  call_user_magic_hook()
#
    if [ "$DEBUG_FILTER" != "" ]; then
       echo "Type of file is $startpnt" >> /tmp/filter.debug
    fi

    if [ "$startpnt" = "Dont know" ]; then
       echo "Error - input file type is unknown - cannot print"
       exit 1
    fi

#
# catch some easy cases without having to figure out best path the hard way
#
    bestpath=""
    foundbest="NO"
    if [ $(filtto $startpnt) = "asc" ]; then
       if [ "$ASCII_TO_PS" = "NO" ]; then
          bestpath="$startpnt | asc-to-printer.fpi"
          foundbest="YES"
       fi
    elif [ $(filtto $startpnt) = "prdata" ]; then
          bestpath="$startpnt | cat -"
          foundbest="YES"
    elif [ $(filtto $startpnt) = $DESIRED_TO ]; then
 

# envoyons les données à l'écran plutot qu'à l'imprimante :
          bestpath="$startpnt | $DESIRED_TO-to-x11.fpi"
 

          foundbest="YES"
    fi

    if [ "$foundbest" != "YES" ]; then
#
#   we go through and find best path
#
    G=`nextlvl "$startpnt" "0" $fpis`

    if [ "$DEBUG_FILTER" != "" ]; then
      echo "$G" >> /tmp/filter.debug
    fi

#
# now sort out the best path of all available
#
#
# if no processing required, depth will equal 'DONE'
#
    if [ "${G# *}" != "DONE" ]; then
      root=""
      bestdepth=$((MAX_DEPTH*2))
      bestpath=""
      curdepth="0"
      depth="0"
      foundbest="NO"
      for i in $G; do
          entry=${i%%:*}
          depth=${i#*:}
          depth=${depth%:*}
          if [ $depth -le $curdepth ]; then
             while [ $(($depth <= $curdepth && $curdepth >= 0)) -eq 1 ]; do
                root=${root%* | *}
                curdepth=$(($curdepth - 1))
             done
          fi
          if [ $(($curdepth < 0)) -eq 1 ]; then
             root=""
          fi
          curdepth=$depth
          if [ "$root" = "" ]; then
           root="$entry"
          else
           root="$root | $entry"
          fi
          if [ ${i##*:} = "DONE" ]; then
             if [ "$DEBUG_FILTER" != "" ]; then
               echo "$root -> depth = $depth" >> /tmp/filter.debug

             fi
             if [ $depth -lt $bestdepth ]; then
                foundbest="YES"
                bestdepth=$depth
                bestpath=$root
             fi
          fi
      done
    fi

    if [ "$foundbest" = "YES" ]; then
 

# envoyons les données à l'écran plutot qu'à l'imprimante :
       bestpath="$bestpath | $DESIRED_TO-to-x11.fpi"
 

    fi
#
# end of doing it the hard way
#
    fi
#
#   we have to add filter to convert desired format to something the
#   printer can handle. May be as simple as 'cat'
#
#
#   ok we got here, and if input data magic is 'data' we'll let it
#   through, hoping it really will work on the printer!
#   Note we still reject lots of magics, like ELF, by doing this
#   which is what we want
#
#
#   getting bad, but trapping all "special" cases here
#
#
    if [ "$foundbest" = "NO" ]; then
       printf "No way to print this type of input file: $magic \014"
       exit 0
    else
#
#   fix up the best path so we can run it
#
       if [ "$DECOMPRESS" = "" ]; then
         bestpath="cat - ${bestpath#* }"
       else
         bestpath="$DECOMPRESS ${bestpath#* }"
       fi
    fi

#
#   any post-filter to run (like smbclient?)
#
    if [ "$PRINTER_TYPE" = "SMB" ]; then
       bestpath="$bestpath | ${FPIDIR}/smbprint ${SPOOLDIR}/acct"
    elif [ "$PRINTER_TYPE" = "NCP" ]; then
       bestpath="$bestpath | ${FPIDIR}/ncpprint ${SPOOLDIR}/acct"
    fi

    if [ "$DEBUG_FILTER" != "" ]; then
      echo "Best path of depth $bestdepth is $bestpath" >> /tmp/filter.debug
    fi

#
# run the command!
#
 

    eval $bestpath 2>/dev/null

#
#
#   see if we need to send a form feed to eject the page from printer
#
#    if [ "$SEND_EOF" != "" ]; then
#      printf "\014"
#    fi

    exit 0

Ce script n'est qu'une modification minime du script standard. Il n'est pas nécessaire de comprendre le script, en tout cas moi je ne le comprends qu'en partie. La seule chose importante, c'est de savoir que le script standard essaie de reconnaitre le type des données qui lui sont transmises, puis les envoie à un autre script : ps-to-printer.fpi. La modification que j'ai apportée, c'est d'envoyer les données vers ps-to-x11.fpi (voir ci-dessous) qui est une modification de ps-to-printer.fpi pour envoyer les données vers ghostview plutot que vers l'imprimante. Pour le reste, je n'ai rien changé à ce script.

 Remarque : les modifications du script sont en gras.
 
 

Le script qui prévisualise

Voyons maintenant le script chargé de l'affichage de nos données /usr/lib/rhs/rhs-printfilters/ps-to-x11.fpi :

#!/bin/sh
#
# convert ps to the format required by the printer on this queue
#
# if the printer is a PostScript printer, just cat it through
# if the printer uses ghostscript, we'll run it now
# if the printer is neither, we die (with good message to someone)
#

#
# read in PostScript configuration settings
#
source ${SPOOLDIR}/postscript.cfg

#
# see if we should reverse order
#
# support will be added for this in the future
# psorder needed and is part of netatalk, which we dont currently ship
#

if [ "$PAPERSIZE" = "letter" ]; then
    mpage_paper="Letter"
elif [ "$PAPERSIZE" = "a4" ]; then
    mpage_paper="A4"
    ppaA4="-s a4"
elif [ "$PAPERSIZE" = "legal" ]; then
    mpage_paper="Legal"
else
    mpage_paper="Letter"
fi

#
# weird case - some PS doesnt get handled by mpage well
# so we allow nup=1 to just cat PS to printer w/o mpage interferring
#
if [ "$NUP" = "1" ]; then
    border="-o"
    mpage_cmd="cat -"
else
    border=""
    mpage_cmd="mpage -b$mpage_paper $border -$NUP -m${RTLFTMAR}lr -m${TOPBOTMAR}tb"
fi

TMPFILE=`mktemp /tmp/printtmp.XXXXXX`

#
# if the driver is
#  "POSTSCRIPT"       it means the printer handles Postscript natively,
#                     no need to run gs.
#  "TEXT"             it means the printer cannot handle PS input
#  "uniprint"         use the driver set by COLOR in postscript.cfg
#  "hp720/820/1000"   use the pbm2ppa converter; these are for the GDI
#                     printers of the HP720/HP820/HP1000 families.
#
 

# envoyons les données à l'écran plutot qu'à l'imprimante :
   eval "$mpage_cmd | sed \"s/[(]%%.*%%[)].*flush//g\" > $TMPFILE"
#
#  ici vous devez initialiser DISPLAY à la valeur correspondant à votre
#  écran !
   export DISPLAY=:0
   gv -media $PAPERSIZE $TMPFILE
   rm -f $TMPFILE
 

#
#
#   see if we need to send a form feed to eject the page from printer
#
    if [ "$PS_SEND_EOF" = "YES" ]; then
      printf "\004"
    fi
exit 0

Pour que tout fonctionne, il nous faut encore quelques fichiers de configuration :
var/spool/lpd/preview/general.cfg


#
# General config options for printing on this queue
# Generated by PRINTTOOL, do not modify.
#
export DESIRED_TO=ps
export PAPERSIZE=a4
export PRINTER_TYPE=LOCAL
export ASCII_TO_PS=YES

var/spool/lpd/preview/postscript.cfg

#
# configuration related to postscript printing
# generated automatically by PRINTTOOL
# manual changes to this file may be lost
#
GSDEVICE=x11
RESOLUTION=72x72
COLOR=
PAPERSIZE=a4
EXTRA_GS_OPTIONS=
REVERSE_ORDER=NO
PS_SEND_EOF=NO

#
# following is related to printing multiple pages per output page
#
NUP=1
RTLFTMAR=18
TOPBOTMAR=18

var/spool/lpd/preview/textonly.cfg

#
# text-only printing options for printing on this queue
# Generated by PRINTTOOL, do not modify.
#
TEXTONLYOPTIONS=
CRLFTRANS=YES
TEXT_SEND_EOF=YES

Certains de ces fichiers ne sont certainement pas très utiles (en particulier, textonly.cfg mais ça ne coûte pas cher de les mettre, et ça m'évite de comprendre complètement comment tout cela fonctionne).

 Veillez à ce que tous ces fichiers soient lisibles par tout le monde, faites les appartenir à root ou daemon et tout sera parfait.
(par un chown root:root le_fichier ; chmod 644 le_fichier)

 À partir de maintenant vous diposez d'une nouvelle file d'impression : preview qui permet de prévisualiser ce que vous lui envoyez.
 

Utilisation

Dans vos programmes il suffit de remplacer

lpr -Pimprimante

ou

lpr

par

lpr -Ppreview

et c'est tout ! Maintenant, tous vos programmes qui savent imprimer, savent aussi afficher un aperçu avant impression ! Le seul problème, c'est que tout ceci n'est pas trop prévu pour fonctionner dans un réseau. Il faut faire toutes ces modifications pour chaque poste. Il y a probablement un problème quand on lance une prévisualisation depuis un poste qui n'est pas à la fois le client et le serveur X : la variable $DISPLAY n'est sans doute pas initialisée correctement. A vous d'expérimenter tout cela et de m'envoyer vos modifications.
 

Conclusion

Une nouvelle fois, avec un peu d'astuce, la lisibilité des fichiers de configuration de Linux et les multiples possibilités de configuration de Linux nous ont permis d'obtenir un résultat en peu de temps, pour que l'on soit prêt à mettre les mains dans le cambouis. On peut obtenir tout ce que l'on veut de Linux : il suffit de lui demander gentiment. Bonne configuration !
 

Haut


PS2PDF

par Dimitri Clatot

Ou : comment votre serveur linux convertit vos documents de différents formats en fichier PDF à partir d'un client Linux ou Windows.


PS2PDF

Présentation

ps2pdf est un filtre qui permet de transformer un document postscript (.ps) en document Acrobat reader (.pdf).

Vous pouvez l'utiliser en ligne de commande très simplement (ps2pdf doc.ps doc.pdf) ; cet article va vous expliquer comment votre serveur linux peut convertir vos documents au format PDF à partir d'un client linux ou window$.

Depuis votre client, vous allez imprimer sur une pseudo imprimante, qui va créer un document PDF, mis à disposition dans un répertoire public.

Pour réaliser cette recette, nous avons besoin de 3 ingrédients :

Voici le cheminement :

client --> imprimante PDF --> script printpdf--> Répertoire public
 

Installation

Nous allons commencer par créer le répertoire public puis celui où seront stockés les fichiers traités :

[root@micro home]# mkdir -p /home/public/pdf

en affectant les droits de lecture, ecriture et exécution (rwx) à l'utilisateur nobody :

[root@micro home]# chown nobody:nobody -R /home/public
[root@micro home]# chmod u+rwx -R /home/public


On va ensuite utiliser le script printpdf suivant :

#!/bin/sh
# printpdf

# Simple script pour convertir un fichier postscript
# spécifié en un document PDF et le déposer dans un
# répertoire partagé avec Samba.

# Arguments:
# 1er - Le nom du fichier de spool
#
# John Bright, 2001, jbright@winfordeng.com

# Nous allons créer le pdf dans un fichier temporaire
# basé sur la date et l'heure courante.
# Après cela, nous le renommerons avec l'extension pdf.
# On fait cela car si un utilisateur essaie d'ouvrir un
# fichier pdf qui est encore en cours d'écriture, il
# obtiendra un message d'erreur disant que le PDF est
# corrompu, alors qu'il n'est simplement pas fini.

DATE=`date +%b%d-%H%M%S`

# Répertoire où placer la sortie.
# Assurez-vous que ce répertoire existe, et que
# l'utilisateur sous lequel tourne Samba peut y écrire
# (par exemple l'utilisateur nobody)

OUTDIR=/home/public/pdf

ps2pdf $1 $OUTDIR/$DATE.temp
mv $OUTDIR/$DATE.temp $OUTDIR/$DATE.pdf
rm $1

que l'on copie dans le répertoire /usr/bin sans oublier de lui mettre les droits d'exécution :

[root@micro root]# mv printpdf.sh.txt /usr/bin/printpdf
[root@micro root]# chmod +x /usr/bin/printpdf*

Installation de Ghostscript

Le script ps2pdf fait partie de l'application Ghostscript que l'on peut trouver sous le nom de package ghostscript sur Red Hat/Mandrake, gs ou gs-aladdin sur Debian. Vous pouvez l'installer avec le package adapté à votre distribution ou à partir des sources disponibles sur le site des auteurs.

Paramètrage de Samba

Nous allons créer une imprimante nommée "pdf" dans Samba.
Voici le fichier de configuration mininal que vous pouvez également adapter à votre installation.

#Fichier smb.conf

[global]
 guest account = nobody
 invalid users = root
 interfaces = 127.0.0.1 eth0
 bind interfaces only = Yes
 hosts allow = 192.168.
 security = share
 workgroup = WORKGROUP
 printer driver file = /home/printer/printers.def

[public]
 path = /home/public
 browseable = yes
 writeable = yes
 guest ok = yes
 force user = nobody

[pdf]
 path = /tmp
 printable = yes
 guest ok = yes
 print command = /usr/bin/printpdf %s
 lpq command =
 lprm command =
 printer driver = HP Color LaserJet 4500 PS
 printer driver location = \\%h\printer$

[printer]
 path = /home/printer
 guest ok = yes
 read only = yes

Installation

Pilote pour windows
Pour que le pilote de l'imprimante s'installe automatiquement sous window$, il faut récupérer celui que l'on a choisi (de préférence un pilote d'imprimante couleur PostScript, ici HP Color LaserJet 4500 PS) et extraire le fichier de configuration qui a l'extension INF.

Puis avec la commande 'make_printerdef' fournie avec Samba (taper sur une seule ligne) :

[root@micro public]# make_printerdef CONFIG.INF 'PILOTE COULEUR POSTSCRIPT' > /home/printer/printers.def


Après avoir tapé la commande, le programme vous demande de copier les fichiers du pilote correspondant, ici dans /home/printer.

Poste client Windows
L'installation sur un poste windows est on ne peut plus simple, il suffit d'ajouter une imprimante réseau et indiquer le chemin de la file d'impression dans notre exemple \\LE_MICRO_LINUX\PDF. Puis le pilote s'installera tout seul.
Poste client Linux
Ici, je vous laisse le choix des armes pour configurer votre imprimante (vi, webmin...) qui en général se base sur le script smbprint fourni avec Samba.

Une fois tout installé, lancez une impression sur cette imprimante et récupérez votre fichier sous format pdf dans le répertoire partagé /home/public/pdf.

The END

Cet article est une libre adaptation avec l'accord de son auteur de celui-ci.

Haut


Montage de disques : /etc/fstab

par Fred

Partagez les secrets de /etc/fstab  pour le montages des partitions Linux, VFAT, etc.
Utilisez Supermount pour vos disques amovibles.


A quoi sert /etc/fstab

Le nom fstab signifie : FileSystemTable (tableau des systèmes de fichiers !).

Le fichier /etc/fstab est lu à chaque fois (entre autres...) que vous utilisez la commande mount. Mais aussi au démarrage de votre station, vous avez sans doute remarqué que certaines partitions sont parfois testées (soit elles ont été mal "démontées", soit elles ont atteint le nombre maximum de montage sans test) par fsck. Donc, pour modifier le comportement de ces deux (au moins) commandes il faut mettre les mains dans le cambouis. Ce fichier est aussi utilisé par les gestionnaires de fenêtres comme KDE qui montent le système de fichier d'un CD-Rom par un simple clic sur son icône.

De plus /etc/fstab indique à Linux (en fait à mount) quelles partitions il faut monter automatiquement, quelles sont les partitions que les utilisateurs peuvent monter eux-mêmes. C'est donc un fichier important, et mieux vaut ne pas rester dans l'ignorance de son fonctionnement.


Modifier /etc/fstab

Lorsque vous modifiez /etc/fstab sont contenus est pris en compte de suite. Mais si vous avez ajouté un nouveau système de fichier à montage automatique (voir la suite), alors il faut dire a Linux de monter les systèmes de fichiers non encore monté par la commande :

[root@localhost ~]$ mount -a

Il reste un petit problème, si vous n'avez pas ajouter un système de fichiers mais seulement modifié un système de fichier, alors cette commande ne va rien faire ... Pour remédier à celà, il suffit de "remonter" le système de fichiers fautif par la commande :

[root@localhost ~]$ mount -o remount /pointdemontage

/pointdemontage est le point de montage du système de fichiers que vous venez de modifier.

Syntaxe de /etc/fstab

La syntaxe de /etc/fstab est des plus simples. Les commentaires commencent (comme pour la plupart des fichiers de configuration de Linux) par le caractère #.

Exemple :

# Ceci est un commentaire dans /etc/fstab

On peut mettre dans /etc/fstab autant de lignes vides que l'on veut (elles sont bien évidemment ignorées). Enfin, les seules lignes ayant une signification ont une syntaxe relativement figée : chaque ligne doit contenir 6 champs (au maximum, 4 au minimum), chaque champ étant séparé des autres par un espace (un espace ou une tabulation au moins).

Les 6 champs sont :

1. périphérique

Le premier champ de chaque ligne de fstab doit contenir, pour être valide un nom de fichier, la plupart du temps, ce sera un fichier "périphérique", c'est à dire un fichier de /dev/.
exemple : /dev/hda5 (5ème partition du 1er disque IDE)

2. point de montage

Le second champ sert à indiquer à mount à quel endroit (point de montage) le périphérique (ou fichier, nous verrons cela plus loin) doit apparaître dans l'arborescence de notre "système de fichier" : c'est à dire le chemin (ex : /mnt/disque/) qui nous servira à accéder à ce périphérique.

3. système de fichier

Ce champ indique à mount quel est le type du système de fichiers contenu sur le périphérique. Pour un disque Linux, ce sera 'ext2' (ou 'ext3' ou 'reiserfs' ou 'jfs' ou 'xfs' si vous utilisez un système de fichiers journalisé, c'est à dire beaucoup moins sensible au interruption brutale de fonctionnement, coupure de courant ou autres); pour un disque se sera 'vfat' ; pour un lecteur de cdrom ce sera 'iso9660' ; mais il peut y avoir (c'est certainement le cas de votre fichier fstab) d'autres types de système de fichier.

4. options

Ce champ est un peu particulier, car il indique à mount ce qu'il doit faire de manière plus précise ; par exemple : quels sont les droits du fichier contenu sur un système vfat (qui rappelons-le ne sait pas gérer de droits comme Linux) ? Est-ce qu'un utilisateur peut monter ce périphérique ? Est-ce qu'on peut lancer les exécutables sur ce périphérique ? Etc...
Chacune des options est séparée des autres par une virgule. Vous ne pouvez pas utiliser d'espace dans la chaîne d'options, sinon vous devez les entourer de " ".

5. sauvegarde

S'il est non nul ce champ indiquera à l'utilitaire dump qu'il peut sauvegarder ce système de fichier. Mettez 1 pour une partition ext2 et 0 pour les autres.

6. réparation/test

Ce champ indique à fsck qu'il faut, de temps en temps, tester ce périphérique avant de le monter. La valeur plus élevée de ce paramètre indique qu'il faut faire ce test en dernier. Mettez 1 pour la partition racine qui doit être testée en premier, 2 pour les autres partitions 'ext2' et 0 pour toutes les autres partitions.

Pour plus d'information sur les périphériques, les systèmes de fichiers, les périphériques, l'arborescence de fichiers sous Linux, voir le paragraphe "un peu de théorie" de l'article "Préparation de l'installation".


Un exemple.

Comme un dessin vaut mieux qu'un long discours, voici mon fichier fstab (vous pouvez cliquer sur chaque partie afin de voir à quoi elle correspond) :
 
/dev/hda3 / ext2 defaults 1 1
/dev/hda6 /usr  ext2 defaults 1 2
/dev/hda7 /opt  ext2 defaults 1 2
/dev/hda8 /tmp  ext2 defaults 1 2
/dev/hda9 /home ext2 defaults 1 2
/dev/hdc7 /usr/src  ext2 defaults 1 2
none /proc proc defaults 0 0
none /dev/pts devpts mode=0620 0 0
none /dev/shm tmpfs defaults 0 0
none /proc/bus/usb usbdevfs defaults 0 0
/dev/hda10 swap swap defaults 0 0
/dev/hda1 /c: vfat user,exec,conv=binary,umask=2,gid=1000 0 0
/dev/hda5 /e: vfat user,exec,conv=binary,umask=2,gid=1000 0 0
/dev/hdc1 /d: vfat user,exec,conv=binary,umask=2,gid=1000 0 0
/dev/hdc5 /f: vfat user,exec,conv=binary,umask=2,gid=1000 0 0
/dev/hdc6 /g: vfat user,exec,conv=binary,umask=2,gid=1000 0 0
/mnt/d7    /mnt/d7  supermount fs=vfat,dev=/dev/fd0,--,umask=2,gid=1000 0 0
/mnt/zip   /mnt/zip supermount fs=vfat,dev=/dev/zip,--,umask=2,gid=1000 0 0
/mnt/cdrom /mnt/cdrom supermount fs=iso9660,dev=/dev/scd0 0 0
/mnt/grav  /mnt/grav  supermount fs=iso9660,dev=/dev/scd1 0 0

La partition racine

Le montage de la partition racine est très important : sans lui, vous avez toutes les chances d'avoir un 'kernel panic' des plus ennuyeux (c'est à dire que lors du boot, le kernel ne trouve pas la partition racine, et se bloque sur le message d'erreur "kernel panic").

Le premier champ de ce type de montage doit être le nom du périphérique étant réellement la racine de votre installation. En fait, vous n'avez que très peu de raison de vouloir changer cette ligne. L'option 'defaults' n'est, par contre, pas forcément la plus adaptée. Vous pouvez parfois vouloir limiter les accès à cette partition ou autre. Le sixième champ doit être 1 (en effet il faut toujours faire le fsck sur la partition racine - en fait c'est elle qui contient le plus souvent le programme fsck).

Les partitions Linux

Pour ce qui concerne les partitions type ext2 (i.e. : Linux), vous pouvez en faire ce que vous voulez. La seule chose qui compte pour elles : c'est le point de montage (2ème champ). Il peut être astucieux d'avoir plusieurs partitions Linux.

Moi, j'utilise la répartition suivante :

évidemment, cette répartition n'est pas forcément la meilleure (moins de partitions ne peut pas vraiment nuire, mais j'aime bien utiliser toutes les possibilités de Linux ;) : utilisez celle qui vous convient ! (voir aussi le paragraphe "partitions" de l'article "Préparation de l'installation".)

Les partitions /proc, /proc/bus/usb, /dev/shm et /dev/pts

Ce ne sont pas réellement des partitions. D'ailleurs, vous pouvez constater que le périphérique correspondant à ces 'partitions' est none : c'est à dire 'pas de périphérique'. Ces entrées dans /etc/fstab ne servent qu'à indiquer à mount qu'il faut monter à cet endroit les pseudo-partitions /proc, /proc/bus/usb, /dev/shm et /dev/pts (la première donnant des informations sur le système, la seconde permet le contrôle des périphériques usb, la troisième permet le partage de zones mémoires entre applications, la dernière servant à l'accès aux terminaux Linux). Ce type de montage n'est pas à modifier sauf si vous savez ce que vous faites.
Ces partitions sont des pseudo systèmes de fichiers situés en mémoire vive, qui représentent des informations sur la machine sous la forme de simple fichiers, manipulables avec les commandes standard (cat, more, etc.). Mais sont en général non effaçable, même par le root. Les fichiers qui sont contenus dans ces 'partitions' peuvent être énormes : ils n'occupent pas réellement la place indiquée.

Les dernières évolutions du noyau de Linux utilisent encore plus ces pseudo-système de fichiers. On trouve donc :

Les partitions swap

Lorsque l'on précise comme système de fichier : swap, Linux comprend (on ne l'y prendra pas) que nous souhaitons utiliser une partition de swap (ou mémoire virtuelle ; échange entre la mémoire et le disque, permettant de simuler la présence d'une grande quantité de mémoire vive (RAM)).
Si vous avez plusieurs disques physiques (pas plusieurs partitions) il est astucieux de créer une partition de swap sur chacun d'eux et de préciser dans /etc/fstab la présence de ces différentes partitions de swap. De cette façon Linux est capable d'écrire en même temps sur chacune des partitions de swap (accélérant ainsi l'accès à cette mémoire virtuelle à la manière d'un système "raid 0" : la vitesse de transfert globale étant égale à la somme de la vitesse de chaque disque).

Les partitions vfat et NTFS

Si vous êtes un utilisateur de Windows, vous avez, très certainement, des partitions de type vfat (ou fat) ou NTFS.

Pour utiliser les systèmes de fichier NTFS, il faut que le support ntfs ai été compilé soit dans le kernel soit en module. Pour savoir si c'est le cas de votre kernel, faites :

[root@localhost ~]# cat /proc/filesystems | grep -v nodev

Si vous voyez apparaître "ntfs" alors, c'est bon vous n'avez rien à faire : le support ntfs est inclu dans votre kernel. Sinon, essayer de voir si ce support n'a pas été inclu en tant que module faites :

[root@localhost ~]# modprobe ntfs
[root@localhost ~]# cat /proc/filesystems | grep -v nodev

Si vous voyez apparaître "ntfs" alors, c'est bon vous n'avez rien à faire : le support ntfs est inclu en tant que module et celui-ci se chargera tout seul à la demande (si ce n'est pas le cas, ajoutez-le dans /etc/modules ou /etc/modules.autoload).

Sinon, et bien vous devrez soit trouver un module ntfs (il y peut par exemple y avoir un package spécifique pour ce support sur certaine distribution, je crois savoir que c'est le cas de certaines RedHat) pour votre kernel précompilé, soit recompiler votre kernel.

Comme le nombre d'options (et leur intérêt) est assez important, je vais décrire celles que l'on peut utiliser pour se rendre la vie plus agréable (quand on est utilisateur).

user/nouser
vous pouvez vouloir qu'un utilisateur puisse monter lui-même une partition de type vfat et pas uniquement le root (en fait cette option fonctionne avec tous les types de partitions), pour cela il faut préciser l'option : user. Par exemple :

/dev/hda2 /mnt/dos_c vfat user,exec 0 0

ou, si vous utilisez NTFS :

/dev/hda2 /mnt/dos_c ntfs user,exec 0 0

(nous verrons plus loin l'utilisation de exec).
De cette façon n'importe quel utilisateur peut monter la partition /dev/hda2, mais uniquement sur /mnt/dos_c, en utilisant la commande :

mount /mnt/dos_c

Rien de plus simple ! Il faut que cette option soit activée pour qu'un utilisateur puisse accéder à une partition en utilisant les facilités des environnements comme KDE ou Gnome.
Si vous précisez nouser (c'est l'option par défaut) aucun utilisateur ne pourra monter ce système de fichier.

exec/noexec
vous (vous et vos utilisateurs) pouvez vouloir exécuter des programmes sur cette partition vfat. Mais comme celle-ci ne permet pas d'utiliser les droits chers aux systèmes POSIX (dont Linux fait partie)... il faut utiliser l'option : exec. De cette façon tous les fichiers stockés sur cette partition sont exécutables (a priori, mais il faut voir... : en fait, ils en ont seulement les droits) par le système. noexec est fait le contraire de exec : aucun fichier n'est exécutable.

auto/noauto
vous pouvez vouloir que cette partition soit montée automatiquement, dans ce cas vous utiliserez l'option auto (c'est l'option par défaut). Pour monter les partitions automatiques il faut préciser à mount le paramètre -a.
Le paramètre qui sert est en fait noauto qui permet de ne pas monter automatiquement une partition (par exemple un lecteur de cdrom, de disquette ou de zip)

ro/rw
Le paramètre ro indique à mount de monter ce système de fichier en mode lecture seule (read only), rw permet de monter ce système en lecture/écriture (read write). Même le root ne peut pas passer outre ce paramètre dans une écriture directe.

Note: le support des partitions NTFS est encore imparfait sous Linux.

Si vous utilisez un kernel 2.6.6 (ou plus), alors vous pouvez activer l'option 'rw' (lecture/écriture), mais sachez que vous ne pourrez pas créer de nouveaux fichiers, ni de nouveaux répertoires, que vous ne pourrez pas non plus modifier la taille des fichiers. Cependant l'écriture est réputée sans risque (i.e. la modification de fichiers existants).

Si vous utilisez un kernel inférieur à 2.5 (2.4 par exemple), il est déconseillé d'utiliser l'option 'rw' car, l'écriture sur des partitions NTFS avec ces kernels est réputée 'destructrice' du système de fichier. On vous aura prévenu.

Sachez aussi qu'il existe pour ceux que l'utilisation de drivers propriétaires ne rebutent pas, la possibilité d'utiliser les pilotes NTFS de Windows grâce à : captive qui utilise l'API de Wine (il s'agit d'une réécriture des librairies Windows pour Linux) pour charger les DLL NTFS de Windows. Il faut bien sûr posséder Windows pour pouvoir l'utiliser.

suid
ceci ne s'applique qu'aux partitions ayants des droits (i.e.: pas les vfat) : suid permet d'utiliser les programmes utilisant le bit set-UID (ou set-GID). C'est à dire les programmes outrepassant les droits normaux des utilisateurs (attention danger : un simple utilisateur utilisant les droits de root, cela ouvre des brèches possibles dans la sécurité).

uid/gid
ces options permettent de fixer l'uid (user identifier) et le gid (group identifier) de tous les fichiers de ce système de fichier. Elles utilisent la syntaxe :

/dev/hda2 /mnt/dos_c vfat user,uid=500,gid=500 0 0


Lorsque la partition /dev/hda2 est montée, tous ses fichiers appartiennent au groupe 500 et à l'utilisateur 500 (voir les fichiers /etc/group et /etc/passwd pour savoir leur nom !).
Si vous ne précisez rien : les fichiers appartiennent à l'utilisateur ayant appelé mount (root si vous n'avez rien fait de spécial).

umask
Cette option fixe l'umask des fichiers de ce système de fichier. L'umask est un 'masque' de bit des permissions qui ne sont pas fournies. Exemple si vous mettez :

/dev/hda2 /mnt/dos_c vfat user,umask=002 0 0


alors tous les fichiers de ce système de fichier ont les droits 777 - umask = 777 - 002 = 775 (c'est à dire les droits : rwxrwxr-x, note : les calculs se font en octal et pas en décimal) : donc tout le monde pourra lire ou exécuter des fichiers sur ce système de fichiers, mais seuls les membres du groupe et l'utilisateur possédant les fichiers pourront les modifier.

avec un umask=022, les permissions sont : rwxr-xr-x
avec un umask=017, les permissions sont : rwxrw----
(voir la rubrique "permissions").

conv=binary/conv=text/conv=auto (ne s'applique pas à NTFS)
Comme vous le savez certainement les fichiers texte de et DOS n'ont pas le même format que ceux des Unixes (le caractère indiquant un retour à la ligne est différent). Ce paramètre permet au noyau de Linux de faire une conversion automatique. Si la conversion est 'binary' (c'est le comportement par défaut) aucune conversion n'est effectuée (et ainsi aucune corruption d'un fichier ne peut arriver...).
Si la conversion est 'text' tous les fichiers sont considérés comme étant de type texte et une conversion est effectuée. Cela pose problème pour certains fichiers/programmes (par exemple wine) : par exemple, un fichier image (.jpg ou autre) sera certainement corrompu, car certains de ses octets seront modifiés.
Si la conversion est 'auto', alors certains fichiers (i.e.: .exe, .com etc...) ne sont pas convertis. Cela peut aussi poser quelquefois des problèmes, mais un peu moins qu'avec l'option 'text'.
Le plus simple est de laisser la conversion sur 'binary' et d'effectuer soit même la conversion, mais vous pouvez quand même préférer l'utiliser.

iocharset
Ce paramètre sert à indiquer à Linux que le système de fichiers vfat ou NTFS qu'il doit monter stocke ses noms de fichiers avec un ensemble de caractères (charset) spécifique. En France, le charset a toute les chance d'être : iso8859-1 (c'est le défaut) ou iso8859-15 (ça devrait être le défaut, puisque ce charset contient aussi le symbol euro). Si vous avez des problèmes avec les noms fichiers et une partition vfat ou NTFS, essayer d'ajouter l'option : iocharset=iso8859-1 ou iocharset=iso8859-15

codepage
Ce paramètre sert à indiquer à Linux que le système de fichiers vfat ou NTFS qu'il doit monter stocke ses noms de fichiers avec une page de code spécifique. Par défaut la page de code est la page 437 qui correspond aux caratères américains. Il y a fort à parier que votre partition utilise la page de code 850 qui correspond aux caractères des langues européennes. Il faut donc ajouter l'option : codepage=850.

Il existe de multiples autres options (je vous renvoie à la man page de mount, toute cette description d'options n'est qu'une pâle copie de celle-ci)

Chez moi, j'utilise umask=2,gid=1000,uid=0 ; de cette façon les partitions vfat sont montées comme appartenant au root et au groupe 1000. Pour autoriser certains utilisateurs à écrire sur cette partition, il suffit de les faire appartenir à ce groupe. En effet l'umask étant 2, seul le possesseur (ici root) et les membres du groupe 1000 peuvent écrire sur cette partition.

Les disques amovibles

Vous avez supermount (i.e.: un kernel patché, ou une Mandrake 7.0v2 ou plus)
Si vous avez supermount (si vous n'avez pas le patch) vous pouvez l'utiliser pour gérer les disques amovibles. Avec lui, plus besoin de monter et démonter les disques amovibles : il le fait à votre place (le comportement ressemble à celui de DOS/Windows) ! De plus, avec supermount, vous pouvez toujours éjecter vos cdrom (éventuellement en attendant un petit peu) sans les démonter auparavant. C'est très cool.
Donc, si vous l'avez, vous pouvez monter (virtuellement pour le moment) vos disques amovibles comme étant des disques contenant un système de fichier de type "supermount". Voici la syntaxe (dans /etc/fstab) :

<path> <path> supermount fs=<fs>,dev=<dev>,--,<autres> 0 0

A la place de <path> vous mettez le nom du répertoire par lequel vous comptez accéder à ce disque amovible (exemple : /mnt/disquette pour une disquette) : ce répertoire DOIT exister, créez le avant de monter ce disque (commande mkdir). A la place de <fs> mettez le nom (pour mount) du système de fichier présent sur les disques amovibles de ce support (i.e.: vfat pour une partition Windows, iso9660 pour un CD-ROM, etc.). A la place de <dev> mettez le nom du périphérique Linux permettant d'accéder réellement à ce support (i.e.: /dev/fd0 pour un lecteur de disquette, /dev/hdc pour un lecteur de cdrom maître sur la deuxième nappe IDE, etc...).

A la place de <autres> mettez les options normales du système de fichiers : <fs>. Par exemple une option gid=500 pour un système de fichiers vfat.

Vous n'avez pas supermount
Dans ce cas, le mieux est de mettre une ligne du type :

<dev> <path> <fs> user,noauto 0 0

Pour la signification de <dev>, <path> et <fs> : voir ci-dessus.

De cette façon tous vos utilisateurs peuvent monter et démonter un système amovible, avec la commande :

mount <path>

Mais, pour changer de disque (même une disquette) il faut impérativement 'démonter' le périphérique avant de l'éjecter, sous peine de perte de données :

umount <path>

Si vous ne prenez pas ces précautions, vous courrez à votre perte (en effet, les écritures sur une disquette par exemple se font de manière différées : si vous éjectez la disquette sans faire de "umount", certaines données peuvent ne pas avoir été écrites. Ne venez pas dire qu'on ne vous a pas prévenu ;).

Ce fonctionnement est le fonctionnement classique des unixes et de Linux sans supermount.

Vous n'avez pas supermount et vous voulez l'installer et patcher votre noyau.
Vous n'avez jamais compilé votre noyau : lisez la rubrique "noyau".
Procurez vous le patch sur le site de l'auteur. La version que j'ai testée est la 0.1.5 pour noyau 2.2.14 (sur un noyau 2.2.14, un 2.2.15 et un 2.2.16 sans aucun problème). Décompressez le patch :

[user@localhost home]$ unzip supermount-0.1.5-2.2.14.zip

Appliquez le patch au source du noyau :

cd /usr/src/linux-2.2.16
patch -p0 < /home/user/supermount-0.1.5-2.2.14.diff

Recompilez votre noyau avec (entre autres) le support de supermount (allez voir dans filesystem).

Pour les derniers noyaux (2.4.x, 2.5.x et même le futur 2.6.x), Mandrake a maintenu le code original et on trouve les patches sur : http://supermount-ng.sourceforge.net. Merci la GPL ;-)


Puis, reportez vous au paragraphe précédent.

Petite FAQ

FAQ : Foire Aux Questions

mount : le périphérique spécial /dev/cdrom n'existe pas.
Certaine distribution ne crée pas ce lien ... Et bien créez le ! Pour cela identifiez votre lecteur de CD :

[root@localhost ~]# for i in /proc/ide/ide[0-9]/hd[a-z] ; do if [ "$(cat $i/media)" = "cdrom" ] ; then echo -n /dev/ ; echo $i | sed "s/.*\///" ; fi ; done

Ceci vous retournera la liste des lecteurs de CD ide (pour les scsi, cherchez un peu ...). Choisissez alors, le lecteur que vous voulez assigner à /dev/cdrom (si vous avez un graveur et un lecteur, préférez le lecteur) par exemple, avec la commande suivante :

[root@localhost ~]# ln -sf /dev/hdb /dev/cdrom

On identifie /dev/cdrom avec le lecteur réel /dev/hdb.

Autres questions ?
Posez donc une question sur les forums de Léa ;-)

Haut


Gestion des services

par Philippe (superjoker@club-internet.fr), complété par Anne, Fred et Jice

Comment ajouter et supprimer des services (daemons, etc.) au démarrage.


Définitions

Les daemons (ou démons) sont des programmes résidents chargés au démarrage. A chaque runlevel, correspond une liste de daemons à lancer  (1 à 5) ou à arrêter (6 ou 0).

D'autres programmes que des démons peuvent également être lancés dès le démarrage de la machine, avec le même mécanisme.

Les runlevels ou "niveaux d'exécution", correspondent aux services qui vont être lancés au démarrage de la machine. En général (mais toutes les distributions n'utilisent pas la même numérotation), on peut avoir les niveaux d'éxécution suivant :

Le niveau d'exécution est déterminé (dans l'ordre) soit :

Remarque : Le fonctionnement des services sur une gentoo, bien qu'assez similaire, est différent.

Fonctionnement

Les services sont lancés par des scripts situés dans /etc/init.d (ou dans /etc/rc.d/init.d, (qui sont souvent le même fichier, l'un étant un lien vers l'autre). Chaque script contient une description ce qui permet de savoir ce que fait chaque daemon en début de script.

Le répertoire /etc/rc.d/ contient aussi des répertoires nommés rcX.d (avec X numéro de runlevel). Chacun de ces répertoires contient un lien vers les scripts situés dans init.d.

Exemple:

$ ls -l /etc/rc.d/rc5.d
rwxrwxrwx 1 root root 13 Jun 16 23:23 K30usb -> /etc/rc.d/init.d/usb*
lrwxrwxrwx 1 root root 16 Jun 17 00:03 S30syslog -> /etc/rc.d/init.d/syslog*
lrwxrwxrwx 1 root root 18 Jun 17 00:05 S75keytable -> /etc/rc.d/init.d/keytable*

La 1ère lettre détermine si le daemon est activé (S comme start) dans ce niveau d'exécution (runlevel) ou arrêté (K comme kill).
Les 2 chiffres permettent de trier l'ordre d'exécution des services (dans l'exemple, syslog est démarré avant keytable).

Remarque : sur une gentoo, les répertoires correspondant à un runlevel particulier sont stockés dans /etc/runlevels/. La gestion des runlevels par gentoo est complétement différente : il n'est pas nécessaire de se préoccuper de l'ordre de démarrage des services car chaque service précise quels sont les services qui lui sont nécessaires, le reste (dépendances...) est géré automatiquement. De plus les runlevels ont des noms plutôt que des numéros. Par default, une Gentoo arrive avec les runlevels : boot, default, nonetwork, single.

Commandes utiles

Plutôt que de modifier directement les liens, on va utiliser la commande suivante :
/etc/init.d/nom_service {start|stop|restart|reload|status} ou
service nom_service {start|stop|restart|reload|status}. À ce propos, je recommande d'utiliser "bash-completion" qui permet d'améliorer la complétion automatique de la ligne de commande, et par exemple de lister tous les services disponibles, en tapant "service" puis la touche [Tab].

Exemple:

/etc/rc.d/init.d/linuxconf  start

Note: les options start/stop/restart lancent/arrêtent/redémarrent le service spécifié pour tous les niveaux.

Note (Mandrake, RedHat...) : on peut utiliser la commande service pour démarrer un service particulier,

$ service nomduservice start

ou :

$ service nomduservice stop

pour l'arrêter.

chkconfig

pour Mandrake et RedHat

La commande chkconfig est un peu plus puissante.

Pour ajouter un daemon dans tous les niveaux de demarrage:
/sbin/chkconfig --add le_service

Note: le daemon doit obligatoirement se trouver dans /etc/rc.d/init.d ou /etc/init.d.

Pour lister tous les daemons avec leurs status:

/sbin/chkconfig --list
atd       0:off   1:off   2:off   3:on    4:on    5:on    6:off
xfs       0:on    1:on    2:on    3:on    4:on    5:on    6:on
keytable  0:off   1:off   2:on    3:on    4:on    5:on    6:off
gpm       0:off   1:off   2:on    3:on    4:on    5:on    6:off

Autre option:
/sbin/chkconfig --list le_service
pour ne lister que celui souhaité.

Pour activer ou désactiver un service au démarrage :
/sbin/chkconfig --level 123456 mon_service on/off
(avec 123456 le(s) runlevel(s) pour le(s)quel(s) le service doit être ou non activé).

Pour plus de détails, voir la man page.

C'est bien beau, mais si je dois me tapper tout ça à la mimine ?! Stop ! Linux a pensé à nous, et pour se simplifier la tache, on a plusieurs outils : Linuxconf via Panneau de configuration/gestion des services (qui stoppe ou arrête un daemon pour tous les runlevels), Runleveleditor (qui permet de choisir pour chaque runlevel les daemons à activer ou non), ksysv, etc. Fais ton choix camarade ;-)

rc-update

pour Gentoo

La configuration des services passe par la commande rc-update. Son fonctionnement est des plus simples.

$ rc-update add nomduservice nomdurunlevel

Par exemple, supposons que vous ayez un script speedtouch qui démarre votre connexion internet, pour qu'elle démarre automatiquement, il suffit de faire :

$ rc-update add speedtouch default

Pour arrêter un service c'est exactement pareil :

$ rc-update del speedtouch default

À partir de maintenant, votre speedtouch ne démarrera plus automatiquement.

Pour lister les services d'un runlevel particulier :

$ ls /etc/runlevels/nomdurunlevel

Ajouter ses propres services

Nous allons détailler les étapes nécessaires pour configurer un nouveau service et l'ajouter à la base de chkconfig. Nous allons prendre l'exemple d'un service nommé bidule, qui devra être démarré aux runlevels 3, 4 et 5.

1 - Ecrire le script de configuration du démarrage

Pour écrire le script /etc/rc.d/init.d/biduled, on peut s'inspirer d'un script existant dans ce répertoire. Ci-dessous un exemple de ce script que nous allons détailler

root@pingu# cat /etc/rc.d/init.d/biduled
#!/bin/sh
# description: exemple de script pour Léa
# chkconfig: 345 99 0

Attention la syntaxe des 2 dernières lignes est à respecter à la lettre pour que le service puisse être ajouté correctement par la commande chkconfig. Nous devons spécifier 2 mots clé :

#source function library
. /etc/init.d/functions

On charge ici en mémoire les fonctions définies dans le fichier /etc/init.d/functions. Nous allons en effet utiliser certaines d'entre elles comme daemon, killproc, status.

case $1 in

'start')
[ -f /var/lock/subsys/biduled ] &&
exit 0
echo -n "exécute bidule"
daemon /usr/bin/biduled
echo
touch /var/lock/subsys/biduled
;;

On démarre ici le traitement des arguments de gestion du service. Pour le démarrage, on vérifie d'abord qu'il n'existe pas de fichier de lock, ce qui permet d'éviter de démarrer 2 fois le même service. S'il existe alors on sort du script. Dans le cas contraire, on affiche un message sur la console indiquant le démarrage de bidule et c'est la fonction daemon qui se charge de lancer le service. Enfin au moment du lancement, on crée le fichier de lock.

'stop')
echo -n "arrête bidule"
killproc biduled
echo
rm -f /var/lock/subsys/biduled
;;

En ce qui concerne l'arrêt du service, on utilise la fonction killproc qui récupère le numéro de processus de notre service et le tue avec la commande kill. On efface également le fichier de lock afin de permettre éventuellement le redémarrage du service.

'restart')
$0 stop
$0 start
;;

Le redémarrage du service consiste simplement à utiliser ce même script pour l'arrêter puis le démarrer

'status')
status biduled
;;

Cet argument permet de vérifier si le service est lancé, au moyen de la fonction status.

*)
echo "Usage : biduled \
{start|stop|restart|status}"
exit 1
;;
esac
exit 0

Ce cas de figure traite le cas où l'utilisateur ne rentre pas le bon argument. On lui renvoie donc un message d'erreur lui indiquant ceux qui doivent être utilisés.

Ouf ! Nous avons terminé le script. Il ne reste plus qu'à le rendre exécutable :

root@pingu# chmod +x /etc/rc.d/init.d/biduled

2 - Ajouter le service à la base de chkconfig

Le plus gros du travail est fait ! Il ne reste plus qu'à ajouter le service biduled à la base des services gérée par chkconfig. Pour ce faire, rien de plus simple :

root@pingu# chkconfig --add biduled

Le service fait maintenant partie de la base, les liens symboliques de démarrage ont été créés automatiquement de la manière suivante :

# ll /etc/rc.d/rc?.d/*biduled lrwxrwxrwx 1 root root 17 oct 11 09:37 rc0.d/K00biduled -> /etc/rc.d/init.d/biduled
lrwxrwxrwx 1 root root 17 oct 11 09:37 rc1.d/K00biduled -> /etc/rc.d/init.d/biduled
lrwxrwxrwx 1 root root 17 oct 11 09:37 rc2.d/K00biduled -> /etc/rc.d/init.d/biduled
lrwxrwxrwx 1 root root 17 oct 11 09:37 rc3.d/S99biduled -> /etc/rc.d/init.d/biduled
lrwxrwxrwx 1 root root 17 oct 11 09:37 rc4.d/S99biduled -> /etc/rc.d/init.d/biduled
lrwxrwxrwx 1 root root 17 oct 11 09:32 rc5.d/S99biduled -> /etc/rc.d/init.d/biduled
lrwxrwxrwx 1 root root 17 oct 11 09:37 rc6.d/K00biduled -> /etc/rc.d/init.d/biduled

Si vous n'avez pas chkconfig ou désirez faire cette opération manuellement, il vous suffit de créer les liens symboliques listés ci-dessus.

Nous pouvons également vérifier de la manière suivante :

root@pingu# chkconfig --list | grep biduled
biduled 0:Arrêt 1:Arrêt 2:Arrêt 3:Marche 4:Marche 5:Marche 6:Arrêt

Ajouter ses propres services sur une Gentoo

Le principe est le même que dans la section précédente, mais les fonctions disponibles sont différentes.

Un script de démarrage de Gentoo doit forcément être stocké dans /etc/init.d et commencer par :

#!/sbin/runscript
# Copyright Léa Linux 2003.
# Distributed under the terms of the GNU General Public License v2

Vous pouvez remarquer qu'il ne commence pas par #!/bin/sh comme le fait habituellement un script. En fait c'est un habillage de /bin/sh qui met en place tout ce qui est nécessaire aux services de démarage.

Ensuite, on précise ce qui est nécessaire à notre script ainsi que ce qu'il fournit comme service (si le nom du service est différent de celui du script) :

depend() {
use cups
need net my-firewall
provide monbeauservice
}

Ce qui signifie :

La fonction depend() est appelée en interne par /sbin/runscript pour déterminer l'ordre de démarrage des services ainsi que ceux qu'il faut démarrer.

Ensuite, il nous faut écrire ce qui doit se passer quand on démarre un service.

start() {
ebegin "Démarrage de MonService à Moi"
start-stop-daemon --start --quiet --exec /usr/bin/monservice
eend $?
}

Ici, nous avons utilisé trois fonctions qui simplifient la rédaction d'un script de démarrage pour Gentoo :

L'utilisation de ces fonctions n'est absolument pas nécessaires. Mais elle est bien pratique.

Puis, nous devons écrire la fonction appelé quand on veut stopper le service :

stop() {
ebegin "J'arrête Mon Service à Moi"
start-stop-daemon --stop --quiet --exec /usr/bin/monservice
eend $?
}

Je pense que c'est assez clair.

Voilà c'est tout ! Le reste est géré par le programme /sbin/runscript. Si vous sauvez ce script dans /etc/init.d/monservice, vous l'activez par :

# chmod +x /etc/init.d/monservice
# rc-update add monservice default

La classe quoi ! Qui a dit que Gentoo était complexe ?

Faire du ménage

Dans mon cas et à titre d'exemple (internet, pas d'imprimante, travail sous X, son) je ne garde en activité que : syslog, xfs, keytable.

Pour information, voici une liste (non exhaustive) de quelques daemons et de leur fonctions.

apmd: nécessaire uniquement pour les ordinateurs portables
xntpd: Network time protocol
portmap: nécessaire si vous utilisez un service rpc, comme NIS ou NFS
sound: configuration des sons (ma carte fonctionne très bien sans ??? ndlr:normal si le fichier /etc/modules.conf est bien conçu)
netfs: c'est le client nfs, utilisé pour mounter des filesystems depuis un serveur nfs
rstatd , rusersd, rwhodrwalld: ne pas exécuter tous les services car ils fournissent trop d'informations aux utilisateurs à distance
bootparamd: Utilisé par les clients sans lecteur de disquette (vulnérable)
squid: serveur proxy
yppasswdd: nécessaire si vous êtes un serveur NIS (extrêmement vulnérable)
ypserv: nécessaire si vous êtes un serveur NIS (extrêmement vulnérable)
dhcpd: démarre le daemon du serveur dhcp
atd: utilisé pour le service at, similaire à cron, mais n'est pas nécessaire
pcmcia: parle de lui-même
snmpd: daemon SNMP, peut donner à des utilisateurs distants des informations détaillées sur votre système
named: serveur DNS
routed: RIP, n'exécutez cela que si vous en avez vraiment besoin
lpd : services d'impression
mars-nwe: fichier Netware et serveur d'impression
nfs: Utilisé pour le serveur NFS, lancez le que si vous en avez absolument besoin
amd: daemon AutoMount, sert à mounter les filesystems distants
gated: sert à lancer d'autres protocoles de routage comme OSPF
sendmail: Vous pourrez toujours envoyer/recevoir des emails par Netscape (ou autre) sans lui.
httpd: serveur web Apache
ypbind: nécessaire si vous êtes un client NIS
xfs: xfont server (indispensable si vous êtes sous X).
innd: serveur de news
arpwatch: off par défaut. Rapport d'activité de datagrammes IP via mail
kudzu: détection des periphériques. A réactiver à l'occasion
anacron: reprise de jobs de la crontab après un crash
crond: si vous ne savez pas ce qu'est une crontab, désactivez-le.
rawdevices: partitions spécifique sous ORACLE ou autre SGBD
random: améliore la génération aléatoire de nombres (peut être utile pour les joueurs)
rhnd: redhat network
linuxconf: j'utilise linuxconf sans ce daemon (peut être est-ce utile pour l'administration à distance ?)
nfslock: si vous n'êtes pas serveur NFS, désactivez-le
usb: parle de lui-même
gpm: fournit des fonctions pour le support de la souris en mode texte (utile pour midnight commander en particulier)

Ouf, c'est fini...

Haut


Programmation de travaux

par Anne

Où comment rendre son pingouin autonome :)


Pourquoi ces outils de programmation ?

Imaginez que vous souhaitez lancer une tâche durant la nuit, ou bien effectuer des sauvegardes régulières de vos données, remettre à jour la base de vos packages... L'objectif de cet article est de vous présenter le fonctionnement et le paramétrage de trois outils de programmation sous Linux.

Les différents outils de programmation de tâches

Votre système dispose de plusieurs outils de programmation de tâche en fonction de ce que vous souhaitez réaliser :

La commande at

Comme on l'a vu plus haut, at permet de programmer l'exécution d'une tâche à un moment donné.

Fonctionnement

C'est le démon atd qui est en attente sur votre machine, qui se charge d'exécuter toutes les tâches planifiées avec at. Comme tous les services, on le retrouve dans le répertoire /etc/init.d (parfois c'est un lien vers /etc/rc.d/init.d). En cas de dysfonctionnement de at, il convient de vérifier, notamment, que le démon atd est bien lancé :

root@pingu# /etc/rc.d/init.d/atd status
atd (pid 818) en cours d'exécution

Les travaux en attente d'exécution sont stockés dans la file d'attente située dans /var/spool/at.

Syntaxe

Ajouter une programmation de tâche : at. Deux façon de l'utiliser : avec une ligne de commande ou un fichier contenant un script à exécuter.

Syntaxe :

  1. commande : at HEURE
    La commande est ensuite saisie en mode interactif. Vous pouvez saisir autant de lignes que nécessaire et terminer par Ctrl+D pour obtenir le End Of Text.
    Exemple : programmer l'affichage de "coucou" à 23h sur la console 5

    anne@pingu$ at 23:00
    warning: commands will be executed using (in order) a) $SHELL b) login shell c) /bin/sh
    at> echo coucou > /dev/pts/5<EOT>

  2. fichier : at -f fichier HEURE
    Exemple : programmer l'exécution du script /home/anne/sauve à 23h.

    anne@pingu$ at -f /home/anne/sauve c23:00

Le format de HEURE est commun aux 2 notations et permet une syntaxe assez large. Ce qui est utilisable :

Lister les tâches programmées au moyen de at : atq
Exemple :

root@pingu# atq
4 2002-12-11 02:10 a root
5 2002-12-11 02:15 a root
6 2002-12-11 02:20 a root

Dans ce cas de figure, on a 3 tâches programmées avec at par root. La colonne de gauche indique le numéro de job attribué à la tâche (par ordre croissant d'arrivée dans la file).

Supprimer une ou plusieurs tâches programmées en attente d'exécution : atrm n°job
Exemple :

root@pingu# atrm 6

Contrôle de l'utilisation de la commande

La commande at est accessible à root et aux utilisateurs déclarés sur la machine. Toutefois vous avez à votre disposition 2 fichiers : /etc/at.allow (pour autoriser spécifiquement des utilisateurs à utiliser at) et/ou /etc/at.deny (pour interdire spécifiquement à des utilisateurs d'utiliser at). Si aucun des 2 fichiers n'existe, seul root peut utiliser la commande. Par défaut, il existe souvent un fichier /etc/at.deny vide qui autorise ainsi l'utilisation de cette commande par tous les utilisateurs (puisque personne n'est interdit).

Exemple : je veux autoriser uniquement les utilisateurs root, pingu et anne à utiliser la commande

root@pingu# cat /etc/at.allow
root
pingu
anne

Et, je ne crée pas de fichier /etc/at.deny donc, puisqu'il n'existe pas, personne n'a le droit d'utiliser at sauf ceux qui sont autorisés par /etc/at.allow.

La commande cron

Fonctionnement de cron

Tout comme at, cron permet de programmer des travaux à exécuter, mais ceci de manière récurrente. Par exemple pour faire une sauvegarde toutes les nuits à 2h30.

Les composantes pour le fonctionnement de cron sont :

Commandes et configuration de cron

crontab : le fichier de configuration de cron

Il existe une crontab par utilisateur. Seul root peut consulter chacune d'entre elles.

Syntaxe :

Le fichier doit comporter une tâche à programmer par ligne. Chaque ligne doit comporter obligatoirement 6 colonnes :

Exemple : pour excuter le script /root/sauve.sh tous les jours à 23h15 on mettra dans la crontab de root

15    23    *    *     *    /root/sauve.sh

Les colonnes contenant la date d'exécution peuvent contenir divers formats pour indiquer la date (pour les exemples, on utilisera la colonne des minutes de la crontab) :

Il est bien sûr possible de combiner les différentes notations pour obtenir ce dont vous aurez besoin.

les commandes

Nous avons vu la syntaxe de la crontab. Pour éditer, modifier ou visualiser le contenu d'une crontab, il vous faut utiliser la commande crontab avec les options suivantes :

Remarque : par défaut, les commandes crontab agissent sur votre crontab uniquement. (rappel : il y a autant de crontab que d'utilisateurs ayant définit des tâches à effectuer avec cron.)
Toutefois l'administrateur (root) peut utiliser une option supplémentaire : -u user. Il spécifie ainsi la crontab de l'utilisateur qu'il veut éditer, modifier ou supprimer.

Exemple : pour modifier la crontab de l'utilisateur anne

root@pingu# crontab -u anne -e

la crontab du système

Lorsque vous installez votre distribution, une crontab particulière est crée, celle du système : /etc/crontab

root@pingu# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

Le fichier définit tout d'abord un certain nombre de variables pour l'exécution des tâches système : SHELL, PATH, MAILTO, HOME(la définition de variables est également possible dans une crontab ordinaire, mais beaucoup plus rarement utilisé.). La suite du fichier utilise ensuite la syntaxe vue ci-dessus.

L'exécution des tâches utilise un script particulier : /usr/bin/run-parts. Il s'agit d'un script bash qui exécute toutes les commandes situées dans le répertoire passé en argument. On remarquera que la temporisation utilisée pour programmer chacune de ces lignes correspond à des tâches devant s'exécuter toutes les heures, les jours, les semaines, les mois.

Exemple : la crontab système exécute tous les jours run-parts /etc/cron.daily.
Le répertoire /etc/cron.daily contient les commandes suivantes :

root@pingu# ls /etc/cron.daily
00-logwatch 0anacron makewhatis.cron slocate.cron tmpwatch
00webalizer logrotate rpm tetex.cron

Ce sont donc tous les scripts qui seront exécutés tous les jours à 4h02.

Contrôle de l'utilisation de la commande cron

Tout comme pour la commande at, la commande la commande cron est accessible à root et aux utilisateurs déclarés sur la machine. Toutefois vous avez là encore à votre disposition 2 fichiers : /etc/cron.allow et/ou /etc/cron.deny (qui fonctionne comme ceux de at). Si aucun des 2 fichiers n'existe, le comportement peut varier d'une distribution à une autre : soit root seul peut utiliser la commande, soit aucune restriction n'est appliquée.

Exemple : je veux autoriser uniquement les utilisateurs root, pingu et anne à utiliser la commande

root@pingu# cat /etc/cron.allow
root
pingu
anne

Et, je ne crée pas de fichier /etc/at.deny.

la commande anacron

Fonctionnement de anacron

Contrairement à cron, anacron ne fonctionne pas avec un démon. Il s'agit d'une commande lancée au démarrage (/usr/sbin/anacron). Elle est souvant lancée comme un service, on peut donc, dans ce cas, trouver son script de démarrage dans /etc/init.d

anacron permet l'exécution d'une tâche au bout d'une période de temps qui se serait écoulée. Contrairement à cron, la spécification de la période ne permet pas autant de précision. Toutefois on a vu qu'une tâche programmée à l'aide de cron nécessite que le démon crond soit activé. Donc si la machine est éteinte, la tâche ne sera pas exécutée.

Imaginez que vous programmiez une tâche pour qu'elle s'exécute toutes les semaines. Votre machine est éteinte durant 10 jours, la commande sera donc exécutée au prochain redémarrage.

Attention anacron est un utilitaire strictement réservé à root. Le fichier de configuration est /etc/anacrontab.

Le fichier de configuration : anacrontab

Il a une syntaxe similaire à celle de la crontab, il faut donc mette une ligne par tâche à effectuer. Chaque ligne doit contenir 4 colonnes :

La ligne suivante :

1    65   cron.daily   run-parts /etc/cron.daily

signifie que la commande run-parts /etc/cron.daily sera exécutée 1 fois par jour, chaque tâche sera séparées des autres d'au moins 65 minutes.

Exemple : ci-dessous un exemple de anacrontab

root@pingu# cat /etc/anacrontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
1 65 cron.daily run-parts /etc/cron.daily
7 70 cron.weekly run-parts /etc/cron.weekly
30 75 cron.monthly run-parts /etc/cron.monthly

conclusion

Voilà présentés les principaux outils de programmation des tâches sous Linux. D'autres outils existent, comme fcron qui comblerait certaines failles de sécurité de cron

N'hésitez pas à me faire parvenir vos remarques et ajouts divers sur le contenu de cet article.

Haut


Raid logiciel sous Linux

par Lionel Tricon

Un petit tutoriel sur la configuration du Raid logiciel sous Linux.


Introduction

Le principe du RAID repose sur l'idée de combiner plusieurs disques durs bon marché (indifférement IDE ou SCSI) dans le but de :

En effet, la capacité des disques actuels, même si elle s'est singulièrement améliorée ces dernières années (on trouve couramment du 18 ou du 36 Gigas de nos jours), reste tout de même peu de chose lorsque l'on souhaite parler en Téra et non plus en Giga.

Même sans aller jusqu'à vouloir stocker de grandes quantité de données (soyons raisonnable, 9 Giga devrait suffire pour un petit serveur web ...), on peut vouloir utiliser la notion de redondance du Raid afin d'améliorer la tolérance aux pannes de son architecture : les données seront dupliquées sur des disques différents afin de pouvoir palier à la perte d'un disque.

Si la résistance aux pannes de l'architecture n'est pas une contrainte majeure (on peut envisager de sauvegarder sur bande tous les soirs son serveur de fichiers), on peut utiliser le Raid pour étendre simplement la capacité de stockage possible, et ce de manière transparente pour le système : 4 disques de 4,3Go donnant une partition utile de ~16Go.

On peut vouloir aussi gagner en performance sur les I/O disques : en effet, lire ou écrire sur de multiples disques permet de paralléliser les opérations (surtout sur des bus différents) et donc de gagner en performances.

En fait, il ne faut d'ailleurs pas parler d'un seul Raid, mais bien de plusieurs : Mode Linéaire, Raid 0, Raid 1, Raid 0+1, Raid 4 ou encore Raid 5. Il conviendra donc d'analyser à l'avance ses besoins pour faire le bon choix.

Je n'aborderais que le Raid logiciel dans ce document et non le Raid hardware. Le premier est supporté directement dans le code de l'OS alors que l'intelligence du second est déportée dans du hardware : que ce soit sous forme d'une carte à enficher dans le serveur (nécessite un driver) ou encore dans une baie extérieure (transparent pour l'OS). On peut dire que le Raid logiciel est moins performant, moins tolérant mais beaucoup plus accessible financièrement.

Nota : Dans presque tous les RAIDS que l'on va aborder (excepté le RAID linéaire et le raid 0), il sera possible de configurer des disques de rechange (disques de spare) qui seront automatiquement utilisés pour reconstruire le RAID dans le cas de pannes disques (pas dans le cas de pannes sur le controleur IDE ou SCSI).

Le Raid et Linux

Le mieux est de directement utiliser le support RAID présent dans les distributions Linux récentes (version des RaidTools : 0.90) : j'ai personnellement testé la distribution Linux RedHat 6.1 sur plateforme Alpha et la Mandrake 7.2 Intel sans rencontrer de soucis majeurs.

Vérifiez que les modules linear, raid0, raid1 et raid5 sont chargés. Au pire, ajoutez les dans le fichier /etc/modules :
# modprobe linear
# modprobe raid0
# modprobe raid1
# modprobe raid5

On valide ensuite l'existence du fichier virtuel /proc/mdstat (Par défaut, le noyau est compilé avec le support du RAID) et on vérifie l'installation du package raidtools (format rpm sur la RedHat et la Mandrake) :
# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid5] /* liste des drivers */
read_ahead not set
unused devices: <none>

# rpm -qa | grep raid
raidtools-0.90-8mdk

Le seule fichier que l'on aura à configurer pour tous les RAIDS sera le fichier /etc/raidtab (simple, non?) et le fichier /etc/fstab.

Si vous ne disposez pas de plusieurs disques vous pouvez utiliser des partitions à la place. Cela ne vous apportera ni amélioration de performance, ni haute disponibilité, mais au moins une grande satisfaction de pouvoir mettre en pratique vos connaissances ;-)

Niveaux de RAID disponibles sous Linux

Mode Linéaire [ exemple ]
Cette solution est pertinente lorsque l'on souhaite étendre la capacité de stockage disponible en ligne sans introduire une notion de tolérance aux pannes. Cette solution combine les capacités de stockage d'un ensemble de disques existants (les données sont d'abord écrites sur le premier disque, puis lorsqu'il est plein sur le second, etc...) et permet d'utiliser 100% de l'espace disque utile.


RAID 0 [ exemple ]
Cette méthode (striping) est souvent utilisée lorsque la haute disponibilité des données n'est pas nécessaire (on doit disposer d'au moins 2 disques). Elle permet d'obtenir une amélioration des performances I/O (lecture et écriture) tout en restant trés proche du mode linéaire. Elle permet en effet d'améliorer l'algorithme en dispatchant les données sur l'ensemble des disques (les données sont découpées puis dispersées sur les disques sans redondance).


RAID 1 [ exemple ]
Ce mode (mirroring) implémente une stricte duplication des données sur tous les disques présents dans le miroir (on doit disposer d'au moins 2 disques). L'information étant enregistrée N fois sur les disques (permet de gagner du temps en lecture même si on en perds lors de l'écriture), si on perds N-1 disques on ne perds pas les données. Il est à noter que l'on perds tout de même 50% de l'espace disque utile.


RAID 0+1 [ exemple ]
Comme son nom l'indique, cette solution combine le RAID 0 et le RAID 1. Elle permet d'améliorer les performances I/O en lecture tout en permettant une bonne disponibilité des données grace à leurs duplications sur l'ensemble des disques. Mais tout comme le mode miroir, on perds 50% de l'espace disque potentiellement disponible.


RAID 4 [ exemple ]
L'algorithme utilisé ici (striping) permet de dispatcher les I/O sur l'ensemble des disques (au moins 3) tout en réservant un disque pour sauvegarder une donnée supplémentaire de parité. De fait, si on perds un disque, on peut reconstituer l'information manquante. Cependant, l'utilisation d'un disque de parité ajoute un goulot d'étranglement au système (toute écriture va provoquer un accés au disque de parité), pour cela il est préférable d'utiliser à la place le Raid5.


RAID 5 [ exemple ]
Le RAID 5 est sensiblement identique au RAID 4 mais améliore le procédé en stripant l'information de parité sur l'ensemble des disques.

Disques de spare

Les RAIDS 1, 4 et 5 peuvent utiliser la notion de disques de spare. Un disque qui va venir remplacer automatiquement un disque en faute. Linux autorise l'ajout on-line de disques de spare (vous devez cependant les rajouter manuellement dans le fichier de configuration /etc/raidtab pour le cas d'un reboot) :
# raidhotadd /dev/md[0-15] /dev/sdf1
ou
# raidhotremove /dev/md[0-15] /dev/sdf1

Mise en pratique

Mode linéaire
Vous devez disposer de 2 disques ou plus, pas nécessairement de la même taille, pour implémenter le mode linéaire. Modifiez le fichier /etc/raidtab comme dans l'exemple suivant (vous pouvez configurer 16 RAIDs différent sur une machine, d'ou la symbolique avec [0-15] ainsi que dans le reste du document) :

raiddev /dev/md[0-15]
	raid-level linear
	  nr-raid-disks 2 # disques impliqués
	  persistent-superblock	1 # on considère ici que
	                          # l'auto-détection du RAID
	                          # dans le noyau Linux est activé
	device/dev/sda1 # premier disque
	  raid-disk 0
	device/dev/sdb1 # second disque
	  raid-disk 1

Nota : vous ne disposez pas de disques de spare dans le mode linéaire. Si vous perdez un disque, alors vous perdez tout.

Pour activer le RAID (cette procédure va rester la même pour les autres RAID) :
# mkraid /dev/md[0-15]
# mkfs -t ext2 /dev/md[0-15] # on formatte la partition, ici en Ext2
# mount /dev/md[0-15] /scratch

Pour stopper un device RAID :
# raidstop /dev/md[0-15] # pour désactiver un device RAID

Pour mettre en faute un disque (et le retirer avec raidhotremove) :
# raidsetfaulty /dev/md[0-15] /dev/sdf1

Normallement le device sera automatiquement activé lors du boot (dans le fichier /etc/rc.d/rc.sysinit sur la Mandrake 7.2 mais vous pouvez ajoutez la commande raidstart /dev/md[0-15] dans le fichier /etc/rc.d/rc.local sinon), il ne restera plus qu'à mettre à jour le fichier /etc/fstab pour le montage soit automatique. Cela va rester valide pour les autres RAIDS.

RAID 0
Vous devez disposer de 2 disques ou plus, de la même taille, pour implémenter le striping. Modifiez le fichier /etc/raidtab comme dans l'exemple suivant :

raiddev /dev/md[0-15]
	raid-level 0
	  nr-raid-disks 2
	  persistent-superblock	1
	  chunk-size4 # voir en fin de document
	device/dev/sda1
	  raid-disk 0
	device/dev/sdb1
	  raid-disk 1

Nota : vous ne disposez pas de disques de spare dans le RAID 0. Si vous perdez un disque, alors vous perdez tout.

RAID 1
Vous devez disposer de 2 disques ou plus de la même taille pour implémenter le mode miroir et vous pouvez utiliser 1 ou plusieurs disques de spares (optionnel). Modifiez le fichier /etc/raidtab comme dans l'exemple suivant :

raiddev /dev/md[0-15]
	raid-level 1
	  nr-raid-disks 2
	  nr-spare-disks 1
	  persistent-superblock	1
	  chunk-size 16
	device/dev/sda1
	  raid-disk 0
	device/dev/sdb1
	  raid-disk 1
	device/dev/sdc1
	  spare-disk 0

RAID 0+1
Vous devez disposer d'un nombre de disques pairs de la même taille pour implémenter le RAID 0+1 mais vous ne pouvez pas utiliser de disques de spare individuels (je présume qu'il est possible de mettre un place un device de spare contenant le même nombre de disques que les autres). Modifiez le fichier /etc/raidtab comme dans l'exemple suivant :

raiddev /dev/md0
	raid-level 0
	  nr-raid-disks 3
	  persistent-superblock	1
	  chunk-size 4
	device/dev/sda1
	  raid-disk 0
	device/dev/sdb1
	  raid-disk 1
	device/dev/sdc1
	  raid-disk 0

raiddev /dev/md1
	raid-level 0
	  nr-raid-disks 3
	  persistent-superblock	1
	  chunk-size 4
	device/dev/sdd1
	  raid-disk 0
	device/dev/sde1
	  raid-disk 1
	device/dev/sdf1
	  raid-disk 0

raiddev /dev/md2 # seul ce device pourra etre formate
	raid-level 1
	  nr-raid-disks 2
	  nr-spare-disks 0
	  persistent-superblock	1
	  chunk-size 16
	device/dev/md0
	  raid-disk 0
	device/dev/md1
	  raid-disk 1

RAID 4
Vous devez disposer de 3 disques ou plus, de la même taille, pour implémenter le RAID 4 et vous pouvez utiliser 1 ou plusieurs disques de spares (optionnel). Modifiez le fichier /etc/raidtab comme dans l'exemple suivant :

raiddev /dev/md[0-15]
	raid-level 4
	  nr-raid-disks 3
	  nr-spare-disks 1
	  persistent-superblock	1
	  chunk-size 32
	device/dev/sda1
	  raid-disk 0
	device/dev/sdb1
	  raid-disk 1
	device/dev/sdc1
	  raid-disk 2
	device/dev/sdd1
	  spare-disk 0

RAID 5
Vous devez disposer de 3 disques ou plus, de la même taille, pour implémenter le RAID 5 et vous pouvez utiliser 1 ou plusieurs disques de spares (optionnel). Modifiez le fichier /etc/raidtab comme dans l'exemple suivant :

raiddev /dev/md[0-15]
	raid-level 5
	  nr-raid-disks 5
	  nr-spare-disks 1
	  persistent-superblock 1
	  # Parity placement algorithm
	  # parity-algorithm	left-asymmetric
	  # parity-algorithm	right-asymmetric
	  # parity-algorithm	right-symmetric
	  parity-algorithm	left-symmetric
	  chunk-size 32
	device/dev/sda1
	  raid-disk 0
	device/dev/sdb1
	  raid-disk 1
	device/dev/sdc1
	  raid-disk 2
	device/dev/sdd1
	  raid-disk 3
	device/dev/sde1
	  raid-disk 4
	device/dev/sdf1
	  spare-disk 0

Chunk Size

Le choix de la "chunk size" dépends fortement du type de raid et du nombre de disques. Dans le cas d'un raid 0 de 2 disques, si on écrit 16KB avec une chunk size de 4KB, on va écrire 4KB sur le premier disque puis 4KB sur le second puis de nouveau 4KB sur le premier et pour finir 4KB sur le second ...

Vous obtiendrez généralement de bons résultats avec une chunk size à 32KB mais il est souvent bien utile d'expérimenter soi même pour obtenir le meilleur tuning. A noter que sur un environnement Alpha (64 bits), j'ai du mettre la chunk size à 16 au lieu de 4 car le raid 0 ne voulais pas s'initialiser.

Amélioration des performances

Utiliser le RAID sur une partition de swap ?

Il est aberrant d'utiliser le raid sur une partition de swap. Plus simplement, Linux peut utiliser les partitions de swap de la même manière que le raid 0. Il suffit de donner à chaque partition le même niveau de priorité :

/dev/hdc1	swap	swap	defaults,pri=1 0 0
/dev/hdd1	swap	swap	defaults,pri=1 0 0
/dev/hde1	swap	swap	defaults,pri=1 0 0

Il est aussi trés utile de placer ces partitions au début de disque plutôt qu'à la fin. Vous obtiendrez de meilleurs résultats (la vélocité à cet endroit du disque est plus importante).

Divers

Glossaire

RAID
Le mot RAID est un acronyme pour "Redundant Array of Inexpensive Disks".

Haut


Optimisez votre système Linux

par Lionel Tricon

Quelques recettes pour optimiser votre système Linux.


Considérations générales

La première étape, pour obtenir de meilleures performances sous Linux, consiste à vérifier s'il n'est pas possible d'upgrader certains composants hardware du système. Augmenter la mémoire vive (un système de type Unix est toujours friand en mémoire), changer pour des disques dur SCSI, des disques IDE UltraDMA100, bien dimensionner la carte réseau (10MB? 100MB? +?), opter éventuellement pour du SMP et choisir un processeur performant et adapté : tout cela fait partie du processus qui va vous amener à bien configurer votre système.

Si les accès disques sont un élément déterminant pour la performance de vos applications, vous pourrez envisager d'utiliser du Raid logiciel afin de donner du tonus à vos entrées/sorties. Si vous êtes encore plus argenté, des solutions de Raid Hardware existent aussi.

Le gain de performance passe aussi par une bonne compilation des applications. La majorité des logiciels disponibles par exemple pour les plateformes de type Intel sont en effet souvent compilés pour un mode x86 standard afin de rester compatible avec tous les systèmes existants. De multiples optimisations peuvent pourtant être apportées lors de la compilation et notamment celles qui vont préciser l'architecture cible du binaire. Les gains sont souvent trés importants si on prends le temps de jouer avec les flags d'optimisations des compilateurs (-march=pentium, mcpu=pentium, -O4, -funroll-loops, -fno-exceptions, ...).

Il ne faut pas aussi hésiter à utiliser d'autres compilateurs que GCC, G77 ou G++, qui sont moins performants (l'accent est mis sur la portabilité et non sur l'optimisation) que d'autres compilateurs plus commerciaux.

Pour le monde Intel, on trouve en effet :

Sur plateforme Alpha, ne pas hésiter à utiliser les compilateurs (C, C++ et F90) et librairies (libm, cxml, cpml) de Compaq (gratuit pour une utilisation non commerciale) qui offrent des gains de performances étonnants.

Dans le même raisonnement, une application qui fera souvent appel à du calcul Flottant verra ses performances grimper en utilisant le processeur Alpha. Toutefois si le calcul repose sur de l'entier il sera plus intéressant de rester sur des processeurs de type x86.

Parallélisme

Si vous souhaitez améliorer encore et toujours les performances, regardez attentivement du côté du parallélisme, notion qui consiste à faire travailler collectivement un code sur plusieurs processeurs. On peut faire du parallélisme sur du matériel SMP à l'aide généralement de processus légers (threads) ou bien sur des grappes de machines (cluster beowulf) en utilisant des librairies de passage de messages (message passing). Mais cela demande souvent d'écrire un code spécifique car il n'existe que trés peu de compilateurs dans le monde capable de paralléliser automatiquement un code séquentiel (les gains sont souvent anecdotiques comparé à un code parallélisé par des mains expertes).

Le tuning du système

Votre système est désormais figé et votre applicatif compilé. Il reste maintenant à optimiser votre système en jouant sur le paramétrage (tuning) du noyau et du logiciel. Le tuning logiciel étant totalement spécifique pour chaque application, il nous reste à essayer d'optimiser la configuration du noyau.

Lorsque le noyau a été recompilé pour élaguer les options inutiles et pour l'adapter à vos besoins, on peut généralement agir sur plusieurs facteurs :

PS : Beaucoup d'optimisations utilisent le répertoire virtuel /proc pour discuter avec le noyau et modifier son paramétrage. Taper man sysctl pour savoir comment conserver votre tuning à chaque démarrage.

La mémoire virtuelle

Le démon noyau bdflush

Vous pouvez essayer de tuner le fichier /proc/sys/vm/bdflush qui contrôle le comportement du cache mémoire en lecture et écriture (par l'intermédiaire du démon noyau bdflush). On va se concentrer sur les variables les plus importantes du fichier : nfract ndirty nrefill nref_dirt dummy1 age_buffer age_super dummy2 dummy3

nfract Contient le pourcentage de buffers modifiés dans le cache mémoire qu'il faut atteindre ou dépasser pour physiquement écrire des données sur le disque. Plus la valeur est grande et plus le système prendra son temps pour flusher les données sur le disque et inversement.
ndirty Quantité maximale de buffers modifiés qui peuvent être écrits sur le disque à un instant T pour libérer le cache mémoire. Une petite valeur ne va pas libérer le cache suffisamment vite et une grosse valeur peut amener à générer de nombreux I/O en peu de temps.
nrefill Nombre de buffers qui peuvent être alloués à un instant T pour renflouer le cache mémoire. Plus ce nombre est important et plus la mémoire sera réservée en grande quantité (quitte à être sous utilisée).
age_buffer Nombre de tip d'horloge (jiffies) avant qu'un buffer normal ne soit écrit sur le disque.
age_super Même chose que pour age_buffer mais par rapport a un superblock du système de fichier.

Optimisation possible :

echo "100 1200 128 512 15 5000 500 1884 2" > /proc/sys/vm/bdflush

Pourcentage de la mémoire allouée pour le cache

Le fichier /proc/sys/vm/buffermem contient le pourcentage de la mémoire qui sera alloué au démarrage du système pour le cache. Ce fichier comporte 3 champs mais seul le premier nous intéresse :

min_percent Pourcentage minimum de la mémoire du système qui sera utilisé pour le cache mémoire.

Anticiper l'accès aux pages mémoires

Lorsque qu'une application fait une requête d'une page mémoire et que celle-ci ne se trouve pas dans le cache, la couche système va optimiser les accès disques en chargeant non pas une seule mais plusieurs pages adjacentes à la page demandée. Le fichier /proc/sys/vm/page-cluster contient cette valeur mais il ne semble pas utile de dépasser la valeur 5 (la valeur par défaut est de 4).

Le système de fichiers

Optimiser les performances des disques IDE

Les distributions modernes optimisent automatiquement les performances des disques durs de type IDE (en activant le transfert 32 bits ou encore le canal DMA, par exemple). Cependant, il est souvent bien utile de savoir comment cela fonctionne. A utiliser avec précaution.

- Lister les paramètres : cat /proc/ide/hd[a]/settings
- Activer les I/O 32 bits (-c 3 pour certain chipsets) : /sbin/hdparm -c 1 /dev/hd[a]
- Activer le support du canal DMA : /sbin/hdparm -d 1 /dev/hd[a]
- Activer le support du canal DMA mode 2 : /sbin/hdparm -d 1 -X34 /dev/hd[a]
- Activer le support UltraDMA mode 2 : /sbin/hdparm -d 1 -X66 /dev/hd[a]
- Pour tester les performances de votre disque : /sbin/hdparm -[t|T] /dev/hd[a]
- Changer le nombre de secteurs transférés à chaque interruption : /sbin/hdparm -m [1-16] /dev/hd[a]
- Pour conserver la configuration aprés un reset IDE : /sbin/hdparm -k 1 /dev/hd[a]

Tuner le nombre maximum de fichiers et d'inodes

Le noyau 2.2.x vous permet de modifier certaines limites à la volée, notamment celles concernant le nombre de file descriptors qu'il est possible d'ouvrir en parallèle (la valeur par défaut est de 4096 sur la série des 2.2.x) ainsi que le nombre d'inodes (un simple "/bin/cat" sur ces fichiers virtuels vous donnerons la valeur actuelle) :

echo 32000 > /proc/sys/fs/file-max
echo 65000 > /proc/sys/fs/inode-max

Nota : Il est préférable de mettre au moins 3 ou 4 fois la valeur de file-max dans inode-max car les flux stdin, stdout et stderr ainsi que les sockets réseaux reposent sur un inode dans le noyau.

Tuner le nombre de superblocks

Si vous souhaitez augmenter le nombre de point de montage possible, vous devez jouer sur le paramètre /proc/sys/vm/fs/super-max qui borne le nombre maximum de superblocks qu'il est possible d'allouer sur un système Linux.

Optimisez votre partition de swap

Il est préférable de déporter votre partition de swap sur un autre disque que le disque système afin d'optimiser les I/O (c'est une solution coûteuse mais efficace). De même, vous pouvez utiliser une particularité de Linux qui est d'autoriser l'utilisation de plusieurs partitions de swap et ce afin de stripper les I/O sur plusieurs disques. Mais cela demande de disposer d'au moins 2 disques afin de placer 2 partitions de swap de même prioritée (pri=1 dans les options de montage). Essayez de placer ces partitions en début de disque car l'accés aux données sera plus rapide.

Comment récupérer 5% d'espace disque sur une partition ext2

Il existe par defaut 5% d'espace réservé au root sur chaque partition ext2. Pour le réduire ou littéralement mettre à zéro cet espace, utiliser les commandes suivantes (bien lire le man d'abord) :

Tune2fs -m pourcentage
ou au moment de la création de la partition :
mke2fs -m pourcentage partition

Changer la taille des blocs d'un système de fichiers

Si vous utilisez la plupart du temps de gros fichiers, il sera probablement trés profitable de formatter vos partitions avec des blocs de taille plus importante. En effet, Linux utilise par défaut des taille de blocs de 1024 octets. Vous pouvez changer avec des tailles de 4096 avec la commande mke2fs -b 4096 /dev/... qui utilise des blocs de 4k au lieu de 1k. Cela va notamment réduire la fragmentation et réduire le temps de vérification lors d'un fsck.

Ajuster le comportement du swap

Le fichier freepages présent sous le répertoire /proc/sys/vm permet de contrôler le comportement du noyau vis à vis du swap. L'écriture sur disque est toujours une opération très lourde en ressources, un bon tuning peu avoir un impact très fort sur les performances du système. Ce fichier contient 3 valeurs (entiers) : freepages.min, freepages.low et freepages.high.

freepages.min Lorsque le nombre de pages libre descend en dessous de cette valeur, le noyau sera seul habilité à allouer de la mémoire,
freepages.low Lorsque le nombre de pages libre se retrouve en dessous de cette valeur, le noyau swappe (en grande quantité) des pages sur le disque,
freepages.high Le système va essayer de maintenir le seuil de pages libre à cette valeur, quitte à swapper régulièrement des pages sur le disque.

Sinon, vous pouvez aussi essayer de modifier le troisième paramètre du fichier /proc/sys/vm/kswapd qui vous permet de changer le quantité de pages qui seront sauvées (en une passe) sur le disque par le démon noyau kswapd.

Activer l'option noatime

Pour améliorer les performances disques, on peut utiliser une option du mount appelée noatime. En effet, sous Linux, toute lecture d'un fichier provoque une mise à jour de l'information atime (i.e. dernier accès) associée. Activer cette option peut amener des gains de performances appréciables. A noter que cela n'affectera pas l'écriture dans un fichier (qui mettra, malgré le flag noatime, cette information à jour). A n'utiliser qu'avec précaution car je ne connais pas les effets de bords exacts de ce flag (le man précise que c'est principalement utilisé pour améliorer les accès aux serveurs de News). Note de Jicé : j'utilise cette option depuis plus d'un an sans problème, mais comme disent les anglophones : YMMV !

Le réseau

Améliorer les performances NFS

Le fait d'utiliser NFS avec les options rsize=8192,wsize=8192 rendra la plupart du temps votre connexion plus rapide qu'avec la taille de buffer paramétrée par défaut (1024). Ceci est valable pour le noyau 2.2.x.

Tuner les connexions TCP/IP

Vous pouvez modifier plusieurs paramètres concernant la valeur de timeout de votre connexion Tcp/Ip ou encore réduire le temps que le système va mettre a tuer une connexion qui ne répond plus.

echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 0 > /proc/sys/net/ipv4/tcp_window_scaling
echo 0 > /proc/sys/net/ipv4/tcp_sack
echo 0 > /proc/sys/net/ipv4/tcp_timestamps

Tuner le serveur Samba

Vous pouvez améliorer les performances d'un serveur Samba en modifiant le paramétrage socket dans le fichier smb.conf :

socket options = SO_SNDBUF=4096 SO_RCVBUF=4096

Buffer cache Tcp/Ip

Un des facteurs les plus importants de la performance d'une connexion TCP/IP est la taille du buffer en entrée et en sortie. Vous pouvez modifier cela dans vos programmes avec la fonction getsockopt() en jouant sur les options SO_RCVBUF et SO_SNDBUF. Il ne faut pas oublier aussi de modifier ces valeurs dans le noyau (sinon cela n'aura aucun effet). En effet, la valeur par défaut est de 64KB (64*1024=65536) et cela ne convient pas si l'on souhaite utiliser du Gigabit par exemple. Dans ce dernier cas, il est plus intéressant de configurer ces valeurs à 256KB (256*1024=262144).

echo 262144 > /proc/sys/net/core/rmem_max
echo 262144 > /proc/sys/net/core/wmem_max

Divers

Améliorer les performances d'un système SMP

Vous pouvez améliorer l'allocation de pages sur un système SMP en jouant sur les valeurs du fichier /proc/sys/vm/pagetable_cache (le documentation n'est pas un exemple de clarté à ce sujet).
Nota : sur des systèmes mono-cpu, il est intéressant de mettre ces valeurs à zéro afin de pouvoir glaner quelques octets de mémoire vive.

Taille maximale d'un segment de mémoire partagé

Le fichier /proc/sys/kernel/shmmax contient la taille limite d'un segment de mémoire partagé qu'il est possible d'allouer sur votre système (très utile dans le cas de plateformes multi-processeurs). Des segments de mémoire allant jusqu'à 1GB peuvent ainsi être créés (noyaux 2.2.x).

Tuner les niveaux d'interruptions

Pour pouvez utiliser la commande irqtune pour changer la priorité de vos interruptions. Par exemple, si vous possédez une carte ethernet et une carte scsi, vous pourrez donner avantage à la carte réseau en tapant : "irqtune 5 11" ou 5 est l'interruption de la carte réseau et 11 de la carte scsi. La HomePage du logiciel est sur http://www.best.com/~cae/irqtune/.

Augmenter la stack size

Si vous avez des programmes qui déclarent de gros tableaux, vous pouvez changer la valeur de la stack size qui est de 8MB par défaut (vous avez besoin d'être super-user) :

# ulimit -s
8192

# ulimit -s 32768

# ulimit -s
32768

Limite de processus par utilisateur

Il faut utiliser la commande ulimit pour changer la configuration par défaut. Pour rendre cette limite caduque, tapez : ulimit -u unlimited.

Nombre maximum de processus

Pour augmenter le nombre de tâches qu'il est possible de lancer en parallèle sur votre système Linux, vous devez éditer le fichier include/linux/tasks.h dans les sources, modifier la variable NR_TASKS (jusqu'à 4092 sur x86) et générer un nouveau noyau. Ceci n'est valable que pour la série 2.2.x (la série 2.4.x élimine cette contrainte en l'associant à la taille de la mémoire du système).

Glossaire

SCSI
Small Computer Systems Interface. Trés utilisé dans le monde industriel (essentiellement pour les disques durs) car il offre de très bonne performances et des caratéristiques intéressantes liées au protocole SCSI (hot-swap, nombre de devices supportés, ...).

SMP
Symmetric Multi Processing. Se dit d'un système qui possède plusieurs processeurs sur la même carte mère. Tous les processeurs partagent la même mémoire vive : on dit que c'est un système à mémoire partagée.

THREAD
Un thread est une duplication d'un processus qui va partager la même mémoire mais, à la différence d'un fork classique, un thread est ce qu'on appelle un processus léger, ce qui signifie qu'il partage aussi le segment de code et le segment de donnée. Il n'y a que la pile qui est dupliquée entre le processus et son ou ses thread(s). L'avantage : les changements de contexte sont bien plus rapide avec un thread qu'avec un processus classique et l'occupation mémoire est moins importante.

Haut


Sécuriser linux.

Par Serge

Comment empêcher certains intrus de s'introduire dans votre système.


Cette partie va vous permettre de sécuriser votre machine Linux, déjà contre des attaques lorsque vous vous connectez sur Internet (surtout si vous faites de l'IRC, les attaques sont fréquentes), si votre machine sert de serveur WEB, etc... Bien sûr si votre machine est en poste isolé et que vous ne vous connectez jamais à l'Internet, ce n'est pas la peine de sécuriser votre machine.

Attention : je ne me considère absolument pas expert en sécurité réseau, je vous donne juste des conseils de bases pour un premier niveau de sécurité, je vous rappelle que des bugs de sécurité apparaissent quasiment tous les jours, à vous donc de vous informer et de vous tenir à jour pour une plus grande sécurité. Je ne vous donne QUE ma connaissance et des principes de bases.
 

1. Stratégie de mot de passe, de comptes et shadowing.

Tout d'abord la sécurité passe par des mots de passe utilisateurs. Il est impensable de laisser un compte utilisateur sans mot de passe. Pour une sécurité accrue je vous conseille fortement de :

        - Mettre des mots de passe de 8 caractères minimum.

        - Mélanger des caractères minuscules, majuscules et numériques (ex: imDe56T4z).

        - Ne pas mettre des mots contenus dans un dictionnaire (style nom propre ou nom commun).

Ok, les mots de passe de ce style sont très durs à retenir soi-même, mais si votre site est sensible cela est nécessaire. Même si les mots de passe sont encryptés sous linux il existe des décrypteurs de deux types, soit basés sur un dictionnaire (donc si votre mot de passe n'existe pas dans un dictionnaire un tel décrypteur ne le trouvera jamais), soit un décrypteur dit de force, ceux-là par contre essayent toutes les possibilités pour découvrir votre mot de passe. Il renvoie donc plusieurs mots de passe possibles. Si votre mot de passe est du style MédOr1999 il sera vite repéré dans la liste des mots de passe obtenus et l'attaquant est quasi sûr de l'avoir trouvé. Par contre s'il obtient 100 mots de passe de style efTDgf45Ft il sera déjà plus découragé. Mais il risque de le trouver quand même, s'il s'acharne. Donc on va déjà essayer aussi de sécuriser encore plus.

Les mots de passe sous Linux ou UNIX sont généralement contenus dans le fichier /etc/password ainsi que toutes les infos systèmes des comptes utilisateurs. Ce fichier est en lecture seule pour tout le monde pour le besoin de différents programmes, et juste en écriture pour le ROOT pour l'administration. Le problème est que si on peut le lire, on peut donc le récupérer et tenter un décryptage de force dessus. Alors on a inventé le shadowing. Les mots de passe ne sont plus stockés dans le fichier /etc/password mais dans un fichier généralement (pas toujours) appelé /etc/shadow. Ce fichier est par contre illisible par tout le monde sauf le root bien sur. Ce qui permet déjà à tous les utilisateurs non root de ne pas pouvoir récupérer ce fichier. Donc je vous conseille FORTEMENT d'installer le package SHADOW sur votre machine.

Tester aussi le guest, celui-ci est présent sur certaine distribs sans mot de passe (très dangereux !), essayez de vous loguer en guest, si ça marche c'est un trou de sécurité énorme! je vous conseille même d'enlever complètement ce compte utilisateur (supprimez la ligne correspondante dans /etc/passwd). De même pour les comptes systèmes comme FTP, UUCP, etc etc. Vérifiez bien que ces comptes soient désactivés, c'est-à-dire que le système lui-même peut s'en servir mais que l'on ne peut pas se loguer avec. Pour vérifier cela, ces comptes doivent apparaître comme ceci :

    Pour ceux qui n'ont pas de shadow, dans /etc/password les comptes systèmes apparaissent comme ceci :

   nomducompte:*: ....        l'étoile désactive le compte (si n'y a pas * le compte est SANS MOT DE PASSE!!)

    Pour ceux qui ont shadow, dans /etc/passwd :

   nomducompte:x:.....

    et dans /etc/shadow :

   nomducompte:*:.....

Attention donc à cette syntaxe.
 

2. Stopper les services inutiles et dangereux.

Par défaut plusieurs services réseau sont installés et démarrés par Linux, dont certains très dangereux.

Pour désactiver ces services, tout dépend de la version du super démon dont vous disposez sur votre distribution :

Tout d'abord le service fingerd doit être absolument arrêté ! Désactivez netstat de la même façon. On peut dire que ces deux services sont très dangereux pour la sécurité de votre système, le premier fournissant les noms des users présents sur votre machine, le deuxième donnant tous les services démarrés donc ceux qui sont vulnérables à des bugs de sécurité.

De même stoppez tous les services qui ne vous servent pas, par exemple ftpd, pop2, pop3, telnetd, ... Bien sûr laissez ouvert les services dont vous avez besoin. Voici quelques bugs connus de services :

- httpd : si vous faites de votre Linux un serveur Web, faites attention au bug du PHP, langage de page dynamique sous Apache. Si vous ne vous servez pas de PHP, désactivez le tout simplement (dans les fichiers de conf de apache, je vous renvoie à son HOWTO), par contre si vous l'utilisez, attention à bien utiliser la version 3 de PHP ainsi que de la dernière version d'Apache avec ses fichiers de conf (corrigés pour enlever le bug de PHP). Utilisez toujours la dernière version stable ! Des bugs sont corrigés tout le temps sur les serveurs HTTP. N'utilisez pas les extensions Frontpage qui comportent beaucoup de trous de sécurité. Assurez-vous que le daemon tourne en user spécialement créé pour lui (créez un user http par exemple avec des droits très reduits comme ça si quelqu'un trouve un bug de sécu sur votre daemon HTTP il n'aura que les accès de cet user et pas plus). Ne lancez pas le DAEMON HTTP EN ROOT ! Ne lancez pas un CLIENT HTTP EN ROOT ! Si vous avez besoin de scripts CGI, activez le CGIWRAP !

- fptd : wu-ftpd a connu de nombreux bugs de sécurité aussi, je vous conseille donc d'utiliser un autre serveur ftp, comme le beroftpd par exemple. De plus configurez les accès par le fichier /etc/ftpaccess (faite un man ftpaccess, tout est expliqué, regardez le HOWTO aussi). Autorisez le minimum, c'est-à-dire un serveur juste anonymous avec interdiction pour les realusers (compte existant) qui donne accès au répertoire home des users ainsi qu'à ceux du système, alors que les anonymous donnent accès juste au répertoire home du ftp et pas au reste de la machine. Pas de login de user réel tout simplement parce que les mots de passe passent en clair sur le réseau (un coup de sniffeur et votre mot de passe est lisible de tous...).

- sendmail : Attention aussi à avoir la dernière version, configurez aussi pour interdire le forward de courrier (autrement votre machine servira de bonne passerelle pour les hackers).

- telnetd : je vous conseille plutôt de désactiver purement et simplement ce service, préférez plutôt si vous avez à prendre la main à distance sur votre serveur un gettyps (prise de main à distance via un modem sur port série de votre machine, déjà le hacker devra connaître le numéro de téléphone du modem pour se connecter sur votre machine). De plus telnet a le "facheux inconviénient" de faire passer les mots de passe en clair ! Donc un sniff de votre réseau et hop le mot de passe est dans la poche !!!

- Samba : si vous n'avez pas l'utilité de celui-ci ne l'activez surtout pas, il est sujet à des bugs et ouvre des partages. Si vous l'utilisez, attention à avoir une version récente, à bien configurer les partages sur des répertoires ne contenant aucun fichier critique et sur des répertoires non sensibles (pas de partage sur /etc, /bin, /sbin, /usr etc mais sur des homes/smb par exemple, répertoires dédié pour des partages SAMBA).

- Si vous utilisez NFS, utilisez /etc/exports (ou /etc/dfs/dfstab) de manière à exporter que ce que VOUS voulez (voir avec nfs-howto), n'exportez pas les fichiers de configuration NFS non plus bien sûr, exportez seulement vers des domaines connus et pas vers "localhost" non plus. Attention à ne pas depasser aussi 255 charactères dans vos liste d'alias d'export.

- Désactivez toute les commandes de type "r" (rlogin, rexec, etc), elles ont de gros trous de sécurité ; surtout si un malin "sniffe" votre réseau il risque de voir passer en clair des mots de passe.

Bien d'autre services sont dangereux aussi, de toute facon si un service n'est pas utilisé, il vaut mieux le désactiver. Sacher que tout service de type UDP (regarder dans /etc/services, a droite du nom du service vous avez le port et le protocole utilisé, certains utilisent UDP) sont sujet à des attaques DoS, Dénial of Services, c'est à dire qu'en envoyant certains packets UDP on peut faire "planter" soit le service lui-même, soit une série de services soit la machine elle même. Stoppez donc tout service UDP inutile.

Le problème que nous venons d'évoquer n'existe bien sûr que si vous avez besoin de ces services et que votre machine est reliée à l'internet. Le filtrage résoud ce probléme (voir ci-dessous).

3. Filtrer les services

Comme le filtrage n'est pas une chose simple à faire je vous renvoie a la rubrique FIREWALL de la section réseau.

4. Mettre à jour son kernel et ses packages contre les bugs connus

Attention aussi si vous êtes possesseur d'une vieille distribution à base de kernel de la série 2.0.x ou 1.x.x . Il y a des bugs réseau qui permettent aux attaquants de faire des attaques DoS (Denial of Service, c'est-à-dire arrêter des services réseaux de votre machine ou de la planter complètement). Je vous conseille donc de mettre à jour le kernel de votre système (à partir de la 2.0.36 pour les séries 2.0.X, pour les séries 1.X.X, je pense qu'il est temps de passer à une série 2.0.X ou 2.2.X) ainsi que les packages réseau (allez voir sur les sites dédiés aux distributions et récupérez les packages réseau mis à jour depuis). Je vous signale aussi que prendre les toutes dernières versions des packages ou kernel n'est pas une si bonne idée si votre site est sensible, en effet des bugs peuvent se révéler plus tard, préférez des kernels et packages réputés stables. Vous comprenez facilement que je ne peux pas dire tel ou tel kernel ou tel package a tels bugs etc... Pour vérifier allez sur www.rootshell.com : les bugs, exploits, etc. y sont référencés, à vous de voir si de tels trous de sécurité existent sur votre machine.

5. Vérifier les permissions.

Attention aussi à ne pas changer des permissions sur des fichiers ou répertoires parce que cela va vous aider à un moment pour votre travail ou un autre, on a souvent la malheureuse manie d'oublier de remettre les bons droits après (surtout ne touchez pas au permissions des programmes administratifs contenus dans /bin, /sbin, /usr/sbin).

Par contre enlevez le bit SUID root sur les fichiers ayant cette permission (chmod a-s toto), c'est là aussi un énorme trou de sécurité ! Même si certains HOWTOs (celui de quake par exemple) vous indiquent cette solution pour faire tourner des programmes par un simple user, je vous déconseille fortement de mettre cette permission sur un fichier exécutable. De tels fichiers avec cette permission permettent d'agir en tant que root directement et c'est une porte ouverte à un hack ! Ne fixez jamais une telle permission sur un fichier.
 
Vérifiez aussi :

- /etc/hosts.lpd : si vous en avez besoin, vérifiez que les permissions sur ce fichier sont bien 600 et que le propriétaire est "root".

- /etc/securetty : en plus de sa configuration expliquée plus haut, assurez vous que le propriétaire de ce fichier est root et "644" comme permission.

- /etc/inetd.conf : propriétaire root et "600" comme permission.

- /etc/services : propriétaire root et "644" comme permission.

6. Bloquer les logins dangereux des services.

Si vous devez fournir certains services comme le FTP, telnet... il vaut mieux bloquer certains logins dangereux. Si vous devez absolument permettre aux utilisateurs d'utiliser le FTP, bloquez la connexion des comptes critiques comme le root, comptes systèmes etc. (même si cela à déjà été bloqué par le /etc/passwd).

Pour le FTP, éditez le fichier /etc/ftpusers et incluez les comptes dont vous interdisez l'accès :

  root
  uucp
  bin
  mail

Et oui il vaut mieux désactiver le compte root pour le ftp aussi ! D'ailleurs pour ce compte on va interdire l'accès de partout sauf sur la console (c'est-à-dire sur la machine physiquement), grâce au fichier /etc/securetty :

  tty1
  tty2
  tty3
  tty4

Logiquement jusqu'au tty7. Si on veut faire de la téléintervention par modem, on peut alors aussi ajouter le ttySx ou ttySx est le port série du modem qui sert à la télémaintenance. Dans ce fichier on inclut les terminaux où on autorise le root à se connecter.

7. N'autoriser les services qu'à certaines machines distantes.

Toujours dans le cas où les services ne sont pas stoppés parce que vous savez que certains utilisateurs distants doivent s'en servir, il est judicieux aussi de n'autoriser que ces machines et pas d'autres. Cela se fait à l'aide du fichier /etc/hosts.allow dont la syntaxe est très simple :

    <listes des services>:<listes des machines>:<commandes spéciales à exécuter>

La liste des services est du style telnetd, ftpd, etc etc...

La liste des machines ou d'un domaine (LOCAL donne accès au domaine local, très utile, ALL pour tout le monde, toutes les connexions donc)

Les commandes spéciales : une commande à exécuter quand il y a une connexion sur ce service, par exemple un "mail -s "connexion par la machine %h" root " sur le service telnetd enverra automatiquement un mail au root local donnant l'adresse de la machine distante qui s'est connectée au service telnet de votre machine.

De même qu'il y a un fichier qui autorise les connexions, il y a un fichier qui interdit les connexions et qui s'appelle /etc/hosts.deny. Le plus simple dans ce fichier est de mettre ALL:ALL qui interdit tout à tout le monde et de laisser les autorisations dans le fichier /etc/hosts.allow, comme ça seul ceux qui sont présents dans /etc/hosts.allow pourront utiliser les services.

Ne croyez pas que vous êtes protégés contre toute machine inconnue avec cette technique, car il existe des techniques de "SPOOF" qui permettent à une machine de se faire passer pour une autre en lui usurpant son adresse. Certain hackers sont passés maîtres dans ces techniques, donc prudence quand même ! De plus comme vous autorisez l'accès par une autre machine soyez sûr que l'administrateur de cette machine l'a bien protégée, autrement un piratage chez lui donnera au pirate un accès chez vous !

Attention au fichier /etc/hosts.equiv qui donne l'accès aux machines présentes dans ce fichier à votre machine SANS MOT DE PASSE !!! à ne pas utiliser sauf si vous êtes dans un environnement sécurisé sans accès par l'extérieur (aucun modem, ligne, etc etc...).

8. Conclusion.

On peut dire que dès qu'un service réseau n'est pas utilisé, desactivez le tout simplement. Tout service utilisé ne doit jamais être lancé en root (celui qui trouve un bug sur ce service peut s'en servir pour exécuter des commandes, s'il tourne en tant que root il pourra tout faire, même le pire.

Ce que je vous explique là-dedans, c'est pour un premier niveau de sécurité, pour augmenter encore plus la sécurité je vous conseille vivement de lire la rubrique FIREWALL.

Haut


Gestion des quotas

Par Anne

Ou comment éviter de saturer l'espace de vos systèmes de fichiers.


Introduction

Petits rappels sur les systèmes de fichiers

Avant de rentrer dans le vif du sujet, il m'apparaissait essentiel de faire quelques rappels sur les systèmes de fichiers, auxquels je me réfererait dans la suite de l'article.

Système de fichiers : organisation logique des données dans un disque ou une partition. C'est l'existence du système de fichiers qui vous permet de ranger vos fichiers dans des répertoires et sous-répertoires.

Formatage : c'est l'opération qui consiste à créer un nouveau système de fichiers dans un disque ou une partition. Sous Linux, on utilise la commande générique mkfs, par exemple.

Racine d'un système de fichiers : la racine correspond au répertoire d'attache du système de fichiers. Par exemple, /home est la racine du système de fichiers contenant les homes directories des utilisateurs. A quoi reconnait-on qu'il s'agit de la racine ? A la présence du répertoire lost+found. Il est créé lors de l'opération de formatage et est utilisé lors des réparations éventuelles du système de fichiers.

bloc : c'est l'unité d'espace du système de fichiers. Il peut varier d'un système à l'autre. Pour connaître la taille en octets du bloc :

root@pingu# dumpe2fs /dev/hdc11|grep -i 'block size'
dumpe2fs 1.27 (8-Mar-2002)
Block size:               40
dumpe2fs est la commande qui permet d'afficher les informations relatives à un système de fichiers (attention, la quantité d'infos peut être énorme ! :p) et /dev/hdc11 désigne le fichier spécial de la partition contenant le système de fichiers.

inode : chaque fichier dispose de ce qu'on appelle une inode. Il s'agit de la carte d'identité du fichier. Elle contient notamment sa taille, sa date de dernière modification, les emplacements du disque dur sur lesquels sont situés les données... et un numéro. Et oui nos fichiers ne sont en fait que des numéros :). Chaque fichier a donc un numéro unique dans chaque système de fichiers. C'est ce numéro qui est utilisé par le système lors d'opération sur les fichiers. Le nom que vous attribuez à un fichier n'est utilisé que par vous :). Pour obtenir ces numéros : ls -i

Qu'est-ce qu'un quota

L'attribution de quotas dans un système de fichiers est un outil qui permet de maîtriser l'utilisation de l'espace disque. Les quotas consistent à fixer une limite d'espace pour un utilisateur ou un groupe d'utilisateurs.

Pour la création de ces quotas, on définit 2 types de limites :

De plus ces limites sont exprimées en blocs et en inodes. On a vu que le bloc étant une unité d'espace. Les quotas exprimés en nombre de blocs représentent donc une limite d'espace à ne pas dépasser. En ce qui concerne les quotas exprimés en nombre d'inodes, ils représentent le nombre maximum de fichiers et répertoires que l'utilisateur pourra créer.

Pour mémoire, les délais (ou grace period) fixent une période de temps avant que la limite douce ne se transforme en limite dure. Elle est fixée dans les unités suivantes : second, minute, hour, day, week.

Ce qui est nécessaire pour activer les quotas

Généralement dans la plupart des distributions, les quotas sont utilisables d'office. Vous devez vérifier 2 choses pour pouvoir utiliser les quotas :

Configuration de la gestion des quotas

Configuration de /etc/fstab

Les quotas ont activés au démarrage grâce à la commande /sbin/quotaon lancée par le script /etc/rc.d/rc.sysinit. Les quotas sont désactivés à l'arrêt du système par la commande quotaoff.

Pour fixer les quotas sur un système de fichiers, il faut mettre à jour le fichier /etc/fstab. On va pour cela ajouter les options de montage pour le ou les systèmes de fichiers concernés. Deux options peuvent être utilisées (et combinées bien sûr) :

Exemple :
/dev/hdc1      /home    ext3   defaults,usrquota   1 1
/dev/hdc2      /tmp     ext3   defaults,usrquota   1 1

Création des structures nécessaires au fonctionnement des quotas

Un ou deux fichiers doivent être créés pour l'utilisation des quotas : aquota.user et aquota.group. C'est dans ces fichiers que l'on configurera les quotas attribués aux utilisateurs et/ou aux groupes. Ces fichiers doivent être créés à la racine des systèmes de fichiers qui comportent ces quotas.

Exemple :
root@pingu# touch /home/aquota.user
root@pingu# touch /tmp/aquota.group

Attention :ne pas oublier de modifier les droits sur ces fichiers ! Ils doivent comporter les droits en écriture et lecture pour root uniquement.

Exemple :
root@pingu# chmod 600 /home/aquota.user
root@pingu# chmod 600 /tmp/aquota.group

Remonter le ou les systèmes de fichiers concernés pour prendre en compte l'utilisation de quotas pour ce système de fichiers.
root@pingu# mount -o remount /home
root@pingu# mount -o remount /tmp

Après création de ces fichiers, il faut initialiser la base des quotas en exécutant la commande suivante :quotacheck -auvg. Dans le cas contraire, la sanction est immédiate :
edquota: Quota file not found or has wrong format.
No filesystems with quota detected.

Activer les quotas :
root@pingu# quotaon -a

Attribution et vérification des quotas

Fixer des quotas

L'attribution des quotas se fait grâce à la commande edquota, utilisable quelque soit le type de quota (utilisateur ou groupe). La commande ouvre un éditeur (vi ou emacs selon le contenu de votre variable EDITOR), qui vous permet de modifier directement les fichiers aquota.user ou aquota.group.

Syntaxe : edquota [-u user] [-g group] [-t]

Exemple :

root@pingu# edquota -u citrouille
Disk quotas for user anne (uid 500):
  Filesystem         blocks       soft       hard     inodes     soft     hard
  /dev/hdc1           0       9000       10000         0     90000      10000

Le fichier se compose de 6 colonnes :

On procédera de la même façon pour l'attribution de quotas à un groupe. (Ne tentez pas d'éditer directement ces fichiers; ils ne sont pas en format texte.)

Fixer un délai

On a vu également qu'on pouvait moduler le délai fixé entre le moment où l'utilisateur atteint la limite soft et celui où on va lui interdire toute occupation supplémentaire dans le système de fichiers. On va donc fixer la durée de ce délai. elle sera la même quelque soit l'utilisateur et/ou le groupe.

Syntaxe : edquota -t

Exemple :

root@pingu# edquota -t
Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or seconds
  Filesystem             Block grace period     Inode grace period
  /dev/hdc1                    7days                  7days

il suffit donc de remplacer les valeurs par vos valeurs dans l'unité qui vous convient : second, minute, hour, day, week.

Dépassement de quotas : que se passe-t-il ?

Une fois n'est pas coutume, on se place du côté utilisateur. Nous allons décrire les principaux cas de figure de dépassement de quotas et les messages envoyés à l'utilisateur.

Prenons l'exemple suivant : l'utilisateur Anne dispose de 9Mo en limite douce et 10 Mo en limite dure. Son délai de grâce est de 7 minutes. Ci-dessous le contenu du système de fichiers faisant l'objet de ces quotas :

anne@pingu$ ls -l /home/anne
total 1842
-rw-------    1 root     root         7168 fév 28 23:50 aquota.user
-rw-r--r--    1 anne     anne      1857516 mar  1 12:19 fic1
drwx------    2 root     root        12288 nov 28 12:59 lost+found

Nous sommes largement au-dessus des quotas. Nous allons maintenant copier 4 fois le fichier fic1. Les 3 premières copies se passent bien et nous avons fic2, fic3 et fic4. Ci-dessous, la dernière copie

anne@pingu$ cp fic1 fic5
ide1(22,10): warning, user block quota exceeded.
anne@pingu$ ls -l
total 9134
-rw-------    1 root     root         7168 fév 28 23:50 aquota.user
-rw-r--r--    1 anne     anne      1857516 mar  1 12:19 fic1
-rw-r--r--    1 anne     anne      1857516 mar  1 13:18 fic2
-rw-r--r--    1 anne     anne      1857516 mar  1 13:18 fic3
-rw-r--r--    1 anne     anne      1857516 mar  1 13:18 fic4
-rw-r--r--    1 anne     anne      1857516 mar  1 13:18 fic5
drwx------    2 root     root        12288 nov 28 12:59 lost+found

La limite douce est dépassée. L'utilisateur reçoit un message mais l'écriture est réalisée car nous n'avons pas dépassé la limite dure.

2 cas de figures peuvent alors se présenter si l'utilisateur ne contacte pas l'administrateur ou s'il ne libère pas de l'espace pour repasser au-dessus de la limite douce.

Vérification et affichage des quotas

Les commandes suivantes vont vous permettre d'une part de vérifier les quotas affectés à chaque groupe et/ou utilisateur et éventuellement de synchroniser les informations nécessaires au système pour le suivi de ces quotas.

Edition des informations relatives aux quotas

La commande repquota permet d'afficher un résumé de l'utilisation des quotas et délais de grâce.

Syntaxe : repquota [ -vug ] -a | filesystem

Pour l'exemple, j'ai ajouté un utilisateur Bob.

# repquota -avug
*** Report for user quotas on device /dev/hdc10
Block grace time: 00:07; Inode grace time: 00:07
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --      19       0       0              2     0     0
anne      --    7293    9000   10000              5  9000 10000
bob       +-    9000    8000    9000  00:07       5  8000  9000
+         --      19       0       0              2     0     0

Statistics:
Total blocks: 7
Data blocks: 1
Entries: 3
Used average: 3,000000

On trouve ici les informations relatives au quota imposé aux utilisateurs. On trouvera autant de lignes que d'utilisateurs, groupes et systèmes de fichiers concernés.

Sont rappelés les quotas fixés en nombre de blocs et d'inodes. On trouve également le nombre de blocs et le nombre d'inodes utilisés. Quand un horodatage apparaît dans la colonne grace, comme par exemple pour Bob, cela signifie que l'utilisateur (ou le groupe) a dépassé la limite douce. Le délai de grâce est donc décompté.

Vous pouvez également utiliser la commande quota suivie du nom d'un utilisateur ou d'un groupe. Là encore vous obtiendrez toutes les informations relatives aux quotas et à l'utilisation de l'espace attribué.

Exemple : pour obtenir les informations liées aux quotas concernant Anne :

root@pingu# quota anne
Disk quotas for user anne (uid 500):
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
     /dev/hdc10    7293    9000   10000               5    9000   10000

Vérifications et synchronisation des fichiers de quotas

Il peut arriver que les fichiers de quotas deviennent incohérents. La gestion de ceux-ci devient alors impossible. D'autre part, lorsque vous ajoutez un nouvel utilisateur ou un nouveau groupe à l'aide de la commande edquota, il faut là encore synchroniser les fichiers pour la prise en compte de ces nouvelles informations.

Syntaxe : quotacheck [ -vug ] -a | filesystem

Exemple : vérifier tous les fichiers de quotas, quelque soit le système de fichiers concerné
root@pingu# quotaoff -a
root@pingu# quotacheck -auvg
quotacheck: Scanning /dev/hdc10 [/home/anne/quota] done
quotacheck: Checked 2 directories and 10 files

En conclusion...

Voilà pour ce tutorial concernant les quotas. Pour plus d'informations, consulter le man des commandes : repquota, quotaon, quotaoff, quotacheck, edquota.

N'hésitez pas à laisser un message pour tout ajout ou correction concernant cet article.

Haut


Utiliser chroot

par Jop, Prae & Anne

Emprisonnez un utilisateur, ou un progamme dans une geôle!


Préambule

On ne juge la solidité d'une chaîne que par la résistance de son maillon le plus faible. C'est ainsi que dans l'univers informatique, le maillon est représenté par l'utilisateur. Bien sûr, on peut établir plusieurs classements, mais il est plus simple de considérer que toute personne introduite sur un système peut provoquer des dommages irréparables. Depuis quelques années maintenant, des recherches sont effectuées afin de séparer l'utilisateur du système qu'il utilise. Différentes méthodes ont été testées et employées, limitation des droits des usagers, mise en place d'access lists, limitation d'utilisation, emprisonnement dans un répertoire, déplacement de la racine, emprisonnement d'un espace et de ses processus et pour finir, mise en place d'un système totalement dédié. Il est important de noter que les systèmes tels que les *BSD ont une nette avance dans cette matière. Je ne saurais donc que vous conseiller d'utiliser ces systèmes si vous souhaitez fournir des comptes systèmes à vos utilisateurs.

Note : une extension de l'outil est implémentée dans le noyau Linux par l'intermédiaire des outils GRsec ou WOLK.

Installation

Chroot est installé par défaut dans les distributions courantes. Si jamais ce n'était pas le cas, vous pouvez le trouver normalement dans le paquet coreutils (au moins pour les distributions Debian et Mandrake).

# whereis chroot
chroot: /usr/sbin/chroot

Notre utilitaire se trouve dans le répertoire /usr/sbin. Cela signifie qu'il appartient aux outils de l'administrateur du système et que l'exécutable n'est pas indispensable au démarrage du système.

Vérifions les droits assignés par défaut :

# ls -l /usr/sbin/chroot
-rwxr-xr-x    1 root     root        10136 Jul 12 15:54 /usr/sbin/chroot

Nous pouvons constater que le fichier appartient à l'administrateur root et au groupe de même nom (root:root).

En termes plus simples, cela signifie qu'il peut être lu par n'importe qui (r) et exécuté par n'importe qui (x).

Dans ce cas de figure, la seule chose que nous pourrons obtenir est le changement de racine pour un utilisateur, de par son propre chef.

Préparation du système

Pour l'exercice qui nous intéresse, à savoir emprisonner un utilisateur dans un espace restreint, nous nécessitons des droits supplémentaires. Pendant un court laps de temps, il est indispensable que le programme usurpe l'identité de l'administrateur (root) pour effectuer les opérations nécessaires. Ce mécanisme est rendu possible grâce au suid.

Note : l'emploi du suid implique des failles de sécurité potentielles. Il faut le manier avec précaution et bien être conscient des risques encourrus. Dans les cas extrêmes, cette situation permet à un utilisateur distant mal intentionné de prendre le contrôle du système en tant qu'administrateur.

Pour suid notre programme, exécutons l'opération suivante :

# chmod u+s /usr/sbin/chroot
# ls -l /usr/sbin/chroot
-rwsr-xr-x    1 root     root        10136 2003-07-12 15:54 /usr/sbin/chroot

Le droit d'exécution x a été remplacé par le droit s, signifiant que le suid est désormais appliqué au programme.

Le système est maintenant en mesure d'utiliser correctement le programme.

Nous désirons que l'utilisateur qui se connectera soit dès son arrivée enfermé dans l'environement que nous construisons à cet effet. En ce sens, nous allons créer un script shell qui permettra d'adapter l'entrée de l'utilisateur à notre environement.

Préparation du compte

Si vous ne l'avez pas déjà créée, il faut établir les paramêtres du dit compte.

Petit rappel des options de l'outil useradd :

useradd [-u uid [-o]] [-g groupe] [-G groupe,...]
    [-d home] [-s shell] [-c commentaire] [-m [-k template]]
    [-f inactif] [-e expire ] [-p mot-de-passe] nom

Voici un exemple :

$ useradd -u 1001 -g 1001 -d /home/chroot/toto -s /bin/chroot -c exemple toto

Notre utilisateur toto se voit attribuer les numéros 1001 d'utilisateur et 1001 de groupe et sera logé dans le répertoire /home/chroot/toto. Le shell qui lui permettra de se connecter est un petit script qui autorise l'emprisonnement de l'utilisateur à son arrivée.

De manière simple, ce script peut ainsi être écrit :

#!/bin/bash
exec -c /usr/sbin/chroot /home/chroot/$USER /bin/bash

Si nous utilisons la ligne de commande qui constitue ce script, dans une phase de test, une erreur va nous être retournée :

$/usr/sbin/chroot /home/chroot/toto /bin/bash
/usr/sbin/chroot: /bin/bash: No such file or directory

Que se passe t'il donc ? La réponse est simple. L'invocation du shell, ici /bin/bash, se fait après le déplacement de la racine. Il cherche donc au pied de cette nouvelle racine un répertoire bin contenant l'utilitaire bash. Cependant, puisque nous n'avons jusqu'à lors inséré aucun outil, le système refuse la commande.

Que faire dans ce cas ? La réponse est assez simple, nous allons construire l'environnement nécessaire à l'utilisation de la prison. Cela signifie que chaque commande que vous désirerez utiliser dans cet espace restreint doit y être copié, dans le répertoire aproprié.

Avant de chercher à automatiser la tâche, commençons par le bash de tout à l'heure :

$ cd /home/chroot/toto
$ mkdir bin
$ cp /bin/bash bin/bash

L'utilitaire est à présent copié.

Il faut également fournir les librairies nécessaires à son utilisation. Nous utiliserons l'outil ldd pour déterminer les fichiers nécessaires.

$ ldd /bin/bash
    libncurses.so.5 => /lib/libncurses.so.5 (0x4001e000)
    libdl.so.2 => /lib/libdl.so.2 (0x4005a000)
    libc.so.6 => /lib/libc.so.6 (0x4005d000)
    /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Comme dit, copions les librairies indispensable au fonctionnement :

$ mkdir lib && cd lib
$ cp /lib/libncurses.so.5 .
$ cp /lib/libdl.so.2 .
$ cp /lib/ld-linux.so.2 .

Voilà, il ne reste plus qu'à tester en s'identifiant sous l'utilisateur toto :

toto@127.0.0.1's password:
****************************************************************
* Bienvenue dans l'environnement restreint qui vous est imparti *
****************************************************************
bash-2.05b$ pwd
/
bash-2.05b$

Notre premier travail, créer un espace restreint pour un utilisateur, est achevé.
La tâche ne s'arrête pas là. Tout comme nous avons copié le shell bash, il faut de même insérer tous les utilitaires nécessaires ou vitaux tels que ls, chmod, rm, etc...

Pour ne pas effectuer une tâche répétitive, il est plus intelligent de créer un script qui travaillera pour nous et qui aura le mérite d'être réutilisable :

#!/bin/bash

# On vérifie que le nom de l'utilisateur souhaité est bien passé en paramêtre
if [ "$#" != 1 ];
then
   echo "Usage : $0 <login>"
   exit 255;
fi

# Nom d'utilisateur
LOGIN=$1
# Groupe attribué à l'utilisateur
GROUP=chroot
# Répertoire par défaut des shell chrootés
REP=/home/chroot

# Utilitaires présents dans /bin
OUTILB="bash cat chmod chown cp grep gunzip gzip ls mkdir more mv rm tar"

echo "-- Création du groupe \"${GROUP}\""
groupadd "${GROUP}" > /dev/null 2>&1

echo "-- Création de l'utilisateur \"${LOGIN}\""
useradd \
   -c "Utilisateur en espace restreint" \
   -d "/home/${LOGIN}/" \
   -g "${GROUP}" \
   -s "/bin/chroot" \
   "${LOGIN}"

echo "-- Son mot de passe : "
passwd "${LOGIN}" > /dev/null

echo "-- Création de l'arborescence de son Répertoire personnel --"
mkdir -p $REP/${LOGIN}/bin/ $REP/${LOGIN}/lib/ $REP/${LOGIN}/dev/

# Mise en place des droits sur les répertoires
cd $REP
chmod -R 700 ${LOGIN}

# Copie des programmes et de leurs librairies
for I in $OUTILB;
do
    cp /bin/$I $REP/${LOGIN}/bin/
    # Pour chaque programme, on recherche les librairies correspondantes.
    # On termine en demandant l'exécution par bash des lignes renvoyées par awk
    ldd /bin/$I | awk -v "LOGIN=$LOGIN" '{ print "cp "$3 $REP"/"LOGIN"/lib/" }' | bash
done

# Création de l'espace /dev
mknod $REP/${LOGIN}/dev/null c 1 3 -m 666
chown -R "${LOGIN}:${GROUP}" $REP/${LOGIN}

# Fin de la création du compte utilisateur.
echo ">> Utilisateur \"${LOGIN}\" créée et emprisonné"

if [ ! -e /bin/chroot ]; then
    echo "-- Création du programme /bin/chroot"
    cat < /bin/chroot
    #!/bin/bash
    exec -c /usr/sbin/chroot /home/chroot\$USER /bin/bash
    EOF
    chmod 555 /bin/chroot
fi

Liens utiles - Bibliographie

  • Projet Grsecurity
  • Projet Wolk
  • FHS
  • Très bientôt la suite de cet article abordera comment "chrooter" les services afin d'en optimiser la sécurité

    Haut


    Exploration de la configuration

    par Jonesy
    Mise à jour par le groupe de travail Slackware

    Ou lorsque le pingouin répond à toutes vos questions sur votre système.
    (v.3)


    Avant propos

    Ce document va essayer de répondre le mieux possible à ces deux questions :

    Ce document peut être, d'une certaine façon, considéré comme une suite de Trucs & Astuces, car il vous fournit seulement une liste de commandes vous permettant de répondre aux deux questions ci-dessus. Par ailleurs, notez que la liste des commandes fournies n'est pas exhaustive.

    Points de détail

    Il vous est vivement recommandé, de faire un man sur les commandes avant de les lancer, ceci afin de connaître leurs fonctions et leurs options.

    Absolument rien ne garantit que votre distribution fournisse et/ou installe toutes les commandes utilisées dans ce document.
    Presque toutes les commandes citées ici sont des commandes en ligne, à exécuter en init 3 ou dans un terminal. Il existe aussi de nombreux outils graphiques pour décortiquer le système mais je ne les aborderais pas.
    Enfin, il s'avère qu'en fonction de votre distribution et de la configuration générale du système, les commandes suivantes peuvent être lancées avec un utilisateur normal, dans le cas contraire utilisez le root. A vous de voir et de tester.

    Mise en garde

    Ce document aborde un sujet plutôt technique, il n'est pas forcément à la portée de tout le monde. Les commandes ne sont pas compliquées mais l'interprétation de leur résultats peuvent l'être.

    Mon matériel

    Le matériel installé

    Pour avoir une vue générale du matériel installé :

    #lsdev


    Ce qui retourne quelque chose comme ça:

     Device  DMA  IRQ  I/O Ports
    ------------------------------------------------  8139too           9800-98ff
     cascade   4    2
     Creative          a000-a007 a400-a41f
     dma               0080-008f
     dma1              0000-001f
     dma2              00c0-00df
     eth0          10
     fpu               00f0-00ff
     ide0          14  01f0-01f7 03f6-03f6 d800-d807
     ide1          15  0170-0177 0376-0376 d808-d80f
     keyboard       1  0060-006f
     Mouse         12
     parport0          0378-037a
     PCI               0cf8-0cff 9800-98ff
     pic1              0020-003f
     pic2              00a0-00bf
     rtc           8   0070-007f
     serial            02f8-02ff 03f8-03ff
     timer          0  0040-005f
     usb-uhci      11  d000-d01f d400-d41f
     vesafb            03c0-03df
     VIA               d000-d01f d400-d41f d800-d80f e400-e4ff e800-e80f


    Si la commande lsdev n'est pas fournie par votre distribution, essayez :

    #more /proc/devices

    et les autres commandes de cet article.

    Le processeur

    Afin de connaître les caractéristiques de votre processeur :

    #more /proc/cpuinfo

    Par exemple cela renvoie :

     processor     : 0
     vendor_id     : AuthenticAMD
     cpu family    : 6
     model         : 4
     model name    : AMD Athlon(tm) Processor
     stepping      : 2
     cpu MHz       : 900.044
     cache size    : 256 KB
     fdiv_bug      : no
     hlt_bug       : no
     f00f_bug      : no
     coma_bug      : no
     fpu           : yes
     fpu_exception: yes
     cpuid level   : 1
     wp            : yes
     flags         : fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov pat pse36 mmx fxsr syscall mmxext 3dnowext 3dnow
     bogomips      : 1795.68

    Pour connaître le pourcentage d'utilisation du processeur :

    #top

    Et enfin depuis combien de temps la machine n'a pas redémarré :

    #uptime

    Les IRQs

    Quels sont les IRQs utilisés :

    #procinfo

    Voici la partie du résultat qui nous intéresse :

     [ ... ]
     irq 0: 387420 timer         irq 10:      0 eth0
     irq 1:     9396 keyboard    irq 11:   9366 usb-uhci, usb-uhci
     irq 2:      0 cascade [4]   irq 12: 113603 PS/2 Mouse
     irq 6:      2               irq 14:   6555 ide0
     irq 8:      1 rtc           irq 15:      2 ide1

    Ou pour tous les IRQs possibles :

    #procinfo -i | more


    La commande procinfo peut servir pour la mémoire, l'occupation du processeur... Bref, faites man procinfo pour en savoir plus.

    Comme pour lsdev, la commande procinfo peut être manquante, alors faites aussi :

    #more /proc/interrupts

    La RAM et la SWAP

    Pour afficher la RAM et la SWAP disponibles en Mo :

    #free -mt

    Ce qui donne :

                   total  used  free  shared  buffers  cached
    Mem:             501   118   382       0        2      76
    -/+ buffers/cache:      38   462
    Swap:            509     0   509
    Total:          1011   118   892

    Pour avoir plus d'informations sur la mémoire (RAM et SWAP) de GNU/Linux, allez voir le Trucs & Astuces : Aide mémoire sur la mémoire.

    Les cartes PCI et AGP

    Avoir une première idée des cartes PCI et AGP installées :

    #scanpci

    Personnellement, je préfère :

    #/sbin/lspci

    Ce qui retourne :

    00:00.0 Host bridge: VIA Technologies, Inc.: Unknown device 0305 (rev 02)
    00:01.0 PCI bridge: VIA Technologies, Inc.: Unknown device 8305
    00:04.0 ISA bridge: VIA Technologies, Inc. VT82C686 [Apollo Super] (rev 22)
    00:04.1 IDE interface: VIA Technologies, Inc. VT82C586 IDE [Apollo] (rev 10)
    00:04.2 USB Controller: VIA Technologies, Inc. VT82C586B USB (rev 10)
    00:04.3 USB Controller: VIA Technologies, Inc. VT82C586B USB (rev 10)
    00:04.4 Host bridge: VIA Technologies, Inc. VT82C686 [Apollo Super ACPI] (rev 30)
    00:09.0 Multimedia video controller: Brooktree Corporation Bt878 (rev 11)
    00:09.1 Multimedia controller: Brooktree Corporation Bt878 (rev 11)
    00:0a.0 Multimedia audio controller: Creative Labs SB Live! EMU10000 (rev 07)
    00:0a.1 Input device controller: Creative Labs SB Live! (rev 07)
    00:0b.0 Ethernet controller: Unknown device 0001:8139 (rev 10)
    01:00.0 VGA compatible controller: nVidia Corporation NV11 (rev a1)

    Malgré le nom de la commande, nous pouvons voir que la dernière ligne est ma carte vidéo AGP.

    Interrogation : est-ce dépendant de la carte mère et de sa façon de gérer les IRQ ?


    Pour avoir plus d'informations sur les cartes :

    #/sbin/lspci -v

    Encore plus d'informations sur les cartes ?

    #/sbin/lspci -vv


    Pour savoir quelles cartes sont Plug and Play :

    #lspnp

    NDR : Cette commande fait partie du paquet pcmcia-cs qui contient aussi d'autres commandes pour le matériel pcmcia. N'ayant pas de tel matériel, je ne les ai pas testées.

    Les disques durs

    La première chose, combien de partitions avez-vous sur chaque disque dur, de quel type sont-elles et comment s'appellent-t-elles ?

    #/sbin/fdisk -l

    Ce qui affiche, par exemple :

    Disque /dev/ide/host0/bus0/target1/lun0/disc : 255 têtes, 63 secteurs, 4865 cylindres
    Unités = cylindres sur 16065 * 512 octets

                              Périphérique Amorce  Début   Fin  Blocs    Id Système
    /dev/ide/host0/bus0/target1/lun0/part1 *           1    62 497983+   82 Echange Linux
    /dev/ide/host0/bus0/target1/lun0/part2            63   548 3903795   83 Linux natif
    /dev/ide/host0/bus0/target1/lun0/part3           549  1156 4883760   83 Linux natif
    /dev/ide/host0/bus0/target1/lun0/part4          1157  4865 29792542+  5 Etendue
    /dev/ide/host0/bus0/target1/lun0/part5          1157  1764 4883728+  83 Linux natif
    /dev/ide/host0/bus0/target1/lun0/part6          1765  2250 3903763+  83 Linux natif
    /dev/ide/host0/bus0/target1/lun0/part7          2251  2736 3903763+  83 Linux natif
    /dev/ide/host0/bus0/target1/lun0/part8          2737  3222 3903763+  83 Linux natif
    /dev/ide/host0/bus0/target1/lun0/part9          3223  4865 13197366  83 Linux natif

    C'est le retour que l'on obtient avec un système GNU/Linux utilisant Devfs. La vieille norme de nommage est conservée par des liens symboliques, faites donc :

    #ls -l /dev/hda* /dev/hdb* /dev/sda* /dev/sdb*


    afin de voir la correspondance entre /dev/ide/host0/bus0/target1/lun0/part9 et /dev/hdb9, par exemple.

    Pour vérifier si le DMA est activé pour votre disque dur :

    #/usr/sbin/hdparm -d /dev/hda

    Ce qui retourne :

    /dev/hda:
     using_dma    =  1 (on)


    Pour tester les performances de votre cache et de votre disque dur :

    #/usr/sbin/hdparm -Tt /dev/hda

    Ce qui retourne :

    /dev/hda:  Timing buffer-cache reads:   128 MB in  0.74 seconds =172.97 MB/sec  Timing buffered disk reads:  64 MB in   2.27 seconds = 28.19 MB/sec


    Modifiez /dev/hda en fonction de votre disque dur.

    NDR : Pour information, le fichier correspondant aux partitions est /proc/partitions.

    Les systèmes de fichiers supportés

    Pour connaître la liste des systèmes de fichiers supportés par votre noyau, faites :

    # more /proc/filesystems

    Ce qui renvoie :

    nodev   rootfs
    nodev   bdev
    nodev   proc
    nodev   sockfs
    nodev   tmpfs
    nodev   shm
    nodev   pipefs
            ext2
            minix
            umsdos
            msdos
            vfat
            iso9660
    nodev   devfs
    nodev   nfs
    nodev   autofs
            reiserfs
    nodev   devpts
    nodev   usbdevfs


    NDR : Ce n'est pas vraiment du matériel, car cela dépend de la compilation de votre noyau, mais bon... :-)

    Les CDROMs, graveurs et DVDROMs

    Il y a des chances pour qu'à l'installation votre distribution détermine vos lecteurs de CDROMs, DVDs et graveurs. Mais si ce n'est pas le cas, ou si vous souhaitez en savoir plus, voici comment nous pouvons déterminer quel dev il faut monter pour pouvoir utiliser ces lecteurs et graveurs.

    Sous /proc/ide pour les IDE, sinon ce sera /proc/scsi, vous trouverez un ide1 et un ide2. Sous ces répertoires vous retrouverez hda, hdb, hdc et/ou hdd. Et enfin, là, vous trouverez :

    /proc/ide/-+-ide1/-+-hda/
               |       |
               |       `-hdb/
               |
               `-ide2/-+-hdc/-+-media
                       |      `-model
                       `-hdd/

    Pour voir en une seule fois vos périphériques IDE, faites :

    #find /proc/ide -type d -print

    Ce qui renvoie :

    /proc/ide
    /proc/ide/ide1
    /proc/ide/ide1/hdd
    /proc/ide/ide1/hdc
    /proc/ide/ide0
    /proc/ide/ide0/hdb
    /proc/ide/ide0/hda

    Ou

    #find /proc/ide -iname "media" -type f -print


    Pour savoir si votre graveur est reconnu en tant que graveur, faites (obligatoirement en root) :

    #cdrecord -scanbus

    NDR : Pensez à l'émulation SCSI pour un graveur IDE.

    L'USB

    Hormis consulter le répertoire /proc/bus/usb, je n'ai trouvé que l'outil graphique suivant pour savoir ce qu'il y a sur les ports USB :

    #usbview

    Mini-conclusion

    Toutes ces commandes peuvent vous aider à mieux connaître votre système, mais surtout à le configurer et à l'optimiser.

    Comme vous l'avez sûrement remarqué, le répertoire /proc est très utile ! Sachez que, généralement, les outils s'appuient sur ce répertoire pour vous retourner les informations. Vous ne risquez rien à le parcourir et à faire des less des fichiers que vous y rencontrerez. En plus, c'est la seule méthode qui marchera sur toutes les distributions.

    lshw : le couteau suisse de l'information système

    Votre distribution vous fournit maintenant un outil à tout faire pour explorer votre configuration matérielle : lshw. Cet outil va vous permettre de synthétiser des informations concernant la mémoire, la version du firmware, la configuration de la carte mère, la version du CPU et sa vitesse, la configuration du cache, la vitesse du bus...

    lshw va en fait lire dans tous les fichiers nécessaires (fichiers listés dans le man de l'outil) pour en récupérer les informations nécessaires. Le résultat peut être extrait au format texte, XML ou HTML.

    Affichage court

    Une des sorties écran le plus simple reprend le modèle de la commande ioscan qu'on retrouve sur les systèmes HP-UX.

    # lshw -short
     H/W path              Device    Class       Description
    =======================================================
                                    system      MS-6590
    /0                              bus         MS-6590
    /0/0                            memory      BIOS
    /0/4                            processor   AMD Athlon(tm) XP 2000+
    /0/4/5                          memory      L1 cache
    /0/4/6                          memory      L2 cache
    /0/1                            memory      System memory
    /0/e0000000                     bridge      VT8377 [KT400/KT600 AGP] Host Bridge
    /0/e0000000/1                   bridge      VT8235 PCI Bridge
    /0/e0000000/1/0       /dev/fb0  display     NV17 [GeForce4 MX 440]
    /0/e0000000/6         eth1      network     VT6102 [Rhine-II]
    /0/e0000000/8         eth0      network     RTL-8029(AS) 

    Affichage texte

    Vous avez également la possibilité d'obtenir une description complète de votre configuration matérielle. Par défaut, le résultat est affiché sur la sortie standard. Pour la conserver il suffit donc de faire une redirection dans un fichier

    # lshw > lshw.txt
    # cat lshw.txt
    pingu
        description: Desktop Computer
        product: MS-6590
        vendor: MSI
        version: 1.0
        serial: 00000000
        capabilities: smbios-2.3 dmi-2.3
        configuration: chassis=desktop
      *-core
           description: Motherboard
           product: MS-6590
           vendor: MSI
           physical id: 0
           version: 1.0
           serial: 00000000
           slot: PCI2
         *-firmware
              description: BIOS
              vendor: American Megatrends Inc.
              physical id: 0
              version: 07.00T (04/02/01)
              size: 64KB
              capacity: 192KB
    ...

    Affichage XML / HTML

    Enfin lshw propose une option permettant une récupération des informations au format XML et/ou HTML. La commande est simple :

    # lshw -html > lshw.html

    Il vous suffit alors d'un navigateur pour en visualiser le contenu.

    Mon système GNU/Linux

    La distribution

    Afin de connaître la version, voire le nom, de votre distribution, sachez qu'il existe souvent un fichier :

    /etc/nom-distribution


    Il suffit donc de faire un cat de ce fichier.

    Par exemple, pour la Mandrake c'est /etc/mandrake-release et pour la Slackware, /etc/slackware-version.

    Le nom de ma machine

    Pour connaître le nom de votre machine :

    #hostname


    Le nom de la machine, ou hostname, fait partie du paramétrage réseau d'une machine. Je ne peux donc que vous conseiller la lecture de l' Exploration de la configuration réseau afin d'en savoir plus.

    Le noyau Linux

    La version de votre noyau actuel est obtenue ainsi :

    #uname -r

    Pour connaître la configuration actuelle du noyau :
    Maintenant, vous avez deux solutions pour lire la configuration de votre noyau :

    Les modules du noyau

    Tout d'abord, tous les modules se trouvent sous :

    /lib/modules/version-du-noyau

    Pour avoir une idée des modules à charger, vous pouvez utiliser les commandes sur les périphériques expliquées dans ce document. Sinon allez dans le répertoire :

    /usr/src/linux/Documentation

    et cherchez sans oublier les sous-répertoires. En particulier, lisez le fichier modules.txt.

    Pour avoir de plus amples informations sur un module particulier, et donc sur un driver, faites :

    #modinfo nom-module

    Pour savoir quels sont les modules chargés en mémoire :

    #/sbin/lsmod

    Exemple concret, pour savoir si le module d'émulation SCSI du graveur est chargé :

    #/sbin/lsmod | grep ide-scsi

    Pour savoir si vous avez besoin de recompiler les modules du noyau afin d'avoir l'émulation :

    #find /lib/modules/`uname -r` -iname "ide-scsi*" -print

    Les services (ou daemons)

    Il existe de nombreux outils pour gérer les services sur un système GNU/Linux. Mais ces outils dépendent beaucoup de la distribution, si elle est SysV ou BSD-like et si elle utilise inetd ou xinetd.
    Aujourd'hui les principales distributions sont SysV et utilisent xinetd sauf la Slackware.

    Vous trouverez de l'aide et des articles sur le sujet ici-même.
    Entre autres :
    Mais pour savoir rapidement si votre distribution utilise xinetd, faites simplement :

    #ps -ef | grep -i inetd

    Cela vous sortira soit :

    root        87     1  0 22:13 ?        00:00:00 /usr/sbin/inetd

    Soit :

    root        88     1  0 22:22 ?        00:00:00 /usr/sbin/xinetd


    Et vous saurez si c'est inetd ou xinetd qui est utilisé.

    De plus pour savoir si le système d'initialisation (aussi dit d'init) est SysV (dit Système 5), vérifier dans le répertoire /etc/rc.d qu'il existe les répertoires : init.d, rc1.d, rc2.d,... , rc6.d. Sinon la distribution (ex: BSD, Slackware, Sourcemage, Nasgaïa) utilise un autre système d'init.

    Les processus

    Pour savoir quel processus est le processus père de quel(s) autre(s) :

    #pstree -ph

    Ce qui affiche cet arbre :

    init(1)-+-agetty(96)
           |-devfsd(14)
           |-eth0(73)
           |-gvim(319)
           |-inetd(85)
           |-kapmd(3)
           |-kdm(97)-+-X(99)
           |           `-kdm(100)--icewm(111)-+-rxvt.bin(125)--bash(127)--pstree(349)
           |                                      `-sylpheed(205)
           |-keventd(2)
           |-khubd(52)
           |-klogd(83)
           |-mdrecoveryd(9)
           |-modem_run(158)
           |-pppd(160)---pppoa2(162)---pppoa2(165)
           `-syslogd(80)


    Nous avons donc sous les yeux tous les processus du système avec leur PID (Process Identifier) sous une forme nous permettant de comprendre qui est dépendant de qui. En conséquence, cela permet aussi de mieux comprendre le système et de voir ce qui tourne.

    Le serveur graphique, XFree86

    La version de votre serveur X, XFree86 :

    #XFree86 -version

    Afin de mieux connaître votre configuration graphique, éditez en lecture le fichier :

    /etc/X11/XF86Config-4

    Si vous ne possédez pas ce fichier, ou pour une version de XFree86 antérieure aux versions 4 :

    /etc/X11/XF86Config

    Et pour affiner la configuration de XFree :

    #xvidtune

    Les bibliothèques

    Pour avoir la liste des bibliothèques installées figurant dans les répertoires :
    Faites :

    #ldconfig -p

    Mais pour savoir si la bibliothèque libc.so est installée, faites plutôt :

    #ldconfig -p | grep -i libc.so

    Ce qui a pour résultat :

    libc.so.6 (libc6, OS ABI: Linux 2.0.0) => /lib/libc.so.6

    Pour déterminer la version d'une bibliothèque installée, cela peut se révéler compliqué...
    Voici quelques méthodes que je connais :
    NDR : Le terme library est souvent abusivement traduit par "librairie" au lieu de "bibliothèque". Je lui préfère ce dernier, sachez simplement qu'il s'agit de la même chose.

    Les logiciels en général

    Pour savoir si un logiciel est installé, il y a les outils en relation avec le type de paquet utilisé par la distribution. Mais si vous prenez l'habitude d'installer à partir des sources, ces outils ne marchent plus. Donc les solutions universelles sont :

    #cd / && find . -iname "*nom-du-logiciel*" -type f -print

    Ou

    #locate nom-du-logiciel

    En général, pour connaître la version d'un logiciel, il suffit de faire :

    #exécutable-du-logiciel --version

    Ou

    #exécutable-du-logiciel -v

    Pour savoir, quelles bibliothèques un exécutable utilise ou dont il a besoin :

    #ldd exécutable

    Par exemple :

    #ldd `which sylpheed`

    Retourne :

           libgmodule-1.2.so.0 => /opt/gnome/lib/libgmodule-1.2.so.0 (0x40017000)
           libglib-1.2.so.0 => /opt/gnome/lib/libglib-1.2.so.0 (0x4001a000)
           libdl.so.2 => /lib/libdl.so.2 (0x40046000)
           libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x4004a000)
           libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x40058000)
           libm.so.6 => /lib/libm.so.6 (0x40131000)
           libgdk_pixbuf.so.2 => /opt/gnome/lib/libgdk_pixbuf.so.2 (0x40154000)
           libgtk-1.2.so.0 => /opt/gnome/lib/libgtk-1.2.so.0 (0x40168000)
           libgdk-1.2.so.0 => /opt/gnome/lib/libgdk-1.2.so.0 (0x4028d000)
           libgpgme.so.6 => /usr/local/lib/libgpgme.so.6 (0x402bf000)
           libssl.so.0 => /usr/lib/libssl.so.0 (0x402d5000)
           libcrypto.so.0 => /usr/lib/libcrypto.so.0 (0x4038b000)
           libc.so.6 => /lib/libc.so.6 (0x4044b000)
           /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)


    NDR : J'ai utilisé la commande ldd `which sylpheed` car ldd n'utilise pas le PATH, donc il faut lui donner le chemin d'accès de l'exécutable. Ce que fait which sylpheed pour l'exemple.

    Déterminer quelques versions

    Le composant La commande
    Le noyau Linux uname -r
    GCC, le compilateur gcc --version
    XFree86, le serveur X XFree86 -version
    KDE (qt, kde, kde-config) kde-config --version
    Gnome et ses bibliothèques gnome-config --version

    glib-config --version

    gtk-config --version

    gtkmm-config --version
    WindowMaker wmaker --version
    Enlightenment enlightenment --version
    La bibliothèque Glibc /lib/libc.so.6
    OpenSSL openssl version
    GnuPG (Gnu Privacy Guard) gpg --version
    La bibliothèque GPGme (GnuPG Made Easy) gpgme-config --version
    L'éditeur Vi (ou Vim) vi --version
    ...  

    A compléter vous-même... ;-)

    Mini-conclusion

    Comme pour le matériel, ce qui précède peut vous aider... Mais pour les logiciels la tâche est plus compliquée car beaucoup d'éléments entrent en considération comme : la distribution, le système de paquetage, la hiérarchie du système de fichiers...

    Mot de la fin

    J'espère que vous avez appris quelque chose et que cela vous sera utile.

    N'hésitez pas à m'envoyer vos remarques.

    Remerciements

    Merci aux forums de Léa, indispensables. J'apprends tous les jours ! :-)
    Merci à Piem pour ses remarques.
    Et surtout un grand merci à Marc pour m'avoir relu, corrigé et conseillé sur ce document.

    Où trouver les commandes utilisées...

    Haut


    Compiler php avec mysql pour le serveur Apache

    Miloz

    Procédure d'installation pour compiler php avec mysql pour le serveur Apache.


    Introduction

    Aujourd'hui pour la création de sites web le langage php avec la possibilité de se baser sur une base de données SQL pour les forums, les contacts, des listes clients... est le langage très en vogue. Pourquoi faire un serveur Apache supportant php-mysql ?

    Quelle installation faire ?

    Il y a plusieurs manières de s'y prendre pour installer le support php sur le serveur apache :

    Compiler ou recompiler Apache pour ensuite faire l'installation dynamique :

    Détarrer les packages

    cd /usr/local/src

    tar zxvf /le/chemin/du/package/apache_1.3.19.tar.gz (telechargez le sur www.apache.org )

    cd apache_1.3.19/

    Configurer puis compiler

    Ensuite vous faites, pour un apache compilé avec une grande souplesse d'utilisatoin par la suite faites :

    ./configure --prefix=/la/où/on/veut/installer/apache --enable-module=all --enable-shared=max

    (si quelqu'un peut m'expliquer c'est quoi la différence entre --enable-module=all et --enable-module=most)

    L'option --prefix spécifie où apache va s'installer. Vous pouvez spécifiez plein de chemins pour les différents éléments avec les options mais c'est pratique de tous avoir dans un seul répertoire donc je vous conseille de pas s'embrouiller et de spécifier /www pour cette option.

    Si vous vous voulez juste activer le support DSO sans tous les autres modules tapez :

    ./configure --prefix=/la/où/on/veut/installer/apache --enable-module=so

    Ensuite vous faites un make puis un make install qui va vous installer tous les fichiers dans le chemin spécifié précédemment. Vous pouvez désormais effectuez l'installation dynamique de php.

    L'installation dynamique :

    Détarrer les packages

    Là vous faites ce que vous voulez du moment que vous savez ce que vous faites mais c'est pas bien important :

    cd /usr/local/src/

    tar zxvf /le/chemin/du/package/php-4.x.tar.gz (telechargez ce fichier sur www.php.net )

    cd php-4.x/

    Configurer puis compiler

    Je pars du principe que vous avez mysql installé correctement, c'est à dire que vous avez toutes les librairies nécessaires à la compilation d'apache (notament la librairie libmysqlclient.so) si vous ne l'avez pas d'installé, teléchargez le sur http://www.mysql.com il ya même des rpms...

    Là ca devient important, ce sont les options de compilation de php :

    ./configure --with-mysql --with-apxs

    Vous pouvez bien entendu rajoutez toutes les options que vous voulez comme gd ou xml... A noter qu'il y a en une tres interessante --enable-versioning qui permet d'activez les supports php4 et php3 en même temps.

    Si il ne trouve pas le support mysql ajoutez le chemin du fichier libmysqlclient.so dans /etc/ld.so.conf (par exemple /usr/lib/mysql ou /usr/local/lib/mysql ) et faites un ldconfig puis ensuite réessayez.

    Si il ne trouve pas apxs, spécifiez le chemin de celui-ci comme dans la ligne si dessous :

    ./configure --with-mysql --with-apxs=/le/chemin/dapache/bin/apxs (par exemple /www/bin/apxs )

    Si il ne le trouve toujours pas il est très probable que votre compilation de httpd ne supporte pas le DSO, recompilez apache comme spécifié ci-dessus.

    Si vous rencontrez d'autres problèmes rectifiez vous-meme (moi il me manquait flex ).Une fois que la configuration s'est bien passée il n'y a probablement aucun problème pour la compilation :

    make

    Puis pour installer :

    make install

    Vérifier le httpd.conf.

    Maintenant il suffit de vérifier si il a fait toutes les modifications nécessaires :

    Dans le fichier httpd.conf qui se trouve logiquement dans le repertoire conf du repertoire où vous avez installé Apache (/www/conf/ si vous avez suivi mon exemple) vérifiez qu'il y a les lignes non-commentées quelque part dans le fichier :

    LoadModule php4_module libexec/libphp4.so

    et après l'instruction ClearModuleList :

    AddModule mod_php4.c

    Passez à la partie commune aux deux installations.

    L'installation statique :

    Détarrer les packages

    cd /usr/local/src/

    tar zxvf /le/chemin/du/package/apache_1.3.19.tar.gz (telechargez le sur www.apache.org )

    tar zxvf /le/chemin/du/package/php-4.x.tar.gz (telechargez ce fichier sur www.php.net )

    Configurer puis compiler

    cd apache_1.3.19/

    ./configure --prefix=/www

    cd /usr/local/src/php-4.x/

    Je pars du principe que vous avez mysql installé correctement, c'est à dire que vous avez toutes les librairies nécessaires à la compilation d'apache (notament la librairie libmysqlclient.so) si vous ne l'avez pas d'installé, teléchargez le sur http://www.mysql.com il ya même des rpms...

    ./configure --with-mysql --with-apache=../apache_1.3.19 --enable-track-vars

    ou

    ./configure --with-mysql --with-apache=/usr/local/src/apache_1.3.19 --enable-track-vars

    Les problèmes relatifs à l'option mysql sont décrits et des solutions ont été données précédemment dans ce document.

    Si vous avez des problèmes parce qu'il ne trouve pas apache vous avez du vous tromper dans le chemin spécifié après l'option --with-apache, rectifiez le.

    make

    make install

    cd /usr/local/src/apache_1.3.19/

    ./configure --prefix=/www --activate-module=src/modules/php4/libphp4.a

    Les détails sur l'option --prefix ont deja été donné précédemment.

    Un petit make pour la compilation puis un make install pour l'installation.

    Vous pouvez passez à la partie commune aux deux types d'installation.

    Voici la partie commune aux deux installations :

    Modification du httpd.conf

    Dans le fichier httpd.conf (qui se trouve dans le répertoire conf du répertoire /www/conf/ si vous avez fait la compilation d'apache comme décrite ci-dessus ) vous devriez trouvez la ligne suivante, elle est probablement commentée si vous avez fait l'installation statique alors enlevez le # qui est devant. Si elle ne s'y trouve pas (vérifiez à deux fois car c'est étonnant) ajoutez la.

    AddType application/x-httpd-php .php

    et faites de même avec cette ligne si vous voulez voir vos sources en couleur dans votre navigateur (pour déboguer c'est pas mal...) :

    AddType application/x-httpd-php-source .phps

    Vous pouvez ajoutez toutes les extensions de fichier que vous voulez par exemple :

    AddType application/x-httpd-php .php .php3 .html .moa

    Copiez le php-dist.ini vers /usr/local/lib/php.ini ou /usr/lib/php.ini et modifiez les options à votre gout en l'éditant.

    Vous pouvez lancer ou redémarrer le serveur apache. Si vous avez fait la compilation d'apache comme décrite ci-dessus :

    cd /www/bin

    ./apachectl start

    Effectuer un test.

    Et faites un petit test.

    Voila le petit test conseillé par la doc d'installation de php. Mais je suis sur que vous avez envie de tester vos pages persos alors dépechez vous de copiez ou de liez vos pages dans le repertoire htdocs (par default).

    Mettez <?phpinfo()?> entre des tags body d'une page html intitulée test.php ou cequetuveux.php ... Ensuite vous entrez dans votre navigateur préféré :

    http://localhost/test.php

    Haut


    L'initialisation de la distribution Slackware

    Par Michel Lalumiere
    Révision : Pascal Cussy

    Voici un résumé du système d'initialisation de la Slackware qui se veut un peu particulier de par sa conception et ses niveaux d'exécution par rapport aux autres distributions qui emploient le System V.


    Introduction

    Comprendre le mécanisme d'initialisation de la Slackware permet de personnaliser et de configurer correctement la distribution. C'est à  ce stade par exemple que l'on pourra décider de charger certains modules ou de démarrer ou non certains services.
    Ce mécanisme d'initialisation repose en grande partie sur le programme init qui, à  partir de son fichier de configuration /etc/inittab, va lancer certains des scripts bash contenus dans le répertoire /etc/rc.d.
    Les développeurs de Slackware nomment son processus d'initialisation BSD-like parce qu'il s'appuie en partie sur le système développé par la Berkeley Software Development (BSD). Certains le décrivent ainsi "Faire du BSD avec du System V" (le "V" désigne le chiffre romain 5). Le System V constitue un autre mode d'initialisation, utilisé par exemple par la Red Hat et les distributions dérivées comme la Mandrake.
    Cet article vise à  couvrir le processus d'initialisation, du démarrage de l'ordinateur à  l'ouverture d'une session. Pour ce, quelques principes généraux sont exposés. La configuration de l'initialisation proprement dite est traitée dans un deuxième temps avec la présentation du fichier /etc/inittab et des scripts du répertoire /etc/rc.d. Pour finir, sont décrits les mécanimes conduisant à  l'ouverture d'une session sur le système.

    Les principes généraux

    A l'allumage de l'ordinateur, le BIOS (Basic Input Output System) recherche les périphériques présents puis exécute le POST (Power On Self Test) qui effectue un certain nombre de vérifications du matériel. Il recherche ensuite un système d'exploitation dans la liste des supports précisé dans le Setup du BIOS.
    Nous supposerons ici que le système d'exploitation est situé sur le disque dur même si celui-ci n'est pas toujours le premier support recherché.
    Sur la Slackware, comme sur toute distribution Linux, un chargeur de boot est installé. Il s'agit en l'occurrence de Lilo. Celui-ci place sur le disque un petit programme chargé de lancer le système. Ce programme peut être placé sur le premier secteur de la partition active ou, si l'on dispose de plusieurs système d'exploitation sur sa machine, sur le MBR (Master Boot Record).
    Il s'agit en fait du premier secteur du disque dur et contient la table des partitions et un programme qui charge le secteur de début de la partition active si Lilo n'y est pas installé.
    Lilo charge le noyau qui est exécuté en mémoire. Entre autres tâches, celui-ci détecte le matériel, monte le système de fichiers et se charge pour finir de lancer le programme /sbin/init qui démarre l'initialisation du système.

    Seul et unique processus à  être lancé directement par le kernel, init est le père de tous les autres processus (il s'agit du processus numéro 1 comme le montrent les commandes ps -ax ou pstree -a).
    Il a pour tâche de lancer chacun des processus, démons, sessions de login et de gérer l'arrêt du système ainsi que d'autres fonctions pour lesquelles il a été conà§u ou configuré.
    Pour cela, différents états dits niveaux d'exécution (ou runlevels) sont définis. Plus précisément, un niveau d'exécution correspond à  une configuration logicielle qui permet de lancer un certain nombre de processus.
    Le programme init définit 8 niveaux d'exécution: les 7 niveaux numérotés 0 à  6 et le niveau S (ou s) comme Single. Les niveaux 7 à  9 sont également reconnus mais ils ne sont pas documentés. Il existe également les pseudo-niveaux a, b et c qui sont utilisés pour lancés des commandes à  partir du fichier /etc/inittab dans un mode particulier appelé ondemand.
    Le niveau S n'est pas destiné à  être utilisé directement mais pour les scripts exécutés au niveau 1. Il est utilisé pour passer en mode mono-utilisateur et ne requiert pas de fichier /etc/inittab.
    La page de manuel d'init précise que les niveaux 0, 1 et 6 sont réservés. Le niveau 0 est utilisé pour arrêter le système, le niveau 6 pour relancer la machine et le niveau 1 pour passer en mode mono-utilisateur (par exemple, pour maintenance du système).
    On peut passer à  un autre niveau d'exécution à  l'aide de la commande telinit.

    Avec le System V , à  chaque niveau d'initialisation correspond un répertoire /etc/rc.d/rcn.d, n désignant le niveau d'initialisation. En fait, les scripts sont situés dans le répertoire /etc/rc.d/init.d et des liens symboliques sont créés vers ceux-ci dans chaque répertoire rcn.d.
    Avec la Slackware et son système d'initialisation de type BSD, il n'y a plus de répertoire particulier affecté à  chaque niveau mais des scripts, organisés par fonction (par exemple rc.M pour le chargement des modules) et qui peuvent être communs à  plusieurs niveaux d'exécution.
    C'est en fait l'écriture du fichier de configuration /etc/inittab qui permet de lancer ces scripts. Ceci nous amène à  parler maintenant des fichiers de configuration.

    Les fichiers et scripts de configuration

    Comme précisé auparavant, il s'agit du fichier /etc/inittab et des scripts situés dans le répertoire /etc/rc.d. De faà§on sommaire, on peut dire que le fichier /etc/inittab va dans tous les cas indiquer au programme init d'exécuter rc.S puis, selon le niveau d'exécution, rc.6 ou rc.4 ou rc.K ou rc.M, ce dernier exécutant la plupart des autres scripts du répertoire /etc/rc.d (avec un nom en général du type rc.fonction, l'extension fonction permettant de préciser l'objet du script).

    Le fichier /etc/inittab

    Il convient de dire quelques mots sur la faà§on de rédiger ce fichier avant de discuter de celui de la Slackware.
    La commande man inittab précise qu'une entrée dans le fichier /etc/inittab doit avoir la forme:

    code:niveau:action:commande

    avec

    Les actions peuvent être :

    respawn le processus est automatiquement relancé une fois terminé (par exemple, la console redémarre lorsque l'on ferme la session avec la commande exit).
    wait le processus n'est lancé qu'une seule fois et init attend qu'il se termine avant de poursuivre.
    once le processus n'est exécuté qu'une seule fois dans le ou les niveaux spécifiés.
    boot le processus sera lancé au moment du lancement du système, le niveau d'exécution étant ignoré.
    bootwaitcomme boot mais init attend qu'il se termine pour continuer.
    off ne fait rien du tout.
    ondemand pour lancer les processus lors d'un pseudo passage en mode ondemand, ces niveaux étant nommésa, b et c (en fait, il n'y a pas de changement de niveau, les commandes processus sont simplement lancées).
    initdefault pour définir le niveau par défaut après le démarrage, le champ commande étant ignoré (si aucun niveau n'est spécifié, le niveau d'exécution sera demandé sur la console).
    sysinit définit un processus à  lancer pendant le démarrage et qui sera exécuté avant toutes les lignes boot ou bootwait, le champ niveau étant ignoré.
    powerwait définit la commande à  lancer quand init reà§oit le signal SIGPWR qui indique un problème d'alimentation. Init attendra que le processus soit terminé pour poursuivre.
    powerfail idem que powerwait mais init n'attend pas que le processus soit terminé.
    powerokwait définit le processus à  lancer si un SIGPWR est reà§u. Le fichier /etc/powerstatus s'il existe est contrà´lé. Si celui-ci contient la chaà®ne OK, c'est que le problème d'alimentation est résolu.
    powerfailnow survient si la batterie d'un système d'alimentation externe est presque vide et que l'alimentation va cesser.
    ctrlaltdel définit le processus à  lancer si la séquence de touches [Ctrl]+[Alt]+[Suppr] est initiée. Habituellement c'est la commande shutdown qui est appelée.
    kbrequest le processus sera lancé si init reà§oit un signal indiquant qu'une combinaison spéciale de touches a été pressée.



    Tout ceci peut-être illustré à  l'aide du fichier inittab de la Slackware 9.1, dont voici un extrait. Les commentaires ont été traduits.
    Les scripts qu'il appelle sont tous regroupés dans le répertoire /etc/rc.d et comme vous le constaterez plus loin, ce répertoire ne contient que des scripts bash reliés aux différents niveaux d'exécution et non des sous-répertoires comme comme pour le System V (qui est utilisé par exemple dans les distributions de type RedHat).
    Il est précisé dans ce fichier que la Slackware utilise 6 niveaux d'exécution :

    0 = arrêt du système
    1 = mode mono-utilisateur
    2 = inutilisé (mais configuré comme le niveau 3)
    3 = mode multi-utilisateurs (niveau par défaut)
    4 = mode graphique avec Kdm, Gdm ou Xdm
    5 = inutilisé (mais configuré comme le niveau 3)
    6 = redémarrage

    Les niveaux sont alors définis de la faà§on suivante

    # Niveau d'exécution par défaut défini par l'utilisateur
    id:3:initdefault:

    Il s'agit de la ligne qui précise le niveau d'initialisation par défaut. On remarque que bien évidemment aucune commande n'est spécifiée. Il est également précisé qu'il ne faut jamais mettre le niveau à  0 ou 6 pour éviter que le système ne s'arrête ou ne redémarre dès l'initialisation.

    # Initialisation du système (lancé au démarrage du système).
    si:S:sysinit:/etc/rc.d/rc.S

    Le script /etc/rc.d/rc.S est lancé au démarrage du système quel que soit le niveau du fait que l'action sysinit est précisée (le choix du niveau S est en fait inutile ici).
    Ce script, entre autres choses, active le swap, teste le système de fichiers, reboote si le système de fichiers a été réparé et a changé et lance le script /etc/rc.d/rc.modules qui charge les modules nécessaires.

    # Script à  lancer lorsque l'on passe en mode mono-utilisateur (niveau 1 ou S)
    su:1S:wait:/etc/rc.d/rc.K

    Ce script est chargé de terminer tous les démons et de passer ensuite au niveau 1 à  l'aide de la commande telinit -t 1 1.

    # Script à  lancer lorsque l'on passe en mode multi-utilisateurs.
    rc:2345:wait:/etc/rc.d/rc.M

    Le script rc.M est lancé aux niveaux multi-utilisateurs 2, 3, 4 et 5. Comme on le verra plus loin, c'est l'un des scripts les plus importants du répertoire /etc/rc.d puisqu'il est chargé de lancer une grande partie des autres.

    # Que faire des "trois doigts magiques"
    ca::ctrlaltdel:/sbin/shutdown -t5 -r now

    On peut remplacer l'option -r par -h pour que l'ordinateur soit arrêté et non relancé lorsque l'on appuie simultanément sur les trois touches [Ctrl]+[Alt]+[Suppr] dans une console

    # Le niveau 0 arrête le système.
    l0:0:wait:/etc/rc.d/rc.0

    En fait, rc.0 n'est qu'un lien vers rc.6 qui teste néanmoins si c'est le niveau 0 qui a été appelé. Dans ce dernier cas, il exécute la commande poweroff.
    Ce script permet d'éteindre correctement la machine en arrêtant un certain nombre de démons comme mysql ou apache et en démontant le système de fichiers.

    # Le niveau 6 relance le système.
    l6:6:wait:/etc/rc.d/rc.6

    Au niveau d'exécution 6, le script rc.6 est appelé directement et lance dans ce cas la commande reboot.

    # Que faire en cas de pb d'alimentation (shutdown en mode mono-utilisateur)
    # (note de Martial: concerne les systèmes avec onduleurs et démon d'alim)
    pf::powerfail:/sbin/genpowerfail start

    # Si l'alimentation est rétablie avant le shutdown, on annule celui-ci
    pg::powerokwait:/sbin/genpowerfail stop

    # Les getties en mode multi-utilisateur
    c1:1235:respawn:/sbin/agetty 38400 tty1 linux
    c2:1235:respawn:/sbin/agetty 38400 tty2 linux
    c3:1235:respawn:/sbin/agetty 38400 tty3 linux
    c4:1235:respawn:/sbin/agetty 38400 tty4 linux
    c5:1235:respawn:/sbin/agetty 38400 tty5 linux
    c6:12345:respawn:/sbin/agetty 38400 tty6 linux

    Il s'agit des consoles texte. On passe de l'une à  l'autre par [Ctrl]+[ALT]+[Fn]. On peut en commenter quelques unes si la machine n'est pas utilisée simultanément par plusieurs personnes afin d'économiser un peu d'espace mémoire.
    L'action respawn entraà®ne que le programme agetty est automatiquement relancé dès que l'on quitte une session, permettant qu'une autre soit ouverte.
    Elles sont activées pour les niveaux 1, 2, 3 et 5. On remarque que la console 6 est également activée au niveau 4. Une remarque dans le fichier explique pourquoi :
    "Le niveau 4 n'était utilisé que pour les systèmes uniquement sous X, jusqu'à  ce que l'on découvre qu'il mettait init dans une boucle qui maintenait la charge système en permanence à  1. En conséquence, il y a maintenant un getty ouvert sur tty6. Heureusement, personne ne s'en est rendu compte. ;^)
    En tous cas, il n'est pas mauvais d'avoir une console texte au cas où quelque chose irait mal sous X."

    # Lignes série
    #s1:12345:respawn:/sbin/agetty 19200 ttyS0 vt100
    #s2:12345:respawn:/sbin/agetty 19200 ttyS1 vt100

    # Lignes Dialup
    #d1:12345:respawn:/sbin/agetty -mt60 38400,19200,9600,2400,1200 ttyS0 vt100
    #d2:12345:respawn:/sbin/agetty -mt60 38400,19200,9600,2400,1200 ttyS1 vt100

    x1:4:wait:/etc/rc.d/rc.4
    Cette dernière ligne définit ce qui doit être fait au niveau 4. Le script rc.4 est exécuté ce qui permet de lancer un gestionnaire graphique (gdm, kdm ou xdm).

    On voit donc que les niveaux 0 à  6 y sont référés ainsi que le niveau S, mais en fait ils sont regroupés pour que le système n'en voie que trois.

    1. Le niveau d'arrêt et de redémarrage du système ( 0 et 6 ) le niveau 0 étant en fait un lien du niveau 6.
    2. Un niveau pour le passage en mode mono-utilisateur ( 1 ou S )
    3. Un niveau multi-utilisateur ( 2 et 3 et 4 pour le mode X )

    On notera ainsi qu'il n'y a aucune différence entre les modes 2-3 et 5 et que les modes 0 et 6 partagent le même script puisqu'il n'y a que la dernière commande qui doit changer (poweroff ou reboot selon le cas).
    Les niveaux 2 et 5 sont néanmoins évoqués au cas où l'on souhaiterait définir de nouveaux niveaux multi-utilisateurs personnalisés.

    Enfin, ce fichier peut être édité pour y insérer une commande quelconque que l'utilisateur aimerait avoir lors du démarrage. Voici à  cet égard un exemple de l'insertion d'une telle commande pour avoir le contenu d'un fichier log sur une console quelconque.
    log:2345:respawn:/usr/bin/tail -f --retry /var/log/sys.log >/dev/ttyXXX

    Les scripts contenus dans le répertoire /etc/rc.d et leur signification

    Nous avons vu auparavant que init utilisait fichier /etc/inittab pour exécuter les différentes tâches nécessaires à  l'initialisation du système. C'est à  partir de ce fichier que sont lancés les scripts contenus dans le répertoire /etc/rc.d.
    On va maintenant passer en revue ces scripts pour voir à  quoi ils servent et leur interdépendance.
    La configuration du fichier /etc/inittab est telle que:

    De faà§on générale, le script rc.S lance rc.modules pour charger les modules au démarrage et peut lancer le script rc.serial qui initialise les ports série (le chargement de rc.serial est toutefois commenté par défaut dans rc.S).
    Tous les autres scripts du répertoire /etc/rc.d sont lancés directement ou indirectement par rc.M (indirectement parce que certains sont lancés par rc.inet1 ou rc.inet2).
    On peut maintenant donner une description plus complète de l'architecture du répertoire.

    rc.S
    C'est le premier script à  être appelé. Il sert à  préparer le système avant qu'il n'entre dans le niveau de démarrage désiré. Il monte le système fichier utilisé sur votre système (ext2, ext3, reiserfs, …), initialise les périphériques Plug&Play, charge les modules du kernel (via le script rc.modules), configure les ports série etc …
    Le fichier rc.S est le plus imposant et contient aussi deux appels de scripts pour compléter son travail qui sont :
    rc.modules
    Ce script contient presque tous les modules qui ont été compilés avec le noyau de base, qui est installé avec la distribution. Il utilise la commande modprobe pour charger ces modules et l'on pourra donc, en décommentant l'entrée devant celle-ci, charger un module qui nous est nécessaire. Le fichier /etc/modules.conf reste malgré tout nécessaire du fait que certaines applications y insèrent des commandes pour charger leurs modules lorsqu'on les installe.
    rc.serial
    Configure les ports série en activant la commande setserial appropriée. Il est lancé par rc.S mais il est commenté par défaut
    Il y a d'autres fonctions que ce script appelle ainsi un rapide coup d'oeil sur ledit fichier vous en dira plus.

    Après que init ait fini de compléter son travail avec rc.S, il entre dans le mode défini par défaut dans le fichier /etc/inittab, soit en mode multi-utilisateur ou mono-utilisateur ; de là  il activera les différents scripts dont il a besoin pour le mode spécifié, scripts dont voici un bref aperà§u.

    rc.0
    N'est qu'un lien du script rc.6, il a donc la même fonction.
    rc.6
    Ce script termine tous les processus par les commandes killall15 puis killall9, stoppe les services de quotas et de comptabilité si ceux-ci sont utilisés, démonte les différents systèmes fichiers NFS et autres, désactive le swap, démonte les systèmes fichiers locaux, sauvegarde quelques informations telles que l'heure système.
    Enfin, il exécute la commande reboot si c'est rc.6 qui a été appelé directement ou poweroff si c'est rc.0 qui a été demandé (le script effectue un test au départ pour savoir lequel des deux a été appelé).
    On peut modifier ce script par exemple pour qu'il vide le répertoire /tmp en insérant une ligne du type rm -r -f /tmp/* juste avant qu'il ne démonte le système de fichiers.
    rc.K
    Ce script est appelé lorsque init passe en mode mono-utilisateur (niveau 1 ou S) et consiste à  terminer tous les processus en leur envoyant le signal TERM, à  stopper les services quotas et les serveurs et à  entrer en mode mono-utilisateur par la commande :
    telinit - t 1 1
    rc.4
    C'est le script qui est lancé en mode graphique (X Window) et sert uniquement à  définir le gestionnaire de connexion (kdm, gdm, xdm). On peut éventuellement le modifier à  son goà»t et y ajouter d'autres fonctions selon les goà»ts personnels de l'utilisateur.
    rc.M
    C'est le deuxième script à  être lu par init puisqu'il définit le mode "niveau démarrage" et initialise les différents scripts se rapportant à  ce mode. En fait, comme on l'a déjà  dit, il lance tous les autres scripts du répertoire /etc/rc.d.
    Outre le lancement des scripts, il exécute les commandes suivantes (si celles-ci sont disponibles, c'est-à -dire si les paquets correspondants ont été installés) :


    D'autres fonctions sont activées par rc.M à  partir des scripts du répertoire /etc/rc.d. Il convient de noter que ces scripts ne seront lancés que s'ils sont exécutables.
    Ces scripts ont été classés ici en trois rubriques : réseau, matériel et divers.

    Initialisation réseau
    rc.inet1
    Il est chargé de mettre en place les interfaces réseau notamment en chargeant le module de la ou des cartes réseau, en configurant les interfaces à  l'aide de la commande ifconfig et en définissant un routage avec la commande route.
    Même si vous n'êtes pas connecté par une carte réseau, il faut que ce script soit lancé si vous souhaitez activer la fonction de rebouclage (loopback) utile si vous voulez faire tourner Apache pour tester vos pages Web.
    Ce script exécute le script rc.inet1.conf qui contient les paramètres de configuration du réseau, par exemple l'adresse IP ou le masque de sous-réseau (il faut donc rendre ce script exécutable si l'on veut que les paramètres réseau soient pris en compte).
    rc.inet2
    Il est exécuté après rc.init1, monte les systèmes de fichiers NFS et SMBFS et démarre les différents services de base qui sont listés ci-après :
    rc.httpd
    Il démarre le serveur Apache
    rc.sendmail
    Il démarre le serveur de mail
    rc.mysld
    Il démarre le démon serveur de la base de données Mysql (ce n'est pas à  proprement parler un élément réseau mais il est souvent associé à  Apache)
    rc.atalk
    Il démarre le serveur AppleTalk
    rc.samba
    Il démarre le serveur Samba
    Configuration matérielle
    rc.pcmcia
    Recherche et configure tous les périphériques PCMCIA qui se trouvent sur la machine. Ceci est plus intéressant pour les utilisateurs de portables qui ont un modem ou une carte réseau de ce type.
    rc.hotplug
    Il initialise les périphériques "hotplug".
    rc.cups
    Il permet de lancer le démon d'impression Cups
    rc.lprng
    Il permet de lancer le démon d'impression Lpd. Attention de ne rendre exécutable qu'un seul des deux scripts pour l'imprimante.
    rc.acpid
    Il démarre le démon de gestion de l'alimentation ACPI.
    rc.alsa
    Il charge les modules de son ALSA et initialise le mixer avec les anciens paramètres
    rc.keymap
    Il charge la configuration du clavier pour la console.
    rc.gpm
    Il charge le serveur de la souris pour la console, GPM

    Divers
    rc.font
    Charge les fontes personnalisées en mode console. Au départ, il est présent sous le nom rc.font.sample et il faut donc le renommer en rc.font pour qu'il soit lancé.
    rc.sysvinit
    Il a été inséré à  partir de la version 7.0 de la Slackware pour palier à  un problème : certains logiciels avaient besoin d'installer des scripts de démarrage nécessaires à  leur fonctionnement et ce dans le mode System V.
    Ce script peut aussi être utilisé en créant des sous-répertoires de niveau de démarrage (rcn.d) et en y installant les scripts que l'on désire ; ceci pour ceux qui aimeraient mieux le System V pour insérer de futurs scripts s'ils sont plus à  l'aise avec ce genre d'initialisation.
    On peut même se servir de scripts pris sur une autre distribution en prenant soin de bien vérifier les chemins des différentes commandes utilisées par ces scripts en fonction de ceux utilisés par le système.
    rc.local
    Il est destiné à  contenir les différentes commandes personnelles à  l'utilisateur qu'il veut initialiser lors du démarrage du système. Ce script est le dernier appelé après que tous les autres aient été lancés.
    Notes

    La plupart de ces scripts peuvent être démarrés avec l'un des trois paramètres start, stop ou restart. Par exemple, pour arrêter un service lancé par un script rc.fonction, il suffit de faire . /etc/rc.d/rc.fonction stop.
    Par ailleurs, si l'on souhaite qu'un script ne soit pas exécuté au démarrage, plusieurs méthodes sont possibles.
    Une première consiste à  le détruire mais ce n'est pas conseillé dans la mesure où vous pouvez en avoir besoin par la suite (et qu'il prend peu de place).
    Une deuxième méthode consiste à  le rendre non exécutable par la commande chmod -x rc.fonction (chmod +x rc.fonction pour le rendre exécutable).
    Une troisième méthode consiste à  en commenter l'entrée dans un des scripts qui le lance (il s'agit souvent de rc.M comme on l'a vu).
    Par exemple, on aura généralement des lignes du type :

    if [ -x /etc/rc.d/rc.fonction ]; then
       /etc/rc.d/rc.fonction
    fi

    Il suffit alors d'ajouter le signe # devant la ligne /etc/rc.d/rc.fonction pour qu'elle soit commentée.
    Cette méthode se révèle très pratique si l'on souhaite utiliser un programe de temps en temps sans qu'il soit lancé systématiquement (par exemple, si l'on utilise mysql périodiquement).En effet, puisqu'il reste exécutable, il suffit de le lancer comme indiqué précédemment.

    L'ouverture d'une session

    Si le système est lancé au niveau 4, un des programmes gdm, kdm ou xdm est lancé par le script rc.4. Le nom de login de l'utilisateur et son mot de passe sont ensuite vérifiés et une session X est ouverte.
    Mais c'est surtout le niveau 3 qui nous intéresse ici.
    Dans ce cas, c'est le programme /sbin/agetty qui est lancé Il appelle ensuite le programme /bin/login qui lance enfin l'interpréteur de commandes Bash. Nous allons entrer un peu dans le détail.

    Le programme agetty

    Il est lancé pour les niveaux d'initialisation 1 à  6 comme indiqué dans le fichier /etc/inittab. Il effectue les opérations suivantes:

    Le programme login

    Les paramètres de connexion sont définis dans le fichier /etc/login.defs. Par exemple, si l'on souhaite que des caractères '*' apparaissent lorsque l'on saisit le mot de passe, il faut décommenter la ligne GETPASS_ASTERISKS 1. Les différents paramètres possibles sont commentés dans ce fichier et il peut être utile de le consulter si l'on souhaite les modifier. On peut également faire man login.defs pour obtenir quelques précisions sur sa rédaction. Le programme login présente les caractéristiques suivantes:

    Le programme Bash

    Comme l'indique la commande man bash, celui-ci, lors d'une connexion, lit le fichier /etc/profile puis, s'ils existent, le premier des trois fichiers du répertoire utilisateur .bash_profile, .bash_login et .profile (il utilise également le fichier .bashrc mais celui-ci n'est lu que s'il ne s'agit pas d'un shell de connexion, par exemple, l'ouverture d'un terminal dans une session X).
    Par défaut, seul le fichier /etc/profile est présent et c'est le plus important car il définit les variables d'environnement. C'est donc son contenu que nous allons en partie décrire.
    Il définit entre autres les variables suivantes :

    Il effectue également les opérations suivantes:

    Conclusion

    Voici donc résumés les principes essentiels de l'initialisation de la Slackware qui vous permettront, nous l'espérons, d'approfondir vos connaissances de cette distribution et de la personnaliser selon vos besoins. Vous pouvez obtenir des informations supplémentaires en parcourant le Net mais la plupart de celles-ci sont probablement présentes sur votre machine, que ce soit avec les pages de manuel ou dans les Howto situés dans le répertoire /usr/doc qui sont trop souvent méconnus.

    Haut


    Imprimer facilement avec cups

    par Abba

    Imprimer n'est plus un supplice avec cups !


    Introduction

    Voici une nouvelle façon d'imprimer sous linux simplement avec cups, gimp-print et ghostscript. Nous disposons avec ceux-ci d'une configuration en mode graphique des plus réussie.

    Note: toutes les installations qui seront décrites ici, le seront depuis les sources. Ce n'est pas forcément la méthode la plus simple. Si cela vous semble complexe, préférez installer les 'paquets' de votre distribution (ghostscript, cups et gimp-print sont présents dans toutes les distributions récentes), de cette façon votre gestionnaire de paquets saura que cups est installé et saura surement le mettre à jour tout seul en cas de problème lié, par exemple, à la sécurité.

    Installer Gimp-Print

    Dans presque toutes les distributions gimp-print est installé par défault. Mais si sur la votre ce n'est pas le cas, voici la marche à suivre pour mener à bien la compilation des sources:

    Récupérez les sources ici.

    Décompressez-les:

    abba@localhost:~$ tar xvzf gimp-print-4.2.5.tar.gz

        ou

    abba@localhost:~$ tar xvjf gimp-print-4.2.5.tar.bz2

    Puis compilez-les:

    abba@localhost:~$ cd gimp-print-4.2.5
    abba@localhost:~$ ./configure && make && su -c "make install"

    Remarque: Vous pouvez aussi faire simplement make install en tant que root.

    Cups va utiliser gimp-print comme driver pour votre imprimante. Mais si celui-ci ne reconnait pas la votre, il va être possible de fournir directement des ppd à cups, nous y reviendrons plus tard.

    Installer ESP Ghostscript

    Cette étape est très importante car j'avais, moi même, Ghostscript installé sur ma slackware lors de l'installation. Mais cups n'a pas voulu marcher et me demandait si j'avais bien installé esp ghostscript. En fait, il faut que Ghostscript soit installé/compilé avec un driver spécial : pstoraster. Ce driver est compilé par défaut avec la version esp ghostscript, mais pas avec la version GNU. Il faut alors, si vous souhaitez utiliser les sources GNU, lire le contenu du répertoire pstoraster des sources de cups et recompiler ghostscript en suivant les 'instructions' de ce répertoire (qui est dans les sources de cups). Le plus simple est d'installer esp ghostscript.

    Remarque: Il est utile pour débugguer le processus de savoir que le fichier qui regroupe toutes les erreurs de cups est: /var/log/cups/errors.log

    Télécharger les sources de esp ghostscript ici.

    Puis compilez-les comme suit :

    abba@localhost:~$ tar xvzf espg-xxx.tar.gz
    abba@localhost:~$ cd espg-xxx
    abba@localhost:~$ ./configure && make && su -c "make install"

    Maintenant vous pouvez installer cups.

    Installer Cups

    Récupérez les sources sur le site de cups : www.cups.org

    Puis, installez les sources:

    abba@localhost:~$ tar xvzf cups-xxx.tar.gz
    abba@localhost:~$ cd cups-xxx
    abba@localhost:~$ ./configure --sysconfdir=/etc && make && su -c "make install"

    Mais voila tout ceci n'est pas fini : cups ne pourra pas encore imprimer une page de texte. En effet, ghostscript ne trouvera pas les polices de caractères (fontes) qui vont lui permettre de le transformer pour le rendre imprimable. Donc nous devons installer ces polices.

    Installer les polices

    Il faut pour cela les télécharger et les copier dans le répertoire où ghostscript va pouvoir les trouver.

    Récupérer les : ici.

    Je conseille de les télécharger toutes (gnu-gs-fonts-std et gnu-gs-fonts-other) même si seules les polices standard (gnu-gs-fonts-std) sont obligatoires.

    Maintenant pour savoir où il faut les copier faites :

    abba@localhost:~$ gs --help | grep fonts

    Ce qui donne une liste de répertoires où installer les polices, choisissez-en un dans la liste fournie sachant que si ce répertoire est dans /home/qqu il ne sera accessible que par qqu. Chez moi, dans liste, il y a : /usr/local/share/ghostscript/fonts. C'est un bon choix. Tout comme : /usr/share/ghostscript/fonts.

    Donc nous allons les copier dedans. Pour cela :

    abba@localhost:~$ su -c "cp gnu-gs-fonts-std-6.0.tar.gz /usr/local/share/ghostscript/"
    abba@localhost:~$ cd /usr/local/share/ghostscript/
    abba@localhost:~$ su -c "tar xvzf gnu-gs-fonts-std-6.0.tar.gz"

    Remarque: Je ne copie pas les archives dans le dossier /usr/local/share/ghostscript/fonts car ce dernier va être créé quand on décompresse les archives.

    Maintenant nous allons pouvoir configurer et tester notre imprimante.

    Activer Cups

    Il nous faut maintenant activer les daemons cups. Lors de l'installation de cups, celui-ci a installé (si vous avez suivi la démarche proposée, mais aussi si vous avez utilisé un paquet de votre distribution) : /etc/init.d/cupsd ou /etc/rc.d/init.d/cupsd. C'est ce script qui va être chargé de démarrer cups. Ici le mode d'activation dépend de votre distribution.

    Mandrake/RedHat

    abba@localhost:~$ su -c "chkconfig --add cupsd && /etc/init.d/cupsd start"

    Debian

    Je ne sais pas ...

    Slackware

    Je ne sais pas ...

    Gentoo

    Si vous avez installez cups via :

    abba@localhost:~$ su -c "emerge cups"

    Il suffit alors de faire :

    abba@localhost:~$ su -c "rc-update add cupsd default && /etc/init.d/cupsd start"

    Sinon, il faut alors modifier le script /etc/init.d/cupsd pour qu'il s'adapte au fonctionnement de gentoo, ce n'est pas trés complexe, mais ce n'est pas le but de cet article.

    Configurer Cups

    Pour cela l'équipe de cups a mis à notre disposition un outil très utile et accessible depuis un navigateur web comme mozilla, konqueror et bien d'autres. Cet outil peut être rendu accessible à une machine distante et/ou à certains utilisateurs. Pour cela vous lirez la documentation de cups Lancez votre navigateur préféreré, et fournissez-lui l'url :

    http://localhost:631

    Remarques:

    Allez à présent dans la partie "Administration" afin de vous identifier. Logguez-vous en root.

    Ensuite, cliquez dans le menu qui se trouve en haut de la fenêtre sur "Printers", si vous êtes revenu à l'accueil vous pouvez aussi cliquer sur "Manage Printers".

    Comme aucune imprimante n'a encore été installée, il va falloir en ajouter une. Cliquez sur "Add Printers".

    Vous devez ensuite renseigner trois champs décrivant votre imprimante. Mais seul le premier ("Name") est important car il va donner le nom de votre imprimante : retenez-le !

    Ensuite, vous aurez à choisir sur quel port est connecté votre imprimante. Pour cela vous avez le choix entre réseau par samba ; ports Parrallèle ; ports usb... Si quand vous avez démarré votre ordinateur, elle était allumée, alors sûrement que sera indiqué le nom de votre imprimante en face du port où elle est connectée.

    Puis vient le choix de la marque de l'imprimante. Si la votre a été détectée au démarage cette étape est quand même obligatoire.

    Ensuite, vient le choix du driver. Je vous conseille de choisir celui qui convient bien à votre modèle ou d'essayer un pilote générique si vous ne trouvez rien d'autre. Et si c'est possible (cas où vous avez compillé gimp-print à la main) vous aurez peut-être le choix de la langue du pilote.

    Une fois ces étapes terminées, votre imprimante apparait dans la section "Printers" ou "Manage Printers", il ne vous reste plus qu'à choisir le format du papier, ... En cliquant sur "Configure Printers".

    Le tour est joué, testez en imprimant une page de test. Votre pinguin imprime !

    Drivers PPD

    Normalement si gimp-print reconnaît votre imprimante un fichier ppd portant le nom que vous lui avez attribué est stocké dans le répertoire /etc/cups/ppd. Ce fichier donne toutes les informations nécessaires à ghostscript pour imprimer sur votre imprimante.

    Si gimp-print n'a pas de drivers pour votre imprimante, il y a un moyen de la faire fonctionner quand même. Allez sur le site www.linuxprinting.org/printer_list.cgi. Sélectionnez la marque et le modèle de votre imprimante. Et faites générer un ppd correspondant, d'une part à votre imprimante, d'autre part au driver que vous comptez utilisez (il y en a en général plusieurs possible). Préférez les drivers gimp-print. Sauf si le site conseille autre chose. Attention, il peut être nécessaire d'installer un programme complémentaire, comme pour les imprimantes HP.

    Puis, stockez le dans /usr/local/share/cups/model (si vous avez installé cups depuis les sources) ou /usr/share/cups/model (si vous avez utilisé un paquet de votre distribution). Enfin recommencez l'installation de votre imprimante en choisissant le driver que vous venez d'installer.

    Outils d'impression

    La plupart des débutants sont repoussés par l'aspect ligne de commande de Linux (Note[Léa]: moi j'aime bien la ligne de commande).

    Aujourd'hui, pour imprimer, il suffit de lancer une impression depuis votre logiciel de traitement de texte ou autre en choisissant comme ligne de commande d'impression :

    lpr -Pnom

    nom est le nom que vous avez donné à votre imprimante et que je vous ai dit de retenir.

    Si vous utilisez KDE, vous pouvez lui dire que vous utilisez cups (voir pour cela kcontrol), puis utiliser comme ligne de commande d'impression (dans tous les logiciels qui utilise habituellement lpr) :

    kprinter

    ou (ça dépend de l'application, la plupart de celles que j'ai testées utilise cette dernière forme) :

    kprinter --stdin

    Si maintenant vous avez besoin d'imprimer à partir d'une console, cups vous le permet à travers les commandes habituelles d'impression qui sont lp et lpr. Cette commande supporte presque tous les types de fichiers.

    Si vous l'avez installé, le programme xpp fournit le même type de service que kprinter. Il s'utilise de manière similaire.

    Administration de CUPS

    cups permet un contrôle assez fin des droits d'impression. Je ne vais pas détailler ici toutes les possibilités. Mais certaines sont bien pratiques. Je vais en décrire certaines.

    Tout ce que je vais dire s'applique au fichier : /etc/cups/cupsd.conf.

    Vous pouvez diriger les 'logs' de cups vers un fichier particulier, il suffit de modifier la variable AccessLog :

    AccessLog /var/log/cups/access_log

    par exemple (c'est la valeur par défaut).

    Vous pouvez vouloir déplacer l'endroit où cups stocke ses données :

    # les pilotes etc... :
    DataDir /usr/share/cups
    # les fichiers en instance d'impression :
    RequestRoot /var/spool/cups

    pour placer les données de cups dans /usr/share/cups.

    Il est possible de fixer la langue par défaut dans laquelle cups s'exprime :

    DefaultLanguage fr

    pour qu'il s'exprime en français par défaut.

    Pour autoriser une autre machine à administrer les imprimantes reliées à celle-ci, il faut que cups écoute les requêtes sur un autre nom que localhost. Par exemple si votre machine s'appelle gandalf.tux vous pouvez ajouter :

    Port localhost:631
    Port gandalf.tux:631

    Cela peut aussi servir à faire écouter le serveur sur un autre port que celui par défaut (631).

    Lorsque vous utiliserez l'interface web pour administrer vos imprimantes, vous verrez que l'url change. Chacune des urls peut être protégée par une série de directives qui ressemble aux directives d'apache. Par exemple, pour limiter l'accès de l'url : gandalf.tux:631/admin à une personne du groupe "lp" connecté depuis ganfalf.tux, frodon.tux ou localhost, il faut ajouter :

    SystemGroup lp
    <Location /admin>
    AuthType Basic
    AuthClass System
    Order Deny,Allow
    Deny From All
    Allow From gandalf.tux
    Allow From frodon.tux
    Allow From 127.0.0.1
    #Encryption Required
    </Location>

    J'arrête là, mais il existe de multiples possibilités, le mieux est encore de lire complètement la documentation de cups.

    Haut


    Installation de samba avec une authentification sur un CPD NT4.0 ou 2000

    IrOnUx

    authentifier les utilisateurs samba au niveau d'un CPD NT


    Mise en garde

    La configuration présentée a été réalisée sur une Redhat 7.3, il ne devrait pas y avoir beaucoup de changement avec les versions plus récentes. Je ne peux par contre pas certifier cette configuration sur d'autres distributions, n'ayant pas fait les tests. Vous devez au préalable avoir lu la doc pour configurer samba en tant que PDC, BDC.

    Le problème

    Il est bien connu que les systèmes Microsoft et Unix ont une façon différente de gérer leur base d'utilisateurs. Une difficulté est alors rencontrée lorsque l'on veut intégrer un serveur Samba dans un réseau de machines NT. En théorie il faudrait créer sur le serveur samba les comptes systèmes correspondant aux comptes du domaine mais aussi les comptes Samba. Pourquoi ne pas simplifier la tâche en faisant en sorte de n'administrer qu'une seule base de compte.

    Pour cela, on utilise winbind. Winbind est un système client-serveur qui permet entre autre d'introduire facilement des serveurs Samba dans un domaine où se trouvent déjà des CPD (CPD ou PDC : contrôleur primaire de domaine) NT. Comment ? Il se charge en fait de récupérer la base des utilisateurs sur le CPD NT et procède à une authentification de celui-ci.

    Installer Samba

    La première étape consiste, d'abord, à installer Samba. Si vous avez une version de Samba déjà installée alors désinstallez-là, car nous avons besoin de fonctionnalités qui ne se trouvent pas dans les versions livrées avec la plupart des distributions.

    Sur une distribution à base de RPM (RedHat, Mandrake ou SuSE), pour voir si une version de samba est installée, tapez la commande : # rpm -q samba. S'il existe déjà une version de Samba sur votre système alors supprimez-là avec la commande # rpm -e samba.

    Une fois que vous avez bien désinstallé Samba, il va falloir récupérer les sources de la dernière version. La version utilisée ici est 2.2.8.

    Tout d'abord, décompressez l'archive dans un répertoire. On va maintenant installer Samba:

    cd samba-2.2.8a
    # cd sources
    # ./configure --enable-cups --with-smbwrapper --with-dce-dfs --with-smbmount --with-pam --with-pam_smbpass --with-syslog --with-quotas --with-libsmbclient --with-acl-support --with-winbind --with-winbind-auth-challenge

    Pour savoir ce que signifient ces options, vous pouvez taper la commande ./configure --help, cette commande vous retournera une liste des différentes options possibles avec une description.

    Si la commande ./configure ..... retourne une erreur, tentez d'analyser ce qui est dit pour trouver l'erreur. Si vous n'avez pas d'erreurs ce qui est probablement le cas, vous pouvez compiler et installer Samba. Pour ce faire :

    # make
    # make install
    # make installbin
    # make installman

    Voilà, samba est normalement bien installé. Les fichiers se trouvent dans /usr/local/samba. Il va falloir maintenant créer un script d'initialisation pour les trois démons smbd, nmbd et winbindd. Vous trouverez un script en annexe qui fonctionne très bien sur Redhat, inspirez-vous en sur les autres distributions. Vérifier notamment que les chemins (path) sont corrects par rapport à votre configuration.

    Le script en question.

    Sur une RedHat ou Mandrake, copiez le script dans /etc/init.d, rendez-le exécutable : chmod +x /etc/init.d/smb, puis activez les services samba au démarrage : chkconfig --add smb. Enfin, démarrez pour cette session : /etc/init.d/smb start.

    Configurer samba

    Avant de lancer samba il va falloir éditer le fichier de configuration et les autres fichiers nécessaires au bon fonctionnement de la paire samba/winbind. Je vous présente, à titre indicatif au niveau des partages, mon smb.conf. A noter que ce fichier doit se trouver dans le répertoire /usr/local/samba/lib.

    [global]

    #Chaîne de description du serveur samba
    server string = SambaBSD-2.2.8

    #Définit le nom netbios principale du serveur samba
    netbios name = SambaBSD

    # Définit le groupe netbios de machines auquel
    # le serveur appartient ici le nom du domaine.
    workgroup = sztitechinf

    # Nom et emplacement du fichier journal de samba. Les variables
    # standards de samba peuvent être utilisées.
    log file = /var/log/samba/%m.log

    # Taille maximale des fichiers log.
    max log size = 100

    # Samba fait parité d'un domaine windows
    security = domain
     
    # Cette option sert à indiquer le CPD ici le caractère de
    # substitution * ordonne à samba de rechercher le CPD lui-meme.
    password server = *

    # Comme son nom l'indique cette option sert à crypter les mots de
    # passe, il faudra au préalable appliquer un patch sur les stations
    # NT ce patch peut être trouvé dans le répertoire doc de samba il sert
    # à activer les plaintextpassword sous NT
    encrypt passwords = yes

    # Chemin du fichier de mot de passe de samba
    smb passwd file = /usr/local/samba/bin/smbpasswd

    # les lignes suivantes sont utiles pour pouvoir changer le mot de passe
    # et ajouter des utilisateurs à partir de serveurs windows.A utiliser avec
    # "encrypt passwd" et "smb passwd file"
    unix password sync = yes
    passwd program = /usr/bin/passwd
    passwd chat = *New*password* %n\n *Retype*new*password* %n\n *passwd:*all*authentification*tokens*updated*successfully*
    add user script = /usr/sbin/useradd %u -g smbusers
    delete user script = /usr/sbin/userdel %u
    allow trusted domains = yes

    # Support de l'ACL Microsoft
    nt acl support = yes

    # Séparateur winbind. Avec + les utilisateurs auront la forme
    # domaine+nom_d'utilisateur.
    # les séparateurs peuvent etre + ou /. Toutes les options qui
    # suivent sont indispensables pour le bon fonctionnement de
    # winbind
    winbind separator = +
    winbind cache time = 10
    template shell = /bin/bash
    template homedir = /home/%D/%U
    winbind uid = 10000-20000
    winbind gid = 10000-20000

    socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192

    #Si egale à yes, samba tentera de devenir explorateur principal
    #du sous-réseau local.
    local master = no

    # Fixe le niveau de l'os de samba lors de l'élection de
    # l'explorateur local principal.
    os level = 33

    #Si égale à yes,samba tentera alors de devenir explorateur
    # principal de domaine du groupe de travail.
    domain master = no

    # Samba utilisera le bit de l'explorateur principal favori pour devenir
    # explorateur local principale si cette valeur est égale à yes.
    preferred master = no

    # Ici on indique le serveur wins du réseau.
    wins server = 10.35.36.250

    # égale a yes, samba conservera la casse fourni par le client
    # sans convertir par la classe par defaut.
    preserve case = yes
    # Si egale à yes, samba distinguera les majuscules des
    # minuscules lors de l'utilisation des fichiers.
    case sensitive = no

    # Ce premier partage va servir à créer un répertoire personnel
    # pour l'utilisateur du domaine qui viendra se connecter.
    [homes]
    comment = Home Directory
    browseable = no
    writable = yes
    valid users = %S
    create mode = 0664
    directory mode = 0775

    [public]
    path = /partage/public
    public = yes
    only guest = yes
    writable = yes
    printable = no

    Le fichier nsswitch.conf

    Nous avons donc maintenant un fichier smb.conf opérationnel, il ne nous reste plus qu'à nous tourner vers winbind car nous avons terminé la partie dédiée purement à samba. Pour que winbind fonctionne correctement avec samba il va falloir éditer quelques fichiers.

    Tout d'abord éditez le fichier /etc/nsswitch.conf, dans ce fichier vous allez devoir ajouter winbind à la ligne groupe et user :

    passwd: files nisplus winbind
    shadow: files nisplus
    group: files nisplus winbind

    Vérifiez ensuite que vous disposez bien des librairies nécessaires /lib/libnss_winbind.so et /lib/libnss_windbind.so.2, ces librairies se trouvent, si elles ne sont pas installées, dans les sources de samba. Si la librairie libnss_winbind.so.2 n'existe pas mais que l'autre est présente alors exécutez la commande suivante: # ln -s /lib/nss_winbind.so /lib/libnss_winbind.so.2.

    Configurer pam.d

    Maintenant la dernière étape.Il va falloir éditer quelques fichiersoups se trouvant dans le répertoire /etc/pam.d. Ce sont ces fichiers qui définissent la sécurité des authentifications. Je vous montre ci-après les trois fichiers qu'il faut modifier afin que samba utilise le CPD pour authentifier et afin que l'on puisse se logguer sur une Linux box avec un compte NT.

    Le fichier /etc/pam.d/samba

    #%PAM-1.0
    #auth required pam_nologin.so
    #auth required pam_stack.so service=system-auth
    auth required /lib/security/pam_winbind.so
    auth required /lib/security/pam_pwdb.so nullok shadow
    account required /lib/security/pam_winbind.so
    account required /lib/security/pam_pwdb.so
    #account required pam_stack.so service=system-auth
    session required pam_stack.so service=system-auth
    password required pam_stack.so service=system-auth

    Le fichier /etc/pam.d/auth-config

    #%PAM-1.0
    #auth sufficient /lib/security/pam_rootok.so
    #auth required /lib/security/pam_stack.so service=system-auth
    #account required /lib/security/pam_permit.so
    #session optional /lib/security/pam_xauth.so
    #session required /lib/security/pam_permit.so
    auth required /lib/security/pam_securetty.so
    auth required /lib/security/pam_nologin.so
    auth sufficient /lib/security/pam_winbind.so
    auth required /lib/security/pam_pwdb.so use_first_pass shadow nullok
    account required /lib/security/pam_winbind.so

    Et enfin le fichier /etc/pam.d/login

    #%PAM-1.0
    auth required /lib/security/pam_securetty.so
    auth sufficient /lib/security/pam_winbind.so
    auth sufficient /lib/security/pam_unix.so use_first_pass
    auth required /lib/security/pam_stack.so service=system-auth
    auth required /lib/security/pam_nologin.so
    account sufficient /lib/security/pam_stack.so service=system-auth
    account sufficient /lib/security/pam_winbind.so
    password required /lib/security/pam_stack.so service=system-auth

    Vous pouvez éditer d'autres fichier pam.d afin que les applications voulues utilisent winbind pour s'authentifier.

    Adjoindre le serveur au domaine

    Il nous faut maintenant joindre notre serveur samba au domaine, vous devez pour cela taper la commande:

    # /usr/local/samba/bin/smbpasswd -j nom_du_domaine -r nom_cpd -U administrateur%motdepasse

    administrateur%motdepasse étant un compte autorisé à joindre des machines au domaine. Après avoir tapé cette commande cela devrait vous retourner quelque chose comme: Domain toto joined.

    Test

    Voila nous allons maintenant lancer samba avec le script donné en annexe. Editez ce script, vérifiez si les chemins correspondent avec votre configuration. Coller ce script dans le répertoire /etc/rc.d/init.d et rendez-le exécutable.

    Pour démarrer samba, exécutez tout simplement la commande :

    #service smb start

    ou alors :

    #/etc/init.d/smb start

    Si vous n'utilisez pas une distribution "RedHat" ou "Mandrake", adaptez le script fourni, ainsi que la procédure de lancement

    Vous devriez voir les trois démons nmbd, smbd et winbindd, se lancer. Pour vérifier s'ils sont bien lancés, vous pouvez taper la commande :

    # ps -ae | grep -E "(smbd|nmbd|winbindd)"

    Si la commande vous retourne 3 lignes, c'est que les 3 démons sont bien lancés.

    Le premier test que l'on peut faire consiste à taper la commande :

    #wbinfo -u 

    Cette commande devrait nous retourner les différents utilisateurs sur le CPD.

    Vérifiez que l'authentification se fait bien en tapant la commande :

    #wbinfo -a utilisateur%motdepasse

    Si tout cela fonctionne bien, vérifiez avec les commandes :

    # getent passwd
    # getent group

    que winbind arrive bien à récupérer les noms d'utilisateurs sur le CPD NT.

    Vous pouvez normalement maintenant accéder au serveur samba en utilisant vos logins NT et sans avoir besoin d'administrer deux bases de comptes.

    Haut


    Utiliser GRUB sur disquette pour booter via le réseau

    Par Antoine

    Récupérer/compiler GRUB

    Il faut télécharger la dernière release de GRUB à l'adresse suivante : ftp ://alpha.gnu.org/gnu/grub/

    Ensuite le détarrer et le décompresser, puis aller dans le répertoire :

    tar xvfz grub-0.95.tar.gz

    Maintenant il s'agit de le compiler avec le support de votre carte réseau. GRUB supporte un bon nombre de cartes, mais il est déconseillé de le compiler avec toutes les cartes réseaux. Voici la liste des cartes réseaux disponibles :

    3c509 3c529 3c595 3c90x cs89x0 davicom depca eepro epic100 3c507 exos205 ni5210 lance ne2100 ni6510 natsemi ni5010 3c503 ne ns8390 wd otulip rtl 8139 sis900 sk-g16 smc9000 tiara tulip via-rhine w89c840 3c503-shmem 3c503-aui compex-rl2000-fix eepro100

    ./configure --enable-votre_carte_réseau --enable-diskless --prefix=/usr

    Dans le répertoire où vous avez compilé GRUB :

    Nous considérons maintenant que nous sommes dans le répertoire où nous avons compilé GRUB.

    Création de la floppy de boot

    Vérifier que la disquette n'est pas montée avant de la formater :

    /bin/umount /mnt/floppy
    /sbin/mkfs.ext2 /dev/fd0

    Ensuite monter la disquette :

    /bin/mount /dev/fd0 /mnt/floppy

    Il faut créer les répertoires pour GRUB :

    mkdir -p /mnt/floppy/boot/grub

    et copier les fichiers stage1 et stage2 de GRUB sur la disquette :

    cp -v stage1/stage1 /mnt/floppy/boot/grub/
    cp -v stage2/stage2 /mnt/floppy/boot/grub/

    Maintenant il faut rendre la disquette bootable avec GRUB :

    grub/grub
        GNU GRUB  version 0.95  (640K lower / 3072K upper memory)
    
     [ Minimal BASH-like line editing is supported.  For the first word, TAB
       lists possible command completions.  Anywhere else TAB lists the possible
       completions of a device/filename. ]
    
    grub> root (fd0)
     Filesystem type is ext2fs, using whole disk
    
    grub> setup (fd0)
     Checking if "/boot/grub/stage1" exists... yes
     Checking if "/boot/grub/stage2" exists... yes
     Checking if "/boot/grub/e2fs_stage1_5" exists... no
     Running "install /boot/grub/stage1 (fd0) /boot/grub/stage2 p /boot/grub/menu.lst "... succeeded
    Done.
    
    grub> quit

    On va générer le fichier par défaut /mnt/floppy/boot/grub/menu.lst de la disquette, qui va indique de récupérer une adresse réseau, et de récupérer le fichier menu.lst sur notre serveur TFTP. Ce fichier doit contenir :

    default=0
    timeout=5
    title linux
            bootp
            configfile (nd)/menu.lst

    Côté serveur

    Il faut un serveur DHCP, et un serveur TFTP. Je ne vais pas m'attarder sur la configuration de ces services, mais juste vous fournir des fichiers de configuration TFTP et DHCP qui fonctionnent.

    Serveur dhcpd

    L'option next-server ip_adresse du fichier /etc/dhcpd.conf correspond à l'adresse de notre serveur TFTP. Voici un exemple très simple de configuration DHCP. Pour plus d'information, faites une recherche sur Internet.

    ddns-update-style none;
    allow booting;
    allow bootp;
    authoritative;
    
    subnet 10.0.1.0 netmask 255.255.255.0 {
      option subnet-mask 255.255.255.0;
      option routers 10.0.1.10;
      default-lease-time 288000;
      max-lease-time 864000;
      option domain-name "guibland.com";
      option domain-name-servers 10.0.1.33;
      next-server 10.0.1.33;
      pool { 
      range 10.0.1.81 10.0.1.91;
     }
    }

    Descriptions des options utilisées :

    Serveur TFTP

    Il est en général configuré pour fonctionner via le serveur xinetd. Voici le contenu du fichier /etc/xinetd.d/tftp

    # default : off
    # description : The tftp server serves files using the trivial file transfer \
    #       protocol.  The tftp protocol is often used to boot diskless \
    #       workstations, download configuration files to network-aware printers, \
    #       and to start the installation process for some operating systems.
    service tftp
    {
            disable = no
            socket_type             = dgram
            protocol                = udp
            wait                    = yes
            user                    = root
            server                  = /usr/sbin/in.tftpd
            server_args = -s /var/lib/tftpboot
            per_source              = 11
            cps                             = 100 2
            flags                   = IPv4
    }

    Descriptions des options utilisées :

    Url diverses

    Voici quelques Url sur le sujet :

    Haut


    Fin du chapitre