source: client/engine/Disk.lib @ b9e1a8c

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 b9e1a8c was b9e1a8c, checked in by ramon <ramongomez@…>, 15 years ago

Funciones ogGetCacheSize y ogGetCacheSpace.

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

  • Property mode set to 100755
File size: 26.0 KB
Line 
1#!/bin/bash
2#/**
3#@file    Disk.lib
4#@brief   Librería o clase Disk
5#@class   Disk
6#@brief   Funciones para gestión de discos y particiones.
7#@version 0.9
8#@warning License: GNU GPLv3+
9#*/
10
11
12#/**
13#         ogCreateCache int_partsize
14#@brief   Define la caché local en la partición 4 del disco 1
15#@param   int_partsize   tamaño de la partición (en KB)
16#@return  (nada, por determinar)
17#@exception OG_ERR_FORMAT   formato incorrecto.
18#@note    Requisitos: sfdisk, parted, awk, sed
19#@version 0.91 - Definición de caché local.
20#@author  Ramon Gomez, ETSII Universidad de Sevilla
21#@date    2010/03/09
22#*/ ##
23function ogCreateCache ()
24{
25# Variables locales.
26local DISK SECTORS CYLS START END SIZE ENDPART3
27# Si se solicita, mostrar ayuda.
28if [ "$*" == "help" ]; then
29    ogHelp "$FUNCNAME" "$FUNCNAME 10000000"
30    return
31fi
32# Error si no se recibe 1 parámetro.
33[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
34
35DISK=$(ogDiskToDev 1) || return $?
36PART="${DISK}4"
37SECTORS=$(awk -v D=${DISK#/dev/} '{if ($4==D) {print $3*2}}' /proc/partitions)
38CYLS=$(sfdisk -g $DISK | cut -f2 -d" ")
39END=$[SECTORS/CYLS*CYLS-1]
40SIZE=$(echo $1|awk '{print $0*2}')      # En sectores de 512 B.
41START=$[END-SIZE+1]
42ENDPART3=$(sfdisk -uS -l $DISK | awk -v P="${DISK}3" '{if ($1==P) print $3}')
43# Error si tamaño 0 o si mayor que la mitad del disco o si pisa la partición 3.
44if [ $SIZE -eq 0 -o $SIZE -ge $[END/2] -o $START -le $ENDPART3 ]; then
45    ogRaiseError $OG_ERR_FORMAT "$1" || return $?
46fi
47
48# Crear plantilla de particionado, modificando partición 4 para caché local.
49tmpsfdisk=/tmp/sfdiskout$$
50trap "rm -f $tmpsfdisk" 1 2 3 9 15
51sfdisk -d $DISK | sed "s;$PART.*$;$PART : start=$START, size=$SIZE, Id=ca;" >$tmpsfdisk
52
53# Desmontar todos los sistemas de archivos del disco.
54ogUnmountAll 1 2>/dev/null
55# Si la tabla de particiones no es valida, volver a generarla.
56[ $(parted -s $DISK print >/dev/null) ] || fdisk $DISK <<< "w"
57# Definir particiones y notificar al kernel.
58sfdisk -f $DISK < $tmpsfdisk 2>/dev/null && sfdisk -R $DISK
59rm -f $tmpsfdisk
60}
61
62
63#/**
64#         ogCreatePartitions int_ndisk str_parttype:int_partsize ...
65#@brief   Define el conjunto de particiones de un disco.
66#@param   int_ndisk      nº de orden del disco
67#@param   str_parttype   mnemónico del tipo de partición
68#@param   int_partsize   tamaño de la partición (en KB)
69#@return  (nada, por determinar)
70#@exception OG_ERR_FORMAT   formato incorrecto.
71#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
72#@attention El nº de partición se indica por el orden de los párametros \c parttype:partsize
73#@attention Pueden definirse particiones vacías de tipo \c EMPTY
74#@note    Requisitos: sfdisk, parted, partprobe, awk
75#@todo    Definir atributos (arranque, oculta) y tamaños en MB, GB, etc.
76#@version 0.9 - Primera versión para OpenGNSys
77#@author  Ramon Gomez, ETSII Universidad de Sevilla
78#@date    2009/09/09
79#@version 0.91 - Corrección del redondeo del tamaño del disco.
80#@author  Ramon Gomez, ETSII Universidad de Sevilla
81#@date    2010/03/09
82#*/ ##
83function ogCreatePartitions ()
84{
85# Variables locales.
86local DISK PART SECTORS CYLS START SIZE TYPE EXTSTART EXTSIZE tmpsfdisk
87# Si se solicita, mostrar ayuda.
88if [ "$*" == "help" ]; then
89    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk str_parttype:int_partsize ..." \
90           "$FUNCNAME 1 NTFS:10000000 EXT3:5000000 LINUX-SWAP:1000000"
91    return
92fi
93# Error si no se reciben menos de 2 parámetros.
94[ $# -ge 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
95
96DISK="$(ogDiskToDev $1)" || return $?
97shift
98
99# Nº total de sectores, para evitar desbordamiento (evitar redondeo).
100SECTORS=$(awk -v D=${DISK#/dev/} '{if ($4==D) {print $3*2}}' /proc/partitions)
101CYLS=$(sfdisk -g $DISK | cut -f2 -d" ")
102SECTORS=$[SECTORS/CYLS*CYLS-1]
103# Sector de inicio de la particon (la 1ª empieza en el sector 63).
104START=63
105PART=1
106
107# Fichero temporal de entrada para "sfdisk"
108tmpsfdisk=/tmp/sfdisk$$
109trap "rm -f $tmpsfdisk" 1 2 3 9 15
110
111echo "unit: sectors" >$tmpsfdisk
112echo                >>$tmpsfdisk
113
114# Generar fichero de entrada para "sfdisk" con las particiones.
115while [ $# -gt 0 ]; do
116    # Leer formato de cada parámetro - Tipo:Tamaño
117    TYPE="${1%%:*}"
118    SIZE="${1#*:}"
119    [ -z "$SIZE" ] && ogRaiseError $OG_ERR_FORMAT && return $?
120    # Convertir en sectores de 512 B.
121    SIZE=$[SIZE*2]
122    [ $SIZE -eq 0 ] && ogRaiseError $OG_ERR_FORMAT && return $?
123    # Obtener identificador de tipo de partición.
124    ID=$(ogFsToId "$TYPE")
125    [ -n "$ID" ] || ogRaiseError $OG_ERR_PARTITION "$TYPE" || return $?
126    # Comprobar si la partición es extendida.
127    if [ $ID = 5 ]; then
128        [ $PART -gt 4 ] && ogRaiseError $OG_ERR_FORMAT && return $?
129        EXTSTART=$START
130        EXTSIZE=$SIZE
131    fi
132    # Incluir particiones lógicas dentro de la partición extendida.
133    if [ $PART = 5 ]; then
134        [ -z "$EXTSTART" ] && ogRaiseError $OG_ERR_FORMAT && return $?
135        START=$EXTSTART
136        SECTORS=$[EXTSTART+EXTSIZE]
137    fi
138    # Generar datos para la partición.
139    echo "$DISK$PART : start=$START, size=$SIZE, Id=$ID" >>$tmpsfdisk
140    # Error si se supera el nº total de sectores.
141    START=$[START+SIZE]
142    [ $START -gt $SECTORS ] && ogRaiseError $OG_ERR_FORMAT && return $?
143    PART=$[PART+1]
144    shift
145done
146# Si no se indican las 4 particiones primarias, definirlas como vacías.
147while [ $PART -le 4 ]; do
148    echo "$DISK$PART : start=0, size=0, Id=0" >>$tmpsfdisk
149    PART=$[PART+1]
150done
151# Si se define partición extendida sin lógicas, crear particion 5 vacía.
152if [ $PART = 5 -a -n "$EXTSTART" ]; then
153    echo "${DISK}5 : start=$EXTSTART, size=$EXTSIZE, Id=0" >>$tmpsfdisk
154fi
155
156# Desmontar todos los sistemas de archivos del disco.
157ogUnmountAll $1
158# Si la tabla de particiones no es valida, volver a generarla.
159[ $(parted -s $DISK print >/dev/null) ] || fdisk $DISK <<< "w"
160# Definir particiones y notificar al kernel.
161sfdisk -f $DISK < $tmpsfdisk 2>/dev/null && sfdisk -R $DISK
162rm -f $tmpsfdisk
163}
164
165
166#/**
167#         ogDevToDisk path_device
168#@brief   Devuelve el nº de orden de dicso (y partición) correspondiente al nombre de fichero de dispositivo.
169#@param   path_device Camino del fichero de dispositivo.
170#@return  int_ndisk (para dispositivo de disco)
171#@return  int_ndisk int_npartition (para dispositivo de partición).
172#@exception OG_ERR_FORMAT   Formato incorrecto.
173#@exception OG_ERR_NOTFOUND Dispositivo no detectado.
174#@note    Requisitos: awk
175#@version 0.9 - Primera versión para OpenGNSys
176#@author  Ramon Gomez, ETSII Universidad Sevilla
177#@date    2009-07-20
178#*/ ##
179function ogDevToDisk ()
180{
181# Variables locales.
182local d n
183# Si se solicita, mostrar ayuda.
184if [ "$*" == "help" ]; then
185    ogHelp "$FUNCNAME" "$FUNCNAME path_device" \
186           "$FUNCNAME /dev/sda  =>  1 1"
187    return
188fi
189
190# Error si no se recibe 1 parámetro.
191[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
192# Error si no es fichero de bloques.
193[ -b "$1" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $?
194
195# Procesa todos los discos para devolver su nº de orden y de partición.
196n=1
197for d in $(ogDiskToDev); do
198    [ -n "$(echo $1 | grep $d)" ] && echo "$n ${1#$d}" && return
199    n=$[n+1]
200done
201ogRaiseError $OG_ERR_NOTFOUND "$1"
202return $OG_ERR_NOTFOUND
203}
204
205
206#/**
207#         ogDiskToDev [int_ndisk [int_npartition]]
208#@brief   Devuelve la equivalencia entre el nº de orden del dispositivo (dicso o partición) y el nombre de fichero de dispositivo correspondiente.
209#@param   int_ndisk      nº de orden del disco
210#@param   int_npartition nº de orden de la partición
211#@return  Para 0 parametros: Devuelve los nombres de ficheros  de los dispositivos sata/ata/usb linux encontrados.
212#@return  Para 1 parametros: Devuelve la ruta del disco duro indicado.
213#@return  Para 2 parametros: Devuelve la ruta de la particion indicada.
214#@exception OG_ERR_FORMAT   Formato incorrecto.
215#@exception OG_ERR_NOTFOUND Dispositivo no detectado.
216#@note    Requisitos: awk, lvm
217#@version 0.9 - Primera versión para OpenGNSys
218#@author  Ramon Gomez, ETSII Universidad Sevilla
219#@date    2009-07-20
220#*/ ##
221function ogDiskToDev ()
222{
223# Variables locales
224local ALLDISKS VOLGROUPS DISK PART
225
226# Si se solicita, mostrar ayuda.
227if [ "$*" == "help" ]; then
228    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk [int_npartition]" \
229           "$FUNCNAME      =>  /dev/sda /dev/sdb" \
230           "$FUNCNAME 1    =>  /dev/sda" \
231           "$FUNCNAME 1 1  =>  /dev/sda1"
232    return
233fi
234
235# Listar dispositivo para los discos duros (tipos: 3=hd, 8=sd).
236ALLDISKS=$(awk '($1==3 || $1==8) && $4!~/[0-9]/ {printf "/dev/%s ",$4}' /proc/partitions)
237VOLGROUPS=$(vgs -a --noheadings 2>/dev/null | awk '{printf "/dev/%s ",$1}')
238ALLDISKS="$ALLDISKS $VOLGROUPS"
239
240# Mostrar salidas segun el número de parametros.
241case $# in
242    0)  # Muestra todos los discos, separados por espacios.
243        echo $ALLDISKS
244        ;;
245    1)  # Error si el parámetro no es un digito.
246        [ -z "${1/[1-9]/}" ] || ogRaiseError $OG_ERR_FORMAT || return $?
247        DISK=$(echo "$ALLDISKS" | awk -v n=$1 '{print $n}')
248        # Error si el fichero no existe.
249        [ -e "$DISK" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $?
250        echo "$DISK"
251        ;;
252    2)  # Error si los 2 parámetros no son digitos.
253        [ -z "${1/[1-9]/}" -a -z "${2/[1-9]/}" ] || ogRaiseError $OG_ERR_FORMAT|| return $?
254        DISK=$(echo "$ALLDISKS" | awk -v n=$1 '{print $n}')
255        [ -e "$DISK" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $?
256        PART="$DISK$2"
257        # Comprobar si es partición.
258        if [ -b "$PART" ]; then
259            echo "$PART"
260        elif [ -n "$VOLGROUPS" ]; then
261            # Comprobar si volumen lógico.      /* (comentario Doxygen)
262            PART=$(lvscan -a 2>/dev/null | grep "'$DISK/" | awk -v n=$2 -F\' '{if (NR==n) print $2}')
263            [ -e "$PART" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2" || return $?
264            #                                   (comentario Doxygen) */
265            echo "$PART"
266        else
267            ogRaiseError $OG_ERR_NOTFOUND "$1 $2" || return $?
268        fi
269        ;;
270    *)  # Formato erroneo.
271        ogRaiseError $OG_ERR_FORMAT
272        return $OG_ERR_FORMAT
273        ;;
274esac
275}
276
277
278#/**
279#         ogFsToId str_fstype
280#@brief   Devuelve el identificador de partición correspondiente a un tipo de sistema de archivos.
281#@param   str_fstype  mnemónico de tipo de sistema de archivos
282#@return  int_idpart  nº identificador de tipo de partición.
283#@exception OG_ERR_FORMAT   Formato incorrecto.
284#@version 0.9 - Primera versión para OpenGNSys
285#@author  Ramon Gomez, ETSII Universidad Sevilla
286#@date    2009-12-14
287#*/ ##
288function ogFsToId ()
289{
290# Variables locales
291local ID
292
293# Si se solicita, mostrar ayuda.
294if [ "$*" == "help" ]; then
295    ogHelp "$FUNCNAME" "$FUNCNAME str_fstype" "$FUNCNAME EXT3  =>  83"
296    return
297fi
298# Error si no se recibe 1 parámetro.
299[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
300
301# Asociar id. de partición para su mnemónico de sistema de archivos.
302case "$1" in
303    EMPTY)      ID=0  ;;
304    FAT12)      ID=1  ;;
305    EXTENDED)   ID=5  ;;
306    FAT16)      ID=6  ;;
307    NTFS|EXFAT) ID=7  ;;
308    FAT32)      ID=b  ;;
309    HFAT12)     ID=11 ;;
310    HFAT16)     ID=16 ;;
311    HNTFS)      ID=17 ;;
312    HFAT32)     ID=1b ;;
313    LINUX-SWAP) ID=82 ;;
314    EXT[234]|REISERFS|REISER4|XFS|JFS)
315                ID=83 ;;
316    LINUX-LVM)  ID=8e ;;
317    SOLARIS)    ID=bf ;;
318    CACHE)      ID=ca ;;
319    LINUX-RAID) ID=fd ;;
320    *)          ID="" ;;
321esac
322echo $ID
323}
324
325
326#/**
327#         ogGetCacheSize
328#@brief   Devuelve el tamaño definido para la partición de caché.
329#@return  int_partsize   tamaño de la partición (en KB)
330#@exception OG_ERR_PARTITION  No existe partición de caché.
331#@version 0.91 - Definición de caché local.
332#@author  Ramon Gomez, ETSII Universidad de Sevilla
333#@date    2010/03/09
334#*/ ##
335function ogGetCacheSize ()
336{
337# Variables locales
338local PART
339
340# Si se solicita, mostrar ayuda.
341if [ "$*" == "help" ]; then
342    ogHelp "$FUNCNAME" "$FUNCNAME  =>  10000000"
343    return
344fi
345# Error si no se encuentra partición de caché.
346PART=$(ogDevToDisk $(ogFindCache) 2>/dev/null) || ogRaiseError $OG_ERR_PARTITION "CACHE" || return $OG_ERR_PARTITION
347
348# Devuelve tamaño de la partición de caché.
349ogGetPartitionSize $PART
350}
351
352
353#/**
354#         ogGetCacheSpace
355#@brief   Devuelve el espacio de disco disponible para la partición de caché.
356#@return  int_size   tamaño disponible (en KB)
357#@note    El espacio disponible es el que hay entre el límite superior de la partición 3 del disco 1 y el final de dicho disco, y no puede ser superior a la mitad de dicho disco.
358#@version 0.91 - Definición de caché local.
359#@author  Ramon Gomez, ETSII Universidad de Sevilla
360#@date    2010/03/09
361#*/ ##
362function ogGetCacheSpace ()
363{
364
365# Variables locales.
366local DISK SECTORS CYLS ENDPART3
367# Si se solicita, mostrar ayuda.
368if [ "$*" == "help" ]; then
369    ogHelp "$FUNCNAME" "$FUNCNAME  =>  23165386"
370    return
371fi
372
373DISK=$(ogDiskToDev 1) || return $?
374SECTORS=$(awk -v D=${DISK#/dev/} '{if ($4==D) {print $3*2}}' /proc/partitions)
375CYLS=$(sfdisk -g $DISK | cut -f2 -d" ")
376SECTORS=$[SECTORS/CYLS*CYLS-1]
377ENDPART3=$(sfdisk -uS -l $DISK | awk -v P="${DISK}3" '{if ($1==P) print $3}')
378# Mostrar espacio libre en KB (1 KB = 2 sectores)
379if [ $ENDPART3 -gt $[SECTORS/2] ]; then
380    echo $[(SECTORS-ENDPART3)/2]
381else
382    echo $[SECTORS/4]
383fi
384}
385
386
387#         ogGetPartitionActive int_ndisk
388#@brief   Muestra que particion de un disco esta marcada como de activa.
389#@param   int_ndisk   nº de orden del disco
390#@return  int_npart   Nº de partición activa
391#@exception OG_ERR_FORMAT Formato incorrecto.
392#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
393#@note    Requisitos: parted
394#@todo    Queda definir formato para atributos (arranque, oculta, ...).
395#@version 0.9 - Primera versión compatible con OpenGNSys.
396#@author  Ramon Gomez, ETSII Universidad de Sevilla
397#@date    2009/07/24
398#*/ ##
399function ogGetPartitionActive ()
400{
401# Variables locales
402local DISK
403
404# Si se solicita, mostrar ayuda.
405if [ "$*" == "help" ]; then
406    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" "$FUNCNAME 1  =>  1"
407    return
408fi
409# Error si no se recibe 1 parámetro.
410[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
411
412# Comprobar que el disco existe y listar su partición activa.
413DISK="$(ogDiskToDev $1)" || return $?
414parted $DISK print 2>/dev/null | awk '/boot/ {print $1}'
415}
416
417
418#/**
419#         ogGetPartitionId int_ndisk int_npartition
420#@brief   Devuelve el mnemonico con el tipo de sistema de archivos.
421#@param   int_ndisk      nº de orden del disco
422#@param   int_npartition nº de orden de la partición
423#@return  Identificador de tipo de partición.
424#@exception OG_ERR_FORMAT   Formato incorrecto.
425#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
426#@note    Requisitos: sfdisk
427#@version 0.9 - Primera versión compatible con OpenGNSys.
428#@author  Ramon Gomez, ETSII Universidad de Sevilla
429#@date    25/03/2009
430#*/ ##
431function ogGetPartitionId ()
432{
433# Variables locales.
434local DISK PART
435
436# Si se solicita, mostrar ayuda.
437if [ "$*" == "help" ]; then
438    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
439           "$FUNCNAME 1 1  =>  7"
440    return
441fi
442# Error si no se reciben 2 parámetros.
443[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
444
445# Detectar id. de tipo de particion y codificar al mnemonico.
446DISK=$(ogDiskToDev $1) || return $?
447PART=$(ogDiskToDev $1 $2) || return $?
448echo $(sfdisk --id $DISK $2 2>/dev/null)
449}
450
451
452#/**
453#         ogGetPartitionSize int_ndisk int_npartition
454#@brief   Muestra el tamano en KB de una particion determinada.
455#@param   int_ndisk      nº de orden del disco
456#@param   int_npartition nº de orden de la partición
457#@return  int_partsize - Tamaño en KB de la partición.
458#@exception OG_ERR_FORMAT   formato incorrecto.
459#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
460#@note    Requisitos: sfdisk, awk
461#@version 0.9 - Primera versión para OpenGNSys
462#@author  Ramon Gomez, ETSII Universidad de Sevilla
463#@date    2009/07/24
464#*/ ##
465function ogGetPartitionSize ()
466{
467# Variables locales.
468local PART
469
470# Si se solicita, mostrar ayuda.
471if [ "$*" == "help" ]; then
472    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
473           "$FUNCNAME 1 1  =>  10000000"
474    return
475fi
476# Error si no se reciben 2 parámetros.
477[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
478
479# Obtener el tamaño de la partición.
480DISK="$(ogDiskToDev $1)" || return $?
481PART="$(ogDiskToDev $1 $2)" || return $?
482case "$(ogGetPartitionId $1 $2)" in
483    5|f)  # Procesar detección de tamaño de partición Extendida.
484          sfdisk -l $DISK 2>/dev/null | \
485                    awk -v p=$PART '{if ($1==p) {sub (/\*/,""); print $5} }'
486          ;;
487    *)    sfdisk -s $PART
488          ;;
489esac
490}
491
492
493#/**
494#         ogListPartitions int_ndisk
495#@brief   Lista las particiones definidas en un disco.
496#@param   int_ndisk  nº de orden del disco
497#@return  str_parttype:int_partsize ...
498#@exception OG_ERR_FORMAT   formato incorrecto.
499#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
500#@note    Requisitos: \c parted \c awk
501#@attention El nº de partición se indica por el orden de los párametros \c parttype:partsize
502#@attention Las tuplas de valores están separadas por espacios.
503#@version 0.9 - Primera versión para OpenGNSys
504#@author  Ramon Gomez, ETSII Universidad de Sevilla
505#@date    2009/07/24
506#*/ ##
507function ogListPartitions ()
508{
509# Variables locales.
510local DISK PART NPARTS TYPE SIZE
511
512# Si se solicita, mostrar ayuda.
513if [ "$*" == "help" ]; then
514    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" \
515           "$FUNCNAME 1  =>  NTFS:10000000 EXT3:5000000 LINUX-SWAP:1000000"
516    return
517fi
518# Error si no se recibe 1 parámetro.
519[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT "$FORMAT" || return $?
520
521# Procesar la salida de \c parted .
522DISK="$(ogDiskToDev $1)" || return $?
523NPARTS=$(ogGetPartitionsNumber $1)
524for (( PART = 1; PART <= NPARTS; PART++ )); do
525    TYPE=$(ogGetFsType $1 $PART 2>/dev/null)
526    if [ $? -eq 0 ]; then
527        SIZE=$(ogGetPartitionSize $1 $PART 2>/dev/null)
528        echo -n "$TYPE:$SIZE "
529    else
530        echo -n "EMPTY:0 "
531    fi
532done
533echo
534}
535
536
537#/**
538#         ogListPrimaryPartitions int_ndisk
539#@brief   Metafunción que lista las particiones primarias no vacías definidas en un disco.
540#@param   int_ndisk  nº de orden del disco
541#@see     ogListPartitions
542#*/ ##
543function ogListPrimaryPartitions ()
544{
545# Variables locales.
546local PARTS
547
548PARTS=$(ogListPartitions "$@") || return $?
549echo $PARTS | cut -sf1-4 -d" " | sed 's/\( EMPTY:0\)*$//'
550}
551
552
553#/**
554#         ogListLogicalPartitions int_ndisk
555#@brief   Metafunción que lista las particiones lógicas definidas en un disco.
556#@param   int_ndisk  nº de orden del disco
557#@see     ogListPartitions
558#*/ ##
559function ogListLogicalPartitions ()
560{
561# Variables locales.
562local PARTS
563
564PARTS=$(ogListPartitions "$@") || return $?
565echo $PARTS | cut -sf5- -d" "
566}
567
568
569#/**
570#         ogSetPartitionActive int_ndisk int_npartition
571#@brief   Establece cual es la partición activa de un disco.
572#@param   int_ndisk      nº de orden del disco
573#@param   int_npartition nº de orden de la partición
574#@return  (nada).
575#@exception OG_ERR_FORMAT   Formato incorrecto.
576#@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositivo.
577#@note    Requisitos: parted
578#@version 0.9 - Primera versión compatible con OpenGNSys.
579#@author  Ramon Gomez, ETSII Universidad de Sevilla
580#@date    2009/09/17
581#*/ ##
582function ogSetPartitionActive ()
583{
584# Variables locales
585local DISK PART
586
587# Si se solicita, mostrar ayuda.
588if [ "$*" == "help" ]; then
589    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
590           "$FUNCNAME 1 1"
591    return
592fi
593# Error si no se reciben 2 parámetros.
594[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
595
596# Comprobar que el disco existe y activar la partición indicada.
597DISK="$(ogDiskToDev $1)" || return $?
598PART="$(ogDiskToDev $1 $2)" || return $?
599parted -s $DISK set $2 boot on 2>/dev/null
600}
601
602
603#/**
604#         ogSetPartitionSize int_ndisk int_npartition int_size
605#@brief   Muestra el tamano en KB de una particion determinada.
606#@param  int_ndisk      nº de orden del disco
607#@param   int_npartition nº de orden de la partición
608#@param   int_size       tamaño de la partición (en KB)
609#@return  (nada)
610#@exception OG_ERR_FORMAT   formato incorrecto.
611#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
612#@note    Requisitos: sfdisk, awk
613#@todo    Compruebar que el tamaño sea numérico positivo y evitar que pueda solaparse con la siguiente partición.
614#@version 0.9 - Primera versión para OpenGNSys
615#@author  Ramon Gomez, ETSII Universidad de Sevilla
616#@date    2009/07/24
617#*/ ##
618function ogSetPartitionSize ()
619{
620# Variables locales.
621local DISK PART SIZE
622
623# Si se solicita, mostrar ayuda.
624if [ "$*" == "help" ]; then
625    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
626           "$FUNCNAME 1 1 10000000"
627    return
628fi
629# Error si no se reciben 3 parámetros.
630[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
631
632# Obtener el tamaño de la partición.
633DISK="$(ogDiskToDev $1)" || return $?
634PART="$(ogDiskToDev $1 $2)" || return $?
635# Convertir tamaño en KB a sectores de 512 B.
636SIZE=$[$3*2] || ogRaiseError $OG_ERR_FORMAT || return $?
637# Usar \c sfdisk para redefinir el tamaño.
638sfdisk -f -uS -N$2 $DISK <<< ",$SIZE" &>/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
639}
640
641
642#/**
643#         ogUpdatePartitionTable
644#@brief   Fuerza al kernel releer la tabla de particiones de los discos duros
645#@param   no requiere
646#@return  informacion propia de la herramienta
647#@note    Requisitos: \c partprobe
648#@warning pendiente estructurar la funcion a opengnsys
649#@version 0.1       Date: 27/10/2008                 Author Antonio J. Doblas Viso. Universidad de Malaga
650#@note   funcion importada de EAC
651#*/
652
653function ogUpdatePartitionTable ()
654{
655echo "Forzando al kernel la lectura de la tabla de particiones"
656list=`partprobe -s | cut -f1 -d: ` 2>/dev/null
657echo $list > /tmp/disk
658}
659
660
661
662
663function ogGetPartitionsNumber () {
664#/**  @function ogGetPartitionsNumber: @brief detecta el numero de particiones del disco duro indicado.
665#@param   int_numdisk   (indentificado EAC del disco)
666#@return  devuelve el numero paritiones del disco duro indicado
667#@warning  Salidas de errores no determinada
668#@attention Requisitos: parted
669#@note    Notas sin especificar
670#@version 0.1       Date: 27/10/2008                 Author Antonio J. Doblas Viso. Universidad de Malaga
671#*/
672           #local disco totalpart
673           #disco=`ogDiskToDev $1`
674           #totalpart=`parted $disco print | egrep ^" [0123456789] " -c`
675           #echo $totalpart
676local DISK
677#/// Contar el nº de veces que aparece el disco en su lista de particiones.
678DISK=$(ogDiskToDev $1) 2>/dev/null
679sfdisk -l $DISK 2>/dev/null | grep -c "^$DISK"
680}
681
682
683function ogDiskToRelativeDev () {
684#/**  @function ogDiskToRelativeDev: @brief Traduce los ID de discos o particiones EAC a ID Linux relativos, es decir 1 1 => sda1
685#@param  Admite 1 parametro:   $1  int_numdisk
686#@param  Admite 2 parametro:   $1   int_numdisk                    $2  int_partition
687#@return  Para 1 parametros traduce Discos Duros: Devuelve la ruta relativa linux del disco duro indicado con nomenclatura EAC.........ejemplo: IdPartition 1 => sda
688#@return  Para 2 parametros traduce Particiones: Devuelve la ruta relativa linux de la particion indicado con nomenclatura EAC...........  ejemplo: IdPartition  2 1 => sdb1
689#@warning  No definidas
690#@attention
691#@note    Notas sin especificar
692#@version 0.1       Date: 27/10/2008                 Author Antonio J. Doblas Viso. Universidad de Malaga
693#*/
694
695if [ $# = 0 ]
696then
697        Msg "Info: Traduce el identificador del dispositivo EAC a dispositivo linux \n" info
698        Msg "Sintaxis1: IdPartition int_disk -----------------Ejemplo1: IdPartition 1 -> sda " example
699        Msg "Sintaxis2: IdPartition int_disk int_partition  --Ejemplo2: IdPartition 1 2 -> sda2 " example
700
701return
702fi
703#PART="$(Disk|cut -f$1 -d' ')$2"    # se comenta esta linea porque doxygen no reconoce la funcion disk y no crea los enlaces y referencias correctas.
704PART=$(ogDiskToDev|cut -f$1 -d' ')$2
705echo $PART | cut -f3 -d \/
706}
707
708
709function ogDeletePartitionTable () {
710#/**  @function ogDeletePartitionTable: @brief Borra la tabla de particiones del disco.
711#@param $1 opcion A (identificador LINUX)       str_ID_linux (/dev/sda)
712#@param $1 opcion B (Identifiador EAC)                  int_numdiskEAC(1)
713#@return   la informacion propia del fdisk
714#@warning    no definidos
715#@attention
716#@note
717#@version 0.1       Date: 27/10/2008                 Author Antonio J. Doblas Viso. Universidad de Malaga
718#*/
719if [ $# = 0 ]
720then
721        Msg "sintaxis1: ogDeletePartitionTable int_disk" red
722        Msg "sintaxis2: ogDeletePartitionTable str_/dev/sdX" red
723        return
724fi
725if [ -n "${1%/dev/*}" ]
726        then
727        dev=`DiskToDev $1`
728        else
729        dev=$1
730fi
731echo -ne "o\nw" | fdisk $dev
732}
733
734
735
736function ogSetPartitionId() {
737#/**  @function ogSetPartitionId: @brief Cambia el identificador de la particion, pero no su sistema de archivos.
738#@param  $1 int_numdiskEAC
739#@param  $2 int_numpartitionEAC
740#@param  $3 str_tipoPartition admite EXT2 EXT3 NTFS FAT32 SWAP CACHE
741#@return   la propia del fdisk
742#@warning    no controla los parametros, si se introducen mal o simplemente no se introducen no muestra mensaje
743#@warning    Identifica por nombre del sistema de archivos no por número
744#@attention Requisitos:  fdisk
745#@note
746#@version 0.1       Date: 27/10/2008                 Author Antonio J. Doblas Viso. Universidad de Malaga
747#*/
748
749# Variables locales
750local DISK PART ID
751
752# Si se solicita, mostrar ayuda.
753if [ "$*" == "help" ]; then
754    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
755           "$FUNCNAME 1 1 10000000"
756    return
757fi
758# Error si no se reciben 3 parámetros.
759[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
760
761# Sustituye nº de disco por su dispositivo.
762DISK=`ogDiskToDev $1` || return $?
763PART=`ogDiskToDev $1 $2` || return $?
764
765# Elección del tipo de partición.
766ID=$(ogFsToId "$3")
767[ -n "$ID" ] || ogRaiseError $OG_ERR_PARTITION "$TYPE" || return $?
768
769echo -ne "t\n$2\n${ID}\nw\n" | fdisk $DISK 1>/dev/null 2>&1
770}
771
772
773function ogDeletePartitionsLabels () {
774#/**  @function ogDeletePartitionsLabels: @brief Elimina la informacion que tiene el kernel del cliente og sobre los labels de los sistemas de archivos
775#@param  No requiere
776#@return   Nada
777#@warning
778#@attention Requisitos:  comando interno linux rm
779#@note
780#@version 0.1       Date: 27/10/2008                 Author Antonio J. Doblas Viso. Universidad de Malaga
781#*/
782rm /dev/disk/by-label/*    # */ COMENTARIO OBLIGATORIO PARA DOXYGEN
783}
784
Note: See TracBrowser for help on using the repository browser.