LéaBook, 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.
at
anacron
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.
par Jean-Christophe, Marc et Anne
Le shell, un environnement écrit au temps ou les hommes étaient des hommes :-)
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 ?
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é :)
Répertoires spéciaux :
.
représente le répertoire courant,
..
représente le répertoire parent
~
représente le répertoire
maison (home) de l'utilisateur
Fichiers cachés :
sous Unix, les fichiers cachés commencent par un point. Par exemple, ~/.bashrc est un fichier caché, dans le répertoire maison de l'utilisateur, qui contient la configuration de son shell.
Jokers : ? et *
Les caractères ?
et *
dans les noms de
fichiers et de répertoires permettent de représenter des caractères
quelconques. '?
' représente un seul caractère, tandis que
'*
' en représente un nombre quelconque.
Par exemple "*.jpg
" représente tous les fichiers se
terminant par jpg
; "*toto*
" tous les fichiers
contenant "toto
". Oui vous avez bien vu : on peut mettre
plusieurs étoiles en même temps !!! Vous pouvez même faire : cd
/et*/rc.*/init*
, cela risque de fonctionner !!!
Il faut également savoir que c'est le shell qui interprète ces
caractères avant de transmettre la ligne de commande. Par exemple,
si vous tapez : rm -Rf *.tmp
, le shell transformera cette
ligne de commande en : rm truc1.tmp truc2.tmp
truc3.tmp
.
Jokers avancés : []
Vous pouvez aussi utiliser les crochets pour spécifier des caractères :
[a]
signifie : égal à 'a'. Exemple : rm *[a]*
efface tous les fichiers contenant la lettre 'a'.
[!a]
signifie : différent de 'a'. Exemple : rm
*[!a]*
efface tous les fichiers, sauf ceux contenant la lettre
'a'.
[abc]
signifie : l'un des caractères a, b ou c. Exemple
: rm [abc]*.tmp
efface tous les fichiers commençant par a,
b ou c.
[a-l]
: signifie : tous les caractères compris entre a
et l. Exemple : rm fic_[a-l]*
efface tous les fichiers
commençant par fic_
suivi d'une quelconque lettre entre a
et l.
Bon c'est pas tout ça, voici les commandes de base sous Linux :
Commandes linux |
équivalent MsDos |
à quoi ça sert |
Exemples : |
|
|
change le répertoire courant. |
|
|
|
affiche le contenu d'un répertoire |
|
|
|
copie un ou plusieurs fichiers |
|
|
|
efface un ou plusieurs fichiers |
|
|
|
efface un répertoire et son contenu |
|
|
|
crée un répertoire |
|
|
|
efface un répertoire s'il est vide |
|
|
|
déplace ou renomme un ou des fichiers |
|
|
|
trouve un fichier répondant à certains critères |
|
|
|
trouve un fichier d'après son nom |
|
|
|
affiche l'aide concernant une commande particulière |
|
|
pas
|
modifie les permissions d'un fichier |
|
|
pas
|
modifie le propriétaire d'un fichier |
|
|
pas
|
modifie le groupe proprétaire d'un fichier |
|
|
pas
|
crée un lien vers un fichier |
|
|
pas
|
recherche une chaine dans un fichier (en fait recherche une expression régulière dans plusieurs fichiers) |
|
|
pas
|
trouve le répertoire dans lequel se trouve une commande |
|
|
|
affiche un fichier à l'écran |
|
Remarque :
Pour en savoir plus sur toutes ces commandes, je vous conseille de
consulter leur page de man !
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.
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.
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).
utilisateur à qui appartient le fichier (jice)
groupe auquel le fichier appartient (users)
taille en octets
date et heure de modification
nom du fichier/répertoire.
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.
Quelle commande utiliser pour faire ... ceci ou cela ? |
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 ? |
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 ? |
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. |
|
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 ? |
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 ? |
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 ? |
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 ? |
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. |
Quel est le système ? |
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 ? |
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 ? |
Notes : la touche <Q> permet de quitter la commande top. |
Quelles sont et que signifient les 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 ? |
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 ? |
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 ? |
|
Y a-t-il un pingouin dans le système ? |
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 ? |
Quel est le répertoire courant ? |
|
Quelle est la taille de ce répertoire ? |
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 ? |
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. |
Tab
Taper une fois la touche [Tab] permet de compléter automatiquement un nom de fichier/répertoire s'il est unique :
[user@localhost user]$ cd
/et[Tab]
[user@localhost user]$ cd /etc_
Tab Tab
Si lors du premier appui sur [Tab], le nom n'a pas été complété, un deuxième appui vous donne la liste de toues les possibilités :
[user@localhost user]$ cd
/usr/doc/H[Tab][Tab]
HTML HOWTO
[user@localhost user]$ cd
/usr/doc/H_
Flèche vers le haut (ou Ctrl-P) / bas (ou Ctrl-N)
La flèche vers le haut permet de remonter dans l'historique des
commandes, la flèche vers le bas permet de revenir. Vous pouvez
aussi utiliser la commande fc
, consultez man
fc
.
Shift - flèche vers le haut/bas
Permet de scroller le contenu du terminal texte vers le haut ou le bas, d'une ligne. En effet, les lignes qui ont défilé vers le haut restent en mémoire et restent accessibles. Terrible, non ?
Shift - Page up/down
La même chose, mais page par page.
Ctrl-C
Arrête le processus en cours, celui qui a été lancé par la dernière commande.
Ctrl-Z
Stoppe le processus en cours, celui qui a été lancé par la
dernière commande, mais ne le détruit pas : il reste en attente.
Pour le mettre en tâche de fond (il continue à s'exécuter, mais
vous pouvez continuer à taper des commandes), tapez
bg
. Pour le faire revenir en avant, taper
fg
.
Ctrl-D
Ferme le terminal en cours (similaire à exit
ou
logout
).
et aussi...
Ctrl-Alt-Fn
Se place sur la console virtuelle numéro n. Par défaut, il y a en général 6 consoles texte virtuelles, de F1 à F6, et X Window se lance dans la septième (F7).
Ctrl-Alt-Backspace
Cela permet de tuer X et de revenir soit à la bannière de login
soit au shell qui a lancé X par startx
. A éviter si
possible : il est plus sain de quitter X en se déconnectant
proprement.
Ctrl-Alt-Del
Suivant votre configuration, ces touches à l'action bien connue
vous permettrons de rebooter votre ordinateur (synonyme de
reboot
ou shutdown -r now
). Si vous souhaitez
juste arrêter votre ordinateur afin de l'éteindre, tapez
halt
, ou shutdown -h now
.
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.
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
<
.
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).
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 :-)
[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
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
.
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.
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
.
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.
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.
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 :
substition de variables : le shell remplace les variables par leurs valeurs
substitution de commandes : le shell remplace une variable par son contenu qui est le résultat d'une commande
interprétation des pipes et des redirections
expansion des noms de fichiers : interprétation des caractères spéciaux pour compléter un nom de fichier et/ou de répertoire
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.
Pour choisir de faire interpréter les caractères spéciaux par le shell ou la commande, il existe 3 possibilités :
utilisation des doubles quotes (ou guillemets en bon français) : lorsque la chaîne de caractères est écrite entre guillemets, tous les caractères spéciaux perdent leur signification sauf : $ \ et `` (simples quotes).
exemple :
[user@localhost user]$ echo *
bidule fic1 fic2 truc
* est un caractère spécial non protégé. Au premier passage du shell, il est donc interprété. Il signifie alors l'ensemble des fichiers du répertoire courant
[user@localhost user]$ echo "*"
*
* est protégé par les guillemets. Il n'est donc pas interprété par le shell comme caractère spécial et devient un caractère pour la commande echo. Dans le cadre de cette commande, * n'a aucune signification particulière, il est donc affiché à l'écran tel que.
utilisation des simples quotes : lorsque la chaîne de caractères est écrite entre simples quotes, tous les caractères spéciaux sans exception perdent leur signification pour le shell. Ils seront donc éventuellement interprété par la commande passée.
exemple : recherche des lignes d'un script utilisant la variable PATH
[user@localhost user]$ grep $PATH
/home/user/script
[user@localhost user]$
Au premier passage, le shell interprète le $ comme
introduisant une variable. Il remplace donc la variable par son
contenu puis exécute la commande grep
. Il ne trouve donc
aucune ligne comportant les chemins référencés dans PATH.
[user@localhost user]$ grep '$PATH'
/home/user/script
echo $PATH
[user@localhost user]$
Le shell n'interprète pas le $ lors du premier passage car sa signification est annulée par les simples quotes. le $ est donc traité par la commande grep. Comme il n'a pas de signification particulière, il est interprété comme un caractère quelconque.
annulation d'un caractère spécial avec \ : pour empêcher le shell d'interpréter un caractère spécial, il suffit de positionner un anti-slash devant le caractère spécial donné.
exemple : pour reprendre l'exemple précédent on aurait pu écrire aussi :
[user@localhost user]$ grep \$PATH
/home/user/script
echo $PATH
[user@localhost user]$
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 |
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
des commandes internes au shell : elles sont exécutées dans le même shell. si elles sont lancées à partir du shell père, il n'y aura pas création de shell fils
des programmes binaires exécutables
des fichiers de commande (shell-scripts)
des alias
des fonctions
La difficulté c'est que le shell interprète une commande en suivant un ordre très précis :
le chemin de la commande comporte un /, il exécute donc la commande située dans ce chemin, il n'y a pas d'ambiguïté possible.
le chemin de la commande ne comporte pas de /,
il cherche la commande en suivant les étapes suivantes :
consultation de la liste des alias
consultations des fonctions chargées
consultations des commandes internes du shell
consultation de la variable PATH
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 :
type nom_de_commande
: permet de
déterminer le type d'une commande (alias, fonction, commande
interne...)
which nom_de_commande
: recherche le
chemin de la commande dans PATH
exemples :
[user@localhost user]$ type ls
ls est un alias suivi pour /usr/bin/ls
[user@localhost user]$ type cd
cd est une commande prédéfinie du shell
[user@localhost user]$ which pwd
/usr/bin/pwd
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 :
par Jean-Christophe
Dis Papa, c'est quoi rwxr-xr-x
?
Tais-toi et nage !
Dans ce chapitre, nous allons étudier les permissions sur les fichiers. Nous allons voir rapidement sur quoi la gestion des permissions se base.
Les fichiers appartiennent à un utilisateur à l'intérieur d'un groupe d'utilisateurs.
L'utilisateur, c'est vous ! C'est un identifiant avec
un mot de passe, qui sont définis dans le fichier
/etc/passwd
. On peut ajouter des utilisateurs à l'aide de
la commande useradd
ou adduser
(voir man
adduser
). Certaines distributions fournissent des outils
graphiques pour ce faire, comme drakuser
de Mandrake.
Le groupe d'utilisateurs, défini dans le fichier
/etc/group
, permet de regrouper des utilisateurs
dans des groupes (un même utilisateur peut faire partie de
plusieurs groupes) afin par exemple de partager des permissions
entre plusieurs utilisateurs. Par exemple, le groupe
quakeusers
peut être défini afin d'y placer les
utilisateurs qui auront le droit d'utiliser le jeu Quake : on
donnera par exemple la permission aux membres de ce groupe de
lancer l'exécutable de ce jeu. De même, le groupe cdrecording
aura les droits d'utiliser le graveur de CD.
Les droits que l'on peut attribuer à un fichier concernent :
la lecture (r
comme read),
l'écriture (w
comme write),
l'exécution (x
comme execute).
On peut attribuer ces droits pour :
un utilisateur,
les membres d'un groupe,
le monde entier (i.e. les autres utilisateurs).
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, à :
l'utilisateur auquel appartient le fichier,
le groupe d'utilisateurs auquel est rattaché le fichier,
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 '---').
chmod
Il existe deux façon de changer les droits d'un fichier ou répertoire.
Soit en précisant les droits en octal (base 8). La correspondance est la suivante :
Donc, pour préciser les droits en exécution et lecture, le chiffre octal est : 1 + 4 = 5. Pour préciser les droits en éxécution, écriture et lecture, le chiffre octal est : 1 + 2 + 4 = 7.
Ensuite, il faut savoir que le chiffre des unités (en octal) correspond 'au reste du monde' que le chiffre des 'huitaines' (deuxième chiffre en octal) correspond 'au groupe' et que le chiffre des 'soixante-quatraines' (troisième chiffre en octal) correspond 'à l'utilisateur'. Ainsi, si on veut que l'utilisateur ait les 3 droits (rwx), que le groupe ai les 2 droits (r-x) et que le reste du monde n'ai aucun droit (---), le nombre octal est : 750 (7 = 1 + 2 + 4 ; 5 = 1 + 4 ; 0 = 0). Pour donner ces droits à un fichier on tape alors :
[username@localhost ~] $ chmod 0750 /chemin/vers/fichier
Le premier 0 dans 0750 signifie qu'on donne le nombre en octal (sinon la correspondance en base 10 ou autre est complexe à déterminer).
Soit en précisant les droits qu'on ajoute (+) ou soustrait (-) au fichier (ou
répertoire). Pour ajouter des droits à l'utilisateur, on ajoute un droit (r,w, x ou toute
combinaison des 3) à 'u'. Par exemple : u+rw
signifie qu'on ajoute
les droit de lecteur et d'écriture à l'utilisateur. Pour le groupe, on ajoute ou
soustrait à 'g' et pour le reste du monde on ajoute ou soustrait à 'o' (other).
Par exemple pour ajouter les droits de lecture et d'écriture à l'utilisateur on tapera :
[username@localhost ~] $ chmod u+rw /chemin/vers/fichier
Et :
[username@localhost ~] $ chmod go-rwx /chemin/vers/fichier
Pour retirer tous les droits (rwx) au groupe (g) et aux autres (a).
Remarque : à la place de u, g et o on peut utiliser 'a' (all) qui veut dire qu'on change les droits de tout le monde (utilisateur, groupe et reste du monde).
Il faut savoir que la commande peut s'appliquer de manière récursive (c'est bien pratique pour les répertoires), en lui passant l'argument '-R' et qu'à la place du droit 'x', on peut présiser 'X' (majuscule) ce qui signifie que parmi les fichiers et répertoires dont on modifiera les droits d'exécution, seuls les répertoires sont concernés. Ainsi :
[username@localhost ~] $ chmod -R u+rwX /chemin/vers/repertoire
rendra tous les fichiers contenus dans ce répertoire (ainsi que dans tous les sous-répertoires de celui-ci) lisibles et écrivables et que tous les sous-répertoires (et leurs sous-répertoires) seront 'navigables' (le droit d'exécution pour un répertoire autorise à se rendre dans le dit répertoire).
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).
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.
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).
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.
par Fred
Comment exécuter une commande avec les droits de root sans utiliser le suid-bit.
Supposons que vous souhaitiez lancer la commande /sbin/halt
,
dans ce cas vous avez plusieurs possibilités :
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
où 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)
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).
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.
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.
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 à :
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.
/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
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. ;-)
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.
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
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
[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 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.
#!/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
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.
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.
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.
par Fred
Entrez dans le monde fantastique des détails de configuration du premier programme chargé par votre PC.
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.
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.
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
[root@xwing home]#
lilo
Added windows *
Added 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)
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)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).
image=/boot/vmlinuz-2.2.14
label=linux
root=/dev/hda2
read-only
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
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.
default=<label>
ou <label> est le label d'une section image ou other que vous souhaitez booter par défaut.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=extended
ou :vga=ext
pour utilisez le mode 80x50,vga=ask
pour que LILO vous demande au démarage de choisir la résolutionvga=<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=<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=<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.[root@xwing home]#
chown root:root /etc/lilo.conf
[root@xwing home]# chmod 600
/etc/lilo.conf
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.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.boot: linux2214 ram=128
et voilà, ce n'est pas la mer à boire.boot: linux2214 3
append="3"
pour forcer cette image à démarrer en mode texte plutot qu'en mode graphique.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
keytable /boot/fr-latin1.ktl
lilo -R windowset 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 ;).
reboot
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.
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.
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é.Il y en a beaucoup d'autres (chacune remplissant une fonctionnalité particulière).
muLinux : une autre distribution Linux minimale tenant sur une disquette.
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 :
/dev/hda1
: un premier linux, on va dire une
Mandrake, monté sur la Mandrake sur /, et sur la Gentoo sur
/mnt/mdk.
/dev/hda2
: un second linux, on va dire une Gentoo,
monté sur la Gentoo sur /, et sur la Mandrake sur /mnt/gentoo.
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.
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à.
#!/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") ;
}
$border{$4 Lilo demarrera
la configuration\
$default$iftimeout{, dans $timeout
secondes}. }
Vous pouvez choisir l'une des configurations suivantes :
- $configs
Votre choix de
+-------------------------------------------------------------+
| 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.
par fraazz
Visitez la nébuleuse du Crabe
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.
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.
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
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
GRUB peut démarrer tout OS supportant le multiboot (inclus *BSD). Comment ?
grub> root (hd0,0)
grub> kernel file
grub> module file
grub> boot
Des paramètres peuvent être passés au noyau, à ajouter après la commande kernel.
GRUB peut démarrer tout OS dont le noyau n'est pas supporté (ex. MS Windows 95) par chaà®nage. Comment ?
grub> rootnoverify (hd0,0)
grub> makeactive
grub> chainloader +1
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)
Si plusieurs systèmes MS Windows sont utilisés sur le même disque, vous devrez utiliser les commandes hide et unhide.
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
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.
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.
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 !
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é !
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
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
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=...).C:\> linux [Entrée]
Nous allons voir ci-dessous une autre méthode qui offrira un menu de boot plus convivial.
[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.
...
...
@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.
par Fred
Utiliser le système d'impression de Linux pour offrir une prévisualisation à toutes vos applications
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.
# 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).
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.
#!/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
#
# 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
#
# 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.
lpr -Pimprimante
oulpr
parlpr -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.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.
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 :
client --> imprimante PDF --> script printpdf-->
Répertoire public
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*
#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
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.
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.
par Fred
Partagez les secrets de /etc/fstab pour le montages
des partitions Linux, VFAT, etc.
Utilisez Supermount pour vos disques amovibles.
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.
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
Où /pointdemontage
est le point de montage du système de fichiers que vous venez de modifier.
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 :
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".
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).
Moi, j'utilise la répartition suivante :
Les dernières évolutions du noyau de Linux utilisent encore plus ces pseudo-système de fichiers. On trouve donc :
proc
monté sur /proc
: interface de communication directe avec le noyaudevpts
monté sur /dev/pts
: pour l'allocation à la demande des terminauxdevfs
monté sur /dev
: pour l'allocation à la demande des fichiers spéciaux gérant les périphériquesusbfs
monté sur /proc/bus/usb
: interface de communication avec le sous-système USBsysfs
monté sur /sys
: une nouvelle interface de communication avec le noyau, il devra contenir à terme toutes les informations de /proc qui ne sont pas liées aux processus et remplacer devfstmpfs
monté sur /dev/shm
et/ou sur /tmp
: un espace de stockage en RAM. Comme la RAM est plus rapide que les DD, cet espace de stockage peut servir pour les petits fichiers temporaires auxquels on accède souvent. Comme c'est en RAM, après un reboot ces fichiers ont disparus.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/nouserIl 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)
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 fichiersvfat
ouNTFS
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) ouiso8859-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 partitionvfat
ouNTFS
, essayer d'ajouter l'option :iocharset=iso8859-1
ouiocharset=iso8859-15
codepage
Ce paramètre sert à indiquer à Linux que le système de fichiersvfat
ouNTFS
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
.
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.
<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.
<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.
[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
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 ;-)
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 ;-)
par Philippe (superjoker@club-internet.fr), complété par Anne, Fred et Jice
Comment ajouter et supprimer des services (daemons, etc.) au démarrage.
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 :
/etc/inittab
, où le runlevel par défaut est défini,init <runlevel>
qui permet
de changer de runlevel en cours de fonctionnement.Remarque : Le fonctionnement des services sur une gentoo, bien qu'assez similaire, est différent.
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
.
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.
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 ;-)
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
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.
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é :
description
: décrire le service en quelques mots. Si
votre description utilise plus d'une ligne, utiliser un "\" pour
respecter la continuité.chkconfig
: cette ligne contient 3 informations. Ici
345
indique les runlevels auxquels sera démarré le
service, 99
indique le numéro de séquence des liens S,
0
indique le numéro de séquence des liens K.#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
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
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 :
use cups
: si le service cups
doit être démarré
lui aussi, alors notre service est capable de l'utiliser, mais pour cela il
faut que cups
soit démaré avant le notre.need net my-firewall
: ces deux services (net
et
my-firewall
) sont nécessaires à notre service et ils doivent
absolument être démarrés avant le nôtre.provide monbeauservice
: notre service à un nom différent de
celui du script (qu'on appellera par exemple, /etc/init.d/monservice
).
Ceci n'est nécessaire que si notre service peut être utilisé par un autre.
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 :
ebegin
qui affiche un message
sans aller à la ligne en utilisant un peu de couleur.start-stop-daemon
qui gére le démarrage de services (en
évitant par exemple de démarrer deux fois le même, et autres astuces).eend
: qui teste la valeur de retour du programme précédent
et affiche '[OK]' ou '[!!]' suivant la valeur.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 ?
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
, rwhod
,
rwalld
: 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...
par Anne
Où comment rendre son pingouin autonome :)
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.
Votre système dispose de plusieurs outils de programmation de tâche en fonction de ce que vous souhaitez réaliser :
at
: permet l'exécution d'une tâche donnée à un
moment donné, et ce, une seule fois. Si la machine n'est pas
allumée à ce moment-là, la tâche ne sera pas exécutée. Toutefois,
dès que la machine est rallumée, elle est exécutée. La commande est
utilisable par root et/ou tout autre utilisateur déclaré
sur la machine.
Exemple : programmer la sauvegarde de /home le 25
décembre à 23h30.
cron
: permet l'exécution d'une ou plusieurs tâches
à des moments selon un intervalle de temps fixé et répété. Si la
machine n'est pas allumée à ce moment-là, la tâche ne sera pas
exécutée. La commande est utilisable par root et/ou tout autre
utilisateur déclaré sur la machine.
Exemple : programmer la sauvegarde de /home tous
les jours à 23h30.
anacron
: permet l'exécution d'une ou plusieurs
tâches après une période de temps déterminée. Si la machine n'est
pas allumée à ce moment-là, la tâche sera exécutée dés que
possible. La commande est utilisable uniquement par root.
Exemple : programmer la sauvegarde de /home au
bout d'une période de 7 jours. Si la machine reste éteinte 9 jours,
la tâche s'exécute lors du démarrage de la machine au 10e
jour..
at
Comme on l'a vu plus haut, at
permet de programmer
l'exécution d'une tâche à un moment donné.
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
.
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 :
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>
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 :
HHMM ou HH:MM
midnight / noon / teatime
: minuit / midi / 16h
(sacrés anglais ;) )
MMJJAA ou MM/JJ/AA ou MM.JJ.AA
: attention, les
jours sont à noter après le mois (logique non ? :) )
now + x minutes / hours / days / weeks
: x minutes
/ heures / jours / semaines à partir de maintenant
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
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
.
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 :
un démon crond
: c'est lui qui se
charge d'exécuter les travaux progammées à l'aide de cron. Toutes
les minutes ils vérifie la présence de nouveaux fichiers de
configuration (crontab). Là encore, comme les autres services, il
est situé dans /etc/init.d
. Le démon doit être actif
pour que les tâches puissent être exécutées.
root@pingu# /etc/rc.d/init.d/crond status
crond (pid 769) en cours d'exécution
un fichier de configuration, la
crontab
: il contient les travaux programmés
et la date d'exécution. Il y a une crontab
par
utilisateur ayant recours à cron
. Ces fichiers sont
situés (habituellement) dans /var/spool/cron
.
des commandes : elles vous permettent de
manipuler le contenu de la crontab
(c'est à dire de
l'éditer, de la vider et de la modifier).
un fichier de log : le fichier
/var/log/cron
recense toutes les tâches programmées à
l'aide de cron.
crontab
: le
fichier de configuration de cronIl 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 :
1ère colonne, les minutes : de 0 à 59
2ème colonne, les heures : de 0 à 23
3ème colonne, le jour du mois : de 0 à 31
4ème colonne, les mois : de 0 à 12
5ème colonne, le jour de la semaine : de 0 à 7 (de dimanche à samedi)
6ème colonne, la tâche à exécuter
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) :
*
: toutes les valeurs de la plage de temps
Exemple : *
indique toutes les
minutes
2 nombres séparés par un tiret : pour indiquer un intervalle de
temps
Exemple : 0-15
indique toutes les
minutes comprises entre 0 et 15
2 nombres ou plus séparés par des virgules : indique une liste
de valeurs
Exemple : 0,15,30,45
indique les
minutes 0, 15, 30 et 45 (c'est à dire toutes les quart
d'heure).
combinaison de valeurs au moyen d'un pas (/) : permet par
exemple de désigner toutes les valeurs paires.
Exemple :
*/2
indique toutes les valeurs paires,
0-15/2
indique toutes les valeurs paires des
minutes comprises entre 0 et 15.
Il est bien sûr possible de combiner les différentes notations pour obtenir ce dont vous aurez besoin.
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 :
crontab -l
: permet de visualiser le contenu de la
crontab
(en lecture uniquement).
crontab -e
: permet d'éditer la
crontab
et éventuellement de le modifier. La commande
ouvre la crontab
dans un éditeur (vi par défaut sinon
celui définit par la variable d'environnement
EDITOR
)
crontab -r
: supprime la crontab
dans
/var/spool/cron
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
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.
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
.
anacron
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
.
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 :
1ère colonne, intervalle : exprimé en jours, il indique l'intervalle de temps entre 2 exécution d'une tâche.
2ème colonne, délai : exprimé en minutes, c'est le délai entre 2 tâches exécutées par anacron, pour éviter qu'elles ne s'exécutent en même temps.
3ème colonne, étiquette : commentaire ajouté pour les logs de anacron
4ème colonne, commande : tâche à exécuter
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
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.
par Lionel Tricon
Un petit tutoriel sur la configuration du Raid logiciel sous Linux.
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 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
|
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
|
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 ;-)
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.
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
|
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]
|
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
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.
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).
Pensez à mettre à jour votre fichier de configuration (/etc/raidtab) si vous devez enlever ou ajouter des disques...
N'utiliser le RAID que pour des disques de données. Si vous souhaitez utiliser la partition système avec du RAID (uniquement 0 ou 1), lisez attentivement les HowTo car la mise en oeuvre demeure complexe.
Allez sur le site de Linas Vepstas qui regorge d'informations intéressantes (pas uniquement sur le RAID).
Allez aussi jeter un petit coup d'oeil sur le projet Linux Logical Volume Manager même si ce n'est pas vraiment du Raid. A lire absolument car disposer d'un tel outil sous Linux est une perspective fascinante car réservée auparavant aux Unix propriétaires HPUX, Tru64, AIX, etc ...
On pourrait aussi poser la question de la pertinence d'utiliser un système de fichiers journalisé en lieu et place de Ext2 (le gain lors d'un reboot violent est indéniable). Dans l'immédiat cela n'est pas possible (noyau 2.2.x) mais ouvrira à Linux de nouvelles et fascinantes perspectives...
par Lionel Tricon
Quelques recettes pour optimiser votre système Linux.
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.
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).
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.
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
|
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. |
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).
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
|
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
|
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.
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.
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.
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
|
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.
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.
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 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.
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
|
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
|
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
|
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.
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).
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/.
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
|
Il faut utiliser la commande ulimit pour changer la configuration par défaut. Pour rendre cette limite caduque, tapez : ulimit -u unlimited.
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).
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.
- 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.
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).
Comme le filtrage n'est pas une chose simple à faire je vous renvoie a la rubrique FIREWALL de la section réseau.
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.
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.
<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...).
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.
Par Anne
Ou comment éviter de saturer l'espace de vos 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: 40où 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
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.
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 :
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
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
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.)
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.
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 fic5anne@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.
anne@pingu$ cp fic1 fic6
ide1(22,10): write failed, user block limit reached.
cp: écriture de `fic6': Débordement du quota d'espace disque
L'opération échoue. Une partie du fichier seulement a été copiée. l'utilisateur de pourra plus écrire dans le système de fichiers.
La sanction sera identique que dans le 1er cas. L'opération échoue.
anne@pingu$ cp /etc/passwd .L'opération a échoué comme en témoigne le listage ci-dessous :
anne@pingu$ ls -l passwd -rw-r--r-- 1 anne anne 0 mar 1 14:48 passwd
De même si vous essayez d'écrire dans le fichier passwd, vous obtiendrez le message suivant
dans votre éditeur au moment de l'enregistrement :
"passwd" erreur d'écriture (système de fichiers plein ?)
Appuyez sur ENTRÉE ou tapez une commande pour continuer
Il vous est impossible d'écrire.
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.
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
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
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.
par Jop, Prae & Anne
Emprisonnez un utilisateur, ou un progamme dans une geôle!
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.
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.
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.
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
Très bientôt la suite de cet article abordera comment "chrooter" les services afin d'en optimiser la sécurité
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)
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.
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.
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.
#lsdev
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
lsdev
n'est pas fournie par votre distribution, essayez :#more /proc/devices
et les autres commandes de cet article.#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
#top
Et enfin depuis combien de temps la machine n'a pas redémarré :#uptime
#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
#procinfo -i | more
procinfo
peut servir pour la mémoire, l'occupation du processeur... Bref, faites man procinfo
pour en savoir plus.lsdev
, la commande procinfo
peut être manquante, alors faites aussi :#more /proc/interrupts
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
#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)
Interrogation : est-ce dépendant de la carte mère et de sa façon de gérer les IRQ ?
#/sbin/lspci -v
Encore plus d'informations sur les cartes ?#/sbin/lspci -vv
#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.#/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
#ls -l /dev/hda* /dev/hdb* /dev/sda* /dev/sdb*
/dev/ide/host0/bus0/target1/lun0/part9
et /dev/hdb9
, par exemple.#/usr/sbin/hdparm -d /dev/hda
Ce qui retourne :/dev/hda:
using_dma = 1 (on)
#/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
/dev/hda
en fonction de votre disque dur./proc/partitions
.# 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
/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 :media
qui indique si c'est un cdrom, un disque dur ou autrecat media
: cdrom
model
qui donne le modèle du média installécat model
: SONY CD-RW CRX140E
/proc/ide/-+-ide1/-+-hda/
| |
| `-hdb/
|
`-ide2/-+-hdc/-+-media
| `-model
`-hdd/
#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
#find /proc/ide -iname "media" -type f -print
root
) :
#cdrecord -scanbus
NDR : Pensez à l'émulation SCSI pour un graveur IDE. 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
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.
/etc/nom-distribution
cat
de ce fichier./etc/mandrake-release
et pour la Slackware, /etc/slackware-version
.
#hostname
#uname -r
Pour connaître la configuration actuelle du noyau :.config
de votre noyaumake xconfig
make menuconfig
, le tout en étant sous /usr/src/linux
. Attention à ne pas sauver !
/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 fichiermodules.txt
.#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
SysV
ou BSD
-like et si elle utilise inetd
ou xinetd
.SysV
et utilisent xinetd
sauf la Slackware.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
inetd
ou xinetd
qui est utilisé./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.
#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)
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.#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
/usr/lib
/lib
/etc/ld.so.conf
#ldconfig -p
Mais pour savoir si la bibliothèquelibc.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é...cd / && find . -iname "*config*" -type f -print | grep -i bin
, vous retournera une liste d'exécutables de configuration. Il ne reste plus qu'à trouver celui qui semble correspondre, faire un man
et à essayer : exécutable --version
.so
(cherchez le véritable .so
, pas le lien symbolique).release-note
de la version de votre distribution, si elle existe.ldd -v nom-exécutable ou nom-bibliothèque
donne des informations de version mais je ne suis pas sûr de les comprendre... 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)
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.
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... ;-)
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...
J'espère que vous avez appris quelque chose et que cela vous sera utile.
N'hésitez pas à m'envoyer vos remarques.
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.
Procédure d'installation pour compiler php avec mysql pour le serveur Apache.
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 ?
Il y a plusieurs manières de s'y prendre pour installer le support php sur le serveur apache :
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/
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à 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/
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
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.
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 )
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.
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
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
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.
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.
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.
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).
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é. |
bootwait | comme 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.
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
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.
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.
setserial
appropriée. Il est lancé par rc.S mais il est commenté par défaut
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.
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.
rm -r -f /tmp/*
juste avant qu'il ne démonte le système de fichiers.
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.
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.
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.
Il est lancé pour les niveaux d'initialisation 1 à 6 comme indiqué dans le fichier /etc/inittab. Il effectue les opérations suivantes:
man agetty
pour une description des codes d'échappement utilisés dans ce fichier)
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:
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 :
man bash
pour savoir comment le redéfinir)Il effectue également les opérations suivantes:
eval 'dircolors -b'
qui lit le fichier /etc/DIR_COLORS pour les options de la commande ls
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.
par Abba
Imprimer n'est plus un supplice avec cups !
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é.
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.
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.
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.
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.
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.
abba@localhost:~$ su -c "chkconfig --add cupsd && /etc/init.d/cupsd start"
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.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 :
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 !
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.
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
où 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.
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.
IrOnUx
authentifier les utilisateurs samba au niveau d'un CPD NT
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.
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.
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.
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
.
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
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
.
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.
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
.
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.
Fin du chapitre