source: client/engine/Disk.lib.testing @ c175a93

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

Versión 1.0.2: función ogDiskToDev usa información creada con ogGenerateDiskInfo (modifica #141 y #397)

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

  • Property mode set to 100755
File size: 32.4 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.0.2
8#@warning License: GNU GPLv3+
9#*/
10
11
12#/**
13#         ogCreatePartitions int_ndisk str_parttype:int_partsize ...
14#@brief   Define el conjunto de particiones de un disco.
15#@param   int_ndisk      nº de orden del disco
16#@param   str_parttype   mnemónico del tipo de partición
17#@param   int_partsize   tamaño de la partición (en KB)
18#@return  (nada, por determinar)
19#@exception OG_ERR_FORMAT   formato incorrecto.
20#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
21#@attention El nº de partición se indica por el orden de los párametros \c parttype:partsize
22#@attention Pueden definirse particiones vacías de tipo \c EMPTY
23#@attention No puede definirse partición de cache y no se modifica si existe.
24#@note    Requisitos: sfdisk, parted, partprobe, awk
25#@todo    Definir atributos (arranque, oculta) y tamaños en MB, GB, etc.
26#@version 0.9 - Primera versión para OpenGnSys
27#@author  Ramon Gomez, ETSII Universidad de Sevilla
28#@date    2009/09/09
29#@version 0.9.1 - Corrección del redondeo del tamaño del disco.
30#@author  Ramon Gomez, ETSII Universidad de Sevilla
31#@date    2010/03/09
32#*/ ##
33function ogCreatePartitions ()
34{
35# Variables locales.
36local ND DISK PART SECTORS CYLS START SIZE TYPE CACHEPART CACHESIZE EXTSTART EXTSIZE tmpsfdisk
37# Si se solicita, mostrar ayuda.
38if [ "$*" == "help" ]; then
39    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk str_parttype:int_partsize ..." \
40           "$FUNCNAME 1 NTFS:10000000 EXT3:5000000 LINUX-SWAP:1000000"
41    return
42fi
43# Error si no se reciben menos de 2 parámetros.
44[ $# -ge 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
45
46# Nº total de sectores, para evitar desbordamiento (evitar redondeo).
47ND="$1"
48DISK=$(ogDiskToDev "$ND") || return $?
49SECTORS=$(awk -v D=${DISK#/dev/} '{if ($4==D) {print $3*2}}' /proc/partitions)
50CYLS=$(sfdisk -g $DISK | cut -f2 -d" ")
51SECTORS=$[SECTORS/CYLS*CYLS-1]
52# Se recalcula el nº de sectores del disco 1, si existe partición de caché.
53CACHEPART=$(ogFindCache 2>/dev/null)
54[ "$ND" = "${CACHEPART% *}" ] && CACHESIZE=$(ogGetCacheSize 2>/dev/null | awk '{print $0*2}')
55[ -n "$CACHESIZE" ] && SECTORS=$[SECTORS-CACHESIZE]
56ENDPART3=$(sfdisk -uS -l $DISK | awk -v P="${DISK}3" '{if ($1==P) print $3}')
57# Sector de inicio (la partición 1 empieza en el sector 63).
58START=63
59PART=1
60
61# Fichero temporal de entrada para "sfdisk"
62tmpsfdisk=/tmp/sfdisk$$
63trap "rm -f $tmpsfdisk" 1 2 3 9 15
64
65echo "unit: sectors" >$tmpsfdisk
66echo                >>$tmpsfdisk
67
68# Generar fichero de entrada para "sfdisk" con las particiones.
69shift
70while [ $# -gt 0 ]; do
71    # Conservar los datos de la partición de caché.
72    if [ "$ND $PART" == "$CACHEPART" -a -n "$CACHESIZE" ]; then
73        echo "$DISK$PART : start=$[SECTORS+1], size=$CACHESIZE, Id=ca" >>$tmpsfdisk
74        PART=$[PART+1]
75    fi
76    # Leer formato de cada parámetro - Tipo:Tamaño
77    TYPE="${1%%:*}"
78    SIZE="${1#*:}"
79    # Obtener identificador de tipo de partición válido.
80    ID=$(ogFsToId "$TYPE")
81    [ "$TYPE" != "CACHE" -a -n "$ID" ] || ogRaiseError $OG_ERR_PARTITION "$TYPE" || return $?
82    # Comprobar tamaño numérico y convertir en sectores de 512 B.
83    [[ "$SIZE" == *([0-9]) ]] || ogRaiseError $OG_ERR_FORMAT "$SIZE" || return $?
84    SIZE=$[SIZE*2]
85    # Comprobar si la partición es extendida.
86    if [ $ID = 5 ]; then
87        [ $PART -gt 4 ] && ogRaiseError $OG_ERR_FORMAT && return $?
88        EXTSTART=$START
89        EXTSIZE=$SIZE
90    fi
91    # Incluir particiones lógicas dentro de la partición extendida.
92    if [ $PART = 5 ]; then
93        [ -z "$EXTSTART" ] && ogRaiseError $OG_ERR_FORMAT && return $?
94        START=$EXTSTART
95        SECTORS=$[EXTSTART+EXTSIZE]
96    fi
97    # Generar datos para la partición.
98    echo "$DISK$PART : start=$START, size=$SIZE, Id=$ID" >>$tmpsfdisk
99    # Error si se supera el nº total de sectores.
100    START=$[START+SIZE]
101    [ $START -le $SECTORS ] || ogRaiseError $OG_ERR_FORMAT "$[START/2] > $[SECTORS/2]" || return $?
102    PART=$[PART+1]
103    shift
104done
105# Si no se indican las 4 particiones primarias, definirlas como vacías, conservando la partición de caché.
106while [ $PART -le 4 ]; do
107    if [ "$ND $PART" == "$CACHEPART" -a -n "$CACHESIZE" ]; then
108        echo "$DISK$PART : start=$[SECTORS+1], size=$CACHESIZE, Id=ca" >>$tmpsfdisk
109    else
110        echo "$DISK$PART : start=0, size=0, Id=0" >>$tmpsfdisk
111    fi
112    PART=$[PART+1]
113done
114# Si se define partición extendida sin lógicas, crear particion 5 vacía.
115if [ $PART = 5 -a -n "$EXTSTART" ]; then
116    echo "${DISK}5 : start=$EXTSTART, size=$EXTSIZE, Id=0" >>$tmpsfdisk
117fi
118
119# Desmontar los sistemas de archivos del disco antes de realizar las operaciones.
120ogUnmountAll $ND 2>/dev/null
121[ -n "$CACHESIZE" ] && ogUnmountCache 2>/dev/null
122
123# Si la tabla de particiones no es valida, volver a generarla.
124[ $(parted -s $DISK print >/dev/null) ] || fdisk $DISK <<< "w"
125# Definir particiones y notificar al kernel.
126sfdisk -f $DISK < $tmpsfdisk 2>/dev/null && partprobe $DISK
127rm -f $tmpsfdisk
128[ -n "$CACHESIZE" ] && ogMountCache 2>/dev/null
129}
130
131
132#/**
133#         ogDevToDisk path_device
134#@brief   Devuelve el nº de orden de dicso (y partición) correspondiente al nombre de fichero de dispositivo.
135#@param   path_device Camino del fichero de dispositivo.
136#@return  int_ndisk (para dispositivo de disco)
137#@return  int_ndisk int_npartition (para dispositivo de partición).
138#@exception OG_ERR_FORMAT   Formato incorrecto.
139#@exception OG_ERR_NOTFOUND Dispositivo no detectado.
140#@note    Requisitos: awk
141#@version 0.1 -  Integracion para Opengnsys  -  EAC: DiskEAC() en ATA.lib
142#@author  Antonio J. Doblas Viso, Universidad de Malaga
143#@date    2008/10/27
144#@version 0.9 - Primera version para OpenGnSys
145#@author  Ramon Gomez, ETSII Universidad Sevilla
146#@date    2009/07/20
147#*/ ##
148function ogDevToDisk ()
149{
150# Variables locales.
151local d n
152# Si se solicita, mostrar ayuda.
153if [ "$*" == "help" ]; then
154    ogHelp "$FUNCNAME" "$FUNCNAME path_device" \
155           "$FUNCNAME /dev/sda  =>  1 1"
156    return
157fi
158
159# Error si no se recibe 1 parámetro.
160[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
161# Error si no es fichero de bloques.
162[ -b "$1" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $?
163
164# Procesa todos los discos para devolver su nº de orden y de partición.
165n=1
166for d in $(ogDiskToDev); do
167    [ -n "$(echo $1 | grep $d)" ] && echo "$n ${1#$d}" && return
168    n=$[n+1]
169done
170ogRaiseError $OG_ERR_NOTFOUND "$1"
171return $OG_ERR_NOTFOUND
172}
173
174
175#/**
176#         ogDiskToDev [int_ndisk [int_npartition]]
177#@brief   Devuelve la equivalencia entre el nº de orden del dispositivo (dicso o partición) y el nombre de fichero de dispositivo correspondiente.
178#@param   int_ndisk      nº de orden del disco
179#@param   int_npartition nº de orden de la partición
180#@return  Para 0 parametros: Devuelve los nombres de ficheros  de los dispositivos sata/ata/usb linux encontrados.
181#@return  Para 1 parametros: Devuelve la ruta del disco duro indicado.
182#@return  Para 2 parametros: Devuelve la ruta de la particion indicada.
183#@exception OG_ERR_FORMAT   Formato incorrecto.
184#@exception OG_ERR_NOTFOUND Dispositivo no detectado.
185#@note    Requisitos: awk, lvm
186#@version 0.1 -  Integracion para Opengnsys  -  EAC: Disk() en ATA.lib;  HIDRA: DetectarDiscos.sh
187#@author  Ramon Gomez, ETSII Universidad de Sevilla
188#@Date    2008/06/19
189#@author  Antonio J. Doblas Viso, Universidad de Malaga
190#@date    2008/10/27
191#@version 0.9 - Primera version para OpenGnSys
192#@author  Ramon Gomez, ETSII Universidad Sevilla
193#@date    2009-07-20
194#@version 1.0.2 - Usar fichero de configuración de discos
195#@author  Ramon Gomez, ETSII Universidad Sevilla
196#@date    2011-06-17
197#*/ ##
198function ogDiskToDev ()
199{
200# Variables locales
201local ALLDISKS VOLGROUPS DISK PART
202
203# Si se solicita, mostrar ayuda.
204if [ "$*" == "help" ]; then
205    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk [int_npartition]" \
206           "$FUNCNAME      =>  /dev/sda /dev/sdb" \
207           "$FUNCNAME 1    =>  /dev/sda" \
208           "$FUNCNAME 1 1  =>  /dev/sda1"
209    return
210fi
211
212# Si cambia, generar info. de configuración de discos.
213if [ -z "$DISKSCONF" ] || ! diff -q <(cat /proc/partitions) /tmp/partitions 2>/dev/null; then
214    ogGenerateDiskInfo
215fi
216# Obtener lista de discos del fichero de configuración.
217ALLDISKS=$(cut -f2 -d" " $DISKSCONF)
218
219# Mostrar salidas segun el número de parametros.
220case $# in
221    0)  # Muestra todos los discos, separados por espacios.
222        echo $ALLDISKS
223        ;;
224    1)  # Error si el parámetro no es un digito.
225        [ -z "${1/[1-9]/}" ] || ogRaiseError $OG_ERR_FORMAT || return $?
226        DISK=$(echo "$ALLDISKS" | awk -v n=$1 '{print $n}')
227        # Error si el fichero no existe.
228        [ -e "$DISK" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $?
229        echo "$DISK"
230        ;;
231    2)  # Error si los 2 parámetros no son digitos.
232        [ -z "${1/[1-9]/}" -a -z "${2/[1-9]/}" ] || ogRaiseError $OG_ERR_FORMAT|| return $?
233        DISK=$(echo "$ALLDISKS" | awk -v n=$1 '{print $n}')
234        [ -e "$DISK" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $?
235        PART="$DISK$2"
236        # Comprobar si es partición.
237        if [ -b "$PART" ]; then
238            echo "$PART"
239        elif [ -n "$VOLGROUPS" ]; then
240            # Comprobar si volumen lógico.      /* (comentario Doxygen)
241            PART=$(lvscan -a 2>/dev/null | grep "'$DISK/" | awk -v n=$2 -F\' '{if (NR==n) print $2}')
242            [ -e "$PART" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2" || return $?
243            #                                   (comentario Doxygen) */
244            echo "$PART"
245        else
246            ogRaiseError $OG_ERR_NOTFOUND "$1 $2" || return $?
247        fi
248        ;;
249    *)  # Formato erroneo.
250        ogRaiseError $OG_ERR_FORMAT
251        return $OG_ERR_FORMAT
252        ;;
253esac
254}
255
256
257#/**
258#         ogGenerateDiskInfo
259#@brief   Crea fichero de información de configuración de disco.
260#@note    Fichero de configuración: /etc/disks.conf
261#@note    Requisitos: awk, lvm
262#@version 10.2 - Nueva función para OpenGnSys.
263#@author  Ramon Gomez, ETSII Universidad de Sevilla
264#@Date    2011/06/17
265#*/ ##
266function ogGenerateDiskInfo ()
267{
268# Variables locales
269local DEVS d i=1
270# Fichero de configuración de discos.
271DISKSCONF=/etc/disks.conf
272
273# Detectar metadispositivos.
274vgs -a --noheadings 2>/dev/null            # TODO dmraid, losetup
275# Crear copia del fichero de particiones.
276cp /proc/partitions /tmp/partitions
277# Ficheros de dispositivos de disco.
278DEVS=$(awk '$4!~/^(name|)$/ {if ($2%16==0) print "/dev/"$4}' /proc/partitions)
279# Generar fichero de configuración
280rm -f $DISKSCONF
281for d in $DEVS; do
282    case "$(ogGetDiskType $d)" in
283        DISK|RAID)
284            echo "$i $d" >>$DISKSCONF
285            let i++
286            ;;
287        *)  ;;
288    esac
289done
290}
291
292
293#/**
294#         ogGetDiskSize int_ndisk
295#@brief   Muestra el tamaño en KB de un disco.
296#@param   int_ndisk   nº de orden del disco
297#@return  int_size  - Tamaño en KB del disco.
298#@exception OG_ERR_FORMAT   formato incorrecto.
299#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
300#@note    Requisitos: sfdisk, awk
301#@version 0.9.2 - Primera version para OpenGnSys
302#@author  Ramon Gomez, ETSII Universidad de Sevilla
303#@date    2010/09/15
304#*/ ##
305function ogGetDiskSize ()
306{
307# Variables locales.
308local DISK
309
310# Si se solicita, mostrar ayuda.
311if [ "$*" == "help" ]; then
312    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" \ "$FUNCNAME 1  => 244198584"
313    return
314fi
315# Error si no se recibe 1 parámetro.
316[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
317
318# Obtener el tamaño de la partición.
319DISK="$(ogDiskToDev $1)" || return $?
320sfdisk -s $DISK
321}
322
323
324#/**
325#         ogGetDiskType path_device
326#@brief   Muestra el tipo de disco (real, RAID, meta-disco, etc.).
327#@warning Función en pruebas
328#*/ ##
329function ogGetDiskType ()
330{
331local DEV MAJOR TYPE
332
333# Obtener el driver del dispositivo de bloques.
334[ -b "$1" ] || ogRaiseError $OG_ERR_FORMAT || return $?
335DEV=${1#/dev/}
336MAJOR=$(awk -v D="$DEV" '{if ($4==D) print $1;}' /proc/partitions)
337TYPE=$(awk -v D=$MAJOR '/Block/ {bl=1} {if ($1==D&&bl) print toupper($2)}' /proc/devices)
338# Devolver mnemónico del driver de dispositivo.
339case "$TYPE" in
340    SD)            TYPE="DISK" ;;
341    SR|IDE*)       TYPE="CDROM" ;;         # FIXME Comprobar discos IDE.
342    MD|CCISS*)     TYPE="RAID" ;;
343    DEVICE-MAPPER) TYPE="MAPPER" ;;        # FIXME Comprobar LVM y RAID.
344esac
345echo $TYPE
346}
347
348
349#/**
350#         ogGetPartitionActive int_ndisk
351#@brief   Muestra que particion de un disco esta marcada como de activa.
352#@param   int_ndisk   nº de orden del disco
353#@return  int_npart   Nº de partición activa
354#@exception OG_ERR_FORMAT Formato incorrecto.
355#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
356#@note    Requisitos: parted
357#@todo    Queda definir formato para atributos (arranque, oculta, ...).
358#@version 0.9 - Primera version compatible con OpenGnSys.
359#@author  Ramon Gomez, ETSII Universidad de Sevilla
360#@date    2009/09/17
361#*/ ##
362function ogGetPartitionActive ()
363{
364# Variables locales
365local DISK
366
367# Si se solicita, mostrar ayuda.
368if [ "$*" == "help" ]; then
369    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" "$FUNCNAME 1  =>  1"
370    return
371fi
372# Error si no se recibe 1 parámetro.
373[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
374
375# Comprobar que el disco existe y listar su partición activa.
376DISK="$(ogDiskToDev $1)" || return $?
377parted $DISK print 2>/dev/null | awk '/boot/ {print $1}'
378}
379
380
381#/**
382#         ogGetPartitionId int_ndisk int_npartition
383#@brief   Devuelve el mnemonico con el tipo de sistema de archivos.
384#@param   int_ndisk      nº de orden del disco
385#@param   int_npartition nº de orden de la partición
386#@return  Identificador de tipo de partición.
387#@exception OG_ERR_FORMAT   Formato incorrecto.
388#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
389#@note    Requisitos: sfdisk
390#@version 0.9 - Primera versión compatible con OpenGnSys.
391#@author  Ramon Gomez, ETSII Universidad de Sevilla
392#@date    25/03/2009
393#*/ ##
394function ogGetPartitionId ()
395{
396# Variables locales.
397local DISK PART
398
399# Si se solicita, mostrar ayuda.
400if [ "$*" == "help" ]; then
401    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
402           "$FUNCNAME 1 1  =>  7"
403    return
404fi
405# Error si no se reciben 2 parámetros.
406[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
407
408# Detectar id. de tipo de particion y codificar al mnemonico.
409DISK=$(ogDiskToDev $1) || return $?
410PART=$(ogDiskToDev $1 $2) || return $?
411echo $(sfdisk --id $DISK $2 2>/dev/null)
412}
413
414
415#/**
416#         ogGetPartitionSize int_ndisk int_npartition
417#@brief   Muestra el tamano en KB de una particion determinada.
418#@param   int_ndisk      nº de orden del disco
419#@param   int_npartition nº de orden de la partición
420#@return  int_partsize - Tamaño en KB de la partición.
421#@exception OG_ERR_FORMAT   formato incorrecto.
422#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
423#@note    Requisitos: sfdisk, awk
424#@version 0.1 -  Integracion para Opengnsys  -  EAC: SizePartition () en ATA.lib
425#@author  Antonio J. Doblas Viso, Universidad de Malaga
426#@date    2008/10/27
427#@version 0.9 - Primera version para OpenGnSys
428#@author  Ramon Gomez, ETSII Universidad de Sevilla
429#@date    2009/07/24
430#*/ ##
431function ogGetPartitionSize ()
432{
433# Variables locales.
434local DISK PART
435
436# Si se solicita, mostrar ayuda.
437if [ "$*" == "help" ]; then
438    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
439           "$FUNCNAME 1 1  =>  10000000"
440    return
441fi
442# Error si no se reciben 2 parámetros.
443[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
444
445# Obtener el tamaño de la partición.
446DISK=$(ogDiskToDev "$1") || return $?
447PART=$(ogDiskToDev "$1" "$2") || return $?
448case "$(ogGetPartitionId $1 $2)" in
449    5|f)  # Procesar detección de tamaño de partición Extendida.
450          sfdisk -l $DISK 2>/dev/null | \
451                    awk -v p=$PART '{if ($1==p) {sub (/[^0-9]+/,"",$5); print $5} }'
452          ;;
453    *)    sfdisk -s $PART
454          ;;
455esac
456}
457
458
459#/**
460#         ogGetPartitionType int_ndisk int_npartition
461#@brief   Metafunción que Devuelve el mnemonico con el tipo de partición.
462#@see     ogGetPartitionId
463#*/ ##
464function ogGetPartitionType ()
465{
466ogIdToType $(ogGetPartitionId "$@") || return $?
467}
468
469
470#/**
471#         ogHidePartition int_ndisk int_npartition
472#@brief   Oculta un apartición visible.
473#@param   int_ndisk      nº de orden del disco
474#@param   int_npartition nº de orden de la partición
475#@return  (nada)
476#@exception OG_ERR_FORMAT    formato incorrecto.
477#@exception OG_ERR_NOTFOUND  disco o particion no detectado (no es un dispositivo).
478#@exception OG_ERR_PARTITION tipo de partición no reconocido.
479#@version 1.0 - Versión en pruebas.
480#@author  Ramon Gomez, ETSII Universidad de Sevilla
481#@date    2010/01/12
482#*/ ##
483function ogHidePartition ()
484{
485# Variables locales.
486local PART TYPE NEWTYPE
487# Si se solicita, mostrar ayuda.
488if [ "$*" == "help" ]; then
489    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
490           "$FUNCNAME 1 1"
491    return
492fi
493# Error si no se reciben 2 parámetros.
494[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
495PART=$(ogDiskToDev "$1" "$2") || return $?
496
497# Obtener tipo de partición.
498TYPE=$(ogGetPartitionType "$1" "$2")
499case "$TYPE" in
500    NTFS)   NEWTYPE="HNTFS"  ;;
501    FAT32)  NEWTYPE="HFAT32" ;;
502    FAT12)  NEWTYPE="HFAT12" ;;
503    FAT16)  NEWTYPE="HFAT16" ;;
504    *)      ogRaiseError $OG_ERR_PARTITION "$TYPE"
505            return $? ;;
506esac
507# Cambiar tipo de partición.
508ogSetPartitionType $1 $2 $NEWTYPE
509}
510
511
512#/**
513#         ogIdToType hex_partid
514#@brief   Devuelve el tipo correspondiente a un identificador de partición.
515#@param   hex_partid    mnemónico de tipo de sistema de archivos
516#@return  str_parttype  nº identificador de tipo de partición.
517#@exception OG_ERR_FORMAT   Formato incorrecto.
518#@version 1.0 - Relación inversa a la función ogTypeToId.
519#@author  Ramon Gomez, ETSII Universidad Sevilla
520#@date    2009-12-21
521#*/ ##
522function ogIdToType ()
523{
524# Variables locales
525local TYPE
526
527# Si se solicita, mostrar ayuda.
528if [ "$*" == "help" ]; then
529    ogHelp "$FUNCNAME" "$FUNCNAME hex_partid" "$FUNCNAME 83  =>  LINUX"
530    return
531fi
532# Error si no se recibe 1 parámetro.
533[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
534
535# Asociar id. de partición para su mnemónico de sistema de archivos.
536case "$1" in
537    0|00)   TYPE="EMPTY" ;;
538    1|01)   TYPE="FAT12" ;;
539    5|05)   TYPE="EXTENDED"  ;;
540    6|06)   TYPE="FAT16"  ;;
541    7|07)   TYPE="NTFS"  ;;
542    b|0b)   TYPE="FAT32"  ;;
543    11)     TYPE="HFAT12" ;;
544    12)     TYPE="COMPAQDIAG" ;;
545    16)     TYPE="HFAT16"  ;;
546    17)     TYPE="HNTFS"  ;;
547    1b)     TYPE="HFAT32"  ;;
548    42)     TYPE="WIN-DYNAMIC"  ;;
549    82)     TYPE="LINUX-SWAP" ;;
550    83)     TYPE="LINUX"  ;;
551    8e)     TYPE="LINUX-LVM" ;;
552    a7)     TYPE="CACHE" ;;             # Retrocompatibilidad con Brutalix.
553    af)     TYPE="HFS" ;;
554    bf)     TYPE="SOLARIS" ;;
555    ca)     TYPE="CACHE" ;;
556    fd)     TYPE="LINUX-RAID" ;;
557    *)      TYPE="UNKNOWN" ;;
558esac
559echo $TYPE
560}
561
562
563#/**
564#         ogListPartitions int_ndisk
565#@brief   Lista las particiones definidas en un disco.
566#@param   int_ndisk  nº de orden del disco
567#@return  str_parttype:int_partsize ...
568#@exception OG_ERR_FORMAT   formato incorrecto.
569#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
570#@note    Requisitos: \c parted \c awk
571#@attention El nº de partición se indica por el orden de los párametros \c parttype:partsize
572#@attention Las tuplas de valores están separadas por espacios.
573#@version 0.9 - Primera versión para OpenGnSys
574#@author  Ramon Gomez, ETSII Universidad de Sevilla
575#@date    2009/07/24
576#*/ ##
577function ogListPartitions ()
578{
579# Variables locales.
580local DISK PART NPARTS TYPE SIZE
581
582# Si se solicita, mostrar ayuda.
583if [ "$*" == "help" ]; then
584    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" \
585           "$FUNCNAME 1  =>  NTFS:10000000 EXT3:5000000 LINUX-SWAP:1000000"
586    return
587fi
588# Error si no se recibe 1 parámetro.
589[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT "$FORMAT" || return $?
590
591# Procesar la salida de \c parted .
592DISK="$(ogDiskToDev $1)" || return $?
593NPARTS=$(ogGetPartitionsNumber $1)
594for (( PART = 1; PART <= NPARTS; PART++ )); do
595    TYPE=$(ogGetFsType $1 $PART 2>/dev/null)
596    if [ $? -eq 0 ]; then
597        SIZE=$(ogGetPartitionSize $1 $PART 2>/dev/null)
598        echo -n "$TYPE:$SIZE "
599    else
600        echo -n "EMPTY:0 "
601    fi
602done
603echo
604}
605
606
607#/**
608#         ogListPrimaryPartitions int_ndisk
609#@brief   Metafunción que lista las particiones primarias no vacías definidas en un disco.
610#@param   int_ndisk  nº de orden del disco
611#@see     ogListPartitions
612#*/ ##
613function ogListPrimaryPartitions ()
614{
615# Variables locales.
616local PARTS
617
618PARTS=$(ogListPartitions "$@") || return $?
619echo $PARTS | cut -sf1-4 -d" " | sed 's/\( EMPTY:0\)*$//'
620}
621
622
623#/**
624#         ogListLogicalPartitions int_ndisk
625#@brief   Metafunción que lista las particiones lógicas definidas en un disco.
626#@param   int_ndisk  nº de orden del disco
627#@see     ogListPartitions
628#*/ ##
629function ogListLogicalPartitions ()
630{
631# Variables locales.
632local PARTS
633
634PARTS=$(ogListPartitions "$@") || return $?
635echo $PARTS | cut -sf5- -d" "
636}
637
638
639#/**
640#         ogSetPartitionActive int_ndisk int_npartition
641#@brief   Establece cual es la partición activa de un disco.
642#@param   int_ndisk      nº de orden del disco
643#@param   int_npartition nº de orden de la partición
644#@return  (nada).
645#@exception OG_ERR_FORMAT   Formato incorrecto.
646#@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositivo.
647#@note    Requisitos: parted
648#@version 0.1 -  Integracion para Opengnsys  -  EAC: SetPartitionActive() en ATA.lib
649#@author  Antonio J. Doblas Viso, Universidad de Malaga
650#@date    2008/10/27
651#@version 0.9 - Primera version compatible con OpenGnSys.
652#@author  Ramon Gomez, ETSII Universidad de Sevilla
653#@date    2009/09/17
654#*/ ##
655function ogSetPartitionActive ()
656{
657# Variables locales
658local DISK PART
659
660# Si se solicita, mostrar ayuda.
661if [ "$*" == "help" ]; then
662    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
663           "$FUNCNAME 1 1"
664    return
665fi
666# Error si no se reciben 2 parámetros.
667[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
668
669# Comprobar que el disco existe y activar la partición indicada.
670DISK="$(ogDiskToDev $1)" || return $?
671PART="$(ogDiskToDev $1 $2)" || return $?
672parted -s $DISK set $2 boot on 2>/dev/null
673}
674
675
676#/**
677#         ogSetPartitionSize int_ndisk int_npartition int_size
678#@brief   Muestra el tamano en KB de una particion determinada.
679#@param  int_ndisk      nº de orden del disco
680#@param   int_npartition nº de orden de la partición
681#@param   int_size       tamaño de la partición (en KB)
682#@return  (nada)
683#@exception OG_ERR_FORMAT   formato incorrecto.
684#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
685#@note    Requisitos: sfdisk, awk
686#@todo    Compruebar que el tamaño sea numérico positivo y evitar que pueda solaparse con la siguiente partición.
687#@version 0.9 - Primera versión para OpenGnSys
688#@author  Ramon Gomez, ETSII Universidad de Sevilla
689#@date    2009/07/24
690#*/ ##
691function ogSetPartitionSize ()
692{
693# Variables locales.
694local DISK PART SIZE
695
696# Si se solicita, mostrar ayuda.
697if [ "$*" == "help" ]; then
698    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition int_size" \
699           "$FUNCNAME 1 1 10000000"
700    return
701fi
702# Error si no se reciben 3 parámetros.
703[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
704
705# Obtener el tamaño de la partición.
706DISK="$(ogDiskToDev $1)" || return $?
707PART="$(ogDiskToDev $1 $2)" || return $?
708# Convertir tamaño en KB a sectores de 512 B.
709SIZE=$[$3*2] || ogRaiseError $OG_ERR_FORMAT || return $?
710# Usar \c sfdisk para redefinir el tamaño.
711sfdisk -f -uS -N$2 $DISK <<< ",$SIZE" &>/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
712partprobe 2>/dev/null
713}
714
715
716#/**
717#         ogSetPartitionType int_ndisk int_npartition str_parttype
718#@brief   Metafunción que asigna el tipo de partición. Cambia el identificador de la particion, pero no su sistema de archivos.
719#@param   int_ndisk      nº de orden del disco
720#@param   int_npartition nº de orden de la partición
721#@param   str_parttype   identificador de tipo de partición
722#@return  La propia de  ogSetPartitionId
723#@see     ogSetPartitionId
724#@version 1.0 - Adaptación a Engine 1.0
725#@author  Ramon Gomez, ETSII Universidad de Sevilla
726#@Date
727#*/ ##
728function ogSetPartitionType ()
729{
730# Si se solicita, mostrar ayuda.
731if [ "$*" == "help" ]; then
732    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npart str_parttype" \
733           "$FUNCNAME 1 1 NTFS"
734    return
735fi
736
737ogSetPartitionId "$1" "$2" $(ogTypeToId "$3") || return $?
738}
739
740
741#/**
742#         ogTypeToId str_parttype
743#@brief   Devuelve el identificador correspondiente a un tipo de partición.
744#@param   str_parttype  mnemónico de tipo de sistema de archivos
745#@return  hex_partid    nº identificador de tipo de partición.
746#@exception OG_ERR_FORMAT   Formato incorrecto.
747#@version 0.1 -  Integracion para Opengnsys  -  EAC: TypeFS () en ATA.lib
748#@author  Antonio J. Doblas Viso, Universidad de Malaga
749#@date    2008/10/27
750#@version 0.9 - Primera version para OpenGnSys
751#@author  Ramon Gomez, ETSII Universidad Sevilla
752#@date    2009-12-14
753#@version 1.0 - Renombrada de ogFsToId a ogTypeToId.
754#*/ ##
755function ogTypeToId ()
756{
757# Variables locales
758local ID
759
760# Si se solicita, mostrar ayuda.
761if [ "$*" == "help" ]; then
762    ogHelp "$FUNCNAME" "$FUNCNAME str_parttype" "$FUNCNAME LINUX  =>  83"
763    return
764fi
765# Error si no se recibe 1 parámetro.
766[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
767
768# Asociar id. de partición para su mnemónico de sistema de archivos.
769case "$1" in
770    EMPTY)       ID=0  ;;
771    FAT12)       ID=1  ;;
772    EXTENDED)    ID=5  ;;
773    FAT16)       ID=6  ;;
774    NTFS)        ID=7  ;;
775    FAT32)       ID=b  ;;
776    HFAT12)      ID=11 ;;
777    COMPAQDIAG)  ID=12 ;;
778    HFAT16)      ID=16 ;;
779    HNTFS)       ID=17 ;;
780    HFAT32)      ID=1b ;;
781    WIN-DYNAMIC) ID=42 ;;
782    LINUX-SWAP)  ID=82 ;;
783    LINUX)       ID=83 ;;
784    LINUX-LVM)   ID=8e ;;
785    HFS)         ID=af ;;
786    SOLARIS)     ID=bf ;;
787    CACHE)       ID=ca ;;
788    LINUX-RAID)  ID=fd ;;
789    *)           ID="" ;;
790esac
791echo $ID
792}
793
794
795#/**
796#         ogUnhidePartition int_ndisk int_npartition
797#@brief   Hace visible una partición oculta.
798#@param   int_ndisk      nº de orden del disco
799#@param   int_npartition nº de orden de la partición
800#@return  (nada)
801#@exception OG_ERR_FORMAT    formato incorrecto.
802#@exception OG_ERR_NOTFOUND  disco o particion no detectado (no es un dispositivo).
803#@exception OG_ERR_PARTITION tipo de partición no reconocido.
804#@version 1.0 - Versión en pruebas.
805#@author  Ramon Gomez, ETSII Universidad de Sevilla
806#@date    2010/01/12
807#*/ ##
808function ogUnhidePartition ()
809{
810# Variables locales.
811local PART TYPE NEWTYPE
812# Si se solicita, mostrar ayuda.
813if [ "$*" == "help" ]; then
814    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
815           "$FUNCNAME 1 1"
816    return
817fi
818# Error si no se reciben 2 parámetros.
819[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
820PART=$(ogDiskToDev "$1" "$2") || return $?
821
822# Obtener tipo de partición.
823TYPE=$(ogGetPartitionType "$1" "$2")
824case "$TYPE" in
825    HNTFS)  NEWTYPE="NTFS"  ;;
826    HFAT32) NEWTYPE="FAT32" ;;
827    HFAT12) NEWTYPE="FAT12" ;;
828    HFAT16) NEWTYPE="FAT16" ;;
829    *)      ogRaiseError $OG_ERR_PARTITION "$TYPE"
830            return $? ;;
831esac
832# Cambiar tipo de partición.
833ogSetPartitionType $1 $2 $NEWTYPE
834}
835
836
837#/**
838#         ogUpdatePartitionTable
839#@brief   Fuerza al kernel releer la tabla de particiones de los discos duros
840#@param   no requiere
841#@return  informacion propia de la herramienta
842#@note    Requisitos: \c partprobe
843#@warning pendiente estructurar la funcion a opengnsys
844#@version 0.1 -  Integracion para Opengnsys  -  EAC: UpdatePartitionTable() en ATA.lib
845#@author  Antonio J. Doblas Viso. Universidad de Malaga
846#@date    27/10/2008
847#*/
848
849function ogUpdatePartitionTable ()
850{
851for i in `ogDiskToDev`
852do
853        partprobe $i
854done
855}
856
857
858
859#/**  @function ogGetPartitionsNumber: @brief detecta el numero de particiones del disco duro indicado.
860#@param   int_numdisk   (indentificado EAC del disco)
861#@return  devuelve el numero paritiones del disco duro indicado
862#@warning  Salidas de errores no determinada
863#@attention Requisitos: parted
864#@note    Notas sin especificar
865#@version 0.1 -  Integracion para Opengnsys  -  EAC:  DetectNumberPartition () en ATA.lib
866#@author  Antonio J. Doblas Viso. Universidad de Malaga
867#@date    Date: 27/10/2008
868#@version 1.0 - Uso de sfdisk Primera version para OpenGnSys
869#@author  Ramon Gomez, ETSII Universidad de Sevilla
870#@date    2009/07/24
871#*/
872function ogGetPartitionsNumber () {
873           #local disco totalpart
874           #disco=`ogDiskToDev $1`
875           #totalpart=`parted $disco print | egrep ^" [0123456789] " -c`
876           #echo $totalpart
877local DISK
878#/// Contar el nº de veces que aparece el disco en su lista de particiones.
879DISK=$(ogDiskToDev $1) 2>/dev/null
880sfdisk -l $DISK 2>/dev/null | grep -c "^$DISK"
881}
882
883
884#/**  @function ogDiskToRelativeDev: @brief Traduce los ID de discos o particiones EAC a ID Linux relativos, es decir 1 1 => sda1
885#@param  Admite 1 parametro:   $1  int_numdisk
886#@param  Admite 2 parametro:   $1   int_numdisk                    $2  int_partition
887#@return  Para 1 parametros traduce Discos Duros: Devuelve la ruta relativa linux del disco duro indicado con nomenclatura EAC.........ejemplo: IdPartition 1 => sda
888#@return  Para 2 parametros traduce Particiones: Devuelve la ruta relativa linux de la particion indicado con nomenclatura EAC...........  ejemplo: IdPartition  2 1 => sdb1
889#@warning  No definidas
890#@attention
891#@note    Notas sin especificar
892#@version 0.1 -  Integracion para Opengnsys  -  EAC:  IdPartition en ATA.lib
893#@author  Antonio J. Doblas Viso. Universidad de Malaga
894#@date    27/10/2008
895#*/
896function ogDiskToRelativeDev () {
897if [ $# = 0 ]
898then
899        Msg "Info: Traduce el identificador del dispositivo EAC a dispositivo linux \n" info
900        Msg "Sintaxis1: IdPartition int_disk -----------------Ejemplo1: IdPartition 1 -> sda " example
901        Msg "Sintaxis2: IdPartition int_disk int_partition  --Ejemplo2: IdPartition 1 2 -> sda2 " example
902
903return
904fi
905#PART="$(Disk|cut -f$1 -d' ')$2"    # se comenta esta linea porque doxygen no reconoce la funcion disk y no crea los enlaces y referencias correctas.
906PART=$(ogDiskToDev|cut -f$1 -d' ')$2
907echo $PART | cut -f3 -d \/
908}
909
910#/**  @function ogDeletePartitionTable: @brief Borra la tabla de particiones del disco.
911#@param $1 opcion A (identificador LINUX)       str_ID_linux (/dev/sda)
912#@param $1 opcion B (Identifiador EAC)                  int_numdiskEAC(1)
913#@return   la informacion propia del fdisk
914#@warning    no definidos
915#@attention
916#@note
917#@version 0.1 -  Integracion para Opengnsys  -  EAC:  DeletePartitionTable () en ATA.lib
918#@author  Antonio J. Doblas Viso. Universidad de Malaga
919#@date    27/10/2008
920#*/
921function ogDeletePartitionTable () {
922if [ $# = 0 ]
923then
924        Msg "sintaxis1: ogDeletePartitionTable int_disk" red
925        Msg "sintaxis2: ogDeletePartitionTable str_/dev/sdX" red
926        return
927fi
928if [ -n "${1%/dev/*}" ]
929        then
930        dev=`DiskToDev $1`
931        else
932        dev=$1
933fi
934echo -ne "o\nw" | fdisk $dev
935}
936
937
938#/**  @function ogSetPartitionId: @brief Cambia el identificador de la particion, pero no su sistema de archivos.
939#@param  $1 int_numdiskEAC
940#@param  $2 int_numpartitionEAC
941#@param  $3 str_tipoPartition admite EXT2 EXT3 NTFS FAT32 SWAP CACHE
942#@return   la propia del fdisk
943#@warning    no controla los parametros, si se introducen mal o simplemente no se introducen no muestra mensaje
944#@warning    Identifica por nombre del sistema de archivos no por número
945#@attention Requisitos:  fdisk
946#@note
947#@version 0.1 -  Integracion para Opengnsys  - SetPartitionType() en ATA.lib
948#@author  Antonio J. Doblas Viso. Universidad de Malaga
949#@date    27/10/2008
950#*/
951function ogSetPartitionId() {
952# Variables locales
953local DISK PART ID
954
955# Si se solicita, mostrar ayuda.
956if [ "$*" == "help" ]; then
957    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition str_type" \
958           "$FUNCNAME 1 1 NTFS"
959    return
960fi
961# Error si no se reciben 3 parámetros.
962[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
963
964# Sustituye nº de disco por su dispositivo.
965DISK=`ogDiskToDev $1` || return $?
966PART=`ogDiskToDev $1 $2` || return $?
967
968# Elección del tipo de partición.
969ID=$(ogFsToId "$3")
970[ -n "$ID" ] || ogRaiseError $OG_ERR_PARTITION "$3" || return $?
971
972echo -ne "t\n$2\n${ID}\nw\n" | fdisk $DISK 1>/dev/null 2>&1
973}
974
975
976#/**  @function ogDeletePartitionsLabels: @brief Elimina la informacion que tiene el kernel del cliente og sobre los labels de los sistemas de archivos
977#@param  No requiere
978#@return   Nada
979#@warning
980#@attention Requisitos:  comando interno linux rm
981#@note
982#@version 0.1 -  Integracion para Opengnsys  -  EAC:   DeletePartitionTable()  en ATA.lib
983#@author  Antonio J. Doblas Viso. Universidad de Malaga
984#@date    27/10/2008
985#*/
986function ogDeletePartitionsLabels () {
987rm /dev/disk/by-label/*    # */ COMENTARIO OBLIGATORIO PARA DOXYGEN
988}
989
990
Note: See TracBrowser for help on using the repository browser.