source: client/engine/FileSystem.lib @ 562547a

918-git-images-111dconfigfileconfigure-oglivegit-imageslgromero-new-oglivemainmaint-cronmount-efivarfsmultivmmultivm-ogboot-installerogClonningEngineogboot-installer-jenkinsoglive-ipv6test-python-scriptsticket-301ticket-50ticket-50-oldticket-577ticket-585ticket-611ticket-612ticket-693ticket-700ubu24tplunification2use-local-agent-oglivevarios-instalacionwebconsole3
Last change on this file since 562547a was d3669a2, checked in by ramon <ramongomez@…>, 15 years ago

Corregir erratas; {{{ogReduceFs aplica mínimo + 10%: Close #191

git-svn-id: https://opengnsys.es/svn/trunk@1266 a21b9725-9963-47de-94b9-378ad31fedc9

  • Property mode set to 100755
File size: 27.3 KB
Line 
1#!/bin/bash
2#/**
3#@file    FileSystem.lib
4#@brief   Librería o clase FileSystem
5#@class   FileSystem
6#@brief   Funciones para gestión de sistemas de archivos.
7#@version 0.9
8#@warning License: GNU GPLv3+
9#*/
10
11
12#/**
13#         ogCheckFs int_ndisk int_npartition
14#@brief   Comprueba el estado de un sistema de archivos.
15#@param   int_ndisk      nº de orden del disco
16#@param   int_npartition nº de orden de la partición
17#@return  (nada)
18#@exception OG_ERR_FORMAT    Formato incorrecto.
19#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
20#@exception OG_ERR_PARTITION Partición desconocida o no accesible.
21#@note    Requisitos: *fsck*
22#@warning No se comprueban sistemas de archivos montados o bloqueados.
23#@todo    Definir salidas.
24#@version 0.9 - Primera adaptación para OpenGNSys.
25#@author  Ramon Gomez, ETSII Universidad de Sevilla
26#@date    2009-10-07
27#*/
28function ogCheckFs ()
29{
30# Variables locales.
31local PART TYPE PROG PARAMS
32
33#/// Error si no se reciben 2 parámetros.
34[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
35#/// Obtener partición.
36PART="$(ogDiskToDev $1 $2)" || return $?
37
38TYPE=$(ogGetFsType $1 $2)
39case "$TYPE" in
40    EXT[234])     PROG="e2fsck" ;;
41    REISERFS)     PROG="reiserfsck"; PARAMS="<<<\"Yes\"" ;;
42    JFS)          PROG="fsck.jfs" ;;
43    XFS)          PROG="fsck.xfs" ;;
44    NTFS|HNTFS)   PROG="ntfsfix" ;;
45    FAT32|HFAT32) PROG="dosfsck"; PARAMS="-a" ;;
46    FAT16|HFAT16) PROG="dosfsck"; PARAMS="-a" ;;
47    FAT12|HFAT12) PROG="dosfsck"; PARAMS="-a" ;;
48    *)            ogRaiseError $OG_ERR_PARTITION "$1, $2, $TYPE"
49                      return $? ;;
50esac
51#/// Error si el sistema de archivos esta montado o bloqueado.
52if ogIsMounted $1 $2; then
53    ogRaiseError $OG_ERR_PARTITION "$1 $2"       # Indicar nuevo error
54    return $?
55fi
56if ogIsLocked $1 $2; then
57    ogRaiseError $OG_ERR_LOCKED "$1 $2"
58    return $?
59fi
60#/// Comprobar en modo uso exclusivo.
61ogLock $1 $2
62eval $PROG $PARAMS $PART
63ERRCODE=$?
64case $ERRCODE in
65    0)    ;;
66    127)  ogRaiseError $OG_ERR_NOTEXEC "$PROG" ;;
67    *)    ogRaiseError $OG_ERR_PARTITION "$1 $2" ;;
68esac
69ogUnlock $1 $2
70return $ERRCODE
71}
72
73
74#/**
75#         ogExtendFs int_ndisk int_npartition
76#@brief   Extiende un sistema de archivos al tamaño de su partición.
77#@param   int_ndisk      nº de orden del disco
78#@param   int_npartition nº de orden de la partición
79#@return  (nada)
80#@exception OG_ERR_FORMAT   Formato incorrecto.
81#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
82#@exception OG_ERR_PARTITION Partición desconocida o no accesible.
83#@note    Requisitos: *resize*
84#@version 0.1 -  Integracion para Opengnsys  -  EAC:   EnlargeFileSystem() en ATA.lib
85#@author  Antonio J. Doblas Viso. Universidad de Malaga
86#@date    2008-10-27
87#@version 0.9 - Primera adaptacion para OpenGNSys.
88#@author  Ramon Gomez, ETSII Universidad de Sevilla
89#@date    2009-09-23
90#*/
91function ogExtendFs ()
92{
93# Variables locales.
94local PART PROG PARAMS
95
96#/// Si se solicita, mostrar ayuda.
97if [ "$*" == "help" ]; then
98    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
99           "$FUNCNAME 1 1"
100    return
101fi
102#/// Error si no se reciben 2 parámetros.
103[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
104
105#/// Obtener partición.
106PART="$(ogDiskToDev $1 $2)" || return $?
107
108ogUnmount $1 $2 2>/dev/null
109#/// Redimensionar al tamano máximo según el tipo de partición.
110TYPE=$(ogGetFsType $1 $2)
111case "$TYPE" in
112    EXT[234])   PROG="resize2fs"; PARAMS="-f" ;;
113    REISERFS)   PROG="resize_reiserfs"; PARAMS="-f" ;;
114    NTFS|HNTFS) PROG="ntfsresize"; PARAMS="<<<\"y\" -f" ;;
115    *)          ogRaiseError $OG_ERR_PARTITION "$1 $2 $TYPE"
116                return $? ;;
117esac
118#/// Error si el sistema de archivos está montado o bloqueado.
119if ogIsMounted $1 $2; then
120    ogRaiseError $OG_ERR_PARTITION "$1 $2"       # Indicar nuevo error
121    return $?
122fi
123if ogIsLocked $1 $2; then
124    ogRaiseError $OG_ERR_LOCKED "$1 $2"
125    return $?
126fi
127#/// Redimensionar en modo uso exclusivo.
128ogLock $1 $2
129eval $PROG $PARAMS $PART &>/dev/null
130ERRCODE=$?
131case $ERRCODE in
132    0)    ;;
133    127)  ogRaiseError $OG_ERR_NOTEXEC "$PROG" ;;
134    *)    ogRaiseError $OG_ERR_PARTITION "$1 $2" ;;
135esac
136ogUnlock $1 $2
137return $ERRCODE
138}
139
140
141#/**
142#         ogFormat int_ndisk int_npartition | CACHE
143#@see     ogFormatFs ogFormatCache
144#*/
145function ogFormat ()
146{
147case "$*" in
148    CACHE|cache)  ogFormatCache ;;
149    *)            ogFormatFs "$@" ;;
150esac
151}
152
153
154#/**
155#         ogFormatFs int_ndisk int_npartition [type_fstype] [str_label]
156#@brief   Formatea un sistema de ficheros según el tipo de su partición.
157#@param   int_ndisk      nº de orden del disco
158#@param   int_npartition nº de orden de la partición
159#@param   type_fstype    mnemónico de sistema de ficheros a formatear
160#@param   str_label      etiqueta de volumen (opcional)
161#@return  (por determinar)
162#@exception OG_ERR_FORMAT    Formato incorrecto.
163#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
164#@exception OG_ERR_PARTITION Partición no accesible o desconocida.
165#@note    Requisitos:   mkfs*
166#@warning No formatea particiones montadas ni bloqueadas.
167#@todo    Definir salidas.
168#@version 0.9 - Primera versión para OpenGNSys.
169#@author  Ramon Gomez, ETSII Universidad de Sevilla
170#@date    2009-10-08
171#*/ ##
172function ogFormatFs ()
173{
174# Variables locales
175local PART ID TYPE LABEL PROG PARAMS ERRCODE
176
177# Si se solicita, mostrar ayuda.
178if [ "$*" == "help" ]; then
179    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition [str_label]" \
180           "$FUNCNAME 1 1" \
181           "$FUNCNAME 1 1 EXT4" \
182           "$FUNCNAME 1 1 \"DATA\"" \
183           "$FUNCNAME 1 1 EXT4 \"DATA\""
184    return
185fi
186# Error si no se reciben entre 2 y 4 parámetros.
187[ $# -ge 2 -a $# -le 4 ] || ogRaiseError $OG_ERR_FORMAT || return $?
188# Obtener dispositivo y tipo de sisitema de archivos.
189PART="$(ogDiskToDev $1 $2)" || return $?
190TYPE="$(ogGetFsType $1 $2)" || return $?
191
192# Elegir tipo de formato segun el tipo de particion.
193case "$3" in
194    EXT2)      ID=83; PROG="mkfs.ext2";;
195    EXT3)      ID=83; PROG="mkfs.ext3";;
196    EXT4)      ID=83; PROG="mkfs.ext4";;
197    REISERFS)  ID=83; PROG="mkfs.reiserfs"; PARAMS="-f" ;;
198    REISER4)   ID=83; PROG="mkfs.reiser4";;
199    XFS)       ID=83; PROG="mkfs.xfs"; PARAMS="-f" ;;
200    JFS)       ID=83; PROG="mkfs.jfs"; PARAMS="<<<\"y\"";;
201    NTFS)      ID=7;  PROG="mkntfs"; PARAMS="-f" ;;
202    HNTFS)     ID=17; PROG="mkntfs"; PARAMS="-f" ;;
203    FAT32)     ID=b;  PROG="mkdosfs"; PARAMS="-F 32" ;;
204    HFAT32)    ID=1b; PROG="mkdosfs"; PARAMS="-F 32" ;;
205    FAT16)     ID=6;  PROG="mkdosfs"; PARAMS="-F 16" ;;
206    HFAT16)    ID=16; PROG="mkdosfs"; PARAMS="-F 16" ;;
207    FAT12)     ID=1;  PROG="mkdosfs"; PARAMS="-F 12" ;;
208    HFAT12)    ID=11; PROG="mkdosfs"; PARAMS="-F 12" ;;
209    *)         LABEL="$3" ;;
210esac
211# Si no se indica explícitamente, detectar el tipo de sistema de archivos.
212if [ -z "$PROG" ]; then
213    case "$TYPE" in
214        EXT2)         PROG="mkfs.ext2";;
215        EXT3)         PROG="mkfs.ext3";;
216        EXT4)         PROG="mkfs.ext4";;
217        REISERFS)     PROG="mkfs.reiserfs"; PARAMS="-f" ;;
218        REISER4)      PROG="mkfs.reiser4";;
219        XFS)          PROG="mkfs.xfs"; PARAMS="-f" ;;
220        JFS)          PROG="mkfs.jfs"; PARAMS="<<<\"y\"";;
221        NTFS|HNTFS)   PROG="mkntfs"; PARAMS="-f" ;;
222        FAT32|HFAT32) PROG="mkdosfs"; PARAMS="-F 32" ;;
223        FAT16|HFAT16) PROG="mkdosfs"; PARAMS="-F 16" ;;
224        FAT12|HFAT12) PROG="mkdosfs"; PARAMS="-F 12" ;;
225        *)            ogRaiseError $OG_ERR_PARTITION "$1 $2 $TYPE"
226                      return $? ;;
227    esac
228else
229    [ $TYPE == "$3" -o $ID == "$(ogGetPartitionId $1 $2)" ] || ogRaiseError $OG_ERR_PARTITION "$3 != $TYPE" || return $?
230fi
231# Comprobar consistencia entre id. de partición y tipo de sistema de archivos.
232[ -n "$PROG" ] || ogRaiseError $OG_ERR_PARTITION "$3 != $TYPE" || return $?
233
234# Etiquetas de particion.
235if [ -z "$LABEL" ]; then
236    [ "$4" != "CACHE" ] || ogRaiseError $OG_ERR_FORMAT "$MSG_RESERVEDVALUE: CACHE" || return $?
237    [ -n "$4" ] && PARAMS="$PARAMS -L $4"
238else
239    PARAMS="$PARAMS -L $LABEL"
240fi
241
242# Error si la particion esta montada o está bloqueada.
243if ogIsMounted $1 $2; then
244    ogRaiseError $OG_ERR_PARTITION "$1 $2"       # Indicar nuevo error
245    return $?
246fi
247if ogIsLocked $1 $2; then
248    ogRaiseError $OG_ERR_LOCKED "$1 $2"
249    return $?
250fi
251# Formatear en modo uso exclusivo.
252ogLock $1 $2
253eval $PROG $PARAMS $PART 2>/dev/null
254ERRCODE=$?
255case $ERRCODE in
256    0)    ;;
257    127)  ogRaiseError $OG_ERR_NOTEXEC "$PROG" ;;
258    *)    ogRaiseError $OG_ERR_PARTITION "$1 $2" ;;
259esac
260ogUnlock $1 $2
261return $ERRCODE
262}
263
264
265#/**
266#         ogGetFsType int_ndisk int_npartition
267#@brief   Devuelve el mnemonico con el tipo de sistema de archivos.
268#@param   int_ndisk      nº de orden del disco
269#@param   int_npartition nº de orden de la partición
270#@return  Mnemonico
271#@note    Mnemonico: { EXT2, EXT3, EXT4, REISERFS, XFS, JFS, LINUX-SWAP, LINUX-LVM, LINUX-RAID, SOLARIS, FAT16, HFAT16, FAT32, HFAT32, NTFS, HNTFS, WIN-DYNAMIC, CACHE, EMPTY, EXTENDED, UNKNOWN }
272#@exception OG_ERR_FORMAT   Formato incorrecto.
273#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
274#@version 0.1 -  Integracion para Opengnsys  -  EAC:   TypeFS() en ATA.lib
275#@author  Antonio J. Doblas Viso. Universidad de Malaga
276#@date    2008-10-27
277#@version 0.9 - Primera adaptacion para OpenGNSys.
278#@author  Ramon Gomez, ETSII Universidad de Sevilla
279#@date    2009-07-21
280#*/ ##
281function ogGetFsType () {
282
283# Variables locales.
284local ID TYPE
285
286# Si se solicita, mostrar ayuda.
287if [ "$*" == "help" ]; then
288    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
289           "$FUNCNAME 1 1  =>  NTFS"
290    return
291fi
292# Error si no se reciben 2 parámetros.
293[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
294
295# Detectar id. de tipo de partición y codificar al mnemonico.
296DISK=$(ogDiskToDev "$1") || return $?
297ID=$(ogGetPartitionId "$1" "$2") || return $?
298case "$ID" in
299     0)         TYPE="EMPTY" ;;
300     1)         TYPE="FAT12" ;;
301     5|f)       TYPE="EXTENDED" ;;
302     [6e])      TYPE="FAT16" ;;
303     7)         TYPE="NTFS" ;;          # Nota: también puede ser EXFAT
304     [bc])      TYPE="FAT32" ;;
305     11)        TYPE="HFAT12" ;;
306     12)        TYPE="COMPAQDIAG" ;;
307     1[6e])     TYPE="HFAT16" ;;
308     17)        TYPE="HNTFS" ;;
309     1[bc])     TYPE="HFAT32" ;;
310     42)        TYPE="WIN-DYNAMIC" ;;
311     82)        TYPE="LINUX-SWAP" ;;
312     83)        TYPE="$(parted -s $DISK print | awk -v var=$2 '{if ($1==var) {print toupper($6)}}')"
313                TYPE=${TYPE:-"EXT3"}
314                ;;
315     8e)        TYPE="LINUX-LVM" ;;
316     a7)        TYPE="CACHE" ;;         # (compatibilidad con Brutalix)
317     bf)        TYPE="SOLARIS" ;;
318     ca)        TYPE="CACHE" ;;
319     fd)        TYPE="LINUX-RAID" ;;
320     *)         TYPE="UNKNOWN" ;;
321esac
322echo $TYPE
323}
324
325
326#/**
327#         ogGetMountPoint int_ndisk int_npartition
328#@brief   Devuelve el punto de montaje de un sistema de archivos.
329#@param   int_ndisk      nº de orden del disco
330#@param   int_npartition nº de orden de la partición
331#@return  Punto de montaje
332#@exception OG_ERR_FORMAT    Formato incorrecto.
333#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
334#@note    Requisitos: \c mount* \c awk
335#@version 0.9 - Primera versión para OpenGNSys.
336#@author  Ramon Gomez, ETSII Universidad de Sevilla
337#@date    2009-10-15
338#*/ ##
339function ogGetMountPoint ()
340{
341# Variables locales
342local PART
343# Si se solicita, mostrar ayuda.
344if [ "$*" == "help" ]; then
345    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
346           "$FUNCNAME 1 1  =>  /mnt/sda1"
347    return
348fi
349# Error si no se reciben 2 parámetros.
350[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
351# Obtener partición.
352PART="$(ogDiskToDev $1 $2)" || return $?
353
354echo $(mount | awk -v P=$PART '{if ($1==P) {print $3}}')
355}
356
357
358#/**
359#         ogIsFormated int_ndisk int_npartition
360#@brief   Comprueba si un sistema de archivos está formateado.
361#@param   int_ndisk      nº de orden del disco o volumen.
362#@param   int_npartition nº de orden del sistema de archivos.
363#@return  int_code       Código de salida
364#@version 0.91 - Adaptación inicial para comprobar que existe caché.
365#@author  Ramon Gomez, ETSII Universidad de Sevilla
366#@date    2010-03-18
367#*/ ##
368function ogIsFormated ()
369{
370# Variables locales
371local DISK
372if [ "$*" == "help" ]; then
373    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
374           "if $FUNCNAME 1 1; then ... ; fi"
375    return
376fi
377# Error si no se reciben 2 parámetros.
378[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
379
380DISK=$(ogDiskToDev "$1")
381test -n "$(parted -sm $DISK print 2>/dev/null | \
382                      awk -F: -v sf="$2" '{if ($1==sf) print $5}')"
383}
384
385
386#/**
387#         ogIsMounted int_ndisk int_npartition
388#@brief   Comprueba si un sistema de archivos está montado.
389#@param   int_ndisk      nº de orden del disco
390#@param   int_npartition nº de orden de la partición
391#@return  Código de salida: 0 - sin montar, 1 - montado.
392#@version 0.9 - Primera versión para OpenGNSys.
393#@author  Ramon Gomez, ETSII Universidad de Sevilla
394#@date    2009-10-15
395#*/ ##
396function ogIsMounted ()
397{
398# Si se solicita, mostrar ayuda.
399if [ "$*" == "help" ]; then
400    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
401           "if $FUNCNAME 1 1; then ... ; fi"
402    return
403fi
404# Error si no se reciben 2 parámetros.
405[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
406
407test -n "$(ogGetMountPoint $1 $2)"
408}
409
410
411#/**
412#         ogIsLocked int_ndisk int_npartition
413#@brief   Comprueba si una partición está bloqueada por una operación de uso exclusivo.
414#@param   int_ndisk      nº de orden del disco
415#@param   int_npartition nº de orden de la partición
416#@return  Código de salida: 0 - sin bloquear, 1 - bloqueada.
417#@note    El fichero de bloqueo se localiza en \c /var/lock/part, siendo \c part el dispositivo de la partición, sustituyendo el carácter "/" por "-".
418#@version 0.9 - Primera versión para OpenGNSys.
419#@author  Ramon Gomez, ETSII Universidad de Sevilla
420#@date    2009-09-03
421#*/ ##
422function ogIsLocked ()
423{
424# Variables locales
425local PART LOCKFILE
426
427# Si se solicita, mostrar ayuda.
428if [ "$*" == "help" ]; then
429    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
430           "if $FUNCNAME 1 1; then ... ; fi"
431    return
432fi
433# Error si no se reciben 2 parámetros.
434[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
435
436# Obtener partición.
437PART="$(ogDiskToDev $1 $2)" || return $?
438
439# Comprobar existencia del fichero de bloqueo.
440LOCKFILE="/var/lock/lock${PART//\//-}"
441test -f $LOCKFILE
442}
443
444
445#/**
446#         ogLock int_ndisk int_npartition
447#@see     ogLockPartition
448#*/
449function ogLock ()
450{
451ogLockPartition "$@"
452}
453
454#/**
455#         ogLockPartition int_ndisk int_npartition
456#@brief   Genera un fichero de bloqueo para una partición en uso exlusivo.
457#@param   int_ndisk      nº de orden del disco
458#@param   int_npartition nº de orden de la partición
459#@return  (nada)
460#@exception OG_ERR_FORMAT    Formato incorrecto.
461#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
462#@note    El fichero de bloqueo se localiza en \c /var/lock/part, siendo \c part el dispositivo de la partición, sustituyendo el carácter "/" por "-".
463#@version 0.9 - Primera versión para OpenGNSys.
464#@author  Ramon Gomez, ETSII Universidad de Sevilla
465#@date    2009-09-03
466#*/ ##
467function ogLockPartition ()
468{
469# Variables locales
470local PART LOCKFILE
471
472# Si se solicita, mostrar ayuda.
473if [ "$*" == "help" ]; then
474    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
475           "$FUNCNAME 1 1"
476    return
477fi
478# Error si no se reciben 2 parámetros.
479[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
480
481# Obtener partición.
482PART="$(ogDiskToDev $1 $2)" || return $?
483
484# Crear archivo de bloqueo exclusivo.
485LOCKFILE="/var/lock/lock${PART//\//-}"
486touch $LOCKFILE
487}
488
489
490#/**
491#         ogMount int_ndisk int_npartition
492#@see     ogMountFs ogMountCache ogMountCdrom
493#*/ ##
494function ogMount ()
495{
496case "$*" in
497    CACHE|cache)
498        ogMountCache ;;
499    CDROM|cdrom)
500        ogMountCdrom ;;
501    *)  ogMountFs "$@" ;;
502esac
503}
504
505
506#/**
507#         ogMountFs int_ndisk int_npartition
508#@brief   Monta un sistema de archivos.
509#@param   int_ndisk      nº de orden del disco
510#@param   int_npartition nº de orden de la partición
511#@return  Punto de montaje
512#@exception OG_ERR_FORMAT    Formato incorrecto.
513#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
514#@exception OG_ERR_PARTITION Tipo de particion desconocido o no se puede montar.
515#@version 0.1 -  Integracion para Opengnsys  -  EAC:   MountPartition() en FileSystem.lib
516#@author  Antonio J. Doblas Viso. Universidad de Malaga
517#@date    2008-10-27
518#@version 0.9 - Primera version para OpenGNSys.
519#@author  Ramon Gomez, ETSII Universidad de Sevilla
520#@date    2009-09-28
521#*/ ##
522function ogMountFs ()
523{
524# Variables locales
525local PART TYPE MNTDIR MOUNT PARAMS
526
527# Si se solicita, mostrar ayuda.
528if [ "$*" == "help" ]; then
529    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
530           "$FUNCNAME 1 1  =>  /mnt/sda1"
531    return
532fi
533# Error si no se reciben 2 parámetros.
534[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
535
536# Obtener partición.
537PART="$(ogDiskToDev $1 $2)" || return $?
538
539# Comprobar si el sistema de archivos ya está montada.
540MNTDIR="$(ogGetMountPoint $1 $2)"
541# Si no, montarla en un directorio de sistema
542if [ -z "$MNTDIR" ]; then
543    # Error si la particion esta bloqueada.
544    ogIsLocked $1 $2 && ogRaiseError $OG_ERR_LOCKED "$1 $2" && return $?
545    # Crear punto de montaje o enlace símbolico para Caché local.
546    MNTDIR=${PART/dev/mnt}
547    TYPE="$(ogGetFsType $1 $2)" || return $?
548    if [ "$TYPE" == "CACHE" -a -n "$OGCAC" ]; then
549        ln -fs $OGCAC $MNTDIR
550    else
551        mkdir -p $MNTDIR
552    fi
553    # Montar según el tipo de sitema de archivos.
554    case "$TYPE" in
555        CACHE)      MOUNT=mount ;;
556        EXT[234])   MOUNT=mount ;;
557        REISERFS)   insmod /lib/modules/$(uname -r)/kernel/fs/reiserfs/reiserfs.ko 2>/dev/null
558                    MOUNT=mount ;;
559        JFS)        insmod /lib/modules/$(uname -r)/kernel/fs/jfs/jfs.ko 2>/dev/null
560                    MOUNT=mount ;;
561        XFS)        insmod /lib/modules/$(uname -r)/kernel/fs/xfs/xfs.ko 2>/dev/null
562                    MOUNT=mount ;;
563        NTFS|HNTFS) MOUNT=ntfs-3g ;;
564        FAT16|FAT32|HFAT16|HFAT32)
565                    MOUNT=mount; PARAMS="-t vfat" ;;
566        *)  #/// Error, si la partición no es montable.
567            rmdir $MNTDIR
568            ogRaiseError $OG_ERR_PARTITION "$1, $2, $TYPE"
569            return $OG_ERR_PARTITION
570            ;;
571    esac
572    $MOUNT $PARAMS $PART $MNTDIR || $MOUNT $PARAMS $PART $MNTDIR -o force,remove_hiberfile || ogRaiseError $OG_ERR_PARTITION "$1, $2, $TYPE" || return $?
573        # linea temporal durante desarrollo para poder usar el cliente completo nfs y testeas nuevas herramientas.
574    if grep -q nfsroot /proc/cmdline; then
575                echo "$PART $MNTDIR" >> /etc/mtab
576        fi
577        # fin linea temporal.
578fi
579echo $MNTDIR
580}
581
582
583#####  PRUEBAS
584# Montar CDROM
585function ogMountCdrom ()
586{
587local DEV MNTDIR
588DEV="/dev/cdrom"            # Por defecto
589MNTDIR=$(mount | awk -v D=$DEV '{if ($1==D) {print $3}}')
590if [ -z "$MNTDIR" ]; then
591    MNTDIR=${DEV/dev/mnt}
592    mkdir -p $MNTDIR
593    mount -t iso9660 $DEV $MNTDIR || ogRaiseError $OG_ERR_PARTITION "cdrom" || return $?
594fi
595echo $MNTDIR
596}
597
598
599#/**
600#         ogReduceFs int_ndisk int_npartition
601#@brief   Reduce el tamaño del sistema de archivos, sin tener en cuenta el espacio libre.
602#@param   int_ndisk      nº de orden del disco
603#@param   int_npartition nº de orden de la partición
604#@return  int_tamañoKB - tamaño en KB
605#@exception OG_ERR_FORMAT    Formato incorrecto.
606#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
607#@exception OG_ERR_PARTITION Partición desconocida o no accesible.
608#@warning En Windows, se borran los ficheros pagefile.sys e hiberfile.sys
609#@warning El sistema de archivos se amplía al mínimo + 10%.
610#@note    Requisitos:   *resize*
611#@version 0.1 -  Integracion para Opengnsys  -  EAC:   ReduceFileSystem() en ATA.lib
612#@author  Antonio J. Doblas Viso. Universidad de Malaga
613#@date    2008-10-27
614#@version 0.9 - Primera version para OpenGNSys.
615#@author  Ramon Gomez, ETSII Universidad de Sevilla
616#@date    2009-09-23
617#@version 0.9.2 - Añadir un 10% al tamaño mínimo requerido.
618#@author  Ramon Gomez, ETSII Universidad de Sevilla
619#@date    2010-09-27
620#*/ ##
621function ogReduceFs ()
622{
623# Variables locales
624local PART BLKS SIZE
625
626# Si se solicita, mostrar ayuda.
627if [ "$*" == "help" ]; then
628    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
629           "$FUNCNAME 1 1"
630    return
631fi
632# Error si no se reciben 2 parámetros.
633[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
634
635# Obtener partición.
636PART="$(ogDiskToDev $1 $2)" || return $?
637
638# Redimensionar según el tipo de particion.
639case "$(ogGetFsType $1 $2)" in
640    EXT[234])
641        ogUnmount $1 $2 2>/dev/null
642        # Ext2/3/4: Tamaño de los bloques del sistema de archivos
643        BLKS=$(tune2fs -l $PART | awk '/Block size/ {print int($3/512)}')
644        # Traduce el num. en sectores de 512B a tamano en MB.
645        SIZE=$(resize2fs -P $PART 2>/dev/null | \
646                       awk -v B=$BLKS '/minimum size/ {print int($7*1.1*B/2048)}')
647        resize2fs -fp $PART "${SIZE}M" &>/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
648            ;;
649#    REISERFS)          # Usar "resize_reiserfs"
650#           ;;
651    NTFS|HNTFS)
652        ogDeleteFile $1 $2 pagefile.sys
653        ogDeleteFile $1 $2 hiberfile.sys
654        ogUnmount $1 $2 2>/dev/null
655        # NTFS: Obtiene tamaño mínimo en MB.
656        SIZE=$(ntfsresize -fi $PART | awk '/resize at/ {print int($8*1.1)}')
657        ntfsresize -fns "${SIZE}M" $PART >/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
658        ntfsresize -fs "${SIZE}M" $PART <<<"y" >/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
659            ;;
660    *)  ogRaiseError $OG_ERR_PARTITION "$1,$2"
661            return $? ;;
662esac
663#/// Mostrar nuevo tamaño en KB.
664echo $[SIZE*1024]
665}
666
667
668#/**
669#         ogUnlock int_ndisk int_npartition
670#@see     ogUnlockPartition
671#*/
672function ogUnlock ()
673{
674ogUnlockPartition "$@"
675}
676
677#/**
678#         ogUnlockPartition int_ndisk int_npartition
679#@brief   Elimina el fichero de bloqueo para una particion.
680#@param   int_ndisk      nº de orden del disco
681#@param   int_npartition nº de orden de la partición
682#@return  (nada)
683#@exception OG_ERR_FORMAT    Formato incorrecto.
684#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
685#@note    El fichero de bloqueo se localiza en \c /var/lock/part, siendo \c part el dispositivo de la partición, sustituyendo el carácter "/" por "-".
686#@version 0.9 - Primera versión para OpenGNSys.
687#@author  Ramon Gomez, ETSII Universidad de Sevilla
688#@date    2009-09-03
689#*/ ##
690function ogUnlockPartition ()
691{
692# Variables locales
693local PART LOCKFILE
694
695# Si se solicita, mostrar ayuda.
696if [ "$*" == "help" ]; then
697    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
698           "$FUNCNAME 1 1"
699    return
700fi
701# Error si no se reciben 2 parámetros.
702[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
703
704# Obtener partición.
705PART="$(ogDiskToDev $1 $2)" || return $?
706
707# Borrar archivo de bloqueo exclusivo.
708LOCKFILE="/var/lock/lock${PART//\//-}"
709rm -f $LOCKFILE
710}
711
712
713#/**
714#         ogUnmount int_ndisk int_npartition
715#@see     ogUnmountFs
716#*/
717function ogUnmount ()
718{
719ogUnmountFs "$@"
720}
721
722#/**
723#         ogUnmountFs int_ndisk int_npartition
724#@brief   Desmonta un sistema de archivos.
725#@param   int_ndisk      nº de orden del disco
726#@param   int_npartition nº de orden de la partición
727#@return  Nada
728#@exception OG_ERR_FORMAT    Formato incorrecto.
729#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
730#@warning La partición no está previamente montada o no se puede desmontar.
731#@version 0.1 -  Integracion para Opengnsys  -  EAC:  UmountPartition() en FileSystem.lib
732#@author  Antonio J. Doblas Viso. Universidad de Malaga
733#@date    2008-10-27
734#@version 0.9 - Primera version para OpenGNSys.
735#@author  Ramon Gomez, ETSII Universidad de Sevilla
736#@date    2009-09-28
737#*/ ##
738function ogUnmountFs ()
739{
740# Variables locales
741local PART MNTDIR
742
743# Si se solicita, mostrar ayuda.
744if [ "$*" == "help" ]; then
745    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" "$FUNCNAME 1 1"
746    return
747fi
748# Error si no se reciben 2 parámetros.
749[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
750
751# Obtener partición y punto de montaje.
752PART="$(ogDiskToDev $1 $2)" || return $?
753MNTDIR="$(ogGetMountPoint $1 $2)"
754
755# Si está montada, desmontarla.
756if [ -n "$MNTDIR" ]; then
757    # Error si la particion está bloqueada.
758    ogIsLocked $1 $2 && ogRaiseError $OG_ERR_LOCKED "$1 $2" && return $?
759    # Desmontar y borrar punto de montaje.
760    umount $PART 2>/dev/null || ogEcho warning "$FUNCNAME: $MSG_DONTUNMOUNT: \"$1,$2\""
761    rmdir $MNTDIR 2>/dev/null || rm -f $MNTDIR 2>/dev/null
762        # linea temporal durante desarrollo para testear nuevas herramientas con el cliente completo nfs
763    if grep -q nfsroot /proc/cmdline; then
764                cat /etc/mtab | grep -v $PART > /var/tmp/mtab.temporal && cp /var/tmp/mtab.temporal /var/tmp/mtab && rm /var/tmp/mtab.temporal
765        fi
766        # fin linea temporal.
767else
768    ogEcho warning "$MSG_DONTMOUNT: \"$1,$2\""
769fi
770}
771
772
773#/**
774#         ogUnmountAll int_ndisk
775#@brief   Desmonta todos los sistema de archivos de un disco, excepto el caché local.
776#@param   int_ndisk      nº de orden del disco
777#@return  Nada
778#@exception OG_ERR_FORMAT    Formato incorrecto.
779#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
780#@warning No se desmonta la partición marcada como caché local.
781#@version 0.9 - Versión para OpenGNSys.
782#@author  Ramon Gomez, ETSII Universidad de Sevilla
783#@date    2009/10/07
784#*/ ##
785function ogUnmountAll ()
786{
787# Variables locales
788local DISK PART
789# Si se solicita, mostrar ayuda.
790if [ "$*" == "help" ]; then
791    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" "FUNCNAME 1"
792    return
793fi
794# Error si no se recibe 1 parámetro.
795[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
796
797# Obtener partición y punto de montaje.
798DISK="$(ogDiskToDev $1)" || return $?
799for ((PART=1; PART<=$(ogGetPartitionsNumber $1); PART++)); do
800    case "$(ogGetFsType $1 $PART)" in
801        CACHE|LINUX-SWAP)
802           ;;
803        *)
804           ogUnmount $1 $PART ;;
805    esac
806done
807}
808
809#/**  @function ogGetFsSize: @brief Muestra el tamanio del sistema de archivos indicado, permite definir la unidad de medida, por defecto GB
810#@param  $1 int_diskEAC
811#@param $2 int_PartitionEAC
812#@param $3 str_UnidadMediada            parametro opcional, admite [ kB MB GB -default GB]
813#@return  cadena con int_TotalSize:int_DataSize:int_DataFree
814#@warning  Salidas de errores no determinada
815#@warning
816#@attention
817#@version 0.1 -  Integracion para Opengnsys  -  EAC:  SizeFileSystem() en FileSystem.lib
818#@author  Antonio J. Doblas Viso. Universidad de Malaga
819#@date    2008-10-27
820#*/
821function ogGetFsSize () {
822if [ $# = 0 ]
823then
824        echo "sintaxis: ogGetFsSize int_disco int_partition str_SizeOutput [ kB MB GB -default GB]-]" red
825        echo "devuelve int_size : int_data : int_free" red
826return
827fi
828if [ $# -ge 2 ]
829then
830        particion=`ogMount $1 $2 ` #1>/dev/null 2>&1
831        if [ -z $3 ]
832                then
833                        unit=GB  # s B kB MB GB TB %
834                else
835                        unit=$3
836        fi
837        case $unit in
838                kB)
839                        factor="1.024";
840                        valor=`df | grep  $particion | awk -F" " '{size=$2*1.024; used=$3*1.024; free=$4*1.024; printf "%d:%d:%d", size,used,free}'`
841                ;;
842                MB)
843                        factor="1.024/1000";
844                        valor=`df | grep  $particion | awk -F" " '{size=$2*1.024/1000; used=$3*1.024/1000; free=$4*1.024/1000; printf "%d:%d:%d", size,used,free}'`
845                ;;
846                GB)
847                        factor="1.024/1000000";
848                        valor=`df | grep $particion | awk -F" " '{size=$2*1.024/1000000; used=$3*1.024/1000000; free=$4*1.024/1000000; printf "%f:%f:%f", size,used,free}'`
849                ;;
850        esac
851        #echo $valor
852        #NumberRound $valor
853        #valor=`NumberRound $valor`;
854        ogUnmount $1 $2 1>/dev/null 2>&1
855        echo $valor
856
857fi
858
859}
Note: See TracBrowser for help on using the repository browser.