lpic-1
22/05/2018I - Get help
–help/-h
# help option
$ ls --help
# show internal (builtin) commands
$ help
# internal command help
$ help pdw
man
section | content |
---|---|
1 | shell commands or instruction |
2 | system calls (API du noyau,…) |
3 | appels des bibliothèques (fonctions C,…) |
4 | special files (contenu de /dev comme sd, hd, pts,…) |
5 | files format (/etc/passwd, /etc/hosts,…) |
6 | games, screen saver, gadgets,… |
7 | non standard commands |
8 | commands for system administration |
9 | sous-programme du noyaun (souvent vide) |
# manual page
$ man passwd
# give number page
$ man -5 passwd
# search command
$ man -k passwd
info
Info pages: format + links + page navigation.
# info page
$ info sed
# show command options
$ info --show-options date
# search command
$ info --apropos date
II - Shared libraries
- linking with
ld
, used bygcc -l <lib>
- Shared Object
.so
- location:
/lib[64]
: system libraries, essential for boot/usr/lib
: for users, non essential for boot/usr/local/lib
: local libraries/usr/X11/lib
: for programs- systemd moved
/lib[64]
in/usr/lib[64]
/lib/x86_64-linux-gnu/libc.so
: most important lib- a lot of symlink to manage versions
ld.so
or ld-linux.so
: search libs and manage cache.
# all programs are linked to ld.so
# program's libs
$ ldd /bin/vim
# global conf
$ vim /etc/ld.so.conf
# personal conf
$ vim /etc/ld.so.conf.d/
# order for the search
$ LD_LIBRARY_PATH=
$ /etc/ld.so.cache
$ /lib[64]
# regenerate cache
$ sudo ldconfig -V
# -V: verbose
# -N: don't regenerate cache
# -X: not link updates
# -p: list cache content
I - Shell
bash
: command interpretorkernel
: noyaushell
: coquille, ce qui entoure le noyauEx: sh, csh, ksh, zsh, bash, tcsh, ash, dash
# all shells available
$ vim /etc/shells
$ # user prompt
# # root prompt
$ echo -e "Salut \t ça va ?\n"
# \n: saut ligne
# \t: tabulation
# \c: supprimer sout de ligne final
# \b: retour d'un caractère en arrière
# chainer commande
$ date; pwd; cal; echo
cheat sheet | action |
---|---|
ctrl + a |
aller debut ligne |
ctrl + e |
aller fin ligne |
ctrl + l |
effacer |
ctrl + u |
efffacer jusqu’au début |
ctrl + k |
effacer jusqu’à la fin |
ctrl + w |
effacer mot à gauche |
command type
# external: in the hard drive, load in memory for execution
# internal: in shell, execution inside shell (cd, pwd)
$ type date
# date is /usr/bin/date
$ type pwd
# shell builtin
interruption
cheat sheet | action |
---|---|
ctrl + c |
on demande qu’il se termine |
ctrl + z |
mettre en pause |
ctrl + d |
fin de saisie |
history
$ cat .bash_history # user history
$ history # recent history
$ fc -l # recent history
$ fc -s 118 # call command
$ fc -s fc=ls 21 # with replacement
files
# FS: File System
# 1-regular files
# 2-directory
# 3-special files (/dev)
$ cd / # root directory != /root
$ cd /home/mourad # home directory
$ cd ~
$ touch # change date
$ mkdir -p # create arborescence
$ cp
$ mv
$ rm
# -r : recursive
# -i : confirmation
# -p : keep date and permissions
$ cat
$ ln -s file link
# red symbolique links = ne pointe vers rien
# ls size = taille fichier ordinaire seulement et non sous repertoire (du)
# remove le file -i
$ rm -- -i
$ file a.out # file type
wildcards
wildcards | action |
---|---|
* |
|
? |
|
[abc] |
|
[a-z] |
|
[!...] |
inverse |
[^...] |
inverse |
\ |
escape character |
'...' |
escape all |
"..." |
escape all but keep variables |
find
option | example |
---|---|
-name |
fich* |
-type |
b,c,d,f,l,p,s |
-user |
mourad or UID |
-group |
root or GID |
-size |
+-100b,c,w,k,M,G |
-empty |
-size 0 |
-atime |
access time |
-mtime |
modification time |
-ctime |
change time |
-perm |
[+-]777 |
-links |
[+-]3 |
-inume |
inode |
-[i]regex |
'.*slyunix/t-shirt.*' |
-print |
implicite |
-ls |
`` |
-exec |
rm -f {} \; |
-ok |
rm -f {} \; |
-a |
-and |
-o |
-or |
! |
not |
Ex:
$ find . ! \( -type f -o -type d \) -ls
$ whereis # cherche binaire et source, -b, -m, s
$ which [-a] # premiére occurence dans $PATH
$ locate # chercher fichier via BDD /var/lib/located.d via updatedb dans /etc/sysconfig/locate
redirection
# standard output
$ ls -al /home/ > home_content.txt
$ ls -al /home/ >> home_content.txt
# redirections are interpreted from right to the left
$ wc < text.txt # standard input
$ wc \<\< fin # writing to "fin"
$ tr "[a-z]" "[A-Z]" \<< fin
$ tr "[a-z]" "[A-Z]" <<< $(cat file)
# standard output
# input: stdin, descriptor 0 or &0
# output: stdout, descriptor 1 or &1
# error: stderr, descriptor 2 or &2
# order: <,>,>>
$ exec 3>dump.log # create output (3 to 9)
ls -l >&3 # used
exec 3>&- # closed
filters
programme which read and write and traite data of standard output: wc
, more
, grep
pipeline, tubes, pipe
redirigiger canal de sortie d’une commande vers canal d’entrée d’une autre
redirect command output to input of other command
# normal
$ ls -l > res.txt
$ wc < res.txt
$ ls -l | wc # better
$ direname /tmp/a/liste # -> /tmp/mourad
$ basename /tmp/a/liste # -> liste
# grep, egrep, fgrep: select lines from file
# -v inverse
# -c return line number
# -n give the line number also
# -i case sensitive
# -l give source, in case of multipl files
# regular expressions
$ egrep
$ grep -E
# fast grep
$ fgrep
$ grep -F
# stream editor
$ sed -e 's/__NOM__/Toto/g' file.txt
$ sed -e "s/\(toto\)/**\1**/g" file.txt
$ sed -e '/^ *$/d' file.txt: remove empty lines
# columns
$ cut -cNUM
$ cut -c2
$ cut -c2-4
$ cut -c1,2,3-10
# fields
$ cut -dC -fCHAMP: sélectionner champ séparé par tab
$ cut -f1 fichier
$ cut -f1,3 fichier
$ cut -d: -f1,3 /etc/passwd
# count lines
$ wc
# -l : lines
# -c : bytes
# -w : words
# -m : characters
# split file
$ split [-ln] [-b Nbkm] [fic[prefix]]
$ split -b 150m debian.iso fic
# will create ficaa, ficab,...
# -b: all files have same size
# -l: ... have same lines number
$ cat fic* > debian.iso # reconstrution
$ tr [option] original dist # replace character
$ cat liste.txt | tr "oi" "ea"
# replace spaces by :
$ tr -s " " ":"
$ expand # tabulation to spaces
$ unexpand # spaces to tab
# manage output
# read output delimited by space or line break
# and execute command on them
$ cat input | xargs
$ cat input | xargs -n 2
# 2 columns
# other
$ sort
$ uniq
$ join
$ paste
$ cat
$ tac
$ hexdump
$ od
$ banner
$ cat -n ou nl
$ head
$ tail -f
$ column -s: -t /etc/passwd
# duplication du canal
$ tee [-a]
$ cat /etc/passwd | cut -d: -f1 | tee users.txt | wc -l
# -a: append, n'écrase pas contenu fichier
$ diff
$ comp
$ sleep 10
# controler flux
$ pv test > test2
# durée compression
pv /blabla/fic | gzip > test.gz
II - Process
PID
PPID
UID
GID
priority
working directory
- opened files (descripteurs) processus fils du shell pour lancer commandes ls -R / > ls.txt 2>/dev/null & le process en fond ne doit pas attendre de saisie pas d’affichage ne pas quitter shell avec traitement
$ jobs
numJob PID
ctrl + z: mettre en pause
$ fg # to foreground
$ bg # to background
### list process
$ ps # process launch by user from current shell
$ ps -ef # all process
# -f: more info
# -e: all process
# -u mourad
# -g wheel
# -t tty0: terminal
# -p 123445
# l: more more info
signals
# show all available signals
$ kill -l
# 1(SIGHUP): send by parent process before die
# 2(SIGINT): interruption (ctrl + c)
# 3(SIGQUIT): interruption + core dump
# 9(SIGKILL): force fin brutale
# 15(SIGTERM): by default, fin gentille
$ kill 1234 # kill process by PID
$ kill -n 9 1234 # with signal
$ pkill firefox # kill process with its name
$ pgrep sleep # get PID with process name
$ nohup ls -lR / & # ne plus tenir compte du SIGHUP lorsque le pére meurt
priority
# launch command with priority
$ nice -10 ls -lR >list 2>/dev/null &
# change priority of process
$ renice -n 10 [-p] [-g] [-u] 1234
$ time ls -lR /home
# real: durée total exec commande
# user: CPU time
# system: durée du temps CPU necessaire pour éxecuter commande
$ exec ksh # replace current process by another
groupement
$ uname -a ; pwd ; ls -l > res.txt & # multipls shells
$ (uname -a ; pwd ; ls -l) > res.txt & # one shell
# return code of last command
# echo $?
# 0 : success
# else : error
$ cmd && cmd # and
$ cmd || cmd # or
$ (exit) # launch in child
$ {exit ;} # launch in current shell
les variables
# user (minuscules)
# system (majuscules)
# speciale
# variable
$ nom=Mourad
$ echo $nom
$ env # show user and system variables
$ "..." # read variables
$ '...' # don't read variables
$ unset nom # delete var
$ readonly nom # protect var (read only and can't delete)
$ export nom # share var with shell children, but modification is limited
$ cp ${fic}1 ${fic}2 # accolades
### replacement
$ {x:-texte} # if x empty, else texte
$ {x:=texte} # if x empty, x=texte
$ {x:-texte} # if x not empty, x=texte
$ {x:?texte} # if x empty, script stopped and display texte
system variables
variable | content |
---|---|
$HOME |
|
$PATH |
|
$PS1 |
|
$PS2 |
|
$PS3 |
|
$IFS |
caractère standard de séparation des commandes |
$MAIL |
chemin des mails |
$SHELL |
|
$LANG |
|
$USER |
|
$LOGNAME |
|
$HISTFILE |
nom fichier history |
$HISTSIZE |
taille histiry |
$OLDPWD |
|
$PWD |
|
$RANDOM |
(0 à 32767) |
speciale variables
# readonly, contexctual content
$ echo $? # return code of last command
$ echo $$ # PID of current shell
$ echo $! # PID of last shell launch with &
$ echo $- # shell options
strings
$ a=Jules
$ echo "Longueur de $a: ${#a}"
# array
$ nom[0]="test"
$ nom[1]="a"
$ echo ${nom[1]}
# or
$ nom=(text,a)
$ echo ${nom[*]}
$ echo ${#nom[*]}
# si index est variable, pas de $
index=0
$ echo ${nom[index]}
# variables typées
# entier
$ typeset -i ma_var
$ let res = ma_var + 5 res2=a+b
# ou ((...))
le shell
connexion
- shell connexion
- lance le shell du user dans
/etc/passwd
/etc/profile
(inclu/etc/profile.d/*
)~/.bash_profile
~/.bash_login
~/.profile
déconnexion
~/.bash_logout
shell mode non intéractif (pour les process) pas de script au démarrage BASH_ENV: permet d’en éxecuter un
$ set
pour donner option à bash: man bash
# -a
# -u
# -x
# -o vim
# -C
III - Shell program
#!/bin/bash
# le sha-bang
# chmod 555 scriptname (gives everyone read/execute permission)
# chmod u+rx scriptname (gives only the script owner read/execute permission)
# A script needs read, as well as execute permission for it to run, since the shell needs to be able to read it.
# file in .sh .ksh .csh
# executable mode
$ chmod +x my_script.sh
$ ./my_script.sh
$ PATH=$PATH:.
$ my_script.sh
$ cat my_script.sh
#!/bin/bash (+ options)
# ; = lign jump
IV - Arguments
# position parameters = speciales variables
# script name
$ echo $0
# parameters
$ echo $1...9
# parametres numbers
$ echo $#
# "$1 $2 $3 ..."
$ echo $*
# "$1" "$2" "$3" ...
$ echo $@
# $1=var1 $2=var2 $3=var3
$ set var1 var2 var3
$ $1=$2 $2=$3
$ shift
$ shift 4
# return 0 and quit
$ exit
$ exit 1
# return value
$ echo $?
V - Process environnement
# only exported values are available in script environnement
# see environnement
$ env
# share var without export for every script
$ env var1=val1 var2=val2 m_script.sh
# on bash
$ var1=val1 var2=val2 m_script.sh
# only standard output is on variable
# the error output is in screen
VI - Command substitution
$ my_unix=`uname`
$ machine=`uname -a | cut -d" " -f5`
# bash
$ $() replace ```
VII - Conditions
strings
# 0 if $var is empty
$ test -z "$var"
# 0 if $var is not empty
$ test -n "$var"
# 0 if equals
$ test "var" = $var
# 0 if different
$ test "var" != $var
# "$a" is better than $a
numeric
# test val1 option val2
# options
# -eq : ==
# -ne : !=
# -lt : < (less than)
# -gt : > (greater than)
# -le : <= (less or equal)
# -ge : >= (greater or equal)
files
# test option file
# options
# -d
# -c (caracter mode)
# -b
# -p
# -r
# -w
# -x
# -s (not empty)
# -e (exist)
# -L (simlink)
# -u (exist + SUID)
# -g (exist + GUID)
combinés
# -a : and
# -o : or
# ! : non
# \(...\)
$ test -d "rep1" -a -w "rep1" && ...
VII - Better syntax
$ # test -> [ ... ]
# [[ ... ]] : more rapid, no process, force command interne
# can use && (-a) and || (-o)
IX - Shell program
if
if [ $# -ne 2 ]
then
echo "Give 2 args please"
echo "Ex: $0 10 20"
exit 1
fi
x=$1
y=$2
if [ $x -eq $y ]
then
echo "values avec equals"
elif [ $x -lt $y ]
then
echo "$x is less than $y"
else
echo "$x is bigger or equal to $y"
fi
# command
if [[ $? -eq 0 ]]
# C syntax
if (( $(command) ))
case
case $x in
1) echo "la premiere valeur est 10" ;;
2) echo "la premiére valeur est 20" ;;
*) echo "je ne reconnais pas la valeur" ;;
esac
# *
# ?
# [...]
# [!...]
# | : logic or
echo -n "Nom: " ; read nom
echo -n "Prénom: " ; read prenom
echo "Bonjour $prenom $nom !"
for
for elt in $@
do
echo "je suis dans la boucle $elt"
done
for elt in $(seq 3)
do
echo "je suis dans la boucle $elt"
done
for (( i=1; i<10; i++ ))
do
echo "je suis dans la boucle $i"
done
for int in $(seq 100)
do
echo "int: $int"
if [ $int -eq 10 ]
then
echo "int vaut 10 !!"
break # suite apres le premier donne rencontré
# continue # passe boucle suivante, peut prendre arg
fi
done
while
debut=0
typeset -i debut
fin=4
while [ $debut -ne $fin ]
do
echo "les valeurs ne sont pas egales"
eval debut=$debut+1
done
echo "Saisisez une commande (> fin pour quitter)"
while true # ou while :
do
echo -n "> " ; read rep
if [ "$rep" = "fin" ]
then
break
fi
done
until
until [ $debut -ne $fin ]
do
echo "les valeurs ne sont pas"
eval debut=$debut+1
done
select
PS3="Votre réponse > "
select elt in Bonjour Salut Yolo
do
case $elt in
"Bonjour") echo "Vous avez choisie Bonjour" ; break;;
"Salut") echo "Vous avez choisie Salut" ; break;;
"Yolo") echo "Vous avez choisie Yolo" ; break;;
esac
done
functions
my_fonction() {
echo "Je suis dans la fonction de $prenom $nom"
return 0
}
prenom=mourad
nom=allam
ma_fonction $prenom $nom
eval \$$b
. mon_fichier.sh
my_function
a=10
# expr prend que des nombres
expr 2 + 3
expr $a + 3
expr $a != 3
a=$((a + 1))
echo "3/6" | bc -l
b=20
eval echo \$$b
signal_recu () {
echo 'je viens de recevoir un signal'
}
trap 'signal_recu' SIGINT
sleep 10
old_IFS="$IFS"
IFS=:
echo "Please input some data separated by colons ..."
read x y z
IFS=$old_IFS
echo "x is $x y is $y z is $z"
I - Répresentation des disques
- disques dans /dev
controleur IDE (ancien)
en hdX hda, hdb, hdc,…
port extension machine = slot PCI hdX n’existe plus sur dernière version du noyau
controleur SCSI, SATA, USB,…
sdX sda, sdb, sdc,… nom suivant ordre detection CD, DVD, Blueray: srX, sr0, sr1, sr2 aussi en scd0 mais pointe vers sr0
# affiche périphérique SCSI
$ lsscsi
controleur spécifique
cXdYpZ X: slot Y: disque Z: partition
virtualisation
vitual disk Ex:vda, vdb ou xvda, xvdb
Manipulation de bas niveau
disqueq géré par bibliothéque libata, on peut faire des modifs (p271)
# SATA, ATA (IDE), SAS
$ hdparam
$ hdparam -I /dev/sda # info depuis noyau
$ hdparam -I /dev/sda # info depuis disque
# SCSI
$ sdparam
Système de fichier
on organise le support d’une certaine manière afin de pourvoir y stocker des données associer nom fichier à son contenu + meta-data 255 caractères max extension inutile != Windows type fichier determiné par le premier octet (type MIME)
# utilise type MIME
$ type mon_fichier
Journalisation
- garantir intégrité données
- le FS maintient un journal dans lequel il trace tous les changements intervenus avant de les effectuer réellement et de les pointer une fois terminés
- en cas de coupure, relit journal et rejoue opération si nécessaire
file system | caractéristiques |
---|---|
ext2 |
FS historique, non journalisé, rapide, nécessite moins décritures |
ext3 |
ext2 + journal, passage ext2 <-> ext3 |
ext4 |
compatible ext3, meilleur allocation, vitesse de vérification rapide |
btrfs |
à terme nouveau FS de Linux, concurant à xfs, modif volumes à chaud, proche de LVM |
reiserfs |
1er FS journalisé, performant sur petits fichiers |
xfs |
journalisation très performante, Red Hat, snapshot, modif volume à chaud |
vfat |
toute version de FAT, pour petits volumes, simple, cross-platforme |
exfat |
défaut, pas de notion de droits, fichier max 4Go, remplacé par NTFS |
exfat
: version amélioré de vfat
NTFS
: pour partager Linux-Windows
VFAT
: bcp de problèmes de brevets
Partionnement
- découpage logique du disque, le disque physique, réel, est fractionné en plusieurs disques virtuels, logique, les partitions
- chaque partion est vue comme un disque indépendant avec son propre FS
- 2 méthodes de partionnements:
- MBR: machines BIOS
- GPT: machine UEFI (+BIOS)
MBR
- position sur 32 bits
- 1 block = 512 ko
- 2 To max de partition
- le * utilisé mais bascule vers GPT car UEFI
MBR - 521 octets gestionnaire d’amorcage (446 o) | tables des 4 partitions primaires (64 o) | signature (2 o)
partition
- partitions primaires (4 dans MBR)
- partition primaire étendue (1 dans MBR)
- partitions logiques
disques IDE: 63 partitions max par disque
disque SCSI: 15 partitions max par disque
partition de 1 à n
n >= 5: partitions logiques
la partition primaire 4 (la dernière) est souvent primaire
1 à 3: primaire
4: étendu
5 à n: logique
hda1
: disque IDE 1, 1ére partition primaire
hdb5
: disque IDE 2, 5ére partition primaire
EBR
- chaque partition étendue doit décrire les partitions logiques qu’elle contient
- doit disposer d’une table des paritions
- possède 2 enregistrements: 1er: position et taille d’une partition logique 2éme: vide si pas d’autre partition logique, sinon pointe sur autre EBR (liste chainée)
- 1 EBR = 1 partition décrite
PBR ou VBR
- 1er secteur de chaque partition primaire ou logique
- peut contenir routine ou chargeur d’amorcage si vocation à petre booté
- quand pas de routine dans MBR, bios cherche dans PBR
type de partition
- en hexa sur 1 octet
- respecter type partition/système de fichier
Partionnement GPT
- UEFI remplace BIOS
- GPT remplace MBR
- adressage sur 64 bits
- bloc d’au moins 512 octets
- plus de notion de bloc mais de LBA
- LBA : Logical Block Addressing
- LBA 0: 512 premiers octets
- LBA 1: les 512 suivants
GUID
- Global Unique Identifier
- unique 128 bits, ID de composant
- dans GPT, décrit, disque, id de type de partition, id d’une partition
LBA 0
- conserver rôle de MBR
- protectiver MBR, permet de reconnaitre disque GPT
LBA 1 (LBA -1)
- en-tête GPT
- emplacement et taille du LBA -1
- sommes de contrôles associées
- 1ére et derniére adresse utilisable pour partition
- le GUID du disque
- adresse table de partition (LBA 2)
- nb et taille des descripteurs de partitions
- somme de contrôle de la table des partitions
LBA 2 à 33
- descripteurs de partition (128 octets)
- 4 partitions par LBA
- 32 LBA -> 128 partitions max
- peut être modifié dans LBA 1
- sauvegarde en LBA -2 à -33
- descripteur de partition
- type GUID de la partition
- GUID de la part.
- LBA de début de la part
- LBA de fin de la partition
- attributs de la partition
- son nom
Manipulation des partitions
# le plus ancien, le plus utilisé (menu), pour MBR
$ fdisk
# dérivé de fdisk
$ cfdisk
# compliqué mais précis
$ sfdisk
# opérations avancées, scriptable
$ parted
# equivalent fdisk pour GPT
$ gdisk
manipulation partition MBR
$ fdisk -l
$ fdisk -l /dev/sda
# "p" pour print les partions
# "d" supprimer partition
# "n" créer partition
# "p" ou "e", primary ou extended
# choisir début de la partition
# +1024M ou + 64G
# "p" pour voir état
# "w" sauvegarder
# message d'avertissement normal
# forcer synchro: blockdev --rereadpt /dev/sdb pour relire la table de partition
# ou si parted est installé et blockdev ne fonctionne pas: partprobe /dev/sdb
# cat /proc/partitions | grep sdb -> pour voir partitions
# on peut maintenant utiliser la partition et y ajouter un FS
# modifier type partition
$ fdisk
# "t"
# "numéro partition"
# "L"
# "w"
# types les + utilisés: 83: type Linux
# 82: swap
# fd: type RAID
# 8e: type LVM
manipulation parition GPT
$ gdisk /dev/sdb
# pas de notion de partition primaire ou étendue
# parition 1 à 128
# même fonctionnement que fdisk
# type avec 0 à la fin
# dangereux d'utiliser gdisk sur un disque MBR
Manipuler les FS
block
unité de base, atomique, fichier = nb de blocks du, df, find utilise unité block 512 ou 1024 octets
superblock
chaque FS à au moins 1 superblock contient: type, taille, etat, info sur partitions, autre superblocks existe plusieurs copies de ses super blocks
tabke d’inodes
index node, noeud d’index, strcuture de données, representant un fichier tous les inodes sont dans plusieurs tables d’inodes 1 fichier = 1 seul node 1 node = unique dans le FS contenu: toutes les info d’un fichier, ne contient pas le nom du fichier, ni date de création (existe exception) $ stat chap1.pdf adresse dans inode: soit vers début données du fichier, soit vers block d’adresses, et ainsi de suite
table de catalogues
|nom fichier |inode |
|:—————–|:———|
|mon_fichier.txt
|172781289 |
|centos7.iso
|211112999 |
possible de donner plusieurs nom à un même fichier
hard link
reférence sur inode limté dans le FS ls -l -> 1: normal si > 1 alors existe d’autre liens
Créer système de fichier
# permet de trouver la commande associée
$ mkfs -f typefs options periph
# indiquer options après le typefs
# on peut directement appelé la vrai commande
# ext2 -> mkfs.ext2
$ mkfs -t ext2 /dev/sdb1
# on peut définir les options
# -b taille block, multiple de 512
# -c vérifier les mauvais blocks avant de créer le FS (execute badblock)
# -i ration octets/inodes
# -m pourcentage pour root
# -L label de la partition
# -j créer journal pour ext3
$ mkfs -t ext2 -j -b 2048 -i 16384 -m 0 -L "DATA" /dev/sdb1
# ext2 -> ext3
$ tune2fs -j /dev/sdb1
# ext3 -> ext2
$ tune2fs -O ^has_journal /dev/sdb1
# vérification fsck et supprime .journal
# ext3 -> ext4
$ tune2fs -O extends,uninit_bg,dir_index /dev/sdb1
$ fsck -pDF /dev/sdb1
$ mount /dev/sdb1 /mnt
# ajouter extends aux fichiers déjà existant
$ find /mnt -xdev -type f -exec chattr +e {} \;
# même chose avec -type d
# ext4 -> ext3
# si pas encore d\'extend: le monter en ext3
# sinon pas possible
# label
# afficher
$ e2label /dev/sdb1
# modifier
$ e2label /dev/sdb1 DATA # max 16 caractères sinon tronqué
# ReiserFS, xfs, btrfs, vfat
# voir les options associées
# les mtools: outils pour travailler sur FS FAT ou VFAT
Accéder au système de fichier
# accéder aux partitions qui ont un FS
# info sur tous les montages actifs (aussi dans /etc/mtab)
$ mount
$ mount -t typefs -o options periph point_montage
$ mount -t ext4 /dev/sdb1 /mnt/DATA
# par label -> mieux !
$ mount -t ext4 -L DATA /mnt/DATA
# dans /dev/disk/by-label
# par UUID de partition
# udev avec vol_id dans /lib/udev/vol_id
$ ./vol_id -u /dev/sdb1
# maintenant
$ blkid /dev/sdb1
$ blkid -o value -sUUID
# si FS est ext2 ou 3
$ /dev/disk/by-uuid
$ mount -t ext4 -U 98766 /mnt/DATA
# remonter FS avprès modifs
$ mount -o ro,remount /mnt/DATA
# options de montage
# p 311
détacher point de montage
# ne doit plus être utilisé
$ umount /mnt/DATA
# connaitre utilisateurs
$ lsof /mnt/DATA
# forcer
$ fuser -km /mnt/DATA
# conf statique des montages, lu à chaque démarrage
/etc/fstab
periph | p_montage | typefs | options | dump | fsck
# montage automatique sauf si option noauto
# montage manuel
# recherche automatique dans fstab
$ mount /home
$ mount -L u01
mount LABEL=/boot
mount /dev/sda5
# tout monter
$ mount -a
Controler le système de fichiers
statistiques d’occupation
par système de fichier
# info sur fs montés
$ df
# info sur le fs
$ df sys_fichier ou point_montage
# info sur le fs qui le contient
$ df fichier.txt
# k, m
# -T: affiche type de fs
# -i: stats sur inodes
par arborescence
# disque usage, espace occupé par arborescence
# dossier + contenu
$ du
# taille totale seulement
$ du -s /home
# par défaut visite autres FS
$ du -x /home
vérifier, régler et réparer
# vérifier réparer FS, ne doit pas être monté ou ro
$ fsck
# comme mkfs, appelle d'autres commandes, fsck.ext2, fsck.ext3
# si pas de type, devine
$ fsck -t typefs periph
# forcer et verbeux
$ fsck -fV /dev/sda2
# si il faut réparation
# -p: automatique
# -y: répondre oui à toutes les questions
# existe vérification automatique, interval peut
# être modifié avec tune2fs
# BTRFS
$ btrfsck
$ btrfscheck
# vérifier blocs déféctueux
# appelé par mkfs ou fsck avec -c
$ badblocks
# -n: non déstructuf, lit et réécrit
# -w: destructuf avec modif
# éxecution très longue, pas de sens sur SSD
# donne info, utile avec grep, ext2,3,4
$ dump2fs
# modif paramètres en ext2,3
$ tune2fs
# pour ext2,3,4
$ debugfs
XFS
par défaut dans RHEL, CentOS
# étendre parttion
$ xfs_growfs
# peut être agrandi, mais pas rétrécit
# nbr d'inodes non limités en xfs
# equivalent de fsck
$ xfs_repair
# affiche journal, log
$ xfs_logprint
# debugfs et tune2fs
$ xfs_db et xfs_admin
le swap
théorie: 32 bits, process peut addresser à 4 Go d’espace mémoire (virtuelle) rien que pour lui, si dépasse, utilise le swap
taille optimale
RAM | SWAP <512 Mo | 2*RAM 1 Go à 4 Go | taille RAM +4 Go | 4 Go, plus ou moins 256 Go | non 256 Go
créer partitions swap
fdisk ou gdisk synchroniser table de partitions:
$ partprobe
# préparer partitions à recevoir swap
$ mkswap /dev/sda5
# si swap > 2Go, alors plusieurs partitions de swap sur le plusieurs disques sur plusieurs controleurs materielle différent
activer, désactiver swap
# activer
$ swapon /dev/sda5
# -p: priorité,de 0 à 32767
# varier si disque plus rapide qu'un autre
# activer toute parition de swap sans noauto
$ swapon -a
# désactiver
# s'assurer d'avoir de la place en RAM
$ swapoff /dev/sda5
# /proc/swaps: zones swap actives
# desactiver toutes les partitions de swap
$ swapoff -a
# en cas d'urgence, fichier de swap, p330
etat de la mémoire
# info sur RAM
$ free
# FS virtuel
# /proc
# /proc/meminfo
# vider cache
$ sync ; echo 3 >/proc/sys/run/drop_caches
$ swapoff -a
$ swapon -a
$ free
quotas disque
p336
Droits d’accés
UID: user id /etc/passwd: les users GID: group ID user avec group principal /etc/group $ id fichier lié à UID et GID
# modifier droits
$ chmod -R
# u,g,o
# +,-,=
# r,w,x
# 4,2,1 # base 8
# droits de base fichier: 644
# droits de base dossier: 755
# ce que l'on retire de fichier: 666, dossier: 777
$ umask
# changer proprio
$ chown
# changer groupe
$ chgrp
# droits d'accés étendus
# executer commande avec droits sur proprio, ou groupe
# SUID et SGID
$ chmod u+s ou g+s
# 4000 ou 2000
# UID et GID reel: celui qui lance vraiment
# UID et GID effectif: celui deu process (si SUID ou SGID)
# SUID et SGID non transmis au fils
# sticky bit (bit collant)
# protection contre affacement
$ chmod u+t /tmp
# 1000
# repertoire
# si s au groupe, tout ce qui va être crée dedant partage le groupe du repertoire
Processus de démarrage
BIOS et UEFI
- BIOS: Basic Input Output System
- interface logicielle entre matériel et logiciel à niveau très basique
- auto-test (POST) au démarrage pour détecter périphériques (dont celui pour démarrer)
- mémoire CMOS: alimentée par petite pile avec info materilles
-
lit est éxecute 1er secteur d’amorçage (MBR ou PBR)
- UEFI: Unifed Extensible Firmware Interface
- seccesseur du BIOS
- interface entre firmware (micrologiciel) du matériel et l’OS
- amorçer OS via boot manager
- contrairement au BIOS, chercge tout le nécessaire pour lancer lui-même l’OS
GRUB
- Grand Unified Bootloader
- chargeur par défaut
- options:
- timeout: nb sec pour choisir
- default n: preselection
- title xxx: debut section, ligne menu
- root(hdX,y), tous les accés fichiers en dessous sont depuis ce point (hd0,O): 1ère partition du 1er disque (fd0): 1er lecteur de disquette detecté BIOS (hd1,4): 5éme partition du second disque
- kernel: nom de l’image du noyau suivi des param
- initrd: initial ramdisk
- rootnoverify: racine à ne pas monter par GRUB
- chainloader + 1: démarre le 1er secteur de la racine spécifiée ci-dessus
installation
# conf
$ cat /etc/grub.conf
$ cat /boot/grub/menu.lst
# peut s'installe sur MBR ou PBR
$ /sbin/grub-install /dev/sda
démarrage
choisir image au boot
e
pour éditer param passés au noyau
e
: editer ligner
d
: supprimer ligne
o
: ajouter ligne
b
: booter
GRUB 2
- réécriture complète de GRUB
```bash
de GRUB à GRUB2
$ upgrade-from-grub-legacy
modules en .mod
config menu
$ cat /boot/grub[2]/menu.cfg
mais pas touché car généré automatique par
utiliser à chauqe ajout de noyaux ou script
$ update-grub $ grub2-mkconfig -o /boot/grub/menu.cfg
fichiers lus
$ /boot/grub/device.map # correspondance nom disque Linux et GRUB $ /etc/default/grub # param par défaut de GRUB $ /etc/grub.d/* # par ordre de listage qui génére les menus
ordre
$ 10_linux # cherche noyaus $ 30_os_prober # cherche autres OS sur le disque
générer device.map
$ grub-mkdevicemap
sinon
$ grub2-install –recheck
variables de GRUB2 + options (p355)
$ /etc/default/grub
trouver OS sur disque
$ $ os-prober
### ordre
* traces noyau dans /var/log/dmesg
* matériel detecté et initialisé
* initrd est chargé + modules
* noyau monte le FS racine en read only
* crée première console
* 1er process est lancé (init)
* autre chargeur: LILO (Linux Loader) mais disparait
# Init Sytem V
### rôle
* programme init
* 1er lancé et dernier stoppé
* lance toutes les autres tâches
* pére de tous les process
* PID = 1
* lancé par noyau (PID = 0, virtuel)
* conf: /etc/inittab
### runlevels
* 0: halt, stoppe l'OS et machine
* 1: mono-utilisateur, maintenance en mode console
* 2: multi-user, sans réseau console
* 3: précedent + réseau
* 4: précedent + selon admin
* 5: avec réseau + X window
* 6: reboot
S,s: single, user mode
dans /etc/inittab: id:5:initdefault
dans /etc/inittab
id:[niv]:action:commande
id: identifiant de la ligne
niv: liste des runlevels sans séparateurs
action: type d'action à effectuer (p361)
commande: commande à éxecuter
### changement de runlevel
```bash
$ /sbin/init
$/sbin/telinit 5
# -q: relit /etc/inittab
# -U: init se lance sans relir inittab et sans changer niveau
# -t
# donne niveai d'éxecution
$ runlevel
# precedent actuel
paramétrage système de base
quelques soit le runlevel, init lance toujours la commande associée aux actions: sysinit, bootwait ou boot RH: si::sysinit:/etc/rc.d/rc.sysinit OpenSUSE: si::bootwait:/etc/init.d/boot Debian: si::sysinit:/etc/init.d/rcS
niveaux d’éxecution
/etc/init.d/rc prend runlevel en param et s’occupe de tout
gestion des niveaux et services
- runlevel défnit les services à démarrer
- script rc qui les charge
- services controlés par: start, stop, reload, status avec les scripts dans /etc/init.d/
- pour chaque runlevel, existe répertoire rcN.d qui contient liens symb vers les services presents dans /etc/init.d
RH: /etc/rc.d/rcN.d et liens sur /etc/rcN.d OpenSUSE: /etc/init.d/rcN.d sachant que /etc/rc.d pointe sur /etc/init.d Debian: /etc/rcN.d
Les liens sont présents dans les rcN.d ont des noms particuliers [SK]NNservice S: start K: kill NN: ordre démarrapge/arrêt (00: premier, 99: dernier) service: nom du service
Quand on execute rc, il liste tout les services à stopper et les stoppes, ensuite tout ceux à démarrer et les start.
contrôle manuel des services
utiliser les scripts de /etc/init.d/*
$ /etc/init.d/ssdd start
# stop
# probe: faut-il reload apres modif de la conf ?
# reload, forcereload
# restart
# try-restart: restart SSI arrêt à bien fonctionner
# via commande service
$ service sshd stop
# conseiller d'utiliser ce system, que d'appeler directement les scripts
Modification des niveaux d’éxecution
RH, SUSE
# ajouter, supprimer, activer, désactiver des services par niveau d'éxecution
$ chkconfig
# --list [service]: affiche [toute] la conf
# --add service
# --del service
# --level xxx service on/off: activer pour level
$ chkconfig --level 35 smb on
Debian
# crée des liens dans les rcN.d
$ update-rc.d
# ajoute service avec param par défaut: start en 2 et 5
# stop en 0,1,6
# en position 20
$ update-rc.d ssh defaults
$ update-rc.d ssh start 10 3 4 5 . stop 05 0 1 6
# supprimer
$ update-rec.d -f ssh remove
console virtuelle
défini dans /etc/inittab dispo dans /dev/ttyN N: num de consol depuis console: Alt + Fn depuis X: Ctrl + Alt + Fn Alt + -> ou Alt + <- 6 dispo par défaut x window est lancé par défaut sur la premiére dispo (la 7)
login
- terminaux lancés par init
- prompt attend saisie du nom
- affiche /etc/issue
- validation
- execution de la commande login
- qui attend mdp
- si mdp ok, affiche /etc/motd
- execute shell de /etc/passwd
pas de fork mais substitution (exec), init sait facilement qu’une connexion est terminée
arrêt
$ init 0
$ init 6
# mais pas supe
# appel init
$ shutdown
# -k: envoi juste message à tout le monde
# -r: reboot
# -h: halt
# -f: enpêche fsck au boot
# -F: force fsck
# -c: annule le shutdown sans délai
$ shutdown -r +10 "Reboot dans 10 min"
$ shutdown -c "Maintenance annulée"
$ halt # = shutdown -h
$ reboot # = shutdown -r
systemd
- system deamon
- système d’initialisation
- lance processus au démarrage
- les gérer tout au long de leur exécution
- conçu pour tourner avec le noyau Linux
Processus systemd
- premier processus lancé
- dernier à s’arrêter
- PID 1
- PPID 0 (noyau)
Histoire
- successeur d’init System V, (
init
) - successeur d’
upstart
» (développé par Canonical (Ubuntu)) - systemd est réputé pour être plus performant que ces derniers
systemd manipule des units
qui sont de différents types:
- cibles ou
targets
services
Les units
sont dans /lib/systemd/system/*
sous forme de fichiers.
Dans systemd
, il n’y a plus réellement de notions de « runlevels
», ou niveaux d’exécutions, initialement présent dans init System V. Ces niveaux sont remplacés par des tagets
. On peut encore trouver des traces de runlevels
, mais sont souvent utilisées pour assurer une retro compatibilité avec « init
». Systemd est complètement compatible avec init
, mais l’inverse n’est pas vrai.
Voici les correspondances entre les runlevels et les targets de systemd
:
init (runlevel) | systemd |
---|---|
0 |
poweroff.target |
1 |
rescue.target |
2/3/4 |
multi-user.target |
5 |
graphical.target |
6 |
reboot.target |
Pour connaitre le runlevel d’une machine: $ systemctl get-default
On remarquera que la cible « default.target
» qui se trouve dans /lib/systemd/system/*
est un lien symbolique qui pointe vers le « .target
» du runlevel actuel.
Changer runlevel : $ systemctl set-default multi-user.target
. Ce qui aura pour effet de simplement modifier le lien symbolique de default.target.
Appliquer la nouvelle cible à l’exécution courante: $ systemctl isolate multi-user.target
Requires: dépendances obligatoires After: exemple d’ordre
# lister les cibles ou services actifs
$ systemctl list-units -–type target
$ systemctl list-units –-type service
# afficher toutes les cibles ou services
$ systemctl list-units -–type target –all
$ systemctl list-units –-type service –all
# afficher une liste complète
$ systemctl list-unit-fils –-type target/service
$ systemctl list-unit-fils –-type service
# gérer un service
$ systemctl status sshd
$ systemctl start sshd
$ systemctl stop sshd
$ systemctl reload sshd
$ systemctl enable sshd
$ systemctl disable sshd
$ systemctl is-enabled sshd
# afficher les dépendances d’une unité
$ systemctl list-dependencies –-before ssh
$ systemctl list-dependencies –-after ssh
# gérer la machine
$ systemctl halt
$ systemctl poweroff
$ systemctl reboot
$ systemctl shutdown
# Masquage
# un service désactivé (disabled) et stoppé, peut tout de même tourner car il peut être issu d’une dépendance. On peut interdire ce comportement avec :
$ systemctl mask sshd
$ systemctl unmask sshd
Remarque : l'activation d'un service ajoute un lien vers l’unité active vers le `.taget.want/` actuel.
### upstart
```bash
remplace init par ubuntu, système d\'évenements
conf /etc/init, syntax spécifique + code shell
$ start, stop, restart, status ssh
# controler services
$ initctl list
$ initctl emit runlevel
Consulter les traces système
dmesg
$ dmesg -T: affiche temps $ dmesg -k: -lwarn,err
/var/log/messages et /var/log/syslog
kernel + services geré par syslog
journalctl
$ journalctl -k -p warning,emerge $ journal -k = dmesg
Serice et modules noyau
présentation
noyau linux (linus T) + outils GNU noyau monolithique: fonctionnalités et composants sont regroupés dans programme unique depuis v 2.0 devenu modulaire kernel dans /boot vmlinuz-X.Y.Z.p-Vtxt uname -r
uname
unix name
$ uname
# -m: machine type materiel
# -n: nodename: hostname
# -r: release, num noyau
# -s: system name, nom OS
# -p, processor, type processor
# -i: plate forme materiel
# -v: versio
# -a: all
gestions des modules
dans /lib/modules/$(uname -r) fichiers en .ko (kernel object)
# tous les mod avec leur dépendances
$ lsmod
# nom taille nb_utilisateurs depandances
# affiche cotenu de /proc/modules
# màj arbre de dépendances
# en modifiant /lib/modules/$(uname -r)/modules.dep
$ depmod
# aprés installation de mudoles
$ depmod -a
# info
$ modinfo [parpot]
# alias pour connaitre les périph qu'il doit gérer
# les param sont passés au modulle via les commandes insmode ou modprobe à l'aide du fichier /etc/modprobe.conf ou dans le .d/*
# charge module mais ne s'occupe pas des dépendances
$ insmod lp.ko
# -k: autoclean des modules non utilisés
# avec param
$ insmod wcvideo.ko trace=5
# decharger module, ne gére pas les dépendances
$ rmmode perpot
# charge module + toutes ses dépendances
# avec param dans /etc/modprobe.conf
# ou /etc/modprobe.d/*
$ modprob
# -r: decharge + dépendances si pas utilisées
# confi toujour dans le .d en /etc/modprobe.d/*.conf
# système d'aliases
Chargement des modules au boot
initial ramdisk initrd: permet de stocker module necessaires au boot car les modules sont dans le DD alors qu’on a pas le module pour monter
- un initrd par noyau
-
son contenu: zcat /boot/initrd…. cpio -id –no-absolute-filenames - execute le sciprt init à la racine pour charger modules nécessaires
- puis passe la main à /sbin/init
construire initrd
RH, SUSE: mkinitrd Debian: mkinitramfs on peut y ajouter des modules
maintenant initramfs conf: /etc/initramfs-tools $ mkinitramfs -o /tmp/initrd-$(uname -r)
FS virtuel
/proc /sys FS virtuel avec info sur le système avant proc tout seul pas de place mémoire
sysctl
systemd-sysctl appel sysctl pour faire modif permanente dans /etc/sysctl.co,f ou .d sysctl -a net.ipv4.ip_forward=1
Compiler un noyau
noyau vanilla: brut sources, configurer, compiler, installer installer xz-utils tar tvJf linux-… source dans /usr/src/linux ou /usr/linux-sources-… ou /usr/src/kernels
récupérer les sources
D: linux-sources-x.y… RH: kernel-sources
config
avec le .config y: intégrer au noyau m: compiler en module n: fonctionnalité abscente
config des anciens noyaux dans /boot peut le copier et le réutiliser pour le nouveau ensuite make oldconfig + question pour màj
make menuconfig + interface avec choix et génére le .config make xconfig: graphique
p416: optimisation en désactuvant modules
compilation
make -j 3 long
installation
make modules_install # install modules dans /lib/modules/noyau make install # recopie noyau dans /boot
si pas de initrd cd /boot mkinitramfs -o initrd.img-4.9…
si nouveau noyau non pris en compte: grub-mkconfig -a /boot/grub/grub.cfg
make clean # supprimer fichiers objets
sous yum: make rpm pour créer packahe source, header, noyau
les fichiers periph
dans /dev créer fichier spécial mknod /dev/periph
Connaitre son matériel
bus PCI: lspci -v: details -s: spécifier adaptateur $ lspci -v -s 02:00.0
bus USB: lsusb -d: info -v: info
kwinfo –short, –cpu –memory BIOS dmidecode -t processor
udev, fs dynamique, remplace devfs
gere tout /dev est composant de systemd lancé comme service classique noyau génère des events et udev les lit et les interpréte régles dans /etc/udev/rules.d ou /lib/udev/rules.d
périph controlé par udev: udevinfo –query=all -n /dev/sda ou udevadm info –query=all -n /dev/sdb
Les tâches administratives
Administration des utilisateurs
identification: savoir qui est qui, pour connaitre les droits (login) authentification: apporter preuve de qui on est (mdp)
utilisateur = login + UID + GID les UID et GID sont dans tables de inodes GID: groupe principal UID < 100: comptes spéciaux UID de root = 0 UID > 100, 500, 1000: user normal /etc/login.defs
groupe primaire: utiliser pour créer les fichiers $ id mourad
/etc/passwd: liste de user login password -> x: /etc/shadow et !: compte vérouillé UID:GID:comment:home directory:shell
/etc/group nom:password:GID liste des users dont c’est un groupe secondaire mdp sur un groupe pour éviter de passer en groupe primaire avec newgrp
/etc/shadow login mdp $xx$: type de chiffrement nb jours depuis 1 janvier 1960 du dernier changement de mdp nb jours avant lesquels le mdp ne peut pas être changé (0: peut être changé n’importe quand) nb jours après lesquels le mdp doit être changé nb jours avant l’expiration du mdp durant lesquels l’utilisateur doit être prévenu nb jours aprés experiration le compte est désactivé nb jours depuis 70 desactivation reservé
$1$: MD5 $2a$: Blowfish $5: sha-256 $6: sha-512 autres: DES
man crypt
/etc/gshadow c’est /etc/shadow pour les groupes nom du groupe:mdp:admin du groupe:membres
Gestion des utilisateurs
ajout
ajouter lignes dans /etc/passwd /etc/shadow /etc/group /etc/gshadow copie de /etc/skel changer droits de la copie changer mdp
possible à la main, mettre à jour: vipw
$ useradd mourad -m: créer home directory -u: préciser UID -g: préciser group principal -G: groupe additionnels, séparés par virgule -d: chemin home directory -c: commentaire -k: chemin vers le skel -s: shell, avec chsh -p: mdp chiffré, avec passwd
créer mdp $ passwd mourad
sécurité des mdp
passwd: gérer /etc/shadow module PAM peut imposer contraintes sur le mdp root peut changer sans contraintes
gérer info de validalité du mdp
passwd et chage chage -l mourad: info
modif:
usermod, même option que useradd
-L: lock du compte
-U: unlock
-e
$ chage mourad : intéractive pour changer les dates $ chage -l mourad: info date pour user
suppression
userdel -r: supprime home directory
Gestion de groupe
ajout
groupadd -g: GID
modif
groupmod -n: renommer -g: GID, le groupe d’appartenance des fichiers n’est pas modifié
suppression
groupdel vérifier d’abord que ce n’est pas le groupe principale d’un user et ensuite supprimer vérifier traces du groupe dans tout le système
mdp
gpasswd test gpasswd -a seb test ajouter seb dans groupe test
gpasswd -M seb,steph test # membres groupe gpasswd -A admin test
commandes additionnelles
conversion des fichiers
pour migration sur system qui ne supporte que passwd et non shadow shadow + passwd -> unique passwd avec pwunconv (plus de durée de validité des mdp) pwconv fait l’inverse groupe: grpconv et grpunconv
vérifier la cohérence
pwck: vérification de passwd et shadow grpck
vérifier les connexions
lastlog se base sur /var/log/lastlog -u: user -tn : des n derniers jours
last se base sur /var/log/wtmp ip, date co, date deco, durée co, status
Action de l’utilisation
chsh -l: affiche /etc/shells -s: /bin/sh
chfn: change commentaire
newgrp mon_groupe: change groupe principal temporairement qui doit être secondaire ou avoir mdp newgrp seul: revenir en arrière
changer identité su (substitute user) su - seb: charger en + l’environnement su -c “make install” sg pour les groupes
intéroger système getent: intérogger les systèmes en passant par ses biblio NSS(name server, switch sans passer pas fichiers locaux mais par LDAP, NIS, AD) getent passwd getent shadow getent group getent gshadow
configuration avancée /etc/login.defs: utilisé par pas mal de commande pour des valeurs par d”faut ou régles
notification à l’utilisateur /etc/issue: message d’accueil /etc/issue.net: message d’accueil depuis ssh /etc/motd: message of the day wal, write et mesg wall: pour tous les users write: pr 1 utilisateur mesg y/n; recevoir ou non les messages
l’environnement utilisateur
/etc/skel (skeleton): copié dans les homes /etc/profile: définit PATH, LOGNAME, USER, HOSTNAME HISTSIZE, MAIL, INPUTRC /etc/profile.d/* ~/.bash_profile ~/.bashrc /etc/bashrc
apercu de PAM
pluggable authentification modules ensemble de modules, biblio, pour mettre en place des systèmes d’authentification avancés unix classique, LDAP, AD
l’impression
principe
3 standards sous Unix, sous sytem V, sous BSD imprimantes dans /etc/printcap avec file d’attente (queue) pour imprimer documents formatés ou images, il faut (pilotes) filtres d’impression entre le doc et la communication prendre imprimante compatible avec Postscript
system V: lp BSD: lpr
CUPS: commun unix printing system système d’impression Unix orienté réseau, IPP avec HTTP cupsd localhost:631 /etc/cups/cupsd.conf
Automatisation
avec cron
avec crontab crontab -e: editer tab perso sont dans /var/spool/cron/* service cron doit tourner min heure jour_du_mois mois jour_semaine cmd 15 ou 15,16,20 ou 15-30 ou * 0: lundi */5: toutes les 5 min 2-57/5: 2,7,12,… crontab -l: crontabs actives crontab -r: supprimer crontab -u user: editer
crontab système + utilisateur /etc/crontab on peut préciser var. d’environnement run-parts: prend en param un repertoire et exécute tous les programmes qui sont à l’intérieur logrotate: effectue sauvegarde et renomme fichiers de logs et journaux tmpwatch: chargé de nettoyer le sys de fichiers inutilisé (/tmp) /etc/crond.d/ au système
contrôle d’accés /etc/cron.allow /etc/cron.deny
avec at
atd (at deamon) modif vilatiles at 21:20: donner commandes et EOL at -f /home/seb/test.sh 21:25 heure: hhmm ou hh:mm MMJJAA ou xx/xx/xx …
batch: execute lorsque la charge de la machine est basse atq (at queue): tâche programmés /var/spool/atjobs: 1 executable par tâche atrm 10: supprimer un job
contrôle d’accés /etc/at.allow /etc/at.deny
avec anacron
/etc/anacrontab anacron peut remplacer cron sur machine souvent éteinte cmd exécuté dés que la période est atteinte ou dépassée execution périodique periode delai identifiant cmd 7 10 cron.weekly nice runparts –report /etc/cron.weekly tous les 7 jours, 10 min après le lancement
Les traces (logs) du sytème
principe
services spécialisés dans la réception de message pour les logs klogd: kernel log deamon, emis par kernel syslogd: sys log deamon, emis par services (+ un peu kernel) journald: composant de systemd, tout service (syslog-ng ou rsyslog)
klogd gére logs emis par noyau
- 2 src d’accés: /proc (/proc/kmsg): s’il est présent,
- appels système via API (sys_syslog) si /proc est absent, ou explicite
message noyau avec niveaux 0: EMERG: sys inutilisable 1: ALERT: action doit être prise immédiatement 2: CRIT: prob. critique 3: ERR: erreur 4: WARNING: avertissement 5: NOTICE: normal mais nécessite attention particulière 6: INFO: info standard 7: DEBUG: trace debug noyau
klogd: envoi 0-6 à syslogd 7: ne sont pas tracés par défaut
configuration syslog
/etc/syslog.conf permet de définir l’origine, l’importance et la dest de chaque message, sous forme de 2 champs l’origine: auth,authpriv: secu et authentification cron: service cron deamon: demons sys kern: noyau lpr: service d’impression mail: messagerie news: le réseau syslog: syslog lui-même user: message des process utilisateurs uucp: Unix to Unix CoPy local 0->7: issus de klogd
l’importance emerg alert crit err warning notice info debug none: ignorer les mess
la destination fichier
envoyer message à syslogd avec “logger”
cas de rsyslog
/etc/rsyslog.conf
systemd et journal
journal démarré par systemd avec des avantages stocké en binaire dans /run/log/journal le FS /run est volatile, vidé à chaque redémarrage, on des places vers /var mkdir /var/log/journal systemd-tmpfils –create –prefix /var/log/journal systemctl restart systemd-journald commande journalctl pourexploitation /etc/systemd/journal.conf options: p486
les fichiers de traces
/var/log
journalctl
accéder aux traces stockés par journalctl journalctl -f: tail -f journalctl _SYSTEMD_UNIT=ssh.service ajouter option à la fin since: -S “2017-01-29 09:00:00” until: -U “2017-01-29 09:00:00”
-o: modifier format de sortie
Archivage et backup
les outils de sauvegarde
tar: fichier et arborescences (ou cpio) dd (dump): sauv physqiue de disque ou de FS sauv incrémentale (première grosse et des petites) autre solution Networker plan de sauvegarde les trucs à protéger ?
autres commandes
mt: contrôle d’une bande magnétique touch: màj date de last modif pour forcer sauv. incrémental find: selectionner fichiers à sauv compress et uncompress des fichiers gzip, gunzip, zcat xz, unxy, xzcat
tar
simple et efficace pour créer archives tar cvf desktop.tar Desktop/ -c: créer archive -v: verbeu -f: nom archive
lister: tab tcf desktop.tar
resauration tar xvf desktop.tar -x: extraction
autres param compression: -z: gzip -Z: compress -j: bzip2 -J: xy
tar cvzf desktop.tar.gz Desktop/
cpio
sauvergarde sur la sortie standard les fichiers de sont entré standard (redirection) ne compress pas les archives cpio -oL -o: output, création de la sauv en sortie -L: sauvegarder les fichiers et pas les liens s. -v: verbose -c: sauvegarder des attributs des fichiers ss-forme ASCII find Desktop -rpint | cpio -ocv | gzip > archive.cpio.gz
lister cpio -it archive -i: lecture de l’archive en entrée -t: lister contenu cat archive.cpio.gz | gzip -cd | cpio -it restaurer prec + | cpio -iuvd
dd
device to device copie physique, bloc par bloc d’un fichier periph vers un autre créer fichier vide de 1Mo dd if=/dev/zero of=vide les=446 count=1024 count: nb blocs à copier
l’horloge
connaitre l’heure date strftime en C date avec pleins d’options
NTP
network time protocol synchro de horloges
les param régionaux
dpkg-reconfigure locales LANG D,U: /etc/default/locale RH: /etc/locale.conf SuSE: /etc/sysconfig/language
LANG=fr_FR.UTF-8 langue_Pays[.norme][@variante]
export LANG=en_US.UTF-8
supporté par système: locale -a /usr/share/locale toutes les variables LC implique format mais LANG les surclasses
fuseaux horaire, timezone
D,U: dpkg-reconfigure tzdata ou timedatectl RH7: timedatectl RH6: system-config-date, redhat-config-date autres: timedatctl
/etc/timezone continent/ville /etc/localtime binaire,info sur timezone avec decalage + changement d’heures
les fichiers de conf des timezones /usr/share/zoneinfo /usr/share/zoneinfo/Europe/Paris lins s. de /et/localtime lors de config echo $T2
codage des caractères unicode pour tout simplifier unicode UTF-8 iconv -f WINDOWS-1252 -t UTF8 nom_fichier
ACL
Be able to add a right system to classic POSIX system (owner, group, other).
$ setfacl -m u:mourad:rx ./mon_fichier
$ setfacl -m g:grp_admin:rwx ./mon_fichier
$ setfacl -bm u:mourad:rx ./mon_fichier # default
$ setfacl -Rbm u:mourad:rx ./mon_fichier # reccursive
$ getfacl ./mon_fichier
setfact -b # delete all permission
setfact -k # delete just default permission
setfact -x u:mourad:rx # delete particular line
Colors
NC='\033[0m' # Aucune couleur
Red='\033[0;31m'
Green='\033[0;32m'
Yellow='\033[0;33m'
LINE="____________________________________________________________"
if [ ! -f /home/test.txt ]; then
#touch /home/test.txt
if [ $? -eq 0 ]; then
echo -e "${LINE} [${Green} OK ${NC}]\rCreating /home/test.txt "
else
echo -e "${LINE} [${Red} FAIL ${NC}]\rCreating /home/test.txt "
fi
else
echo -e "${LINE} [${Yellow} ALREADY EXISTS ${NC}]\rCreating /home/test.txt "
fi
Userdel
On veut supprimer l’utilisateur jean
# lock account
passwd -l jean
# backup
tar -zcvf /var/backup/account/deleted/j/jean.$uid.$now.tar.gz /home/jean/
# running process
ps -fp $(pgrep -u jean)
killall -KILL -u jean
# delete jobs
find /var/spool/at/ -name "[^.]*" -type f -user jean -delete
# delete cron jobs
crontab -r -u jean
# remove printf jobs
lprm jean
# find all files
find / -user jean -exec chown newUserName:newGroupName {} \;
# finally delete user
userdel -r jean
cron
# éditer la crontab
$ crontab -e
# afficher le contenu
$ crontab -l
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user command to be executed