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
-
email des enseignants
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 :
-
la racine du système (répertoire) est identifiée par le caractère "/" ("slash")
-
tout autre répertoire est identifié par la séquence des répertoires qui le contiennent, en partant de la racine, en séparant les répertoires par le caractère "/". Par exemple "/usr/local/bin". (On peut ajouter un caractère "/" final sans modifier la signification : "/usr/local/bin/")
-
un fichier est identifié par le chemin absolu du répertoire qui le contient (avec un "slash" final), suivi du nom complet (avec l'extension) du fichier : "/usr/local/bin/slock".
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 :
-
à votre répertoire personnel,
-
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
-
RÉPERTOIRE est le répertoire à partir duquel on veut chercher (chemin relatif ou absolu)
-
CONDITIONS donne les conditions recherchées :
-
la condition la plus simple est
-name "MOTIF"
qui permet de rechercher les fichiers dont le nom correspond à un motif, -
la condition
-size +13k
permet de rechercher les fichiers dont la taille est supérieure à 13kio, -
la condition
-mtime -3
permet de rechercher les fichiers qui ont été modifiés pendant les trois derniers jours, -
...
-
-
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...
-
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.)
-
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.
-
Vous pouvez télécharger des fichiers directement depuis la ligne de commandes avec
wget
:$ wget URL
-
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 ? -
Regardez la représentation binaire des deux fichiers (avec
xxd -b
) : à quoi correspond la différence constatée avecxxd
? (table des caractères ASCII)
2.2. Autres caractères
Les caractères accentués n'existent pas en ASCII. Ils sont codés :
-
soit en utilisant le bit de poids fort de l'octet correspondant (codages "ISO-8859-...")
-
soit en utilisant plusieurs octets pour un caractère (codages "UTF-8" ou "UTF-16")
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
-
UTF-8 ou Unicode (suivant votre navigateur),
-
latin1 ou ISO-8859-1 ou ISO-8859-9 ou ISO-8859-15 ou Occidental (suivant votre navigateur).
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 "É"
-
en UTF-8,
-
en ISO-8859-1.
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.
-
Que se passe t'il si vous affichez les 100 premiers / 100 derniers octets dans le terminal avec les commandes
head -c100
ettail -c100
? -
Que se passe t'il si vous affichez l'intégralité du fichier dans le terminal avec la commande
cat
? -
Que se passe t'il si vous affichez le fichier avec la commande
xli
,display
,eog
ougimp
? (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
"⎼␊⎽␊├
"
-
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 ">".
-
Ouvrez le fichiers lac.hexa dans un éditeur de texte (
nano
ougedit
). 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.
-
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 avecxli
,display
,eog
ougimp
.Qu'en pensez-vous ?
Proposez une explication ?
-
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 ........
-
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 avecxli
,display
,eog
ougimp
.Qu'en pensez-vous ?
-
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 ......................................
-
Reconvertissez le fichier modifié lac.hexa en binaire dans un nouveau fichier lac4.image et visualisez le résultat avec
xli
,display
,eog
ougimp
.Qu'en pensez-vous ?
-
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 ......................................
-
Reconvertissez le fichier modifié lac.hexa dans un nouveau fichier lac5.image et visualisez le résultat avec
xli
,display
,eog
ougimp
.Qu'en pensez-vous ?
-
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
-
Reconvertissez le fichier modifié lac.hexa dans un nouveau fichier lac6.image et visualisez le résultat avec
xli
,display
,eog
ougimp
.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
-
lac.image
-
lac2.image
-
lac3.image
-
lac4.image
-
lac5.image
-
lac6.image
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
-
Vérifiez que vous êtes bien "propriétaire" de vos fichiers. Quel est votre "nom" pour l'ordinateur ?
-
À 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 :
-
droits d'accès pour l'utilisateur propriétaire du fichier,
-
droits d'accès pour le groupe propriétaire du fichier (un groupe regroupe plusieurs utilisateurs),
-
droits d'accès pour le reste du monde.
Il y a 3 types de droits d'accès :
-
droit de lecture ("Read") pour les accès en lecture,
-
droit d'écriture ("Write") pour les accès en écriture,
-
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 :
-
suppression du droit "Write" à l'utilisateur ("User") :
$ chmod u-w FICHIER
-
ajout du droit "Write" au reste du monde ("Other") et suppression du droit "Read" à l'utilisateur ("User")
$ chmod o+w,u-r FICHIER
-
suppression du droit "Read" pour tout le monde
$ chmod -r FICHIER
-
...
-
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
parhead
outail
pour avoir le début ou la fin du fichier...)
-
Créez un fichiers test.txt contenant la chaine "Bonjour".
-
Notez ses droits d'accès, et vérifiez que vous pouvez modifier le fichier.
-
Enlevez le droit d'écriture (pour le propriétaire) sur ce fichier :
-
pouvez vous le visualiser ?
-
Pouvez vous le modifier ?
-
Pouvez vous le supprimer ?
-
-
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 ?
-
-
À 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".
-
Créez quatre répertoires D--, Dr-, D-w et Drw, contenant chacun un fichier test.txt avec la ligne "coucou".
-
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.
-
-
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
-
Quelle est la taille, en octets, des deux fichiers ?
-
Quelle est la place occupé sur le disque par ces deux fichiers ?
-
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 :
-
le fichier a la taille (de données) donnée à la commande (TAILLE peut utiliser les unités habituelles : k pour kibioctet, et M pour mebioctet),
-
le début du fichier contient la chaine "START",
-
la fin du fichier contient la chaine "END",
-
il n'y a "rien" entre les deux.
Créez un fichier de 100 octets avec le programme create_sparse_file.py et
-
vérifiez ses deux tailles,
-
son contenu (avec la
xxd
).
Créez un fichier de 29kio octets avec le programme create_sparse_file.py.
-
Quelle est sa taille, donnée par
ls -lh
? -
Quelle est sa taille, donnée par
ls -sh
? -
Qu'en pensez vous ?
Recopiez le fichier (avec la commande cp
) dans le même
répertoire, avec un autre nom.
-
Quelle est la taille de la copie, donnée par
ls -lh
? -
Quelle est la taille de la copie, donnée par
ls -sh
? -
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...