---
layout: post
title: better-initramfs (Dropbear + LVM + LUKS) setup
category: GNU/Linux
showToc: true
TocOpen: true
tags:
- initramfs
- linux
- dropbear
- lvm
- luks
---
Desde hace años que uso better-initramfs en todos los sistemas que necesiten un
initramfs y es que como su nombre anuncia, es mejor que todas las alternativas
IMO (mkinit, genkernel, dracut...etc). Es rápido, tiene soporte para lvm, luks,
dropbear! y encima es totalmente independiente del kernel!, una vez 'compilado'
te puedes olvidar (cuidado con los 0days de Dropbear)... todo ventajas. Esta es
mi configuración para un servidor con LVM on LUKS en un SSD.
# Instalación desde git
```
cd /opt
git clone https://bitbucket.org/piotrkarbowski/better-initramfs.git
```
La compilación la hace en un chroot por lo que hace falta hacerlo como root!
```
cd better-initramfs
bootstrap/bootstrap-all
make prepare
```
## Shell remota (Opcional)
Antes de crear la imagen tenemos que añadir las claves públicas que tendrán
acceso.
```
cp /rutal/a/.ssh/authorized_keys /opt/better-initramfs/sourceroot
```
# Crear e instalar la imagen
```
make image
cp /opt/better-initramfs/output/initramfs.cpio.gz /boot
```
# Entrada de GRUB
better-initramfs es muy flexible y soporta muchísimas configuraciones, en la
[página oficial](https://bitbucket.org/piotrkarbowski/better-initramfs#rst-header-parameters)
están explicadas al detalle todas las opciones. Es importante consultar la
documentación oficial pues algunos parámetros pueden cambiar con el tiempo o
dejar de existir (eg `luks_trim` ya no existe).
Editamos el fichero `/etc/grub.d/40_custom` y añadimos una nueva entrada, en mi
caso queda así:
```
#!/bin/sh exec tail -n +3 $0
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
menuentry 'Gentoo Linux 4.17.7 (better-init)' --class gentoo --class gnu-linux
--class gnu --class os { load_video insmod gzio insmod part_msdos insmod fat set
root='hd2,msdos1' search --no-floppy --fs-uuid --set=root 2ACF-01EF echo
'Loading Linux 4.17.7 ...' linux /vmlinuz-4.17.7-gentoo \
root=/dev/mapper/vg1-root ro lvm luks sshd\
binit_net_if=eth3 binit_net_addr=10.0.0.242/24\
binit_net_gw=10.0.0.1\
enc_root=UUID=ca098a60-f942-43be-9138-bcb06922211f\
rootfstype=ext4 echo 'Loading initial ramdisk ...' initrd /initramfs.cpio.gz }
```
_La mayoria de líneas se pueden copiar descaradamente de las entradas que genera
GRUB automáticamente!_
Básicamente las únicas dos líneas en las que estamos interesados son la del
kernel (`linux ...`), a la que se le pasan todos los parámetros y el initrd que
debe apuntar a la imagen creada anteriormente (aparte del título, los `echo` y
demás pijadas).
`root=` : partición con la raiz (`/`).
`lvm` : escanea los discos en busca de volúmenes.
`enc_root=UUID=...` : especifica el UUID de la partición cifrada.
`luks` : indica que queremos hacer `luksOpen` en `enc_root`.
`ro` : monta la raiz en read-only.
`binit_net_if` `binit_net_addr` `binit_net_gw` : interfaz, dirección y gateway
que queremos usar.
`sshd` : ejecutar el servidor ssh para poder introducir la clave de forma
remota.
`rootfstype` : el formato de la partición raíz.
Montamos `/boot` si está en otra partición y regeneramos el `grub.cfg`.
```
mount /boot
grub-mkconfig -o /boot/grub/grub.cfg
```
## Cambiar el orden de las entradas de GRUB (Opcional)
El número delante de los ficheros en `/etc/grub.d` especifica el orden en el que
son procesados, para que la entrada personalizada sea seleccionada por defecto,
basta con mover el fichero `40_custom` editado anteriormente y regenerar
`grub.cfg`.
```
mv /etc/grub.d/40_custom /etc/grub.d/05_better-initramfs
grub-mkconfig -o /boot/grub/grub.cfg
```
---
**Fuentes**:
- [better-initramfs](https://bitbucket.org/piotrkarbowski/better-initramfs#rst-header-build-from-source)