source: client/engine/Disk.lib @ 6539ab9

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 6539ab9 was 8971dc86, checked in by ramon <ramongomez@…>, 14 years ago

Version 1.0:

  • Corregir mensaje de error en función ogSetPartitionId.
  • Función ogGetFsType devuelve Ext3 como tipo por defecto para partición de tipo Linux, corrige errores de detección en funciones ogListPartitions, ogFormatFs, ogCheckFs, etc. (cerrar #355).

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

  • Property mode set to 100755
File size: 25.5 KB
Line 
1#!/bin/bash
2#/**
3#@file    Disk.lib
4#@brief   Librería o clase Disk
5#@class   Disk
6#@brief   Funciones para gestión de discos y particiones.
7#@version 0.9
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    [ "$TYPE" != "CACHE" ] || ogRaiseError $OG_ERR_FORMAT "$TYPE" || return $?
79    SIZE="${1#*:}"
80    # Convertir en sectores de 512 B.
81    SIZE=$(echo $SIZE|awk '{print $0*2}')      # (solución error de sintaxis)
82    [ $SIZE -ne 0 ] || ogRaiseError $OG_ERR_FORMAT "$SIZE" || return $?
83    # Obtener identificador de tipo de partición.
84    ID=$(ogFsToId "$TYPE")
85    [ -n "$ID" ] || ogRaiseError $OG_ERR_PARTITION "$TYPE" || return $?
86    # Comprobar si la partición es extendida.
87    if [ $ID = 5 ]; then
88        [ $PART -gt 4 ] && ogRaiseError $OG_ERR_FORMAT && return $?
89        EXTSTART=$START
90        EXTSIZE=$SIZE
91    fi
92    # Incluir particiones lógicas dentro de la partición extendida.
93    if [ $PART = 5 ]; then
94        [ -z "$EXTSTART" ] && ogRaiseError $OG_ERR_FORMAT && return $?
95        START=$EXTSTART
96        SECTORS=$[EXTSTART+EXTSIZE]
97    fi
98    # Generar datos para la partición.
99    echo "$DISK$PART : start=$START, size=$SIZE, Id=$ID" >>$tmpsfdisk
100    # Error si se supera el nº total de sectores.
101    START=$[START+SIZE]
102    [ $START -le $SECTORS ] || ogRaiseError $OG_ERR_FORMAT "$[START/2] > $[SECTORS/2]" || return $?
103    PART=$[PART+1]
104    shift
105done
106# Si no se indican las 4 particiones primarias, definirlas como vacías, conservando la partición de caché.
107while [ $PART -le 4 ]; do
108    if [ "$ND $PART" == "$CACHEPART" -a -n "$CACHESIZE" ]; then
109        echo "$DISK$PART : start=$[SECTORS+1], size=$CACHESIZE, Id=ca" >>$tmpsfdisk
110    else
111        echo "$DISK$PART : start=0, size=0, Id=0" >>$tmpsfdisk
112    fi
113    PART=$[PART+1]
114done
115# Si se define partición extendida sin lógicas, crear particion 5 vacía.
116if [ $PART = 5 -a -n "$EXTSTART" ]; then
117    echo "${DISK}5 : start=$EXTSTART, size=$EXTSIZE, Id=0" >>$tmpsfdisk
118fi
119
120# Desmontar los sistemas de archivos del disco antes de realizar las operaciones.
121ogUnmountAll $ND 2>/dev/null
122[ -n "$CACHESIZE" ] && ogUnmountCache 2>/dev/null
123
124# Si la tabla de particiones no es valida, volver a generarla.
125[ $(parted -s $DISK print >/dev/null) ] || fdisk $DISK <<< "w"
126# Definir particiones y notificar al kernel.
127sfdisk -f $DISK < $tmpsfdisk 2>/dev/null && partprobe $DISK
128rm -f $tmpsfdisk
129[ -n "$CACHESIZE" ] && ogMountCache 2>/dev/null
130}
131
132
133#/**
134#         ogDevToDisk path_device
135#@brief   Devuelve el nº de orden de dicso (y partición) correspondiente al nombre de fichero de dispositivo.
136#@param   path_device Camino del fichero de dispositivo.
137#@return  int_ndisk (para dispositivo de disco)
138#@return  int_ndisk int_npartition (para dispositivo de partición).
139#@exception OG_ERR_FORMAT   Formato incorrecto.
140#@exception OG_ERR_NOTFOUND Dispositivo no detectado.
141#@note    Requisitos: awk
142#@version 0.1 -  Integracion para Opengnsys  -  EAC: DiskEAC() en ATA.lib
143#@author  Antonio J. Doblas Viso, Universidad de Malaga
144#@date    2008/10/27
145#@version 0.9 - Primera version para OpenGNSys
146#@author  Ramon Gomez, ETSII Universidad Sevilla
147#@date    2009/07/20
148#*/ ##
149function ogDevToDisk ()
150{
151# Variables locales.
152local d n
153# Si se solicita, mostrar ayuda.
154if [ "$*" == "help" ]; then
155    ogHelp "$FUNCNAME" "$FUNCNAME path_device" \
156           "$FUNCNAME /dev/sda  =>  1 1"
157    return
158fi
159
160# Error si no se recibe 1 parámetro.
161[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
162# Error si no es fichero de bloques.
163[ -b "$1" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $?
164
165# Procesa todos los discos para devolver su nº de orden y de partición.
166n=1
167for d in $(ogDiskToDev); do
168    [ -n "$(echo $1 | grep $d)" ] && echo "$n ${1#$d}" && return
169    n=$[n+1]
170done
171ogRaiseError $OG_ERR_NOTFOUND "$1"
172return $OG_ERR_NOTFOUND
173}
174
175
176#/**
177#         ogDiskToDev [int_ndisk [int_npartition]]
178#@brief   Devuelve la equivalencia entre el nº de orden del dispositivo (dicso o partición) y el nombre de fichero de dispositivo correspondiente.
179#@param   int_ndisk      nº de orden del disco
180#@param   int_npartition nº de orden de la partición
181#@return  Para 0 parametros: Devuelve los nombres de ficheros  de los dispositivos sata/ata/usb linux encontrados.
182#@return  Para 1 parametros: Devuelve la ruta del disco duro indicado.
183#@return  Para 2 parametros: Devuelve la ruta de la particion indicada.
184#@exception OG_ERR_FORMAT   Formato incorrecto.
185#@exception OG_ERR_NOTFOUND Dispositivo no detectado.
186#@note    Requisitos: awk, lvm
187#@version 0.1 -  Integracion para Opengnsys  -  EAC: Disk() en ATA.lib;  HIDRA: DetectarDiscos.sh
188#@author Ramon Gomez, ETSII Universidad de Sevilla
189#@Date    2008/06/19
190#@author  Antonio J. Doblas Viso, Universidad de Malaga
191#@date    2008/10/27
192#@version 0.9 - Primera version para OpenGNSys
193#@author  Ramon Gomez, ETSII Universidad Sevilla
194#@date    2009-07-20
195#*/ ##
196function ogDiskToDev ()
197{
198# Variables locales
199local ALLDISKS VOLGROUPS DISK PART
200
201# Si se solicita, mostrar ayuda.
202if [ "$*" == "help" ]; then
203    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk [int_npartition]" \
204           "$FUNCNAME      =>  /dev/sda /dev/sdb" \
205           "$FUNCNAME 1    =>  /dev/sda" \
206           "$FUNCNAME 1 1  =>  /dev/sda1"
207    return
208fi
209
210# Listar dispositivo para los discos duros (tipos: 3=hd, 8=sd).
211ALLDISKS=$(awk '($1==3 || $1==8) && $4!~/[0-9]/ {printf "/dev/%s ",$4}' /proc/partitions)
212VOLGROUPS=$(vgs -a --noheadings 2>/dev/null | awk '{printf "/dev/%s ",$1}')
213ALLDISKS="$ALLDISKS $VOLGROUPS"
214
215# Mostrar salidas segun el número de parametros.
216case $# in
217    0)  # Muestra todos los discos, separados por espacios.
218        echo $ALLDISKS
219        ;;
220    1)  # Error si el parámetro no es un digito.
221        [ -z "${1/[1-9]/}" ] || ogRaiseError $OG_ERR_FORMAT || return $?
222        DISK=$(echo "$ALLDISKS" | awk -v n=$1 '{print $n}')
223        # Error si el fichero no existe.
224        [ -e "$DISK" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $?
225        echo "$DISK"
226        ;;
227    2)  # Error si los 2 parámetros no son digitos.
228        [ -z "${1/[1-9]/}" -a -z "${2/[1-9]/}" ] || ogRaiseError $OG_ERR_FORMAT|| return $?
229        DISK=$(echo "$ALLDISKS" | awk -v n=$1 '{print $n}')
230        [ -e "$DISK" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $?
231        PART="$DISK$2"
232        # Comprobar si es partición.
233        if [ -b "$PART" ]; then
234            echo "$PART"
235        elif [ -n "$VOLGROUPS" ]; then
236            # Comprobar si volumen lógico.      /* (comentario Doxygen)
237            PART=$(lvscan -a 2>/dev/null | grep "'$DISK/" | awk -v n=$2 -F\' '{if (NR==n) print $2}')
238            [ -e "$PART" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2" || return $?
239            #                                   (comentario Doxygen) */
240            echo "$PART"
241        else
242            ogRaiseError $OG_ERR_NOTFOUND "$1 $2" || return $?
243        fi
244        ;;
245    *)  # Formato erroneo.
246        ogRaiseError $OG_ERR_FORMAT
247        return $OG_ERR_FORMAT
248        ;;
249esac
250}
251
252
253#/**
254#         ogFsToId str_fstype
255#@brief   Devuelve el identificador de partición correspondiente a un tipo de sistema de archivos.
256#@param   str_fstype  mnemónico de tipo de sistema de archivos
257#@return  int_idpart  nº identificador de tipo de partición.
258#@exception OG_ERR_FORMAT   Formato incorrecto.
259#@version 0.1 -  Integracion para Opengnsys  -  EAC: TypeFS () en ATA.lib
260#@author  Antonio J. Doblas Viso, Universidad de Malaga
261#@date    2008/10/27
262#@version 0.9 - Primera version para OpenGNSys
263#@author  Ramon Gomez, ETSII Universidad Sevilla
264#@date    2009-12-14
265#*/ ##
266function ogFsToId ()
267{
268# Variables locales
269local ID
270
271# Si se solicita, mostrar ayuda.
272if [ "$*" == "help" ]; then
273    ogHelp "$FUNCNAME" "$FUNCNAME str_fstype" "$FUNCNAME EXT3  =>  83"
274    return
275fi
276# Error si no se recibe 1 parámetro.
277[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
278
279# Asociar id. de partición para su mnemónico de sistema de archivos.
280case "$1" in
281    EMPTY)      ID=0  ;;
282    FAT12)      ID=1  ;;
283    EXTENDED)   ID=5  ;;
284    FAT16)      ID=6  ;;
285    NTFS|EXFAT) ID=7  ;;
286    FAT32)      ID=b  ;;
287    HFAT12)     ID=11 ;;
288    HFAT16)     ID=16 ;;
289    HNTFS)      ID=17 ;;
290    HFAT32)     ID=1b ;;
291    LINUX-SWAP) ID=82 ;;
292    EXT[234]|REISERFS|REISER4|XFS|JFS)
293                ID=83 ;;
294    LINUX-LVM)  ID=8e ;;
295    SOLARIS)    ID=bf ;;
296    CACHE)      ID=ca ;;
297    LINUX-RAID) ID=fd ;;
298    *)          ID="" ;;
299esac
300echo $ID
301}
302
303
304#/**
305#         ogGetDiskSize int_ndisk
306#@brief   Muestra el tamaño en KB de un disco.
307#@param   int_ndisk   nº de orden del disco
308#@return  int_size  - Tamaño en KB del disco.
309#@exception OG_ERR_FORMAT   formato incorrecto.
310#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
311#@note    Requisitos: sfdisk, awk
312#@version 0.9.2 - Primera version para OpenGnSys
313#@author  Ramon Gomez, ETSII Universidad de Sevilla
314#@date    2010/09/15
315#*/ ##
316function ogGetDiskSize ()
317{
318# Variables locales.
319local DISK
320
321# Si se solicita, mostrar ayuda.
322if [ "$*" == "help" ]; then
323    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" \ "$FUNCNAME 1  => 244198584"
324    return
325fi
326# Error si no se recibe 1 parámetro.
327[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
328
329# Obtener el tamaño de la partición.
330DISK="$(ogDiskToDev $1)" || return $?
331sfdisk -s $DISK
332}
333
334
335#/**
336#         ogGetPartitionActive int_ndisk
337#@brief   Muestra que particion de un disco esta marcada como de activa.
338#@param   int_ndisk   nº de orden del disco
339#@return  int_npart   Nº de partición activa
340#@exception OG_ERR_FORMAT Formato incorrecto.
341#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
342#@note    Requisitos: parted
343#@todo    Queda definir formato para atributos (arranque, oculta, ...).
344#@version 0.9 - Primera version compatible con OpenGNSys.
345#@author  Ramon Gomez, ETSII Universidad de Sevilla
346#@date    2009/09/17
347#*/ ##
348function ogGetPartitionActive ()
349{
350# Variables locales
351local DISK
352
353# Si se solicita, mostrar ayuda.
354if [ "$*" == "help" ]; then
355    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" "$FUNCNAME 1  =>  1"
356    return
357fi
358# Error si no se recibe 1 parámetro.
359[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
360
361# Comprobar que el disco existe y listar su partición activa.
362DISK="$(ogDiskToDev $1)" || return $?
363parted $DISK print 2>/dev/null | awk '/boot/ {print $1}'
364}
365
366
367#/**
368#         ogGetPartitionId int_ndisk int_npartition
369#@brief   Devuelve el mnemonico con el tipo de sistema de archivos.
370#@param   int_ndisk      nº de orden del disco
371#@param   int_npartition nº de orden de la partición
372#@return  Identificador de tipo de partición.
373#@exception OG_ERR_FORMAT   Formato incorrecto.
374#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
375#@note    Requisitos: sfdisk
376#@version 0.9 - Primera versión compatible con OpenGNSys.
377#@author  Ramon Gomez, ETSII Universidad de Sevilla
378#@date    25/03/2009
379#*/ ##
380function ogGetPartitionId ()
381{
382# Variables locales.
383local DISK PART
384
385# Si se solicita, mostrar ayuda.
386if [ "$*" == "help" ]; then
387    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
388           "$FUNCNAME 1 1  =>  7"
389    return
390fi
391# Error si no se reciben 2 parámetros.
392[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
393
394# Detectar id. de tipo de particion y codificar al mnemonico.
395DISK=$(ogDiskToDev $1) || return $?
396PART=$(ogDiskToDev $1 $2) || return $?
397echo $(sfdisk --id $DISK $2 2>/dev/null)
398}
399
400
401#/**
402#         ogGetPartitionSize int_ndisk int_npartition
403#@brief   Muestra el tamano en KB de una particion determinada.
404#@param   int_ndisk      nº de orden del disco
405#@param   int_npartition nº de orden de la partición
406#@return  int_partsize - Tamaño en KB de la partición.
407#@exception OG_ERR_FORMAT   formato incorrecto.
408#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
409#@note    Requisitos: sfdisk, awk
410#@version 0.1 -  Integracion para Opengnsys  -  EAC: SizePartition () en ATA.lib
411#@author  Antonio J. Doblas Viso, Universidad de Malaga
412#@date    2008/10/27
413#@version 0.9 - Primera version para OpenGNSys
414#@author  Ramon Gomez, ETSII Universidad de Sevilla
415#@date    2009/07/24
416#*/ ##
417function ogGetPartitionSize ()
418{
419# Variables locales.
420local DISK PART
421
422# Si se solicita, mostrar ayuda.
423if [ "$*" == "help" ]; then
424    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
425           "$FUNCNAME 1 1  =>  10000000"
426    return
427fi
428# Error si no se reciben 2 parámetros.
429[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
430
431# Obtener el tamaño de la partición.
432DISK="$(ogDiskToDev $1)" || return $?
433PART="$(ogDiskToDev $1 $2)" || return $?
434case "$(ogGetPartitionId $1 $2)" in
435    5|f)  # Procesar detección de tamaño de partición Extendida.
436          sfdisk -l $DISK 2>/dev/null | \
437                    awk -v p=$PART '{if ($1==p) {sub (/\*/,""); print $5} }'
438          ;;
439    *)    sfdisk -s $PART
440          ;;
441esac
442}
443
444
445#/**
446#         ogListPartitions int_ndisk
447#@brief   Lista las particiones definidas en un disco.
448#@param   int_ndisk  nº de orden del disco
449#@return  str_parttype:int_partsize ...
450#@exception OG_ERR_FORMAT   formato incorrecto.
451#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
452#@note    Requisitos: \c parted \c awk
453#@attention El nº de partición se indica por el orden de los párametros \c parttype:partsize
454#@attention Las tuplas de valores están separadas por espacios.
455#@version 0.9 - Primera versión para OpenGNSys
456#@author  Ramon Gomez, ETSII Universidad de Sevilla
457#@date    2009/07/24
458#*/ ##
459function ogListPartitions ()
460{
461# Variables locales.
462local DISK PART NPARTS TYPE SIZE
463
464# Si se solicita, mostrar ayuda.
465if [ "$*" == "help" ]; then
466    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" \
467           "$FUNCNAME 1  =>  NTFS:10000000 EXT3:5000000 LINUX-SWAP:1000000"
468    return
469fi
470# Error si no se recibe 1 parámetro.
471[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT "$FORMAT" || return $?
472
473# Procesar la salida de \c parted .
474DISK="$(ogDiskToDev $1)" || return $?
475NPARTS=$(ogGetPartitionsNumber $1)
476for (( PART = 1; PART <= NPARTS; PART++ )); do
477    TYPE=$(ogGetFsType $1 $PART 2>/dev/null)
478    if [ $? -eq 0 ]; then
479        SIZE=$(ogGetPartitionSize $1 $PART 2>/dev/null)
480        echo -n "$TYPE:$SIZE "
481    else
482        echo -n "EMPTY:0 "
483    fi
484done
485echo
486}
487
488
489#/**
490#         ogListPrimaryPartitions int_ndisk
491#@brief   Metafunción que lista las particiones primarias no vacías definidas en un disco.
492#@param   int_ndisk  nº de orden del disco
493#@see     ogListPartitions
494#*/ ##
495function ogListPrimaryPartitions ()
496{
497# Variables locales.
498local PARTS
499
500PARTS=$(ogListPartitions "$@") || return $?
501echo $PARTS | cut -sf1-4 -d" " | sed 's/\( EMPTY:0\)*$//'
502}
503
504
505#/**
506#         ogListLogicalPartitions int_ndisk
507#@brief   Metafunción que lista las particiones lógicas definidas en un disco.
508#@param   int_ndisk  nº de orden del disco
509#@see     ogListPartitions
510#*/ ##
511function ogListLogicalPartitions ()
512{
513# Variables locales.
514local PARTS
515
516PARTS=$(ogListPartitions "$@") || return $?
517echo $PARTS | cut -sf5- -d" "
518}
519
520
521#/**
522#         ogSetPartitionActive int_ndisk int_npartition
523#@brief   Establece cual es la partición activa de un disco.
524#@param   int_ndisk      nº de orden del disco
525#@param   int_npartition nº de orden de la partición
526#@return  (nada).
527#@exception OG_ERR_FORMAT   Formato incorrecto.
528#@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositivo.
529#@note    Requisitos: parted
530#@version 0.1 -  Integracion para Opengnsys  -  EAC: SetPartitionActive() en ATA.lib
531#@author  Antonio J. Doblas Viso, Universidad de Malaga
532#@date    2008/10/27
533#@version 0.9 - Primera version compatible con OpenGNSys.
534#@author  Ramon Gomez, ETSII Universidad de Sevilla
535#@date    2009/09/17
536#*/ ##
537function ogSetPartitionActive ()
538{
539# Variables locales
540local DISK PART
541
542# Si se solicita, mostrar ayuda.
543if [ "$*" == "help" ]; then
544    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
545           "$FUNCNAME 1 1"
546    return
547fi
548# Error si no se reciben 2 parámetros.
549[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
550
551# Comprobar que el disco existe y activar la partición indicada.
552DISK="$(ogDiskToDev $1)" || return $?
553PART="$(ogDiskToDev $1 $2)" || return $?
554parted -s $DISK set $2 boot on 2>/dev/null
555}
556
557
558#/**
559#         ogSetPartitionSize int_ndisk int_npartition int_size
560#@brief   Muestra el tamano en KB de una particion determinada.
561#@param  int_ndisk      nº de orden del disco
562#@param   int_npartition nº de orden de la partición
563#@param   int_size       tamaño de la partición (en KB)
564#@return  (nada)
565#@exception OG_ERR_FORMAT   formato incorrecto.
566#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
567#@note    Requisitos: sfdisk, awk
568#@todo    Compruebar que el tamaño sea numérico positivo y evitar que pueda solaparse con la siguiente partición.
569#@version 0.9 - Primera versión para OpenGNSys
570#@author  Ramon Gomez, ETSII Universidad de Sevilla
571#@date    2009/07/24
572#*/ ##
573function ogSetPartitionSize ()
574{
575# Variables locales.
576local DISK PART SIZE
577
578# Si se solicita, mostrar ayuda.
579if [ "$*" == "help" ]; then
580    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition int_size" \
581           "$FUNCNAME 1 1 10000000"
582    return
583fi
584# Error si no se reciben 3 parámetros.
585[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
586
587# Obtener el tamaño de la partición.
588DISK="$(ogDiskToDev $1)" || return $?
589PART="$(ogDiskToDev $1 $2)" || return $?
590# Convertir tamaño en KB a sectores de 512 B.
591SIZE=$[$3*2] || ogRaiseError $OG_ERR_FORMAT || return $?
592# Usar \c sfdisk para redefinir el tamaño.
593sfdisk -f -uS -N$2 $DISK <<< ",$SIZE" &>/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
594partprobe 2>/dev/null
595}
596
597
598#/**
599#         ogUpdatePartitionTable
600#@brief   Fuerza al kernel releer la tabla de particiones de los discos duros
601#@param   no requiere
602#@return  informacion propia de la herramienta
603#@note    Requisitos: \c partprobe
604#@warning pendiente estructurar la funcion a opengnsys
605#@version 0.1 -  Integracion para Opengnsys  -  EAC: UpdatePartitionTable() en ATA.lib
606#@author  Antonio J. Doblas Viso. Universidad de Malaga
607#@date    27/10/2008
608#*/
609
610function ogUpdatePartitionTable ()
611{
612for i in `ogDiskToDev`
613do
614        partprobe $i
615done
616}
617
618
619
620#/**  @function ogGetPartitionsNumber: @brief detecta el numero de particiones del disco duro indicado.
621#@param   int_numdisk   (indentificado EAC del disco)
622#@return  devuelve el numero paritiones del disco duro indicado
623#@warning  Salidas de errores no determinada
624#@attention Requisitos: parted
625#@note    Notas sin especificar
626#@version 0.1 -  Integracion para Opengnsys  -  EAC:  DetectNumberPartition () en ATA.lib
627#@author  Antonio J. Doblas Viso. Universidad de Malaga
628#@date    Date: 27/10/2008
629#@version 1.0 - Uso de sfdisk Primera version para OpenGnSys
630#@author  Ramon Gomez, ETSII Universidad de Sevilla
631#@date    2009/07/24
632#*/
633function ogGetPartitionsNumber () {
634           #local disco totalpart
635           #disco=`ogDiskToDev $1`
636           #totalpart=`parted $disco print | egrep ^" [0123456789] " -c`
637           #echo $totalpart
638local DISK
639#/// Contar el nº de veces que aparece el disco en su lista de particiones.
640DISK=$(ogDiskToDev $1) 2>/dev/null
641sfdisk -l $DISK 2>/dev/null | grep -c "^$DISK"
642}
643
644
645#/**  @function ogDiskToRelativeDev: @brief Traduce los ID de discos o particiones EAC a ID Linux relativos, es decir 1 1 => sda1
646#@param  Admite 1 parametro:   $1  int_numdisk
647#@param  Admite 2 parametro:   $1   int_numdisk                    $2  int_partition
648#@return  Para 1 parametros traduce Discos Duros: Devuelve la ruta relativa linux del disco duro indicado con nomenclatura EAC.........ejemplo: IdPartition 1 => sda
649#@return  Para 2 parametros traduce Particiones: Devuelve la ruta relativa linux de la particion indicado con nomenclatura EAC...........  ejemplo: IdPartition  2 1 => sdb1
650#@warning  No definidas
651#@attention
652#@note    Notas sin especificar
653#@version 0.1 -  Integracion para Opengnsys  -  EAC:  IdPartition en ATA.lib
654#@author  Antonio J. Doblas Viso. Universidad de Malaga
655#@date    27/10/2008
656#*/
657function ogDiskToRelativeDev () {
658if [ $# = 0 ]
659then
660        Msg "Info: Traduce el identificador del dispositivo EAC a dispositivo linux \n" info
661        Msg "Sintaxis1: IdPartition int_disk -----------------Ejemplo1: IdPartition 1 -> sda " example
662        Msg "Sintaxis2: IdPartition int_disk int_partition  --Ejemplo2: IdPartition 1 2 -> sda2 " example
663
664return
665fi
666#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.
667PART=$(ogDiskToDev|cut -f$1 -d' ')$2
668echo $PART | cut -f3 -d \/
669}
670
671#/**  @function ogDeletePartitionTable: @brief Borra la tabla de particiones del disco.
672#@param $1 opcion A (identificador LINUX)       str_ID_linux (/dev/sda)
673#@param $1 opcion B (Identifiador EAC)                  int_numdiskEAC(1)
674#@return   la informacion propia del fdisk
675#@warning    no definidos
676#@attention
677#@note
678#@version 0.1 -  Integracion para Opengnsys  -  EAC:  DeletePartitionTable () en ATA.lib
679#@author  Antonio J. Doblas Viso. Universidad de Malaga
680#@date    27/10/2008
681#*/
682function ogDeletePartitionTable () {
683if [ $# = 0 ]
684then
685        Msg "sintaxis1: ogDeletePartitionTable int_disk" red
686        Msg "sintaxis2: ogDeletePartitionTable str_/dev/sdX" red
687        return
688fi
689if [ -n "${1%/dev/*}" ]
690        then
691        dev=`DiskToDev $1`
692        else
693        dev=$1
694fi
695echo -ne "o\nw" | fdisk $dev
696}
697
698
699#/**  @function ogSetPartitionId: @brief Cambia el identificador de la particion, pero no su sistema de archivos.
700#@param  $1 int_numdiskEAC
701#@param  $2 int_numpartitionEAC
702#@param  $3 str_tipoPartition admite EXT2 EXT3 NTFS FAT32 SWAP CACHE
703#@return   la propia del fdisk
704#@warning    no controla los parametros, si se introducen mal o simplemente no se introducen no muestra mensaje
705#@warning    Identifica por nombre del sistema de archivos no por número
706#@attention Requisitos:  fdisk
707#@note
708#@version 0.1 -  Integracion para Opengnsys  - SetPartitionType() en ATA.lib
709#@author  Antonio J. Doblas Viso. Universidad de Malaga
710#@date    27/10/2008
711#*/
712function ogSetPartitionId() {
713# Variables locales
714local DISK PART ID
715
716# Si se solicita, mostrar ayuda.
717if [ "$*" == "help" ]; then
718    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition str_type" \
719           "$FUNCNAME 1 1 NTFS"
720    return
721fi
722# Error si no se reciben 3 parámetros.
723[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
724
725# Sustituye nº de disco por su dispositivo.
726DISK=`ogDiskToDev $1` || return $?
727PART=`ogDiskToDev $1 $2` || return $?
728
729# Elección del tipo de partición.
730ID=$(ogFsToId "$3")
731[ -n "$ID" ] || ogRaiseError $OG_ERR_PARTITION "$3" || return $?
732
733echo -ne "t\n$2\n${ID}\nw\n" | fdisk $DISK 1>/dev/null 2>&1
734}
735
736
737#/**  @function ogDeletePartitionsLabels: @brief Elimina la informacion que tiene el kernel del cliente og sobre los labels de los sistemas de archivos
738#@param  No requiere
739#@return   Nada
740#@warning
741#@attention Requisitos:  comando interno linux rm
742#@note
743#@version 0.1 -  Integracion para Opengnsys  -  EAC:   DeletePartitionTable()  en ATA.lib
744#@author  Antonio J. Doblas Viso. Universidad de Malaga
745#@date    27/10/2008
746#*/
747function ogDeletePartitionsLabels () {
748rm /dev/disk/by-label/*    # */ COMENTARIO OBLIGATORIO PARA DOXYGEN
749}
750
Note: See TracBrowser for help on using the repository browser.