source: client/engine/Disk.lib @ e8d646c

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 e8d646c was 858b1b0, checked in by ramon <ramongomez@…>, 9 years ago

#744: Nueva función ogIsDiskLocked; renombrada función ogIsLocked como ogIsPartitionLocked, manteniendo alias con nombre antiguo y adaptándola para comprobar también bloqueo de su disco.

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

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