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 :D ), 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.

disk-to-grub

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 :D

Un saludo!

Llevamos 7 Comentarios

  1. mrcomputer ha dicho:

    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 ;)

  2. jotahacker ha dicho:

    14 enero 09 a las 20:45

    Gracias @mrcomputer por el bug, ciertamente no me había fijado :D

    Ya está corregido…

    Un saludo!

  3. Carlos Sánchez ha dicho:

    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!!

  4. jotahacker ha dicho:

    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!

  5. redy ha dicho:

    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)

  6. redy ha dicho:

    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)

  7. jotahacker ha dicho:

    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 bucle :D

    Un saludo!