« SE4 2022/2023 EC1 » : différence entre les versions

De wiki-se.plil.fr
Aller à la navigation Aller à la recherche
Ligne 97 : Ligne 97 :
<u>A quoi sert la commande dd?</u>
<u>A quoi sert la commande dd?</u>


La commande dd permet de copier tout ou partie d'un disque par blocs d'octets, indépendamment de la structure du contenu du disque en fichiers et en répertoires (source: https://doc.ubuntu-fr.org/dd).  
La commande <code>dd</code> permet de copier tout ou partie d'un disque par blocs d'octets, indépendamment de la structure du contenu du disque en fichiers et en répertoires (source : [https://doc.ubuntu-fr.org/dd]).  




Ligne 104 : Ligne 104 :
  dd if=<nowiki><source> of=<cible> bs=<taille des blocs></nowiki>
  dd if=<nowiki><source> of=<cible> bs=<taille des blocs></nowiki>


'''source''' = données à copier  
<code>source</code> = données à copier  


'''cible''' = endroit où les copier
<code>cible</code> = endroit où les copier


'''if''' = input file  
<code>if</code> = input file  


'''of''' = output file
<code>of</code> = output file


'''bs''' = block size, habituellement une puissance de 2 supérieure ou égale à 512, représentant un nombre d'octets  
<code>bs</code> = block size, habituellement une puissance de 2 supérieure ou égale à 512, représentant un nombre d'octets  




<u>Choix de la commande</u>:  
<u>Choix de la commande</u>:  


Pour la source, on prends "/dev/zero": cela permet de créer un fichier rempli de 0. Ce fichier servira de base pour notre système de fichiers.
Pour la source, on prends <code>/dev/zero</code>: cela permet de créer un fichier rempli de 0. Ce fichier servira de base pour notre système de fichiers.


Pour la cible, on va l'appeler filesystem.bin: ce sera notre système de fichier.
Pour la cible, on va l'appeler <code>filesystem.bin</Code> : ce sera notre système de fichier.


Pour la taille des blocs, on veut des blocs de données de 256 octets d'après l'enoncé. On va donc prendre bs=256.  
Pour la taille des blocs, on veut des blocs de données de 256 octets d'après l'enoncé. On va donc prendre <code>bs=256</code>.  


Enfin, on veut que le système de fichier réside dans un fichier de 8 Mo. On va donc ajouter "count=32768": cela indique que nous voulons écrire 32768 blocs de données dans le fichier (32768 * 256 octets = 8 Mo).
Enfin, on veut que le système de fichier réside dans un fichier de 8 Mo. On va donc ajouter <code>count=32768</code>: cela indique que nous voulons écrire 32768 blocs de données dans le fichier (32768 * 256 octets = 8 Mo).




<u>Résultat:</u>
<u>Résultat:</u>


dd if=/dev/zero of=filesystem.bin bs=256 count=32768
dd if=/dev/zero of=filesystem.bin bs=256 count=32768


Question pour M. Redon: j'ai ici essayé de respecter votre remarque "pour la création du système de fichiers la commande <code>dd</code> suffit". Cependant, pour votre seconde remarque "vous chargez tout le superbloc et le répertoire racine, votre code ne convient pas.", je ne suis pas sûr de comprendre où je fais cela: est-ce lors de la commande dd ou est-ce par la suite avec mon programme C? J'ai un peu modifié la commande dd comme vous pouvez le voir ci-dessus. Ai-je corrigé mon erreur avec cette nouvelle commande? J'ai essayé de justifier au maximum la commande dd que j'ai choisie.


Question pour M. Redon: j'ai ici essayé de respecter votre remarque "pour la création du système de fichiers la commande <code>dd</code> suffit". Cependant, pour votre seconde remarque "vous chargez tout le superbloc et le répertoire racine, votre code ne convient pas.", je ne suis pas sûr de comprendre où je fais cela: est-ce lors de la commande dd ou est-ce par la suite avec mon programme C? J'ai un peu modifié la commande dd comme vous pouvez le voir ci-dessus. Ai-je corrigé mon erreur avec cette nouvelle commande? J'ai essayé de justifier au maximum la commande dd que j'ai choisie.
ReX : Pas de problème avec la commande <code>dd</code> (mettez tous les extraits de code entre des balises <code>code</code>). Le problème est au niveau du programme C.


= Documents Rendus =
= Documents Rendus =

Version du 19 juillet 2023 à 13:52

Objectifs

Il vous est demandé de :

  • réaliser un micro système de fichiers ;
  • le système de fichiers doit résider dans un fichier de 8 Mo ;
  • le système de fichiers est géré par un exécutable obtenu à partir d'un programme C ;
  • L'éxécutable prend deux arguments, le premier est le chemin du fichier dans lequel réside le système de fichiers, les paramètres suivants concernent l'action à appliquer sur le système de fichiers ;
  • le micro système de fichier ne comporte qu'un répertoire : le répertoire principal, le répertoire principal peut comporter au maximum 64 fichiers, un fichier est caractérisé par un nom de 16 caractères au maximum et ses blocs de données, un fichier peut comporter au maximum 2040 blocs de données ;
  • un bloc de données fait 256 octets et les blocs sont numérotés sur 2 octets ;
  • les différentes actions possibles sur le système de fichiers sont :
    • TYPE pour créer un fichier si possible, le nom du fichier suit la commande, le contenu du fichier est donné en entrée standard de l'exécutable ;
    • CAT pour afficher un fichier, le nom du fichier suit la commande ;
    • RM pour détruire un fichier, le nom du fichier suit la commande ;
    • MV pour renommer un fichier, les noms original et nouveau du fichier suivent la commande ;
    • CP pour copier un fichier, les noms de l'original et de la copie du fichier suivent la commande ;

Matériel nécessaire

Un PC sous Linux.

Travail réalisé

Semaine 1

ReX : attention, ce micro-système de fichiers est prévu pour un microcontrôleur, vos variables globales ne peuvent pas dépasser quelques centaines d'octets.

ReX : pour la création du système de fichiers la commande dd suffit, vous voulez dire le formatage du système de fichiers ?

  • création du programme programme.c contenant les différentes structures et les différentes fonctions.
  • Piste d'amélioration: faire en sorte que la fonction CAT affiche le contenu exact des fichiers passés en argument.


Le code fourni est un programme en langage C qui simule un système de fichiers basique. Ce programme permet aux utilisateurs d'effectuer diverses actions telles que créer, afficher, supprimer, renommer et copier des fichiers dans un système de fichiers simulé. Le système de fichiers est stocké dans un fichier binaire.

ReX : vous n'avez pas tenu compte de la première remarque, vous chargez tout le superbloc et le répertoire racine, votre code ne convient pas.

ReX : vos structures utilisent des types entiers dont la taille n'est pas explicitée, utilisez les types de stdint.h.

ReX : la création de fichier n'est pas fonctionnelle, vous ne cherchez pas les blocs libres, vous ne copiez pas le contenu du fichier dans les blocs, même remarque pour toutes les autres fonctions.

ReX : il manque les fonctions d'accès aux pages du système de fichiers.


Explication du programme programme.c

Voici une brève explication des principaux éléments et fonctions du code :

  1. Structures :
    • Fichier : Représente un fichier dans le système de fichiers. Il contient un nom (nom) avec une longueur maximale de 16 caractères, un tableau de numéros de bloc (blocs) où le contenu du fichier est stocké (jusqu'à 2040 blocs), et le nombre de blocs utilisés par le fichier (nbBlocs).
    • Repertoire : Représente le répertoire principal du système de fichiers. Il contient un tableau de fichiers (fichiers) et le nombre de fichiers dans le répertoire (nbFichiers).
  2. Fonctions :
    • chargerSystemeFichiers : Charge le système de fichiers à partir d'un fichier binaire donné (chemin) dans une structure Repertoire.
    • sauvegarderSystemeFichiers : Sauvegarde le système de fichiers stocké dans la structure Repertoire dans un fichier binaire (chemin).
    • creerFichier : Crée un nouveau fichier dans le système de fichiers avec un nom et un contenu donnés. Le contenu du fichier est simulé en le divisant en blocs.
    • afficherFichier : Affiche le contenu d'un fichier avec le nom spécifié.
    • detruireFichier : Supprime un fichier avec le nom spécifié du système de fichiers.
    • renommerFichier : Renomme un fichier avec l'ancien nom spécifié en un nouveau nom.
    • copierFichier : Copie un fichier avec le nom spécifié en créant un nouveau fichier avec le nom de copie spécifié.
  3. Fonction main :
    • La fonction main est le point d'entrée du programme.
    • Elle prend des arguments en ligne de commande : <chemin_systeme_fichiers> et <action>.
    • <chemin_systeme_fichiers> est le chemin vers le fichier binaire où le système de fichiers est stocké.
    • <action> détermine quelle opération effectuer, comme TYPE, CAT, RM, MV ou CP.
    • En fonction de l'action spécifiée, le programme appelle la fonction correspondante pour effectuer l'opération souhaitée sur le système de fichiers.

Remarque : Le code fourni une simulation basique d'un système de fichiers et de ses opérations, mais il n'interagit pas réellement avec un système de fichiers réel sur le disque.


Comment utiliser le programme programme.c

étape 1: création du système de fichiers respectant le cahier des charges:

dd if=/dev/zero of=systeme_fichiers.bin bs=1M count=8

étape 2: compilation du programme C:

gcc programme.c -o gestionnaire_fs

étape 3: création d'un fichier dans le système de fichier:

./gestionnaire_fs systeme_fichiers.bin TYPE fichier1.txt

-> entrer le texte en entrée standard

étape 4: manipulation des différentes fonctions. Exemples:

./gestionnaire_fs systeme_fichiers.bin CAT fichier1.txt
./gestionnaire_fs systeme_fichiers.bin CP fichier1.txt copie.txt
./gestionnaire_fs systeme_fichiers.bin RM copie.txt
./gestionnaire_fs systeme_fichiers.bin MV fichier1.txt fichier2.txt

Semaine 2

Amine: Merci pour vos remarques. Désolé de ne pas avoir suivi votre première remarque, je pensais avoir compris ce qu'il fallait faire mais je me rend compte que non. Je vais tout reprendre depuis le début afin de repartir sur de bonnes bases.

Etape 1: commande "dd"

A quoi sert la commande dd?

La commande dd permet de copier tout ou partie d'un disque par blocs d'octets, indépendamment de la structure du contenu du disque en fichiers et en répertoires (source : [1]).


Structure de la commande

dd if=<source> of=<cible> bs=<taille des blocs>

source = données à copier

cible = endroit où les copier

if = input file

of = output file

bs = block size, habituellement une puissance de 2 supérieure ou égale à 512, représentant un nombre d'octets


Choix de la commande:

Pour la source, on prends /dev/zero: cela permet de créer un fichier rempli de 0. Ce fichier servira de base pour notre système de fichiers.

Pour la cible, on va l'appeler filesystem.bin : ce sera notre système de fichier.

Pour la taille des blocs, on veut des blocs de données de 256 octets d'après l'enoncé. On va donc prendre bs=256.

Enfin, on veut que le système de fichier réside dans un fichier de 8 Mo. On va donc ajouter count=32768: cela indique que nous voulons écrire 32768 blocs de données dans le fichier (32768 * 256 octets = 8 Mo).


Résultat:

dd if=/dev/zero of=filesystem.bin bs=256 count=32768

Question pour M. Redon: j'ai ici essayé de respecter votre remarque "pour la création du système de fichiers la commande dd suffit". Cependant, pour votre seconde remarque "vous chargez tout le superbloc et le répertoire racine, votre code ne convient pas.", je ne suis pas sûr de comprendre où je fais cela: est-ce lors de la commande dd ou est-ce par la suite avec mon programme C? J'ai un peu modifié la commande dd comme vous pouvez le voir ci-dessus. Ai-je corrigé mon erreur avec cette nouvelle commande? J'ai essayé de justifier au maximum la commande dd que j'ai choisie.

ReX : Pas de problème avec la commande dd (mettez tous les extraits de code entre des balises code). Le problème est au niveau du programme C.

Documents Rendus