domingo, 12 de enero de 2014

Linux: particiones en sistemas EFI y en sistemas BIOS. Particionado MBR y GPT.

En este artículo, voy a tratar el tema de las particiones. Algunas de estas particiones son recomendables en un sistema GNU/Linux, y dependen en gran medida de nuestras necesidades. A esas particiones, las llamaré particiones del sistema.
Otras sin embargo, son obligatorias y vienen impuestas por el firmware de nuestra máquina (EFI o BIOS), así como por el método de particionado que hayamos elegido (MBR o GPT).


En este artículo, verás que hablo de particiones, cuando ni siquiera el sistema operativo está instalado. Puedes acceder a herramientas de particionado que vengan en un liveCD. Por ejemplo, knoppix es una distribución GNU/Linux cuyo fin es ser usada siempre como liveCD. Está basada en debian y viene con un montón de herramientas útiles para administradores de sistemas. Otra que también es buenísima es System Rescue CD, basada en gentoo, también es un live CD que no debería faltar en el arsenal de ningún administrador de sistemas Linux.

Mientras lees este artículo, te recomiendo que le eches un vistazo al mapa conceptual que he preparado. Es una forma más visual de ver la información que publico en este artículo: aqui


1. SISTEMAS DE PARTICIONADO: MBR Y GPT.

Actualmente existen dos sistemas de tablas de particiones: Master Boot Record (MBR) y GUID Partition Table (GPT).
MBR: Se suele llamar registro de arranque principal o registro de arranque maestro al primer sector de un disco duro. A menudo se llama sector de arranque del disco a los primero 512 bytes de un disco.
Esta región se suele utilizar para albergar código en lenguaje máquina, necesario para el arranque del sistema operativo, o bien para almacenar una tabla de particiones del disco.
El MBR utiliza BIOS y las direcciones físicas de la unidad del disco duro para especificar las particiones. A este sistema de direccionamiento se lo llama CHS (Cilindro Cabeza Sector).
Cuando el equipo finaliza la inicialización a través de BIOS, comprueba el MBR para la obtener información del sistema de arranque. En función de lo que contenga el MBR, el equipo inicia el sistema operativo principal o presenta una lista de arranque de sistemas operativos presentes en el equipo.

GPT: GUID partition table. Nace como una parte del estándar EFI, para la colocación de las particiones en un disco duro, superando las limitaciones tecnológicas de MBR en sistemas BIOS tradicionales.
A diferencia de MBR, que albergaba un binario para identificar la partición activa e iniciar el sistema, GPT utiliza las capacidades EFI para dichos procesos, haciendo innecesario el chainloading en máquinas con múltiples sistemas instalados.
Consta de una tabla de particiones al principio del disco, cuya primera entrada es MBR para mantener la compatibilidad con los viejos sistemas PC BIOS.
A diferencia de MBR, que utilizaba un direccionamiento a las unidades físicas del disco duro, GPT utiliza un sistema de direccionamiento lógico llamado LBA (Logical Block Addressing).
LBA 0  contiene la información del MBR heredado. LBA 1 contiene la cabecera de la tabla de particiones y el GUID del disco. LBAs 2 al 33 contiene las entradas para las particiones, en las que se indica el tamaño y GUID de cada partición.
LBA 34 en adelante --> espacio usable en el disco.

A efectos del usuario, las diferencias entre MBR y GPT es que MBR no soporta más de 4 particiones primarias, que no pueden exceder de 2,2 TB, es decir, que como mucho, puede gestionar discos de 8,8 TB.
Mientras que GPT soporta hasta 128 particiones primarias, cada una de hasta 256TB. Dicho de otro modo, con GPT, desaparece la limitación de las 3 particiones primarias y una extendida con a su vez un cierto número de particiones lógicas.


2. PARTICIONES IMPUESTAS POR EL FIRMWARE
Además de la partición  o particiones donde queramos instalar los sistemas operativos (en caso de arranques duales), tendremos que particionar el disco duro de una determinada manera en función del firmware de nuestro equipo y de si queremos utilizar MBR o GPT.

2.1. SISTEMAS BIOS

2.1.1. TABLA  DE PARTICIONES MBR
Generalmente, el espacio utilizable en disco después de la tabla de particiones y antes de la primera partición es de 31KB. Si hay algún problema de alineación de los cilindros se resuelven en la tabla de particiones. Sin embargo, si vas a usar GNU Grub como gestor de arranque, se recomienda dejar un espacio de 1MB sin particionar entre el MBR y la primera partición, para contener el core.img.
Es importante utilizar una herramienta de particionado que permita alinear las particiones a 1MB después del MBR. En este caso recomiendo fdisk.

2.1.2. TABLA DE PARTICIONES GPT
Algunas BIOS soportan tablas de particiones GPT. En estos casos, si vas a usar GNU Grub como gestor de arranque, necesitas crear una BIOS Boot Partition.

NO es posible usar BIOS-GPT si piensas tener un arranque dual con windows, ya que si windows detecta una tabla de particiones GPT, intentará arrancar en modo (U)EFI.

Las características de una BIOS Boot Partition son:
  • Tamaño 1007KB --> ya se encargará gdisk de alinear la partición a 1024KB.
  • Sin sistema de ficheros.
  • Código de partición ef02 al crearla con gdisk.
  •  El GUID de la partición siempre es: 21686148-6449-6e6f-744e656564454649
  • debes tener hecha esta partición antes de ejectutar #grub-install o #grub-setup.
  • No es necesario que esté al principio del disco, pero es recomendable que esté dentro de los primeros 2TB del disco.
Cuando GRUB encuentra una BIOS Boot Partition durante su instalación, automáticamente escribirá en ella su core.img.

Nota: syslinux NO necesita una BIOS Boot Partition

2.2. SISTEMAS (U)EFI

En este caso, es recomendable usar siempre una tabla de particiones GPT. Además, con firmware EFI, es muy importante contar con una partición especial llamada EFI System Partition (EFS). La EFS es necesaria para que el firmware EFI lance sus aplicaciones. En esta partición residirán los cargadores de los sistemas operativos instalados, haciendo innecesario chainloading en los casos de arranques duales.

Características de una EFI System Partition:
  • Debe ser la primera partición del disco.
  • Tamaño recomendado: Alrededor de 1GB
  • Código de la partición: EF00 ó ef00 si usas gdisk , o bien, con la etiqueta boot, (no confundir con legacy_boot), en caso de que uses GNU parted para crearla.
  • El GUID de la EFS, siempre va a ser: C12A7328-F81F-11D2-BA4B-00A0C93EC93B
  • Debe estar formateada en FAT32.
Para comprobar si tienes una EFI System Partition creada en tu sistema:
#parted /dev/sdX print --> estás buscando una partición vfat 32 de entre 256MB y 1GB aproximadamente con la etiqueta  "boot" activada. Dentro de esta partición debes tener una carpeta llamada "EFI". Si se cumplen estos requisitos, deberías memorizar el número de esta partición, para poder montarla más adelanta para instalar GRUB o syslinux en ella.

  3. PARTICIONES DEL SISTEMA.

Una vez creadas la EFI System Partition, o la BIOS Boot Partition, hay que pensar en las particiones que van a necesitar los sistemas operativos.
En caso de que pienses tener arranque dual con windows, debes instalar primero windows, y dejar espacio en el disco duro para instalar tu sistema GNU/Linux a continuación.

Las particiones que se recomiendan para Linux son las siguientes:
  • /boot --> tamaño recomendado 256MB. Sistema de ficheros: ext4 para tablas de particiones GPT o ext2 para tablas de particiones MBR.
  •  swap --> en sistemas con mucha carga de trabajo, si la memoria RAM es insuficiente, el sistema escribe en una partición swap, que hará de soporte para la memoria virtual.
    El tamaño recomendado para dicha partición depende de dos factores: la cantidad de memoria RAM que tengas en tu sistema y la carga de trabajo del mismo. En la wiki de Fedora, ponen esta tabla a título orientativo:
  • / --> sistema de ficheros ext4. Tamaño recomendado, de 15-20GB.
  • /var --> Si vas a tener un servidor de bases de datos, o un servidor de correo electrónico, un servidor FTP... Es recomendable tener una partición separada para /var. El motivo es que en este directorio se almacenan los logs del sistema. Estos ficheros de logs tienden a crecer considerablemente. En una base de datos, por ejemplo, cada transacción que se realiza genera entradas en el log de la base de datos. Si no llevas a cabo una buena política de administración del sistema, o en caso de que tu servidor sea atacado, esos ficheros de logs crecen y crecen, pudiendo llegar a ocupar todo el espacio de la partición. Si no separas esta partición, los logs podrían llegar a consumir todo el espacio en disco, y el sistema podría incluso no llegar a arrancar, ya que durante el arranque, linux escribe y lee también en la partición raíz.
    El tamaño recomendado va del 40% al 60% del espacio en disco restante después de haber creado la partición raíz.
    El sistema de ficheros recomendado también es ext4.
  • /home --> sistema de ficheros ext4. Tamaño: el resto del espacio en disco del que dispongas.
  • /datos o bien /media/datos --> puede ser útil crear una partición de este tipo para compartir ficheros con otros usuarios del sistema, o para almacenar colecciones de música, y videos. Sistema de ficheros ext4. Tamaño: el que te quede después de haber creado todas las particiones anteriores.

 4. CREANDO LAS PARTICIONES
Si no tieneis ningún sistema operativo instalado en el equipo porque  lo acabais de comprar o habeis formateado el disco, o el disco duro es nuevo, recordad que todas las herramientas de particionado que voy a utilizar aquí, las teneis en distribuciones GNU/Linux que funcionan en LiveCD, antes os hablaba de knoppix y de SystemRescueCD. Yo utilizaré SystemRescueCD.
Al arrancar el equipo con el cd de SystemRescueCD, nos saldrá un menú de GRUB, elegimos la primera entrada, y el sistema comenzará a arrancar.
A continuación, nos pregunta qué distribución de teclado preferimos, por defecto, la distribución es estadounidense, para especificar que usamos un teclado con distribución de España, el código es el 13. Ponemos 13 y le damos a enter:


4.1. Creando tabla de particiones GPT con gdisk
En este caso, voy a crear la EFI System Partition, una partición swap, y una partición raíz para el sistema. Para crear otras particiones como /boot, /home, /var... El proceso es exáctamente igual que el que voy a seguir para la partición /, de manera que no tiene mucho sentido hacer lo mismo 4 veces. Lo hago una a modo de ejemplo, y listo ;)

Lo primero será ver qué discos duros tengo, o cómo los ha llamado el sistema:
# ls /dev/sd*
En mi caso, /dev/sda. Suponiendo que tengamos más discos duros conectados, es obvio que nos interesa saber cuál es cual para no particionar y formatear el disco duro equivocado, para ello:
# fdisk -l /dev/sda


Una vez sabemos qué disco duro queremos particionar, crearemos una tabla de particiones GPT con gdisk.

A continuación, ejecutamos gdisk pasándole como argumento el disco que queremos particionar. Si tu disco ya tenía una tabla de particiones MBR, nos presentará un mensaje rodeado de asteriscos, indicándonos que ha encontrado una tabla de particiones MBR. En caso de que tu disco no tenga hecha ninguna tabla de particiones, nos dirá que no ha encontrado ninguna tabla de particiones.
Además, gdisk nos va ayudando en todo momento: nos muestra un prompt en el que nos pide un comando, y nos indica que si no sabemos, podemos teclear `?' para obtener una lista de los comandos disponibles:


Para comprobar que efectivamente estoy trabajando en el disco que quiero formatear, puedo usar el comando `p' para imprimir la tabla de particiones de ese disco:


De momento, las opciones que más nos interesan son:
d --> elimina una partición existente
n --> crea una nueva partición
o --> crea una tabla de particiones GPT vacia
l --> imprime una lista de los tipos de particiones existentes (muy importante)
q --> sale de gdisk sin guardar los cambios que se hayan hecho en el disco
w --> escribe los cambios que hayamos hecho con gdisk en el disco.
si te paren a pedos eso aumenta la probabilidad de decir ciertas tontadas xDDDD
Si en tu disco había hechas algunas particiones, debes eliminarlas usando la orden `d'

Antes de lanzarnos a crear particiones, debemos conocer qué tipos de particiones se pueden hacer. La orden `l', lista todos los tipos de particiones conocidos y sus códigos correspondientes en gdisk, os sugiero que os anoteis en algún lado los códigos que vayais a necesitar para cada partición:

Os he marcado en rojo los más importantes:
  • BIOS Boot Partition: ef02--> Para equipos con firmware BIOS que soportan GPT.
  • EFI System Partition: ef01 --> Equipos con firmware EFI y tablas de particiones GPT.
  • Linux swap: 8200 ---> Particiones swap
  • Linux filesystem: 8300 ---> Para las particiones del sistema (/, /boot, /var, /home...)

También os marco en naranja otras que son importantes dependiendo de si quereis implementar un array de discos, o recurrir a volúmenes lógicos en lugar del típico sistema de particiones:
  • array de discos: fd00
  • volúmenes lógicos: 8e00

Dicha toda esta parrafada, empecemos:
1. Creamos una nueva tabla de particiones GPT vacia: orden `o'. Nos advierte de que se eliminarán todas las particiones, y que se creará un MBR de protección, lo cual es lógico:






2. Creamos la EFI System Partition. Orden `n'. Número de partición 1. Sector de inicio: por defecto 2048. Tamaño 1GB, código ef00 (es la primera partición que debemos crear).


2. Creamos la partición swap. Órden `n'. Número de partición: 2, sector de inicio: por defecto (gdisk alinea sólo las particiones). Tamaño, el de tu memoria RAM (aproximadamente). Código de partición 8200


3. Creamos las particiones del sistema. Órden `n'. Número de partición:3. Sector de inicio (por defecto). Tamaño, lo que le quieras dar, esto ya son particiones del sistema. Código de partición, en mi caso linux filesystem: 8300, pero vamos, que puedes crear un tipo de partición especial para RAID, LVM, etc.


Para asegurarnos de que lo hemos hecho bien, podemos imprimir la tabla de particiones: orden `p':



Una vez comprobado que todo está bien, salimos de gdisk guardando los cambios en el disco --> Orden `w' --> nos indica que se van a escribir las particiones en el disco, nos pide que confirmemos.


4.2. Creando tabla de particiones MBR con fdisk

Quiero crear una tabla de particiones MBR en un disco de mi sistema, en mi caso va a ser el disco /dev/sdb. Para ello:
# fdisk /dev/sdb
fdisk nos ayuda, tenemos a nuestra disposición una lista de los comandos que admite, pulsando `m' y `enter' en el prompt que nos aparece:
`n' --> crea una nueva partición
`d' --> elimina una partición ya existente
`o' --> escribe una nueva tabla de particiones MBR en el disco.
`l' --> lisa los tipos de particiones que se pueden crear con fdisk
`w' --> escribe los cambios en el disco y termina
`q' --> sale de fdisk sin guardar los cambios al disco
`m' --> imprime el menú de comandos disponibles


Como quiero crear una nueva tabla de particiones MBR --> orden `o':

Una vez hecho esto, ahora voy a crear las particiones del sistema: una para /boot, otra partición swap, otra para / y otra para /home.

Es importante, listar los tipos de particiones que se pueden crear con fdisk y anotarnos los códigos de las mismas: orden `l'
  • FAT 32 --> código: b
  • Sistema de ficheros Linux --> código 83
  • Partición swap para Linux --> código 82
  • LVM para Linux --> código 8e
  • RAID para Linux --> código fd

Digimos al principio del artículo, que en sistemas BIOS con tablas de particiones MBR, era recomendable dejar un espacio de aproximadamente 1MB entre el MBR y la primera partición, para almacenar en él el core.img de GNU/Grub.

Nota:  Un sector de un disco duro es la sección de la superficie del mismo que corresponde al área encerrada entre dos líneas radiales de una pista.
Pueden almacenar una cantidad fija de bytes, generalmente suele ser de 0,5 KB hasta 64 KB. Así pues, un sector, como mínimo, contiene 0.5KB. Por tanto, 2048 sectores x 0.5 KB/sector = 1024 KB= 1MB, que es exáctamente lo recomendado para alojar el core.img. Como veremos a continuación, al particionar un disco con fdisk, por defecto el primer sector disponible, para empezar a crear nuevas particiones es el 2048. Luego, el espacio de 1MB requerido entre el MBR y la primera partición del disco, está asegurado sin que nos tengamos que preocupar de nada.


Creamos la primera partición. Orden `n'. tipo de partición: primaria `p'. Número de partición: `1'. Inicio: sector 2048 (por defecto). Tamaño: el de tu memoria RAM (aproximadamente):

Esta partición 1, va a ser mi partición swap, así que ahora utilizo la orden `t' para cambiar el tipo de partición, y le asigno el código 82, que corresponde a una partición Linux swap:

Como podeis ver en la imagen anterior, fdisk asigna por defecto el tipo de partición a linux.
A continuación creo la partición 2, que será para /boot. Para las particiones /, /var y /home, el proceso es análogo. Eso si, teneis que tener la precaución de que MBR sólo os permite 4 particiones primarias, de manera que si vais a necesitar más de 4 particiones, tendreis que crear 3 primarias, la 4 partición hacerla extendida, y ya dentro de esa partición, podreís crear las particiones lógicas que deseeis:

A continación, guardamos los cambios en el disco y salimos. Para ello, usaremos la orden `w'.

5. DANDO FORMATO A LAS PARTICIONES con mkfs

Como dijimos, en sistemas BIOS  con tablas de particiones GPT, había que crear una BIOS Boot Partition, pero a este tipo de partición, no hay que darle formato.

EFI System Partition --> formato FAT 32:
# mkfs.fat -F32 /dev/sda1    (sustituye sda1 por la que sea en tu sistema)
En caso de que os salga un mensaje como este:
Warning: not enough cluster for a 32 bit FAT!
Tendrás que reducir el tamaño del clúster, de lo contrario la partición puede ser ilegible por UEFI. Para ello, usa este comando:

  # mkfs.fat -S2 -F32 /dev/sda1    (sustituye sda1 por la que sea en tu sistema)  
 o bien:
  # mkfs.fat -S1 -F32 /dev/sda1
 
Si tu partición swap es /dev/sda2
  # mkswap /dev/sda2

Particiones del sistema cuyo formato es extX, por ejemplo, ext4:
   # mkfs.ext4 /dev/sda3

Eso es todo, espero que os resulte muy útil