source: client/engine/Disk.lib.testing @ 21d8a11

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

Versión 1.0.2: nueva función ogGenerateDiskInfo (modifica #51 y #397)

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

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