vmware

Motivos para utilizar Photon OS

Photon OS es una distribución Linux creada por VMware, especialmente enfocada a ejecutar cargas de trabajos de containers en Docker.

Tiene una excelente información en este enlace: https://vmware.github.io/photon/ Puedes descargar el sistema en formato ISO/OVA desde el siguiente enlace https://github.com/vmware/photon/wiki/Downloading-Photon-OS El proceso de instalación puedes seguirlo aquí: Importando OVA

En Photon OS 3.0, Docker viene preinstalado en su versión docker-19.03.10-2.ph3.x86_64. En su guía oficial se detalla información para utilizar kubernetes: Kubernetes on Photon OS

En su web destacan ciertos puntos de optimización y seguridad que me llamaron la atención:

  • Optimizado para  VMware vSphere®: El kernel de Linux está tuneado para un mejor rendimiento cuando Photon OS se ejecuta sobre vSphere.
  • Security hardened: El kernel y otros aspectos del sistema operativo están construidos con un énfasis en la seguridad.

He instalado la versión photon-hw13_uefi-3.0-a383732 en formato OVA. Si tienes una versión anterior de Photon OS el proceso de actualización es muy sencillo:

Para el servicio Docker e instalar el paquete photon-upgrade

tdnf -y install photon-upgrade

Ejecura el script de upgrade:

photon-upgrade.sh

Al iniciar el sistema apenas consume 121 Mb de RAM sumando la memoria de buffer/cache. No tiene swap por defecto 🙂

En Photon OS la versión de las open-vm-tools es 11.1.0-3.ph3.x86_64 mientras en CentOS 8 se utiliza la versión open-vm-tools-11.0.5-3.el8.x86_64. El driver de la tarjeta de red en Photon OS también tiene una versión más actualizada: VMware vmxnet3 virtual NIC driver – version 1.5.1.0-k-NAPI mientras en CentOS se utiliza VMware vmxnet3 virtual NIC driver – version 1.4.17.0-k-NAPI. Evidentemente se actualizará en un futuro.

Ambas máquinas virtuales utilizan la controladora de disco VMware Paravirtual que ofrece un mayor rendimiento que en cargas intensas de I/O reduciendo el consumo de CPU.

Listando los drivers relacionados con la controladora de disco, también se aprecian diferencias. En Photon OS existen más parámetros, curiosamente MSI-X está activo:

en CentOS 8.2, por defecto muestra menos información:

Si en CentOS 8 inspeccionamos la información del módulo vmw_vmci, se muestra que no tiene habilitado MSI-X

MSI son las siglas de: Message Signaled Interrupt. Una interrupción señalizada de mensaje es una escritura desde el dispositivo HDD hacia una dirección especial que hace que la CPU reciba una interrupción. Lo ideal es que esté habilitado, más info en https://www.kernel.org/doc/html/latest/PCI/msi-howto.html

En el fichero /etc/sysctl.d/50-security-hardening.conf están especificados los siguientes parámetros:

Photon OS 3.0 (VMware)CentOS Linux release 8.2.2004Descripción
kernel.randomize_va_space=2kernel.randomize_va_space=2
es un mecanismo para evitar ataques de buffer overflow. Con el valor 2 también se incluye randomizar el segmento de datos. Es la opción más completa.
kernel.kptr_restrict=2kernel.kptr_restrict = 1
Evita la fuga de direcciones internas del kernel. Mejor con valor 2. Más info https://www.kernel.org/doc/Documentation/sysctl/kernel.txt
kernel.dmesg_restrict = 1kernel.dmesg_restrict = 0
evita que usuarios sin privilegios puedan ver la info del buffer del kernel (dmesg)
kernel.sysrq=0kernel.sysrq = 16
Sirve para determinar que está realizando el sistema cuando se queda bloqueado, con valor cero está deshabilitado. Con valor 16 está habilitando el comando sync. Con el valor uno habilita todas las funcionalidades.

He realizado una tabla comparando los parámetros del Kernel de Photon OS 3.0 y Red Hat/CentOS 8.2. No añado los parámetros de red, la comparativa sería demasiado extensa.

Photon OS 3.0CentOS Linux release 8.2.2004 (Core)Descripción
kernel.osrelease = 4.19.132-5.ph3-esxkernel.osrelease = 4.18.0-193.el8.x86_64versión del kernel
fs.dentry-state = 10218 8279 45 0 0 0fs.dentry-state = 31719 12389 45 0 1167 0Linux almacena en caché el acceso al directorio para acelerar el acceso subsecuente al mismo directorio, este archivo contiene información sobre el estado del caché del directorio.
fs.epoll.max_user_watches = 418488fs.epoll.max_user_watches = 65720Mejora el rendimiento para máquinas de alta memoria / CPU. Especifica un límite en el número total de descriptores de archivos que un usuario puede registrar en todas las instancias de epoll en el sistema.
fs.file-max = 202090fs.file-max = 31645Mejora el rendimiento para máquinas de alta memoria / CPU. Ajusta el número de descriptores de archivos abiertos simultáneamente en el sistema.
fs.file-nr = 576 0 202090fs.file-nr = 1440 0 31645El tercer dígito indica el número máximo de identificadores de archivos, lo que se traduce en el número máximo de archivos abiertos en un sistema Linux.
fs.protected_fifos = 0no existeLa intención de esta protección es evitar escrituras no intencionales a un FIFO controlado por un atacante, donde un programa esperaba crear un expediente. El valor está a cero que indica sin restricción.
fs.protected_regular = 0no existeEsta protección evisa escrituras de un atacante a un fichero, donde un programa espera crear uno. El valor cero indica sin restricción.
kernel.kptr_restrict = 2kernel.kptr_restrict = 1Evita la fuga de direcciones internas del kernel. Mejor con valor 2. Más info https://www.kernel.org/doc/Documentation/sysctl/kernel.txt
kernel.panic_on_oops = 0kernel.panic_on_oops = 1Controla el comportamiento del kernel cuando un bug es encontrado. Con valor cero intenta continuar funcionando, con valor uno se reinicia. Debería estar a uno.
kernel.pid_max = 32768kernel.pid_max = 4194304Define el número maximo de procesos en el sistema. En foros de docker veo que este parámetro se suele ampliar.
kernel.random.entropy_avail = 1096kernel.random.entropy_avail = 3517Muestra el número maximo de número aleatorios en /dev/urandom. Algunas aplicaciones hacen uso de este parámetro, si el valor llega a cero causará falta de respuesta en las aplicaciones. Con la variedad de aplicaciones que puede correr en containers parece más adecuado un valor más alto.
kernel.random.write_wakeup_threshold = 896kernel.random.write_wakeup_threshold = 3072Relacionado con la creación de números aleatorios en /dev/random and /dev/urandom, el uso puede depender de la aplicación.
kernel.sched_min_granularity_ns = 750000kernel.sched_min_granularity_ns = 10000000Especifica el período mínimo de timepo en el que se ejecutará una sola tarea. Este ajuste se utiliza solo cuando la carga de funcionamiento es alta. Un valor más bajo muestra mejora la respuesta en I/O en el sistema.
kernel.sg-big-buff = 32768indica un buffer para iSCSI
kernel.tainted = 8192kernel.tainted = 0interesante parámetro. Con el valor 8192 indica que el kernel puede tener módulo sin firmar. Más info: https://www.kernel.org/doc/html/latest/admin-guide/tainted-kernels.html
kernel.threads-max = 15795kernel.threads-max = 2507indica el número máximo de threads de un proceso. Este valor también está vinculado con la cantidad de RAM.
kernel.unprivileged_bpf_disabled = 0kernel.unprivileged_bpf_disabled = 1Existe una vulnerabilidad ejecutando código en el kernel a través de Berkeley Packet Filter (BPF) que puede permitir leer información de memoria del kernel u obtener privilegios en el sistema. Lo ideal es que tenga un valor 1
kernel.unprivileged_userns_apparmor_policy = 1no existe
kernel.unprivileged_userns_clone = 0no existeCon valor cero, los usuarios sin privilegios no podrán crear nuevos namespaces. Crear nuevos namespaces ha sido un método para hacer escalada de privilegios.
kernel.yama.ptrace_scope = 1kernel.yama.ptrace_scope = 0Con valor a 1 indica que los procesos pueden ser debugeados con ptrace.
vm.dirty_ratio = 20vm.dirty_ratio = 30Memoria del sistema que se irá usando hasta que llegue al porcentaje indicado, depués se escriben a disco. En princpio, un valor menor es más óptimo
vm.swappiness = 60vm.swappiness = 30Un valor de 30 indica que comenzará a usar swap cuando se utiliza el 70% de la RAM. Esto no es necesario si los contenedores no tienen swap. Photon OS comenzará a utilizar swap con un 40% de RAM utilizada. Photon OS no tiene SWAP
vm.user_reserve_kbytes = 63769vm.user_reserve_kbytes = 9912En el caso de falta de memoria, determina la cantidad de memoria para iniciar el proceso de recuperación de memoria libre.
EXT4XFSSistema de ficheros
En conclusión, Photon OS tiene una securización extra y optimizaciones en el kernel, algunas con cierta profundidad. Estos parámetros puedes traladarlos a un host Linux en el que ejecutes Docker para mejorar su rendimiento.