source: client/engine/Disk.lib @ d8f592d

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

#714 Se corrige falso error: ogCreatePartitions salía con error si no había cache, afectando a 'Crear y Formatear' de la consola que se salía sin formatear las particiones.

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

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