Linux init


Le kit de démarrage


Manigancé par Benoit

Un peu d'histoire

Histoire de GNU/Linux

Les systèmes UNIX et l'informatique répartie

  • Autrefois, les ordinateurs étaient très chers.
  • Ils étaient utilisés par plusieurs personnes simultanément.
  • Un compte privilégié : root.
  • Et des utilisateurs.
  • Qui travaillent simultanément.
Mainframe

=> Un système Unix est Multi-utilisateurs et Multi-tâches.

Noyau Linux et projet GNU

  • Richard Stalmann et le Projet GNU
  • Linus Torvald et le noyau Linux

GNU Linux

Distributions et environnements graphiques

  • Des centaines de distributions GNU/Linux
  • Plusieurs environnements graphiques

Arborescence Knoppix
Arbre des distributions linux

Les distributions GNU/Linux

  • Debian : Ubuntu, Linux Mint
  • Ubuntu : Linux Mint, Elementary OS, Bio-Linux
  • RedHat : Fedora, CentOS, viperr
  • Arch Linux : Manjaro
  • Slackware : Suse Linux
  • Et beaucoup, beaucoup d'autres...
Logo Distros

Les environnements graphiques

  • Gnome
  • Kde
  • Cinnamon
  • Mate
  • Xfce
  • Lxde
  • Et bien d'autres...

Logo environnements Linux

ssh : connection à un serveur


ssh benoit@ngstc.iutms.umontpellier.fr

Linux srv-04 2.6.32-042stab120.11 #1 SMP Wed Nov 16 12:05:45 MSK 2016 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
                        
  • Sous Window, plusieurs applis dispo, par exemple putty ou MobaXterm.
  • À partir de Windows 10 (avec Fall Creators Update), un client ssh natif est disponible (mais à installer).

Installer putty

  • Télécharger putty : cliquez ici
  • Double-cliquer sur l'icône pour le lancer
  • putty.exe
  • Saisir l'adresse dans le champs "Host Name"
  • Cliquer sur le bouton Open

Syntaxe des commandes


                        commande options arguments
                    
  • Attention à la casse
  • Respecter les espaces
  • options courtes : une lettre précédée d'un tiret
  • options longues : un mot précédé de double tiret

who                     # Une commande sans options ni arguments
ls /etc                 # la commande ls, sans option mais avec un argument
id --help               # une option au format long
head -n 5 /etc/hosts    # ici, une commande avec une option et un argument
cp /tmp/fic.txt $HOME   # pas d'options mais deux arguments
tar xvf archive.tar.gz  # xvf sont trois options, tar n'impose pas le tiret
                    

Utiliser le shell bash

  • plusieurs shell : sh, ksh, bash, zsh...
  • Autocomplétion : tabulation
  • rappel des commandes : flèches de direction
  • la commande history
  • se déconnecter : exit ou touches ctrl + D

A l'aide !

  • Les pages de man
  • man cp
  • l'option --help
  • cp --help
  • Et bien sûr... Internet

Arborescence des systèmes UNIX

filesystem-linux

Répertoire courant, répertoire parent

  • . : représente le répertoire courant
  • .. : représente le répertoire parent


Chemin absolu, chemin relatif

  • chemin absolu : commence à la racine /, appelée root
  • chemin relatif : en fonction de l'endroit où je suis positionné

Quelques commandes

pwd : où suis-je ?


pwd
/home/jono
                        

ls : qu'y a t-il ici ?


ls
ls -a
ls -l /etc
ls -lAd /etc/*
                        

cd : je vais ailleurs


cd                          # sans argument - envoie dans son répertoire d'accueil
cd photos                   # chemin relatif - on est dans /home/jono
cd ../jono/photos           # chemin relatif - on est dans mako (par exemple)
cd /home/jono/photos        # chemin absolu - commence par un /
                        

Tout est fichier

Les types de fichier

  • - : fichier standard
  • d : répertoire
  • l : lien symbolique
  • Les fichiers cachés commencent par un point
  • Respecter la casse
  • Les extensions de fichiers n'ont pas de signification pour le noyau

ls -lA
total 20
-rw-r--r-- 1 ben ben   329 janv. 28 13:10 fic1.txt
-rw-r--r-- 1 ben ben 11133 janv. 28 13:13 .fic-hidden.txt
lrwxrwxrwx 1 ben ben    10 janv. 28 13:14 lien.json -> ../s1.json
drwxr-xr-x 2 ben ben  4096 janv. 28 13:11 rep01
                        

Manipuler les fichiers

Se déplacer

cd : change directory


cd photos                   # chemin relatif - on est dans /home/jono
cd ../jono/photos           # chemin relatif - on est dans mako (par exemple)
cd /home/jono/photos        # chemin absolu - commence par un /
                        

Créer et supprimer des répertoires

  • mkdir : créer un ou plusieurs répertoires
  • rmdir : supprime un ou plusieurs répertoires vides

mkdir rep01 rep02       # crée deux répertoires rep01 et rep02
rmdir rep02             # Supprime le répertoire rep02, s'il est vide
                        

Créer et supprimer des fichiers

  • touch : crée un fichier vide
  • rm : supprime un ou plusieurs fichiers ou répertoires

touch fictest       # crée un fichier vide
rm fictest          # supprime le fichier fictest
rm *.txt            # supprime tous les fichiers se terminant par .txt
rm -rf rep01        # supprime le répertoire rep01 et tout son contenu
                    # r : récursivité
                    # f : évite la validation par l'utilisateur
                        

Renommer et déplacer des fichiers et/ou des répertoires

mv


mv fic1 ficAutreNom        # renomme le fichier fic1 en ficAutreNom
mv fic1 fic2 rep01         # déplace fic1 et fic2 dans le répertoire rep01
mv rep01 /tmp              # déplace rep01 et son contenu dans /tmp
mv rep01 /tmp/repAutreNom  # déplace en le renommant le répertoire rep01
                        

Copier des fichiers

cp


cp fic1 fic.copie          # copie fic1 en fic.copie
                        

Les caractères spéciaux

  • * : n'importe quel(s) caractère(s)
  • ? : un seul caractère quelconque
  • mais il y en a bien d'autres...

ls /etc/*.conf      # retourne tous les fichiers se terminant par .conf
ls -l /etc/host?    # fichiers commençant par "host", suivis d'un seul caractère
                        

Caractères spéciaux : suite

  • Le dollar indique d'afficher le contenu d'une variable
  • la quote banalise tous les caractères
  • la double quote banalise les caractères, sauf le dollar, le backslash et le backquote
  • le backslash banalise le caractère suivant

echo Bonjour $LOGNAME
echo "Aujourd'hui"
echo 'Prix : 10$50'
echo Aujourd\'hui, le prix est de 10\$50
                        

Caractères spéciaux : avancé

[...], [...-...], [!....]

Afficher du texte

cat : Affiche du texte et sort du fichier


cat /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:"
                        

Afficher du texte : suite

  • more : plus élaboré que cat
  • less : plus élaboré que more
  • head : affiche les premières lignes d'un fichier
  • tail : affiche les dernières lignes d'un fichier

more /etc/ssh/ssh_config        # barre d'espace pour aller à la page d'écran suivante
less /etc/ssh/ssh_config        # q pour quitter
                                # h pour obtenir l'aide (more et less)
head /etc/init.d/cron           # affiche les 10 premières lignes
tail -20 /var/log/syslog        # afficher les 20 dernières lignes
                        

Afficher du texte : suite

wc : compte le nombre de lignes, mots et caractères


wc /etc/hosts       # retourne le nombre de lignes, mots et caractère du fichiers
wc -l /etc/hosts    # retourne le nombre de lignes du fichiers
                    # l : lignes
                    # w : mots
                    # c : caractères
                        

Recherches

  • les expressions régulières, ou regex
  • grep : recherche dans les fichiers
  • find : recherche des fichiers et répertoires

Les expressions régulières

Comme les caractères spéciaux du shell, les regexp permettent d'utiliser des caractères qui prendront une signification générique.

  • S'appliquent à certaines commandes : grep, vim, sed, awk, ...
  • . : un caractère quelconque et un seul
  • * : répétition de 0 à n fois le caractère précédent
  • .* : une séquence de caractères quelconque
  • ^ : qui commence par
  • $ : qui finit par
  • et bien d'autres...

grep : recherche dans les fichiers

La commande grep agit comme un filtre qui retourne les lignes contenant un motif de recherche.


grep API /etc/ssh/ssh_config            # retourne les lignes contenant API
grep -i api /etc/ssh/ssh_config         # ne tient pas compte de la casse
grep -vE "^$|^#" /etc/ssh/ssh_config    # lignes non commentées et non-vides
                # -v  : inverse la selection (les lignes qui ne contiennent pas)
                # -E  : Pour utiliser plusieurs critères
                # ^$  : Rien entre le début et la fin, soit une ligne vide
                # |   : pour séparer les critères de recherche
                # ^#  : qui commence par un dièse
                        

find : recherche des fichiers et répertoires

find est un outil puissant de recherche de fichiers dans l'arborescence


# Cherche tous les fichiers commençant par "init" dans /etc.
find /etc -name init*

# Cherche tous les répertoires commençant par "init" dans /etc.
find /etc -type d -name init*

# Idem, en faisant en plus une copie de chacun des fichiers trouvés.
find /etc -type d -name init* -exec cp {} {}.save \;
            # -exec : permet de lancer une commande
            # cp : la commande
            # {} : expression qui retourne à la commande le ficher trouvé
            # \; : obligatoire avec -exec
                        

Éditer du texte

de nombreux outils :

  • emacs
  • vim
  • nano
  • joe, jed, jedit, ne, etc.

Pour un usage fréquent : choisir emacs ou vim, qui sont des outils très puissant d'édition de texte, et resteront utilisable avec une connection ssh

nano : un éditeur pour débuter

  • ^ : indique la touche ctrl
  • Write Out : enregistrer
  • Exit : quitter

nano
Kit de survie de vim

Work in progress...

Work in progress

La redirection

Très utile, la redirection permet de rediriger la sortie écran vers un fichier.

  • > : redirige dans un fichier qui est écrasé s'il existait déjà.
  • >> : redirige dans un fichier en ajoutant à la fin s'il existait déjà.

# Rediriger les lignes utiles du fichier ssh_config
grep -Ev "^$|^#" /etc/ssh/ssh_config > ~/ssh_config.lite

# Ajouter une ligne à un fichier (sans l'écraser)
echo "alias lh='ls -lh'" >> ~/.bashrc
                    

Les pipelines

Également incontournable, le pipe '|' consiste à récupérer la sortie d'une commande pour la réutiliser en entrée d'une autre commande

pipe

# le résultat de 'cat' est redirigé vers la commande 'wc'
cat /etc/hosts | wc -l

# On combine souvent les pipes !
ls -l /etc/ | grep "^-" | grep "\.conf$" | tr -s " " | cut -d " " -f 9 | sort -r
                    

Créer un script

Créer un script revient à stocker plusieurs commandes dans un même fichier.

Ce fichier sera ensuite 'exécuté' comme une commande.

Contenu du script :

  • La première ligne doit indiquer l'interpréteur : #!/bin/bash
  • ensuite, on écrit les commandes

#!/bin/bash

# Espace Disque sur la racine du système de fichiers
read dd_total dd_free < <(df -h | grep "/$" | tr -s " " | cut -d" " -f2,4)

# RAM Disponible
read ram_total ram_used < <(free -m | grep ^Mem | tr -s " " | cut -d" " -f2,3)

echo -e "\n Espace disque disponible : $dd_free (sur $dd_total)"
echo -e " RAM utilisée : $ram_used Mo (sur $ram_total)\n"
                        

Utiliser le script

  • Il faut rendre le fichier 'exécutable' avec la commande chmod
  • Il faut indiquer le chemin du script. S'il est dans son répertoire courant, par ./

# Rendre le fichier exécutable
chmod +x monscript.sh

# Puis, l'exécuter, en indiquant le chemin d'accès
./monscript.sh
 
 Espace disque disponible : 272G (sur 432G)
 RAM utilisée : 1817 Mo (sur 7811)
 
                        

L'archivage et la compression

  • Archivage : agréger plusieurs fichiers en un seul
  • Compression : compresser un fichier afin de réduire sa taille

tar : archiver et désarchiver

Désarchiver un fichier compressé provenant d'internet

  • Nous allons d'abord télécharger l'archive Espace téléchargements
  • click droit sur tp-linux.tar.gz - Copier l'adresse du lien
  • télécharger le fichier avec wget (ctrl + shift + V)
  • décompresser et désarchiver le fichier avec tar

# Télécharger le fichiers
wget http://linux.hetica.net/download/tp-linux.tar.gz

# Décompresser et désarchiver l'archive
tar xvf tp-linux.tar.gz

# Afficher le contenu de l'archive
ls tp-linux
                        

gzip, gunzip, zcat : compresser et décompresser

Et d'autres commandes

  • Compresser : zip, bzip2, compress
  • Archiver : cpio

Extraire et manipuler de l'information

On a déja vu la commande grep, mais un grand nombre de commandes peuvent être utiles. Nous verrons ici les commandes tr, cut, sort, uniq, sed, et awk

tr : suppression et remplacement de caractères

La commande tr agit caractère par caractère, elle permet :

  • de supprimer des caractères
  • de supprimer des doublons de caractère collés
  • de remplacer des caractères
  • de combiner le remplacement et la supression des doublons

# supprimer des caractères
echo abracadabra | tr -d 'a'

# supprimer des caractères en doublon
echo abraacadabraaa | tr -s 'a'

# remplacer des caractères
echo abracadabra | tr 'abc' 'efg'

# supprimer les doublons et remplacer
echo abraacadabraaa | tr -s 'abc' 'efg'
                        

cut : extraire des informations par colonnes (ou champs)

Avec grep, on pouvait faire un tri par ligne, c'est à dire horizontal ; avec cut, on va faire un tri par colonne, c'est à dire vertical

  • on peut découper par caractère, ou par colonne
  • dans la pratique, on utilise le plus souvent un découpage par colonne
  • un délimiteur sépare les colonnes (tabulation par défaut)
  • 
    # Afficher les adresses IP de son ordinateur
    ip -4 -o a | tr -s " " | cut -d" " -f2,4 |tr ' ' '\t' | cut -d'/' -f1
            # -d" "     : spécifie l'espace comme délimiteur
            # -f2,4     : affiche les colonnes 2 et 4
            # -f2-4,6   : affiche les colonnes 2 à 4 et la colonne 6
                                

sort : trier par ordre lexicographique ou numérique

sort permet de :

  • trier par ordre lexicographique
  • trier par ordre numérique
  • trier par colonnes, voire par N° de caractère dans une colonne
  • utiliser plusieurs clé de tri (primaire, secondaires, etc.)

cat Edition | sort -r -k3.3 -kn4
    # -r    : ordre inverse
    # -k3.3 : tri principal, du début de la colonne 3 jusqu'à la fin de la col 3
    # -k4n  : tri secondaire, du début de la col 4 à la fin de la ligne - numérique
                            

uniq : supprime les lignes en doublon

uniq ne laisse qu'un seul exemplaire des lignes similaires, à la condition qu'elles se suivent.


# supprime les lignes en doublon
cat fichier.txt | uniq

# affiche en plus le nombre d'occurences de la ligne
cat fichier.txt | uniq -c

# n'affiche que les lignes en plusieurs exemplaires
cat fichier.txt | uniq -d
                        

sed : un outil puissant pour manipuler du texte

sed utilise une syntaxe très proche de celle de vim, il permet de faire de l'édition de texte depuis le prompt ou dans des scripts


# Remplace Dupont par Dubosc dans le fichier Edition :
sed 's/Dupont/Dubosc/' Edition

# -i : modifie directement le fichier :
sed -i 's/Dupont/Dubosc/' Edition

# g modifie toutes les occurences de chaque ligne trouvée :
sed 's/Dupont/Dubosc/g' Edition

# Ne substitue que certaine lignes, en fonction d'un motif de recherche :
sed '/Dupont/ s/Jean/Marc/' Edition

# Ne change que la 5ème ligne, ne change que les 3 premières lignes :
sed '5 s/Jean/Marc/' Edition
sed '1,3 s/Jean/Marc/' Edition
                        

awk : un outil très puissant pour manipuler du texte

awk est un outil très riche d'édition de texte en ligne de commande, avec une grande richesse fonctionnelle, au prix d'une certaine complexité toutefois.


# Affiche les lignes du fichier /etc/passwd contenant bash
awk '/bash/ { print $0 }' /etc/passwd

# Affiche les noms des utilisateurs utilisant le bash comme shell par défaut
awk -F: '/bash/ { print $1 }' /etc/passwd

# Affiche les champs 1, 2 et 3 du fichier lorsque la ligne se termine par 2 ou 3 :
awk '/[23]$/ { print $1, $2, $3 }' Edition

# Affiche les lignes du fichier Edition lorsque le champ 3 commence par 2 ou 3 :
awk '$3 ~ /^[23]/ { print }' Edition

# Affiche le numéro de ligne et les champs 1 et 2 du fichier clients :
awk '{ print NR , $1 , $2 }' Edition

# Affiche le nombre de champs de la ligne, le champs 1 et le dernier du fichier :
awk '{ print NF , $1 , $NF }' Edition

# Affiche les lignes du fichier Edition dont le champ 3 est égal à 222222 :
awk '$3 == "222222" { print }' Edition
                        

Les variables

  • Qu'est-ce qu'une variable ?
  • Manipuler des variables
  • Les variables d'environnement

Qu'est-ce qu'une variable ?

Une variable est un peu comme un tiroir, dans lequel on peut mettre une chaine de caractère, un nombre ou tout autre type de données.

On peut changer le contenu d'une variable, il reste toujours facile d'accéder à son contenu par son nom, qui lui ne change pas.

Déclarer une variable


nom="Camille Honaite"
                        
  • Pas d'espaces autour du signe '='.
  • Nom de variable : caractère alphanumérique ou underscore.
  • Nom de variable : le premier caractère ne peut pas être un chiffre.

Utiliser une variable


echo "Bonjour $nom"
echo "Bonjour ${nom}"

# Un certain nombre de variables prédéfinies existent déjà
echo $LOGNAME       # affiche le nom d'utilisateur
echo $HOSTNAME      # affiche le nom de l'ordinateurs
                        

Les variables d'environnement

Le système Linux distingue 2 types de variables : les variables locales et les variables d'environnement


# retourne toutes les variables.
set

# retourne les variables d'environnements.
env
                        

Et maintenant, a vous de jouer !

Pour réaliser les TP suivants, il faut télécharger et décompresser l'archive tp-linux.tar.gz comme indiqué dans la page sur l'archivage

TP 1 : Recherche de séquence

Un fichier SAM est le résultat de l'alignement d'une séquence avec une séquence de référence (en général un génome). Nous voulons savoir dans quels chromosomes du fichier mds-roche454.sam est présente la séquence TCGGCA, et combien de fois.


En cas de difficultés, des indices dans la page ci-dessous pourront vous aider.

Indices...

  • Indice N° 1 : la commande grep permet de trier les lignes contenant la séquence à chercher
  • Indice N° 2 : utilisez la commande cut pour n'afficher que les chromosomes
  • Indice N° 3 : Avec uniq, n'affichez qu'une seule fois chaque chromosome trouvé, en indiquant le nombre de fois qu'il est trouvé


Vous avez déjà fini ? Alors recommencez le même exercice, en remplacant le fichier mds-roche454.sam par son équivalent binaire mds-roche454.bam (plus courant).

Réponse


# avec le fichier SAM
grep  TCGGCA mds-roche454.sam | cut -f 3 | uniq -c

# avec le fichier BAM, il faut utiliser la commande samtools
samtools view mds-roche454.bam | grep TCGGCA | cut -f3 | uniq -c
                            

TP 2 : reverse complement

  • reverse : inverser l'ordre des caractères : ATCTG devient GTCTA
  • complement : remplacer les A par des T, les C par des G et inversement


Par exemple, la séquence ATGGCAdeviendra TGCCAT.

En supplément, vous pouvez réaliser un script pour réutiliser facilement les commandes utilisées

Indices...

Pour faire cet exercice, il faut utiliser une commande que l'on a pas abordée dans ce tutoriel, Cherchez la commande adéquate. Sinon, l'indice 1 fournit cette commande

  • indice N° 1 : utiliser la commande rev
  • indice N° 2 : la commande peut tenir en une ligne, avec des pipes |
  • indice N° 3 : utiliser la commande tr

Réponses...

Réponse N° 1 (ligne de commande)


echo ATcggGCuA | rev | tr "atcgATCG" "tagcTAGC"
                            

Réponse N° 2 (fichier script)


#!/bin/bash

# Si on a lancé la commande sans argument, afficher la syntaxe de la commande
[ "$1" ] || {
    echo -e "\n Syntaxe : \n $(basename $0) \n"
    exit
}

# Si on a fourni en argument un fichier contenant la séquence
[ -f "$1" ] && {
    cat $1 | rev | tr "atcgATCG" "tagcTAGC"
    exit
}

# si on a fourni en argument une chaîne de caractères
echo $1 | rev | tr "atcgATCG" "tagcTAGC"
                            

TP 3 : quels chromosomes dans le fichier manifeste ?

Le fichier manifest.txt est un fichier de design fourni par Illumina. Il est composé de trois sections :

  • un en-tête contenant des informations générales
  • une section [Probes] listant les amorces de PCR (technique amplicon)
  • une section [Targets] listant les régions à séquencer

Votre mission, si vous l'acceptez, est de lister les chomosomes de la section [Probes], puis ceux de la section [Targets], l'ojectif final étant de comparer les deux résultats.

Indices...

  • Indice N° 1 : inutile de chercher à séparer les différentes sections
  • Indice N° 2 : les commandes utiles sont cut, sort, uniq et grep


Pour un résultat plus lisible, trier les chromosomes par ordre numérique

  • Indice N° 3 : RTFM, les pages de man sont vos amies, utilisez-les

La réponse...


# Les chromosomes de la section [Probes]
cat manifest.txt | cut -f6 | grep ^chr | sort -k1.4n| uniq

# Les chromosomes de la section [Targets]
cat manifest.txt | cut -f4 | grep ^chr | sort -k1.4n| uniq