summaryrefslogtreecommitdiffstats
path: root/client/engine/Disk.lib
diff options
context:
space:
mode:
Diffstat (limited to 'client/engine/Disk.lib')
-rwxr-xr-xclient/engine/Disk.lib74
1 files changed, 54 insertions, 20 deletions
diff --git a/client/engine/Disk.lib b/client/engine/Disk.lib
index 010dfc3a..04095d5a 100755
--- a/client/engine/Disk.lib
+++ b/client/engine/Disk.lib
@@ -4,7 +4,7 @@
#@brief Librería o clase Disk
#@class Disk
#@brief Funciones para gestión de discos y particiones.
-#@version 1.1.0
+#@version 1.1.1
#@warning License: GNU GPLv3+
#*/
@@ -47,7 +47,8 @@ timeout -k 5s -s KILL 3s $(which parted) "$@"
function ogCreatePartitions ()
{
# Variables locales.
-local ND DISK PTTYPE PART SECTORS START SIZE TYPE CACHEPART IODISCO IOSIZE CACHESIZE EXTSTART EXTSIZE tmpsfdisk
+local ND DISK PTTYPE PART SECTORS START SIZE TYPE CACHEPART IODISCO IOSIZE CACHESIZE
+local EXTSTART EXTSIZE NVME_PREFIX tmpsfdisk
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk str_parttype:int_partsize ..." \
@@ -94,12 +95,18 @@ trap "rm -f $tmpsfdisk" 1 2 3 9 15
echo "unit: sectors" >$tmpsfdisk
echo >>$tmpsfdisk
+NVME_PREFIX=""
+if [[ $DISK == *"nvme"* ]]; then
+ NVME_PREFIX="p"
+fi
+
+
# 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
+ echo "$DISK$NVME_PREFIX$PART : start=$[SECTORS+1], size=$CACHESIZE, Id=ca" >>$tmpsfdisk
PART=$[PART+1]
fi
# Leer formato de cada parámetro - Tipo:Tamaño
@@ -125,7 +132,7 @@ while [ $# -gt 0 ]; do
SECTORS=$[EXTSTART+EXTSIZE]
fi
# Generar datos para la partición.
- echo "$DISK$PART : start=$START, size=$SIZE, Id=$ID" >>$tmpsfdisk
+ echo "$DISK$NVME_PREFIX$PART : start=$START, size=$SIZE, Id=$ID" >>$tmpsfdisk
# Error si se supera el nº total de sectores.
START=$[START+SIZE]
if [ "$IOSIZE" == "4096" -a $PART -gt 4 ]; then
@@ -138,9 +145,9 @@ 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
+ echo "$DISK$NVME_PREFIX$PART : start=$[SECTORS+1], size=$CACHESIZE, Id=ca" >>$tmpsfdisk
else
- echo "$DISK$PART : start=0, size=0, Id=0" >>$tmpsfdisk
+ echo "$DISK$NVME_PREFIX$PART : start=0, size=0, Id=0" >>$tmpsfdisk
fi
PART=$[PART+1]
done
@@ -258,7 +265,7 @@ ogCreatePartitionTable $ND
# Definir particiones y notificar al kernel.
# Borramos primero las particiones y luego creamos las nuevas
sgdisk $DELOPTIONS $OPTIONS $DISK 2>/dev/null && partprobe $DISK
-[ -n "$CACHESIZE" ] && ogMountCache 2>/dev/null
+[ -n "$CACHESIZE" ] && ogMountCache 2>/dev/null || return 0
}
@@ -396,7 +403,7 @@ esac
function ogDevToDisk ()
{
# Variables locales.
-local CACHEFILE DEV PART d n
+local CACHEFILE DEV PART NVME_PREFIX d n
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME path_device | LABEL=str_label | UUID=str_uuid" \
@@ -431,7 +438,13 @@ fi
# Si no se encuentra, procesa todos los discos para devolver su nº de orden y de partición.
n=1
for d in $(ogDiskToDev); do
- [ -n "$(echo $DEV | grep $d)" ] && echo "$n ${DEV#$d}" && return
+NVME_PREFIX=""
+if [[ $d == *"nvme"* ]]; then
+ NVME_PREFIX="p"
+fi
+
+
+ [ -n "$(echo $DEV | grep $d)" ] && echo "$n ${DEV#$d$NVME_PREFIX}" && return
n=$[n+1]
done
ogRaiseError $OG_ERR_NOTFOUND "$1"
@@ -682,11 +695,20 @@ echo $TYPE
function ogGetEsp ()
{
local PART d
-for d in $(blkid -t TYPE=vfat -o device); do
- PART="$(ogDevToDisk $d)"
- if [ "$(ogGetPartitionId $PART)" == "$(ogTypeToId EFI GPT)" ]; then
- echo $PART
- break
+for d in $(blkid -o device|sort); do
+ # Previene error para /dev/loop0
+ PART="$(ogDevToDisk $d 2>/dev/null)" || continue
+ # En discos NVMe blkid devuelve una salida del tipo:
+ # >/dev/loop0
+ # >/dev/nvme0n1
+ # >/dev/nvme0n1p1
+ # al analizar la particion nvme0n1, PART solo tiene un argumento y hace que ogGetPartitionId lance un error
+ LEN=$(echo $PART | awk '{ print length($0) }')
+ if [ $LEN -gt 1 ]; then
+ if [ "$(ogGetPartitionId $PART)" == "$(ogTypeToId EFI GPT)" ]; then
+ echo $PART
+ break
+ fi
fi
done
}
@@ -1022,7 +1044,10 @@ echo "$TYPE"
#@exception OG_ERR_PARTITION tipo de partición no reconocido.
#@version 1.0 - Versión en pruebas.
#@author Ramon Gomez, ETSII Universidad de Sevilla
-#@date 2010-01-12
+#@date 2010/01/12
+#@version 1.1.1 - Se incluye tipo Windows para UEFI (ticket #802)
+#@author Irina Gomez, ETSII Universidad de Sevilla
+#@date 2019/01/18
#*/ ##
function ogHidePartition ()
{
@@ -1045,6 +1070,7 @@ case "$TYPE" in
FAT32) NEWTYPE="HFAT32" ;;
FAT16) NEWTYPE="HFAT16" ;;
FAT12) NEWTYPE="HFAT12" ;;
+ WINDOWS)NEWTYPE="WIN-RESERV";;
*) ogRaiseError $OG_ERR_PARTITION "$TYPE"
return $? ;;
esac
@@ -1269,6 +1295,10 @@ if [ "$*" == "help" ]; then
"$FUNCNAME 1 1"
return
fi
+
+# Si el EFI esta activo me salgo.
+ogIsEfiActive && ogEcho session log warning "EFI: $MSG_DONTUSE $FUNCNAME" && return
+
# Error si no se reciben 2 parámetros.
[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
@@ -1479,7 +1509,10 @@ jq -r "(.partitiontables[] | select(.type==\"${PTTYPE^^}\").partitions[]) | sele
#@exception OG_ERR_PARTITION tipo de partición no reconocido.
#@version 1.0 - Versión en pruebas.
#@author Ramon Gomez, ETSII Universidad de Sevilla
-#@date 2010-01-12
+#@date 2010/01/12
+#@version 1.1.1 - Se incluye tipo Windows Reserver para UEFI (ticket #802)
+#@author Irina Gomez, ETSII Universidad de Sevilla
+#@date 2019/01/18
#*/ ##
function ogUnhidePartition ()
{
@@ -1498,10 +1531,11 @@ PART=$(ogDiskToDev "$1" "$2") || return $?
# Obtener tipo de partición.
TYPE=$(ogGetPartitionType "$1" "$2")
case "$TYPE" in
- HNTFS) NEWTYPE="NTFS" ;;
- HFAT32) NEWTYPE="FAT32" ;;
- HFAT16) NEWTYPE="FAT16" ;;
- HFAT12) NEWTYPE="FAT12" ;;
+ HNTFS) NEWTYPE="NTFS" ;;
+ HFAT32) NEWTYPE="FAT32" ;;
+ HFAT16) NEWTYPE="FAT16" ;;
+ HFAT12) NEWTYPE="FAT12" ;;
+ WIN-RESERV) NEWTYPE="WINDOWS" ;;
*) ogRaiseError $OG_ERR_PARTITION "$TYPE"
return $? ;;
esac