IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration système Discussion :

Espace disque : 2 programmes, 2 valeurs


Sujet :

Administration système

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 230
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 230
    Par défaut Espace disque : 2 programmes, 2 valeurs
    Préambule
    Pourquoi je hais Linux (des fois) :
    2. View I/O Limits

    Use the -i option as shown below to display the I/O limits on a particular block device.

    You can either pass the partition as an argument, or the whole device.

    The following output displays the minimum IO size, physical and logical sector size of /dev/sdb1 device.

    # blkid -i /dev/sdb1
    MINIMUM_IO_SIZE=512
    PHYSICAL_SECTOR_SIZE=512
    LOGICAL_SECTOR_SIZE=512
    source
    et dans un terminal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # blkid -i /dev/sda4
    MINIMUM_IO_SIZE=13213811617399046656
    PHYSICAL_SECTOR_SIZE=13213811617399046656
    LOGICAL_SECTOR_SIZE=12884902400


    +++
    blkid display a single device attribute

    the blkid command with a device name display only this device attributes

    # blkid /dev/sda
    /dev/sda: UUID="a4dc8beb-1f79-4a54-883c-26bad0570794" TYPE="xfs" LABEL="/dcs07_l4_5"
    source
    et dans un terminal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # blkid /dev/sda
    /dev/sda: TYPE="isw_raid_member"
    (nota : cette information serait peut-être issue de l'utilisation précédente de ce disque [seconde main], qui aurait résisté au partitionnement + formatage ?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # blkid /dev/sda4
    /dev/sda4: LABEL="datas" UUID="88e48b0e-ef96-4cc0-b249-fa998ec2ec34" TYPE="ext4"
    Ah ! Faut rajouter le "4" pour transformer le device en partoche.

    et avec un autre disque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # blkid /dev/sdb
    (rien -- ligne vide)
    # blkid /dev/sdb1
    /dev/sdb1: LABEL="backup_sdb" UUID="2fcd8e8f-09c9-4ed5-90be-358eb3541d95" TYPE="ext4"
    Pareil, faut rajouter "1".
    Ces trucs-là me font perdre des heures, c'est dingue -- comme si j'avais l'éternité devant moi ...

    +++
    La question :
    j'essaie juste de savoir pourquoi tune2fs ne remonte pas la même information que df -B1 en ce qui concerne l'espace total d'une partition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    # df -B1 /dev/sdb1
    Sys. fich.        1B-blocks        Util.  Disponible Uti% Monté sur
    /dev/sdb1      867740401664 746057814016 77597048832  91% /media/sdb1
     
    # tune2fs -l /dev/sdb1
    Block count:              215261439 --> x 4096 = 881710854144
    Free blocks:               29707663 --> x 4096 = 121682587648, correspond au champ f_bfree de la structure statvfs quand on joue avec C
    Reserved block count:      10763071 --> x 4096 =  44085538816, soustraction des champs f_bfree - f_bavail
    La différence entre Block count de t2fs et 1B-blocks de df (qui correspond au champ f_blocks de la structure statvfs) est inexplicable et je ne sais pas quelle valeur correspond à la vraie vie.

    Si quelqu'un a une idée...

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 422
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    # df -B1 /dev/sdb1
    Sys. fich.        1B-blocks        Util.  Disponible Uti% Monté sur
    /dev/sdb1      867740401664 746057814016 77597048832  91% /media/sdb1
     
    # tune2fs -l /dev/sdb1
    Block count:              215261439 --> x 4096 = 881710854144
    Free blocks:               29707663 --> x 4096 = 121682587648, correspond au champ f_bfree de la structure statvfs quand on joue avec C
    Reserved block count:      10763071 --> x 4096 =  44085538816, soustraction des champs f_bfree - f_bavail
    La différence entre Block count de t2fs et 1B-blocks de df (qui correspond au champ f_blocks de la structure statvfs) est inexplicable et je ne sais pas quelle valeur correspond à la vraie vie.

    Si quelqu'un a une idée...
    tune2fs te donne les vraies valeurs sans prendre en considération le système (il vit dans son propre monde) , tandis que df te donne les valeurs sur un point de vue pour l'utilisateur non root, donc en ne comptant pas le journal, la table de bitmap,...

  3. #3
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 230
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 230
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    tune2fs te donne les vraies valeurs sans prendre en considération le système (il vit dans son propre monde), tandis que df te donne les valeurs sur un point de vue pour l'utilisateur non root, donc en ne comptant pas le journal, la table de bitmap, ...
    Ça me va.
    Si pas d'autre(s) avis, je prends, et

    EDIT : ça me va, mais il y a quand même un truc qui me chagrine...

    La sortie de df mérite une explication plus approfondie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # df -B1 /media/sdb1/
    Sys. fich.        1B-blocks        Util.  Disponible Uti% Monté sur
    /dev/sdb1      867740401664 746057814016 77597048832  91% /media/sdb1
    En effet,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      746057814016 utilisé
    +  77597048832 disponible
    = 823654862848


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      867740401664
    - 823654862848
    =  44085538816 / 4096 = 10763071 (Reserved block count de tune2fs)
    qui n'apparait pas dans la sortie de df.

    Jusqu'à présent, cette histoire de "reserved block count" se trouve sur le web comme "Reserved for root" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        /*
         * It is helpful to use a picture for calculation of disk space.
         *
         * |<--------------------- f_blocks ---------------------------->|
         *                 |<---------------- f_bfree ------------------>|
         *
         * ---------------------------------------------------------------
         * | USED          | f_bavail                | Reserved for root |
         * ---------------------------------------------------------------
         *
         */
    source
    mais à te lire ce n'est pas vrai : l'utilisateur root avec tous ses pleins pouvoirs ne va pas utiliser cet espace qui lui est "réservé" pour y stocker des photos cochonnes ou Dieu seul sait quoi, en fait cet espace est "Reserved for system (journaux, tables diverses, etc.)"

    Du coup, le vrai espace total utilisable est la somme de USED et f_bavail.

    D'ailleurs, man statfs nous dit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      fsblkcnt_t f_bfree;   /* Free blocks in filesystem */
      fsblkcnt_t f_bavail;  /* Free blocks available to unprivileged user */
    que j'aurais tendance à récrire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      fsblkcnt_t f_bfree;   /* Blocks reserved for system use */
      fsblkcnt_t f_bavail;  /* Free blocks available to users */
    Je vais donc me baser sur le calcul précédent pour connaître l'espace total, et voili et voilou.

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 422
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        /*
         * It is helpful to use a picture for calculation of disk space.
         *
         * |<--------------------- f_blocks ---------------------------->|
         *                 |<---------------- f_bfree ------------------>|
         *
         * ---------------------------------------------------------------
         * | USED          | f_bavail                | Reserved for root |
         * ---------------------------------------------------------------
         *
         */
    source
    mais à te lire ce n'est pas vrai : l'utilisateur root avec tous ses pleins pouvoirs ne va pas utiliser cet espace qui lui est "réservé" pour y stocker des photos cochonnes ou Dieu seul sait quoi, en fait cet espace est "Reserved for system (journaux, tables diverses, etc.)"
    Non, si c'était le cas, tu retrouverais la valeur du Block count de tune2fs en additionnant le tout, ce qui n'est pas le cas, la réserve permet bien à root de pouvoir continuer à travailler alors que le FS est déclaré FULL.

    Ou alors, je n'ai pas compris de quels journaux ou tables diverses tu faisais allusion.

    Un exemple simple: tu crées une partition var ou dedans tu as les log du systèmes (genre messages) ainsi que le spool d'un serveur de mail.
    Un utilisateur pourrait te remplir la partition rien qu'en recevant beaucoup de mail, ce qui ferait qu'une fois cette partition full à cause de l'utilisateur en question, on ne pourrait plus avoir d'alerte dans messages ou autre log système et pour faciliter les choses, ton système pourrait se figé. C'est là toute l'utilité de cette réserve pour root.
    D'ailleurs, un petit détail: celle-ci est par défaut de 5% mais lors de l'initialisation de la partition, il est souvent utile de changer cette valeur, car 5% de 1To c'est un peu beaucoup, mais 5% de 100Mo, ce n'est peut-être pas assez selon l'utilisation de la partition en question.

  5. #5
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 477
    Par défaut
    La confusion vient je pense des éléments de la structure statfs
    champ f_bfree : blocs libres
    champ f_bavail : blocs libres pour les utilisateurs

    La différence entre f_bfree et f_bavail étant les blocs réservés à root.

    la doc de df ne précise pas la valeur retournée.
    Je viens de faire un test en appelant df en user simple et en root : même résultat.

    Reste à voir ce qui est retourné : f_bfree ou f_bavail

    Il me paraitrait logique que ce soit f_bavail, la réservation étant pour éviter de ne rien pouvoir faire si FS rempli. J'ai pas regardé.

    Autre point :
    Un FS va te retourner un nombre de blocs lié à celui-ci, un utilitaire de périphérique, hors FS va te retourner un nombre de bloc lié au périphérique. Il peut y avoir une différence.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  6. #6
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 230
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 230
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Ou alors, je n'ai pas compris de quels journaux ou tables diverses tu faisais allusion.
    je parlais de ta réponse précédente :
    Citation Envoyé par disedorgue Voir le message
    donc en ne comptant pas le journal, la table de bitmap,...
    Je comprends bien qu'un système de logs va pouvoir y accéder et permettre à root d'y éditer des fichiers, mais pas plus.
    La confusion semble venir du fait que si bfree-bavail = bfree4root, il n'est pas possible pour autant que root y stocke des films ou que sais-je.
    Cet espace ne peut pas se comporter comme une partoche dédiée à root, c'est pour ça que les mots utilisés dans l'aide prêtent à confusion.

    De toute façon, en utilisant grand_total = sbuf.f_blocks - sbuf.f_bfree + sbuf.f_bavail je suis tranquille car en remplaçant la valeur remontée par df (premier champ) par ce grand_total, je conserve la marge réservée à root, aux fichiers système, bref à cette partie qu'on ne maîtrise pas.


    Citation Envoyé par chrtophe Voir le message
    Reste à voir ce qui est retourné : f_bfree ou f_bavail
    Je suis parti de cette discussion, où on y croise quelqu'un qu'on voit parfois ici

    Pour s'y retrouver, j'ai pondu des lignes comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        printf("Espace used  : %15llu %s\n", (long long) sbuf.f_frsize * (sbuf.f_blocks - sbuf.f_bfree), " = df Util.");
        printf("Espace dispo : %15llu %s\n", (long long) sbuf.f_frsize *  sbuf.f_bavail, " = df Disponible, bavail");
        printf("nouveau total: %15llu %s\n", (long long) sbuf.f_frsize * (sbuf.f_blocks - sbuf.f_bfree + sbuf.f_bavail), " = blocks-bfree+bavail (= Util.+Dispo)");
        printf("Espace libre : %15llu %s\n", (long long) sbuf.f_frsize *  sbuf.f_bfree, " = bfree, tune2fs Free blocks");
        printf("libre - dispo= %15llu %s\n", (long long) sbuf.f_frsize * (sbuf.f_bfree - sbuf.f_bavail), " = bfree - bavail, tune2fs Reserved block count");
    Les textes permettent de raccorder les morceaux, en comparant avec une sortie df -B1.

  7. #7
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 230
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 230
    Par défaut
    Une dernière chose me turlupinait, déjà indiquée :
    Citation Envoyé par Jipété Voir le message
    D'ailleurs, man statfs nous dit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      fsblkcnt_t f_bfree;   /* Free blocks in filesystem */
      fsblkcnt_t f_bavail;  /* Free blocks available to unprivileged user */
    que j'aurais tendance à récrire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      fsblkcnt_t f_bfree;   /* Blocks reserved for system use */
      fsblkcnt_t f_bavail;  /* Free blocks available to users */
    Et je n'étais pas d'accord avec cette réponse :
    Citation Envoyé par disedorgue Voir le message
    la réserve permet bien à root de pouvoir continuer à travailler alors que le FS est déclaré FULL.
    Ce matin j'ai regardé la structure profonde de ext4 et j'ai fait une recherche du mot root dans la page https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout,
    Nulle part il est question du user "root", nulle part !
    Par contre, il y a 17 occurrences de "root" trouvées, les voilà, toujours liées à la racine du système de fichiers :
    Root directory.
    when a directory is created in the root directory, the inode allocator scans
    The root node of the extent tree is stored in
    The root of the tree always lives in the first data block of the directory.
    The rest of the root node contains metadata about
    If dx_root.info.indirect_levels is non-zero then
    the root node's map
    The root of the htree is in struct dx_root,
    struct dx_root_info.reserved_zero
    struct dx_root_info.hash_version
    struct dx_root_info.info_length
    struct dx_root_info.indirect_levels
    struct dx_root_info.unused_flags
    The hash maps that exist in both struct dx_root and struct dx_node
    The limit and count entries in the dx_root/dx_node structures
    the htree index header (dx_root or dx_node)
    Et ici https://bugzilla.kernel.org/show_bug.cgi?id=93031, on voit plusieurs fois le mot root mais la plupart du temps en liaison avec journal, fs, flags, exemple : "If I mistype noatime to noatiem the root filesystem mounts read-only."

    Et aussi https://bugzilla.kernel.org/show_bug.cgi?id=114821
    "the inode holds a single text file in the root directory of the drive"
    "the file is in the root directory and gets listed each time the root is traversed."
    (Dommage, la discussion s'arrête sur des questions de l'OP sans réponses du support depuis deux ans et demi... Pas cool. )

    Je remets donc le croquis permettant de mieux comprendre (un petit dessin vaut mieux qu'un long discours, ), avec une petite modification, donc :
    https://stackoverflow.com/questions/...free-correctly

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        /*
         * It is helpful to use a picture for calculation of disk space.
         *
         * |<--------------------- f_blocks ------------------------------->|
         *                 |<---------------- f_bfree --------------------->|
         *
         * ------------------------------------------------------------------
         * | USED          | f_bavail                | Reserved for root fs |
         * ------------------------------------------------------------------
         *
         */
    et je modifie mon extrait du man statfs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fsblkcnt_t f_bfree;   /* Free blocks in filesystem */
    fsblkcnt_t f_bavail;  /* Free blocks available to unprivileged user */
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fsblkcnt_t f_bfree;   /* Blocks reserved for filesystem functionalities + f_bavail */
    fsblkcnt_t f_bavail;  /* Free blocks available to users */
    to users car je mets la même quantité de données sur ma clé usb, que je sois loggé root ou lambda.


    Rien à voir mais bon à savoir : ext4 becomes less efficient when it's approaching ~90% full (https://ext4.wiki.kernel.org/index.php/Ext4_VM_Images)

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 422
    Par défaut
    Ok, le man de mk2efs doit être faux ou mal interprété de ma part:
    -m reserved-blocks-percentage
    Specify the percentage of the filesystem blocks reserved for the super-user. This avoids fragmentation, and allows root-owned daemons, such as syslogd(8), to continue to function correctly after non-privileged processes are prevented from writing to the filesystem. The default percentage is 5%.

  9. #9
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 230
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 230
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Ok, le man de mk2efs doit être faux ou mal interprété de ma part:
    -m reserved-blocks-percentage
    Specify the percentage of the filesystem blocks reserved for the super-user.
    De ce que j'ai vu ce matin, je dirais qu'il faudrait plutôt le lire
    Specify the percentage of the filesystem blocks reserved for the root directory
    .

    Citation Envoyé par disedorgue Voir le message
    This avoids fragmentation, and allows root-owned daemons, such as syslogd(8), to continue to function correctly after non-privileged processes are prevented from writing to the filesystem.
    La non-fragmentation fait appel à un autre mécanisme (extent), quant au reste, ma foi, pourquoi pas, dans un contexte où il n'y a qu'une seule partition pour tout le système.

    Citation Envoyé par disedorgue Voir le message
    The default percentage is 5%.
    Et ça, ça me semble correct, et déterminé par les options qu'on passe à mke2fs.

    Mais je ne prétends pas détenir la vérité absolue, juste que je m'interroge, que je creuse, et je viens partager avec vous le fruit de mes découvertes et gamberges...


    Et du coup je tombe sur des trucs sympas, genre avec ça
    Citation Envoyé par Jipété Voir le message
    Quand j'appelle l'outil stat sur mon fichier de 55 Mo, la première ligne retourne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       Taille : 54860518  	Blocs : 107152     ES blocs : 1024   fichier
    ...
    (On notera le mot "fichier" tout seul au bout de la ligne )
    et ce mot "fichier" qui m'intriguait, tout seul, et qui est en fait une traduction bizarre.
    Je suis tombé sur un exemple plus clair, avec le texte d'origine : Size: 4984 Blocks: 16 IO Block: 4096 regular file, source

  10. #10
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 230
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 230
    Par défaut
    Bonjour,

    je ne résiste pas au plaisir de vous proposer la version Bash pur (qui appelle df, quand même -- faut bien avoir les infos), qui affiche exactement les mêmes résultats que la version en C.

    Ça tombe bien, j'avais besoin de ces valeurs dans un script.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Espace total          :      88453705728 octets
     | zone allouée au fs :       4500049920 octets
     | espace utilisable  :      83953655808 octets
        | utilisé         :      31676510208 octets
        | disponible      :      52277145600 octets
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #!/bin/bash
     
    if [ -z "$1" ]; then
      echo "Usage : $(basename $0) chemin_valide"
      exit
    fi
    # ici il faudrait vérifier que $1 est vraiment un chemin valide, 
    # sinon insulter grave l'utilisateur inconscient/insouciant.
    # je vous laisse gérer ce point...
     
    # récupère les infos utiles en virant la ligne d'en-tête
    declare -a retourdf=($(df --sync -B1 $1 | awk 'NR==2'))
    #echo ${#retourdf[*]} # 6 champs, ça commence à 0
    ttal=${retourdf[1]} # total
    used=${retourdf[2]} # util.(isé !)
    free=${retourdf[3]} # Disponible
     
    # 2 calculs
    usable=$(($used + $free))
    rsrved=$(($ttal - $usable))
     
    # sortie mode statfs4pascal :
    printf "Espace total          : %16d octets\n" $ttal
    printf " | zone allouée au fs : %16d octets\n" $rsrved
    printf " | espace utilisable  : %16d octets\n" $usable
    printf "    | utilisé         : %16d octets\n" $used
    printf "    | disponible      : %16d octets\n" $free
    Enjoy !,
    et bon dimanche.

    EDIt : me demande si la sortie ne serait pas encore plus compréhensible dans l'enchaînement des valeurs comme ça, en ne lisant que la colonne de gauche de haut en bas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Espace total          :     116498505728 octets
     - zone allouée au fs :       5924610048 octets
     = espace utilisable  :     110573895680 octets
        = utilisé         :      36397154304 octets
        + disponible      :      74176741376 octets
    Vous verrez...

  11. #11
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 230
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 230
    Par défaut
    Salut,

    Retour d'utilisation :
    Citation Envoyé par Jipété Voir le message
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # récupère les infos utiles en virant la ligne d'en-tête
    declare -a retourdf=($(df --sync -B1 $1 | awk 'NR==2'))
    ...
    Des fois ça prend du temps s'il y a plusieurs arborescences à analyser (pour par ex. sortir l'image montrée précédemment), genre dans une boucle.
    Il y a un truc à déplacer hors de la boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # avant la boucle
    sync
    # dans la boucle, s'il y en a une :
    # récupère les infos utiles en virant la ligne d'en-tête
    declare -a retourdf=($(df -B1 $1 | awk 'NR==2'))
    ...
    Joyeux Noël,

  12. #12
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 730
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 730
    Par défaut
    version Bash pur (qui appelle df, quand même
    et awk
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mapfile -s1 -t data < <( df --sync -B1 "$1")
    read part ttal used free perc mountP <<<"${data[0]}"

  13. #13
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 230
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 230
    Par défaut
    Yop !

    Toute petite customisation de la sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # ./statfs4pascal . -i
    Blocs, taille optimum :             4096 octets
    Espace total          :     876093894656 octets
     | zone allouée au fs :      44509847552 octets
     | espace utilisable  :     831584047104 octets
        | utilisé         :     763911966720 octets
        | disponible      :      67672080384 octets
    je trouve ça plus choupinet,

    Et comme dit hier après avoir posté, je remplace le switch -p par -i (comme "interactif") avec fonctionnement inversé (testé sous Lazarus, c'est plus mieux cool ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        if (argv[2] == NULL) {
             printf("%d %llu %llu %llu %llu %llu\n", bsize, grdtotal, reserved, usable, used, dispo); 
        } else {
        if (argv[2] [0] == '-') {
            if (argv[2] [1] == 'i') {
                fprintf (stdout,   "Blocs, taille optimum : %16d octets\n"  , bsize);
                fprintf (stdout,   "Espace total          : %16llu octets\n", grdtotal);
                fprintf (stdout,   " | zone allouée au fs : %16llu octets\n", reserved);
                fprintf (stdout,   " | espace utilisable  : %16llu octets\n", usable);
                fprintf (stdout,   "    | utilisé         : %16llu octets\n", used);    
                fprintf (stdout,   "    | disponible      : %16llu octets\n", dispo);   // = df -B1 "Dispo"
                } 
            }
        }
    Bon trolldi,

    EDIT : et l'ihm de test donne ça, trop

    Nom : infodisk.png
Affichages : 83
Taille : 19,3 Ko

  14. #14
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 230
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 230
    Par défaut
    Salut,

    Un dernier mot en forme de conclusion et résumé :
    en fait le problème de compréhension de la sortie de df en français est d'ordre sémantique : je sais pas vous mais moi, quand je vois la colonne "Util.", quand je lis "Util." quand j'entends dans ma tête "Util." je comprends (hélas) "Utile" car ça "sonne" pareil, sauf qu'il faut comprendre "Utilisé", used in English, et non pas available, ce qui change tout.

    Par ailleurs, je confirme ce que je disais hier, ce "Reserved for root" est une bêtise, j'ai fait des tests et les informations renvoyées par la structure statvfs sont les mêmes, que le programme analysant les données soit lancé sous root ou sous un user lamba : c'est bien "Reserved for system" qu'il faut comprendre.
    L'erreur vient peut-être (sans doute ?) d'une confusion entre l'utilisateur root et l'emplacement root (racine) sur le périphérique.

    J'utilise maintenant les valeurs de statvfs, et l'espace total devient sbuf.f_frsize * (sbuf.f_blocks - sbuf.f_bfree + sbuf.f_bavail), qui correspond aux sorties de df -B1 Util.[isé !] + Disponible.

  15. #15
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 230
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 230
    Par défaut
    Bonjour,

    un petit mot vite fait à propos de l'avancement du chantier.

    1) une info : dans mon petit prog (qui remonte les mêmes infos que df -B1 chemin), il faut IM-PÉ-RA-TI-VE-MENT faire un appel à sync(); sinon l'appel suivant à statvfs remplit la structure des datas avec des valeurs fausses ! C'est bien noté ?

    2) un souci : il va falloir que je creuse un truc vraiment bizarre, l'arrondi à l'unité supérieure en nombre de blocs est fluctuant.
    Un exemple : soit une petite partoche ext4 (sur clé usb) de 128 Mo, avec donc une taille de bloc de 1024 bytes.
    Si j'y copie un fichier de 1025 bytes, il va occuper 2 blocs car 1025 / 1024 = 1,0009765625 soit supérieur à 1 donc 2.

    Et j'ai un fichier (pour le moment, mais je ne sais pas trop comment chercher ça...) de 54 860 518 bytes (choisi au pif), donc 54860518 / 1024 = 53574,7246094 que j'arrondis à 53575 mais l'appel à statvfs retourne 53576.
    Un fichier plus petit de 38 455 854 bytes retourne bien 37555 blocs, calcul comme appel à statvfs.

    Ce n'est pas dramatique mais c'est très désagréable.

    Il va falloir que je fasse d'autres tests, mais j'ai un peu peur de m'engager dans un chemin passablement hasardeux, et termes de choix des fichiers.

    Je résume : fichier de 38 Mo --> nombre de blocs ok, fichier de 55 Mo --> nombre de blocs + 1.
    Je n'aurai pas trop le temps cet après-midi, mais je vous lirai avec attention à mon retour.

  16. #16
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 422
    Par défaut
    Comment as-tu mis tes fichiers sur ta clé ?

    As-tu créé un nouveau répertoire ou bien agrandi la structure de ton répertoire d'origine de ta clé ?

    En gros, ça peut être le soucis de passé par des comptages indirectes, ici, on peut bêtement agrandir un répertoire...

  17. #17
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 230
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 230
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Comment as-tu mis tes fichiers sur ta clé ?
    Avec la touche F5 dans mc.

    Citation Envoyé par disedorgue Voir le message
    As-tu créé un nouveau répertoire ou bien agrandi la structure de ton répertoire d'origine de ta clé ?
    Ni l'un ni l'autre : ai d'abord tout nettoyé/viré avec gparted, puis recréé une partoche de 128 M au début de la clé, toujours avec gparted, qui a participé au formatage également.

    Citation Envoyé par disedorgue Voir le message
    En gros, ça peut être le soucis de passé par des comptages indirectes, ici, on peut bêtement agrandir un répertoire...
    Pas compris ce que tu veux dire, là.

    Quand je me suis rendu compte de ce décalage de 1 bloc, c'était après copie d'un paquet de fichiers : alors j'ai tout viré puis recommencé un fichier à la fois jusqu'à trouver le coupable, que j'ai confirmé après nouvelle suppression de tout puis copie de juste le coupable.

  18. #18
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 477
    Par défaut
    Tes fichiers sont sur clé USB ? Donc en FAT, ton calcul n'est peut-être pas juste du coup.

    L'unité d"allocation en FAT n'est pas un bloc mais un cluster. La taille d'un cluster est variable, de 1 à 128 secteurs par multiple de 2 (octet 13 du secteur 0 du volume FAT appelé BPB). Un fichier utilise au minimum un cluster. Si la taille d'un cluster est de 4 secteurs, un fichier de 1 octet occupera sur le disque 4*512=2048 octets, et donc un fichier de 2049 octets occupera 4096 octets. Il faudrait voir si le VFS Linux reporte bien la taille d'un cluster dans le champ f_bsize du statfs d'un volume FAT, en théorie ça devrait être le cas.

    Ou alors c'est peut-être une question d'arrondi.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  19. #19
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 230
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 230
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    Tes fichiers sont sur clé USB ? Donc en FAT, ton calcul n'est peut-être pas juste du coup.
    Je l'ai formatée en ext4 et à l'insertion (à l'instant) elle est parfaitement bien reconnue automatiquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /dev/sdc1 on /media/redkey type ext4 (rw,nosuid,nodev,relatime,data=ordered,uhelper=udisks)
    redkey c'est le petit nom mignon que je lui ai attribuée, because elle est d'un joli rouge tendre,

  20. #20
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 230
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 230
    Par défaut
    Quand j'appelle l'outil stat sur mon fichier de 55 Mo, la première ligne retourne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       Taille : 54860518  	Blocs : 107152     ES blocs : 1024   fichier
    ...
    (On notera le mot "fichier" tout seul au bout de la ligne )

    et si je l'appelle ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # stat --format=%s,%b,%B,%o /media/redkey/Wang\ Dang\ Doodle.wav
    ça me donne cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    54860518,107152,512,1024
    avec ces 4 options (man stat) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
           %s     Total size, in bytes
           %b     Number of blocks allocated (see %B)
           %B     The size in bytes of each block reported by %b
           %o     I/O block size
    Questions :
    que veut dire ES ? Entrées/Sorties ? C'est la valeur renvoyée par l'option %o, I/O block size, soit 1024.
    pourquoi %B (512) n'est pas directement remonté par l'outil ?

    Par ailleurs, 107152 x 512 = 54861824, c'est la valeur la plus proche divisible par 4 de la taille divisée par %o : 54860518 / 512 = 107149,449219 --> 107150 n'est pas divisible par 4, pas plus que 107151, mais 107152 oui --> 26788, tiens tiens, car si ensuite je multiplie 26788 par 2 ça donne 53576, la valeur dont j'ai déjà parlé à propos du bloc surnuméraire, sans explication.

    Et 53576 x 1024 = 54861824, la valeur remontée par df -B1 fichier ou mon outil.

    Je vais continuer à creuser cette histoire de division entière par 4 (même si je n'ai rien lu à ce propos) avec d'autres fichiers, histoire de voir...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/05/2018, 12h13
  2. Réponses: 2
    Dernier message: 24/06/2004, 10h13
  3. Probleme d'espace disque (= 0)
    Par infotron dans le forum Administration système
    Réponses: 12
    Dernier message: 01/06/2004, 19h29
  4. VBScript pour obtenir l'espace disque libre
    Par Archangelo dans le forum ASP
    Réponses: 2
    Dernier message: 05/05/2004, 13h33
  5. visualiser l'espace disque occupé par ma base
    Par superdada dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 08/01/2004, 15h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo