Consignes

Pour ce TP, vous devrez rendre un petit rapport au format texte comportant vos remarques ainsi que les réponses aux questions posées.

Vous pouvez faire un minimum de mise en page, mais les document Word, OpenOffice ou pdf ne sont pas autorisés !

Liens utiles

Objectifs du TP

L'objectif de ce TP est de se familiariser avec le concept de fichier et la manière dont il sont gérés par le système d'exploitation.

1. Préliminaires

1.1. Chemins absolus

Chaque fichiers ou répertoire est uniquement identifié par son chemin absolu :

Dans le shell, il est possible d'afficher le répertoire de travail avec la commande

$ pwd

(pwd sont les initiales de "print working directory".)

Donnez, dans votre rapport, le chemin absolu correspondant :

  1. à votre répertoire personnel,

  2. au fichier de votre rapport.

1.2. Motifs, retour sur la commande "find"

Les motifs shell standards sont

bash signification
* joker (plusieurs caractères, éventuellement zéro)
? joker (1 caractère)
[...] caractère parmi ...
[!...] caractère sauf ...
\? \* caractères ? *

Les jokers "?" et "*" ont une restriction : il ne peuvent pas correspondre au "." initial des fichiers cachés.

La commande find s'utilise dans le shell :

$ find RÉPERTOIRE CONDITIONS
  1. Donnez une commande qui affiche les noms de tous les fichiers Python contenu dans votre dossier personnel. Vous devrez utiliser find pour pouvoir lister même les fichiers contenus dans des sous-répertoires...

    Remarque : votre commande doit trouver tous vos fichiers Python des TP d'info201 et d'info202...

  2. Donnez une commande qui permet de lister tous les fichiers contenus dans des sous-répertoire de /usr/bin dont l'extension est un unique chiffre impair. (Par exemple, sur ma machine, /usr/bin/python2.7 doit être listé, mais ni /usr/bin/python3.4 ni /usr/bin/pip3 ne doivent être listés.)

  3. Comment pouvez-vous compter le nombre de tels fichiers facilement ?

2. Fichiers textes

2.1. ASCII

Chaque caractère ASCII est codé par un octet, ou plus précisément, par les 7 bits de poids faible d'un octet.

La commande

$ xxd -b FICHIER

permet d'afficher la représentation binaire d'un fichier.

Remarque : chaque ligne du résultat de xxd commence par le numéro (en hexadécimal) du premier octet de la ligne :

0000000: ...    # cette ligne commence à l'octet 0
0000010: ...    # cette ligne commence à l'octet 16 (10 en hexadécimal)
0000020: ...    # cette ligne commence à l'octet 32 (20 en hexadécimal)

Chaque octet du fichier est représenté dans la suite de la ligne par 8 bits (en mode binaire) ou 2 chiffres en hexadécimal (en mode hexadécimal).

Téléchargez les deux fichiers petit_fichier1.ascii et petit_fichier2.ascii.

  1. Vous pouvez télécharger des fichiers directement depuis la ligne de commandes avec wget:

    $ wget URL
  2. Ouvrez les deux fichiers (sans les modifier) avec un éditeur de texte (ligne de commande : nano, ou graphique : gedit). Les deux fichiers sont ils identiques ?

  3. Regardez la représentation binaire des deux fichiers (avec xxd -b) : à quoi correspond la différence constatée avec xxd ? (table des caractères ASCII)

2.2. Autres caractères

Les caractères accentués n'existent pas en ASCII. Ils sont codés :

Ouvrez, dans deux onglets différents de votre navigateur web, les fichiers petit_fichier.codage1 et petit_fichier.codage2.

Modifiez l'encodage des caractères (menu "affichage") des onglets correspondant. (Attention, dans certaines versions de Firefox / Iceweasel, la barre de menus est pas affichée. Il faut dans ce cas faire un clic droit en haut de la fenêtre du navigateur et cocher la case "barre de menus".)

Choisissez les codages

Quel est le fichier codé en UTF-8 ?

En utilisant la commande xxd sur ces deux fichiers, donnez le codage en binaire de la lettre "É"

3. Fichiers binaires

Les fichiers binaires sont constitués d'octets arbitraires. Le fichier lac.image contient une image binaire.

Téléchargez le fichier lac.image.

  1. Que se passe t'il si vous affichez les 100 premiers / 100 derniers octets dans le terminal avec les commandes head -c100 et tail -c100 ?

  2. Que se passe t'il si vous affichez l'intégralité du fichier dans le terminal avec la commande cat ?

  3. Que se passe t'il si vous affichez le fichier avec la commande xli, display, eog ou gimp ? (Ces programmes sont des visualisateurs d'images, ou, pour le dernier, un logiciel d'édition d'images.)

Si l'affichage de votre terminal est corrompu par des octets non imprimables:

␉▒⎽␤: 2␌ : ␌⎺└└▒┼␍␊ ␋┼├⎼⎺┤┴▒␉┌␊
⎻␤≤┴␊@└▒┤-59-14:·/Ti┌i␌␤▒⎼±␊└␊┼├⎽$
⎻␤≤┴␊@└▒┤-59-14:·/Ti┌i␌␤▒⎼±␊└␊┼├⎽$ ⎼␊⎽␊├

il est possible de lancer la commande reset pour réinitialiser l'affichage :

$ reset

Note : il est possible que les caractères que vous tapez au clavier (la commande "reset") ne soient pas affichés correctement. Ce n'est pas gênant. Dans mon cas, "reset" c'est affiché comme "⎼␊⎽␊├"

  1. En utilisant la commande

    $ xxd -g1 lac.image

    sauvegardez la représentation (en hexadécimal) du fichier lac.image dans un fichier lac.hexa. Vous devrez pour ceci rediriger l'affichage de la commande dans un fichier grâce à l'opérateur ">".

  2. Ouvrez le fichiers lac.hexa dans un éditeur de texte (nano ou gedit). Les premières lignes ressemblent à

    0000000: 50 36 0a 35 30 30 20 33 35 33 0a 32 35 35 0a 97  P6.500 353.255..
    0000010: c1 e6 80 b6 e2 7e b6 e4 78 b3 e1 79 b3 e1 7f b6  .....~..x..y....
    0000020: e2 86 b6 e2 8c b7 e1 8c b7 e1 8c ba e2 85 b8 e2  ................
    0000030: 7e b6 e1 7c b6 e4 7c b6 e4 79 b6 e4 77 b4 e2 77  ~..|..|..y..w..w
    0000040: b3 e4 77 b4 e5 77 b4 e4 78 b5 e2 77 b5 e2 77 b5  ..w..w..x..w..w.

    Modifiez, sur la première ligne, l'octet 6 en remplaçant

    0000000: 50 36 0a 35 30 30 20 33 35 33 0a 32 35 35 0a 97  P6.500 353.255..

    par

    .................... 30 32 20 ..........................

    et sauvegardez le fichier.

  3. Reconvertissez le fichier modifié lac.hexa en binaire grâce à la commande xxd -r lac.hexa. Sauvegardez le résultat dans un nouveau fichier lac2.image grâce à une redirection ">" et visualisez le résultat avec xli, display, eog ou gimp.

    Qu'en pensez-vous ?

    Proposez une explication ?

  1. En repartant du fichier lac.hexa d'origine, modifiez maintenant l'octet 12 en remplaçant

    0000000: 50 36 0a 35 30 30 20 33 35 33 0a 32 35 35 0a 97  P6.500 353.255..

    par

    ...................................... 0a 30 35 ........
  2. Reconvertissez le fichier modifié lac.hexa en binaire grâce à la commande xxd -r lac.hexa. Sauvegardez le résultat dans un nouveau fichier lac3.image grâce à une redirection ">" et visualisez le résultat avec xli, display, eog ou gimp.

    Qu'en pensez-vous ?

  1. En repartant du fichier lac.hexa d'origine, modifiez maintenant l'octet 2 en remplaçant

    0000000: 50 36 0a 35 30 30 20 33 35 33 0a 32 35 35 0a 97  P6.500 353.255..

    par

    ........ 50 35 0a ......................................
  2. Reconvertissez le fichier modifié lac.hexa en binaire dans un nouveau fichier lac4.image et visualisez le résultat avec xli, display, eog ou gimp.

    Qu'en pensez-vous ?

  1. En repartant du fichier lac.hexa d'origine,) modifiez maintenant l'octet 2 en remplaçant

    0000000: 50 36 0a 35 30 30 20 33 35 33 0a 32 35 35 0a 97  P6.500 353.255..

    par

    ........ 50 38 0a ......................................
  2. Reconvertissez le fichier modifié lac.hexa dans un nouveau fichier lac5.image et visualisez le résultat avec xli, display, eog ou gimp.

    Qu'en pensez-vous ?

  1. En repartant du fichier lac.hexa d'origine, modifiez maintenant ligne 5 en remplaçant

    0000040: b3 e4 77 b4 e5 77 b4 e4 78 b5 e2 77 b5 e2 77 b5

    par

    0000040: b3 e4 ff 00 00 ff 00 00 ff 00 00 ff 00 00 77 b5
  2. Reconvertissez le fichier modifié lac.hexa dans un nouveau fichier lac6.image et visualisez le résultat avec xli, display, eog ou gimp.

    Qu'en pensez-vous ?

À faire à la fin du TP, si vous avez le temps

Reportez vous à la description des formats PPM et expliquez les modifications qui ont été faites sur les images.

Commande "file"

Comme le montrait le fichier lac.image, l'extension d'un fichier n'est pas forcément représentative du type réel du fichier.

La commande

$ file FICHIER1 ... FICHIERn

essaie de "deviner" le type des fichiers en regardant les premiers octets.

Utilisez la commande file pour donner le type des fichiers

4. Métadonnées

4.1. Affichage des méta-données

Les méta-données d'un fichier sont obtenues en ajoutant l'option "-l" à la commande ls:

$ ls -l
...
-rw-r--r--  1 hyvernat hyvernat 10016 avril  3 07:42 enseignement.php
...

Chaque ligne du résultat se décompose comme suit :

-rw-r--r--  1 hyvernat hyvernat 10016 avril  3 07:42 enseignement.php
----------  - -------- -------- ----- -------------- ----------------
    |       |     |        |      |          |              |
    |       |     |        |      |          |              +----->  nom du fichier
    |       |     |        |      |          |
    |       |     |        |      |          +----->  date de modification
    |       |     |        |      |
    |       |     |        |      +----->  taille (en octets)
    |       |     |        |
    |       |     |        +----->  groupe propriétaire
    |       |     |
    |       |     +----->  utilisateur propriétaire
    |       |
    |       +-----> nombre de liens physiques (que vous pouvez ignorer)
    |
    +-----> droits d'accès
  1. Vérifiez que vous êtes bien "propriétaire" de vos fichiers. Quel est votre "nom" pour l'ordinateur ?

  2. À quel groupe appartiennent les fichiers que vous créez ?

L'administrateur peut modifier le propriétaire d'un fichier avec la commande

$ chown PROPRIÉTAIRE FICHIER1 ... FICHIERn

4.2. Droit d'accès

Parmi les métadonnées importantes d'un fichier se trouvent les droits d'accès. Les droits d'accès Unix sont divisés en trois sous-parties :

  1. droits d'accès pour l'utilisateur propriétaire du fichier,

  2. droits d'accès pour le groupe propriétaire du fichier (un groupe regroupe plusieurs utilisateurs),

  3. droits d'accès pour le reste du monde.

Il y a 3 types de droits d'accès :

  1. droit de lecture ("Read") pour les accès en lecture,

  2. droit d'écriture ("Write") pour les accès en écriture,

  3. droit d'exécution ("eXecute") pour l'exécution du fichier.

Nous allons ignorer le droit d'exécution pour ce TP...

La manière utilisée pour vous donner accès à vos fichiers (CIFS : "Common Internet File System") ne supporte pas le droit d'accès "exécution" sur les fichiers. Tous les fichiers et répertoires de votre répertoire personnels sont automatiquement exécutable pour tout le monde. Vous pouvez observer des fichiers sans droit "eXecute" dans le répertoire "/tmp/".

Les droits d'accès des groupes sont également gérés de manière particulière. Nous n'allons pas nous en occuper...

Ces droits sont affichés dans les premières colonnes du résultat et sont donnés par des codes:

- rw- r-- r--
| ||| ||| |||
| ||| ||| ||+-----> 'x' lorsque le monde a le droit d'exécution
| ||| ||| ||        '-' sinon
| ||| ||| ||
| ||| ||| |+-----> 'w' lorsque le monde a le droit d'écriture
| ||| ||| |        '-' sinon
| ||| ||| |
| ||| ||| +-----> 'r' lorsque le monde a le droit de lecture
| ||| |||         '-' sinon
| ||| |||
| ||| |||
| ||| ||+-----> 'x' lorsque le groupe a le droit d'exécution
| ||| ||        '-' sinon
| ||| ||
| ||| |+-----> 'w' lorsque le groupe a le droit d'écriture
| ||| |        '-' sinon
| ||| |
| ||| +-----> 'r' lorsque le groupe a le droit de lecture
| |||         '-' sinon
| |||
| |||
| ||+-----> 'x' lorsque le propriétaire a le droit d'exécution
| ||	    '-' sinon
| ||
| |+-----> 'w' lorsque le propriétaire a le droit d'écriture
| |	   '-' sinon
| |
| +-----> 'r' lorsque le propriétaire a le droit de lecture
|	  '-' sinon
|
+-----> '-' pour les fichiers
        'd' pour les répertoires
        (autre symboles pour d'autres type de fichiers)

La commande pour modifier les droits d'accès d'un fichier / répertoire est la suivante :

$ chmod MODE FICHIER1 ... FICHIERn

Vous pouvez consulter la description complète du mode en faisant

$ man chmod

Voici quelques exemples :

  • Pour les questions suivantes, il est conseillé de se positionner dans le répertoire "/tmp/".

  • Vous pouvez créer un fichier contenant uniquement la ligne "coucou" avec la commande

    $ echo "coucou" > FICHIER
  • Vous pouvez ajouter la ligne "ciao" dans un fichier avec la commande

    $ echo "ciao" >> FICHIER
  • Vous pouvez afficher les lignes d'un fichier avec la commande

    $ cat FICHIER

    (vous pouvez remplacer cat par head ou tail pour avoir le début ou la fin du fichier...)

  1. Créez un fichiers test.txt contenant la chaine "Bonjour".

  2. Notez ses droits d'accès, et vérifiez que vous pouvez modifier le fichier.

  3. Enlevez le droit d'écriture (pour le propriétaire) sur ce fichier :

    • pouvez vous le visualiser ?

    • Pouvez vous le modifier ?

    • Pouvez vous le supprimer ?

  4. Créez un fichiers test.txt contenant la chaine "Bonjour", et enlevez son droit de lecture (pour le propriétaire)

    • pouvez vous le visualiser ?

    • Pouvez vous le modifier ?

    • Pouvez vous le supprimer ?

  5. À votre avis, que se passe t'il si personne n'a aucun droit sur un fichier (ni lecture, ni écriture) ?

Les répertoires ont également les droits d'accès "Read" et "Write".

  1. Créez quatre répertoires D--, Dr-, D-w et Drw, contenant chacun un fichier test.txt avec la ligne "coucou".

  2. Changez les droits d'accès aux répertoires (sans changer ceux des fichiers) pour avoir les droits suivant pour le propriétaire :

    • D-- : ni lecture ni écriture,

    • Dr- : lecture, pas écriture,

    • D-w : pas lecture, écriture,

    • Drw : lecture et écriture.

  3. Précisez, pour chacun des répertoires, si les opérations suivantes sont possibles :

    • modification d'un fichier,

    • suppression d'un fichier,

    • création d'un fichier,

    • changement des droits d'accès d'un fichier.

5. Un peu de technique

5.1. Les deux tailles d'un fichier

La commande

$ ls -l

affiche les méta-données des fichiers, dont en particulier la taille (en octets) des données.

La commande

$ ls -s

affiche la taille occupée par les fichiers, en kibioctets.

Cette taille est différente de la précédente car chaque bloc occupé partiellement par le fichier est compté comme utilisé.

Dans les deux cas, il est conseillé d'ajouter l'option -h pour que les tailles soient affichées en utilisant les unités standards (k, M, G etc.)

$ ls -lh
...
$ ls -sh
...

Vous pouvez également avoir les deux tailles directement avec

$ ls -lsh

Créez un fichier vide avec la commande

$ touch FICHIER

(Attention, si le fichier existe, cette commande change simplement sa date de modification !)

Et un petit fichier contenant "Spock" avec la commande

$ echo "Spock" > FICHIER
  1. Quelle est la taille, en octets, des deux fichiers ?

  2. Quelle est la place occupé sur le disque par ces deux fichiers ?

  3. Copiez ces deux fichiers, ou recréez les dans le répertoire "/tmp/" et "~/homeUSMB/" et répondez aux même questions. Qu'en pensez-vous ?

5.2. Fichiers "à trous"

Le petit programme create_sparse_file.py s'utilise de la manière suivante :

$ python3 create_sparse_file.py TAILLE

permet de créer un fichier avec les propriété suivantes :

Créez un fichier de 100 octets avec le programme create_sparse_file.py et

Créez un fichier de 29kio octets avec le programme create_sparse_file.py.

  1. Quelle est sa taille, donnée par ls -lh ?

  2. Quelle est sa taille, donnée par ls -sh ?

  3. Qu'en pensez vous ?

Recopiez le fichier (avec la commande cp) dans le même répertoire, avec un autre nom.

  1. Quelle est la taille de la copie, donnée par ls -lh ?

  2. Quelle est la taille de la copie, donnée par ls -sh ?

  3. Qu'en pensez vous ?

Refaites les même opérations avec une taille de 1Mio et 10Mio. Notez le résultat et proposez une explication...