Introducción
Linux tiene sistemas y herramientas robustas para gestionar dispositivos de hardware, incluidas las unidades de almacenamiento. En este artículo, cubriremos, de manera general, cómo Linux representa estos dispositivos y cómo se convierte el almacenamiento en bruto en espacio utilizable en el servidor.
¿Qué es el almacenamiento en bloque?
El almacenamiento en bloque es otro nombre para lo que el kernel de Linux llama un dispositivo de bloque. Un dispositivo de bloque es un hardware que se puede utilizar para almacenar datos, como un disco duro tradicional de rotación (HDD), una unidad de estado sólido (SSD), una memoria flash, etc. Se llama dispositivo de bloque porque el kernel se comunica con el hardware mediante bloques de tamaño fijo, o fragmentos de espacio.
En otras palabras, el almacenamiento en bloque es lo que se conoce como almacenamiento de disco regular en una computadora. Una vez configurado, actúa como una extensión del árbol de sistema de archivos actual, y deberías poder escribir o leer información de cada unidad de forma intercambiable.
¿Qué son las particiones de disco?
Las particiones de disco son una forma de dividir una unidad de almacenamiento en unidades más pequeñas y utilizables. Una partición es una sección de una unidad de almacenamiento que puede tratarse de manera similar a una unidad en sí misma.
La partición permite segmentar el espacio disponible y utilizar cada partición para un propósito diferente. Esto brinda al usuario más flexibilidad, permitiéndoles potencialmente segmentar un solo disco para múltiples sistemas operativos, espacio de intercambio o sistemas de archivos especializados.
Aunque los discos pueden formatearse y usarse sin particionar, los sistemas operativos suelen esperar encontrar una tabla de particiones, incluso si solo hay una partición escrita en el disco. Generalmente se recomienda particionar nuevos discos para obtener una mayor flexibilidad.
MBR vs GPT
Al particionar un disco, es importante saber qué formato de partición se utilizará. Esto suele reducirse a una elección entre MBR (Registro Maestro de Arranque) y GPT (Tabla de Particiones GUID).
MBR tiene más de 30 años. Debido a su antigüedad, tiene algunas limitaciones serias. Por ejemplo, no se puede utilizar para discos de más de 2TB de tamaño y solo puede tener un máximo de cuatro particiones primarias.
GPT es un esquema de particionado más moderno que resuelve algunos de los problemas inherentes con MBR. Los sistemas que ejecutan GPT pueden tener muchas más particiones por disco. Esto suele estar limitado solo por las restricciones impuestas por el propio sistema operativo. Además, la limitación del tamaño del disco no existe con GPT y la información de la tabla de particiones está disponible en múltiples ubicaciones para proteger contra la corrupción. GPT también puede escribir un “MBR protector” para compatibilidad con herramientas solo de MBR.
En la mayoría de los casos, GPT es la mejor opción a menos que su sistema operativo le impida usarlo.
Formato y Sistemas de Archivos
Mientras que el núcleo de Linux puede reconocer un disco en bruto, debe ser formateado para ser utilizado. Formatear es el proceso de escribir un sistema de archivos en el disco y prepararlo para operaciones de archivos. Un sistema de archivos es el sistema que estructura los datos y controla cómo se escriben y recuperan la información del disco subyacente. Sin un sistema de archivos, no podría usar el dispositivo de almacenamiento para ninguna operación estándar de sistema de archivos.
Hay muchos formatos de sistemas de archivos diferentes, cada uno con compensaciones, incluido el soporte del sistema operativo. Todos presentan al usuario una representación similar del disco, pero las características y las plataformas que admiten pueden ser muy diferentes.
Algunos de los sistemas de archivos más populares para Linux son:
- Ext4: El sistema de archivos predeterminado más popular es Ext4, sucesor de Ext2 y Ext3. El sistema de archivos Ext4 tiene registro de diario, es compatible con sistemas heredados, es estable y cuenta con soporte y herramientas maduras. Es una buena elección si no tienes necesidades especializadas.
- XFS: XFS se especializa en rendimiento y archivos de datos grandes. Se formatea rápidamente y tiene buenas características de rendimiento al manejar archivos grandes y al trabajar con discos de gran tamaño. También cuenta con funciones de instantánea en vivo. XFS utiliza el registro de metadatos en lugar de registrar tanto los metadatos como los datos. Esto conduce a un rendimiento rápido, pero puede llevar potencialmente a la corrupción de datos en caso de pérdida abrupta de energía.
- Btrfs: Btrfs es un sistema de archivos moderno y rico en funciones de copia sobre escritura. Esta arquitectura permite integrar algunas funciones de administración de volúmenes dentro de la capa del sistema de archivos, incluidas instantáneas y clonación. Se utiliza de forma predeterminada en algunos dispositivos NAS (almacenamiento conectado a la red) de consumo y comercial, y es popular para matrices dedicadas de varios discos
- ZFS: ZFS es otro sistema de archivos y administrador de volúmenes de copia sobre escritura con un conjunto de funciones sólido y maduro. Compite directamente con Btrfs, tiene funciones de integridad de datos, puede manejar tamaños de sistema de archivos grandes, tiene funciones típicas de volumen como instantáneas y clonación, y puede organizar volúmenes en matrices RAID y similares para redundancia y rendimiento. ZFS tiene una historia controvertida debido a problemas de licencia, pero no es mucho más o menos popular que Btrfs si se tiene en cuenta el soporte comercial.
Además, Windows utiliza principalmente *NTFS y ExFAT, mientras que macOS utiliza principalmente HFS+ y APFS. Por lo general, es posible leer y, a veces, escribir en estos formatos de sistema de archivos en diferentes plataformas, pero puede requerir herramientas de compatibilidad adicionales.
Cómo Linux Gestiona Dispositivos de Almacenamiento
Archivos de Dispositivos en /dev
En Linux, casi todo está representado por un archivo en algún lugar de la jerarquía del sistema de archivos. Esto incluye hardware como unidades de almacenamiento, que se representan en el sistema como archivos en el directorio /dev
. Normalmente, los archivos que representan dispositivos de almacenamiento comienzan con sd
o hd
seguido de una letra. Por ejemplo, la primera unidad en un servidor suele ser algo como /dev/sda
.
Las particiones en estas unidades también tienen archivos dentro de /dev
, representados al agregar el número de partición al final del nombre de la unidad. Por ejemplo, la primera partición en la unidad del ejemplo anterior sería /dev/sda1
.
Mientras que los archivos de dispositivo /dev/sd*
y /dev/hd*
representan la forma tradicional de referirse a unidades y particiones, hay una desventaja significativa al usar solo estos valores. El kernel de Linux decide qué dispositivo recibe qué nombre en cada arranque, por lo que esto puede llevar a escenarios confusos donde cambian los nodos de dispositivo de tus dispositivos.
Para evitar este problema, el directorio /dev/disk
contiene subdirectorios que corresponden a diferentes formas más persistentes de identificar discos y particiones en el sistema. Estos contienen enlaces simbólicos que se crean en el arranque de vuelta a los archivos /dev/[sh]da*
correctos. Los enlaces se nombran según el rasgo identificativo del directorio (por ejemplo, por etiqueta de partición en el directorio /dev/disk/by-partlabel
). Estos enlaces siempre apuntarán a los dispositivos correctos, por lo que pueden usarse como identificadores estáticos para espacios de almacenamiento.
Algunos o todos los siguientes subdirectorios pueden existir bajo /dev/disk
:
by-label
: La mayoría de los sistemas de archivos tienen un mecanismo de etiquetado que permite la asignación de nombres arbitrarios especificados por el usuario para un disco o partición. Este directorio consiste en enlaces nombrados según estas etiquetas proporcionadas por el usuario.by-uuid
: Los UUID, o identificadores únicos universales, son una cadena larga y única de letras y números que pueden usarse como ID para un recurso de almacenamiento. Por lo general, no son muy legibles para los humanos, pero casi siempre son únicos, incluso entre sistemas. Como tal, podría ser una buena idea usar UUID para hacer referencia a almacenamiento que pueda migrar entre sistemas, ya que es menos probable que ocurran colisiones de nombres.by-partlabel
yby-partuuid
: Las tablas GPT ofrecen su propio conjunto de etiquetas y UUID, que también se pueden usar para la identificación. Esto funciona de manera muy similar a los dos directorios anteriores, pero utiliza identificadores específicos de GPT.by-id
: Este directorio contiene enlaces generados por los números de serie propios del hardware y el hardware al que están conectados. Esto no es completamente persistente, porque la forma en que el dispositivo está conectado al sistema puede cambiar su nombreby-id
.by-path
: Al igual queby-id
, este directorio se basa en la conexión de un dispositivo de almacenamiento al sistema en sí. Los enlaces aquí se construyen usando la interpretación del sistema sobre el hardware utilizado para acceder al dispositivo. Esto tiene las mismas desventajas queby-id
ya que conectar un dispositivo a un puerto diferente puede alterar este valor.
Por lo general, by-label
o by-uuid
son las mejores opciones para la identificación persistente de dispositivos específicos.
Nota: Los volúmenes de almacenamiento en bloque de DigitalOcean controlan los números de serie del dispositivo reportados al sistema operativo. Esto permite que la categorización by-id
sea confiablemente persistente en esta plataforma. Este es el método preferido para referirse a los volúmenes de DigitalOcean, ya que es persistente y predecible en el primer arranque.
Montando Dispositivos de Bloque
En Linux y otros sistemas operativos similares a Unix, todo el sistema, independientemente de cuántos dispositivos físicos estén involucrados, está representado por un único árbol de archivos unificado. Cuando se va a utilizar un sistema de archivos en un disco o partición, este debe conectarse al árbol existente. El montaje es el proceso de adjuntar una partición formateada o un disco a un directorio dentro del sistema de archivos de Linux. El contenido del disco puede entonces accederse desde ese directorio.
Casi siempre, los discos se montan en directorios vacíos dedicados; montar en un directorio no vacío significa que el contenido habitual del directorio será inaccesible hasta que se desmonte el disco. Hay muchas opciones de montaje diferentes que se pueden configurar para alterar el comportamiento de un dispositivo montado. Por ejemplo, el disco puede montarse en modo de solo lectura para asegurar que su contenido no se modifique.
La Norma de Jerarquía del Sistema de Archivos recomienda usar /mnt
o un subdirectorio bajo él para sistemas de archivos montados temporalmente. No hace recomendaciones sobre dónde montar almacenamiento más permanente, así que puedes elegir el esquema que prefieras. En muchos casos, los subdirectorios de /mnt
se utilizan también para almacenamiento más permanente.
Haciendo Montajes Permanentes con /etc/fstab
Los sistemas Linux utilizan un archivo llamado /etc/fstab
(tabla de sistema de archivos) para determinar qué sistemas de archivos montar durante el proceso de arranque. Los sistemas de archivos que no tienen una entrada en este archivo no se montarán automáticamente a menos que sean ejecutados por algún otro software.
Cada línea del archivo /etc/fstab
representa un sistema de archivos diferente que debe ser montado. Esta línea especifica el dispositivo de bloque, el punto de montaje al que se debe adjuntar, el formato del disco y las opciones de montaje, así como algunas otras piezas de información.
Gestión de almacenamiento más compleja
Aunque muchos casos de uso serán atendidos por estas funciones básicas, existen paradigmas de gestión más complejos disponibles para unir varios discos, especialmente RAID.
¿Qué es RAID?
RAID significa redundant array of independent disks. RAID es una tecnología de gestión de almacenamiento y virtualización que le permite agrupar unidades y administrarlas como una sola unidad con capacidades adicionales.
Las características de una matriz RAID dependen de su nivel de RAID, que define cómo se relacionan entre sí los discos en la matriz. Algunos de los niveles más comunes son:
- RAID 0: Este nivel indica striping de la unidad. Esto significa que a medida que los datos se escriben en la matriz, se dividen y distribuyen linealmente entre los discos en el conjunto. Esto ofrece un impulso de rendimiento, ya que se pueden escribir o leer datos desde varios discos simultáneamente. La desventaja es que la falla de una sola unidad puede perder todos los datos en toda la matriz, ya que ningún disco contiene suficiente información sobre el contenido para reconstruirlo. RAID 0 generalmente nunca se utiliza en producción por esta razón, aunque puede ser útil como punto de comparación.
- RAID 1: RAID 1 indica mirroring. Todo lo que se escribe en una matriz RAID 1 se escribe en varios discos. Su principal ventaja es la redundancia de datos, lo que permite que los datos sobrevivan a la pérdida de un disco duro en cualquiera de los lados del espejo. Debido a que varios discos contendrán exactamente los mismos datos, su capacidad utilizable se reduce al menos a la mitad.
- RAID 5: RAID 5 distribuye datos en varios discos, similar a RAID 0. Sin embargo, este nivel también implementa una paridad distribuida entre los discos. Esto significa que si un disco falla, los discos restantes pueden reconstruir la matriz utilizando la información de paridad compartida entre ellos. Por lo general, esto es suficiente para reconstruir un disco, lo que significa que la matriz puede sobrevivir a la pérdida de un disco. RAID 5 reduce el espacio disponible en una matriz por la capacidad de un disco.
- RAID 6: RAID 6 tiene las mismas propiedades que RAID 5, pero proporciona doble paridad. Esto significa que los conjuntos RAID 6 pueden resistir la pérdida de hasta 2 unidades. La capacidad del conjunto se ve nuevamente afectada por la cantidad de paridad, lo que significa que la capacidad utilizable se reduce en el equivalente a dos discos.
- RAID 10: RAID 10 es una combinación de los niveles 1 y 0. Primero, se crean dos conjuntos de matrices espejadas. Luego, los datos se distribuyen en bandas a través de ellos. Esto crea un conjunto que tiene algunas características de redundancia y proporciona un buen rendimiento. Sin embargo, esto requiere bastantes unidades y la capacidad total sigue siendo menos de la mitad del espacio total de los discos combinados.
¿Dónde ir a continuación?
Si tiene un nuevo dispositivo de almacenamiento que desea utilizar en su sistema Linux, este artículo lo guiará a través del proceso de particionado, formateo y montaje de su nuevo sistema de archivos. Esto debería ser suficiente para la mayoría de los casos de uso donde su principal preocupación es agregar capacidad adicional. Para aprender cómo realizar tareas de administración de almacenamiento, consulte Cómo realizar tareas básicas de administración para dispositivos de almacenamiento en Linux.