jueves, 28 de septiembre de 2017

Hans Reiser y sus desgracias

En el día de la fecha me encontré con un nuevo desafío en la cruzada eterna entre el sysadmin y sus ganas de montar cosas raras: un viejo Suse 10 con filesystems basados en ReiserFS, o mejor dicho, sólo su disco.
El tema es que el disco se conectó en un sistema CentOS 7, el cual, como sabemos, no soporta este filesystem en forma nativa.
Parecía casi imposible, pero sorteamos el problema con un par de trucos sencillos, que pueden calmar el dolor de cabeza de varios colegas.
Si uno quisiera montar el filesystem en cuestión, se encontraría con un mensaje poco esperanzador, del estilo:

mount: unknown filesystem type 'reiserfs'

Entonces, nos proponemos cargar este módulo. El tema es desde dónde. Aquí viene el primero de los trucos, de la mano de "El Repo", a quien le estaré muy agradecido por un buen tiempo por entregar, entre otros, los paquetes kmod-reiserfs y reiserfs-utils:

# rpm --import http://elrepo.org/RPM-GPG-KEY-elrepo.org
# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# yum update
# yum install kmod-reiserfs reiserfs-utils

El tema es que si queremos cargar el módulo de kernel como siempre lo hacemos, con modprobe o insmod, encontraremos que no se cargará, y obtendremos este mensaje:

# modprobe reiserfs
modprobe: ERROR: could not insert 'reiserfs': Invalid argument

...y al ejecutar el comando "dmesg", la salida será la siguiente, o muy parecida:

[13206.924669] reiserfs: disagrees about version of symbol d_instantiate
[13206.924674] reiserfs: Unknown symbol d_instantiate (err -22)
[13206.924679] reiserfs: disagrees about version of symbol page_put_link
[13206.924681] reiserfs: Unknown symbol page_put_link (err -22)
[13206.924713] reiserfs: disagrees about version of symbol lookup_one_len
[13206.924715] reiserfs: Unknown symbol lookup_one_len (err -22)
[13206.924741] reiserfs: disagrees about version of symbol replace_mount_options
[13206.924744] reiserfs: Unknown symbol replace_mount_options (err -22)
[13206.924767] reiserfs: disagrees about version of symbol d_make_root
[13206.924769] reiserfs: Unknown symbol d_make_root (err -22)
[13206.924780] reiserfs: disagrees about version of symbol generic_readlink
[13206.924782] reiserfs: Unknown symbol generic_readlink (err -22)
[13206.924796] reiserfs: disagrees about version of symbol d_splice_alias
[13206.924798] reiserfs: Unknown symbol d_splice_alias (err -22)
[13206.924822] reiserfs: disagrees about version of symbol generic_permission
[13206.924825] reiserfs: Unknown symbol generic_permission (err -22)
[13206.924885] reiserfs: disagrees about version of symbol mnt_want_write_file
[13206.924888] reiserfs: Unknown symbol mnt_want_write_file (err -22)
[13206.924940] reiserfs: disagrees about version of symbol mnt_drop_write_file
[13206.924942] reiserfs: Unknown symbol mnt_drop_write_file (err -22)
[13206.924946] reiserfs: disagrees about version of symbol page_follow_link_light
[13206.924948] reiserfs: Unknown symbol page_follow_link_light (err -22)
[13206.924969] reiserfs: disagrees about version of symbol shrink_dcache_sb
[13206.924971] reiserfs: Unknown symbol shrink_dcache_sb (err -22)
[13206.925040] reiserfs: disagrees about version of symbol d_obtain_alias
[13206.925043] reiserfs: Unknown symbol d_obtain_alias (err -22)
[13206.925067] reiserfs: disagrees about version of symbol d_delete
[13206.925069] reiserfs: Unknown symbol d_delete (err -22)
[13206.925123] reiserfs: disagrees about version of symbol dput
[13206.925125] reiserfs: Unknown symbol dput (err -22)
[13206.925138] reiserfs: disagrees about version of symbol blkdev_issue_flush
[13206.925140] reiserfs: Unknown symbol blkdev_issue_flush (err -22)
[13206.925160] reiserfs: disagrees about version of symbol d_set_d_op
[13206.925162] reiserfs: Unknown symbol d_set_d_op (err -22)
[13206.925179] reiserfs: disagrees about version of symbol save_mount_options
[13206.925182] reiserfs: Unknown symbol save_mount_options (err -22)

Entonces, para verificar el módulo de kernel, ejecutaremos: 

# modprobe -v reiserfs
insmod /lib/modules/3.10.0-693.2.2.el7.x86_64/kernel/fs/reiserfs/reiserfs.ko
modprobe: ERROR: could not insert 'reiserfs': Invalid argument

Lo interesante del caso, es que ese directorio y archivo no existen, pero sí existe el siguiente (el motivo por el cual lo cargó en un kernel anterior, antes de varias actualizaciones, lo estaré investigando en mis ratos libres: nunca): 

# ls -l /usr/lib/modules/3.10.0-229.el7.x86_64/extra/reiserfs/reiserfs.ko
-rw-r--r-- 1 root root 377272 Mar  8  2015 /usr/lib/modules/3.10.0-229.el7.x86_64/extra/reiserfs/reiserfs.ko

Entonces, sencillamente creamos el directorio, y copiamos el archivo: 

# mkdir /lib/modules/3.10.0-693.2.2.el7.x86_64/kernel/fs/reiserfs/
# cp /usr/lib/modules/3.10.0-229.el7.x86_64/extra/reiserfs/reiserfs.ko /lib/modules/3.10.0-693.2.2.el7.x86_64/kernel/fs/reiserfs/

Ahora, cuando lo queremos cargar, vemos que el mensaje no ha variado. Entonces, viene el último de los trucos, que nos permite cargarlo de cualquier forma: 

# modprobe -f reiserfs

Ahora sí, podemos montar nuestro filesystem alegremente, recordando las épocas en las que Hans Reiser gozaba de libertad, y su esposa Nina Sharanova aún no había sido "strippeada" como su información...(véase esto)

Espero haber aportado mis dos centavos a vuestra lucha diaria. 

domingo, 12 de marzo de 2017

Montando particiones de imágenes de discos enteros

Un familiar me pidió si le prestaba una máquina por un tiempito, sabiendo que soy medio coleccionista de hardware.
No hay problema, le dije, pero primero la vacío de mis archivos, y la reinstalo.
Claro, luego de tan gentil ofrecimiento de mi lado, me puse a pensar que esa máquina tenía en su sistema operativo mil customizaciones.
La solución fue sencilla, hago un vuelco con un "dd", y cuando me la devuelve, hago el mismo "dd" en sentido inverso, y todos felices.
Como la felicidad es sólo un instante, me encontré con que necesitaba un archivo de esa misma máquina, que ya estaba entregada a su nuevo inquilino...montar una partición basada en un archivo es sencillo, pero una partición en una imagen de un disco entero, puede tener sus vueltas.
Para evitar ver ese mismo sufrimiento en vuestros rostros, es que les comento que la cosa fue mucho más sencilla de lo que pensaba. Hice un "gparted" del archivo, extraje el offset de la partición, y lo monté alegremente. El archivo se llama "paviliondm1.img", y es el resultado de bootear con un pendrive la vieja laptop, conectarle un disco rígido externo, montarlo, y lanzar el dd. Acá la fórmula para tener el archivo, una vez booteado con el pendrive, considerando que ese dispositivo quedó en /dev/sdc, y que el disco rígido externo en /dev/sdb:

sudo mount /dev/sdb1 /mnt
dd if=/dev/sda of=/mnt/paviliondm1.img bs=64K

Una vez hecho el vuelco, conecté el disco en mi laptop actual, y lancé estos comandos para montar lo que alguna vez fue la partición 7, y que el disco externo, en mi laptop actual, quedó en /dev/sdc. Fpijense en lo que marco en negrita para entender el porqué del comando de montaje:

# mount /dev/sdc1 /mnt
# cd /mnt
# ls -ltr
total 635104432
(...)
-rw-r--r-- 1 root  root  500107902976 mar 11 21:11  paviliondm1.img

# parted paviliondm1.img 
GNU Parted 3.2
Using /mnt/paviliondm1.img
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit                                                             
Unit?  [compact]? B                                                       
(parted) print                                                            
Model:  (file)
Disk /mnt/paviliondm1.img: 500107902976B
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start          End            Size           Type      File system     Flags
 1      1048576B       209715199B     208666624B     primary   ntfs            boot
 2      209715200B     126038835199B  125829120000B  primary   ntfs
 3      126038835200B  126877835263B  839000064B     primary   ext4
 4      126878743552B  500107837439B  373229093888B  extended
 5      126878744576B  135468679167B  8589934592B    logical   linux-swap(v1)
 6      135469727744B  240327327743B  104857600000B  logical   ext4
 7      240328376320B  500107837439B  259779461120B  logical   ext4

(parted) q                                                                
# mount -o loop,offset=240328376320 paviliondm1.img /mnt2
# ls -l /mnt2
(aparecen todos mis archivos!)

Feliz de la vida puedo volver a usar los archivos que tenía en esa partición!
Salud, hermanos pingüinos!