Recompilar el kernel de FreeBSD para dar soporte a discos duros USB de gran tamaño

Buenas,

Cualquiera que haya tratado de montar discos duros de gran tamaño en FreeBSD, siendo estos discos de tipo FAT32, habrá experimentado un error tal que:

mount -t msdosfs /dev/da0s1 /mnt/lacie/
mount_msdosfs: /dev/da0s1: Invalid argument

# dmesg | tail -1
mountmsdosfs(): disk too big, sorry

Este problema se debe a que el soporte para sistemas de fichero MSDOS no contempla sistemas de fichero de gran tamaño. Para ello, la solución óptima es recompilar el kernel dando soporte a estos sistemas de fichero de gran tamaño. Ya hace más de un año se pidió que el núcleo de FreeBSD admitiera como opción de compilación la parametrización MSDOS_LARGE para dar solución a la cantidad ingente de dispositivos USB formateados en FAT32 con tamaños elevados.

El problema desde un punto de vista técnico

Todo se debe a que el sistema de ficheros FAT no soporta números de identificación de fichero (números de inode). Como no los soporta, MSDOSFS tiene que crearlos de alguna manera, existiendo dos aproximaciones:

a) Aproximación por defecto: emplear la entrada de directorio como identificador de fichero. Esto tiene un problema en tamaños elevados, ya que el tamaño de una entrada de directorio es de 32 bytes y los inodes son de 32 bit, con lo que se produce un desbordamiento cuando 32 * 2^32 = el disco tiene 128 GB, que imprimirá un error del tipo «disk too big, sorry».

b) Aproximación de compilación de kernel con soporte MSDOSFS_LARGE, que es la que nos ocupa, donde se mantiene una tabla dinámica donde quedan registrados identificadores de 32 bit, con mapeo dinámico de 64bit. Este método hace que cuando el tamaño sea inferior a 128 GB, se emplee la aproximación a), y que cuando el tamaño supera 128 GB, no se produzca un desbordamiento.

Cómo dar soporte a sistema de ficheros MSDOS de gran tamaño formateados con FAT32 en FreeBSD

Lo haremos en estos 6 cómodos pasos:

1. Nos dirigimos al directorio donde está la configuración de kernel. En FreeBSD, por defecto, este directorio es /usr/src/sys/i386/conf/

cd /usr/src/sys/i386/conf/

2. En ese directorio, hay un fichero llamado GENERIC, que define la configuración del kernel. Hay que localizar una línea que habla de MSDOS Filesystem, y sustituír las opciones MSDOSFS por MSDOSFS_LARGE.

options MSDOSFS # MSDOS Filesystem (antigua)
options MSDOSFS_LARGE # MSDOS Filesystem (nueva)

3. Trasladamos la configuración de compilación de kernel al directorio compile, y para ello empleamos el binario config GENERIC, eso sí, estando en el directorio donde esté el fichero GENERIC (/usr/src/sys/i386/conf/)

/usr/sbin/config GENERIC
Kernel build directory is ../compile/GENERIC
Don’t forget to do «make cleandepend; make depend»

4. Cambiamos al directorio /usr/src/sys/i386/compile/GENERIC

cd /usr/src/sys/i386/compile/GENERIC

5. Recompilamos

make depend && make && make install

6. Reiniciamos la máquina

reboot

Una vez reiniciada la máquina, podremos montar tranquilamente nuestro disco duro USB de gran tamaño.

Oigausté, mi disco duro externo USB no está formateado en FAT32, sino en NTFS

Cuando el disco duro externo es NTFS, el error desplegado al montar es distinto, aparece un error de superbloque tal que:

mount: /dev/da0s1 on /mnt/lacie: incorrect super block

1. Comprueba que tienes el soporte NTFS activo

kldstat | grep ntfs

2. Si no lo tienes, cárguelo

kldload ntfs

3. Verifica

kldstat | grep ntfs
6 1 0xc33aa000 a000 ntfs.ko

4. Monta

mount -t ntfs /dev/da0s1 /mnt/lacie/

5. Añade el soporte en la carga del sistema, colocando la siguiente linea en /boot/loader.conf

ntfs_load=»YES»

Pues vaya, después de la que he liado, no puedo escribir en el dispositivo USB formateado con NTFS. ¿Qué hago?

Pues deberías instalar los drivers nfts-3g

cd /usr/ports/sysutils/fusefs-ntfs/ && make install clean

mount -t ntfs-3g /dev/da0s1 /mnt/lacie

Los drivers ntfs-3g permiten operaciones de lectura y escritura en dispositivos formateados NTFS.

A todo esto, ¿qué es FAT32 y NTFS? Me he perdido

Pues ambas son la manera de entender los sistemas de ficheros que tiene Microsoft. FAT para MSDOS, y NTFS como replacement, para los sistemas más modernos:

http://en.wikipedia.org/wiki/File_Allocation_Table
http://en.wikipedia.org/wiki/NTFS

Un saludo,