jueves, 25 de octubre de 2007

Simular un raid lineal con LVM partiendo de un disco con información

   Como continuación de la entrada anterior en la que contaba cómo crear un raid 1 a partir de un disco con datos y teniendo uno nuevo, ahora voy a responder a la pregunta que dejaba abierta al final. No obstante tengo que decir que tanto Super coco como Rubick se adelantaron a la solución en los comentarios del post.

   Si recordamos, el truco de crear el raid 1 con un único disco no funcionaba para un raid lineal, así que, ¿qué podemos hacer?. La solución que se me ha ocurrido es usar LVM. Aunque no es exactamente un raid lineal el resultado final es el mismo puesto que tenemos un único punto de montaje y la capacidad de los dos discos.

   Al igual que en el artículo anterior, no me voy a extender demasiado en los detalles puesto que mi anterior artículo sobre LVM en linux es más completo.
  • Partimos de la misma situación que en la entrada anterior. Ya existe la partición /dev/sda1 y se encuentra montada en /mnt/datos.
  • Particionamos el nuevo disco como LVM (tipo 8e).
    shian:~# fdisk /dev/sdb
    ...
    Disk /dev/sdb: 1073 MB, 1073741824 bytes
    255 heads, 63 sectors/track, 130 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes

    Device Boot Start End Blocks Id System
    /dev/sdb1 1 130 1044193+ 8e Linux LVM
    ...
  • Creamos un PV y un VG en él.
    shian:~# pvcreate /dev/sdb1
    Physical volume "/dev/sdb1" successfully created

    shian:~# vgcreate vg01 /dev/sdb1
    Volume group "vg01" successfully created
  • Ahora creamos un lvol con toda la capacidad del disco:
    shian:~# lvcreate -L 1G -n lvdatos vg01
    Logical volume "lvdatos" created
  • Lo formateamos, lo montamos y copiamos los datos que ya tenemos.
    shian:~# mkfs.ext3 /dev/vg01/lvdatos

    shian:~# mkdir /mnt/datos_lvm
    shian:~# mount /dev/vg01/lvdatos /mnt/datos_lvm/

    shian:~# cp -a /mnt/datos/* /mnt/datos_lvm/
  • No perdamos de vista el espacio que tenemos disponible:
    shian:~# df -h
    /dev/sda1 1004M 43M 911M 5% /mnt/datos
    /dev/mapper/vg01-lvdatos
    1001M 18M 932M 2% /mnt/datos_lvm
  • Ahora desmontamos la partición con los datos originales, la eliminamos y creamos una nueva de tipo LVM.
    shian:~# umount /dev/sda1
    shian:~# fdisk /dev/sda
    ...
    Disk /dev/sda: 1073 MB, 1073741824 bytes
    255 heads, 63 sectors/track, 130 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes

    Device Boot Start End Blocks Id System
    /dev/sda1 1 130 1044193+ 8e Linux LVM
  • Creamos un PV en el antiguo disco que acabamos de particionar.
    shian:~# pvcreate /dev/sda1
    Physical volume "/dev/sda1" successfully created
  • Y lo añadimos al VG que creamos al principio para ampliarlo.
    shian:~# vgextend vg01 /dev/sda1
    Volume group "vg01" successfully extended
  • Si mostramos la información del VG, podemos ver que ahora los dos discos forman parte de él y que tenemos 1016MB nuevos disponibles para utilizar, por lo que podemos ampliar el lvol.
    shian:~# vgdisplay -v vg01
    Using volume group(s) on command line
    Finding volume group "vg01"
    --- Volume group ---
    VG Name vg01
    System ID
    Format lvm2
    Metadata Areas 2
    Metadata Sequence No 3
    VG Access read/write
    VG Status resizable
    MAX LV 0
    Cur LV 1
    Open LV 1
    Max PV 0
    Cur PV 2
    Act PV 2
    VG Size 1.98 GB
    PE Size 4.00 MB
    Total PE 508
    Alloc PE / Size 254 / 1016.00 MB
    Free PE / Size 254 / 1016.00 MB
    VG UUID fYT1oQ-w6zH-z6b6-58eo-qZ39-u1Ua-vROsN4

    --- Logical volume ---
    LV Name /dev/vg01/lvdatos
    VG Name vg01
    LV UUID NBOF9q-jmfW-RCik-MH2P-0Od4-DgMR-5YRJf7
    LV Write Access read/write
    LV Status available
    # open 1
    LV Size 1016.00 MB
    Current LE 254
    Segments 1
    Allocation inherit
    Read ahead sectors 0
    Block device 253:0

    --- Physical volumes ---
    PV Name /dev/sdb1
    PV UUID yH8UHo-Vgy2-Pk9t-AozF-s1Ik-JPmL-og1kM4
    PV Status allocatable
    Total PE / Free PE 254 / 0

    PV Name /dev/sda1
    PV UUID 4cGeH2-nl7W-eH4a-mBHo-BCBI-b0np-f6gw1v
    PV Status allocatable
    Total PE / Free PE 254 / 254
  • Y finalmente lo ampliamos. Recordemos que primero ampliamos el lvol y luego el filesystem.
    shian:~# lvextend -L+1016M /dev/vg01/lvdatos
    Extending logical volume lvdatos to 1.98 GB
    Logical volume lvdatos successfully resized

    shian:~# umount /mnt/datos_lvm/

    shian:~# e2fsck -f /dev/vg01/lvdatos

    shian:~# resize2fs /dev/vg01/lvdatos
    The filesystem on /dev/vg01/lvdatos is now 520192 blocks long.
  • Y ya estaría ampliado sin necesidad de formateos.
    shian:~# df -h
    Filesystem Size Used Avail Use% Mounted on
    /dev/mapper/vg01-lvdatos
    2.0G 43M 1.9G 3% /mnt/datos_lvm

  •    Y con esto respodo a la duda inicial que me planteó Renato. Espero que te sea útil.

    viernes, 19 de octubre de 2007

    Crear un raid 1 a partir de un disco con datos sin formatear

       Hace unos días recibí un email de un lector de este blog, Renato, diciéndome que tiene un NSLU2 con Debian, qué envidía :-P, y con un disco duro muy lleno. Me preguntaba si podía añadir un nuevo disco y crear un raid sin tener que reformatear.

       Me picó la curiosidad y el resultado es este tutorial. No voy a extenderme demasiado en las explicaciones puesto que en el tutorial del raid 1 que hice hace tiempo se puede encontrar la información más detallada. Manos a la obra!.
  • Como preparación he creado una partición /dev/sda1, la he montado en /mnt/datos y he copiado algo de información en ella. Esta sería la partición que ya tenemos casi llena y no queremos tener que formatearla.
  • Vamos a crear un raid 1 con el otro disco (el disco nuevo que todavía no tiene información). Particionamos como tipo fd:
    shian:~# fdisk /dev/sdb
    ...
    Disk /dev/sdb: 1073 MB, 1073741824 bytes
    255 heads, 63 sectors/track, 130 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes

    Device Boot Start End Blocks Id System
    /dev/sdb1 1 130 1044193+ fd Linux raid autodetect
    ...
  • Y ahora viene el paso más importante en la creación del raid. Creamos el raid 1 pero con un único disco/partición. La clave es utilizar sólo la partición del nuevo disco /dev/sdb1 y en el otro poner missing, de tal forma que el raid 1 se crea degradado porque sólo existe un disco.
    shian:~# mdadm --create --verbose /dev/md1 --level=1 --raid-devices=2 /dev/sdb1 missing
    mdadm: size set to 1044096K
    mdadm: array /dev/md1 started.
  • Si aparece el error mdadm: error opening /dev/md1: No such file or directory deberemos crear el dispositivo mdX primero, según el que necesitemos:
    shian:~# mknod /dev/md0 b 9 0
    shian:~# mknod /dev/md1 b 9 1
    shian:~# mknod /dev/md2 b 9 2
    ...
  • Si miramos el fichero /proc/mdstat nos fijamos en el que raid está disponible pero sólo con un disco.
    shian:~# cat /proc/mdstat
    Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
    md1 : active raid1 sdb1[0]
    1044096 blocks [2/1] [U_]
  • Lo mismo ocurre si mostramos la información del raid:
    shian:~# mdadm --detail /dev/md1
    /dev/md1:
    Version : 00.90.03
    Creation Time : Fri Sep 28 08:09:16 2007
    Raid Level : raid1
    Array Size : 1044096 (1019.80 MiB 1069.15 MB)
    Device Size : 1044096 (1019.80 MiB 1069.15 MB)
    Raid Devices : 2
    Total Devices : 1
    Preferred Minor : 1
    Persistence : Superblock is persistent

    Update Time : Fri Sep 28 08:09:16 2007
    State : clean, degraded
    Active Devices : 1
    Working Devices : 1
    Failed Devices : 0
    Spare Devices : 0

    UUID : b0e5f96e:12266294:54e4f551:119b56e7
    Events : 0.1

    Number Major Minor RaidDevice State
    0 8 17 0 active sync /dev/sdb1
    1 0 0 1 removed
  • Formateamos el raid y lo montamos en /mnt/datos_raid. Así, estaría disponible para ser utilizado, pero con un único disco. Además, copiamos la información del disco antiguo (recordemos que está montado en /mnt/datos) al raid.
    shian:~# mkfs.ext3 /dev/md1
    shian:~#
    shian:~# mkdir /mnt/datos_raid
    shian:~# mount /dev/md1 /mnt/datos_raid
    shian:~#
    shian:~# cp -a /mnt/datos/* /mnt/datos_raid
  • En este punto ya tenemos toda la información en el raid. Ahora desmontamos la partición de nuestros datos /dev/sda1, particionamos el disco y creamos la partición de tipo raid (fd).
    shian:~# umount /dev/sda1
    shian:~# fdisk /dev/sda
    ...
    Disk /dev/sda: 1073 MB, 1073741824 bytes
    255 heads, 63 sectors/track, 130 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes

    Device Boot Start End Blocks Id System
    /dev/sda1 1 130 1044193+ fd Linux raid autodetect
    ...
  • Y ahora añadimos al raid /dev/md1 la partición que acabamos de crear:
    shian:~# mdadm --manage /dev/md1 --add /dev/sda1
    mdadm: added /dev/sda1
  • Después de un tiempo el raid estará reconstruido con toda nuestra información a salvo en ambos discos:
    shian:~# cat /proc/mdstat
    Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
    md1 : active raid1 sda1[1] sdb1[0]
    1044096 blocks [2/2] [UU]
  • El paso final es actualizar el archivo de configuración /etc/mdadm/mdadm.conf con el nuevo raid.
    shian:~# cd /etc/mdadm
    shian:/etc/mdadm# cp mdadm.conf mdadm.conf.`date +%y%m%d`
    shian:/etc/mdadm# echo "DEVICE partitions" > mdadm.conf
    shian:/etc/mdadm# mdadm --detail --scan >> mdadm.conf
  • Y añadir al archivo /etc/fstab el montaje automático del raid en el arranque.
    shian:~# echo "/dev/md1        /mnt/datos       ext3    defaults        0       2" >> /etc/fstab

  •    Hemos visto cómo pasar de una configuración con un único disco a otra basada en un raid 1 sin tener que salvar toda nuestra información en otro medio independiente y reformatear todo a la vez.

       Lamentablemente, lo que quería hacer nuestro compañero Renato era crear un raid JBOD (o lineal), cosa que no entendí yo en un primer momento y me lancé a probarlo con un raid 1. Si intentamos crear el raid lineal con un único disco vemos que no es posible. Aunque el mensaje de mdadm no es muy claro, con dmesg vemos realmente la causa:
    shian:~# mdadm --create --verbose /dev/md2 --level=linear --raid-devices=2 /dev/sdb1 missing
    mdadm: chunk size defaults to 64K
    mdadm: RUN_ARRAY failed: Invalid argument
    mdadm: stopped /dev/md2

    shian:~# dmesg
    ...
    linear: not enough drives present. Aborting!
    md: pers->run() failed ...
    md: md3 stopped.
    md: unbind
    md: export_rdev(sdb1)

       La solución a cómo poder hacer esto sin tener que reformatear en el próximo post :-).

    jueves, 11 de octubre de 2007

    Ocultar la ventana de "Equipo Bloqueado" en Windows

       Siempre que bloqueamos una máquina con Windows NT/2K/XP aparece una ventana indicando que el equipo está bloqueado y nuestro nombre de usuario. Esta ventana aparece en el centro de la pantalla, por lo que si tenemos una foto de fondo, lo más probable es que tape el motivo principal de la foto. En mi caso, en el ordenador del trabajo, cuando bloqueo el equipo lo que veo es:

       En este artículo lo que vamos a ver es cómo ocultar esta ventana para que al bloquear el equipo se muestre la foto a pantalla completa.

       Para poder hacer este pequeño hack lo único que necesitamos es acceso a la consola de recuperación como administrador de la máquina (también serviría un live-cd de linux y NTFS-3G) y el Resource Hacker. Este programa sirve para ver, modificar y borrar recursos en archivos ejecutables, dlls,.... Podemos cambiar el texto de un diálogo, los iconos, eliminar una parte que no nos guste. Es bastante potente y sencillo de utilizar. ¡Empecemos!.
  • El diálogo que vamos a modificar se encuentra en la dll C:\Windows\system32\msgina.dll. La copiamos a C:\ pues que en la ubicación original no la podemos usar porque está bloqueada.
  • Ejecutamos el Resource Hacker y abrimos la dll.
  • En el menú Dialog -> 1900 vemos la ventana que vamos a modificar.
  • Podemos juguetear con el código para cambiar los textos y pulsando el botón Compile Script vemos cómo quedaría. En nuestro caso, para ocultarla completamente lo que hacemos es reemplazar el código por el siguiente:
    1900 DIALOGEX 0, 0, 0, 0
    STYLE WS_POPUP | WS_VISIBLE
    CAPTION ""
    LANGUAGE LANG_SPANISH, 0x3
    FONT 0, ""
    {
    }
  • Nuevamente pulsamos el botón Compile Script, salvamos los cambios y reiniciamos el equipo para entrar en la consola de recuperación.
  • Ahora vamos a sobreescribir la dll original (recordad hacer copia de seguridad) por la modificada. La dll se encuentra en C:\Windows\system32\ y también en C:\Windows\system32\dllcache\ y es necesario reemplazar las dos copias.
    copy c:\msgina.dll c:\windows\system32
    copy c:\msgina.dll c:\windows\system32\dllcache
  • Reinciamos de nuevo la máquina, entramos en windows y bloqueamos el equipo. Si hemos hecho todo bien el resultado debería ser algo parecido a esto (se ve la foto a pantalla completa sin ninguna ventana).
  • Aunque la ventana no se vea, realmente está ahí y el equipo está bloqueado, por lo que pulsamos CTRL+ALT+SUPR, introducimos nuestro password y a trabajar.

  •    Ahora ya, cuando os levantéis de vuestro sitio, lo único que tenéis que hacer es pulsar las teclas WIN + L y disfrutar con el fondo.

    viernes, 5 de octubre de 2007

    La gran comunidad Linux

       Otra de las cosas que aún no puedo hacer con linux es utilizar mi receptor infrarrojos usb para pasar canciones o fotos a mi móvil, así que tengo que usar nuevamente windows :-(.

       Una de las grandes ventajas de Linux y su gran comunidad de desarrolladores que hay detrás es que puedes abrir un bug y esperar a que alguien lo resuelva. Eso es lo que hice y se puede ver aquí (no vale reirse de mi inglés). Aunque han tardado más de un mes en mirarlo, me han dado las gracias por abrir el bug, pero como no es nada importante está parado. ¿Gracias a mi?. No, gracias a vosotros que hacéis posible que exista este sistema operativo que poco a poco nos está liberando del que llevamos tanto tiempo arrastrando.

       Ahora sólo queda esperar a que alguien lo arregle, aunque con la inminente salida de la próxima versión de Ubuntu para el 18 de este mes, con nueva versión del kernel incluída (2.6.22), es probable que se haya corregido. Y si no, pues a reabrirlo de nuevo porque desgraciadamente mis conocimientos de programación no llegan al nivel para poder arreglarlo yo mismo.

       ¿No es mágnifico poder abrir un bug del sistema operativo y que alguien lo pueda arreglar sin depender de una "megacorporación"?.

    lunes, 1 de octubre de 2007

    Mi nuevo gadget...

       ...un iPod Classic 80GB. Un amigo, Jose, ha estado una semana en Nueva York y con la gran diferencia entre el dolar y el euro he aprovechado para encargale este nuevo juguetito. Llevaba ya mucho tiempo detrás de un iPod y por fín me he decidido con este.

       La verdad es que de momento no me ha dado tiempo a hacer demasiado, me bajé el iTunes, lo instalé, actualicé el iPod y copié unas cuantas canciones y fotos para probarlo.

       Como sabéis, no existe iTunes para Linux, por lo que de momento no he tenido más remedio que usar windows. Además, en esta nueva generación de iPods, Apple ha hecho un pequeño cambio en la base de datos y los programas para linux no funcionan correctamente. Menos mal que en poco tiempo la comunidad linux ha encontrado la solución y en breve tendremos acceso de nuevo. Yo lo he conectado en linux y me lo reconoció perfectamente, he incluso se autoejecutó Rhythmbox, montó el iPod y me mostró todas las canciones. La pega fue que al sincronizarlo éstas se "perdieron" por el problemilla anterior que he comentado. Creo que Apple debería pensar un poco en toda la gente que compra sus productos y dar la oportunidad de utilizar iTunes en linux. Otra cosa es que lo usemos :-P.

       En fin, que poco a poco terminaré de etiquetar bien todos mis mp3 (¿alguien conoce un programa bueno para esto?), buscar las carátulas e ir pasando todas las canciones al iPod. Además tengo pendiente convertir algún video a ver qué tal se ven. Mientras tanto os dejo con unas fotos del juguetito: