833 lines
25 KiB
Bash
833 lines
25 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 0.9
|
||
#@warning License: GNU GPLv3+
|
||
#*/
|
||
|
||
|
||
#/**
|
||
# ogCheckFs int_ndisk int_npartition
|
||
#@brief Comprueba el estado de un sistema de archivos.
|
||
#@arg \c int_ndisk nº de orden del disco
|
||
#@arg \c 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.
|
||
#@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
|
||
#*/
|
||
function ogCheckFs () {
|
||
|
||
# Variables locales
|
||
local PART TYPE
|
||
|
||
#/// 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]) PROG="e2fsck" ;;
|
||
REISERFS) PROG="reiserfsck"; PARAMS="<<<\"Yes\"" ;;
|
||
JFS) PROG="fsck.jfs" ;;
|
||
XFS) PROG="fsck.xfs" ;;
|
||
NTFS|HNTFS) PROG="ntfsfix" ;;
|
||
FAT32|FAT32) PROG="fsck.vfat" ;;
|
||
FAT16|FAT16) PROG="fsck.msdos" ;;
|
||
*) ogRaiseError $OG_ERR_PARTITION "$1 $2 $TYPE"
|
||
return $? ;;
|
||
esac
|
||
#/// Error si el sistema de archivos esta montado o bloqueado.
|
||
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
|
||
eval $PROG $PARAMS $PART
|
||
ERRCODE=$?
|
||
case $ERRCODE in
|
||
0) ;;
|
||
127) ogRaiseError $OG_ERR_NOTEXEC "$PROG" ;;
|
||
*) ogRaiseError $OG_ERR_PARTITION "$1 $2" ;;
|
||
esac
|
||
ogUnlock $1 $2
|
||
return $ERRCODE
|
||
}
|
||
|
||
|
||
#/**
|
||
# ogExtendFs int_ndisk int_npartition
|
||
#@brief Extiende un sistema de archivos al tamaño de su partición.
|
||
#@arg \c int_ndisk nº de orden del disco
|
||
#@arg \c 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.
|
||
#@exception OG_ERR_PARTITION Partición desconocida o no accesible.
|
||
#@note Requisitos: *resize*
|
||
#@version 0.9 - Primera adaptación para OpenGNSys.
|
||
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
||
#@date 2009-09-23
|
||
#*/
|
||
function ogExtendFs () {
|
||
|
||
# Variables locales.
|
||
local PART PROG PARAMS
|
||
|
||
#/// 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 $?
|
||
|
||
ogUnmount $1 $2 >/dev/null
|
||
#/// 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" ;;
|
||
REISERFS) PROG="resize_reiserfs"; PARAMS="-f" ;;
|
||
NTFS|HNTFS) PROG="ntfsresize"; PARAMS="<<<\"y\" -f" ;;
|
||
*) ogRaiseError $OG_ERR_PARTITION "$1 $2 $TYPE"
|
||
return $? ;;
|
||
esac
|
||
#/// Error si el sistema de archivos está montado o bloqueado.
|
||
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
|
||
#/// Redimensionar en modo uso exclusivo.
|
||
ogLock $1 $2
|
||
eval $PROG $PARAMS $PART
|
||
ERRCODE=$?
|
||
case $ERRCODE in
|
||
0) ;;
|
||
127) ogRaiseError $OG_ERR_NOTEXEC "$PROG" ;;
|
||
*) ogRaiseError $OG_ERR_PARTITION "$1 $2" ;;
|
||
esac
|
||
ogUnlock $1 $2
|
||
return $ERRCODE
|
||
}
|
||
|
||
|
||
#/**
|
||
# ogFormat int_ndisk int_npartition
|
||
#@see ogFormatFs
|
||
#*/
|
||
function ogFormat () {
|
||
ogFormatFs "$@"
|
||
}
|
||
|
||
|
||
#/**
|
||
# ogFoarmatFs int_ndisk int_npartition [type_fstype] [str_label]
|
||
#@brief Formatea un sistema de ficheros según el tipo de su partición.
|
||
#@arg \c int_ndisk nº de orden del disco
|
||
#@arg \c int_npartition nº de orden de la partición
|
||
#@arg \c type_fstype mnemónico de sistema de ficheros a formatear
|
||
#@arg \c str_label etiqueta de volumen (opcional)
|
||
#@return (por determinar)
|
||
#@exception OG_ERR_FORMAT Formato 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
|
||
#*/
|
||
function ogFormatFs () {
|
||
|
||
# Variables locales
|
||
local PART ID TYPE LABEL PROG PARAMS ERRCODE
|
||
|
||
#/// Si se solicita, mostrar ayuda.
|
||
if [ "$*" == "help" ]; then
|
||
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition [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 dispositivo y tipo de sisitema de archivos.
|
||
PART="$(ogDiskToDev $1 $2)" || return $?
|
||
TYPE="$(ogGetFsType $1 $2)" || return $?
|
||
|
||
#/// Elegir tipo de formato segun el tipo de particion.
|
||
case "$3" in
|
||
EXT2) ID=83; PROG="mkfs.ext2";;
|
||
EXT3) ID=83; PROG="mkfs.ext3";;
|
||
EXT4) ID=83; PROG="mkfs.ext4";;
|
||
REISERFS) ID=83; PROG="mkfs.reiserfs"; PARAMS="-f" ;;
|
||
REISER4) ID=83; PROG="mkfs.reiser4";;
|
||
XFS) ID=83; PROG="mkfs.xfs"; PARAMS="-f" ;;
|
||
JFS) ID=83; PROG="mkfs.jfs"; PARAMS="<<<\"y\"";;
|
||
NTFS) ID=7; PROG="mkntfs"; PARAMS="-f" ;;
|
||
HNTFS) ID=17; PROG="mkntfs"; PARAMS="-f" ;;
|
||
FAT32) ID=b; PROG="mkfs.vfat" ;;
|
||
HFAT32) ID=1b; PROG="mkfs.vfat" ;;
|
||
FAT16) ID=6; PROG="mkfs.msdos" ;;
|
||
HFAT16) ID=16; PROG="mkfs.msdos" ;;
|
||
*) LABEL="$3" ;;
|
||
esac
|
||
#/// Si no se indica explícitamente, detectar el tipo de sistema de archivos.
|
||
if [ -z "$PROG" ]; then
|
||
case "$TYPE" in
|
||
EXT2) PROG="mkfs.ext2";;
|
||
EXT3) PROG="mkfs.ext3";;
|
||
EXT4) PROG="mkfs.ext4";;
|
||
REISERFS) PROG="mkfs.reiserfs"; PARAMS="-f" ;;
|
||
REISER4) PROG="mkfs.reiser4";;
|
||
XFS) PROG="mkfs.xfs"; PARAMS="-f" ;;
|
||
JFS) PROG="mkfs.jfs"; PARAMS="<<<\"y\"";;
|
||
NTFS|HNTFS) PROG="mkntfs"; PARAMS="-f" ;;
|
||
FAT32|HFAT32) PROG="mkfs.vfat" ;;
|
||
FAT16|HFAT16) PROG="mkfs.msdos" ;;
|
||
*) ogRaiseError $OG_ERR_PARTITION "$1 $2 $TYPE"
|
||
return $? ;;
|
||
esac
|
||
else
|
||
[ $TYPE == "$3" -o $ID == "$(ogGetPartitionId $1 $2)" ] || ogRaiseError $OG_ERR_PARTITION "$3 != $TYPE" || return $?
|
||
fi
|
||
#/// Comprobar consistencia entre id. de partición y tipo de sistema de archivos.
|
||
[ -n "$PROG" ] || ogRaiseError $OG_ERR_PARTITION "$3 != $TYPE" || return $?
|
||
|
||
#/// Etiquetas de particion.
|
||
if [ -z "$LABEL" ]; then
|
||
[ "$4" != "CACHE" ] || ogRaiseError $OG_ERR_FORMAT "$MSG_RESERVEDVALUE: CACHE" || return $?
|
||
[ -n "$4" ] && PARAMS="$PARAMS -L $4"
|
||
else
|
||
PARAMS="$PARAMS -L $LABEL"
|
||
fi
|
||
|
||
#/// Error si la particion esta montada o está bloqueada.
|
||
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
|
||
#/// Formatear en modo uso exclusivo.
|
||
ogLock $1 $2
|
||
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
|
||
}
|
||
|
||
|
||
#/**
|
||
# ogGetFsType int_ndisk int_npartition
|
||
#@brief Devuelve el mnemonico con el tipo de sistema de archivos.
|
||
#@arg \c ndisk nº de orden del disco
|
||
#@arg \c npartition nº de orden de la partición
|
||
#@return Mnemonico
|
||
#@note Mnemonico: { EXT2, EXT3, EXT4, REISERFS, LINUX-SWAP, LINUX-LVM, LINUX-RAID, FAT16, HFAT16, FAT32, HFAT32, NTFS, HNTFS, WIN-DYNAMIC, CACHE, EMPTY, EXTENDED, UNKNOWN }
|
||
#@exception OG_ERR_FORMAT Formato incorrecto.
|
||
#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
|
||
#@version 0.9 - Primera adaptación para OpenGNSys.
|
||
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
||
#@date 2009-07-21
|
||
#*/
|
||
function ogGetFsType () {
|
||
|
||
# Variables locales.
|
||
local DISK ID TYPE
|
||
|
||
#/// Si se solicita, mostrar ayuda.
|
||
if [ "$*" == "help" ]; then
|
||
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
|
||
"$FUNCNAME 1 1 => NTFS"
|
||
return
|
||
fi
|
||
#/// Error si no se reciben 2 parámetros.
|
||
[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
|
||
|
||
#/// Detectar id. de tipo de partición y codificar al mnemonico.
|
||
DISK=$(ogDiskToDev $1) || return $?
|
||
ID=$(ogGetPartitionId $1 $2) || return $?
|
||
case "$ID" in
|
||
0) TYPE="EMPTY" ;;
|
||
5|f) TYPE="EXTENDED" ;;
|
||
[6e]) TYPE="FAT16" ;;
|
||
7) TYPE="NTFS" ;; # Nota: también puede ser EXFAT
|
||
[bc]) TYPE="FAT32" ;;
|
||
12) TYPE="COMPAQDIAG" ;;
|
||
1[6e]) TYPE="HFAT16" ;;
|
||
17) TYPE="HNTFS" ;;
|
||
1[bc]) TYPE="HFAT32" ;;
|
||
42) TYPE="WIN-DYNAMIC" ;;
|
||
82) TYPE="LINUX-SWAP" ;;
|
||
83) TYPE="$(parted -s $DISK print | awk -v var=$2 '{if ($1==var) {print toupper($6)}}')"
|
||
TYPE=${TYPE:-"EXT3"}
|
||
;;
|
||
8e) TYPE="LINUX-LVM" ;;
|
||
a7) TYPE="CACHE" ;; # (compatibilidad con Brutalix)
|
||
bf) TYPE="SOLARIS" ;;
|
||
ca) TYPE="CACHE" ;;
|
||
fd) TYPE="LINUX-RAID" ;;
|
||
*) TYPE="UNKNOWN" ;;
|
||
esac
|
||
echo $TYPE
|
||
}
|
||
|
||
|
||
##### PRUEBAS
|
||
#/**
|
||
# ogGetMountPoint int_ndisk int_npartition
|
||
#@brief Devuelve el punto de montaje de un sistema de archivos.
|
||
#*/
|
||
function ogGetMountPoint () {
|
||
|
||
# Variables locales
|
||
local PART
|
||
#/// Si se solicita, mostrar ayuda.
|
||
if [ "$*" == "help" ]; then
|
||
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
|
||
"$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 $?
|
||
|
||
echo $(mount | awk -v P=$PART '{if ($1==P) {print $3}}')
|
||
}
|
||
|
||
|
||
#/**
|
||
# ogIsMounted int_ndisk int_npartition
|
||
#@brief Comprueba si un sistema de archivos está montado.
|
||
#*/
|
||
function ogIsMounted () {
|
||
|
||
#/// Si se solicita, mostrar ayuda.
|
||
if [ "$*" == "help" ]; then
|
||
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
|
||
"if $FUNCNAME 1 1; then ... ; fi"
|
||
return
|
||
fi
|
||
#/// Error si no se reciben 2 parámetros.
|
||
[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
|
||
|
||
test -n "$(ogGetMountPoint $1 $2)"
|
||
}
|
||
|
||
|
||
#/**
|
||
# ogIsLocked int_ndisk int_npartition
|
||
#@brief Comprueba si una partición está bloqueada por una operación de uso exclusivo.
|
||
#@arg \c ndisk nº de orden del disco
|
||
#@arg \c npartition nº de orden de la partición
|
||
#@return 0 - sin bloquear, 1 - bloqueada.
|
||
#@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.1 - En pruebas para adaptarla a OpenGNSys.
|
||
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
||
#@date 2009-09-03
|
||
#*/
|
||
function ogIsLocked () {
|
||
|
||
# Variables locales
|
||
local PART LOCKFILE
|
||
|
||
#/// Si se solicita, mostrar ayuda.
|
||
if [ "$*" == "help" ]; then
|
||
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
|
||
"if $FUNCNAME 1 1; then ... ; fi"
|
||
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 existencia del fichero de bloqueo.
|
||
LOCKFILE="/var/lock/lock${PART//\//-}"
|
||
test -f $LOCKFILE
|
||
}
|
||
|
||
|
||
#/**
|
||
# 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.
|
||
#@arg \c ndisk nº de orden del disco
|
||
#@arg \c 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.1 - En pruebas para adaptarla a 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_npartition
|
||
#@see ogMountFs ogMountCdrom
|
||
#*/
|
||
function ogMount () {
|
||
case "$*" in
|
||
CACHE|cache)
|
||
ogMountCache ;;
|
||
CDROM|cdrom)
|
||
ogMountCdrom ;;
|
||
*) ogMountFs "$@" ;;
|
||
esac
|
||
}
|
||
|
||
|
||
#/**
|
||
# ogMountFs int_ndisk int_npartition
|
||
#@brief Monta un sistema de archivos.
|
||
#@arg \c ndisk nº de orden del disco
|
||
#@arg \c npartition nº de orden de la partición
|
||
#@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.9 - Primera versión para OpenGNSys.
|
||
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
||
#@date 2009-09-28
|
||
#*/
|
||
function ogMountFs () {
|
||
|
||
#/// Variables locales
|
||
local PART TYPE MNTDIR MOUNT
|
||
|
||
#/// Si se solicita, mostrar ayuda.
|
||
if [ "$*" == "help" ]; then
|
||
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
|
||
"$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, montarla en un directorio de sistema
|
||
if [ -z "$MNTDIR" ]; then
|
||
# Error si la particion esta bloqueada.
|
||
ogIsLocked $1 $2 && ogRaiseError $OG_ERR_LOCKED "$1 $2" && return $?
|
||
#/// Crear punto de montaje.
|
||
MNTDIR=${PART/dev/mnt}
|
||
mkdir -p $MNTDIR
|
||
#/// Montar según el tipo de sitema de archivos.
|
||
TYPE="$(ogGetFsType $1 $2)" || return $?
|
||
case "$TYPE" in
|
||
CACHE) MOUNT=mount ;;
|
||
EXT[234]) MOUNT=mount ;;
|
||
REISERFS) insmod /lib/modules/$(uname -r)/kernel/fs/reiserfs/reiserfs.ko 2>/dev/null
|
||
MOUNT=mount ;;
|
||
JFS) insmod /lib/modules/$(uname -r)/kernel/fs/jfs/jfs.ko 2>/dev/null
|
||
MOUNT=mount ;;
|
||
XFS) insmod /lib/modules/$(uname -r)/kernel/fs/xfs/xfs.ko 2>/dev/null
|
||
MOUNT=mount ;;
|
||
NTFS|HNTFS) MOUNT=ntfs-3g ;;
|
||
FAT16|FAT32|HFAT16|HFAT32)
|
||
MOUNT=mount; ARGS="-t vfat" ;;
|
||
*) #/// Error, si la partición no es montable.
|
||
rmdir $MNTDIR
|
||
ogRaiseError $OG_ERR_PARTITION "$1, $2, $TYPE"
|
||
return $OG_ERR_PARTITION
|
||
;;
|
||
esac
|
||
$MOUNT $ARGS $PART $MNTDIR || $MOUNT $ARGS $PART $MNTDIR -o force,remove_hiberfile || ogRaiseError $OG_ERR_PARTITION "$1, $2, $TYPE" || return $?
|
||
# linea temporal durante desarrollo para poder usar el cliente completo nfs y testeas nuevas herramientas.
|
||
if grep -q nfsroot /proc/cmdline; then
|
||
echo "$PART $MNTDIR" >> /etc/mtab
|
||
fi
|
||
# fin linea temporal.
|
||
fi
|
||
echo $MNTDIR
|
||
}
|
||
|
||
|
||
##### PRUEBAS
|
||
# Montar CDROM
|
||
function ogMountCdrom () {
|
||
local DEV MNTDIR
|
||
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_npartition
|
||
#@brief Reduce el tamaño del sistema de archivos, sin tener en cuenta el espacio libre.
|
||
#@arg \c ndisk nº de orden del disco
|
||
#@arg \c npartition nº de orden de la partición
|
||
#@return tamañoKB
|
||
#@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 El sistema de archivos se amplía al mínimo + 1 KB.
|
||
#@note Requisitos: *resize*
|
||
#@version 0.1 - En pruebas para adaptarla a OpenGNSys.
|
||
#@author Ramon Gomez, ETSII Universidad de Sevilla
|
||
#@date 2009-09-23
|
||
#*/
|
||
function ogReduceFs () {
|
||
|
||
# Variables locales
|
||
local PART BLKS SIZE
|
||
|
||
#/// 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 $?
|
||
|
||
#/// Redimensionar según el tipo de particion.
|
||
case "$(ogGetFsType $1 $2)" in
|
||
EXT[234])
|
||
ogUnmount $1 $2 >/dev/null
|
||
# Ext2/3/4: Tamaño de los bloques del sistema de archivos
|
||
BLKS=$(tune2fs -l $PART | awk '/Block size/ {print int($3/512)}')
|
||
# Traduce el num. en sectores de 512B a tamano en MB.
|
||
SIZE=$(resize2fs -P $PART 2>/dev/null | \
|
||
awk -v B=$BLKS '/minimum size/ {print int($7*B/2048+1000)}')
|
||
resize2fs -fp $PART "${SIZE}M" &>/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
|
||
;;
|
||
REISERFS) # Usar "resize_reiserfs"
|
||
;;
|
||
NTFS|HNTFS)
|
||
rm -f $(ogGetPath $1 $2 pagefile.sys)
|
||
ogUnmount $1 $2 >/dev/null
|
||
#NTFS: Obtiene tamano minimo en MB.
|
||
SIZE=$(ntfsresize -fi $PART | awk '/resize at/ {print $8+1000}')
|
||
ntfsresize -fns "${SIZE}M" $PART >/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
|
||
ntfsresize -fs "${SIZE}M" $PART <<<"y" >/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
|
||
;;
|
||
*) ogRaiseError $OG_ERR_PARTITION "$1,$2"
|
||
return $? ;;
|
||
esac
|
||
#/// Mostrar nuevo tamaño en KB.
|
||
echo $[SIZE*1024]
|
||
}
|
||
|
||
|
||
#/**
|
||
# ogUnlock int_ndisk int_npartition
|
||
#@see ogUnlockPartition
|
||
#*/
|
||
function ogUnlock () {
|
||
ogUnlockPartition "$@"
|
||
}
|
||
|
||
#/**
|
||
# ogUnlockPartition int_ndisk int_npartition
|
||
#@brief Elimina el fichero de bloqueo para una particion.
|
||
#@arg \c ndisk nº de orden del disco
|
||
#@arg \c 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.1 - En pruebas para adaptarla a 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_npartition
|
||
#@brief Desmonta un sistema de archivos.
|
||
#@arg \c ndisk nº de orden del disco
|
||
#@arg \c 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.
|
||
#@warning La partición no está previamente montada o no se puede desmontar.
|
||
#@version 0.9 - Primera versión 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 esta bloqueada.
|
||
ogIsLocked $1 $2 && ogRaiseError $OG_ERR_LOCKED "$1 $2" && return $?
|
||
#/// Crear punto de montaje.
|
||
umount $PART 2>/dev/null && rmdir $MNTDIR || ogEcho warning "$FUNCNAME: $MSG_DONTUNMOUNT: \"$1,$2\""
|
||
# linea temporal durante desarrollo para testear nuevas herramientas con el cliente completo nfs
|
||
if grep -q nfsroot /proc/cmdline; then
|
||
cat /etc/mtab | grep -v $PART > /var/tmp/mtab.temporal && cp /var/tmp/mtab.temporal /var/tmp/mtab && rm /var/tmp/mtab.temporal
|
||
fi
|
||
# fin linea temporal.
|
||
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.
|
||
#@arg \c 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|LINUX-SWAP)
|
||
;;
|
||
*)
|
||
ogUnmount $1 $PART ;;
|
||
esac
|
||
done
|
||
}
|
||
|
||
|
||
function ogFindCache () {
|
||
#/** @function ogFindCache: @brief Detecta la particion CACHE EAC seg<65>n tipo a7 o label CACHE sobre particion ext3.
|
||
#@param no requiere parametros
|
||
#@return devuelve el identificador linux de la particion CACHE.
|
||
#@warning si no hay cache no devuelve nada
|
||
#@attention Requisitos: la salida de fdisk de la cache a7 debe ser NeXTSTEP
|
||
#@note Notas sin especificar
|
||
#@version 0.1 Date: 27/10/2008 Author Antonio J. Doblas Viso. Universidad de Malaga
|
||
#*/
|
||
#
|
||
if [ $# != 0 ]
|
||
then
|
||
Msg "FindCache detecta la particion tipo a7 o aquella que tenga el label CACHE" info
|
||
Msg "devuelve /dev/sda3" info2
|
||
Msg "sintaxis: FindCache --- Ejemplo: FindCache -> /dev/sda3/ " example
|
||
return
|
||
fi
|
||
end=`ogDiskToDev | wc -w`
|
||
unset cache
|
||
for (( disk = 1; disk <= $end; disk++))
|
||
do
|
||
disco=`ogDiskToDev $disk`
|
||
totalpart=`parted $disco print | egrep ^" [0123456789] " -c`
|
||
#echo Buscando en disco: $disco con $totalpart particiones
|
||
if [ `fdisk -l $disco | egrep ^/dev | grep NeXTSTEP | cut -f1 -d" "` ]
|
||
then
|
||
# echo comprobando si es particion a7
|
||
cache=`fdisk -l $disco | egrep ^/dev | grep NeXTSTEP | cut -f1 -d" "`
|
||
else
|
||
#echo comprobando si existe la etiqueta cache
|
||
if find /dev/disk | grep CACHE > /dev/null
|
||
then
|
||
devcache=`ls -ls /dev/disk/by-label/CACHE | awk -F..\/..\/ '{print $2}'`
|
||
cache=/dev/$devcache
|
||
fi
|
||
fi
|
||
done
|
||
if [ -n "$cache" ]
|
||
then
|
||
echo $cache
|
||
else
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
function ogMountCache () {
|
||
#/** @function ogMountCache: @brief Monta la particion Cache y exporta la variable $OGCAC
|
||
#@param sin parametros
|
||
#@return Punto de montaje dentro de mnt, ejemplo con un parametro: ogMountCache => /mnt/sda3
|
||
#@warning Salidas de errores no determinada
|
||
#@warning
|
||
#@attention
|
||
#@version 0.1 Date: 27/10/2008 Author Antonio J. Doblas Viso. Universidad de Malaga. Proyecto EAC
|
||
#@note
|
||
#*/
|
||
CACHELINUX=`ogFindCache`
|
||
CACHEOG=`ogDevToDisk $CACHELINUX`
|
||
OGCAC=`ogMount $CACHEOG`
|
||
echo $OGCAC
|
||
export OGCAC
|
||
}
|
||
|
||
function ogUnmountCache () {
|
||
#/** @function UmountCache: @brief Desmonta la particion Cache y elimina la variable $OGCAC
|
||
#@param sin parametros
|
||
#@return nada
|
||
#@warning Salidas de errores no determinada
|
||
#@warning
|
||
#@attention
|
||
#@version 1.0 Date: 27/10/2008 Author Antonio J. Doblas Viso. Universidad de Malaga. Proyecto EAC
|
||
#@note
|
||
#*/
|
||
CACHELINUX=`ogFindCache`
|
||
CACHEOG=`ogDevToDisk $CACHELINUX`
|
||
#echo ogUnmountPartition $cacheeac
|
||
ogUnmountPartition $CACHEOG
|
||
unset OGCAC
|
||
}
|
||
|
||
|
||
function ogFormatCache () {
|
||
#/** @function ogFormatCache: @brief Formatea la Cache EAC y le asigna el label CACHE
|
||
#@param No requiere
|
||
#@return la propia del mkfs.ext3
|
||
#@warning
|
||
#@attention
|
||
#@note
|
||
#@version 0.1 Date: 27/10/2008 Author Antonio J. Doblas Viso. Universidad de Malaga
|
||
#*/
|
||
|
||
if [ $# = 0 ]
|
||
then
|
||
cd /
|
||
ogUnmountCache
|
||
dev=`ogFindCache`
|
||
Msg "Iniciando el formateo de la particion CACHE, ubicada en $dev, y asignandole el label CACHE" red
|
||
mkfs.ext3 $dev -L CACHE
|
||
ogInfoCache
|
||
fi
|
||
if [ $# = 1 ]
|
||
then
|
||
mkfs.ext3 $1 -L CACHE
|
||
fi
|
||
}
|