2009-05-06 14 views
5

Después de una actualización del kernel de Linux, mi servidor VMWare no puede iniciarse hasta que use vmware-config.pl para hacer algún trabajo de reconfiguración (incluida la compilación de algunos módulos kernel).¿Por qué necesito volver a compilar el módulo vmware kernel después de una actualización del kernel de Linux?

Si actualizo mi host VMWare de Windows con el último Service Pack de Windows, generalmente no necesito hacer nada para ejecutar VMWare.

¿Por qué VMWare funciona de forma diferente entre Linux y Windows? ¿Esta acción de recompilación trae beneficios en la plataforma Linux sobre Windows?

Respuesta

12

Ir leer The Linux Kernel Driver Interface.

Esto se está escribiendo para tratar de explicar por qué Linux no tiene una interfaz binaria del núcleo, ni tiene una interfaz estable del núcleo. Tenga en cuenta que este artículo describe las interfaces _in kernel_, no las interfaces kernel a espacio de usuario. La interfaz kernel to userspace es la que utilizan los programas de aplicación, la interfaz syscall. Esa interfaz es muy estable a lo largo del tiempo y no se romperá. Tengo programas antiguos que se crearon con un kernel anterior a 0.9 de algo que todavía funciona bien en la versión más reciente del kernel 2.6. Esta interfaz es la que los usuarios y programadores de aplicaciones pueden contar para mantenerse estables.

refleja la opinión de una gran parte de los desarrolladores del kernel de Linux: la libertad de cambiar los detalles de implementación y las API del núcleo hace en cualquier momento les permite desarrollar mucho más rápido y mejor.

Sin la promesa de mantener las interfaces en el núcleo idénticas de una versión a otra, no hay forma de que un módulo de núcleo binario como VMWare funcione de manera confiable en múltiples núcleos.

Como ejemplo, si algunas estructuras cambian en una nueva versión del núcleo (para un mejor rendimiento o más características o cualquier otra razón), un módulo VMWare binario puede causar daños catastróficos utilizando el diseño de la estructura anterior. Si vuelve a compilar el módulo desde la fuente, se capturará el nuevo diseño de la estructura y, por lo tanto, tendrá más posibilidades de funcionar, aunque todavía no al 100%, en caso de que los campos se hayan eliminado o cambiado de nombre o se les hayan asignado diferentes propósitos.

Si una función cambia su lista de argumentos, o se renombra o deja de estar disponible, ni siquiera volver a compilar desde el mismo código fuente funcionará. El módulo tendrá que adaptarse al nuevo kernel. Como todos (deberían) tener una fuente y (pueden encontrar a alguien que) pueden modificarla para que quepa."Insertar trabajo en los nodos finales" es una idea común tanto en redes como en software libre: ya que los recursos [en las franjas]/[de los desarrolladores fuera del kernel de Linux] son ​​más grandes que los recursos limitados [de la red troncal]/[de los desarrolladores de Linux], se acepta la compensación para hacer que el primero haga más trabajo.

Por otro lado, Microsoft ha tomado la decisión de que deben preservar la compatibilidad del controlador binario tanto como sea posible; no tienen otra opción, ya que están jugando en un mundo propietario. De alguna manera, esto hace que sea mucho más fácil para los desarrolladores externos que ya no se enfrentan a un objetivo en movimiento, y para los usuarios finales que nunca tienen que cambiar nada. En el lado negativo, esto obliga a Microsoft a mantener la compatibilidad hacia atrás, que (en el mejor de los casos) consume mucho tiempo para los desarrolladores de Microsoft y (en el peor de los casos) es ineficiente, causa errores y evita el avance.

2

Linux no tiene un núcleo estable ABI - cosas como el diseño interno de las estructuras de datos, etc. cambia de una versión a otra. VMWare necesita ser reconstruido para usar el ABI en el nuevo kernel.

Por otro lado, Windows tiene un núcleo muy estable ABI que no cambia de Service Pack a Service Pack.

1

Para agregar a la respuesta de bdonlan, la compatibilidad ABI es una mezcla. Por un lado, le permite distribuir módulos binarios y controladores que funcionarán con las versiones más nuevas del kernel. Por otro lado, obliga a los programadores kernel a agregar una gran cantidad de código de pegamento para mantener la compatibilidad con versiones anteriores. Debido a que Linux es de código abierto, y debido a kernel developers even whether they're even allowed, la capacidad de distribuir módulos binarios no se considera tan importante. Por el lado positivo, los desarrolladores del kernel de Linux no tienen que preocuparse por la compatibilidad ABI cuando alteran las estructuras de datos para mejorar el kernel. A la larga, esto da como resultado un código de kernel más limpio.

1

Es una consecuencia del desarrollo de Linux y Windows en diferentes entornos y expectativas culturales: http://www.joelonsoftware.com/articles/Biculturalism.html. En resumen: Windows está diseñado para ser adecuado para los usuarios, mientras que Linux evoluciona para ser adecuado para desarrolladores de código abierto.

Cuestiones relacionadas