Saltar a contenido

2022

Utilizando Podman en Gentoo

Podman es un motor de contenedores que es compatible con la especificación OCI de contenedores. Este software forma parte del ecosistema de Red Hat, pero se puede instalar también en distribuciones como Gentoo. Como cumple las especificaciones OCI, se puede reemplazar directamente por Docker, ya que mucho de los comandos de Docker se han traducido directamente a Podman y así evitar tener que aprender más comandos nuevos.

Las principales diferencias que existen entre Docker y Podman es que Podman no necesita de un servicio, con lo que se incrementa la seguridad en el sistema, y si se tiene systemd, los contenedores pueden ejecutarse como servicios del sistema. Más info sobre esto.

Configurando el kernel

Hay que tener una serie de caracterísitcas habilitadas en el kernel para poder continuar:

General setup  --->
  -*- Control Group support  --->
    [*]   Memory controller
    [*]   IO controller
    [*]   CPU controller  --->
      [*]   Group scheduling for SCHED_OTHER
      [*]     CPU bandwidth provisioning for FAIR_GROUP_SCHED
      [*]   Group scheduling for SCHED_RR/FIFO
    [*]   PIDs controller
    [*]   RDMA controller
    [*]   Freezer controller
    [*]   HugeTLB controller
    [*]   Cpuset controller
    [*]     Include legacy /proc/<pid>/cpuset file
    [*]   Device controller
    [*]   Simple CPU accounting controller
    [*]   Perf controller
    [*]   Misc resource controller
  [*] Configure standard kernel features (expert users)  --->
    [*]   Enable 16-bit UID system calls
    [*]   Multiple users, groups and capabilities support
    [*]   sgetmask/ssetmask syscalls support
    [*]   Sysfs syscall support
    [*]   open by fhandle syscalls
    [*]   Posix Clocks & timers
    [*]   Enable support for printk
    [*]   BUG() support
    [*]   Enable ELF core dumps
    [*]   Enable PC-Speaker support
    [*]   Enable full-sized data structures for core
    [*]   Enable futex support
    -*-   Enable eventpoll support
    -*-   Enable signalfd() system call
    -*-   Enable timerfd() system call
    -*-   Enable eventfd() system call
    -*-   Use full shmem filesystem 
    [*]   Enable AIO support
    [*]   Enable IO uring support
    [*]   Enable madvise/fadvise syscalls
  -*- Namespaces support  --->
    -*-   UTS namespace
    [*]   TIME namespace
    -*-   IPC namespace
    -*-   User namespace
    -*-   PID Namespaces
    -*-   Network namespace
[*] Networking support  --->
  Networking options  --->
    <M> 802.1d Ethernet Bridging
    [*]   IGMP/MLD snooping
    <M> 802.1Q/802.1ad VLAN Support

Device Drivers  --->
  [*] Network device support  --->
    <M>     MAC-VLAN support
    <M>       MAC-VLAN based tap driver
    <M>     Universal TUN/TAP device driver support
    <M>     Virtio network driver
  Character devices  --->
    [*]   Unix98 PTY support

File systems  --->
  <*> FUSE (Filesystem in Userspace) support
  <*> Overlay filesystem support

Creamos este archivo /etc/modules-load.d/networking.conf y añadimos tun.

Configuramos los subuid y subgid al usuario que lo usará

Podman lo utilizará para mapear rangos de UID en los contenedores mediante espacios de nombres de usuario.

# usermod --add-subuids 200000-201000 --add-subgids 200000-201000 sincorchetes

Añadimos soporte CGroups V2 en el arranque

Editamos el archivo /etc/rc.conf y añadimos:

rc_controller_cgroups="YES"

Configuramos las USE flags

Usaremos estas USE flags:

app-containers/podman rootless fuse

Instalamos

# emerge --ask app-containers/crun app-containers/podman

Exponiendo los contenedores a la red local

Habilitamos el servicio:

# rc-update add cni-dhcp default
# rc-service cni-dhcp start

Añadimos la configuración de red /etc/cni/net.d/88-macvlan.conflist:

{
  "cniVersion": "0.4.0",
  "name": "macvlan",
  "plugins": [
    {
      "type": "macvlan",
      "master": "br0",
      "isGateway": true,
      "ipam": {
        "type": "dhcp"
      }
    },
    {
      "type": "portmap",
      "capabilities": {
        "portMappings": true
      }
    },
    {
      "type": "firewall"
    },
    {
      "type": "tuning"
    }
  ]
}

Creamos la interfaz br0 con NetworkManager

Para saber qué tarjetas tenemos y podemos utilizar:

nmcli dev

Haciendo bridging

br0-slave0: Añado la interfaz Ethernet cableada br0-slave1: Vinculo con la de Wireless.

nmcli con add type bridge con-name br0 ifname br0 ip4 10.0.0.3/24 gw4 10.0.0.1
nmcli con add type bridge-slave con-name br0-slave0 ifname enp3s0f1 master br0
nmcli con add type bridge-slave con-name br0-slave1 ifname wlp4s0 master br0
nmcli con up br0

Creamos la red

# podman pod create --name homeserver --network macvlan

Probamos

$ podman run -ti centos bash
[root@f0f1e1bb8d1b /]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="8"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="CentOS Linux 8"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:8"
HOME_URL="https://centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-8"
CENTOS_MANTISBT_PROJECT_VERSION="8"

Fuentes

Gentoo - El arranque no pasa de Loading Linux...

Cuando estuve instalando Gentoo hace unas semanas, me di cuenta que cuando trataba de arrancar el kernel, la pantalla quedaba en "Loading Linux 5.11...", si bien el teclado respondía y el sistema no mostraba un comportamiento típico de kernel panic como los LEDs que parpadean o el cese de actividad en disco. Se me hacía raro.

Esto es debido a que faltaba el soporte de Frame Buffer, que es un dispositivo de tipo bloques que se crea en /dev con nombre fb0 y que permite mostrar textos, gráficos, mostrar logos en el arranque... por lo que es comprensible que no estuviera viendo nada.

Para resolverlo, compilamos el kernel con estas opciones:

Device drivers --->
  Graphics Support --->
    [M] Simple Frame Buffer Driver

Si usas EFI 1.1 o UEFI 2.0, habilita también:

Device drivers --->
  Graphics Support --->
    ---> Frame buffer Devices
      ---> Support for frame buffer devices
        [*] EFI-based Framebuffer Support

Fuente: Gento Forums

Instalando Doas en Gentoo

Doas es una alternativa a sudo, el comando más utilizado por la mayor parte de las distribuciones para obtener privilegios o para ejecutar determinados programas concretos.

Fue desarrollado por el equipo de OpenBSD, intenta ser minimalista y fácilmente entendible en su configuración. Tiene el 95% de características de sudo en una fracción de código base incrementado así la seguridad.

Instalando

Vamos habilitar el USE flag persist para poder hacer uso de esta opción en el /etc/doas.conf, esto nos permitirá poder ejecutar doas sin perdirnos cada 5 minutos la contraseña.

# mkdir /etc/portage/profile
# echo "-persist" > /etc/portage/profile/use.mask
# emerge --ask app-admin/doas

Configurando

Añadiendo nuestro usuario al grupo wheel

# gpasswd -a USUARIO wheel

Añadiendo la siguiente línea:

# echo "permit persist keepenv :wheel" > /etc/doas.conf

Ahora podemos probar a ejecutar algo:

doas cat /var/log/kern.log
doas (sincorchetes@basecamp) password:
doas ls

Veremos que nos solicita contraseña, si queremos dejar que nos pregunte siempre, quitamos persist.

El keepenv permite mantener las variables de entorno que tenemos en nuestro usuario.

Bonus, apagado, reinicio

Para reiniciar o apagar nuestro equipo con Doas, añadimos las siguientes líneas al fichero /etc/doas.conf:

permit nopass :wheel cmd poweroff
permit nopass :wheel cmd reboot

Con esto, cuando hagamos doas reboot o doas poweroff se apagará sin pedir contraseña.