1206 lines
39 KiB
Bash
1206 lines
39 KiB
Bash
#!/bin/bash
|
|
#/**
|
|
#@file FileSystem.lib
|
|
#@brief Librería o clase FileSystem
|
|
#@class FileSystem
|
|
#@brief Funciones para gestión de sistemas de archivos.
|
|
#@version 1.1.0
|
|
#@warning License: GNU GPLv3+
|
|
#*/
|
|
|
|
|
|
#/**
|
|
# ogCheckFs int_ndisk int_nfilesys
|
|
#@brief Comprueba el estado de un sistema de archivos.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@param int_nfilesys nº de orden del sistema de archivos
|
|
#@return (nada)
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
|
|
#@exception OG_ERR_PARTITION Partición desconocida o no accesible.
|
|
#@note Requisitos: *fsck*
|
|
#@warning No se comprueban sistemas de archivos montados o bloqueados.
|
|
#@todo Definir salidas.
|
|
#@version 0.9 - Primera adaptación para OpenGnSys.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2009-10-07
|
|
#@version 1.0.2 - Ignorar códigos de salida de comprobación (no erróneos).
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2011-09-23
|
|
#@version 1.0.4 - Soportar HFS/HFS+.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2012-05-21
|
|
#@version 1.0.5 - Desmontar antes de comprobar, soportar Btrfs y ExFAT.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2012-09-05
|
|
#@version 1.1.0 - Soportar F2FS.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2016-05-03
|
|
#*/ ##
|
|
function ogCheckFs ()
|
|
{
|
|
# Variables locales.
|
|
local PART TYPE PROG PARAMS CODES ERRCODE
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
|
|
"$FUNCNAME 1 1"
|
|
return
|
|
fi
|
|
|
|
# Error si no se reciben 2 parámetros.
|
|
[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
|
|
# Obtener partición.
|
|
PART="$(ogDiskToDev $1 $2)" || return $?
|
|
|
|
TYPE=$(ogGetFsType $1 $2)
|
|
case "$TYPE" in
|
|
EXT[234]|CACHE) PROG="e2fsck"; PARAMS="-y"; CODES=(1 2) ;;
|
|
BTRFS) PROG="btrfsck"; CODES=(1) ;;
|
|
REISERFS) PROG="fsck.reiserfs"; PARAMS="<<<\"Yes\""; CODES=(1 2) ;;
|
|
REISER4) PROG="fsck.reiser4"; PARAMS="-ay" ;;
|
|
JFS) PROG="fsck.jfs"; CODES=(1 2) ;;
|
|
XFS) PROG="xfs_repair" ;;
|
|
F2FS) PROG="fsck.f2fs" ;;
|
|
NTFS) PROG="ntfsfix" ;;
|
|
EXFAT) PROG="fsck.exfat" ;;
|
|
FAT32) PROG="dosfsck"; PARAMS="-a"; CODES=(1) ;;
|
|
FAT16) PROG="dosfsck"; PARAMS="-a"; CODES=(1) ;;
|
|
FAT12) PROG="dosfsck"; PARAMS="-a"; CODES=(1) ;;
|
|
HFS) PROG="fsck.hfs"; PARAMS="-f" ;;
|
|
HFSPLUS) PROG="fsck.hfs"; PARAMS="-f" ;;
|
|
UFS) PROG="fsck.ufs" ;;
|
|
ZFS) PROG="fsck.zfs" ;;
|
|
*) ogRaiseError $OG_ERR_PARTITION "$1, $2, $TYPE"
|
|
return $? ;;
|
|
esac
|
|
# Error si el sistema de archivos esta montado o bloqueado.
|
|
ogUnmount $1 $2
|
|
if ogIsMounted $1 $2; then
|
|
ogRaiseError $OG_ERR_PARTITION "$1 $2" # Indicar nuevo error
|
|
return $?
|
|
fi
|
|
if ogIsLocked $1 $2; then
|
|
ogRaiseError $OG_ERR_LOCKED "$1 $2"
|
|
return $?
|
|
fi
|
|
# Comprobar en modo uso exclusivo.
|
|
ogLock $1 $2
|
|
trap "ogUnlock $1 $2" 1 2 3 6 9
|
|
eval $PROG $PARAMS $PART
|
|
ERRCODE=$?
|
|
case $ERRCODE in
|
|
0|${CODES[*]})
|
|
ERRCODE=0 ;;
|
|
127) ogRaiseError $OG_ERR_NOTEXEC "$PROG"
|
|
ERRCODE=$OG_ERR_NOTEXEC ;;
|
|
*) ogRaiseError $OG_ERR_PARTITION "$1 $2"
|
|
ERRCODE=$OG_ERR_PARTITION ;;
|
|
esac
|
|
ogUnlock $1 $2
|
|
return $ERRCODE
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogExtendFs int_ndisk int_nfilesys
|
|
#@brief Extiende un sistema de archivos al tamaño de su partición.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@param int_nfilesys nº de orden del sistema de archivos
|
|
#@return (nada)
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
|
|
#@exception OG_ERR_PARTITION Partición desconocida o no accesible.
|
|
#@note Requisitos: *resize*
|
|
#@version 0.1 - Integracion para Opengnsys - EAC: EnlargeFileSystem() en ATA.lib
|
|
#@author Antonio J. Doblas Viso. Universidad de Malaga
|
|
#@date 2008-10-27
|
|
#@version 0.9 - Primera adaptacion para OpenGnSys.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2009-09-23
|
|
#@version 1.0.5 - Soporte para BTRFS.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2012-06-28
|
|
#*/ ##
|
|
function ogExtendFs ()
|
|
{
|
|
# Variables locales.
|
|
local PART TYPE PROG PARAMS ERRCODE DOMOUNT
|
|
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
|
|
"$FUNCNAME 1 1"
|
|
return
|
|
fi
|
|
# Error si no se reciben 2 parámetros.
|
|
[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
|
|
|
|
# Obtener partición.
|
|
PART="$(ogDiskToDev $1 $2)" || return $?
|
|
|
|
# Redimensionar al tamano máximo según el tipo de partición.
|
|
TYPE=$(ogGetFsType $1 $2)
|
|
case "$TYPE" in
|
|
EXT[234]) PROG="resize2fs"; PARAMS="-f" ;;
|
|
BTRFS) PROG="btrfs"; PARAMS="filesystem resize max"
|
|
DOMOUNT=1 # Debe estar montado.
|
|
;;
|
|
REISERFS|REISER4)
|
|
PROG="resize_reiserfs"; PARAMS="-f" ;;
|
|
F2FS) ;; # No se reduce (por el momento).
|
|
JFS) ;; # No se reduce (por el momento).
|
|
NILFS2) ;; # No se reduce (probar "nilfs-resize").
|
|
XFS) ;; # No se reduce (por el momento).
|
|
NTFS) PROG="ntfsresize"; PARAMS="<<<\"y\" -f" ;;
|
|
EXFAT) ;; # No se reduce (por el momento).
|
|
FAT32|FAT16) ;; # No se reduce (probar "fatresize").
|
|
HFS|HFSPLUS) ;; # No se reduce (por el momento).
|
|
UFS) ;; # No se reduce (por el momento).
|
|
*) ogRaiseError $OG_ERR_PARTITION "$1 $2 $TYPE"
|
|
return $? ;;
|
|
esac
|
|
# Salida normal si no se va a aplicar la operación.
|
|
[ -z "$PROG" ] && return
|
|
# Error si el sistema de archivos no se queda en el estado de montaje adecuado.
|
|
if [ "$DOMOUNT" ]; then
|
|
PART=$(ogMount $1 $2) || return $? # Indicar nuevo error
|
|
else
|
|
ogUnmount $1 $2 2>/dev/null
|
|
if ogIsMounted $1 $2; then
|
|
ogRaiseError $OG_ERR_PARTITION "$1 $2" # Indicar nuevo error
|
|
return $?
|
|
fi
|
|
fi
|
|
# Error si el sistema de archivos está bloqueado.
|
|
if ogIsLocked $1 $2; then
|
|
ogRaiseError $OG_ERR_LOCKED "$1 $2"
|
|
return $?
|
|
fi
|
|
# Redimensionar en modo uso exclusivo.
|
|
ogLock $1 $2
|
|
trap "ogUnlock $1 $2" 1 2 3 6 9
|
|
eval $PROG $PARAMS $PART &>/dev/null
|
|
ERRCODE=$?
|
|
case $ERRCODE in
|
|
0) ;;
|
|
127) ogRaiseError $OG_ERR_NOTEXEC "$PROG"
|
|
ERRCODE=$OG_ERR_NOTEXEC ;;
|
|
*) ogRaiseError $OG_ERR_PARTITION "$1 $2"
|
|
ERRCODE=$OG_ERR_PARTITION ;;
|
|
esac
|
|
ogUnlock $1 $2
|
|
return $ERRCODE
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogFormat int_ndisk int_nfilesys | CACHE
|
|
#@see ogFormatFs ogFormatCache
|
|
#*/ ##
|
|
function ogFormat ()
|
|
{
|
|
case "$*" in
|
|
CACHE|cache) ogFormatCache ;;
|
|
*) ogFormatFs "$@" ;;
|
|
esac
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogFormatFs int_ndisk int_nfilesys [type_fstype] [str_label]
|
|
#@brief Formatea un sistema de ficheros según el tipo de su partición.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@param int_nfilesys nº de orden del sistema de archivos
|
|
#@param type_fstype mnemónico de sistema de ficheros a formatear (opcional al reformatear)
|
|
#@param str_label etiqueta de volumen (opcional)
|
|
#@return (por determinar)
|
|
#@exception OG_ERR_FORMAT Formato de ejecución incorrecto.
|
|
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
|
|
#@exception OG_ERR_PARTITION Partición no accesible o desconocida.
|
|
#@note Requisitos: mkfs*
|
|
#@warning No formatea particiones montadas ni bloqueadas.
|
|
#@todo Definir salidas.
|
|
#@version 0.9 - Primera versión para OpenGnSys.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2009-10-08
|
|
#@version 1.0.4 - Solucionado error cuando no se detecta tipo de sistema de ficheros pero si se indica.
|
|
#@author Universidad de Huelva
|
|
#@date 2012-04-11
|
|
#@version 1.0.5 - Comprobar errores al inicio e independizar del tipo de tabla de particiones.
|
|
#@author Universidad de Huelva
|
|
#@date 2013-05-16
|
|
#@version 1.1.0 - Soportar F2FS y NILFS.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2016-05-03
|
|
#*/ ##
|
|
function ogFormatFs ()
|
|
{
|
|
# Variables locales
|
|
local PART ID TYPE LABEL PROG PARAMS LABELPARAM ERRCODE
|
|
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys [str_label]" \
|
|
"$FUNCNAME 1 1" \
|
|
"$FUNCNAME 1 1 EXT4" \
|
|
"$FUNCNAME 1 1 \"DATA\"" \
|
|
"$FUNCNAME 1 1 EXT4 \"DATA\""
|
|
return
|
|
fi
|
|
# Error si no se reciben entre 2 y 4 parámetros.
|
|
[ $# -ge 2 -a $# -le 4 ] || ogRaiseError $OG_ERR_FORMAT || return $?
|
|
# Obtener fichero de dispositivo.
|
|
PART="$(ogDiskToDev $1 $2)" || return $?
|
|
# Error si la partición está montada o bloqueada.
|
|
if ogIsMounted $1 $2; then
|
|
ogRaiseError $OG_ERR_DONTFORMAT "$MSG_MOUNT: $1 $2"
|
|
return $?
|
|
fi
|
|
if ogIsLocked $1 $2; then
|
|
ogRaiseError $OG_ERR_LOCKED "$1 $2"
|
|
return $?
|
|
fi
|
|
# Si no se indica el tipo de sisitema de archivos, intentar obtenerlo.
|
|
TYPE="${3:-$(ogGetFsType $1 $2)}"
|
|
# Error, si no especifica el tipo de sistema de archivos a formatear.
|
|
[ -n "$TYPE" ] || ogRaiseError $OG_ERR_FORMAT "$1 $2 ..." || return $?
|
|
|
|
# Elegir tipo de formato.
|
|
case "$TYPE" in
|
|
EXT2) PROG="mkfs.ext2"; PARAMS="-F" ;;
|
|
EXT3) PROG="mkfs.ext3"; PARAMS="-F" ;;
|
|
EXT4) PROG="mkfs.ext4"; PARAMS="-F" ;;
|
|
BTRFS) PROG="mkfs.btrfs"; PARAMS="-f" ;;
|
|
REISERFS) PROG="mkfs.reiserfs"; PARAMS="-f"; LABELPARAM="-l" ;;
|
|
REISER4) PROG="mkfs.reiser4"; PARAMS="-f <<<\"y\"" ;;
|
|
XFS) PROG="mkfs.xfs"; PARAMS="-f" ;;
|
|
JFS) PROG="mkfs.jfs"; PARAMS="<<<\"y\"" ;;
|
|
F2FS) PROG="mkfs.f2fs"; LABELPARAM="-l" ;;
|
|
NILFS2) PROG="mkfs.nilfs2"; PARAMS="-f" ;;
|
|
LINUX-SWAP) PROG="mkswap" ;;
|
|
NTFS) PROG="mkntfs"; PARAMS="-f" ;;
|
|
EXFAT) PROG="mkfs.exfat"; LABELPARAM="-n" ;;
|
|
FAT32) PROG="mkdosfs"; PARAMS="-F 32"; LABELPARAM="-n" ;;
|
|
FAT16) PROG="mkdosfs"; PARAMS="-F 16"; LABELPARAM="-n" ;;
|
|
FAT12) PROG="mkdosfs"; PARAMS="-F 12"; LABELPARAM="-n" ;;
|
|
HFS) PROG="mkfs.hfs" ;;
|
|
HFSPLUS) PROG="mkfs.hfsplus"; LABELPARAM="-v" ;;
|
|
UFS) PROG="mkfs.ufs"; PARAMS="-O 2" ;;
|
|
*) ogRaiseError $OG_ERR_PARTITION "$1 $2 $TYPE"
|
|
return $? ;;
|
|
esac
|
|
|
|
# Etiquetas de particion.
|
|
if [ -z "$LABEL" ]; then
|
|
[ "$4" != "CACHE" ] || ogRaiseError $OG_ERR_FORMAT "$MSG_RESERVEDVALUE: CACHE" || return $?
|
|
[ -n "$4" ] && PARAMS="$PARAMS ${LABELPARAM:-"-L"} $4"
|
|
else
|
|
PARAMS="$PARAMS ${LABELPARAM:-"-L"} $LABEL"
|
|
fi
|
|
|
|
# Formatear en modo uso exclusivo (desmontar siempre).
|
|
ogLock $1 $2
|
|
trap "ogUnlock $1 $2" 1 2 3 6 9
|
|
umount $PART 2>/dev/null
|
|
eval $PROG $PARAMS $PART 2>/dev/null
|
|
ERRCODE=$?
|
|
case $ERRCODE in
|
|
0) ;;
|
|
127) ogRaiseError $OG_ERR_NOTEXEC "$PROG" ;;
|
|
*) ogRaiseError $OG_ERR_PARTITION "$1 $2" ;;
|
|
esac
|
|
ogUnlock $1 $2
|
|
return $ERRCODE
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogGetFsSize int_ndisk int_npartition [str_unit]
|
|
#@brief Muestra el tamanio del sistema de archivos indicado, permite definir la unidad de medida, por defecto GB
|
|
#@param int_ndisk nº de orden del disco
|
|
#@param int_npartition nº de orden de la partición
|
|
#@param str_unit unidad (opcional, por defecto: KB)
|
|
#@return float_size - Tamaño del sistema de archivos
|
|
#@note str_unit = { KB, MB, GB, TB }
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositivo.
|
|
#@version 0.1 - Integracion para Opengnsys - EAC: SizeFileSystem() en FileSystem.lib
|
|
#@author Antonio J. Doblas Viso. Universidad de Malaga
|
|
#@date 2008-10-27
|
|
#@version 1.0.4 - Adaptación de las salidas.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2012-06-18
|
|
#*/ ##
|
|
function ogGetFsSize ()
|
|
{
|
|
# Variables locales.
|
|
local MNTDIR UNIT VALUE FACTOR SIZE
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition [str_unit]" \
|
|
"$FUNCNAME 1 1 => 15624188" \
|
|
"$FUNCNAME 1 1 KB => 15624188"
|
|
return
|
|
fi
|
|
# Error si no se reciben 2 o 3 parámetros.
|
|
[ $# == 2 ] || [ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
|
|
# Obtener unidad y factor de medida.
|
|
UNIT="$3"
|
|
UNIT=${UNIT:-"KB"}
|
|
case "$UNIT" in
|
|
[kK]B)
|
|
FACTOR=1 ;;
|
|
MB) FACTOR=1024 ;;
|
|
GB) FACTOR=$[1024*1024] ;;
|
|
TB) FACTOR=$[1024*1024*1024] ;;
|
|
*) ogRaiseError $OG_ERR_FORMAT "$3 != { KB, MB, GB, TB }"
|
|
return $? ;;
|
|
esac
|
|
|
|
# Obtener el tamaño del sistema de archivo (si no está formateado; tamaño = 0).
|
|
MNTDIR="$(ogMount $1 $2 2>/dev/null)"
|
|
if [ -n "$MNTDIR" ]; then
|
|
VALUE=$(df -BK "$MNTDIR" | awk '{getline; print $2}')
|
|
SIZE=$(echo "$VALUE $FACTOR" | awk '{printf "%f\n", $1/$2}')
|
|
else
|
|
SIZE=0
|
|
fi
|
|
# Devolver el tamaño (quitar decimales si son 0).
|
|
echo ${SIZE%.0*}
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogGetFsType int_ndisk int_nfilesys
|
|
#@brief Devuelve el mnemonico con el tipo de sistema de archivos.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@param int_nfilesys nº de orden del sistema de archivos
|
|
#@return Mnemonico
|
|
#@note Mnemonico: { EXT2, EXT3, EXT4, BTRFS, REISERFS, XFS, JFS, FAT12, FAT16, FAT32, NTFS, LINUX-SWAP, LINUX-LVM, LINUX-RAID, HFS, HFSPLUS, CACHE }
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
|
|
#@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 adaptacion para OpenGnSys.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2009-07-21
|
|
#@version 1.0.2 - Obtención de datos reales de sistemas de ficheros.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2011-12-02
|
|
#@version 1.0.5 - Usar "blkid" para detectar tipo de sistema de archivo.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2014-06-10
|
|
#@version 1.1.0 - Detectar volumen ZFS.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2014-11-14
|
|
#*/ ##
|
|
function ogGetFsType ()
|
|
{
|
|
# Variables locales.
|
|
local PART TYPE
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
|
|
"$FUNCNAME 1 1 => NTFS"
|
|
return
|
|
fi
|
|
# Error si no se reciben 2 parámetros.
|
|
[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
|
|
|
|
# Detectar tipo de sistema de archivo (independientemente del tipo de partición).
|
|
PART=$(ogDiskToDev "$1" "$2") || return $?
|
|
if [[ "$PART" =~ ^/ ]]; then
|
|
TYPE=$(blkid -o export $PART | awk -F= '$1~/^TYPE/ { print toupper($2) }')
|
|
else
|
|
zfs mount $PART 2>/dev/null
|
|
TYPE=$(mount | awk "\$1==\"$PART\" { print toupper(\$5) }")
|
|
fi
|
|
|
|
# Componer valores correctos.
|
|
case "$TYPE" in
|
|
EXT4) # Comprobar si es caché o Ext4.
|
|
if [ "$1 $2" == "$(ogFindCache)" ]; then
|
|
ogIsFormated $1 $2 2>/dev/null && TYPE="CACHE"
|
|
fi
|
|
;;
|
|
VFAT) TYPE="$(blkid -po export $PART | awk -F= '$1~/^VERSION$/ { print toupper($2) }')" ;;
|
|
SWAP) TYPE="LINUX-SWAP" ;;
|
|
LVM*) TYPE="LINUX-LVM" ;;
|
|
*RAID*) TYPE="LINUX-RAID" ;;
|
|
ZFS_MEMBER) TYPE="ZVOL" ;;
|
|
*_MEMBER) TYPE="${TYPE/_MEMBER/}" ;;
|
|
esac
|
|
|
|
[ -n "$TYPE" ] && echo "$TYPE"
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogGetMountPoint int_ndisk int_nfilesys
|
|
#@brief Devuelve el punto de montaje de un sistema de archivos.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@param int_nfilesys nº de orden del sistema de archivos
|
|
#@return Punto de montaje
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
|
|
#@note Requisitos: \c mount* \c awk
|
|
#@version 0.9 - Primera versión para OpenGnSys.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2009-10-15
|
|
#@version 1.0.6 - Usar comando findmnt.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2014-09-04
|
|
#*/ ##
|
|
function ogGetMountPoint ()
|
|
{
|
|
# Variables locales
|
|
local PART
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
|
|
"$FUNCNAME 1 1 => /mnt/sda1"
|
|
return
|
|
fi
|
|
# Error si no se reciben 2 parámetros.
|
|
[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
|
|
# Obtener partición.
|
|
PART="$(ogDiskToDev $1 $2)" || return $?
|
|
|
|
# Devolver punto de montaje.
|
|
findmnt -n -o TARGET $PART
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogIsFormated int_ndisk int_nfilesys
|
|
#@brief Comprueba si un sistema de archivos está formateado.
|
|
#@param int_ndisk nº de orden del disco o volumen.
|
|
#@param int_nfilesys nº de orden del sistema de archivos
|
|
#@return Código de salida: 0 - formateado, 1 - sin formato o error.
|
|
#@version 0.91 - Adaptación inicial para comprobar que existe caché.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2010-03-18
|
|
#@version 1.0.1 - Devolver falso en caso de error.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2011-05-18
|
|
#@version 1.0.5 - Dejar de usar "parted".
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2012-09-04
|
|
#@version 1.1.0 - Comprobar sin montar el sistema de ficheros.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2016-01-21
|
|
#*/ ##
|
|
function ogIsFormated ()
|
|
{
|
|
# Variables locales
|
|
local PART
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
|
|
"if $FUNCNAME 1 1; then ... ; fi"
|
|
return
|
|
fi
|
|
# Falso, en caso de error.
|
|
[ $# == 2 ] || return 1
|
|
PART="$(ogDiskToDev $1 $2 2>/dev/null)" || return 1
|
|
|
|
# Revisar tipo de sistema de ficheros.
|
|
if [[ "$PART" =~ ^/ ]]; then
|
|
# Sistemas de ficheros genéricos.
|
|
test -n "$(blkid -s TYPE $PART | egrep -vi "swap|_member")"
|
|
else
|
|
# ZFS.
|
|
test "$(zfs list -Hp -o canmount $PART 2>/dev/null)" = "on"
|
|
fi
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogIsLocked int_ndisk int_npartition
|
|
#@see ogIsPartitionLocked
|
|
#*/
|
|
function ogIsLocked ()
|
|
{
|
|
ogIsPartitionLocked "$@"
|
|
}
|
|
|
|
#/**
|
|
# ogIsPartitionLocked int_ndisk int_npartition
|
|
#@brief Comprueba si una partición o su disco están bloqueados por una operación de uso exclusivo.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@param int_npartition nº de orden de la partición
|
|
#@return Código de salida: 0 - bloqueado, 1 - sin bloquear o error.
|
|
#@note Los ficheros de bloqueo se localizan en \c /var/lock/dev, siendo \c dev el dispositivo de la partición o de su disco, sustituyendo el carácter "/" por "-".
|
|
#@version 0.9 - Primera versión para OpenGnSys.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2009-09-03
|
|
#@version 1.0.1 - Devolver falso en caso de error.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2011-05-18
|
|
#@version 1.1.0 - Comprobar si el disco está también bloqueado.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2016-04-08
|
|
#*/ ##
|
|
function ogIsPartitionLocked ()
|
|
{
|
|
# Variables locales
|
|
local DISK PART LOCKDISK LOCKPART
|
|
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
|
|
"if $FUNCNAME 1 1; then ... ; fi"
|
|
return
|
|
fi
|
|
# Falso, en caso de error.
|
|
[ $# == 2 ] || return 1
|
|
PART="$(ogDiskToDev $1 $2 2>/dev/null)" || return 1
|
|
DISK="$(ogDiskToDev $1)"
|
|
|
|
# Comprobar existencia de fichero de bloqueo de la partición o de su disco.
|
|
LOCKDISK="/var/lock/lock${DISK//\//-}"
|
|
LOCKPART="/var/lock/lock${PART//\//-}"
|
|
test -f $LOCKDISK -o -f $LOCKPART
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogIsMounted int_ndisk int_nfilesys
|
|
#@brief Comprueba si un sistema de archivos está montado.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@param int_nfilesys nº de orden del sistema de archivos
|
|
#@return Código de salida: 0 - montado, 1 - sin montar o error.
|
|
#@version 0.9 - Primera versión para OpenGnSys.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2009-10-15
|
|
#@version 1.0.1 - Devolver falso en caso de error.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2011-05-18
|
|
#*/ ##
|
|
function ogIsMounted ()
|
|
{
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
|
|
"if $FUNCNAME 1 1; then ... ; fi"
|
|
return
|
|
fi
|
|
# Falso, en caso de error.
|
|
[ $# == 2 ] || return 1
|
|
|
|
test -n "$(ogGetMountPoint $1 $2)"
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogIsReadonly int_ndisk int_nfilesys
|
|
#@brief Comprueba si un sistema de archivos está montado solo de lectura.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@param int_nfilesys nº de orden del sistema de archivos
|
|
#@return Código de salida: 0 - montado solo de lectura, 1 - con escritura o no montado.
|
|
#@version 1.1.0 - Primera versión para OpenGnsys.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2016-01-20
|
|
#*/ ##
|
|
|
|
function ogIsReadonly ()
|
|
{
|
|
# Variables locales
|
|
local PART
|
|
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_filesys" \
|
|
"if $FUNCNAME 1 1; then ... ; fi"
|
|
return
|
|
fi
|
|
# Falso, en caso de error.
|
|
[ $# == 2 ] || return 1
|
|
PART="$(ogDiskToDev $1 $2 2>/dev/null)" || return 1
|
|
|
|
test -n "$(findmnt -n -o OPTIONS $PART | awk 'BEGIN {RS=","} /^ro$/ {print}')"
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogIsWritable int_ndisk int_nfilesys
|
|
#@brief Comprueba si un sistema de archivos está montado de lectura y escritura.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@param int_nfilesys nº de orden del sistema de archivos
|
|
#@return Código de salida: 0 - lectura y escritura, 1 - solo lectura o no montado.
|
|
#@version 1.0.5 - Primera versión para OpenGnSys.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2013-10-09
|
|
#*/ ##
|
|
function ogIsWritable ()
|
|
{
|
|
# Variables locales
|
|
local PART
|
|
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_filesys" \
|
|
"if $FUNCNAME 1 1; then ... ; fi"
|
|
return
|
|
fi
|
|
# Falso, en caso de error.
|
|
[ $# == 2 ] || return 1
|
|
PART="$(ogDiskToDev $1 $2 2>/dev/null)" || return 1
|
|
|
|
test -n "$(findmnt -n -o OPTIONS $PART | awk 'BEGIN {RS=","} /^rw$/ {print}')"
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogLock int_ndisk int_npartition
|
|
#@see ogLockPartition
|
|
#*/
|
|
function ogLock ()
|
|
{
|
|
ogLockPartition "$@"
|
|
}
|
|
|
|
#/**
|
|
# ogLockPartition int_ndisk int_npartition
|
|
#@brief Genera un fichero de bloqueo para una partición en uso exlusivo.
|
|
#@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 particion no corresponden con un dispositivo.
|
|
#@note El fichero de bloqueo se localiza en \c /var/lock/part, siendo \c part el dispositivo de la partición, sustituyendo el carácter "/" por "-".
|
|
#@version 0.9 - Primera versión para OpenGnSys.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2009-09-03
|
|
#*/ ##
|
|
function ogLockPartition ()
|
|
{
|
|
# Variables locales
|
|
local PART LOCKFILE
|
|
|
|
# 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 $?
|
|
|
|
# Obtener partición.
|
|
PART="$(ogDiskToDev $1 $2)" || return $?
|
|
|
|
# Crear archivo de bloqueo exclusivo.
|
|
LOCKFILE="/var/lock/lock${PART//\//-}"
|
|
touch $LOCKFILE
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogMount int_ndisk int_nfilesys
|
|
#@see ogMountFs ogMountCache ogMountCdrom
|
|
#*/ ##
|
|
function ogMount ()
|
|
{
|
|
case "$*" in
|
|
CACHE|cache)
|
|
ogMountCache ;;
|
|
CDROM|cdrom)
|
|
ogMountCdrom ;;
|
|
*) ogMountFs "$@" ;;
|
|
esac
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogMountFirstFs int_ndisk
|
|
#@brief Monta el primer sistema de archivos disponible en el disco.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@return Punto de montaje del primer sistema de archivos detectado
|
|
#*/ ##
|
|
function ogMountFirstFs ()
|
|
{
|
|
# Variables locales
|
|
local PART NPARTS MNTDIR
|
|
|
|
# Error si no se recibe 1 parámetro.
|
|
[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
|
|
|
|
# Obtener nº de particiones del disco.
|
|
NPARTS=$(ogGetPartitionsNumber "$1") || return $?
|
|
for (( PART = 1; PART <= NPARTS; PART++ )); do
|
|
MNTDIR=$(ogMount $1 $PART 2>/dev/null)
|
|
if [ -n "$MNTDIR" ]; then
|
|
echo "$MNTDIR"
|
|
return 0
|
|
fi
|
|
done
|
|
ogRaiseError $OG_ERR_NOTFOUND "$1"
|
|
return $OG_ERR_NOTFOUND
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogMountFs int_ndisk int_nfilesys
|
|
#@brief Monta un sistema de archivos.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@param int_nfilesys nº de orden del sistema de archivos
|
|
#@return Punto de montaje
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
|
|
#@exception OG_ERR_PARTITION Tipo de particion desconocido o no se puede montar.
|
|
#@version 0.1 - Integracion para Opengnsys - EAC: MountPartition() en FileSystem.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-09-28
|
|
#@version 1.0.5 - Independiente del tipo de sistema de ficheros.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2012-09-04
|
|
#@version 1.1.0 - Montar sistema de archivos ZFS y NTFS hibernado.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2016-09-19
|
|
#*/ ##
|
|
function ogMountFs ()
|
|
{
|
|
# Variables locales
|
|
local PART MNTDIR
|
|
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
|
|
"$FUNCNAME 1 1 => /mnt/sda1"
|
|
return
|
|
fi
|
|
# Error si no se reciben 2 parámetros.
|
|
[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
|
|
|
|
# Obtener partición.
|
|
PART="$(ogDiskToDev "$1" "$2")" || return $?
|
|
|
|
# Comprobar si el sistema de archivos ya está montada.
|
|
MNTDIR="$(ogGetMountPoint $1 $2)"
|
|
# Si no, montarlo en un directorio de sistema.
|
|
if [ -z "$MNTDIR" ]; then
|
|
# Error si la particion esta bloqueada.
|
|
if ogIsLocked $1 $2; then
|
|
ogRaiseError $OG_ERR_LOCKED "$MSG_PARTITION, $1 $2"
|
|
return $?
|
|
fi
|
|
# El camino de un dispositivo normal comienza por el carácter "/".
|
|
if [[ "$PART" =~ ^/ ]]; then
|
|
# Crear punto de montaje o enlace simbólico para caché local.
|
|
MNTDIR=${PART/dev/mnt}
|
|
DEBUG="no"
|
|
if [ "$(ogFindCache)" == "$1 $2" -a -n "$OGCAC" ]; then
|
|
mkdir -p $OGCAC
|
|
ln -fs $OGCAC $MNTDIR
|
|
else
|
|
mkdir -p $MNTDIR
|
|
fi
|
|
unset DEBUG
|
|
# Montar sistema de archivos.
|
|
mount $PART $MNTDIR &>/dev/null || \
|
|
mount $PART $MNTDIR -o force,remove_hiberfile &>/dev/null
|
|
case $? in
|
|
0) # Correcto.
|
|
;;
|
|
14) # Intentar limpiar hibernación NTFS y montar.
|
|
ntfsfix -d $PART &>/dev/null && mount $PART $MNTDIR &>/dev/null || \
|
|
ogRaiseError $OG_ERR_PARTITION "$1, $2" || return $?
|
|
;;
|
|
*) # Probar montaje de solo lectura.
|
|
mount $PART $MNTDIR -o ro &>/dev/null || \
|
|
ogRaiseError $OG_ERR_PARTITION "$1, $2" || return $?
|
|
;;
|
|
esac
|
|
# Aviso de montaje de solo lectura.
|
|
if ogIsReadonly $1 $2; then
|
|
ogEcho warning "$FUNCNAME: $MSG_MOUNTREADONLY: \"$1, $2\""
|
|
fi
|
|
else
|
|
# Montar sistema de archivos ZFS (un ZPOOL no comienza por "/").
|
|
zfs mount $PART 2>/dev/null
|
|
fi
|
|
fi
|
|
echo "$MNTDIR"
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogMountCdrom
|
|
#@brief Monta dispositivo óptico por defecto
|
|
#@return Punto de montaje
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@exception OG_ERR_PARTITION Tipo de particion desconocido o no se puede montar.
|
|
#@version
|
|
#@author
|
|
#@date
|
|
#*/ ##
|
|
function ogMountCdrom ()
|
|
{
|
|
local DEV MNTDIR
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME"
|
|
return
|
|
fi
|
|
# Error si se reciben parámetros.
|
|
[ $# == 0 ] || ogRaiseError $OG_ERR_FORMAT || return $?
|
|
DEV="/dev/cdrom" # Por defecto
|
|
MNTDIR=$(mount | awk -v D=$DEV '{if ($1==D) {print $3}}')
|
|
if [ -z "$MNTDIR" ]; then
|
|
MNTDIR=${DEV/dev/mnt}
|
|
mkdir -p $MNTDIR
|
|
mount -t iso9660 $DEV $MNTDIR || ogRaiseError $OG_ERR_PARTITION "cdrom" || return $?
|
|
fi
|
|
echo $MNTDIR
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogReduceFs int_ndisk int_nfilesys
|
|
#@brief Reduce el tamaño del sistema de archivos, sin tener en cuenta el espacio libre.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@param int_nfilesys nº de orden del sistema de archivos
|
|
#@return int_tamañoKB - tamaño en KB
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
|
|
#@exception OG_ERR_PARTITION Partición desconocida o no accesible.
|
|
#@warning En Windows, se borran los ficheros de hiberanción y de paginación.
|
|
#@warning El sistema de archivos se amplía al mínimo + 10%.
|
|
#@note Requisitos: *resize*
|
|
#@version 0.1 - Integracion para Opengnsys - EAC: ReduceFileSystem() 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-09-23
|
|
#@version 0.9.2 - Añadir un 10% al tamaño mínimo requerido.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2010-09-27
|
|
#@version 1.0 - Deteccion automatica del tamaño minimo adecuado
|
|
#@author Antonio J. Doblas Viso. Universidad de Malaga
|
|
#@date 2011-02-24
|
|
#@version 1.0.6 - Integrar código de antigua función "ogReduceFsCheck".
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2014-10-28
|
|
#@version 1.1.1b - Detectar metadispositivos.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2020-02-24
|
|
#*/ ##
|
|
function ogReduceFs ()
|
|
{
|
|
# Variables locales
|
|
local PART BLKS SIZE MAXSIZE EXTRASIZE=0 RETVAL
|
|
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
|
|
"$FUNCNAME 1 1"
|
|
return
|
|
fi
|
|
# Error si no se reciben 2 parámetros.
|
|
[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
|
|
|
|
# Obtener partición.
|
|
PART="$(readlink -f "$(ogDiskToDev $1 $2)")" || return $?
|
|
|
|
# Redimensionar según el tipo de particion.
|
|
case "$(ogGetFsType $1 $2)" in
|
|
EXT[234])
|
|
ogUnmount $1 $2 &>/dev/null
|
|
resize2fs -fpM $PART &>/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
|
|
;;
|
|
|
|
BTRFS)
|
|
MNTDIR=$(ogMount $1 $2)
|
|
# Calcular tamaño ocupado + 10%, redondeado + 1 (incluyendo letra de unidad).
|
|
SIZE=$(btrfs filesystem show $MNTDIR | awk -v P=$PART '{ d=""; "readlink -f "$8" 2>/dev/null"|getline d; if(d==P) printf("%d%s", $6*1.1+1, substr($6,match($6,/[A-Z]/),1)) }')
|
|
btrfs filesystem resize ${SIZE} $MNTDIR &>/dev/null
|
|
;;
|
|
REISERFS|REISER4)
|
|
# Calcular tamaño ocupado + 10%.
|
|
MNTDIR=$(ogMount $1 $2)
|
|
SIZE=$[ $(df -k $MNTDIR | awk '{getline;print $3}') * 110 / 100 ]
|
|
ogUnmount $1 $2 2>/dev/null
|
|
resize_reiserfs -s${SIZE}K $PART <<<"y"
|
|
;;
|
|
|
|
F2FS) ;; # No se reduce (por el momento).
|
|
JFS) ;; # No se reduce (por el momento).
|
|
NILFS2) ;; # No se reduce (probar "nilfs-resize").
|
|
XFS) ;; # No se reduce (por el momento).
|
|
|
|
NTFS)
|
|
# Calcular tamaño ocupado + 10%.
|
|
ogUnmount $1 $2 &>/dev/null
|
|
read -e MAXSIZE SIZE <<<$(ntfsresize -fi $PART | \
|
|
awk '/device size/ {d=$4}
|
|
/resize at/ {r=int($5*1.1/1024+1)*1024}
|
|
END { print d,r}')
|
|
# Error si no puede obtenerse el tamaño máximo del volumen.
|
|
[ -n "$MAXSIZE" -a -n "$SIZE" ] || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
|
|
# Simular la redimensión y comprobar si es necesario ampliarala.
|
|
RETVAL=1
|
|
while [ $RETVAL != 0 -a $[ SIZE+=EXTRASIZE ] -lt $MAXSIZE ]; do
|
|
# Obtener espacio de relocalización y devolver código de salida
|
|
# (ntfsresize devuelve 0 si no necesita relocalizar).
|
|
EXTRASIZE=$(ntfsresize -fns $SIZE $PART 2>/dev/null | \
|
|
awk '/Needed relocations/ {print int($4*1.1/1024+1)*1024}'
|
|
exit ${PIPESTATUS[0]})
|
|
RETVAL=$?
|
|
done
|
|
# Redimensionar solo si hace falta.
|
|
if [ $SIZE -lt $MAXSIZE ]; then
|
|
ntfsresize -fs $SIZE $PART <<<"y" >/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
|
|
fi
|
|
;;
|
|
|
|
EXFAT) ;; # No se reduce (por el momento).
|
|
FAT32|FAT16) # Se deja comentado por no haber un método seguro para extender el SF.
|
|
# Calcular tamaño ocupado + 10%.
|
|
#ogUnmount $1 $2 &>/dev/null
|
|
#SIZE=$(fatresize --info $PART | awk -F: '/Min size/ {printf("%d", $2*1.1)}')
|
|
#[ "$SIZE" ] && fatresize --size $SIZE $PART &>/dev/null
|
|
;;
|
|
HFS|HFSPLUS) ;; # No se reduce (por el momento).
|
|
UFS) ;; # No se reduce (por el momento).
|
|
|
|
*) ogRaiseError $OG_ERR_PARTITION "$1,$2"
|
|
return $? ;;
|
|
esac
|
|
|
|
# Devuelve tamaño del sistema de ficheros.
|
|
ogGetFsSize $1 $2
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogUnlock int_ndisk int_npartition
|
|
#@see ogUnlockPartition
|
|
#*/ ##
|
|
function ogUnlock ()
|
|
{
|
|
ogUnlockPartition "$@"
|
|
}
|
|
|
|
#/**
|
|
# ogUnlockPartition int_ndisk int_npartition
|
|
#@brief Elimina el fichero de bloqueo para una particion.
|
|
#@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 particion no corresponden con un dispositivo.
|
|
#@note El fichero de bloqueo se localiza en \c /var/lock/part, siendo \c part el dispositivo de la partición, sustituyendo el carácter "/" por "-".
|
|
#@version 0.9 - Primera versión para OpenGnSys.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2009-09-03
|
|
#*/ ##
|
|
function ogUnlockPartition ()
|
|
{
|
|
# Variables locales
|
|
local PART LOCKFILE
|
|
|
|
# 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 $?
|
|
|
|
# Obtener partición.
|
|
PART="$(ogDiskToDev $1 $2)" || return $?
|
|
|
|
# Borrar archivo de bloqueo exclusivo.
|
|
LOCKFILE="/var/lock/lock${PART//\//-}"
|
|
rm -f $LOCKFILE
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogUnmount int_ndisk int_npartition
|
|
#@see ogUnmountFs
|
|
#*/ ##
|
|
function ogUnmount ()
|
|
{
|
|
ogUnmountFs "$@"
|
|
}
|
|
|
|
#/**
|
|
# ogUnmountFs int_ndisk int_nfilesys
|
|
#@brief Desmonta un sistema de archivos.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@param int_nfilesys nº de orden del sistema de archivos
|
|
#@return Nada
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
|
|
#@warning La partición no está previamente montada o no se puede desmontar.
|
|
#@version 0.1 - Integracion para Opengnsys - EAC: UmountPartition() en FileSystem.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-09-28
|
|
#*/ ##
|
|
function ogUnmountFs ()
|
|
{
|
|
# Variables locales
|
|
local PART MNTDIR
|
|
|
|
# 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 $?
|
|
|
|
# Obtener partición y punto de montaje.
|
|
PART="$(ogDiskToDev $1 $2)" || return $?
|
|
MNTDIR="$(ogGetMountPoint $1 $2)"
|
|
|
|
# Si está montada, desmontarla.
|
|
if [ -n "$MNTDIR" ]; then
|
|
# Error si la particion está bloqueada.
|
|
if ogIsLocked $1 $2; then
|
|
ogRaiseError $OG_ERR_LOCKED "$MSG_PARTITION $1, $2"
|
|
return $?
|
|
fi
|
|
# Desmontar y borrar punto de montaje.
|
|
umount $PART 2>/dev/null || ogEcho warning "$FUNCNAME: $MSG_DONTUNMOUNT: \"$1, $2\""
|
|
rmdir $MNTDIR 2>/dev/null || rm -f $MNTDIR 2>/dev/null
|
|
else
|
|
ogEcho warning "$MSG_DONTMOUNT: \"$1,$2\""
|
|
fi
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogUnmountAll int_ndisk
|
|
#@brief Desmonta todos los sistema de archivos de un disco, excepto el caché local.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@return Nada
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
|
|
#@warning No se desmonta la partición marcada como caché local.
|
|
#@version 0.9 - Versión para OpenGnSys.
|
|
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
|
#@date 2009-10-07
|
|
#*/ ##
|
|
function ogUnmountAll ()
|
|
{
|
|
# Variables locales
|
|
local DISK PART
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" "FUNCNAME 1"
|
|
return
|
|
fi
|
|
# Error si no se recibe 1 parámetro.
|
|
[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
|
|
|
|
# Obtener partición y punto de montaje.
|
|
DISK="$(ogDiskToDev $1)" || return $?
|
|
for ((PART=1; PART<=$(ogGetPartitionsNumber $1); PART++)); do
|
|
case "$(ogGetFsType $1 $PART)" in
|
|
CACHE) ;;
|
|
*) ogUnmount $1 $PART 2>/dev/null ;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
#/**
|
|
# ogUnsetDirtyBit int_ndisk int_npart
|
|
#@brief Inhabilita el Dirty Bit del sistema de ficheros NTFS para evitar un CHKDSK en el primer arranque
|
|
#@param int_ndisk nº de orden del disco
|
|
#@param int_npart nº de orden de partición
|
|
#@return Nada
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@version 1.1.0 - Versión para OpenGnsys.
|
|
#@author Carmelo Cabezuelo, ASIC Universidad Politécnica de Valencia
|
|
#@date 2016-04-20
|
|
#*/ ##
|
|
function ogUnsetDirtyBit ()
|
|
{
|
|
# Variables locales
|
|
local PART
|
|
# Si se solicita, mostrar ayuda.
|
|
if [ "$*" == "help" ]; then
|
|
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk" "FUNCNAME 1"
|
|
return
|
|
fi
|
|
# Error si no se reciben 2 parámetros.
|
|
[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
|
|
|
|
# Obtener partición y punto de montaje.
|
|
case "$(ogGetFsType $1 $2)" in
|
|
NTFS)
|
|
ogUnmount $1 $2 2>/dev/null
|
|
PART="$(ogDiskToDev $1 $2)" || return $?
|
|
ntfsfix -d $PART ;;
|
|
*) ;;
|
|
esac
|
|
}
|
|
|
|
|
|
#/**
|
|
# ogGetFreeSize int_disco int_partition str_SizeOutput
|
|
#@brief muestra informacion del tamaño total, datos y libre.
|
|
#@param int_ndisk nº de orden del disco
|
|
#@param int_npart nº de orden de partición
|
|
#@param str_unitSize unidad mostrada
|
|
#@return int_size:int_data:int_free
|
|
#@TODO Componer corretcamente esta función.
|
|
#@exception OG_ERR_FORMAT Formato incorrecto.
|
|
#@version
|
|
#@author
|
|
#@date
|
|
#*/ ##
|
|
|
|
function ogGetFreeSize ()
|
|
{
|
|
local particion unit factor valor
|
|
if [ $# = 0 ]
|
|
then
|
|
echo "sintaxis: ogGetFreeSize int_disco int_partition str_SizeOutput [ kB MB GB -default GB]-]" red
|
|
echo "devuelve int_size : int_data : int_free" red
|
|
return
|
|
fi
|
|
if [ $# -ge 2 ]
|
|
then
|
|
particion=`ogMount $1 $2 ` #1>/dev/null 2>&1
|
|
if [ -z $3 ]
|
|
then
|
|
unit=kB # s B kB MB GB TB %
|
|
else
|
|
unit=$3
|
|
fi
|
|
case $unit in
|
|
kB)
|
|
factor="1.024";
|
|
#valor=`df | grep $particion | awk -F" " '{size=$2*1.024; used=$3*1.024; free=$4*1.024; printf "%d:%d:%d", size,used,free}'`
|
|
valor=`df | grep $particion | awk -F" " '{size=$2*1.024; used=$3*1.024; free=$4*1.024; printf "%d", free}'`
|
|
;;
|
|
MB)
|
|
factor="1.024/1000";
|
|
valor=`df | grep $particion | awk -F" " '{size=$2*1.024/1000; used=$3*1.024/1000; free=$4*1.024/1000; printf "%d:%d:%d", size,used,free}'`
|
|
;;
|
|
GB)
|
|
factor="1.024/1000000";
|
|
valor=`df | grep $particion | awk -F" " '{size=$2*1.024/1000000; used=$3*1.024/1000000; free=$4*1.024/1000000; printf "%f:%f:%f", size,used,free}'`
|
|
;;
|
|
esac
|
|
#echo $valor
|
|
#NumberRound $valor
|
|
#valor=`NumberRound $valor`;
|
|
echo $valor
|
|
fi
|
|
}
|
|
|