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.