Updated Modifié

Le but de cette séance est de continuer les rappels système en abordant les sujets “shell avancé”, ressources des processus et programmation système.

Il est recommandé de prendre des notes, celle-ci pourront être envoyées à votre chargé de TP (prenom.nom@univ-amu.fr) à la fin de la journée pour avoir un retour.

Votre première VM “vagrant“

Installation plus rapide / plus “moderne”

Nous allons utiliser une nouvelle technique pour gérer une machine virtuelle avec vagrant. En fait vagrant apporte une couche d’abstraction aux logiciels de virtualisation — VirtualBox, QEmu, … — que vous avez utilisé précédemment.

On ne peut configurer les aspects “physiques” virtualisés (RAM, nombres et branchement des interfaces réseaux, …) que lorsque la machine est éteinte. Le système d’exploitation de la VM s’administre avec ses propres outils d’administration, quand la VM est démarrée.

Installation de vagrant

Comme ce logiciel n’est pas installé sur le système, nous allons l’installer dans notre répertoire bin.

$ mkdir bin

Télécharger l’archive et la décompresser dans votre répertoire bin.

Configurer votre PATH (à quoi sert cette variable shell ?) pour utiliser

$ export PATH=$PATH:~/bin

Vérifier que cela fonctionne bien avec cette commande.

$ which vagrant

Mise en Oeuvre

Ici nous utiliserons vagrant. L’image préinstallée à utiliser est à télécharger puis stocker sur /tmp/debianTP.box (en lecture seule). Cette image contient une version minimaliste de Debian/XFCE. Nous allons faire ces étapes pas-à-pas.

NB Ces indications sont valables uniquement sur les postes DOSI, adapter si nécessaire les chemins concernés sur votre propre PC.

Les disques complets de ces VMs sont gros, pour pouvoir être stockées sur votre compte, il faudra vérifier qu’il y a assez de place libre.

  1. Vérifier que vous disposez bien d’au moins 1Go de libre sur votre compte:
    $ quota -s
    
    la seconde valeur soustraite de la première doit faire au moins 2,5Go.
  2. Vérifier que vous disposez bien d’une partition locale accessible d’au moins 20 Gio:
    $ df -h /tmp
    Sys. de fichiers    Taille  Uti. Disp. Uti% Monté sur
    /dev/sda4              78G  3,1G   75G   4% /tmp   
    

  3. Compte-rendu : faire un compte-rendu de vos opérations, questions (et réponses …) afin d’avoir une trace de ce que vous avez réalisé. NB: vous devez être capable d’expliquer ce que fait chaque commande shell (ainsi que ses options).
  1. Copier l’image depuis le réseau:

    $ cd /tmp/
    $ curl -o debianTP.box https://pageperso.lis-lab.fr/emmanuel.godard/boxes/debianTP.box
    $ curl -o debianTP.box.md5 https://pageperso.lis-lab.fr/emmanuel.godard/boxes/debianTP.box.md5
    $ md5sum -c debianTP.box.md5
    

Mise en place de votre “box”

Nous allons maintenant indiquer à `vagrant` quelles images disques seront virtualisées. C’est à faire une seule fois sur la semaine.

$ vagrant box add /tmp/debianTP.box --name "m1reseaux"
// si la commande précédente échoue, cela signifie que la box est déjà en place
// Pour la supprimer: $ vagrant box remove "m1reseaux"
  • Avant de continuer, vérifier que la box est bien installée
    $ vagrant box list
    m1reseaux                       (virtualbox, 0)
    

Configuration de la VM

  • Créer un répertoire soutienSR et un sous-répertoire tp1, puis VM1
    $ mkdir -p ~/soutienSR/tp1/VM1
    $ cd ~/soutienSR/tp1/VM1
    

  • dans ce répertoire VM1, copier le fichier Vagrantfile. Il décrit les propriétés de votre machine vituelle VM1
  • lancer la VM
    $ vagrant up
    

    La connexion est automatique. Votre login est debian-tp, votre mot de passe identique.

Compte-rendu

  1. Au démarrage de la VM, lire les informations.
  2. Quels sont les paramètres “physiques” de votre VM ?
  3. Pouvez-vous vous connecter à Internet, à la page du TP avec wget?
  4. Stopper la VM avec
    $ vagrant halt
    

1. Découverte de l’environnement

1.1. Environnement graphique

Il s’agit de XFCE (que vous pouvez aussi choisir sur le système AMU), naviguez dans les menus, configurer le fond d’écran, etc …

1.2. Terminal

Lancer un terminal (lequel ? combien y en a-t-il ? comment choisir ?)

1.3. Utilisation du Shell

Le document de référence que nous allons utiliser est celui du MOOC “Maîtriser bash”.

1.3.1. La base basique

facultatif: à faire selon votre propre estimation

Lire et faire les parties 1.1 et 1.2.

1.3.2. Rappels d’utilisation

rappel : le shell est un environnement de programmation système interactif. Les paramètres des fonctions/commandes sont principalement positionnels.

La documentation détaillée se trouve

Lire et faire les exercices des parties 1.3 et 1.5.

1.4. Utilisation administrateur

1.4.1. Rappels

  1. qu’est-ce que l’administrateur ? pourquoi s’appelle-t-il root sous UNIX ?
  2. on devient root sur votre système avec la commande sudo (documentation et tutoriel),
  3. devenir root et tester la commande whoami.

1.4.2. Exercices

Effectuer les exercices droits d’accès de la partie 1.4.

Shell Avancé : Boîte à outils

Le but de cette section est d’approfondir votre connaissance du shell afin d’en faire une boîte à outils efficace. Faire les manipulations dans la VM d’abord.

Votre Shell

  1. Quel est votre shell ? (echo $SHELL) + Pourquoi ? Quels sont les autres choix ?
  2. Reprendre le début de cette page, avant les énoncés de TP. Quelles sont les personnalisations utiles que vous pourriez faire dans .bash_profile et .bashrc
    • quelles différences entre .bash_profile et .bashrc ?
    • quel est votre PATH ? À quoi cela sert-il de le personnaliser ? Quel est l’intérêt ou le risque d’ajouter . avec PATH="$PATH:./" ?
    • quelles sont vos commandes fréquentes ? Comment leur donner un nom court avec la commande alias ?

Votre “Invite”

En bash, la variable décrivant votre invite (votre prompt en franglais) principal est PS1

$ echo $PS1

Vous trouverez des propositions ici, une documentation complète en anglais. Nous vous invitons à prendre le temps d’en configurer certains à votre goût, en particulier pour tout ce qui concerne git comme par exemple celui-ci ou .

Pour aller plus loin: il existe des environnements de prompt complets comme Liquidprompt

Proposition: PS1=\[\033[01;32m\]\u@\h\[\033[01;34m\] \w\[\033[00;32m\]$(git branch 2>/dev/null | grep -e '\* ' | sed 's/^..\(.*\)/{\1}/')\[\033[01;34m\] $\[\033[00m\]

2. Programmation Système en Bash

2.1. Une application simple et efficace de sauvegarde

On souhaite (ré)écrire un script de sauvegarde incrémentielle en bash. Ce script utilisera deux variables

  • SRC : le répertoire à sauvegarder
  • SVGD : le répertoire contenant les sauvegardes sous la forme AAAA-MM-JJ_HH:MM:SS, cette chaîne correspond à la date et l’heure auxquelles est invoqué le script.

Revoir les bases et faire les exercices dans la partie 2.3 et 2.5 ainsi que 4.1.

2.2. Version simple

On va commencer par copier simplement le répertoire (et ses sous-répertoires) SRC en conservant tous les attributs systèmes (dates, propriétaires, droits d’accès …).

  • quelle est l’option de cp permettant de conserver (archiver) les attributs ?
  • il existe une commande appellée rsync. Expliquer pourquoi elle est différente de cp.
  • pourquoi faut-il lancer le script avec des droits root ?

**Corrigé**

2.3. Version efficace

On va implémenter la version dite “incrémentielle”, ie qui ne stocke que les fichiers modifiés par rapport à la précédente sauvegarde.

Rappels :

  • qu’est-ce qu’un lien ? un lien symbolique ?
  • quels sont les paramètres pour la commande ln

Le principe est de faire un lien vers la version sauvegardée précédemment lorsque le fichier n’a pas été modifiée depuis. Les fichiers modifiés sont eux copiés comme précédemment.

Avant d’écrire ce script, revoir les structures de contrôles dans la partie 4.2, 4.3 et 4.4.

Pour finir, comparer les tailles des répertoires avec la commande du -h.

**Corrigé**

3. Programmation Système via l’interface “/proc“ (Optionnel)

La programmation système est le fait d’écrire des programmes ou des scripts pour interagir avec le système. Cela peut se faire en bash, en C, en python, etc …

Il est bien sûr recommandé d’adopter les bonnes pratiques de programmation (IDE adapté, gestion de versions avec git, au moins quelques tests fonctionnels, …).

Cette partie est à faire sur l’hôte.

3.1. Rappels Compilation/Execution

3.1.1. En python

python est un langage interprété, il n’y a donc pas d’étape de compilation à proprement parler. Pour lancer un script script.py faire

  • soit $ python programme.py
  • soit ajouter #!/usr/bin/env python au début du script, et le rendre exécutable avec chmod

3.1.2. En C

Utiliser votre IDE préféré, ou bien, en ligne de commande, faire

$ gcc -c -Wall -Wextra -Werror *.c
$ gcc -o programme *.o

Ces commandes précédentes peuvent être utilement rassemblées dans un Makefile, voir des rappels sur SO.

3.1.3. En Java

En ligne de commande, on peut faire

$ javac *.java
$ java programme

ou bien sûr dans votre IDE et/ou un moteur de build comme gradle.

3.2. Entrées-Sorties

Compiler et exécuter l’exemple suivant d’entrée/sortie

Ecrire la version java.

3.2.1. Exercices

Réaliser les questions suivantes en bash, python, C et Java (dans l’ordre que vous choisirez).

  1. Un programme qui prend comme paramètre un entier n, puis lit n chaînes de caractères au clavier, puis les affiche dans l’ordre inverse d’entrée.
  2. Un programme qui prend comme paramètre un entier n, puis affiche le nom de l’exécutable associé au processus de pid n.
  3. Un programme qui affiche tous les processus et l’exécutable associé
  4. Un programme qui stocke dans le fichier oom.txt tous les processus de score OOM maximum (voir avec /proc/*/oom_score).