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

Shell et commandes GNU Discussion :

Filesystem et point de montage


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut Filesystem et point de montage
    Bonjour à tous,
    j'ai extrait une partie d'un script : resizefs qui permet (comme son nom l'indique) d'agrandir les filesystem plein

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    MOUNTPOINT=$1
     
    if [ "$(df -P ${MOUNTPOINT} | tail -n 1 | awk '{ print $NF }')" != "${MOUNTPOINT}" ]; then
        errorlog "${MOUNTPOINT} n'est pas un FS"
        echo "4" >> ${LOGFILE}
        exit 4
    fi
    Voilà ce que je comprends :

    MOUNTPOINT=$1

    ça signifie que MOUNTPOINT est le premier argument à donner au script resizefs. Jusque là tout va bien

    chez moi la commande df -P donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Filesystem                 1024-blocks  Used Available Capacity Mounted on
    /dev/mapper/vg_sys-lv_home      258724 13372    245352       6% /home
    pour augementer /home de 2 Gigas

    on me dit que le script s'utilise commande ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    resizefs -s +2G /home
    mais si j'applique la partie de code au dessus, ça me donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /dev/mapper/vg_sys-lv_home!=/home
    donc le script va planter...

    me trompe-je ?

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    me trompe-je ?
    Plutôt oui.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /dev/mapper/vg_sys-lv_home!=/home
    C'est là que ça coince.
    $1 est "/dev/mapper/vg_sys-lv_home"
    NF est le nombre de champs.
    $NF est donc le dernier champ. Ici, "/home"
    donc /home!=/home.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Salut,

    on m'a dit que l'utilisation est comme suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    resizefs -s +2G /home
    Donc $1 est bien égal à /home et non : /dev/mapper/vg_sys-lv_home....

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Arf. Attention au contexte.

    $1 est bien le premier paramètre dans le script bash.
    On le récupère vite avant qu'il soit remplacé.

    awk est un logiciel à part entière avec son fonctionnement propre.
    $i désigne le champ i dans une ligne.

    Voilà pourquoi le script awk est protégé par des simples quotes ' '
    Avec des doubles quotes " ", "$1" serait interprété et remplacé par le paramètre donné au script bash.
    Mais le script awk n'aurait plus de sens.

    De la même façon, en bash, si on a une fonction ma_fonction(), le premier paramètre sera encore $1. Et ce ne sera pas forcément le même que le $1 du script total.

    ok ?

    Résumé : il faut recontextualiser.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Re, je me pense que je me suis mal exprimé. Mon problème n’es pas du tout sur le awk...
    Je dis juste que le paramètre du scrip est /home et non dev/mapper/vg_sys-lv_home.
    Pourquoi ? Parceque d’après l’admin, on spécifie toujours le point de montage du filesystem et jamais le filesystem lui même.

    Reste à savoir qu’est ce que donne le résultat de la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if [ "$(df -P ${MOUNTPOINT} | tail -n 1 | awk '{ print $NF }')" != "${MOUNTPOINT}" ]; then
        errorlog "${MOUNTPOINT} n'est pas un FS"
        echo "4" >> ${LOGFILE}
        exit 4
    fi
    Quand MOUNTPOINT EST Égale àau point de montage du filesystem : /home..

  6. #6
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Reste à savoir qu’est ce que donne le résultat de la commande :
    Quand MOUNTPOINT EST Égale àau point de montage du filesystem
    J'imagine que, avant ta citation, il y a le traitement des options.
    Et que, après, il y a l'augmentation de taille.

    Donc, le bout de code que tu cites sert de procédure d'alerte.
    • Si on ne trouves pas le $1, le $mountpoint, le point de montage, on émet une erreur dans la sortie standard et dans les logs, et on arrête tout.
    • Si on trouve le point de montage (et donc le système de fichier qu'il faut faire grandir), tout est bien et on va pouvoir travailler sereinement. Le script continue.



    Et ceci dit, tu ne devrais pas comparer /dev/mapper/vg_sys-lv_home et /home, car le premier est un fichier et le second est un répertoire.
    Il n'y a aucune chance qu'ils s'égalent.
    Tout est fichier.
    Donc un lecteur de disquette, une clé USB, un disque dur, etc sont des fichiers dans l'arborescence purement virtuelle de Linux.
    Contrairement à Windows où le support est la base (C:, A:, E:, etc).
    /dev est un répertoire dont le nom est un diminutif pour "devices". Ce dossier liste les périphériques, sous forme de fichiers.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 377
    Points
    19 377
    Par défaut
    si on pouvait lire tout le script ...
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    salut, il est long, je peux par contre vous passer la première partie de vérification :

    Code : 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
     
    #===============================================================================
    #  GLOBAL DECLARATIONS
    #===============================================================================
    SCRIPT_NAME=${0##*/}
    SCRIPT_DIR=$(cd $(dirname $0); pwd)
    export TERM=${TERM}
    export PATH=$PATH:/sbin
    . /etc/profile.d/user.sh
    #. /etc/init.d/functions
    QUIET=0
    OPERCENT=0
    OSIZE=0
    LOGFILE=${SCRIPT_DIR}/logs/${SCRIPT_NAME}.$(date "+%Y%m").log
    #===============================================================================
    #  FUNCTION DEFINITIONS
    #===============================================================================
    # FONCTION
     
    log()
    {
        if [ ${QUIET} -eq 0 ]; then
            echo "$@"
        fi
    }
     
    infolog() { 
        echo -n "$(tput setaf 6)"; log "$@" ; echo -n "$(tput sgr0)"
    }
     
    noticelog() {
        echo -n "$(tput setaf 2)"; log $@ ; echo -n "$(tput sgr0)"
    }
     
    warnlog() {
        echo -n "$(tput setaf 3)" ; log $@ ; echo -n "$(tput sgr0)"
    }
     
    errorlog() {
        echo -n "$(tput setaf 1)" ; log $@ ; echo -n "$(tput sgr0)"
    }
     
    usage()
    {
        cat<<EOF
        $(tput setaf 3)
     Usage :
        $0 [-q] [-d] [ -s <$(tput sgr0)SIZE$(tput setaf 3)> | -p <$(tput sgr0)PERCENT USED$(tput setaf 3)> ] <$(tput sgr0)MOUNT POINT$(tput setaf 3)>
        $(tput sgr0)
    EOF
        exit 32
    }
     
     
    getfstoadd_old() {
    	infolog "#### Calcul de la taille Ã* ajouter pour que le FS soit Ã* $PTARGET% maximum ####"	
    	PTARGET=$(( $PTARGET - 1 ))
    	DFOUT=$(df -Pk $MOUNTPOINT | tail -n +2)
    	DFSIZE=$( echo $DFOUT | awk '{ print $2 }')	
    	DFFREE=$( echo $DFOUT | awk '{ print $4 }')	
    	TOADD=$( echo " $DFSIZE - $DFFREE - $PTARGET * $DFSIZE /100 " | bc )
    	PERCENT=$( echo "scale=2;100 * ( $DFSIZE - $DFFREE ) / $DFSIZE" | bc )
    	if [ $TOADD -lt 1 ]
    	then
    		infolog " => Rien Ã* ajouter, déjÃ* Ã* $PERCENT %"
    		infolog " => Il y a même $( printf "%'.0f" "$(( - $TOADD ))" ) KiB de trop"
    		echo "4" >> ${LOGFILE}
    		exit 4
    	else
    		infolog " => On ajoute $TOADD KiB"
    		infolog
    	fi
     
     
     
    }
     
     
    getfstoadd()
    {
    #set -vx 
        infolog "#### Calcul de la taille à ajouter pour que le FS soit à ${PTARGET}% maximum ####"    
        PTARGET=$(( $PTARGET - 1 ))
        DFOUT=$(df -Pk ${MOUNTPOINT} | tail -n +2)
        DFSIZE=$( echo ${DFOUT} | awk '{ print $2 }') 
        DFFREE=$( echo ${DFOUT} | awk '{ print $4 }')
    #    DFUSED=$(( DFSIZE - DFFREE ))
        DFUSED=$( echo ${DFOUT} | awk '{ print $3 }')
        DFPERCENT=$( echo ${DFOUT} | awk '{gsub("%","",$5); print $5 }')
    #    PERCENT=$( awk 'BEGIN {printf "%0.2f\n" , 100 * ( '${DFSIZE}' - '${DFFREE}' ) / '${DFSIZE}' }')
    #    PERCENT=$( awk 'BEGIN {printf "%0.2f\n" , ( 100 * '${DFUSED}' ) / '${DFSIZE}' }')
        PERCENT=$( awk 'BEGIN {printf "%0.0f\n" , ( 100 * '${DFUSED}' ) / '${DFSIZE}' }')
        DIFFPERCENT=$(awk 'BEGIN {printf "%0.0f\n" ,  '${DFPERCENT}' - '${PERCENT}' }')
        if [ ${PTARGET} -lt ${DFPERCENT} ]; then
            PTARGET=$(( PTARGET - DIFFPERCENT))
        fi
        NEWSIZE=$(awk 'BEGIN {printf "%0.1f\n" , ( '${DFUSED}' * 100 ) / '${PTARGET}' }' )
        #TOADD=$(awk 'BEGIN {printf "%0.0f\n" , ( NEWSIZE - DFSIZE ) / 1024 }' )
        #TOADD=$(awk 'BEGIN {printf "%0.0f\n" , ('${NEWSIZE}' - '${DFSIZE}') / 1024 }' )
        TOADD=$(awk 'BEGIN {printf "%0.0f\n" , '${NEWSIZE}' - '${DFSIZE}' }' )
        #TOADD=$( echo " ${DFSIZE} - ${DFFREE} - ${PTARGET} * ${DFSIZE} /100 " | bc )
        VG="$(lvs --noheadings -o vg_name $( mount | grep " ${MOUNTPOINT} " 2>/dev/null | awk '{print $1}' 2>/dev/null ))"
        VGFREE="$( vgdisplay --units k ${VG} 2>/dev/null | awk '/Free.*PE/ {printf "%0.0f\n" , $7}' )"
        if [ ${TOADD} -lt 1 ]; then
            infolog " => Rien a ajouter, deja a ${DFPERCENT}%"
            infolog " => Il y a meme $( printf "%'.0f" "$(( - ${TOADD} ))" ) KiB de trop"
            echo "4" >> ${LOGFILE}
            exit 4
        elif  [ ${TOADD} -ge ${VGFREE} ] ; then
            errorlog " => Il n'y a pas assez d'espace ${VGFREE} sur le VG "
            errorlog " => Il faut ajouter du disque "
            echo "4" >> ${LOGFILE}
            exit 4
        else
            noticelog " => On ajoute ${TOADD} KiB"
        fi
    #set +vx
    }
     
     
     
    #===============================================================================
    #  MAIN SCRIPT
    #===============================================================================
    while getopts ":p:s:q,d,h" opt; do
      case ${opt} in
        p) SVALUE=${OPTARG}
           OPERCENT=1
           ;;
        s) SVALUE=${OPTARG}
           OSIZE=1
           ;;
        q) QUIET=1
           ;;
        h) usage
           ;;
        d) set -vx
           ;;
        \?) echo "Option -${OPTARG} invalide" >&2
            usage
            ;;
      esac
    done
    shift $((OPTIND-1))
    #===============================================================================
    #  SANITY CHECKS
    #===============================================================================
    # Verif de la distribution
    if [ ! -e /etc/redhat-release ]; then
        errorlog "Les OS autre que Red Hat Enterprise Linux ne sont pas supprtes"
        exit 8
    fi
     
    # Verif du user executant le script
    if [ "$(id -nu)" != "root" ]; then
        errorlog "Vous devez Etre root pour utiliser ce script"
        exit 8
    else
        vTTY=$(tty | awk -F"/" '{ print $3"\\/"$4 }')
        vEXEC_USER=$(who | awk '/'${vTTY}'/ {gsub(".*\\\\","",$1);print $1}')
    fi
     
    # Verif des parametres passes au script.
    if [ ${OSIZE} -eq 1 ] && [ ${OPERCENT} -eq 1 ]; then
        errorlog "Options -p et -s incompatibles"
        usage
    fi
     
    # Verif du nb de parametre passe au script.
    if [ $# -ne 1 ] ; then usage ; fi
     
     
    # On log 
    echo -n "$(date "+%Y%m%d%H%M%S");$(hostname -s);${vEXEC_USER};$0 $@;" >> ${LOGFILE}
     
    # Verif du parametre 
    MOUNTPOINT=$1
     
    # Suppression du / en trop 
    if [ $( echo ${MOUNTPOINT} | wc -c) -ne 2 ]; then
        MOUNTPOINT=$( echo ${MOUNTPOINT} | sed "s/\/$//" )
    fi
     
    # Verification de la presence du / en premier caratctere
    if [ "$(echo ${MOUNTPOINT} | cut -c 1)" != "/" ]; then
        MOUNTPOINT="$(pwd)/${MOUNTPOINT}"
    fi
     
    # Verif du point de montage correspondant au FS 
    if [ ! -d ${MOUNTPOINT} ]; then
        errorlog "Le repertoire ${MOUNTPOINT} n'existe pas"
        echo "2" >> ${LOGFILE}
        exit 2
    fi
     
    # Verif que le FS est bien un FS 
    if [ "$(df -P ${MOUNTPOINT} | tail -n 1 | awk '{ print $NF }')" != "${MOUNTPOINT}" ]; then
        errorlog "${MOUNTPOINT} n'est pas un FS"
        echo "4" >> ${LOGFILE}
        exit 4
    fi
     
    # Verif du LV  
    LVNAME=$(df -P ${MOUNTPOINT} | tail -n 1 | awk '{ print $1 }')
    if [ $(lvs ${LVNAME} --noheadings 2>/dev/null | wc -l) -ne 1 ]; then
        errorlog "Le FS n'est pas sur un LV"
        echo "8" >> ${LOGFILE}
        exit 8
    fi
     
    # Verif du type du FS 
    # FSTYPE pris en compte : ext3 ext4 xfs gfs gfs2
    FSTYPE=$(df -PT ${MOUNTPOINT} | tail -n 1 | awk '{ print $2 }')
    if [ $( echo "${FSTYPE}" | grep -cE '^ext3$|^ext4$|^xfs$|^gfs$|^gfs2$' ) -ne 1 ]; then
        errorlog "Le type de FS ${FSTYPE} pour ${MOUNTPOINT} n'est pas pris en compte "
        echo "12" >> ${LOGFILE}
        exit 12
    fi

  9. #9
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    C'est exactement ce que je disais.
    Initialisation -> définition des fonctions -> traitement des options -> vérifications des assertions (sinon sortie) -> exécution du cœur du script.
    Pas de surprise.

    J'attire juste l'attention sur cette ligne, pour compléter ce qu'on disait :
    Le vrai $1 est l'option (ici "-s").
    Donc on fait un décalage par shift.
    Le paramètre positionnel $1 devient alors /home.

    Et pour les logiciels qui ont des options après les cibles ? Ils ont leur propre traitement personnalisé des options.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  10. #10
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Bonjour

    Plutôt oui.
    C'est là que ça coince.
    $1 est "/dev/mapper/vg_sys-lv_home"
    NF est le nombre de champs.
    $NF est donc le dernier champ. Ici, "/home"
    donc /home!=/home.
    ça y est je viens de comprendre.

    $1 n'est pas /dev/mapper/vg_sys-lv_home mais /home

    si on applique le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    df -P ${MOUNTPOINT} | tail -n 1 | awk '{ print $NF }
    dans lequel $MOUNTPOINT=/home

    on retrouve commae magie :

    /home

    donc /home=/home c'est tout bon !

    Par contre, pourquoi on désigne le point de montage et pas directement le Filesystem, ça reste un mystère...

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 377
    Points
    19 377
    Par défaut
    Par contre, pourquoi on désigne le point de montage et pas directement le Filesystem, ça reste un mystère...
    c'est ce que voit l'utilisateur ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Ou peut être que le message d’erreur envoyé en cas de filesystem plein, c’est le nom du point de montage ...

Discussions similaires

  1. [systeme] Point de montage : problème
    Par bebertc dans le forum Windows XP
    Réponses: 2
    Dernier message: 05/05/2008, 12h55
  2. Réponses: 4
    Dernier message: 29/03/2006, 10h42
  3. Créer un point de montage sur C:
    Par marcus333 dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 30/11/2005, 11h09
  4. [langage] recuperer le point de montage du cdrom
    Par tizef dans le forum Langage
    Réponses: 35
    Dernier message: 23/03/2005, 13h34
  5. Changer les points de montages des partitions
    Par Thrystan dans le forum Administration système
    Réponses: 6
    Dernier message: 13/08/2004, 16h46

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