source: client/engine/Disk.lib @ a6d6d6f

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 a6d6d6f was d3a25ab, checked in by irina <irinagomez@…>, 9 years ago

#735 ogCreatePartitions: para discos con sector IO mínimo de 4K, cambia el inicio de la primera partición a 4096

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

  • Property mode set to 100755
File size: 54.5 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 1.1.0
8#@warning License: GNU GPLv3+
9#*/
10
11
12# Función ficticia para lanzar parted con timeout, evitando cuelgues del programa.
13function parted ()
14{
15timeout -k 5s -s KILL 3s $(which parted) "$@"
16}
17
18
19#/**
20#         ogCreatePartitions int_ndisk str_parttype:int_partsize ...
21#@brief   Define el conjunto de particiones de un disco.
22#@param   int_ndisk      nº de orden del disco
23#@param   str_parttype   mnemónico del tipo de partición
24#@param   int_partsize   tamaño de la partición (en KB)
25#@return  (nada, por determinar)
26#@exception OG_ERR_FORMAT    formato incorrecto.
27#@exception OG_ERR_NOTFOUND  disco o partición no detectado (no es un dispositivo).
28#@exception OG_ERR_PARTITION error en partición o en tabla de particiones.
29#@attention El nº de partición se indica por el orden de los párametros \c parttype:partsize
30#@attention Pueden definirse particiones vacías de tipo \c EMPTY
31#@attention No puede definirse partición de cache y no se modifica si existe.
32#@note    Requisitos: sfdisk, parted, partprobe, awk
33#@todo    Definir atributos (arranque, oculta) y tamaños en MB, GB, etc.
34#@version 0.9 - Primera versión para OpenGnSys
35#@author  Ramon Gomez, ETSII Universidad de Sevilla
36#@date    2009/09/09
37#@version 0.9.1 - Corrección del redondeo del tamaño del disco.
38#@author  Ramon Gomez, ETSII Universidad de Sevilla
39#@date    2010/03/09
40#@version 1.0.4 - Llamada a función específica para tablas GPT.
41#@author  Universidad de Huelva
42#@date    2012/03/30
43#@version 1.1.1 - El inicio de la primera partición logica es el de la extendida más 4x512
44#@author  Irina Gomez, ETSII Universidad de Sevilla
45#@date    2016/07/11
46#*/ ##
47function ogCreatePartitions ()
48{
49# Variables locales.
50local ND DISK PTTYPE PART SECTORS START SIZE TYPE CACHEPART IODISCO IOSIZE CACHESIZE EXTSTART EXTSIZE tmpsfdisk
51# Si se solicita, mostrar ayuda.
52if [ "$*" == "help" ]; then
53    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk str_parttype:int_partsize ..." \
54           "$FUNCNAME 1 NTFS:10000000 EXT3:5000000 LINUX-SWAP:1000000"
55    return
56fi
57# Error si no se reciben al menos 2 parámetros.
58[ $# -ge 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
59
60# Nº total de sectores, para evitar desbordamiento (evitar redondeo).
61ND="$1"
62DISK=$(ogDiskToDev "$ND") || return $?
63PTTYPE=$(ogGetPartitionTableType $1)
64PTTYPE=${PTTYPE:-"MSDOS"}               # Por defecto para discos vacíos.
65case "$PTTYPE" in
66    GPT)   ogCreateGptPartitions "$@"
67           return $? ;;
68    MSDOS) ;;
69    *)     ogRaiseError $OG_ERR_PARTITION "$PTTYPE"
70           return $? ;;
71esac
72SECTORS=$(ogGetLastSector $1)
73# Se recalcula el nº de sectores del disco 1, si existe partición de caché.
74CACHEPART=$(ogFindCache 2>/dev/null)
75[ "$ND" = "${CACHEPART% *}" ] && CACHESIZE=$(ogGetCacheSize 2>/dev/null | awk '{print $0*2}')
76[ -n "$CACHESIZE" ] && SECTORS=$[SECTORS-CACHESIZE]
77
78# Sector de inicio (la partición 1 empieza en el sector 63).
79IODISCO=$(ogDiskToDev $1)
80IOSIZE=$(fdisk -l $IODISCO | awk '/I\/O/ {print $4}')
81if [ "$IOSIZE" == "4096" ]; then
82    START=4096
83else
84    START=63
85fi
86PART=1
87
88# Fichero temporal de entrada para "sfdisk"
89tmpsfdisk=/tmp/sfdisk$$
90trap "rm -f $tmpsfdisk" 1 2 3 9 15
91
92echo "unit: sectors" >$tmpsfdisk
93echo                >>$tmpsfdisk
94
95# Generar fichero de entrada para "sfdisk" con las particiones.
96shift
97while [ $# -gt 0 ]; do
98    # Conservar los datos de la partición de caché.
99    if [ "$ND $PART" == "$CACHEPART" -a -n "$CACHESIZE" ]; then
100        echo "$DISK$PART : start=$[SECTORS+1], size=$CACHESIZE, Id=ca" >>$tmpsfdisk
101        PART=$[PART+1]
102    fi
103    # Leer formato de cada parámetro - Tipo:Tamaño
104    TYPE="${1%%:*}"
105    SIZE="${1#*:}"
106    # Obtener identificador de tipo de partición válido.
107    ID=$(ogTypeToId "$TYPE" MSDOS)
108    [ "$TYPE" != "CACHE" -a -n "$ID" ] || ogRaiseError $OG_ERR_PARTITION "$TYPE" || return $?
109    # Comprobar tamaño numérico y convertir en sectores de 512 B.
110    [[ "$SIZE" == *([0-9]) ]] || ogRaiseError $OG_ERR_FORMAT "$SIZE" || return $?
111    SIZE=$[SIZE*2]
112    # Comprobar si la partición es extendida.
113    if [ $ID = 5 ]; then
114        [ $PART -le 4 ] || ogRaiseError $OG_ERR_FORMAT || return $?
115        # El inicio de la primera partición logica es el de la extendida más 4x512
116        let EXTSTART=$START+2048
117        let EXTSIZE=$SIZE-2048
118    fi
119    # Incluir particiones lógicas dentro de la partición extendida.
120    if [ $PART = 5 ]; then
121        [ -n "$EXTSTART" ] || ogRaiseError $OG_ERR_FORMAT || return $?
122        START=$EXTSTART
123        SECTORS=$[EXTSTART+EXTSIZE]
124    fi
125    # Generar datos para la partición.
126    echo "$DISK$PART : start=$START, size=$SIZE, Id=$ID" >>$tmpsfdisk
127    # Error si se supera el nº total de sectores.
128    START=$[START+SIZE]
129    [ $START -le $SECTORS ] || ogRaiseError $OG_ERR_FORMAT "$[START/2] > $[SECTORS/2]" || return $?
130    PART=$[PART+1]
131    shift
132done
133# Si no se indican las 4 particiones primarias, definirlas como vacías, conservando la partición de caché.
134while [ $PART -le 4 ]; do
135    if [ "$ND $PART" == "$CACHEPART" -a -n "$CACHESIZE" ]; then
136        echo "$DISK$PART : start=$[SECTORS+1], size=$CACHESIZE, Id=ca" >>$tmpsfdisk
137    else
138        echo "$DISK$PART : start=0, size=0, Id=0" >>$tmpsfdisk
139    fi
140    PART=$[PART+1]
141done
142# Si se define partición extendida sin lógicas, crear particion 5 vacía.
143if [ $PART = 5 -a -n "$EXTSTART" ]; then
144    echo "${DISK}5 : start=$EXTSTART, size=$EXTSIZE, Id=0" >>$tmpsfdisk
145fi
146
147# Desmontar los sistemas de archivos del disco antes de realizar las operaciones.
148ogUnmountAll $ND 2>/dev/null
149[ -n "$CACHESIZE" ] && ogUnmountCache 2>/dev/null
150
151# Si la tabla de particiones no es valida, volver a generarla.
152ogCreatePartitionTable $ND
153# Definir particiones y notificar al kernel.
154sfdisk -f $DISK < $tmpsfdisk 2>/dev/null && partprobe $DISK
155rm -f $tmpsfdisk
156[ -n "$CACHESIZE" ] && ogMountCache 2>/dev/null || return 0
157}
158
159
160#/**
161#         ogCreateGptPartitions int_ndisk str_parttype:int_partsize ...
162#@brief   Define el conjunto de particiones de un disco GPT
163#@param   int_ndisk      nº de orden del disco
164#@param   str_parttype   mnemónico del tipo de partición
165#@param   int_partsize   tamaño de la partición (en KB)
166#@return  (nada, por determinar)
167#@exception OG_ERR_FORMAT    formato incorrecto.
168#@exception OG_ERR_NOTFOUND  disco o partición no detectado (no es un dispositivo).
169#@exception OG_ERR_PARTITION error en partición o en tabla de particiones.
170#@attention El nº de partición se indica por el orden de los párametros \c parttype:partsize
171#@attention Pueden definirse particiones vacías de tipo \c EMPTY
172#@attention No puede definirse partición de caché y no se modifica si existe.
173#@note    Requisitos: sfdisk, parted, partprobe, awk
174#@todo    Definir atributos (arranque, oculta) y tamaños en MB, GB, etc.
175#@version 1.0.4 - Primera versión para OpenGnSys
176#@author  Universidad de Huelva
177#@date    2012/03/30
178#*/ ##
179function ogCreateGptPartitions ()
180{
181# Variables locales.
182local ND DISK PART SECTORS ALIGN START SIZE TYPE CACHEPART CACHESIZE DELOPTIONS OPTIONS
183# Si se solicita, mostrar ayuda.
184if [ "$*" == "help" ]; then
185    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk str_parttype:int_partsize ..." \
186           "$FUNCNAME 1 NTFS:10000000 EXT3:5000000 LINUX-SWAP:1000000"
187    return
188fi
189# Error si no se reciben menos de 2 parámetros.
190[ $# -ge 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
191
192# Nº total de sectores, para evitar desbordamiento (evitar redondeo).
193ND="$1"
194DISK=$(ogDiskToDev "$ND") || return $?
195# Se calcula el ultimo sector del disco (total de sectores usables)
196SECTORS=$(ogGetLastSector $1)
197# Se recalcula el nº de sectores del disco si existe partición de caché.
198CACHEPART=$(ogFindCache 2>/dev/null)
199[ "$ND" = "${CACHEPART% *}" ] && CACHESIZE=$(ogGetCacheSize 2>/dev/null | awk '{print $0*2}')
200[ -n "$CACHESIZE" ] && SECTORS=$[SECTORS-CACHESIZE]
201# Si el disco es GPT empieza en el sector 2048  por defecto, pero podria cambiarse
202ALIGN=$(sgdisk -D $DISK 2>/dev/null)
203START=$ALIGN
204PART=1
205
206# Leer parámetros con definición de particionado.
207shift
208
209while [ $# -gt 0 ]; do
210    # Si PART es la cache, nos la saltamos y seguimos con el siguiente numero para conservar los datos de la partición de caché.
211    if [ "$ND $PART" == "$CACHEPART" -a -n "$CACHESIZE" ]; then
212        PART=$[PART+1]
213    fi
214    # Leer formato de cada parámetro - Tipo:Tamaño
215    TYPE="${1%%:*}"
216    SIZE="${1#*:}"
217    # Error si la partición es extendida (no válida en discos GPT).
218    if [ "$TYPE" == "EXTENDED" ]; then
219        ogRaiseError $OG_ERR_PARTITION "EXTENDED"
220        return $?
221    fi
222    # Comprobar si existe la particion actual, capturamos su tamaño para ver si cambio o no
223    PARTSIZE=$(ogGetPartitionSize $ND $PART 2>/dev/null)
224    # En sgdisk no se pueden redimensionar las particiones, es necesario borrarlas y volver a crealas
225    [ $PARTSIZE ] && DELOPTIONS="$DELOPTIONS -d$PART"
226    # Creamos la particion
227    # Obtener identificador de tipo de partición válido.
228    ID=$(ogTypeToId "$TYPE" GPT)
229    [ "$TYPE" != "CACHE" -a -n "$ID" ] || ogRaiseError $OG_ERR_PARTITION "$TYPE" || return $?
230    # Comprobar tamaño numérico y convertir en sectores de 512 B.
231    [[ "$SIZE" == *([0-9]) ]] || ogRaiseError $OG_ERR_FORMAT "$SIZE" || return $?
232    SIZE=$[SIZE*2]
233    # SIZE debe ser múltiplo de ALIGN, si no gdisk lo mueve automáticamente.
234    DIV=$[$SIZE/$ALIGN]
235    SIZE=$[$DIV*$ALIGN]
236    # En el caso de que la partición sea EMPTY no se crea nada
237    if [ "$TYPE" != "EMPTY" ]; then
238        OPTIONS="$OPTIONS -n$PART:$START:+$SIZE -t$PART:$ID "
239    fi
240    START=$[START+SIZE]
241    # Error si se supera el nº total de sectores.
242    [ $START -le $SECTORS ] || ogRaiseError $OG_ERR_FORMAT "$[START/2] > $[SECTORS/2]" || return $?
243    PART=$[PART+1]
244    shift
245done
246
247# Desmontar los sistemas de archivos del disco antes de realizar las operaciones.
248ogUnmountAll $ND 2>/dev/null
249[ -n "$CACHESIZE" ] && ogUnmountCache 2>/dev/null
250
251# Si la tabla de particiones no es valida, volver a generarla.
252ogCreatePartitionTable $ND
253# Definir particiones y notificar al kernel.
254# Borramos primero las particiones y luego creamos las nuevas
255sgdisk $DELOPTIONS $OPTIONS $DISK 2>/dev/null && partprobe $DISK
256[ -n "$CACHESIZE" ] && ogMountCache 2>/dev/null
257}
258
259
260#/**
261#         ogCreatePartitionTable int_ndisk [str_tabletype]
262#@brief   Genera una tabla de particiones en caso de que no sea valida, si es valida no hace nada.
263#@param   int_ndisk      nº de orden del disco
264#@param   str_tabletype  tipo de tabla de particiones (opcional)
265#@return  (por determinar)
266#@exception OG_ERR_FORMAT   Formato incorrecto.
267#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
268#@note    tabletype: { MSDOS, GPT }, MSDOS por defecto
269#@note    Requisitos: fdisk, gdisk, parted
270#@version 1.0.4 - Primera versión compatible con OpenGnSys.
271#@author  Universidad de Huelva
272#@date    2012/03/06
273#@version 1.0.6a - Adaptar creación de nueva tabla MSDOS.
274#@author  Ramon Gomez, ETSII Universidad de Sevilla
275#@date    2016/01/29
276#*/ ##
277function ogCreatePartitionTable ()
278{
279# Variables locales.
280local DISK PTTYPE CREATE CREATEPTT
281
282# Si se solicita, mostrar ayuda.
283if [ "$*" == "help" ]; then
284    ogHelp "$FUNCNAME int_ndisk [str_partype]" \
285           "$FUNCNAME 1 GPT" "$FUNCNAME 1"
286    return
287fi
288# Error si no se reciben 1 o 2 parámetros.
289case $# in
290    1)  CREATEPTT="" ;;
291    2)  CREATEPTT="$2" ;;
292    *)  ogRaiseError $OG_ERR_FORMAT
293        return $? ;;
294esac
295
296# Capturamos el tipo de tabla de particiones actual
297DISK=$(ogDiskToDev $1) || return $?
298PTTYPE=$(ogGetPartitionTableType $1)
299PTTYPE=${PTTYPE:-"MSDOS"}               # Por defecto para discos vacíos.
300CREATEPTT=${CREATEPTT:-"$PTTYPE"}
301
302# Si la tabla actual y la que se indica son iguales, se comprueba si hay que regenerarla.
303if [ "$CREATEPTT" == "$PTTYPE" ]; then
304    case "$PTTYPE" in
305        GPT)   [ ! $(sgdisk -p $DISK 2>&1 >/dev/null) ] || CREATE="GPT" ;;
306        MSDOS) [ $(parted -s $DISK print >/dev/null) ] || CREATE="MSDOS" ;;
307    esac
308else
309    CREATE="$CREATEPTT"
310fi
311# Dependiendo del valor de CREATE, creamos la tabla de particiones en cada caso.
312case "$CREATE" in
313    GPT)
314        # Si es necesario crear una tabla GPT pero la actual es MSDOS
315        if [ "$PTTYPE" == "MSDOS" ]; then
316            sgdisk -g $DISK
317        else
318            echo -e "2\nw\nY\n" | gdisk $DISK
319        fi
320        partprobe $DISK 2>/dev/null
321        ;;
322    MSDOS)
323        # Si es necesario crear una tabla MSDOS pero la actual es GPT
324        if [ "$PTTYPE" == "GPT" ]; then
325            sgdisk -Z $DISK
326        fi
327        # Crear y borrar una partición para que la tabla se genere bien.
328        echo -e "o\nn\np\n\n\n\nd\n\nw" | fdisk $DISK
329        partprobe $DISK 2>/dev/null
330        ;;
331esac
332}
333
334
335#/**
336#         ogDeletePartitionTable ndisk
337#@brief   Borra la tabla de particiones del disco.
338#@param   int_ndisk      nº de orden del disco
339#@return  la informacion propia del fdisk
340#@version 0.1 -  Integracion para OpenGnSys
341#@author  Antonio J. Doblas Viso. Universidad de Malaga
342#@date    2008/10/27
343#@version 1.0.4 - Adaptado para su uso con discos GPT
344#@author  Universidad de Huelva
345#@date    2012/03/13
346#*/ ##
347function ogDeletePartitionTable ()
348{
349# Variables locales.
350local DISK
351
352# Si se solicita, mostrar ayuda.
353if [ "$*" == "help" ]; then
354    ogHelp "$FUNCNAME int_ndisk" "$FUNCNAME 1"
355    return
356fi
357# Error si no se reciben 1 parámetros.
358[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
359
360# Obteniendo Identificador linux del disco.
361DISK=$(ogDiskToDev $1) || return $?
362# Crear una tabla de particiones vacía.
363case "$(ogGetPartitionTableType $1)" in
364    GPT)    sgdisk -o $DISK ;;
365    MSDOS)  echo -ne "o\nw" | fdisk $DISK ;;
366esac
367}
368
369
370#/**
371#         ogDevToDisk path_device | LABEL="str_label" | UUID="str_uuid"
372#@brief   Devuelve el nº de orden de dicso (y partición) correspondiente al nombre de fichero de dispositivo o a la etiqueta o UUID del sistema de archivos asociado.
373#@param   path_device  Camino del fichero de dispositivo.
374#@param   str_label    etiqueta de sistema de archivos.
375#@param   str_uuid     UUID de sistema de archivos.
376#@return  int_ndisk (para dispositivo de disco)
377#@return  int_ndisk int_npartition (para dispositivo de partición).
378#@exception OG_ERR_FORMAT   Formato incorrecto.
379#@exception OG_ERR_NOTFOUND Dispositivo no detectado.
380#@note    Solo se acepta en cada llamada 1 de los 3 tipos de parámetros.
381#@version 0.1 -  Integracion para Opengnsys  -  EAC: DiskEAC() en ATA.lib
382#@author  Antonio J. Doblas Viso, Universidad de Malaga
383#@date    2008/10/27
384#@version 0.9 - Primera version para OpenGnSys
385#@author  Ramon Gomez, ETSII Universidad Sevilla
386#@date    2009/07/20
387#@version 1.0.6 - Soporta parámetro con UIID o etiqueta.
388#@author  Ramon Gomez, ETSII Universidad Sevilla
389#@date    2014/07/13
390#*/ ##
391function ogDevToDisk ()
392{
393# Variables locales.
394local DEV d n
395# Si se solicita, mostrar ayuda.
396if [ "$*" == "help" ]; then
397    ogHelp "$FUNCNAME" "$FUNCNAME path_device | LABEL=str_label | UUID=str_uuid" \
398           "$FUNCNAME /dev/sda  =>  1" \
399           "$FUNCNAME /dev/sda1  =>  1 1" \
400           "$FUNCNAME LABEL=CACHE  =>  1 4"
401    return
402fi
403
404# Error si no se recibe 1 parámetro.
405[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
406
407# Obtener dispositivo a partir de camino, etiqueta o UUID.
408DEV="$1"
409case "$DEV" in
410    LABEL=*)    DEV=$(blkid -L "${1#*=}") ;;
411    UUID=*)     DEV=$(blkid -U "${1#*=}") ;;
412esac
413
414# Error si no es fichero de bloques.
415[ -b "$DEV" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $?
416
417# Procesa todos los discos para devolver su nº de orden y de partición.
418n=1
419for d in $(ogDiskToDev); do
420    [ -n "$(echo $DEV | grep $d)" ] && echo "$n ${DEV#$d}" && return
421    n=$[n+1]
422done
423ogRaiseError $OG_ERR_NOTFOUND "$1"
424return $OG_ERR_NOTFOUND
425}
426
427
428#/**
429#         ogDiskToDev [int_ndisk [int_npartition]]
430#@brief   Devuelve la equivalencia entre el nº de orden del dispositivo (dicso o partición) y el nombre de fichero de dispositivo correspondiente.
431#@param   int_ndisk      nº de orden del disco
432#@param   int_npartition nº de orden de la partición
433#@return  Para 0 parametros: Devuelve los nombres de ficheros  de los dispositivos sata/ata/usb linux encontrados.
434#@return  Para 1 parametros: Devuelve la ruta del disco duro indicado.
435#@return  Para 2 parametros: Devuelve la ruta de la particion indicada.
436#@exception OG_ERR_FORMAT   Formato incorrecto.
437#@exception OG_ERR_NOTFOUND Dispositivo no detectado.
438#@note    Requisitos: awk, lvm
439#@version 0.1 -  Integracion para Opengnsys  -  EAC: Disk() en ATA.lib;  HIDRA: DetectarDiscos.sh
440#@author Ramon Gomez, ETSII Universidad de Sevilla
441#@Date    2008/06/19
442#@author  Antonio J. Doblas Viso, Universidad de Malaga
443#@date    2008/10/27
444#@version 0.9 - Primera version para OpenGnSys
445#@author  Ramon Gomez, ETSII Universidad Sevilla
446#@date    2009-07-20
447#@version 1.0.5 - Comprobación correcta de parámetros para soportar valores > 9.
448#@author  Ramon Gomez, ETSII Universidad Sevilla
449#@date    2013-05-07
450#@version 1.0.6 - Soportar RAID hardware y Multipath.
451#@author  Ramon Gomez, ETSII Universidad Sevilla
452#@date    2014-09-23
453#@version 1.1.0 - Usar caché de datos y soportar pool de volúmenes ZFS.
454#@author  Ramon Gomez, ETSII Universidad Sevilla
455#@date    2016-05-27
456#*/ ##
457function ogDiskToDev ()
458{
459# Variables locales
460local CACHEFILE ALLDISKS MPATH VOLGROUPS ZFSVOLS DISK PART ZPOOL i
461
462# Si se solicita, mostrar ayuda.
463if [ "$*" == "help" ]; then
464    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk [int_npartition]" \
465           "$FUNCNAME      =>  /dev/sda /dev/sdb" \
466           "$FUNCNAME 1    =>  /dev/sda" \
467           "$FUNCNAME 1 1  =>  /dev/sda1"
468    return
469fi
470
471# Borrar fichero de caché de configuración si hay cambios en las particiones.
472CACHEFILE=/var/cache/disks.cfg
473if ! diff -q <(cat /proc/partitions) /tmp/.partitions &>/dev/null; then
474    # Guardar copia de las particiones definidas para comprobar cambios.
475    cp -a /proc/partitions /tmp/.partitions
476    rm -f $CACHEFILE
477fi
478
479# Si existe una correspondencia con disco/dispositivo en el caché; mostrarlo y salir.
480PART=$(awk -F: -v d="$*" '{if ($1==d) {print $2}}' $CACHEFILE 2>/dev/null)
481if [ -n "$PART" ]; then
482    echo "$PART"
483    return
484fi
485
486# Continuar para detectar nuevos dispositivos.
487# Listar dispositivos de discos.
488ALLDISKS=$(lsblk -n -e 1,2 | awk '$6~/^disk$/ {gsub(/!/,"/"); printf "/dev/%s ",$1}')
489
490# Listar volúmenes lógicos.
491VOLGROUPS=$(vgs -a --noheadings 2>/dev/null | awk '{printf "/dev/%s ",$1}')
492ALLDISKS="$ALLDISKS $VOLGROUPS"
493
494# Detectar caminos múltiples (ignorar mensaje si no está configurado Multipath).
495if MPATH=$(multipath -l -v 1 2>/dev/null | awk '{printf "/dev/mapper/%s ",$1}'; exit ${PIPESTATUS[0]}); then
496    # Quitar de la lista los discos que forman parte de Multipath.
497    for i in $(multipath -ll | awk '$6=="ready" {printf "/dev/%s ",$3}'); do
498        ALLDISKS="${ALLDISKS//$i/}"
499    done
500    # Añadir caminos múltiples a los discos detectados.
501    ALLDISKS="$ALLDISKS $MPATH"
502fi
503
504# Detectar volúmenes ZFS.
505ZFSVOLS=$(blkid | awk -F: '/zfs/ {print $1}')
506ALLDISKS="$ALLDISKS $ZFSVOLS"
507
508# Mostrar salidas segun el número de parametros.
509case $# in
510    0)  # Muestra todos los discos, separados por espacios.
511        echo $ALLDISKS
512        ;;
513    1)  # Error si el parámetro no es un número positivo.
514        [[ "$1" =~ ^[1-9][0-9]*$ ]] || ogRaiseError $OG_ERR_FORMAT "$1" || return $?
515        DISK=$(echo "$ALLDISKS" | awk -v n=$1 '{print $n}')
516        # Error si el fichero no existe.
517        [ -e "$DISK" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $?
518        # Actualizar caché de configuración y mostrar dispositivo.
519        echo "$*:$DISK" >> $CACHEFILE
520        echo "$DISK"
521        ;;
522    2)  # Error si los 2 parámetros no son números positivos.
523        [[ "$1" =~ ^[1-9][0-9]*$ ]] && [[ "$2" =~ ^[1-9][0-9]*$ ]] || ogRaiseError $OG_ERR_FORMAT "$1 $2" || return $?
524        DISK=$(echo "$ALLDISKS" | awk -v n=$1 '{print $n}')
525        [ -e "$DISK" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $?
526        PART="$DISK$2"
527        # Comprobar si es partición.
528        if [ -b "$PART" ]; then
529            # Actualizar caché de configuración y mostrar dispositivo.
530            echo "$*:$PART" >> $CACHEFILE
531            echo "$PART"
532        else
533            # Comprobar si RAID o Multipath (tener en cuenta enlace simbólico).
534            PART="${DISK}p$2"
535            if [ "$(stat -L -c "%A" "$PART" 2>/dev/null | cut -c1)" == "b" ]; then
536                # Actualizar caché de configuración y mostrar dispositivo.
537                echo "$*:$PART" >> $CACHEFILE
538                echo "$PART"
539            else
540                PART=""
541                # Comprobar si volumen lógico.          /* (comentario Doxygen)
542                if ogCheckStringInGroup "$DISK" "$VOLGROUPS"; then
543                    PART=$(lvscan -a 2>/dev/null | \
544                           awk -F\' -v n=$2 "\$2~/^${DISK//\//\\/}\// {if (NR==n) print \$2}")
545                    [ -e "$PART" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2" || return $?
546                    #                                   (comentario Doxygen) */
547                fi
548                # Comprobar si volumen ZFS que puede ser montado.
549                if ogCheckStringInGroup "$DISK" "$ZFSVOLS"; then
550                    zpool import -f -R /mnt -N -a 2>/dev/null
551                    ZPOOL=$(blkid -s LABEL -o value $DISK)
552                    PART=$(zfs list -Hp -o name,canmount,mountpoint -r $ZPOOL | \
553                           awk -v n=$2 '$2=="on" && $3!="none" {c++; if (c==n) print $1}')
554                fi
555                # Salir si no se encuentra dispositivo.
556                [ -n "$PART" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2" || return $?
557                # Devolver camino al dispositivo.
558                # Actualizar caché de configuración y mostrar dispositivo.
559                echo "$*:$PART" >> $CACHEFILE
560                echo "$PART"
561            fi
562        fi
563        ;;
564    *)  # Formato erroneo.
565        ogRaiseError $OG_ERR_FORMAT
566        return $OG_ERR_FORMAT
567        ;;
568esac
569}
570
571
572#/**
573#         ogGetDiskSize int_ndisk
574#@brief   Muestra el tamaño en KB de un disco.
575#@param   int_ndisk   nº de orden del disco
576#@return  int_size  - Tamaño en KB del disco.
577#@exception OG_ERR_FORMAT   formato incorrecto.
578#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
579#@note    Requisitos: sfdisk, awk
580#@version 0.9.2 - Primera version para OpenGnSys
581#@author  Ramon Gomez, ETSII Universidad de Sevilla
582#@date    2010/09/15
583#@version 1.0.6 - Soportar LVM.
584#@author  Universidad de Huelva
585#@date    2014/09/04
586#*/ ##
587function ogGetDiskSize ()
588{
589# Variables locales.
590local DISK SIZE
591
592# Si se solicita, mostrar ayuda.
593if [ "$*" == "help" ]; then
594    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" "$FUNCNAME 1  => 244198584"
595    return
596fi
597# Error si no se recibe 1 parámetro.
598[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
599
600# Obtener el tamaño del disco.
601DISK="$(ogDiskToDev $1)" || return $?
602SIZE=$(awk -v D=${DISK#/dev/} '{if ($4==D) {print $3}}' /proc/partitions)
603# Si no, obtener tamaño del grupo de volúmenes.
604[ -z "$SIZE" ] && SIZE=$(vgs --noheadings --units=B -o dev_size $DISK 2>/dev/null | \
605                         awk '{print $1/1024}')
606
607# Mostrar salida.
608[ -n "$SIZE" ] && echo "$SIZE"
609}
610
611
612#/**
613#         ogGetDiskType path_device
614#@brief   Muestra el tipo de disco (real, RAID, meta-disco, etc.).
615#@warning Función en pruebas
616#*/ ##
617function ogGetDiskType ()
618{
619local DEV MAJOR TYPE
620
621# Obtener el driver del dispositivo de bloques.
622[ -b "$1" ] || ogRaiseError $OG_ERR_FORMAT || return $?
623DEV=${1#/dev/}
624MAJOR=$(awk -v D="$DEV" '{if ($4==D) print $1;}' /proc/partitions)
625TYPE=$(awk -v D=$MAJOR '/Block/ {bl=1} {if ($1==D&&bl) print toupper($2)}' /proc/devices)
626# Devolver mnemónico del driver de dispositivo.
627case "$TYPE" in
628    SD)            TYPE="DISK" ;;
629    SR|IDE*)       TYPE="CDROM" ;;         # FIXME Comprobar discos IDE.
630    MD|CCISS*)     TYPE="RAID" ;;
631    DEVICE-MAPPER) TYPE="MAPPER" ;;        # FIXME Comprobar LVM y RAID.
632esac
633echo $TYPE
634}
635
636
637#/**
638#         ogGetLastSector int_ndisk [int_npart]
639#@brief   Devuelve el último sector usable del disco o de una partición.
640#@param   int_ndisk      nº de orden del disco
641#@param   int_npart      nº de orden de la partición (opcional)
642#@return  Último sector usable.
643#@exception OG_ERR_FORMAT   Formato incorrecto.
644#@exception OG_ERR_NOTFOUND Disco o partición no corresponde con un dispositivo.
645#@note    Requisitos: sfdisk, sgdisk
646#@version 1.0.4 - Primera versión compatible con OpenGnSys.
647#@author  Universidad de Huelva
648#@date    2012/06/03
649#@version 1.1.0 - Usar "hdparm" y "partx" en vez de "sfdisk".
650#@author  Ramon Gomez, ETSII Universidad Sevilla
651#@date    2016-05-20
652#*/ ##
653function ogGetLastSector ()
654{
655# Variables locales
656local DISK PART LASTSECTOR
657# Si se solicita, mostrar ayuda.
658if [ "$*" == "help" ]; then
659    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk [int_npart]" \
660           "$FUNCNAME 1  =>  488392064" \
661           "$FUNCNAME 1 1  =>  102400062"
662    return
663fi
664
665# Obtener último sector.
666case $# in
667    1)  # Para un disco.
668        DISK=$(ogDiskToDev $1) || return $?
669        LASTSECTOR=$[$(hdparm -N $DISK | awk -F"[=/]" '/=/ {print $2}') - 1]
670        ;;
671    2)  # Para una partición.
672        PART=$(ogDiskToDev $1 $2) || return $?
673        LASTSECTOR=$(partx -gso END $PART)
674        ;;
675    *)  # Error si se reciben más parámetros.
676        ogRaiseError $OG_ERR_FORMAT
677        return $? ;;
678esac
679echo $LASTSECTOR
680}
681
682
683#/**
684#         ogGetPartitionActive int_ndisk
685#@brief   Muestra que particion de un disco esta marcada como de activa.
686#@param   int_ndisk   nº de orden del disco
687#@return  int_npart   Nº de partición activa
688#@exception OG_ERR_FORMAT Formato incorrecto.
689#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
690#@note    Requisitos: parted
691#@todo    Queda definir formato para atributos (arranque, oculta, ...).
692#@version 0.9 - Primera version compatible con OpenGnSys.
693#@author  Ramon Gomez, ETSII Universidad de Sevilla
694#@date    2009/09/17
695#*/ ##
696function ogGetPartitionActive ()
697{
698# Variables locales
699local DISK
700
701# Si se solicita, mostrar ayuda.
702if [ "$*" == "help" ]; then
703    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" "$FUNCNAME 1  =>  1"
704    return
705fi
706# Error si no se recibe 1 parámetro.
707[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
708
709# Comprobar que el disco existe y listar su partición activa.
710DISK="$(ogDiskToDev $1)" || return $?
711LANG=C parted -sm $DISK print 2>/dev/null | awk -F: '$7~/boot/ {print $1}'
712}
713
714
715#/**
716#         ogGetPartitionId int_ndisk int_npartition
717#@brief   Devuelve el mnemónico con el tipo de partición.
718#@param   int_ndisk      nº de orden del disco
719#@param   int_npartition nº de orden de la partición
720#@return  Identificador de tipo de partición.
721#@exception OG_ERR_FORMAT   Formato incorrecto.
722#@exception OG_ERR_NOTFOUND Disco o partición no corresponde con un dispositivo.
723#@note    Requisitos: sfdisk
724#@version 0.9 - Primera versión compatible con OpenGnSys.
725#@author  Ramon Gomez, ETSII Universidad de Sevilla
726#@date    2009-03-25
727#@version 1.0.2 - Detectar partición vacía.
728#@author  Ramon Gomez, ETSII Universidad de Sevilla
729#@date    2011-12-23
730#@version 1.0.6 - Soportar LVM.
731#@author  Universidad de Huelva
732#@date    2014-09-04
733#@version 1.1.0 - Soportar pool de volúmenes ZFS.
734#@author  Ramon Gomez, ETSII Universidad Sevilla
735#@date    2014-11-14
736#*/ ##
737function ogGetPartitionId ()
738{
739# Variables locales.
740local DISK ID
741
742# Si se solicita, mostrar ayuda.
743if [ "$*" == "help" ]; then
744    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
745           "$FUNCNAME 1 1  =>  7"
746    return
747fi
748# Error si no se reciben 2 parámetros.
749[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
750
751# Detectar y mostrar el id. de tipo de partición.
752DISK=$(ogDiskToDev $1) || return $?
753case "$(ogGetPartitionTableType $1)" in
754    GPT)    ID=$(sgdisk -p $DISK 2>/dev/null | awk -v p="$2" '{if ($1==p) print $6;}') || ogRaiseError $OG_ERR_NOTFOUND "$1,$2" || return $?
755            [ "$ID" == "8301" -a "$1 $2" == "$(ogFindCache)" ] && ID=CA00
756            ;;
757    MSDOS)  ID=$(sfdisk --id $DISK $2 2>/dev/null) || ogRaiseError $OG_ERR_NOTFOUND "$1,$2" || return $? ;;
758    LVM)    ID=10000 ;;
759    ZPOOL)  ID=10010 ;;
760esac
761echo $ID
762}
763
764
765#/**
766#         ogGetPartitionSize int_ndisk int_npartition
767#@brief   Muestra el tamano en KB de una particion determinada.
768#@param   int_ndisk      nº de orden del disco
769#@param   int_npartition nº de orden de la partición
770#@return  int_partsize - Tamaño en KB de la partición.
771#@exception OG_ERR_FORMAT   formato incorrecto.
772#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
773#@note    Requisitos: sfdisk, awk
774#@version 0.1 -  Integracion para Opengnsys  -  EAC: SizePartition () en ATA.lib
775#@author  Antonio J. Doblas Viso, Universidad de Malaga
776#@date    2008/10/27
777#@version 0.9 - Primera version para OpenGnSys
778#@author  Ramon Gomez, ETSII Universidad de Sevilla
779#@date    2009/07/24
780#@version 1.1.0 - Sustituir "sfdisk" por "partx".
781#@author  Ramon Gomez, ETSII Universidad de Sevilla
782#@date    2016/05/04
783#*/ ##
784function ogGetPartitionSize ()
785{
786# Variables locales.
787local PART
788
789# Si se solicita, mostrar ayuda.
790if [ "$*" == "help" ]; then
791    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
792           "$FUNCNAME 1 1  =>  10000000"
793    return
794fi
795# Error si no se reciben 2 parámetros.
796[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
797
798# Devolver tamaño de partición o del sistema de archivos (para ZFS).
799PART="$(ogDiskToDev $1 $2)" || return $?
800partx -gbo SIZE $PART 2>/dev/null | awk '{print int($1/1024)}'
801[ ${PIPESTATUS[0]} -ne 0 ] && ogGetFsSize $1 $2
802return 0
803}
804
805
806#/**
807#         ogGetPartitionsNumber int_ndisk
808#@brief   Detecta el numero de particiones del disco duro indicado.
809#@param   int_ndisk      nº de orden del disco
810#@return  Devuelve el numero paritiones del disco duro indicado
811#@warning Salidas de errores no determinada
812#@attention Requisitos: parted
813#@note    Notas sin especificar
814#@version 0.1 -  Integracion para Opengnsys  -  EAC:  DetectNumberPartition () en ATA.lib
815#@author  Antonio J. Doblas Viso. Universidad de Malaga
816#@date    Date: 27/10/2008
817#@version 1.0 - Uso de sfdisk Primera version para OpenGnSys
818#@author  Ramon Gomez, ETSII Universidad de Sevilla
819#@date    2009-07-24
820#@version 1.0.4 - Uso de /proc/partitions para detectar el numero de particiones
821#@author  Universidad de Huelva
822#@date    2012-03-28
823#@version 1.0.6 - Soportar LVM.
824#@author  Universidad de Huelva
825#@date    2014-09-04
826#@version 1.1.0 - Soportar ZFS y sustituir "sfdisk" por "partx".
827#@author  Ramon Gomez, ETSII Universidad Sevilla
828#@date    2016-04-28
829#*/ ##
830function ogGetPartitionsNumber ()
831{
832# Variables locales.
833local DISK
834# Si se solicita, mostrar ayuda.
835if [ "$*" == "help" ]; then
836    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" \
837           "$FUNCNAME 1  =>  3"
838    return
839fi
840# Error si no se recibe 1 parámetro.
841[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
842
843# Contar el nº de veces que aparece el disco en su lista de particiones.
844DISK=$(ogDiskToDev $1) 2>/dev/null
845case "$(ogGetPartitionTableType $1)" in
846    GPT)    grep -c "${DISK#/dev/}." /proc/partitions ;;
847    MSDOS)  partx -gso NR $DISK 2>/dev/null | awk -v p=0 '{p=$1} END {print p}' ;;
848    LVM)    lvs --noheadings $DISK 2>/dev/null | wc -l ;;
849    ZPOOL)  zpool list &>/dev/null || modprobe zfs
850            zpool import -f -R /mnt -N -a 2>/dev/null
851            zfs list -Hp -o name,canmount,mountpoint -r $(blkid -s LABEL -o value $DISK) | \
852                    awk '$2=="on" && $3!="none" {c++}
853                         END {print c}'
854            ;;
855esac
856}
857
858
859#/**
860#         ogGetPartitionTableType int_ndisk
861#@brief   Devuelve el tipo de tabla de particiones del disco (GPT o MSDOS)
862#@param   int_ndisk       nº de orden del disco
863#@return  str_tabletype - Tipo de tabla de paritiones
864#@warning Salidas de errores no determinada
865#@note    tabletype = { MSDOS, GPT }
866#@note    Requisitos: blkid, parted, vgs
867#@version 1.0.4 - Primera versión para OpenGnSys
868#@author  Universidad de Huelva
869#@date    2012/03/01
870#@version 1.0.6 - Soportar LVM.
871#@author  Universidad de Huelva
872#@date    2014-09-04
873#@version 1.1.0 - Mejorar rendimiento y soportar ZFS.
874#@author  Ramon Gomez, ETSII Universidad Sevilla
875#@date    2014-11-14
876#*/ ##
877function ogGetPartitionTableType ()
878{
879# Variables locales.
880local DISK TYPE
881
882# Si se solicita, mostrar ayuda.
883if [ "$*" == "help" ]; then
884    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" \
885           "$FUNCNAME 1  =>  MSDOS"
886    return
887fi
888# Error si no se recibe 1 parámetro.
889[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
890
891# Sustituye n de disco por su dispositivo.
892DISK=$(ogDiskToDev $1) || return $?
893
894# Comprobar tabla de particiones.
895if [ -b $DISK ]; then
896    TYPE=$(parted -sm $DISK print 2>/dev/null | awk -F: -v D=$DISK '{ if($1 == D) print toupper($6)}')
897    [ -z "$TYPE" ] && TYPE=$(parted -sm $DISK print 2>/dev/null | awk -F: -v D=$DISK '{ if($1 == D) print toupper($6)}')
898fi
899# Comprobar si es volumen lógico.
900[ -d $DISK ] && vgs $DISK &>/dev/null && TYPE="LVM"
901# Comprobar si es pool de ZFS.
902[ -z "$TYPE" -o "$TYPE" == "UNKNOWN" ] && [ -n "$(blkid -s TYPE $DISK | grep zfs)" ] && TYPE="ZPOOL"
903
904# Mostrar salida.
905[ -n "$TYPE" ] && echo "$TYPE"
906}
907
908
909#/**
910#         ogGetPartitionType int_ndisk int_npartition
911#@brief   Devuelve el mnemonico con el tipo de partición.
912#@param   int_ndisk      nº de orden del disco
913#@param   int_npartition nº de orden de la partición
914#@return  Mnemonico
915#@note    Mnemonico: valor devuelto por ogIdToType.
916#@exception OG_ERR_FORMAT   Formato incorrecto.
917#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
918#@version 0.1 -  Integracion para Opengnsys  -  EAC:   TypeFS() en ATA.lib
919#@author  Antonio J. Doblas Viso. Universidad de Malaga
920#@date    2008-10-27
921#@version 0.9 - Primera adaptacion para OpenGnSys.
922#@author  Ramon Gomez, ETSII Universidad de Sevilla
923#@date    2009-07-21
924#@version 1.0.3 - Código trasladado de antigua función ogGetFsType.
925#@author  Ramon Gomez, ETSII Universidad de Sevilla
926#@date    2011-12-01
927#@version 1.0.5 - Usar función ogIdToType para hacer la conversión id. a tipo.
928#@author  Ramon Gomez, ETSII Universidad de Sevilla
929#@date    2013-09-19
930#*/ ##
931function ogGetPartitionType ()
932{
933# Variables locales.
934local ID TYPE
935
936# Si se solicita, mostrar ayuda.
937if [ "$*" == "help" ]; then
938    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
939           "$FUNCNAME 1 1  =>  NTFS"
940    return
941fi
942# Error si no se reciben 2 parámetros.
943[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
944
945# Detectar id. de tipo de partición y codificar al mnemonico.
946ID=$(ogGetPartitionId "$1" "$2") || return $?
947TYPE=$(ogIdToType "$ID")
948echo "$TYPE"
949}
950
951
952#/**
953#         ogHidePartition int_ndisk int_npartition
954#@brief   Oculta un apartición visible.
955#@param   int_ndisk      nº de orden del disco
956#@param   int_npartition nº de orden de la partición
957#@return  (nada)
958#@exception OG_ERR_FORMAT    formato incorrecto.
959#@exception OG_ERR_NOTFOUND  disco o particion no detectado (no es un dispositivo).
960#@exception OG_ERR_PARTITION tipo de partición no reconocido.
961#@version 1.0 - Versión en pruebas.
962#@author  Ramon Gomez, ETSII Universidad de Sevilla
963#@date    2010/01/12
964#*/ ##
965function ogHidePartition ()
966{
967# Variables locales.
968local PART TYPE NEWTYPE
969# Si se solicita, mostrar ayuda.
970if [ "$*" == "help" ]; then
971    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
972           "$FUNCNAME 1 1"
973    return
974fi
975# Error si no se reciben 2 parámetros.
976[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
977PART=$(ogDiskToDev "$1" "$2") || return $?
978
979# Obtener tipo de partición.
980TYPE=$(ogGetPartitionType "$1" "$2")
981case "$TYPE" in
982    NTFS)   NEWTYPE="HNTFS"  ;;
983    FAT32)  NEWTYPE="HFAT32" ;;
984    FAT16)  NEWTYPE="HFAT16" ;;
985    FAT12)  NEWTYPE="HFAT12" ;;
986    *)      ogRaiseError $OG_ERR_PARTITION "$TYPE"
987            return $? ;;
988esac
989# Cambiar tipo de partición.
990ogSetPartitionType $1 $2 $NEWTYPE
991}
992
993
994#/**
995#         ogIdToType int_idpart
996#@brief   Devuelve el identificador correspondiente a un tipo de partición.
997#@param   int_idpart    identificador de tipo de partición.
998#@return  str_parttype  mnemónico de tipo de partición.
999#@exception OG_ERR_FORMAT   Formato incorrecto.
1000#@version 1.0.5 - Primera version para OpenGnSys
1001#@author  Ramon Gomez, ETSII Universidad Sevilla
1002#@date    2013-02-07
1003#*/ ##
1004function ogIdToType ()
1005{
1006# Variables locales
1007local ID TYPE
1008
1009# Si se solicita, mostrar ayuda.
1010if [ "$*" == "help" ]; then
1011    ogHelp "$FUNCNAME" "$FUNCNAME int_idpart" \
1012           "$FUNCNAME 83  =>  LINUX"
1013    return
1014fi
1015# Error si no se recibe 1 parámetro.
1016[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
1017
1018# Obtener valor hexadecimal de 4 caracteres rellenado con 0 por delante.
1019ID=$(printf "%4s" "$1" | tr ' ' '0')
1020case "${ID,,}" in
1021     0000)      TYPE="EMPTY" ;;
1022     0001)      TYPE="FAT12" ;;
1023     0005|000f) TYPE="EXTENDED" ;;
1024     0006|000e) TYPE="FAT16" ;;
1025     0007)      TYPE="NTFS" ;;
1026     000b|000c) TYPE="FAT32" ;;
1027     0011)      TYPE="HFAT12" ;;
1028     0012)      TYPE="COMPAQDIAG" ;;
1029     0016|001e) TYPE="HFAT16" ;;
1030     0017)      TYPE="HNTFS" ;;
1031     001b|001c) TYPE="HFAT32" ;;
1032     0042)      TYPE="WIN-DYNAMIC" ;;
1033     0082|8200) TYPE="LINUX-SWAP" ;;
1034     0083|8300) TYPE="LINUX" ;;
1035     008e|8E00) TYPE="LINUX-LVM" ;;
1036     00a5|a503) TYPE="FREEBSD" ;;
1037     00a6)      TYPE="OPENBSD" ;;
1038     00a7)      TYPE="CACHE" ;;         # (compatibilidad con Brutalix)
1039     00af|af00) TYPE="HFS" ;;
1040     00be|be00) TYPE="SOLARIS-BOOT" ;;
1041     00bf|bf0[0145]) TYPE="SOLARIS" ;;
1042     00ca|ca00) TYPE="CACHE" ;;
1043     00da)      TYPE="DATA" ;;
1044     00ee)      TYPE="GPT" ;;
1045     00ef|ef00) TYPE="EFI" ;;
1046     00fb)      TYPE="VMFS" ;;
1047     00fd|fd00) TYPE="LINUX-RAID" ;;
1048     0700)      TYPE="WINDOWS" ;;
1049     0c01)      TYPE="WIN-RESERV" ;;
1050     7f00)      TYPE="CHROMEOS-KRN" ;;
1051     7f01)      TYPE="CHROMEOS" ;;
1052     7f02)      TYPE="CHROMEOS-RESERV" ;;
1053     8301)      TYPE="LINUX-RESERV" ;;
1054     a500)      TYPE="FREEBSD-DISK" ;;
1055     a501)      TYPE="FREEBSD-BOOT" ;;
1056     a502)      TYPE="FREEBSD-SWAP" ;;
1057     ab00)      TYPE="HFS-BOOT" ;;
1058     af01)      TYPE="HFS-RAID" ;;
1059     bf02)      TYPE="SOLARIS-SWAP" ;;
1060     bf03)      TYPE="SOLARIS-DISK" ;;
1061     ef01)      TYPE="MBR" ;;
1062     ef02)      TYPE="BIOS-BOOT" ;;
1063     *)         TYPE="UNKNOWN" ;;
1064esac
1065echo "$TYPE"
1066}
1067
1068
1069#         ogIsDiskLocked int_ndisk
1070#@brief   Comprueba si un disco está bloqueado por una operación de uso exclusivo.
1071#@param   int_ndisk      nº de orden del disco
1072#@return  Código de salida: 0 - bloqueado, 1 - sin bloquear o error.
1073#@note    Los ficheros de bloqueo se localizan en \c /var/lock/dev, siendo \c dev el dispositivo de la partición o de su disco, sustituyendo el carácter "/" por "-".
1074#@version 1.1.0 - Primera versión para OpenGnSys.
1075#@author  Ramon Gomez, ETSII Universidad de Sevilla
1076#@date    2016-04-08
1077#*/ ##
1078function ogIsDiskLocked ()
1079{
1080# Variables locales
1081local DISK LOCKFILE
1082
1083# Si se solicita, mostrar ayuda.
1084if [ "$*" == "help" ]; then
1085    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" \
1086           "if $FUNCNAME 1; then ... ; fi"
1087    return
1088fi
1089# Falso, en caso de error.
1090[ $# == 1 ] || return 1
1091DISK="$(ogDiskToDev $1 2>/dev/null)" || return 1
1092
1093# Comprobar existencia de fichero de bloqueo para el disco.
1094LOCKFILE="/var/lock/lock${DISK//\//-}"
1095test -f $LOCKFILE
1096}
1097
1098
1099#/**
1100#         ogListPartitions int_ndisk
1101#@brief   Lista las particiones definidas en un disco.
1102#@param   int_ndisk  nº de orden del disco
1103#@return  str_parttype:int_partsize ...
1104#@exception OG_ERR_FORMAT   formato incorrecto.
1105#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
1106#@note    Requisitos: \c parted \c awk
1107#@attention El nº de partición se indica por el orden de los párametros \c parttype:partsize
1108#@attention Las tuplas de valores están separadas por espacios.
1109#@version 0.9 - Primera versión para OpenGnSys
1110#@author  Ramon Gomez, ETSII Universidad de Sevilla
1111#@date    2009/07/24
1112#*/ ##
1113function ogListPartitions ()
1114{
1115# Variables locales.
1116local DISK PART NPARTS TYPE SIZE
1117
1118# Si se solicita, mostrar ayuda.
1119if [ "$*" == "help" ]; then
1120    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" \
1121           "$FUNCNAME 1  =>  NTFS:10000000 EXT3:5000000 LINUX-SWAP:1000000"
1122    return
1123fi
1124# Error si no se recibe 1 parámetro.
1125[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT "$FORMAT" || return $?
1126
1127# Procesar la salida de \c parted .
1128DISK="$(ogDiskToDev $1)" || return $?
1129NPARTS=$(ogGetPartitionsNumber $1)
1130for (( PART = 1; PART <= NPARTS; PART++ )); do
1131    TYPE=$(ogGetPartitionType $1 $PART 2>/dev/null)
1132    if [ $? -eq 0 ]; then
1133        SIZE=$(ogGetPartitionSize $1 $PART 2>/dev/null)
1134        echo -n "$TYPE:$SIZE "
1135    else
1136        echo -n "EMPTY:0 "
1137    fi
1138done
1139echo
1140}
1141
1142
1143#/**
1144#         ogListPrimaryPartitions int_ndisk
1145#@brief   Metafunción que lista las particiones primarias no vacías de un disco.
1146#@param   int_ndisk  nº de orden del disco
1147#@see     ogListPartitions
1148#*/ ##
1149function ogListPrimaryPartitions ()
1150{
1151# Variables locales.
1152local PTTYPE PARTS
1153
1154PTTYPE=$(ogGetPartitionTableType $1) || return $?
1155PARTS=$(ogListPartitions "$@") || return $?
1156case "$PTTYPE" in
1157    GPT)    echo $PARTS | sed 's/\( EMPTY:0\)*$//' ;;
1158    MSDOS)  echo $PARTS | cut -sf1-4 -d" " | sed 's/\( EMPTY:0\)*$//' ;;
1159esac
1160}
1161
1162
1163#/**
1164#         ogListLogicalPartitions int_ndisk
1165#@brief   Metafunción que lista las particiones lógicas de una tabla tipo MSDOS.
1166#@param   int_ndisk  nº de orden del disco
1167#@see     ogListPartitions
1168#*/ ##
1169function ogListLogicalPartitions ()
1170{
1171# Variables locales.
1172local PTTYPE PARTS
1173
1174PTTYPE=$(ogGetPartitionTableType $1) || return $?
1175[ "$PTTYPE" == "MSDOS" ] || ogRaiseError $OG_ERR_PARTITION "" || return $?
1176PARTS=$(ogListPartitions "$@") || return $?
1177echo $PARTS | cut -sf5- -d" "
1178}
1179
1180
1181#/**
1182#         ogLockDisk int_ndisk
1183#@brief   Genera un fichero de bloqueo para un disco en uso exlusivo.
1184#@param   int_ndisk      nº de orden del disco
1185#@return  (nada)
1186#@exception OG_ERR_FORMAT    Formato incorrecto.
1187#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
1188#@note    El fichero de bloqueo se localiza en \c /var/lock/disk, siendo \c disk el dispositivo del disco, sustituyendo el carácter "/" por "-".
1189#@version 1.1.0 - Primera versión para OpenGnSys.
1190#@author  Ramon Gomez, ETSII Universidad de Sevilla
1191#@date    2016-04-07
1192#*/ ##
1193function ogLockDisk ()
1194{
1195# Variables locales
1196local DISK LOCKFILE
1197
1198# Si se solicita, mostrar ayuda.
1199if [ "$*" == "help" ]; then
1200    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" \
1201           "$FUNCNAME 1"
1202    return
1203fi
1204# Error si no se recibe 1 parámetro.
1205[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
1206
1207# Obtener partición.
1208DISK="$(ogDiskToDev $1)" || return $?
1209
1210# Crear archivo de bloqueo exclusivo.
1211LOCKFILE="/var/lock/lock${DISK//\//-}"
1212touch $LOCKFILE
1213}
1214
1215
1216#/**
1217#         ogSetPartitionActive int_ndisk int_npartition
1218#@brief   Establece cual es la partición activa de un disco.
1219#@param   int_ndisk      nº de orden del disco
1220#@param   int_npartition nº de orden de la partición
1221#@return  (nada).
1222#@exception OG_ERR_FORMAT   Formato incorrecto.
1223#@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositivo.
1224#@note    Requisitos: parted
1225#@version 0.1 -  Integracion para Opengnsys  -  EAC: SetPartitionActive() en ATA.lib
1226#@author  Antonio J. Doblas Viso, Universidad de Malaga
1227#@date    2008/10/27
1228#@version 0.9 - Primera version compatible con OpenGnSys.
1229#@author  Ramon Gomez, ETSII Universidad de Sevilla
1230#@date    2009/09/17
1231#*/ ##
1232function ogSetPartitionActive ()
1233{
1234# Variables locales
1235local DISK PART
1236
1237# Si se solicita, mostrar ayuda.
1238if [ "$*" == "help" ]; then
1239    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
1240           "$FUNCNAME 1 1"
1241    return
1242fi
1243# Error si no se reciben 2 parámetros.
1244[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
1245
1246# Comprobar que el disco existe y activar la partición indicada.
1247DISK="$(ogDiskToDev $1)" || return $?
1248PART="$(ogDiskToDev $1 $2)" || return $?
1249parted -s $DISK set $2 boot on 2>/dev/null
1250}
1251
1252
1253#/**
1254#         ogSetPartitionId int_ndisk int_npartition hex_partid
1255#@brief   Cambia el identificador de la partición.
1256#@param   int_ndisk      nº de orden del disco
1257#@param   int_npartition nº de orden de la partición
1258#@param   hex_partid     identificador de tipo de partición
1259#@return  (nada)
1260#@exception OG_ERR_FORMAT     Formato incorrecto.
1261#@exception OG_ERR_NOTFOUND   Disco o partición no corresponden con un dispositivo.
1262#@exception OG_ERR_OUTOFLIMIT Valor no válido.
1263#@exception OG_ERR_PARTITION  Error al cambiar el id. de partición.
1264#@attention Requisitos: fdisk, sgdisk
1265#@version 0.1 -  Integracion para Opengnsys  - SetPartitionType() en ATA.lib
1266#@author  Antonio J. Doblas Viso. Universidad de Malaga
1267#@date    2008/10/27
1268#@version 1.0.4 - Soporte para discos GPT.
1269#@author  Universidad de Huelva
1270#@date    2012/03/13
1271#@version 1.0.5 - Utiliza el id. de tipo de partición (no el mnemónico)
1272#@author  Universidad de Huelva
1273#@date    2012/05/14
1274#*/ ##
1275function ogSetPartitionId ()
1276{
1277# Variables locales
1278local DISK PART PTTYPE ID
1279
1280# Si se solicita, mostrar ayuda.
1281if [ "$*" == "help" ]; then
1282    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition hex_partid" \
1283           "$FUNCNAME 1 1 7"
1284    return
1285fi
1286# Error si no se reciben 3 parámetros.
1287[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
1288
1289# Sustituye nº de disco y nº partición por su dispositivo.
1290DISK=$(ogDiskToDev $1) || return $?
1291PART=$(ogDiskToDev $1 $2) || return $?
1292# Error si el id. de partición no es hexadecimal.
1293ID="${3^^}"
1294[[ "$ID" =~ ^[0-9A-F]+$ ]] || ogRaiseError $OG_ERR_OUTOFLIMIT "$3" || return $?
1295
1296# Elección del tipo de partición.
1297PTTYPE=$(ogGetPartitionTableType $1)
1298case "$PTTYPE" in
1299    GPT)    sgdisk -t$2:$ID $DISK 2>/dev/null ;;
1300    MSDOS)  echo -ne "t\n$2\n${ID}\nw\n" | fdisk $DISK | grep Syncing &>/dev/null ;;
1301    *)      ogRaiseError $OG_ERR_OUTOFLIMIT "$1,$PTTYPE"
1302            return $? ;;
1303esac
1304
1305# MSDOS) Correcto si fdisk sin error o con error pero realiza Syncing
1306if [ "${PIPESTATUS[1]}" == "0" -o $? -eq 0 ]; then
1307    partprobe $DISK 2>/dev/null
1308    return 0
1309else
1310    ogRaiseError $OG_ERR_PARTITION "$1,$2,$3"
1311    return $?
1312fi
1313}
1314
1315
1316#/**
1317#         ogSetPartitionSize int_ndisk int_npartition int_size
1318#@brief   Muestra el tamano en KB de una particion determinada.
1319#@param   int_ndisk      nº de orden del disco
1320#@param   int_npartition nº de orden de la partición
1321#@param   int_size       tamaño de la partición (en KB)
1322#@return  (nada)
1323#@exception OG_ERR_FORMAT   formato incorrecto.
1324#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
1325#@note    Requisitos: sfdisk, awk
1326#@todo    Compruebar que el tamaño sea numérico positivo y evitar que pueda solaparse con la siguiente partición.
1327#@version 0.9 - Primera versión para OpenGnSys
1328#@author  Ramon Gomez, ETSII Universidad de Sevilla
1329#@date    2009/07/24
1330#*/ ##
1331function ogSetPartitionSize ()
1332{
1333# Variables locales.
1334local DISK PART SIZE
1335
1336# Si se solicita, mostrar ayuda.
1337if [ "$*" == "help" ]; then
1338    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition int_size" \
1339           "$FUNCNAME 1 1 10000000"
1340    return
1341fi
1342# Error si no se reciben 3 parámetros.
1343[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
1344
1345# Obtener el tamaño de la partición.
1346DISK="$(ogDiskToDev $1)" || return $?
1347PART="$(ogDiskToDev $1 $2)" || return $?
1348# Convertir tamaño en KB a sectores de 512 B.
1349SIZE=$[$3*2] || ogRaiseError $OG_ERR_FORMAT || return $?
1350# Redefinir el tamaño de la partición.
1351sfdisk -f -uS -N$2 $DISK <<< ",$SIZE" &>/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
1352partprobe $DISK 2>/dev/null
1353}
1354
1355
1356#/**
1357#         ogSetPartitionType int_ndisk int_npartition str_type
1358#@brief   Cambia el identificador de la partición.
1359#@param   int_ndisk      nº de orden del disco
1360#@param   int_npartition nº de orden de la partición
1361#@param   str_type       mnemónico de tipo de partición
1362#@return  (nada)
1363#@attention Requisitos: fdisk, sgdisk
1364#@version 0.1 -  Integracion para Opengnsys  - SetPartitionType() en ATA.lib
1365#@author  Antonio J. Doblas Viso. Universidad de Malaga
1366#@date    2008/10/27
1367#@version 1.0.4 - Soporte para discos GPT.
1368#@author  Universidad de Huelva
1369#@date    2012/03/13
1370#@version 1.0.5 - Renombrada de ogSetPartitionId.
1371#@author  Ramon Gomez, ETSII Universidad de Sevilla
1372#@date    2013/03/07
1373#*/ ##
1374function ogSetPartitionType ()
1375{
1376# Variables locales
1377local DISK PART PTTYPE ID
1378
1379# Si se solicita, mostrar ayuda.
1380if [ "$*" == "help" ]; then
1381    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition str_type" \
1382           "$FUNCNAME 1 1 NTFS"
1383    return
1384fi
1385# Error si no se reciben 3 parámetros.
1386[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
1387
1388# Sustituye nº de disco por su dispositivo.
1389DISK=`ogDiskToDev $1` || return $?
1390PART=`ogDiskToDev $1 $2` || return $?
1391
1392# Elección del tipo de partición.
1393PTTYPE=$(ogGetPartitionTableType $1)
1394ID=$(ogTypeToId "$3" "$PTTYPE")
1395[ -n "$ID" ] || ogRaiseError $OG_ERR_FORMAT "$3,$PTTYPE" || return $?
1396ogSetPartitionId $1 $2 $ID
1397}
1398
1399
1400#/**
1401#         ogTypeToId str_parttype [str_tabletype]
1402#@brief   Devuelve el identificador correspondiente a un tipo de partición.
1403#@param   str_parttype  mnemónico de tipo de partición.
1404#@param   str_tabletype mnemónico de tipo de tabla de particiones (MSDOS por defecto).
1405#@return  int_idpart    identificador de tipo de partición.
1406#@exception OG_ERR_FORMAT   Formato incorrecto.
1407#@note    tabletype = { MSDOS, GPT },   (MSDOS, por defecto)
1408#@version 0.1 -  Integracion para Opengnsys  -  EAC: TypeFS () en ATA.lib
1409#@author  Antonio J. Doblas Viso, Universidad de Malaga
1410#@date    2008/10/27
1411#@version 0.9 - Primera version para OpenGnSys
1412#@author  Ramon Gomez, ETSII Universidad Sevilla
1413#@date    2009-12-14
1414#@version 1.0.4 - Soportar discos GPT (sustituye a ogFsToId).
1415#@author  Universidad de Huelva
1416#@date    2012/03/30
1417#*/ ##
1418function ogTypeToId ()
1419{
1420# Variables locales
1421local PTTYPE ID
1422
1423# Si se solicita, mostrar ayuda.
1424if [ "$*" == "help" ]; then
1425    ogHelp "$FUNCNAME" "$FUNCNAME str_parttype [str_tabletype]" \
1426           "$FUNCNAME LINUX  =>  83" \
1427           "$FUNCNAME LINUX MSDOS  =>  83"
1428    return
1429fi
1430# Error si no se reciben 1 o 2 parámetros.
1431[ $# -lt 1 -o $# -gt 2 ] && (ogRaiseError $OG_ERR_FORMAT; return $?)
1432
1433# Asociar id. de partición para su mnemónico.
1434PTTYPE=${2:-"MSDOS"}
1435case "$PTTYPE" in
1436    GPT) # Se incluyen mnemónicos compatibles con tablas MSDOS.
1437        case "$1" in
1438            EMPTY)      ID=0 ;;
1439            WINDOWS|NTFS|EXFAT|FAT32|FAT16|FAT12|HNTFS|HFAT32|HFAT16|HFAT12)
1440                        ID=0700 ;;
1441            WIN-RESERV) ID=0C01 ;;
1442            CHROMEOS-KRN) ID=7F00 ;;
1443            CHROMEOS)   ID=7F01 ;;
1444            CHROMEOS-RESERV) ID=7F02 ;;
1445            LINUX-SWAP) ID=8200 ;;
1446            LINUX|EXT[234]|REISERFS|REISER4|XFS|JFS)
1447                        ID=8300 ;;
1448            LINUX-RESERV) ID=8301 ;;
1449            LINUX-LVM)  ID=8E00 ;;
1450            FREEBSD-DISK) ID=A500 ;;
1451            FREEBSD-BOOT) ID=A501 ;;
1452            FREEBSD-SWAP) ID=A502 ;;
1453            FREEBSD)    ID=A503 ;;
1454            HFS-BOOT)   ID=AB00 ;;
1455            HFS|HFS+)   ID=AF00 ;;
1456            HFSPLUS)    ID=AF00 ;;
1457            HFS-RAID)   ID=AF01 ;;
1458            SOLARIS-BOOT) ID=BE00 ;;
1459            SOLARIS)    ID=BF00 ;;
1460            SOLARIS-SWAP) ID=BF02 ;;
1461            SOLARIS-DISK) ID=BF03 ;;
1462            CACHE)      ID=CA00;;
1463            EFI)        ID=EF00 ;;
1464            LINUX-RAID) ID=FD00 ;;
1465            *)          ID="" ;;
1466        esac
1467        ;;
1468    MSDOS)
1469        case "$1" in
1470            EMPTY)      ID=0  ;;
1471            FAT12)      ID=1  ;;
1472            EXTENDED)   ID=5  ;;
1473            FAT16)      ID=6  ;;
1474            WINDOWS|NTFS|EXFAT)
1475                        ID=7  ;;
1476            FAT32)      ID=b  ;;
1477            HFAT12)     ID=11 ;;
1478            HFAT16)     ID=16 ;;
1479            HNTFS)      ID=17 ;;
1480            HFAT32)     ID=1b ;;
1481            LINUX-SWAP) ID=82 ;;
1482            LINUX|EXT[234]|REISERFS|REISER4|XFS|JFS)
1483                        ID=83 ;;
1484            LINUX-LVM)  ID=8e ;;
1485            FREEBSD)    ID=a5 ;;
1486            OPENBSD)    ID=a6 ;;
1487            HFS|HFS+)   ID=af ;;
1488            SOLARIS-BOOT) ID=be ;;
1489            SOLARIS)    ID=bf ;;
1490            CACHE)      ID=ca ;;
1491            DATA)       ID=da ;;
1492            GPT)        ID=ee ;;
1493            EFI)        ID=ef ;;
1494            VMFS)       ID=fb ;;
1495            LINUX-RAID) ID=fd ;;
1496            *)          ID="" ;;
1497        esac
1498        ;;
1499esac
1500echo $ID
1501}
1502
1503
1504#/**
1505#         ogUnhidePartition int_ndisk int_npartition
1506#@brief   Hace visible una partición oculta.
1507#@param   int_ndisk      nº de orden del disco
1508#@param   int_npartition nº de orden de la partición
1509#@return  (nada)
1510#@exception OG_ERR_FORMAT    formato incorrecto.
1511#@exception OG_ERR_NOTFOUND  disco o particion no detectado (no es un dispositivo).
1512#@exception OG_ERR_PARTITION tipo de partición no reconocido.
1513#@version 1.0 - Versión en pruebas.
1514#@author  Ramon Gomez, ETSII Universidad de Sevilla
1515#@date    2010/01/12
1516#*/ ##
1517function ogUnhidePartition ()
1518{
1519# Variables locales.
1520local PART TYPE NEWTYPE
1521# Si se solicita, mostrar ayuda.
1522if [ "$*" == "help" ]; then
1523    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
1524           "$FUNCNAME 1 1"
1525    return
1526fi
1527# Error si no se reciben 2 parámetros.
1528[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
1529PART=$(ogDiskToDev "$1" "$2") || return $?
1530
1531# Obtener tipo de partición.
1532TYPE=$(ogGetPartitionType "$1" "$2")
1533case "$TYPE" in
1534    HNTFS)   NEWTYPE="NTFS"  ;;
1535    HFAT32)  NEWTYPE="FAT32" ;;
1536    HFAT16)  NEWTYPE="FAT16" ;;
1537    HFAT12)  NEWTYPE="FAT12" ;;
1538    *)      ogRaiseError $OG_ERR_PARTITION "$TYPE"
1539            return $? ;;
1540esac
1541# Cambiar tipo de partición.
1542ogSetPartitionType $1 $2 $NEWTYPE
1543}
1544
1545
1546#/**
1547#         ogUnlockDisk int_ndisk
1548#@brief   Elimina el fichero de bloqueo para un disco.
1549#@param   int_ndisk      nº de orden del disco
1550#@return  (nada)
1551#@exception OG_ERR_FORMAT    Formato incorrecto.
1552#@exception OG_ERR_NOTFOUND  Disco o particion no corresponden con un dispositivo.
1553#@note    El fichero de bloqueo se localiza en \c /var/lock/disk, siendo \c disk el dispositivo del disco, sustituyendo el carácter "/" por "-".
1554#@version 1.1.0 - Primera versión para OpenGnSys.
1555#@author  Ramon Gomez, ETSII Universidad de Sevilla
1556#@date    2016-04-08
1557#*/ ##
1558function ogUnlockDisk ()
1559{
1560# Variables locales
1561local DISK LOCKFILE
1562
1563# Si se solicita, mostrar ayuda.
1564if [ "$*" == "help" ]; then
1565    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" \
1566           "$FUNCNAME 1"
1567    return
1568fi
1569# Error si no se recibe 1 parámetro.
1570[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
1571
1572# Obtener partición.
1573DISK="$(ogDiskToDev $1)" || return $?
1574
1575# Borrar archivo de bloqueo exclusivo.
1576LOCKFILE="/var/lock/lock${DISK//\//-}"
1577rm -f $LOCKFILE
1578}
1579
1580
1581#/**
1582#         ogUpdatePartitionTable
1583#@brief   Fuerza al kernel releer la tabla de particiones de los discos duros
1584#@param   no requiere
1585#@return  informacion propia de la herramienta
1586#@note    Requisitos: \c partprobe
1587#@warning pendiente estructurar la funcion a opengnsys
1588#@version 0.1 -  Integracion para Opengnsys  -  EAC: UpdatePartitionTable() en ATA.lib
1589#@author  Antonio J. Doblas Viso. Universidad de Malaga
1590#@date    27/10/2008
1591#*/ ##
1592function ogUpdatePartitionTable ()
1593{
1594local i
1595for i in `ogDiskToDev`
1596do
1597        partprobe $i
1598done
1599}
Note: See TracBrowser for help on using the repository browser.