CSC 3102 – Introduction aux systèmes d’exploitation

Portail informatique

TP2 – Le système de fichiers

Pour faire les exercices, vous avez besoin de connaître le langage bash. Vous pouvez vous référer à l'annexe shell. Vous pouvez aussi trouver une liste d'astuces ici. Tous les exercices sont obligatoires, sauf les exercices notés « défi » ou « optionnel » qui sont optionnels. En particulier, les exercices notés « hors présentiel » sont supposés fait d'une séance sur la suivante.

Ce TP est axé sur l'utilisation des commandes de manipulation des fichiers.

Organisation de votre compte (∼15mn)

Vous êtes libre d'organiser votre compte comme bon vous semble. Cependant, même si pour l'instant vous ne possédez que peu de fichiers, nous vous encourageons à organiser dès à présent vos fichiers en répertoires. Ainsi, nous vous suggérons de créer un répertoire par module de votre cursus, lui-même organisé par séance de TP.

Positionnez-vous dans votre répertoire de connexion.
cd

Créez un répertoire nommé CSC3102.
mkdir CSC3012

Déplacez-vous dans ce répertoire.
cd CSC3012

Si vous n'avez pas utilisé l'interface graphique de votre système d'exploitation afin de créer des répertoires spécifiques, les fichiers correspondant à la première séance de TP ainsi qu'au devoir hors présentiel se trouvent dans votre répertoire de connexion.
  1. Créez un répertoire TP1_PremieresCommandes.
    mkdir TP1_PremieresCommandes
  2. Déplacez-y les fichiers correspondant.
    mv ~/bonjour.sh TP1_PremieresCommandes
    mv ~/bonjour_parametre.sh TP1_PremieresCommandes
  3. Créez un répertoire DM.
    mkdir DM
  4. Déplacez-y les fichiers correspondant.
    mv ~/calculette_uni_operation.sh DM
    mv ~/calculette_sans_priorite.sh DM
    mv ~/calculette.sh DM

Pour la séance de TP d'aujourd'hui, créez dans le répertoire CSC3102 un répertoire nommé TP2_FS.
mkdir TP2_FS

Se positionner dans le système de fichiers (∼30mn)

Le but de cet exercice est de vous faire utiliser les commandes de base de manipulation de fichiers : cd, cp, mv, mkdir et rm.

Positionnez-vous dans votre répertoire de connexion.
cd

Affichez le contenu du répertoire courant.
ls

Déplacez-vous dans le dernier répertoire créé, c.-à-d. celui correspondant au répertoire du TP2.
cd CSC3102/TP2_FS

Affichez le chemin du répertoire courant.
pwd

Affichez le contenu du répertoire parent du répertoire courant.
ls ..

À ce stade, vous devez vous trouver dans le répertoire TP2_FS. Vérifiez que c'est bien le cas et déplacez-vous y le cas échéant.
pwd
cd ~/CSC3102/TP2_FS

Sans vous déplacer, afficher le contenu de votre répertoire créé pour le TP1 en utilisant un chemin absolu.
ls ~/CSC3102/TP1_PremieresCommandes
ls /[...]/<login>/CSC3102/TP1_PremieresCommandes

Sans vous déplacer, afficher le contenu de votre répertoire de connexion en utilisant un chemin relatif.
ls ../TP1_PremieresCommandes

Créez un répertoire nommé test dans le répertoire courant et déplacez-vous y.
mkdir test
cd test

Copiez le fichier /etc/passwd dans le répertoire courant.
cp /etc/passwd .
Attention, le « . » n'est pas optionnel ! Le deuxième argument de la commande cp spécifie le répertoire de destination de la copie. Dans le cas présent, vous copiez le fichier passwd sous le même nom dans le répertoire « . », c.-à-d. dans le répertoire courant.

Dupliquez le fichier passwd dans le répertoire courant avec comme nouveau nom de fichier passwd2.
cp passwd passwd2

Regardez les numéros d'inodes de ces deux fichiers avec l'option -i de la commande ls. Expliquez pourquoi ces numéros sont différents.
ls -i passwd passwd2
Les numéros d'inodes de ces deux entrées sont différents car les contenus sont dupliqués lors de leur copie.

Renommez le dernier fichier passwd2 en dup.
mv passwd2 dup

Regardez le numéros d'inode du fichier dup et comparez-le à celui qu'avait le fichier passwd2. Expliquez pourquoi ces numéros d'inodes sont identiques.
ls -i dup
Il s'agit toujours du même inode. Le changement de nom a été appliqué dans le tableau référençant les entrées du répertoire.

Supprimez le fichier passwd (celui de votre compte bien sûr, pas celui qui se trouve en /etc).
rm passwd

Supprimez le répertoire test.
cd ..; rm -r test

Liens directs et liens symboliques (∼20mn)

Placez-vous dans le répertoire correspondant à la séance de TP2.
cd ~/CSC3102/TP2_FS

Copiez dans ce répertoire le fichier /etc/passwd et nommez-le my_passwd.
cp /etc/passwd my_passwd

Affichez le contenu du fichier my_passwd. Pour cela, utilisez la commande cat file qui permet d'afficher le contenu du fichier file sur le terminal.
cat my_passwd

Créez un répertoire nommé Liens dans le répertoire courant.
mkdir Liens

Déplacez-vous dans le répertoire Liens.
cd Liens

Sans vous déplacer, créez dans le répertoire Liens le lien direct lien.txt sur le fichier de votre répertoire courant my_passwd.
ln ../my_passwd lien.txt

Utilisez la commande ls pour afficher le numéro d'inode des fichiers my_passwd et lien.txt. Qu'observez-vous ?
ls -i ../my_passwd lien.txt
Les inodes des deux fichiers sont identiques.

Avec la commande cat, affichez le contenu du fichier lien.txt. Cela doit afficher le même contenu qu'à la question c.
cat lien.txt

Toujours sans vous déplacer, créez dans le répertoire Liens le lien symbolique lien_symb.txt sur le fichier my_passwd. Utilisez un chemin relatif pour référencer le fichier my_passwd.
ln -s ../my_passwd lien_symb.txt

Utilisez la commande ls pour afficher le numéro d'inode des fichiers my_passwd et lien_symb.txt. Qu'observez-vous ?.
ls -i ../my_passwd lien_symb.txt
Les inodes des deux fichiers sont différents.

Affichez le contenu du fichier lien_symb.txt.
cat lien_symb.txt

Déplacez le fichier my_passwd dans le répertoire Liens.
mv ../my_passwd .

Affichez le contenu des fichiers lien.txt et lien_symb.txt. Expliquez.
cat lien.txt # pas de problème : le numéro d'inode n'est pas modifié.
cat lien_symb.txt # Msg d'erreur : "Aucun fichier ou dossier de ce type" ! Le chemin stocké dans le lien symbolique n'est plus valable puisque le fichier cible a été déplacé.

De façon générale, il vaut mieux éviter d'utiliser des chemins relatifs lorsqu'on crée un lien symbolique car tout déplacement du lien dans un autre répertoire rend le lien invalide. Toutefois, utiliser des chemins relatifs dans les liens symboliques est une pratique courante lorsque l'arborescence est stable et n'est pas supposée évoluer.

Le cas échéant, réparez les liens brisés.
ln -s ~/CSC3012/TP2_FS/Liens/my_passwd lien_symb.txt

Déplacez-vous dans votre répertoire de connexion et affichez le contenu de lien_symb.txt.
$ cd $ cat CSC3102/TP2_FS/Liens/lien_symb.txt

Sans vous déplacer, déplacez le fichier my_passwd dans son répertoire parent.
mv CSC3102/TP2_FS/Liens/my_passwd ..

Affichez de nouveau le contenu de lien_symb.txt.
cat CSC3102/TP2_FS/lien_symb.txt

Droits d'accès (∼25mn)

Dans cet exercice, pensez à vérifier à chaque fois que nécessaire si les droits d'accès sont correctement positionnés à l'aide de la commande ls -l.

Créez le répertoire tmp sous votre répertoire TP2_FS et positionnez les droits d'accès à « rwx r-x --- ». À quoi correspondent ces droits ?
$ cd ; cd CSC3102/TP2_FS ; mkdir tmp $ chmod 750 tmp $ ls -l
Droit en lecture/écriture/traversée (car répertoire) pour l'utilisateur, droit de lecture/traversée pour le groupe, aucun droit pour les autres.

Copiez le fichier /etc/hosts sous tmp avec comme nouveau nom liste_hosts. Positionnez les droits d'accès à rw- r-- --- et lisez son contenu .
$ cp /etc/hosts tmp/liste_hosts $ chmod 640 tmp/liste_hosts $ more tmp/liste_hosts ## # Host Database # # localhost is used to configure the loopback interface # when the system is booting. Do not change this entry. ## 127.0.0.1 localhost 255.255.255.255 broadcasthost ::1 localhost
Pas de problème : on a le droit d'entrée dans tmp (droit x), le droit de lire son contenu (droit r) et le droit de lire le fichier tmp/liste_hosts (droit r).

Retirez pour le propriétaire le droit en lecture de liste_hosts et essayez de relire son contenu.
$ chmod u-r tmp/liste_hosts $ more tmp/liste_hosts tmp/liste_hosts: Permission denied
On a perdu le droit de lire tmp/liste_hosts.

Retirez pour le propriétaire le droit en écriture de tmp et essayez de détruire liste_hosts.
$ chmod u-w tmp $ rm tmp/liste_hosts rm: tmp/liste_hosts: Permission denied
On a perdu le droit d'écrire dans le répertoire tmp et on ne peut donc plus modifier son contenu.

Retirez pour le propriétaire le droit en lecture de tmp et essayez de lister son contenu.
$ chmod u-r tmp $ ls tmp ls: tmp: Permission denied
On a perdu le droit de lire le contenu de tmp. En revanche, on peut toujours le traverser (cd tmp ne génère pas d'erreur).

Retirez pour le propriétaire le droit en exécution (x) de tmp et essayez de vous positionner sur ce répertoire.
$ chmod u-x tmp $ cd tmp bash: cd: tmp: Permission denied
On a aussi perdu le droit de traverser le répertoire : impossible de se positionner dedans.

Positionnez pour le propriétaire les droits d'accès rwx du répertoire tmp.
chmod u+rwx tmp

Effacez tout le contenu du répertoire tmp et le répertoire lui-même.
rm -rf tmp

La commande ssh (∼30mn – hors présentiel)

Cet exercice a pour but de vous présenter la commande ssh. Cette commande vous permet de lancer un shell sur une machine distante de façon sécurisée. Elle vous sera utile pour travailler sur les machines de l'école lorsque vous n'y êtes pas physiquement. Le but de cet exercice n'est pas de vous faire un cours complet sur ssh, pour cela, nous invitons à consulter le cours se trouvant ici.

Les salles machines sont toutes connectées derrière une passerelle nommée ssh.imtbs-tsp.eu. Cette passerelle laisse passer toutes les connexions sortantes mais bloque les connexions entrantes. Dans ce TP, nous allons faire « comme si » nous étions à l'extérieur du réseau de l'école : nous allons nous connecter à la passerelle avant de nous connecter à une des machines.

De fait, si vous êtes connectés sur un réseau interne de l'école (en filaire, ou par Eduroam en Wifi), l'accès à la passerelle se fait avec le nom court ssh, au lieu de ssh.imtbs-tsp.eu.

Ouvrez un terminal et lancez la commande hostname. Quel est le nom de votre machine ? À Télécom SudParis, la nomenclature est : a001 indique la salle (A001-002), et 08 indique le numéro de la machine.
$ hostname a001-08

Avant d'aller plus loin, lancez la fabuleuse commande xeyes. Cette commande affiche une fabuleuse paire d'yeux qui suivent votre pointeur. Si vous ne l'avez pas sur votre ordinateur, ce n'est pas grave : après la connexion par SSH dans les questions suivantes, vous pourrez la lancer !

Fermez le processus xeyes puis utilisez la commande ssh pour vous connecter à la passerelle. Pour vous guider, vous devriez écrire ssh mon-login@ssh.imtbs-tsp.eu pour vous connecter (pensez à utiliser la commande man pour savoir comment utiliser la commande ssh de façon plus avancée).

Comme mentionné plus haut, si vous êtes déjà sur un réseau interne de l'école, utilisez ssh mon-login@ssh.

Qu'affiche maintenant la commande hostname ?

Cette remarque est importante, conservez ces informations quelques part, car vous en aurez très probablement besoin plus tard dans vos études ou votre vie professionnelle. Comme vous vous connectez pour la première fois à la passerelle, ssh vous pose une question. Avant de répondre « yes », lisez attentivement ce que vous raconte ssh. De façon générale, si l'authenticité d'une machine ne peut pas être établie, cela signifie que :
  • la machine sur laquelle vous vous connectez n'est pas celle que vous croyez. Le service qui trouve une machine à partir de son nom a très probablement été piraté. Si vous avez un doute, fuyez pauvres fous ! Contactez d'urgence l'administrateur de la machine et surtout, ne répondez pas yes aveuglément.
  • la machine sur laquelle vous vous connectez vient d'être mise à jour. Dans ce cas, son identité a changé. Après vous être assuré(e) que c'était le cas, vous pouvez détruire l'entrée correspondante dans le fichier ~/.ssh/known_hosts en lançant ssh-keygen -R hostname, où hostname est le nom de la machine sur laquelle vous vous connectez. Vous pourrez ensuite vous reconnecter comme si c'était une nouvelle machine;
  • vous vous connectez pour la première fois à la machine. La procédure devrait être d'obtenir son identité par un autre canal (par exemple en mains propres de la part de l'administrateur) et de la comparer à celle qui vous est affichée par ssh.
Dans le contexte de cet exercice, et depuis le réseau local de l'école, vous pouvez raisonnablement répondre yes sans danger. Vous pouvez néanmoins vérifier l'authenticité de la machine en regardant ici.
ssh ssh.imtbs-tsp.eu
$ hostname elaphe.int-evry.fr
Il est possible que hostname vous indique un autre nom de machine car, de façon à équilibrer la charge, plusieurs machines peuvent répondre au doux nom de ssh.imtbs-tsp.eu, à savoir ssh1 (nom d'hôte « anaconda ») ou ssh2 (nom d'hôte « taipan »).

Lancez la commande xeyes. Que se passe-t-il ?
La commande ne démarre pas et affiche un message d'erreur « Error: Can't open display: ».

Techniquement, votre shell s'exécute sur l'une des passerelles du campus alors que votre écran est connecté à votre machine. Le shell de la passerelle est incapable de trouver le serveur graphique de votre machine, ce qui explique que la commande xeyes ne puisse pas se connecter.

Déconnectez-vous de la passerelle avec la commande exit, puis reconnectez-vous à la passerelle en utilisant cette fois l'option -Y de ssh. Cette option demande explicitement à ssh d'indiquer au shell de la passerelle où se trouve le serveur graphique.

Que se passe-t-il lorsque vous lancez xeyes ?

$ ssh -Y thomas_g@ssh.imtbs-tsp.eu thomas_g@ssh.imtbs-tsp.eu's password: Last login: Tue Jun 28 13:44:53 2016 from 157.159.39.4 [thomas_g@elaphe ~]$ xeyes
xeyes se porte maintenant comme un charme.

Connectez-vous avec ssh -Y à une des machines des salles de TP à partir du shell s'exécutant sur la passerelle. Ces machines ont des noms prévisibles de la forme salle-num, où salle est un numéro de salle et num un numéro de machine (par exemple a001-08). Lancez un xeyes à distance. Où apparaît xeyes ?
Sur votre machine.

Déconnectez-vous de la machine de salle de TP et de la passerelle en saisissant exit deux fois. Vous devriez donc maintenant travailler sur votre machine. Vérifiez que c'est le cas en lançant la commande hostname. Si vous voyez que vous n'êtes pas en train de travailler sur votre machine, saisissez exit autant de fois que nécessaire.
$ exit $ exit $ hostname a001-08

Nous allons maintenant apprendre à copier des fichiers d'une machine à une autre en utilisant le protocole SSH. Avant de commencer, de façon à vous remettre en jambe, copiez le fichier /etc/passwd de votre machine dans votre répertoire de connexion (répertoire « ~ ») en utilisant la commande cp.
$ cp /etc/passwd ~ $

Pour copier un fichier d'une machine à une autre, il faut remplacer la commande cp par la commande scp. Cette commande fonctionne à peu près comme la commande cp mais permet de spécifier une machine cible ou une machine destination en préfixant un des chemins par « mon-login@nom-machine: » (par exemple, avec le chemin thomas_g@srvp1.telecom-sudparis.eu:~/movies/chat-noir-chat-blanc.avi).

Copiez le fichier /etc/passwd de la machine ssh.imtbs-tsp.eu dans votre répertoire de connexion.
$ scp thomas_g@ssh.imtbs-tsp.eu:/etc/passwd ~ thomas_g@ssh.imtbs-tsp.eu's password: passwd 100% 2793 2.7KB/s 00:00 $
Ce qu'il faut retenir : lorsque vous travaillez à distance, vous devez d'abord vous connecter à une passerelle de l'école avec ssh -Y ssh.imtbs-tsp.eu. Si par hasard ssh vous indique que la machine ne peut pas être authentifiée alors que vous vous y étiez déjà connecté, méfiez-vous, l'identité de la machine a peut-être été usurpée. Ensuite, il vous est déconseillé de travailler directement sur la passerelle, afin d'éviter un possible engorgement. Connectez-vous donc à une autre machine, en sachant que les machines s'appellent salle-num, où salle est un numéro de salle et num un numéro de machine (par exemple a001-08).