source: client/engine/FileSystem.lib @ cd95622

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 cd95622 was 7685100, checked in by ramon <ramongomez@…>, 14 years ago

version 1.0.1: adaptar funciones ogIs... a valores de la API 1.0: 0=true, 1=false (cerrar #396).

git-svn-id: https://opengnsys.es/svn/branches/version1.0@1983 a21b9725-9963-47de-94b9-378ad31fedc9

  • Property mode set to 100755
File size: 31.6 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 -sm $DISK print 2>/dev/null | \
313                            awk -F: -v fs=$2 '{if ($1==fs) {print toupper($5)}}')"
314                # Si el tipo no es válido para partición Linux, Ext3 por defecto.
315                case "$TYPE" in
316                     EXT[234]|REISERFS|REISER4|BTRFS|JFS|XFS)
317                         ;;
318                     *)  TYPE="EXT3" ;;
319                esac
320                ;;
321     8e)        TYPE="LINUX-LVM" ;;
322     a7)        TYPE="CACHE" ;;         # (compatibilidad con Brutalix)
323     af)        TYPE="HFS" ;;
324     bf)        TYPE="SOLARIS" ;;
325     ca)        TYPE="CACHE" ;;
326     fd)        TYPE="LINUX-RAID" ;;
327     *)         TYPE="UNKNOWN" ;;
328esac
329echo $TYPE
330}
331
332
333#/**
334#         ogGetMountPoint int_ndisk int_npartition
335#@brief   Devuelve el punto de montaje de un sistema de archivos.
336#@param   int_ndisk      nº de orden del disco
337#@param   int_npartition nº de orden de la partición
338#@return  Punto de montaje
339#@exception OG_ERR_FORMAT    Formato incorrecto.
340#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
341#@note    Requisitos: \c mount* \c awk
342#@version 0.9 - Primera versión para OpenGNSys.
343#@author  Ramon Gomez, ETSII Universidad de Sevilla
344#@date    2009-10-15
345#*/ ##
346function ogGetMountPoint ()
347{
348# Variables locales
349local PART
350# Si se solicita, mostrar ayuda.
351if [ "$*" == "help" ]; then
352    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
353           "$FUNCNAME 1 1  =>  /mnt/sda1"
354    return
355fi
356# Error si no se reciben 2 parámetros.
357[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
358# Obtener partición.
359PART="$(ogDiskToDev $1 $2)" || return $?
360
361mount | awk -v P=$PART '{if ($1==P) {print $3}}'
362}
363
364
365#/**
366#         ogIsFormated int_ndisk int_npartition
367#@brief   Comprueba si un sistema de archivos está formateado.
368#@param   int_ndisk      nº de orden del disco o volumen.
369#@param   int_npartition nº de orden del sistema de archivos.
370#@return  Código de salida: 0 - formateado, 1 - sin formato o error.
371#@version 0.91 - Adaptación inicial para comprobar que existe caché.
372#@author  Ramon Gomez, ETSII Universidad de Sevilla
373#@date    2010-03-18
374#@version 1.0.1 - Devolver falso en caso de error.
375#@author  Ramon Gomez, ETSII Universidad de Sevilla
376#@date    2011-05-18
377#*/ ##
378function ogIsFormated ()
379{
380# Variables locales
381local DISK
382if [ "$*" == "help" ]; then
383    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
384           "if $FUNCNAME 1 1; then ... ; fi"
385    return
386fi
387# Falso, en caso de error.
388[ $# == 2 ] || return 1
389
390DISK=$(ogDiskToDev "$1") || return 1
391test -n "$(parted -sm $DISK print 2>/dev/null | \
392                      awk -F: -v fs=$2 '{if ($1==fs) print $5}')"
393}
394
395
396#/**
397#         ogIsMounted int_ndisk int_npartition
398#@brief   Comprueba si un sistema de archivos está montado.
399#@param   int_ndisk      nº de orden del disco
400#@param   int_npartition nº de orden de la partición
401#@return  Código de salida: 0 - montado, 1 - sin montar o error.
402#@version 0.9 - Primera versión para OpenGNSys.
403#@author  Ramon Gomez, ETSII Universidad de Sevilla
404#@date    2009-10-15
405#@version 1.0.1 - Devolver falso en caso de error.
406#@author  Ramon Gomez, ETSII Universidad de Sevilla
407#@date    2011-05-18
408#*/ ##
409function ogIsMounted ()
410{
411# Si se solicita, mostrar ayuda.
412if [ "$*" == "help" ]; then
413    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
414           "if $FUNCNAME 1 1; then ... ; fi"
415    return
416fi
417# Falso, en caso de error.
418[ $# == 2 ] || return 1
419
420test -n "$(ogGetMountPoint $1 $2)"
421}
422
423
424#/**
425#         ogIsLocked int_ndisk int_npartition
426#@brief   Comprueba si una partición está bloqueada por una operación de uso exclusivo.
427#@param   int_ndisk      nº de orden del disco
428#@param   int_npartition nº de orden de la partición
429#@return  Código de salida: 0 - bloqueado, 1 - sin bloquear o error.
430#@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 "-".
431#@version 0.9 - Primera versión para OpenGNSys.
432#@author  Ramon Gomez, ETSII Universidad de Sevilla
433#@date    2009-09-03
434#@version 1.0.1 - Devolver falso en caso de error.
435#@author  Ramon Gomez, ETSII Universidad de Sevilla
436#@date    2011-05-18
437#*/ ##
438function ogIsLocked ()
439{
440# Variables locales
441local PART LOCKFILE
442
443# Si se solicita, mostrar ayuda.
444if [ "$*" == "help" ]; then
445    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
446           "if $FUNCNAME 1 1; then ... ; fi"
447    return
448fi
449# Falso, en caso de error.
450[ $# == 2 ] || return 1
451
452# Obtener partición.
453PART="$(ogDiskToDev $1 $2)" || return 1
454
455# Comprobar existencia del fichero de bloqueo.
456LOCKFILE="/var/lock/lock${PART//\//-}"
457test -f $LOCKFILE
458}
459
460
461#/**
462#         ogLock int_ndisk int_npartition
463#@see     ogLockPartition
464#*/
465function ogLock ()
466{
467ogLockPartition "$@"
468}
469
470#/**
471#         ogLockPartition int_ndisk int_npartition
472#@brief   Genera un fichero de bloqueo para una partición en uso exlusivo.
473#@param   int_ndisk      nº de orden del disco
474#@param   int_npartition nº de orden de la partición
475#@return  (nada)
476#@exception OG_ERR_FORMAT    Formato incorrecto.
477#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
478#@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 "-".
479#@version 0.9 - Primera versión para OpenGNSys.
480#@author  Ramon Gomez, ETSII Universidad de Sevilla
481#@date    2009-09-03
482#*/ ##
483function ogLockPartition ()
484{
485# Variables locales
486local PART LOCKFILE
487
488# Si se solicita, mostrar ayuda.
489if [ "$*" == "help" ]; then
490    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
491           "$FUNCNAME 1 1"
492    return
493fi
494# Error si no se reciben 2 parámetros.
495[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
496
497# Obtener partición.
498PART="$(ogDiskToDev $1 $2)" || return $?
499
500# Crear archivo de bloqueo exclusivo.
501LOCKFILE="/var/lock/lock${PART//\//-}"
502touch $LOCKFILE
503}
504
505
506#/**
507#         ogMount int_ndisk int_npartition
508#@see     ogMountFs ogMountCache ogMountCdrom
509#*/ ##
510function ogMount ()
511{
512case "$*" in
513    CACHE|cache)
514        ogMountCache ;;
515    CDROM|cdrom)
516        ogMountCdrom ;;
517    *)  ogMountFs "$@" ;;
518esac
519}
520
521
522#/**
523#         ogMountFs int_ndisk int_npartition
524#@brief   Monta un sistema de archivos.
525#@param   int_ndisk      nº de orden del disco
526#@param   int_npartition nº de orden de la partición
527#@return  Punto de montaje
528#@exception OG_ERR_FORMAT    Formato incorrecto.
529#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
530#@exception OG_ERR_PARTITION Tipo de particion desconocido o no se puede montar.
531#@version 0.1 -  Integracion para Opengnsys  -  EAC:   MountPartition() en FileSystem.lib
532#@author  Antonio J. Doblas Viso. Universidad de Malaga
533#@date    2008-10-27
534#@version 0.9 - Primera version para OpenGNSys.
535#@author  Ramon Gomez, ETSII Universidad de Sevilla
536#@date    2009-09-28
537#*/ ##
538function ogMountFs ()
539{
540# Variables locales
541local PART TYPE MNTDIR MOUNT PARAMS
542
543# Si se solicita, mostrar ayuda.
544if [ "$*" == "help" ]; then
545    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
546           "$FUNCNAME 1 1  =>  /mnt/sda1"
547    return
548fi
549# Error si no se reciben 2 parámetros.
550[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
551
552# Obtener partición.
553PART="$(ogDiskToDev $1 $2)" || return $?
554
555# Comprobar si el sistema de archivos ya está montada.
556MNTDIR="$(ogGetMountPoint $1 $2)"
557# Si no, montarla en un directorio de sistema
558if [ -z "$MNTDIR" ]; then
559    # Error si la particion esta bloqueada.
560    if ogIsLocked $1 $2; then
561        ogRaiseError $OG_ERR_LOCKED "$MSG_PARTITION, $1 $2"
562        return $?
563    fi
564    # Crear punto de montaje o enlace símbolico para Caché local.
565    MNTDIR=${PART/dev/mnt}
566    TYPE="$(ogGetFsType $1 $2)" || return $?
567    if [ "$TYPE" == "CACHE" -a -n "$OGCAC" ]; then
568        ln -fs $OGCAC $MNTDIR
569    else
570        mkdir -p $MNTDIR
571    fi
572    # Montar según el tipo de sitema de archivos.
573    case "$TYPE" in
574        CACHE)      MOUNT=mount ;;
575        EXT[234])   MOUNT=mount ;;
576        REISERFS)   insmod /lib/modules/$(uname -r)/kernel/fs/reiserfs/reiserfs.ko 2>/dev/null
577                    MOUNT=mount ;;
578        JFS)        insmod /lib/modules/$(uname -r)/kernel/fs/jfs/jfs.ko 2>/dev/null
579                    MOUNT=mount ;;
580        XFS)        insmod /lib/modules/$(uname -r)/kernel/fs/xfs/xfs.ko 2>/dev/null
581                    MOUNT=mount ;;
582        NTFS|HNTFS) MOUNT=ntfs-3g ;;
583        FAT16|FAT32|HFAT16|HFAT32)
584                    MOUNT=mount; PARAMS="-t vfat" ;;
585        *)  #/// Error, si la partición no es montable.
586            rmdir $MNTDIR
587            ogRaiseError $OG_ERR_PARTITION "$1, $2, $TYPE"
588            return $OG_ERR_PARTITION
589            ;;
590    esac
591    $MOUNT $PARAMS $PART $MNTDIR 2>/dev/null || \
592               $MOUNT $PARAMS $PART $MNTDIR -o force,remove_hiberfile 2>/dev/null || \
593               ogRaiseError $OG_ERR_PARTITION "$1, $2, $TYPE" || return $?
594    # linea temporal durante desarrollo para poder usar el cliente completo nfs y testeas nuevas herramientas.
595    if grep -q nfsroot /proc/cmdline; then
596        echo "$PART $MNTDIR" >> /etc/mtab
597    fi
598    # fin linea temporal.
599fi
600echo $MNTDIR
601}
602
603
604#####  PRUEBAS
605# Montar CDROM
606function ogMountCdrom ()
607{
608local DEV MNTDIR
609DEV="/dev/cdrom"            # Por defecto
610MNTDIR=$(mount | awk -v D=$DEV '{if ($1==D) {print $3}}')
611if [ -z "$MNTDIR" ]; then
612    MNTDIR=${DEV/dev/mnt}
613    mkdir -p $MNTDIR
614    mount -t iso9660 $DEV $MNTDIR || ogRaiseError $OG_ERR_PARTITION "cdrom" || return $?
615fi
616echo $MNTDIR
617}
618
619
620#/**
621#         ogReduceFs int_ndisk int_npartition
622#@brief   Reduce el tamaño del sistema de archivos, sin tener en cuenta el espacio libre.
623#@param   int_ndisk      nº de orden del disco
624#@param   int_npartition nº de orden de la partición
625#@return  int_tamañoKB - tamaño en KB
626#@exception OG_ERR_FORMAT    Formato incorrecto.
627#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
628#@exception OG_ERR_PARTITION Partición desconocida o no accesible.
629#@warning En Windows, se borran los ficheros pagefile.sys e hiberfile.sys
630#@warning El sistema de archivos se amplía al mínimo + 10%.
631#@note    Requisitos:   *resize*
632#@version 0.1 -  Integracion para Opengnsys  -  EAC:   ReduceFileSystem() en ATA.lib
633#@author  Antonio J. Doblas Viso. Universidad de Malaga
634#@date    2008-10-27
635#@version 0.9 - Primera version para OpenGNSys.
636#@author  Ramon Gomez, ETSII Universidad de Sevilla
637#@date    2009-09-23
638#@version 0.9.2 - Añadir un 10% al tamaño mínimo requerido.
639#@author  Ramon Gomez, ETSII Universidad de Sevilla
640#@date    2010-09-27
641#@version 1.0 -  Deteccion automatica del tamaño minimo adecuado
642#@author  Antonio J. Doblas Viso. Universidad de Malaga
643#@date    2011-02-24
644#*/ ##
645function ogReduceFs ()
646{
647# Variables locales
648local PART BLKS SIZE
649
650# Si se solicita, mostrar ayuda.
651if [ "$*" == "help" ]; then
652    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
653           "$FUNCNAME 1 1"
654    return
655fi
656# Error si no se reciben 2 parámetros.
657[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
658
659# Obtener partición.
660PART="$(ogDiskToDev $1 $2)" || return $?
661
662# Redimensionar según el tipo de particion.
663case "$(ogGetFsType $1 $2)" in
664    EXT[234])
665        ogUnmount $1 $2 2>/dev/null
666        # Ext2/3/4: Tamaño de los bloques del sistema de archivos
667        BLKS=$(tune2fs -l $PART | awk '/Block size/ {print int($3/512)}')
668        # Traduce el num. en sectores de 512B a tamano en MB.
669        #SIZE=$(resize2fs -P $PART 2>/dev/null | \
670                #       awk -v B=$BLKS '/minimum size/ {print int($7*1.1*B/2048)}')
671        #resize2fs -fp $PART "${SIZE}M" &>/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
672        resize2fs -fpM $PART  &>/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
673            ;;
674#    REISERFS)          # Usar "resize_reiserfs"
675#           ;;
676    NTFS|HNTFS)
677        ogDeleteFile $1 $2 pagefile.sys
678        ogDeleteFile $1 $2 hiberfile.sys
679        ogUnmount $1 $2 2>/dev/null
680        ## NTFS: Obtiene tamaño mínimo en MB.
681        #SIZE=$(ntfsresize -fi $PART | awk '/resize at/ {print int($8*1.1)}')
682        #ntfsresize -fns "${SIZE}M" $PART >/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
683        #ntfsresize -fs "${SIZE}M" $PART <<<"y" >/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
684                SIZE=$(ogReduceFsCheck $1 $2)
685            [ "$SIZE" == 0 ] && return 1       
686        ntfsresize -fs "${SIZE}M" $PART <<<"y"  || ogRaiseError $OG_ERR_PARTITION "error reduciendo $1,$2" || return $?
687            ;;
688    *)  ogRaiseError $OG_ERR_PARTITION "$1,$2"
689            return $? ;;
690esac
691#/// Mostrar nuevo tamaño en KB.
692#echo $[SIZE*1024]
693ogGetFsSize $1 $2
694}
695
696
697function ogReduceFsCheck ()
698{
699#IMPORTANTE: retorna el valor en MB que podrá reducir el FS de una particion ntfs
700#valor devuelto 0, y codigo error 1. No se puede reducir, probar a reiniciar windows y chkdsk
701
702
703local  PART RC MODE SIZE SIZEDATA
704[ $# == 2 ] && MODE=STAGE1
705[ $# == 3 ] && MODE=STAGE2
706[ -z $MODE ] && return
707
708PART="$(ogDiskToDev $1 $2)" || return $?
709ogUnmount $1 $2 &>/dev/null
710
711
712case $MODE in
713        STAGE1)
714        #       echo "primera etapa $*"
715                ntfsresize -fi $PART &>/dev/null
716                RC=`echo $?`
717        #       echo "RC es" $RC
718                if [ "$RC" -eq "1" ]
719                then
720                        echo "0"
721                        return 1       
722                fi 
723                SIZEDATA=$(ntfsresize -fi $PART | awk '/resize at/ {print $8+1000}')
724        #       echo "salida" $?
725        #       echo $SIZEDATA
726                ogReduceFsCheck $1 $2 $SIZEDATA
727                return 0
728       ;;
729        STAGE2)
730        #       echo "segunda etapa $*"
731                SIZEDATA=$3
732                ntfsresize -fns "${SIZEDATA}M" $PART &>/tmp/ntfsresize.txt
733                RC=$?
734                if [ "$RC" == "0" ]
735                then 
736                        SIZE=$SIZEDATA 
737                        echo $SIZE     
738                else
739                        SIZEEXTRA=$(cat /tmp/ntfsresize.txt | awk '/Needed relocations :/ {print $0}' | awk -F"(" '{print $2}' | awk '{print $1+500}')
740                        SIZE=$(expr $SIZEDATA + $SIZEEXTRA)
741                        ogReduceFsCheck $1 $2 $SIZE
742                        return 0
743                fi
744        ;;
745        *)
746        return
747        ;;
748esac
749}
750
751
752
753#/**
754#         ogUnlock int_ndisk int_npartition
755#@see     ogUnlockPartition
756#*/
757function ogUnlock ()
758{
759ogUnlockPartition "$@"
760}
761
762#/**
763#         ogUnlockPartition int_ndisk int_npartition
764#@brief   Elimina el fichero de bloqueo para una particion.
765#@param   int_ndisk      nº de orden del disco
766#@param   int_npartition nº de orden de la partición
767#@return  (nada)
768#@exception OG_ERR_FORMAT    Formato incorrecto.
769#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
770#@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 "-".
771#@version 0.9 - Primera versión para OpenGNSys.
772#@author  Ramon Gomez, ETSII Universidad de Sevilla
773#@date    2009-09-03
774#*/ ##
775function ogUnlockPartition ()
776{
777# Variables locales
778local PART LOCKFILE
779
780# Si se solicita, mostrar ayuda.
781if [ "$*" == "help" ]; then
782    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
783           "$FUNCNAME 1 1"
784    return
785fi
786# Error si no se reciben 2 parámetros.
787[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
788
789# Obtener partición.
790PART="$(ogDiskToDev $1 $2)" || return $?
791
792# Borrar archivo de bloqueo exclusivo.
793LOCKFILE="/var/lock/lock${PART//\//-}"
794rm -f $LOCKFILE
795}
796
797
798#/**
799#         ogUnmount int_ndisk int_npartition
800#@see     ogUnmountFs
801#*/
802function ogUnmount ()
803{
804ogUnmountFs "$@"
805}
806
807#/**
808#         ogUnmountFs int_ndisk int_npartition
809#@brief   Desmonta un sistema de archivos.
810#@param   int_ndisk      nº de orden del disco
811#@param   int_npartition nº de orden de la partición
812#@return  Nada
813#@exception OG_ERR_FORMAT    Formato incorrecto.
814#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
815#@warning La partición no está previamente montada o no se puede desmontar.
816#@version 0.1 -  Integracion para Opengnsys  -  EAC:  UmountPartition() en FileSystem.lib
817#@author  Antonio J. Doblas Viso. Universidad de Malaga
818#@date    2008-10-27
819#@version 0.9 - Primera version para OpenGNSys.
820#@author  Ramon Gomez, ETSII Universidad de Sevilla
821#@date    2009-09-28
822#*/ ##
823function ogUnmountFs ()
824{
825# Variables locales
826local PART MNTDIR
827
828# Si se solicita, mostrar ayuda.
829if [ "$*" == "help" ]; then
830    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" "$FUNCNAME 1 1"
831    return
832fi
833# Error si no se reciben 2 parámetros.
834[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
835
836# Obtener partición y punto de montaje.
837PART="$(ogDiskToDev $1 $2)" || return $?
838MNTDIR="$(ogGetMountPoint $1 $2)"
839
840# Si está montada, desmontarla.
841if [ -n "$MNTDIR" ]; then
842    # Error si la particion está bloqueada.
843    if ogIsLocked $1 $2; then
844        ogRaiseError $OG_ERR_LOCKED "$MSG_PARTITION $1, $2"
845        return $?
846    fi
847    # Desmontar y borrar punto de montaje.
848    umount $PART 2>/dev/null || ogEcho warning "$FUNCNAME: $MSG_DONTUNMOUNT: \"$1, $2\""
849    rmdir $MNTDIR 2>/dev/null || rm -f $MNTDIR 2>/dev/null
850    # linea temporal durante desarrollo para testear nuevas herramientas con el cliente completo nfs
851    if grep -q nfsroot /proc/cmdline; then
852        grep -v $PART /etc/mtab > /var/tmp/mtab.temporal && cp /var/tmp/mtab.temporal /var/tmp/mtab && rm /var/tmp/mtab.temporal
853    fi
854    # fin linea temporal.
855else
856    ogEcho warning "$MSG_DONTMOUNT: \"$1,$2\""
857fi
858}
859
860
861#/**
862#         ogUnmountAll int_ndisk
863#@brief   Desmonta todos los sistema de archivos de un disco, excepto el caché local.
864#@param   int_ndisk      nº de orden del disco
865#@return  Nada
866#@exception OG_ERR_FORMAT    Formato incorrecto.
867#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
868#@warning No se desmonta la partición marcada como caché local.
869#@version 0.9 - Versión para OpenGNSys.
870#@author  Ramon Gomez, ETSII Universidad de Sevilla
871#@date    2009/10/07
872#*/ ##
873function ogUnmountAll ()
874{
875# Variables locales
876local DISK PART
877# Si se solicita, mostrar ayuda.
878if [ "$*" == "help" ]; then
879    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" "FUNCNAME 1"
880    return
881fi
882# Error si no se recibe 1 parámetro.
883[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
884
885# Obtener partición y punto de montaje.
886DISK="$(ogDiskToDev $1)" || return $?
887for ((PART=1; PART<=$(ogGetPartitionsNumber $1); PART++)); do
888    case "$(ogGetFsType $1 $PART)" in
889        CACHE|LINUX-SWAP)
890           ;;
891        *)
892           ogUnmount $1 $PART ;;
893    esac
894done
895}
896
897#/**  @function ogGetFsSize: @brief Muestra el tamanio del sistema de archivos indicado, permite definir la unidad de medida, por defecto GB
898#@param  $1 int_diskEAC
899#@param $2 int_PartitionEAC
900#@param $3 str_UnidadMediada            parametro opcional, admite [ kB MB GB -default GB]
901#@return  cadena con int_TotalSize:int_DataSize:int_DataFree
902#@warning  Salidas de errores no determinada
903#@warning
904#@attention
905#@version 0.1 -  Integracion para Opengnsys  -  EAC:  SizeFileSystem() en FileSystem.lib
906#@author  Antonio J. Doblas Viso. Universidad de Malaga
907#@date    2008-10-27
908#*/
909function ogGetFsSize () {
910if [ $# = 0 ]
911then
912        echo "sintaxis: ogGetFsSize int_disco int_partition str_SizeOutput [ kB MB GB -default GB]-]" red
913        echo "devuelve int_size : int_data : int_free" red
914return
915fi
916if [ $# -ge 2 ]
917then
918        particion=`ogMount $1 $2 ` #1>/dev/null 2>&1
919        if [ -z $3 ]
920                then
921                        unit=kB  # s B kB MB GB TB %
922                else
923                        unit=$3
924        fi
925        case $unit in
926                kB)
927                        factor="1.024";
928                #       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}'`
929                        valor=`df | grep  $particion | awk -F" " '{size=$2*1.024; used=$3*1.024; free=$4*1.024; printf "%d", size}'`
930                ;;
931                MB)
932                        factor="1.024/1000";
933                        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}'`
934                ;;
935                GB)
936                        factor="1.024/1000000";
937                        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}'`
938                ;;
939        esac
940        #echo $valor
941        #NumberRound $valor
942        #valor=`NumberRound $valor`;
943        ogUnmount $1 $2 1>/dev/null 2>&1
944        echo $valor
945
946fi
947}
948
949function ogGetFreeSize () {
950if [ $# = 0 ]
951then
952        echo "sintaxis: ogGetFreeSize int_disco int_partition str_SizeOutput [ kB MB GB -default GB]-]" red
953        echo "devuelve int_size : int_data : int_free" red
954return
955fi
956if [ $# -ge 2 ]
957then
958        particion=`ogMount $1 $2 ` #1>/dev/null 2>&1
959        if [ -z $3 ]
960                then
961                        unit=kB  # s B kB MB GB TB %
962                else
963                        unit=$3
964        fi
965        case $unit in
966                kB)
967                        factor="1.024";
968                        #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}'`
969                        valor=`df | grep  $particion | awk -F" " '{size=$2*1.024; used=$3*1.024; free=$4*1.024; printf "%d", free}'`
970                        ;;
971                MB)
972                        factor="1.024/1000";
973                        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}'`
974                ;;
975                GB)
976                        factor="1.024/1000000";
977                        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}'`
978                ;;
979        esac
980        #echo $valor
981        #NumberRound $valor
982        #valor=`NumberRound $valor`;
983        ogUnmount $1 $2 1>/dev/null 2>&1
984        echo $valor
985
986fi
987}
988
989
990
991function ogDeletePartitionsLabels ()
992{
993# Si se solicita, mostrar ayuda.
994if [ "$*" == "help" ]; then
995    ogHelp "$FUNCNAME" "$FUNCNAME " \
996           "$FUNCNAME "
997    return
998fi
999rm /dev/disk/by-label/* 2>/dev/null   # */ COMENTARIO OBLIGATORIO PARA DOXYGEN
1000}
1001
1002function ogDeletePartitionTable ()
1003{
1004
1005# Variables locales.
1006local DISK
1007
1008# Si se solicita, mostrar ayuda.
1009if [ "$*" == "help" ]; then
1010    ogHelp "$FUNCNAME int_disk"  \
1011           "$FUNCNAME 1"
1012    return
1013fi
1014# Error si no se reciben 1 parámetros.
1015[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
1016
1017# Obteniendo Identificador linux de la particion.
1018DISK=$(ogDiskToDev $1) || return $?
1019
1020# Elimando las particiones con fdisk
1021echo -ne "o\nw" | fdisk $DISK
1022}
Note: See TracBrowser for help on using the repository browser.