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.2004 | Descripción |
---|---|---|
kernel.randomize_va_space=2 | kernel.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=2 | kernel.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 = 1 | kernel.dmesg_restrict = 0 | evita que usuarios sin privilegios puedan ver la info del buffer del kernel (dmesg) |
kernel.sysrq=0 | kernel.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.0 | CentOS Linux release 8.2.2004 (Core) | Descripción |
---|---|---|
kernel.osrelease = 4.19.132-5.ph3-esx | kernel.osrelease = 4.18.0-193.el8.x86_64 | versión del kernel |
fs.dentry-state = 10218 8279 45 0 0 0 | fs.dentry-state = 31719 12389 45 0 1167 0 | Linux 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 = 418488 | fs.epoll.max_user_watches = 65720 | Mejora 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 = 202090 | fs.file-max = 31645 | Mejora 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 202090 | fs.file-nr = 1440 0 31645 | El 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 = 0 | no existe | La 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 = 0 | no existe | Esta 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 = 2 | kernel.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.panic_on_oops = 0 | kernel.panic_on_oops = 1 | Controla 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 = 32768 | kernel.pid_max = 4194304 | Define 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 = 1096 | kernel.random.entropy_avail = 3517 | Muestra 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 = 896 | kernel.random.write_wakeup_threshold = 3072 | Relacionado 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 = 750000 | kernel.sched_min_granularity_ns = 10000000 | Especifica 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 = 32768 | indica un buffer para iSCSI | |
kernel.tainted = 8192 | kernel.tainted = 0 | interesante 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 = 15795 | kernel.threads-max = 2507 | indica 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 = 0 | kernel.unprivileged_bpf_disabled = 1 | Existe 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 = 1 | no existe | |
kernel.unprivileged_userns_clone = 0 | no existe | Con 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 = 1 | kernel.yama.ptrace_scope = 0 | Con valor a 1 indica que los procesos pueden ser debugeados con ptrace. |
vm.dirty_ratio = 20 | vm.dirty_ratio = 30 | Memoria 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 = 60 | vm.swappiness = 30 | Un 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 = 63769 | vm.user_reserve_kbytes = 9912 | En el caso de falta de memoria, determina la cantidad de memoria para iniciar el proceso de recuperación de memoria libre. |
EXT4 | XFS | Sistema de ficheros |