Convertir discos duros a formato grub [Script]
Acabo de programar un pequeño y básico script para poder cambiar de forma automatica el nombre de los discos duros en Linux por el formato que usa grub. Algo así como hda5 –> hd0,4.
Lo he desarrollado para usarse en el instalador de la distribución GNU/Linux VegnuX (si, esa que lleva Nhopkg ), pero puede usarse en cualquier otra distro, ya que como no podía ser de otra manera, es libre y distribuido bajo la licencia GPLv3. Carlos Sánchez y yo llevábamos tiempo pensando como hacerlo, y por fin se me ocurrio.
Os dejo aquí una adelanto, y más abajo podréis descargarlo.
Actualizado Disk2Grub a la revisión 15-01-09 añadido soporte para discos duros SATA (como pidió Carlos Sánchez ) y alguna cosilla más.
Descargar Disk2Grub 15-01-09: http://pub.jotahacker.es/disk2grub/disk2grub-15-01-09.tar.gz
Descargar Disk2Grub 14-01-09: http://pub.jotahacker.es/disk2grub/disk2grub-14-01-09-2.tar.gz
El paqute incluye el script y la licencia, nada más. Lo podéis descomprimir donde querais y darle permisos de ejecución, luego ya solo queda probarlo. Si alguien encuentra algún problema, por favor, ya sabe donde estoy
Un saludo!
14 enero 09 a las 20:38
Es un programa realmente util para que el usuario no tenga que saber cual es cada unidad en formato grub. Y tambien para el objetivo que lo has diseñado, para el instalador de VegnuX.
Pero hay un pequeño “fallo” es que si no pones ningun disco y le das a enter te muestra todo el fichero /proc/partitions. Esto se evitaria metiendo una condición para cuando no introduces nada.
Saludos
14 enero 09 a las 20:45
Gracias @mrcomputer por el bug, ciertamente no me había fijado
Ya está corregido…
Un saludo!
14 enero 09 a las 21:53
Simplemente Genial Jaime!!
He estado pensando si de alguna manera podría contemplar los discos SATA (sda)… quedaría perfecto!! (y) Tambien quería pedirte permiso para repostearlo en el-simpicuitico…
Saludos a todos!!
14 enero 09 a las 23:07
@Carlos claro, ahora mismo me pongo con los discos SATA, no creo que haya que cambiar mucho
Y por supuesto que puedes publicarlo en el-simpicuitico
Un saludo!
30 abril 09 a las 8:38
Muy chulo, pero…si me permites un consejillo….
¡Ese bucle duele a la vista colega! No me digas que no se te ocurre una forma mejor de pasar de una letra a un número sin contar por los dedos
Te sugiero una llamada al builtin ‘printf’ de bash:
printf "%d" "'$char"
Nos devuelve el código en decimal de la letra contenida en la variable $char sabiendo que la ‘a’ tiene el código 97 solo hay que restar.
#! /bin/bash
#
# disk2grub convierte el nombre de los discos duros en sistemas Unix al formato grub. Ej.: hda1 --> hd0,0
# Copyright (C) 2009 Jaime Gil de Sagredo Luna
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
# Comienza el contenido de script.
function convert_to_grub() {
echo "Introduce el disco duro que quiere convertir a grub. Ej.: hda1, hdb2, sdc3, ..."
read no_grub_hdd
while [ -z "${no_grub_hdd}" ]; do
echo "Es necesario que introduzca el nombre de la particion!!"
echo "Introduce el disco duro que quiere convertir a grub. Ej.: hda1, hdb2, sdc3, ..."
read no_grub_hdd
done
# Comprueba que no se haya introducido una opcion mayor de 5 caracteres.
#no_grub_hdd_chars=$(echo "${no_grub_hdd}" | wc -m)
#if (("${no_grub_hdd_chars}" > "5")); then
# echo "${no_grub_hdd} no es una opcion valida."
# # Sale con error.
# exit 1
#fi
no_grub_hdd_exist=$(grep "${no_grub_hdd}" "/proc/partitions")
if [ -z "${no_grub_hdd_exist}" ]; then
echo "${no_grub_hdd} no existe en su sistema!!"
#Si quieres que salga con error cuando no se encuentre el hdd, descomentas este comando
# exit 1
else
echo "Ha seleccionado el siguiente disco duro:"
echo "${no_grub_hdd_exist}"
fi
echo "Trasformando ${no_grub_hdd} a formato grub."
# Quitando la parte "hd" del principio.
old_no_grub_hdd=${no_grub_hdd}
# Covierte todo en minusculas...
no_grub_hdd=$(echo "${no_grub_hdd}" | awk '{print tolower ($0)}')
no_grub_hdd=$(echo ${no_grub_hdd} | sed -e 's@hd@@g')
# Añadido soporte discos SATA (sda1)
no_grub_hdd=$(echo ${no_grub_hdd} | sed -e 's@sd@@g')
# Separando la letra del numero
no_grub_hdd_num=$(echo ${no_grub_hdd} | sed -e 's@[a-z A-Z]@@g')
no_grub_hdd_alpha=$(echo ${no_grub_hdd} | sed -e 's@[0-9]@@g')
# Una vez obtenido el numero y la letra por separado, pasamos a convertirla a formato grub, por ejemplo a --> 0 o 1 --> 1
# Covierte la letra a numero grub
if [[ "$no_grub_hdd_alpha" "z" ]]; then
echo "No se consiguio pasar ${old_no_grub_hdd} a formato GRUB. Es posible que no halla introducido un nombre de disco duro valido."
exit 1
else
grub_hdd_alpha=" $(( `printf "%d\n" "'$no_grub_hdd_alpha"` - 97 ))"
fi
# Convierte el numero a numero grub.
if [ ! -z "${no_grub_hdd_num}" ]; then
grub_hdd_num=$(expr "${no_grub_hdd_num}" - "1")
fi
# Recoge los datos en una variable
grub_hdd="hd${grub_hdd_alpha}"
if [ ! -z "${grub_hdd_num}" ]; then
grub_hdd="${grub_hdd},${grub_hdd_num}"
fi
# Muestra el resultado!!!
echo "Su disco ${old_no_grub_hdd} en formato grub es (${grub_hdd})"
}
# Hace el trabajo. Es bueno tener todo el codigo en una funcion para asi a la hora de integrarlo en otro script tan solo debemos añadir la funcion y ponerla donde nos plazca.
convert_to_grub
¡Ah! y yo jamás metería el read en la función, ni todos los echos con la literatura. Lo suyo es que la funcion reciba un parámetro, el nombre del disco y imprima solo otro parámetro el nombre convertido a grub. Toda la literatura ponla fuera, así la haces verdaderamente reusable.
Recuerda que ‘Cualquiera puede escribir código que una máquina pueda entender, pero lo realmente difícil es escribir código que puedan entender los humanos’ (Martin Fowler)
30 abril 09 a las 8:53
Vaya, metí el código entre etiquetas <code> y pasó de mi totalmente…
te lo dejo en http://redyarcade.files.wordpress.com/2009/04/disk2grub2.doc
(Quítale la extensión .doc)
1 mayo 09 a las 11:13
Hola @redy y gracias por la colaboración. La verdad que desconocía el uso de
printf "%d" "'$char"
y sin duda tiene mucha mejor pinta que mi bucleUn saludo!