Blog

  • Configuración de volumen RAID por Software en Linux

    INCOMPLETO/OBSOLETO Procedimiento para la configuración de un volumen RAID (en este caso RAID5) por Software (sin controladora RAID física) en Linux (Kubuntu 7.10 Gutsy Gibbon)

    Aunque incompleto o no válido del todo lo dejo para que sirva de orientación sobre lo que hay que hacer.

    En primer lugar hay que preparar las particiones que vayamos a utilizar para formar el volumen RAID5 (por lo menos 3). Puesto que se trata de una implementación por software tengo entendido, aunque no lo he probado, que se podría hasta utilizar más de una partición de un mismo disco físico, aunque esto sólo tendría lógica para realizar pruebas pues en caso de fallo de un disco que aloje más de una partición participante en el volumen RAID5 perderíamos la información del volumen.

    Si necesitamos crear la partición en el disco utilizaremos fdisk:

    $ sudo fdisk /dev/sda
    El número de cilindros para este disco está establecido en 14946.
    
    No hay nada malo en ello, pero es mayor que 1024, y en algunos casos
    
    podría causar problemas con:
    
    1) software que funciona en el inicio (p.ej. versiones antiguas de LILO)
    
    2) software de arranque o particionamiento de otros sistemas operativos
    
       (p.ej. FDISK de DOS, FDISK de OS/2)Orden (m para obtener ayuda): n
    
    Acción de la orden
    
    e   Partición extendida
    
       p   Partición primaria (1-4)
    
    p
    
    Número de partición (1-4): 1
    
    Primer cilindro (1-14946, valor predeterminado 1):
    
    Se está utilizando el valor predeterminado 1
    
    Último cilindro o +tamaño o +tamañoM o +tamañoK (1-14946, valor predeterminado 14946): +17408M
    
    Orden (m para obtener ayuda): p
    
    Disco /dev/sda: 122.9 GB, 122942324736 bytes
    
    255 cabezas, 63 sectores/pistas, 14946 cilindros
    
    Unidades = cilindros de 16065 * 512 = 8225280 bytes
    
    Disk identifier: 0x25312531
    
    Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema
    
    /dev/sda1               1        2117    17004771   83  Linux
    
    Orden (m para obtener ayuda): t
    
    Se ha seleccionado la partición 1
    
    Código hexadecimal (escriba L para ver los códigos): fd
    
    Se ha cambiado el tipo de sistema de la partición 1 por fd (Linux raid autodetect)
    
    Orden (m para obtener ayuda): p
    
    Disco /dev/sda: 122.9 GB, 122942324736 bytes
    
    255 cabezas, 63 sectores/pistas, 14946 cilindros
    
    Unidades = cilindros de 16065 * 512 = 8225280 bytes
    
    Disk identifier: 0x25312531
    
    Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema
    
    /dev/sda1               1        2117    17004771   fd  Linux raid autodetect
    
    Orden (m para obtener ayuda): w
    
    ¡Se ha modificado la tabla de particiones!
    
    Llamando a ioctl() para volver a leer la tabla de particiones.
    
    Se están sincronizando los discos.
    
    $

    He elegido 17408 Mb como tamaño porque en uno de los discos a utilizar solo tengo eso disponible. Con la orden t se especifica el identificador de la partición, el valor hexadecimal fd representa el tipo «Linux raid autodetect».

    De igual modo crearemos otras dos particiones o estableceremos su identificador de tipo a fd en el caso de que ya exista la partición.

    En mi caso, debido a que las otras particiones que voy a incluir en el volumen RAID se encontraban en discos que contenían otras particiones utilizadas por el sistema, al escribir la tabla de particiones obtenía el siguiente mensaje:

    ¡Se ha modificado la tabla de particiones!
    Llamando a ioctl() para volver a leer la tabla de particiones.
    ATENCIÓN: La relectura de la tabla de particiones falló con el
    
    error 16: Dispositivo ó recurso ocupado.
    
    El núcleo todavía usa la tabla antigua.
    
    La nueva tabla se usará en el próximo reinicio.
    
    Se están sincronizando los discos.

    Por lo que tuve que reiniciar el sistema.

    El comando partprobe puede hacer que el núcleo actualice su tabla de particiones, evitando tener que reiniciar.

    $ sudo partprobe

    Una vez reiniciado el sistema con disponibles las tres particiones tipo fd (Linux raid autodetect) se instala el paquete mdadm:

     $ sudo apt-get install mdadm

    A continuación creamos el volumen RAID, le llamaré /dev/md0, será un volumen RAID5, por tanto selecciono nivel 5 y puesto que lo monto sobre 3 particiones (podrían ser más pero no menos para el nivel 5) indico el número de dispositivos y el nombre de cada uno de ellos:

    $ sudo /sbin/mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 \
    	 /dev/hda2 /dev/sda1 /dev/sdb2

    Ahora tenemos que crear una partición:

    $ sudo fdisk /dev/md0
    El dispositivo no contiene una tabla de particiones DOS válida ni una etiqueta de disco Sun o SGI o OSF
    Building a new DOS disklabel with disk identifier 0xcb76e3ca.
    Changes will remain in memory only, until you decide to write them.
    After that, of course, the previous content won't be recoverable.
    El número de cilindros para este disco está establecido en 8502336.
    No hay nada malo en ello, pero es mayor que 1024, y en algunos casos
    podría causar problemas con:
    1) software que funciona en el inicio (p.ej. versiones antiguas de LILO)
    2) software de arranque o particionamiento de otros sistemas operativos
       (p.ej. FDISK de DOS, FDISK de OS/2)
    Atención: el indicador 0x0000 inválido de la tabla de particiones 4 se corregirá mediante w(rite)
    Orden (m para obtener ayuda): n
    Acción de la orden
    e   Partición extendida
       p   Partición primaria (1-4)
    p
    Número de partición (1-4): 1
    Primer cilindro (1-8502336, valor predeterminado 1):
    Se está utilizando el valor predeterminado 1
    Último cilindro o +tamaño o +tamañoM o +tamañoK (1-8502336, valor predeterminado 8502336):
    Se está utilizando el valor predeterminado 8502336
    Orden (m para obtener ayuda): w
    ¡Se ha modificado la tabla de particiones!
    Llamando a ioctl() para volver a leer la tabla de particiones.
    ATENCIÓN: La relectura de la tabla de particiones falló con el
    error 22: Argumento inválido.
    El núcleo todavía usa la tabla antigua.
    La nueva tabla se usará en el próximo reinicio.
    Se están sincronizando los discos.

    Reiniciamos de nuevo.

  • Creación de Swap y Volumen LVM

    Aquí están los pasos a seguir para crear una partición LVM, y utilizar otra ya existente para Swap La partición 1 ya existe y será la de swap, ahora se crea la segunda:

    # fdisk /dev/sda
    El número de cilindros para este disco está establecido en 14946.
    No hay nada malo en ello, pero es mayor que 1024, y en algunos casos
    podría causar problemas con:
    1) software que funciona en el inicio (p.ej. versiones antiguas de LILO)
    2) software de arranque o particionamiento de otros sistemas operativos
    (p.ej. FDISK de DOS, FDISK de OS/2)
    Orden (m para obtener ayuda): n
    Acción de la orden
    e Partición extendida
    p Partición primaria (1-4)
    p
    Número de partición (1-4): 2
    Primer cilindro (251-14946, valor predeterminado 251):
    Se está utilizando el valor predeterminado 251
    Último cilindro o +tamaño o +tamañoM o +tamañoK (251-14946, valor predeterminado 14946):
    Se está utilizando el valor predeterminado 14946

    Ahora se indica el tipo de partición 8e (Linux LVM):

    Orden (m para obtener ayuda): t
    Número de partición (1-4): 2
    Código hexadecimal (escriba L para ver los códigos): 8e
    Se ha cambiado el tipo de sistema de la partición 2 por 8e (Linux LVM)

    Y la primera como tipo 82 (Linux swap):

    Orden (m para obtener ayuda): t
    Número de partición (1-4): 1
    Código hexadecimal (escriba L para ver los códigos): 82
    Se ha cambiado el tipo de sistema de la partición 1 por 82 (Linux swap / Solaris)

    Ahora se comprueban los cambios y se escriben en la tabla de particiones:

    Orden (m para obtener ayuda): p

    Disco /dev/sda: 122.9 GB, 122942324736 bytes
    255 cabezas, 63 sectores/pistas, 14946 cilindros
    Unidades = cilindros de 16065 * 512 = 8225280 bytes
    Disk identifier: 0x25312531

    Disposit. Inicio Comienzo Fin Bloques Id Sistema
    /dev/sda1 1 250 2008124+ 82 Linux swap / Solaris
    /dev/sda2 251 14946 118045620 8e Linux LVM

    Orden (m para obtener ayuda): w
    ¡Se ha modificado la tabla de particiones!

    Llamando a ioctl() para volver a leer la tabla de particiones.
    Se están sincronizando los discos.

    Ahora se configura el espacio de la primera partición para intercambio:

    #mkswap /dev/sda1
    Configurando espacio de intercambio versión 1, tamaño = 2056314 kB
    sin etiqueta, UUID=0d927953-17f8-494d-9895-1f0bbc4f82e3

    # swapon /dev/sda1
    # free
    total used free shared buffers cached
    Mem: 1804808 1622532 182276 0 42960 762496
    -/+ buffers/cache: 817076 987732
    Swap: 2008116 0 2008116

    #cat /proc/swaps
    Filename Type Size Used Priority
    /dev/sda1 partition 2008116 0 -1

    Para que la configuración se mantenga en sucesivos inicios del sistema se añade la siguiente línea en /etc/fstab con Kate o de cualquier otra forma:

    #kate /etc/fstab

    /media/swapfile	swap	swap	defaults	0	0

    Turno para la partición LVM. Primero se crea un «Volumen físico» en la partición. Será el espacio físico sobre el que podremos crear «grupos de volúmenes»:

    # pvcreate /dev/sda2
    Physical volume «/dev/sda2» successfully created

    Ahora se crea el «grupo de volúmenes»:

    #vgcreate Grupo02_Prescindibles /dev/sda1
    Volume group «Grupo02_Prescindibles» successfully created

    Y dentro del grupo se crea un «volumen lógico», que será donde finalmente se configure el sistema de ficheros:

    #lvcreate Grupo02_Prescindibles -n VL01_Espejo -L 20G
    Logical volume «VL01_Espejo» created

    Creación de un sistema de ficheros ext3:

    #mkfs.ext3 /dev/Grupo02_Prescindibles/VL01_Espejo
    mke2fs 1.40.2 (12-Jul-2007)
    Etiqueta del sistema de ficheros=
    Tipo de SO: Linux
    Tamaño del bloque=4096 (bitácora=2)
    Tamaño del fragmento=4096 (bitácora=2)
    2621440 nodos i, 5242880 bloques
    262144 bloques (5.00%) reservados para el súper usuario
    Primer bloque de datos=0
    Número máximo de bloques en el sistema de archivos=4294967296
    160 bloque de grupos
    32768 bloques por grupo, 32768 fragmentos por grupo
    16384 nodos i por grupo
    Respaldo del súper bloque guardado en los bloques:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
    4096000

    Mientras se escribían las tablas de nodos i: terminado
    Creando el fichero de transacciones (32768 bloques): hecho
    Escribiendo superbloques y la información contable del sistema de ficheros: hecho

    Este sistema de archivos se revisará automáticamente cada 38 meses o
    180 días, lo que suceda primero. Utilice tune2fs -c o -i para cambiarlo.

    Lógicamente no son 38 meses (months) sino 38 montajes del sistema (mounts), un pequeño desliz en la traducción.

    Una vez creado el sistema de ficheros se crea un directorio que servirá como punto de montaje y se monta en la estructura de ficheros del sistema:

    #mkdir /mnt/Espejo
    # mount /dev/Grupo02_Prescindibles/VL01_Espejo /mnt/Espejo

    Se configura también /etc/fstab para que monte el sistema de ficheros automáticamente en los siguientes inicios del sistema:

    #kate /etc/fstab

    /dev/Grupo02_Prescindibles/VL01_Espejo    /mnt/Espejo    ext3    defaults    0    0
    #

    Agradecimientos al contenido que me sirvió de referencia: http://alufis35.uv.es/Gestor-de-Volumenes-Logicos-LVM.html

  • Cómo pasé mi sistema a una partición LVM

    Bueno, en primer lugar con muchas penurias, pero cuando conseguí toda la información que necesitaba (después de intentarlo sin toda ella) no resultó tan difícil.

    En primer lugar copio todo el contenido de la partición raíz a la nueva partición LVM que previamente habré montado:

    sudo cp -pPrvx / /nueva_raiz_LVM

    El -p para preservar los permisos, -P para que no siga los enlaces, -r para recursividad, -x para que sólo copie ese sistema de ficheros y no otros que hay montados (los generados por el propio sistema, como /proc y los que tengo como /home) y el -v porque me gusta ver el proceso.

    Igual hice con la partición boot (no se puede arrancar desde una partición LVM) copié todo el contenido de la actual.

    A continuación (aquí empezaron los intentos fallidos) se prepara la partición boot para el arranque. Puse la etiqueta de arranque en la partición boot:

    # fdisk /dev/hda
    Orden (m para obtener ayuda): a
    Número de partición (1-4): 1
    
    Orden (m para obtener ayuda): w

    Monto la partición que será /boot en el directorio boot del sistema de ficheros de la partición LVM que será la nueva raíz del sistema (no sé si es necesario hacerlo así pero no molesta y me funcionó así):

    # mount /dev/hda1 /nueva_raiz_LVM/boot

    Y ahora configuro el arranque por la futura partición boot:

    # grub-install /dev/hda --root-directory=/nueva_raiz_LVM

    Lo conseguido hasta ahora es que se pueda iniciar el arranque por la nueva partición boot, ahora hay que configurar el arranque para que cargue el sistema desde la nueva partición LVM. Para esto edito el fichero menu.lst de grub:

    title           Ubuntu 7.10, kernel 2.6.22-14-generic
    root            (hd0,0)
    kernel          /vmlinuz-2.6.22-14-generic ro quiet splash root=/dev/Grupo00/1_Sistema
    initrd          /initrd.img-2.6.22-14-generic

    Descubrir que necesitaba el parámetro root para la línea del kernel fue el último problema que encontré ya que en mi anterior menu.lst no existía ese parámetro.

    Mientras terminaba de escribir esto y vi en una de las páginas de referencia el parámetro boot pensé que sería la solución al hecho de que la partición /dev/hda1 (la boot) no me apareciera montada en /boot a pesar de que el arranque se realizara desde allí. Así que añadí boot=/dev/hda1 a la línea del kernel pero me fastidió el arranque así que lo dejé así aunque siga sin montarse la partición de boot en /boot.

    Y con el arranque configurado hay que modificar /etc/fstab para que monte las nuevas particiones:

    /dev/Grupo00/1_Sistema /        ext3    defaults,errors=remount-ro      0       1
    /dev/hda1       /boot           ext3    defaults        0       2

    Bueno visto así creo que parece tan sencillo como es, lo complicado es hacerlo sin tener más que la idea de hacerlo, complicado pero más divertido.

    Doy las gracias a las referencias que me ayudaron a conseguirlo:

  • Instalación de APEX 3.1 sobre Oracle XE 10g

    Una vez instalada la base de datos XE tenemos que configurar un parámetro de la misma, tal como se indica en los requisitos:

    Oracle Application Express requires the shared_pool_size of the target database to be at least 100 MB.

    To check the shared_pool_size of the target database:

    1. Start the database:
      $ sqlplus /nolog
      connect sys@xe as sysdba
      SQL> STARTUP
    2. If necessary, enter the following command to determine whether the system uses an initialization parameter file (initsid.ora) or a server parameter file (spfiledbname.ora):
      SQL> SHOW PARAMETER PFILE;

      This command displays the name and location of the server parameter file or the initialization parameter file.

    3. Determine the current values of the shared_pool_size parameter:
      SQL> SHOW PARAMETER SHARED_POOL_SIZE
    4. If the system is using a server parameter file, set the value of the SHARED_POOL_SIZE initialization parameter to at least 100 MB:
      SQL> ALTER SYSTEM SET SHARED_POOL_SIZE='100M' SCOPE=spfile;
    5. If the system uses an initialization parameter file, change the values of the SHARED_POOL_SIZE parameter to at least 100 MB in the initialization parameter file (initsid.ora).
    6. Shut down the database:
      SQL> SHUTDOWN
    7. Restart the database (tuve que hacerlo así porque un STARTUP me devolvía el error «ORA-12514: TNS:listener does not currently know of service requested in connect descriptor»):
      EXIT
      # /etc/init.d/oracle-xe restart

    También se puede hacer un «SHUTDOWN IMMEDIATE» para no esperar media hora a que cierren las sesiones. Este modo cierra todas las operaciones con COMMIT hecho antes de cerrar la base de datos.

    Después, tras comprobar con la siguiente orden que no tenía la versión 10.1.2.0.6 o superior del PL/SQL Web Toolkit sino la 10.1.2.0.4

    select owa_util.get_version from dual;

    tuve que actualizar previamente a la instalación del APEX 3.1 la versión del Web Toolkit que incluye. Como indica el README.TXT incluido en el directorio apex/owa.

    Installing the PL/SQL Web Toolkit 10.1.2.0.6
    ——————————————–
    1) Stop all applications using the database
    2) Navigate to the directory apex/owa
    3) Connect via SQL*Plus as the database user SYS
    4) Run the PL/SQL Web Toolkit installation script by issuing:

      @owainst.sql

    5) Review the output displayed from owainst.sql and ensure no errors were encountered.
    6) Confirm the PL/SQL Web Toolkit version is 10.1.2.0.6 or greater by connecting to the database
    as the SYS user and running the query:

    select owa_util.get_version from dual;

    7) Run the utlrp.sql script from the Oracle Database home to recompile all invalid PL/SQL
    packages now instead of when the packages are accessed for the first time. This step is
    optional but recommended. To run utlrp.sql, issue:

     @?/rdbms/admin/utlrp.sql

    Tendremos que esperar hasta que obtengamos el resultado:

    ERRORS DURING RECOMPILATION
    ---------------------------
                              0
    PL/SQL procedure successfully completed.

    Una vez cumplidos los requisitos reiniciamos la base de datos e instalamos el APEX en modo Full development environment, tal como indica la gúia de instalación:

    1. Descomprimir el archivo de instalación de APEX 3.1, el mismo que contiene el README.TXT mencionado previamente, y desde el directorio apex descomprimido ejecutar:
    2. $ sqlplus /nolog
      connect sys@xe as sysdba
    3. Comenzamos la instalación, esto se llevará un buen rato:
      @apexins tablespace_apex tablespace_files tablespace_temp images
      
      

      Al finalizar obtendremos las direcciones para las distintas secciones del APEX:

       The structure of the link to the Application Express administration services is as follows:
       http://host:port/pls/apex/apex_admin (Oracle HTTP Server with mod_plsql)
       http://host:port/apex/apex_admin     (Oracle XML DB HTTP listener with the embedded PL/SQL gateway)
      The structure of the link to the Application Express development interface is as follows:
       http://host:port/pls/apex (Oracle HTTP Server with mod_plsql)
       http://host:port/apex     (Oracle XML DB HTTP listener with the embedded PL/SQL gateway)
    4. Cambiar la contraseña del usuario admin del APEX:

      @apxchpwd
    5. Configurar APEX:
      # /etc/init.d/oracle-xe restart
      $ sqlplus /nolog
      connect sys@xe as sysdba
      @apex_epg_config /tmp
      
    6. Desbloquear el usuario anónimo:
      ALTER USER ANONYMOUS ACCOUNT UNLOCK;
    7. Especificar el directorio de imágenes (si hemos probado el interfaz web veremos que no están disponibles):
      @apxldimg.sql /tmp
    8. Opcionalmente podemos comprobar el puerto utilizado por Oracle XML DB HTTP Server:
      SELECT DBMS_XDB.GETHTTPPORT FROM DUAL;
    9. Podemos cambiar el puerto o deshabilitar el servicio especificando el puerto 0 con la siguiente orden:
      EXEC DBMS_XDB.SETHTTPPORT(port);
    10. Configurando Oracle HTTP Server
      ALTER USER APEX_PUBLIC_USER ACCOUNT UNLOCK;
      ALTER USER APEX_PUBLIC_USER IDENTIFIED BY new_password;
  • ¿Conseguí? funcionar el driver rt2500

    En primer lugar uso Kubuntu 8.04 Hardy Heron. Tengo una Conceptronic C54Ri basada en el chip RT2500. Un lspci me la identifica así:

    01:0a.0 Network controller: RaLink RT2500 802.11g Cardbus/mini-PCI (rev 01)

    La instalación del driver para RT2500 desde los paquetes oficiales de Ubuntu y el uso de module-assistant no me funcionaba, así que busqué una descripción específica de pasos para la instalación. Es decir, hacer la instalación a mano.

    El primer buen documento que encontré fue este de la documentación de Ubuntu ofrecida por la comunidad. En él se indican unos pasos válidos para instalar el driver pero debía estar algo desfasado ya que no pude instalar RaConfig2500 tal como se indicaba. En la descarga del estado actual de rt2500 no se proporcionaba el código de RaConfig dentro del directorio Utilitys y lo intenté también con la beta v1.1.0-b4 pero aunque sí estaba el código fuente no logré compilarlo.

    Después instalé RutilT 0.16 en lugar de RaConfig2500 y conseguí ver las redes inalámbricas de mi entorno y hasta conectar con la mía, pero… la conexión duraba unos segundos se perdía y volvía. Así de forma continua.

    Cuando ya estaba pensando en utilizar ndiswrapper dí con este otro documento donde además de valorar, acertadamente en mi opinión, los efectos de las dificultades que sufrimos los usuarios de WiFi con Linux, se describe lo que fue la solución para el autor y que también espero que sea la mia.

    El autor realizó todo el proceso como superusuario y aunque, en teoría, algunos pasos no lo requieren, yo voy a imitarle.

    sudo su

    Después instalo el driver descomprimiendo la última actualización del código en desarrollo desde la página de descargas de rt2x00.serialmonkey.com y ejecutando make y make install. Hasta aquí bien.

    A continuación el autor indica que RaConfig ha sido despreciado (deprecated) en favor de RutilT y que la última y anteriores versiones se pueden obtener desde la página de RutilT. La instalación es también simple:

    ./configure.sh; make; make install

    Ahora un reinicio y continuo escribiendo.

    Bueno, ahora un reinicio del servicio de red y levantamos el interfaz inalámbrico por si no está por defecto así indicado:

    /etc/init.d/networking restart

    ifup ra0

    o si el interfaz se llama wlan0:

    ifup wlan0

    Ahora ejecutamos rutilt:

    sudo rutilt

    Vamos a «Site survey» para ver las redes al alcance, seleccionamos la nuestra y añadimos un perfil para ella pulsando en «Add Profile». Para crear el nuevo perfil indicamos un nombre e introducimos la contraseña en el campo «Key».

    Ahora vamos al apartado «Profiles», seleccionamos nuestro perfil y pulsamos en «Aplicar». Tras lo cual deberemos poder conectar. Para ver información sobre la conexión podemos ir al apartado «Link Status».

    Podemos comprobar si ha guardado el perfil viendo el contenido del directorio ~/.config/rutilt/, si no se ha guardado el perfil puede ser necesario matar la ventana de rutilt:

    sudo killall -q rutilt

    Si tras iniciar sesión no arranca automáticamente rutilt podemos lanzarlo desde la línea de comandos así:

    rutilt ra0 -d -p <<Nombre del perfil>>

    Aquí terminan los pasos indicados en el artículo «Ubuntu and WPA«. En principio a mí también me funcionaron. Pero…

    Pero al reiniciar la conexión se iba a los 5 segundos, volvía al rato y de nuevo se perdía tras 5 segundos. De nuevo pensando en ndiswrapper, una tarjeta nueva, un punto de acceso inalámbrico como enlace y conectarme a él por cable, …

    Ya a la desesperada cerré rutilt, desinstalé todos los paquetes (excepto los fuentes) relativos a rt2500 y reinstalé el driver mediante module-assistant:

    sudo module-assistant install rt2500

    Y ahora está funcionando, en apariencia, perfectamente. Emitiré un juicio cuando lo haya probado descargando algún torrent. De momento no me atrevo ni a reiniciar para comprobar si lo coge en el inicio del sistema.