751 lines
26 KiB
Bash
751 lines
26 KiB
Bash
#!/bin/bash
|
|
#/**
|
|
#@file Disk.lib
|
|
#@brief Librería o clase Disk
|
|
#@class Disk
|
|
#@brief Funciones para gestión de discos y particiones.
|
|
#@version 0.9
|
|
#@warning License: GNU GPLv3+
|
|
#*/
|
|
|
|
|
|
#/**
|
|
# ogCreatePartitions int_ndisk str_parttype:int_partsize ...
|
|
#@brief Define el conjunto de particiones de un disco.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@param str_parttype mnemónico del tipo de partición
|
|
#@param int_partsize tamaño de la partición (en KB)
|
|
#@return (nada, por determinar)
|
|
#@exception OG_ERR_FORMAT formato incorrecto.
|
|
#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
|
|
#@attention El nº de partición se indica por el orden de los párametros \c parttype:partsize
|
|
#@attention Pueden definirse particiones vacías de tipo \c EMPTY
|
|
#@attention No puede definirse partición de cache y no se modifica si existe.
|
|
#@note Requisitos: sfdisk, parted, partprobe, awk
|
|
#@todo Definir atributos (arranque, oculta) y tamaños en MB, GB, etc.
|
|
#@version 0.9 - Primera versión para OpenGNSys
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2009/09/09
|
|
#@version 0.9.1 - Corrección del redondeo del tamaño del disco.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2010/03/09
|
|
#*/ ##
|
|
function ogCreatePartitions ()
|
|
{
|
|
# Variables locales.
|
|
local ND DISK PART SECTORS CYLS START SIZE TYPE CACHEPART CACHESIZE EXTSTART EXTSIZE tmpsfdisk
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk str_parttype:int_partsize ..." \
|
|
"$FUNCNAME 1 NTFS:10000000 EXT3:5000000 LINUX-SWAP:1000000"
|
|
return
|
|
fi
|
|
# Error si no se reciben menos de 2 parámetros.
|
|
[ $# -ge 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
|
|
|
|
# Nº total de sectores, para evitar desbordamiento (evitar redondeo).
|
|
ND="$1"
|
|
DISK=$(ogDiskToDev "$ND") || return $?
|
|
SECTORS=$(awk -v D=${DISK#/dev/} '{if ($4==D) {print $3*2}}' /proc/partitions)
|
|
CYLS=$(sfdisk -g $DISK | cut -f2 -d" ")
|
|
SECTORS=$[SECTORS/CYLS*CYLS-1]
|
|
# Se recalcula el nº de sectores del disco 1, si existe partición de caché.
|
|
CACHEPART=$(ogFindCache 2>/dev/null)
|
|
[ "$ND" = "${CACHEPART% *}" ] && CACHESIZE=$(ogGetCacheSize 2>/dev/null | awk '{print $0*2}')
|
|
[ -n "$CACHESIZE" ] && SECTORS=$[SECTORS-CACHESIZE]
|
|
ENDPART3=$(sfdisk -uS -l $DISK | awk -v P="${DISK}3" '{if ($1==P) print $3}')
|
|
# Sector de inicio (la partición 1 empieza en el sector 63).
|
|
START=63
|
|
PART=1
|
|
|
|
# Fichero temporal de entrada para "sfdisk"
|
|
tmpsfdisk=/tmp/sfdisk$$
|
|
trap "rm -f $tmpsfdisk" 1 2 3 9 15
|
|
|
|
echo "unit: sectors" >$tmpsfdisk
|
|
echo >>$tmpsfdisk
|
|
|
|
# Generar fichero de entrada para "sfdisk" con las particiones.
|
|
shift
|
|
while [ $# -gt 0 ]; do
|
|
# Conservar los datos de la partición de caché.
|
|
if [ "$ND $PART" == "$CACHEPART" -a -n "$CACHESIZE" ]; then
|
|
echo "$DISK$PART : start=$[SECTORS+1], size=$CACHESIZE, Id=ca" >>$tmpsfdisk
|
|
PART=$[PART+1]
|
|
fi
|
|
# Leer formato de cada parámetro - Tipo:Tamaño
|
|
TYPE="${1%%:*}"
|
|
[ "$TYPE" != "CACHE" ] || ogRaiseError $OG_ERR_FORMAT "$TYPE" || return $?
|
|
SIZE="${1#*:}"
|
|
# Convertir en sectores de 512 B.
|
|
SIZE=$(echo $SIZE|awk '{print $0*2}') # (solución error de sintaxis)
|
|
[ $SIZE -ne 0 ] || ogRaiseError $OG_ERR_FORMAT "$SIZE" || return $?
|
|
# Obtener identificador de tipo de partición.
|
|
ID=$(ogFsToId "$TYPE")
|
|
[ -n "$ID" ] || ogRaiseError $OG_ERR_PARTITION "$TYPE" || return $?
|
|
# Comprobar si la partición es extendida.
|
|
if [ $ID = 5 ]; then
|
|
[ $PART -gt 4 ] && ogRaiseError $OG_ERR_FORMAT && return $?
|
|
EXTSTART=$START
|
|
EXTSIZE=$SIZE
|
|
fi
|
|
# Incluir particiones lógicas dentro de la partición extendida.
|
|
if [ $PART = 5 ]; then
|
|
[ -z "$EXTSTART" ] && ogRaiseError $OG_ERR_FORMAT && return $?
|
|
START=$EXTSTART
|
|
SECTORS=$[EXTSTART+EXTSIZE]
|
|
fi
|
|
# Generar datos para la partición.
|
|
echo "$DISK$PART : start=$START, size=$SIZE, Id=$ID" >>$tmpsfdisk
|
|
# Error si se supera el nº total de sectores.
|
|
START=$[START+SIZE]
|
|
[ $START -le $SECTORS ] || ogRaiseError $OG_ERR_FORMAT "$[START/2] > $[SECTORS/2]" || return $?
|
|
PART=$[PART+1]
|
|
shift
|
|
done
|
|
# Si no se indican las 4 particiones primarias, definirlas como vacías, conservando la partición de caché.
|
|
while [ $PART -le 4 ]; do
|
|
if [ "$ND $PART" == "$CACHEPART" -a -n "$CACHESIZE" ]; then
|
|
echo "$DISK$PART : start=$[SECTORS+1], size=$CACHESIZE, Id=ca" >>$tmpsfdisk
|
|
else
|
|
echo "$DISK$PART : start=0, size=0, Id=0" >>$tmpsfdisk
|
|
fi
|
|
PART=$[PART+1]
|
|
done
|
|
# Si se define partición extendida sin lógicas, crear particion 5 vacía.
|
|
if [ $PART = 5 -a -n "$EXTSTART" ]; then
|
|
echo "${DISK}5 : start=$EXTSTART, size=$EXTSIZE, Id=0" >>$tmpsfdisk
|
|
fi
|
|
|
|
# Desmontar los sistemas de archivos del disco antes de realizar las operaciones.
|
|
ogUnmountAll $ND 2>/dev/null
|
|
[ -n "$CACHESIZE" ] && ogUnmountCache 2>/dev/null
|
|
|
|
# Si la tabla de particiones no es valida, volver a generarla.
|
|
[ $(parted -s $DISK print >/dev/null) ] || fdisk $DISK <<< "w"
|
|
# Definir particiones y notificar al kernel.
|
|
sfdisk -f $DISK < $tmpsfdisk 2>/dev/null && partprobe $DISK
|
|
rm -f $tmpsfdisk
|
|
[ -n "$CACHESIZE" ] && ogMountCache 2>/dev/null
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogDevToDisk path_device
|
|
#@brief Devuelve el nº de orden de dicso (y partición) correspondiente al nombre de fichero de dispositivo.
|
|
#@param path_device Camino del fichero de dispositivo.
|
|
#@return int_ndisk (para dispositivo de disco)
|
|
#@return int_ndisk int_npartition (para dispositivo de partición).
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@exception OG_ERR_NOTFOUND Dispositivo no detectado.
|
|
#@note Requisitos: awk
|
|
#@version 0.1 - Integracion para Opengnsys - EAC: DiskEAC() en ATA.lib
|
|
#@author Antonio J. Doblas Viso, Universidad de Malaga
|
|
#@date 2008/10/27
|
|
#@version 0.9 - Primera version para OpenGNSys
|
|
#@author Ramon Gomez, ETSII Universidad Sevilla
|
|
#@date 2009/07/20
|
|
#*/ ##
|
|
function ogDevToDisk ()
|
|
{
|
|
# Variables locales.
|
|
local d n
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME path_device" \
|
|
"$FUNCNAME /dev/sda => 1 1"
|
|
return
|
|
fi
|
|
|
|
# Error si no se recibe 1 parámetro.
|
|
[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
|
|
# Error si no es fichero de bloques.
|
|
[ -b "$1" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $?
|
|
|
|
# Procesa todos los discos para devolver su nº de orden y de partición.
|
|
n=1
|
|
for d in $(ogDiskToDev); do
|
|
[ -n "$(echo $1 | grep $d)" ] && echo "$n ${1#$d}" && return
|
|
n=$[n+1]
|
|
done
|
|
ogRaiseError $OG_ERR_NOTFOUND "$1"
|
|
return $OG_ERR_NOTFOUND
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogDiskToDev [int_ndisk [int_npartition]]
|
|
#@brief Devuelve la equivalencia entre el nº de orden del dispositivo (dicso o partición) y el nombre de fichero de dispositivo correspondiente.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@param int_npartition nº de orden de la partición
|
|
#@return Para 0 parametros: Devuelve los nombres de ficheros de los dispositivos sata/ata/usb linux encontrados.
|
|
#@return Para 1 parametros: Devuelve la ruta del disco duro indicado.
|
|
#@return Para 2 parametros: Devuelve la ruta de la particion indicada.
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@exception OG_ERR_NOTFOUND Dispositivo no detectado.
|
|
#@note Requisitos: awk, lvm
|
|
#@version 0.1 - Integracion para Opengnsys - EAC: Disk() en ATA.lib; HIDRA: DetectarDiscos.sh
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@Date 2008/06/19
|
|
#@author Antonio J. Doblas Viso, Universidad de Malaga
|
|
#@date 2008/10/27
|
|
#@version 0.9 - Primera version para OpenGNSys
|
|
#@author Ramon Gomez, ETSII Universidad Sevilla
|
|
#@date 2009-07-20
|
|
#*/ ##
|
|
function ogDiskToDev ()
|
|
{
|
|
# Variables locales
|
|
local ALLDISKS VOLGROUPS DISK PART
|
|
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk [int_npartition]" \
|
|
"$FUNCNAME => /dev/sda /dev/sdb" \
|
|
"$FUNCNAME 1 => /dev/sda" \
|
|
"$FUNCNAME 1 1 => /dev/sda1"
|
|
return
|
|
fi
|
|
|
|
# Listar dispositivo para los discos duros (tipos: 3=hd, 8=sd).
|
|
ALLDISKS=$(awk '($1==3 || $1==8) && $4!~/[0-9]/ {printf "/dev/%s ",$4}' /proc/partitions)
|
|
VOLGROUPS=$(vgs -a --noheadings 2>/dev/null | awk '{printf "/dev/%s ",$1}')
|
|
ALLDISKS="$ALLDISKS $VOLGROUPS"
|
|
|
|
# Mostrar salidas segun el número de parametros.
|
|
case $# in
|
|
0) # Muestra todos los discos, separados por espacios.
|
|
echo $ALLDISKS
|
|
;;
|
|
1) # Error si el parámetro no es un digito.
|
|
[ -z "${1/[1-9]/}" ] || ogRaiseError $OG_ERR_FORMAT || return $?
|
|
DISK=$(echo "$ALLDISKS" | awk -v n=$1 '{print $n}')
|
|
# Error si el fichero no existe.
|
|
[ -e "$DISK" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $?
|
|
echo "$DISK"
|
|
;;
|
|
2) # Error si los 2 parámetros no son digitos.
|
|
[ -z "${1/[1-9]/}" -a -z "${2/[1-9]/}" ] || ogRaiseError $OG_ERR_FORMAT|| return $?
|
|
DISK=$(echo "$ALLDISKS" | awk -v n=$1 '{print $n}')
|
|
[ -e "$DISK" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $?
|
|
PART="$DISK$2"
|
|
# Comprobar si es partición.
|
|
if [ -b "$PART" ]; then
|
|
echo "$PART"
|
|
elif [ -n "$VOLGROUPS" ]; then
|
|
# Comprobar si volumen lógico. /* (comentario Doxygen)
|
|
PART=$(lvscan -a 2>/dev/null | grep "'$DISK/" | awk -v n=$2 -F\' '{if (NR==n) print $2}')
|
|
[ -e "$PART" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2" || return $?
|
|
# (comentario Doxygen) */
|
|
echo "$PART"
|
|
else
|
|
ogRaiseError $OG_ERR_NOTFOUND "$1 $2" || return $?
|
|
fi
|
|
;;
|
|
*) # Formato erroneo.
|
|
ogRaiseError $OG_ERR_FORMAT
|
|
return $OG_ERR_FORMAT
|
|
;;
|
|
esac
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogFsToId str_fstype
|
|
#@brief Devuelve el identificador de partición correspondiente a un tipo de sistema de archivos.
|
|
#@param str_fstype mnemónico de tipo de sistema de archivos
|
|
#@return int_idpart nº identificador de tipo de partición.
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@version 0.1 - Integracion para Opengnsys - EAC: TypeFS () en ATA.lib
|
|
#@author Antonio J. Doblas Viso, Universidad de Malaga
|
|
#@date 2008/10/27
|
|
#@version 0.9 - Primera version para OpenGNSys
|
|
#@author Ramon Gomez, ETSII Universidad Sevilla
|
|
#@date 2009-12-14
|
|
#*/ ##
|
|
function ogFsToId ()
|
|
{
|
|
# Variables locales
|
|
local ID
|
|
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME str_fstype" "$FUNCNAME EXT3 => 83"
|
|
return
|
|
fi
|
|
# Error si no se recibe 1 parámetro.
|
|
[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
|
|
|
|
# Asociar id. de partición para su mnemónico de sistema de archivos.
|
|
case "$1" in
|
|
EMPTY) ID=0 ;;
|
|
FAT12) ID=1 ;;
|
|
EXTENDED) ID=5 ;;
|
|
FAT16) ID=6 ;;
|
|
NTFS|EXFAT) ID=7 ;;
|
|
FAT32) ID=b ;;
|
|
HFAT12) ID=11 ;;
|
|
HFAT16) ID=16 ;;
|
|
HNTFS) ID=17 ;;
|
|
HFAT32) ID=1b ;;
|
|
LINUX-SWAP) ID=82 ;;
|
|
EXT[234]|REISERFS|REISER4|XFS|JFS)
|
|
ID=83 ;;
|
|
LINUX-LVM) ID=8e ;;
|
|
SOLARIS) ID=bf ;;
|
|
CACHE) ID=ca ;;
|
|
LINUX-RAID) ID=fd ;;
|
|
*) ID="" ;;
|
|
esac
|
|
echo $ID
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogGetDiskSize int_ndisk
|
|
#@brief Muestra el tamaño en KB de un disco.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@return int_size - Tamaño en KB del disco.
|
|
#@exception OG_ERR_FORMAT formato incorrecto.
|
|
#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
|
|
#@note Requisitos: sfdisk, awk
|
|
#@version 0.9.2 - Primera version para OpenGnSys
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2010/09/15
|
|
#*/ ##
|
|
function ogGetDiskSize ()
|
|
{
|
|
# Variables locales.
|
|
local DISK
|
|
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" \ "$FUNCNAME 1 => 244198584"
|
|
return
|
|
fi
|
|
# Error si no se recibe 1 parámetro.
|
|
[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
|
|
|
|
# Obtener el tamaño de la partición.
|
|
DISK="$(ogDiskToDev $1)" || return $?
|
|
sfdisk -s $DISK
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogGetPartitionActive int_ndisk
|
|
#@brief Muestra que particion de un disco esta marcada como de activa.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@return int_npart Nº de partición activa
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
|
|
#@note Requisitos: parted
|
|
#@todo Queda definir formato para atributos (arranque, oculta, ...).
|
|
#@version 0.9 - Primera version compatible con OpenGNSys.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2009/09/17
|
|
#*/ ##
|
|
function ogGetPartitionActive ()
|
|
{
|
|
# Variables locales
|
|
local DISK
|
|
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" "$FUNCNAME 1 => 1"
|
|
return
|
|
fi
|
|
# Error si no se recibe 1 parámetro.
|
|
[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
|
|
|
|
# Comprobar que el disco existe y listar su partición activa.
|
|
DISK="$(ogDiskToDev $1)" || return $?
|
|
parted $DISK print 2>/dev/null | awk '/boot/ {print $1}'
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogGetPartitionId int_ndisk int_npartition
|
|
#@brief Devuelve el mnemonico con el tipo de sistema de archivos.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@param int_npartition nº de orden de la partición
|
|
#@return Identificador de tipo de partición.
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
|
|
#@note Requisitos: sfdisk
|
|
#@version 0.9 - Primera versión compatible con OpenGNSys.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 25/03/2009
|
|
#*/ ##
|
|
function ogGetPartitionId ()
|
|
{
|
|
# Variables locales.
|
|
local DISK PART
|
|
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
|
|
"$FUNCNAME 1 1 => 7"
|
|
return
|
|
fi
|
|
# Error si no se reciben 2 parámetros.
|
|
[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
|
|
|
|
# Detectar id. de tipo de particion y codificar al mnemonico.
|
|
DISK=$(ogDiskToDev $1) || return $?
|
|
PART=$(ogDiskToDev $1 $2) || return $?
|
|
echo $(sfdisk --id $DISK $2 2>/dev/null)
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogGetPartitionSize int_ndisk int_npartition
|
|
#@brief Muestra el tamano en KB de una particion determinada.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@param int_npartition nº de orden de la partición
|
|
#@return int_partsize - Tamaño en KB de la partición.
|
|
#@exception OG_ERR_FORMAT formato incorrecto.
|
|
#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
|
|
#@note Requisitos: sfdisk, awk
|
|
#@version 0.1 - Integracion para Opengnsys - EAC: SizePartition () en ATA.lib
|
|
#@author Antonio J. Doblas Viso, Universidad de Malaga
|
|
#@date 2008/10/27
|
|
#@version 0.9 - Primera version para OpenGNSys
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2009/07/24
|
|
#*/ ##
|
|
function ogGetPartitionSize ()
|
|
{
|
|
# Variables locales.
|
|
local DISK PART
|
|
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
|
|
"$FUNCNAME 1 1 => 10000000"
|
|
return
|
|
fi
|
|
# Error si no se reciben 2 parámetros.
|
|
[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
|
|
|
|
# Obtener el tamaño de la partición.
|
|
DISK="$(ogDiskToDev $1)" || return $?
|
|
PART="$(ogDiskToDev $1 $2)" || return $?
|
|
case "$(ogGetPartitionId $1 $2)" in
|
|
5|f) # Procesar detección de tamaño de partición Extendida.
|
|
sfdisk -l $DISK 2>/dev/null | \
|
|
awk -v p=$PART '{if ($1==p) {sub (/\*/,""); print $5} }'
|
|
;;
|
|
*) sfdisk -s $PART
|
|
;;
|
|
esac
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogListPartitions int_ndisk
|
|
#@brief Lista las particiones definidas en un disco.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@return str_parttype:int_partsize ...
|
|
#@exception OG_ERR_FORMAT formato incorrecto.
|
|
#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
|
|
#@note Requisitos: \c parted \c awk
|
|
#@attention El nº de partición se indica por el orden de los párametros \c parttype:partsize
|
|
#@attention Las tuplas de valores están separadas por espacios.
|
|
#@version 0.9 - Primera versión para OpenGNSys
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2009/07/24
|
|
#*/ ##
|
|
function ogListPartitions ()
|
|
{
|
|
# Variables locales.
|
|
local DISK PART NPARTS TYPE SIZE
|
|
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" \
|
|
"$FUNCNAME 1 => NTFS:10000000 EXT3:5000000 LINUX-SWAP:1000000"
|
|
return
|
|
fi
|
|
# Error si no se recibe 1 parámetro.
|
|
[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT "$FORMAT" || return $?
|
|
|
|
# Procesar la salida de \c parted .
|
|
DISK="$(ogDiskToDev $1)" || return $?
|
|
NPARTS=$(ogGetPartitionsNumber $1)
|
|
for (( PART = 1; PART <= NPARTS; PART++ )); do
|
|
TYPE=$(ogGetFsType $1 $PART 2>/dev/null)
|
|
if [ $? -eq 0 ]; then
|
|
SIZE=$(ogGetPartitionSize $1 $PART 2>/dev/null)
|
|
echo -n "$TYPE:$SIZE "
|
|
else
|
|
echo -n "EMPTY:0 "
|
|
fi
|
|
done
|
|
echo
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogListPrimaryPartitions int_ndisk
|
|
#@brief Metafunción que lista las particiones primarias no vacías definidas en un disco.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@see ogListPartitions
|
|
#*/ ##
|
|
function ogListPrimaryPartitions ()
|
|
{
|
|
# Variables locales.
|
|
local PARTS
|
|
|
|
PARTS=$(ogListPartitions "$@") || return $?
|
|
echo $PARTS | cut -sf1-4 -d" " | sed 's/\( EMPTY:0\)*$//'
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogListLogicalPartitions int_ndisk
|
|
#@brief Metafunción que lista las particiones lógicas definidas en un disco.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@see ogListPartitions
|
|
#*/ ##
|
|
function ogListLogicalPartitions ()
|
|
{
|
|
# Variables locales.
|
|
local PARTS
|
|
|
|
PARTS=$(ogListPartitions "$@") || return $?
|
|
echo $PARTS | cut -sf5- -d" "
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogSetPartitionActive int_ndisk int_npartition
|
|
#@brief Establece cual es la partición activa de un disco.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@param int_npartition nº de orden de la partición
|
|
#@return (nada).
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositivo.
|
|
#@note Requisitos: parted
|
|
#@version 0.1 - Integracion para Opengnsys - EAC: SetPartitionActive() en ATA.lib
|
|
#@author Antonio J. Doblas Viso, Universidad de Malaga
|
|
#@date 2008/10/27
|
|
#@version 0.9 - Primera version compatible con OpenGNSys.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2009/09/17
|
|
#*/ ##
|
|
function ogSetPartitionActive ()
|
|
{
|
|
# Variables locales
|
|
local DISK PART
|
|
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
|
|
"$FUNCNAME 1 1"
|
|
return
|
|
fi
|
|
# Error si no se reciben 2 parámetros.
|
|
[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
|
|
|
|
# Comprobar que el disco existe y activar la partición indicada.
|
|
DISK="$(ogDiskToDev $1)" || return $?
|
|
PART="$(ogDiskToDev $1 $2)" || return $?
|
|
parted -s $DISK set $2 boot on 2>/dev/null
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogSetPartitionSize int_ndisk int_npartition int_size
|
|
#@brief Muestra el tamano en KB de una particion determinada.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@param int_npartition nº de orden de la partición
|
|
#@param int_size tamaño de la partición (en KB)
|
|
#@return (nada)
|
|
#@exception OG_ERR_FORMAT formato incorrecto.
|
|
#@exception OG_ERR_NOTFOUND disco o particion no detectado (no es un dispositivo).
|
|
#@note Requisitos: sfdisk, awk
|
|
#@todo Compruebar que el tamaño sea numérico positivo y evitar que pueda solaparse con la siguiente partición.
|
|
#@version 0.9 - Primera versión para OpenGNSys
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2009/07/24
|
|
#*/ ##
|
|
function ogSetPartitionSize ()
|
|
{
|
|
# Variables locales.
|
|
local DISK PART SIZE
|
|
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition int_size" \
|
|
"$FUNCNAME 1 1 10000000"
|
|
return
|
|
fi
|
|
# Error si no se reciben 3 parámetros.
|
|
[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
|
|
|
|
# Obtener el tamaño de la partición.
|
|
DISK="$(ogDiskToDev $1)" || return $?
|
|
PART="$(ogDiskToDev $1 $2)" || return $?
|
|
# Convertir tamaño en KB a sectores de 512 B.
|
|
SIZE=$[$3*2] || ogRaiseError $OG_ERR_FORMAT || return $?
|
|
# Usar \c sfdisk para redefinir el tamaño.
|
|
sfdisk -f -uS -N$2 $DISK <<< ",$SIZE" &>/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
|
|
partprobe 2>/dev/null
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogUpdatePartitionTable
|
|
#@brief Fuerza al kernel releer la tabla de particiones de los discos duros
|
|
#@param no requiere
|
|
#@return informacion propia de la herramienta
|
|
#@note Requisitos: \c partprobe
|
|
#@warning pendiente estructurar la funcion a opengnsys
|
|
#@version 0.1 - Integracion para Opengnsys - EAC: UpdatePartitionTable() en ATA.lib
|
|
#@author Antonio J. Doblas Viso. Universidad de Malaga
|
|
#@date 27/10/2008
|
|
#*/
|
|
|
|
function ogUpdatePartitionTable ()
|
|
{
|
|
for i in `ogDiskToDev`
|
|
do
|
|
partprobe $i
|
|
done
|
|
}
|
|
|
|
|
|
|
|
#/** @function ogGetPartitionsNumber: @brief detecta el numero de particiones del disco duro indicado.
|
|
#@param int_numdisk (indentificado EAC del disco)
|
|
#@return devuelve el numero paritiones del disco duro indicado
|
|
#@warning Salidas de errores no determinada
|
|
#@attention Requisitos: parted
|
|
#@note Notas sin especificar
|
|
#@version 0.1 - Integracion para Opengnsys - EAC: DetectNumberPartition () en ATA.lib
|
|
#@author Antonio J. Doblas Viso. Universidad de Malaga
|
|
#@date Date: 27/10/2008
|
|
#@version 1.0 - Uso de sfdisk Primera version para OpenGnSys
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2009/07/24
|
|
#*/
|
|
function ogGetPartitionsNumber () {
|
|
#local disco totalpart
|
|
#disco=`ogDiskToDev $1`
|
|
#totalpart=`parted $disco print | egrep ^" [0123456789] " -c`
|
|
#echo $totalpart
|
|
local DISK
|
|
#/// Contar el nº de veces que aparece el disco en su lista de particiones.
|
|
DISK=$(ogDiskToDev $1) 2>/dev/null
|
|
sfdisk -l $DISK 2>/dev/null | grep -c "^$DISK"
|
|
}
|
|
|
|
|
|
#/** @function ogDiskToRelativeDev: @brief Traduce los ID de discos o particiones EAC a ID Linux relativos, es decir 1 1 => sda1
|
|
#@param Admite 1 parametro: $1 int_numdisk
|
|
#@param Admite 2 parametro: $1 int_numdisk $2 int_partition
|
|
#@return Para 1 parametros traduce Discos Duros: Devuelve la ruta relativa linux del disco duro indicado con nomenclatura EAC.........ejemplo: IdPartition 1 => sda
|
|
#@return Para 2 parametros traduce Particiones: Devuelve la ruta relativa linux de la particion indicado con nomenclatura EAC........... ejemplo: IdPartition 2 1 => sdb1
|
|
#@warning No definidas
|
|
#@attention
|
|
#@note Notas sin especificar
|
|
#@version 0.1 - Integracion para Opengnsys - EAC: IdPartition en ATA.lib
|
|
#@author Antonio J. Doblas Viso. Universidad de Malaga
|
|
#@date 27/10/2008
|
|
#*/
|
|
function ogDiskToRelativeDev () {
|
|
if [ $# = 0 ]
|
|
then
|
|
Msg "Info: Traduce el identificador del dispositivo EAC a dispositivo linux \n" info
|
|
Msg "Sintaxis1: IdPartition int_disk -----------------Ejemplo1: IdPartition 1 -> sda " example
|
|
Msg "Sintaxis2: IdPartition int_disk int_partition --Ejemplo2: IdPartition 1 2 -> sda2 " example
|
|
|
|
return
|
|
fi
|
|
#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.
|
|
PART=$(ogDiskToDev|cut -f$1 -d' ')$2
|
|
echo $PART | cut -f3 -d \/
|
|
}
|
|
|
|
#/** @function ogDeletePartitionTable: @brief Borra la tabla de particiones del disco.
|
|
#@param $1 opcion A (identificador LINUX) str_ID_linux (/dev/sda)
|
|
#@param $1 opcion B (Identifiador EAC) int_numdiskEAC(1)
|
|
#@return la informacion propia del fdisk
|
|
#@warning no definidos
|
|
#@attention
|
|
#@note
|
|
#@version 0.1 - Integracion para Opengnsys - EAC: DeletePartitionTable () en ATA.lib
|
|
#@author Antonio J. Doblas Viso. Universidad de Malaga
|
|
#@date 27/10/2008
|
|
#*/
|
|
function ogDeletePartitionTable () {
|
|
if [ $# = 0 ]
|
|
then
|
|
Msg "sintaxis1: ogDeletePartitionTable int_disk" red
|
|
Msg "sintaxis2: ogDeletePartitionTable str_/dev/sdX" red
|
|
return
|
|
fi
|
|
if [ -n "${1%/dev/*}" ]
|
|
then
|
|
dev=`DiskToDev $1`
|
|
else
|
|
dev=$1
|
|
fi
|
|
echo -ne "o\nw" | fdisk $dev
|
|
}
|
|
|
|
|
|
#/** @function ogSetPartitionId: @brief Cambia el identificador de la particion, pero no su sistema de archivos.
|
|
#@param $1 int_numdiskEAC
|
|
#@param $2 int_numpartitionEAC
|
|
#@param $3 str_tipoPartition admite EXT2 EXT3 NTFS FAT32 SWAP CACHE
|
|
#@return la propia del fdisk
|
|
#@warning no controla los parametros, si se introducen mal o simplemente no se introducen no muestra mensaje
|
|
#@warning Identifica por nombre del sistema de archivos no por número
|
|
#@attention Requisitos: fdisk
|
|
#@note
|
|
#@version 0.1 - Integracion para Opengnsys - SetPartitionType() en ATA.lib
|
|
#@author Antonio J. Doblas Viso. Universidad de Malaga
|
|
#@date 27/10/2008
|
|
#*/
|
|
function ogSetPartitionId() {
|
|
# Variables locales
|
|
local DISK PART ID
|
|
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition str_type" \
|
|
"$FUNCNAME 1 1 NTFS"
|
|
return
|
|
fi
|
|
# Error si no se reciben 3 parámetros.
|
|
[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
|
|
|
|
# Sustituye nº de disco por su dispositivo.
|
|
DISK=`ogDiskToDev $1` || return $?
|
|
PART=`ogDiskToDev $1 $2` || return $?
|
|
|
|
# Elección del tipo de partición.
|
|
ID=$(ogFsToId "$3")
|
|
[ -n "$ID" ] || ogRaiseError $OG_ERR_PARTITION "$3" || return $?
|
|
|
|
echo -ne "t\n$2\n${ID}\nw\n" | fdisk $DISK 1>/dev/null 2>&1
|
|
}
|
|
|
|
|
|
#/** @function ogDeletePartitionsLabels: @brief Elimina la informacion que tiene el kernel del cliente og sobre los labels de los sistemas de archivos
|
|
#@param No requiere
|
|
#@return Nada
|
|
#@warning
|
|
#@attention Requisitos: comando interno linux rm
|
|
#@note
|
|
#@version 0.1 - Integracion para Opengnsys - EAC: DeletePartitionTable() en ATA.lib
|
|
#@author Antonio J. Doblas Viso. Universidad de Malaga
|
|
#@date 27/10/2008
|
|
#*/
|
|
function ogDeletePartitionsLabels () {
|
|
rm /dev/disk/by-label/* # */ COMENTARIO OBLIGATORIO PARA DOXYGEN
|
|
}
|
|
|