Parece que systemd es el nuevo sistema init en el bloque, igual que Upstart hace unos años. ¿Cuáles son los pros / contras de cada uno? Además, ¿cómo se compara cada uno con otros sistemas init?
Parece que systemd es el nuevo sistema init en el bloque, igual que Upstart hace unos años. ¿Cuáles son los pros / contras de cada uno? Además, ¿cómo se compara cada uno con otros sistemas init?
Respuestas:
La mayoría de las respuestas aquí tienen cinco años, así que es hora de algunas actualizaciones.
Ubuntu solía usar el sistema de arranque por defecto, pero lo abandonaron el año pasado a favor de systemd; consulte:
Debido a eso, hay un buen artículo sobre Systemd para usuarios principiantes en el wiki de Ubuntu: comparación muy detallada entre upstart y systemd y una guía de transición de upstart a systemd.
(Tenga en cuenta que, de acuerdo con el wiki de Ubuntu , aún puede ejecutarse en las versiones actuales de Ubuntu de forma predeterminada instalando upstart-sysv
y ejecutando, sudo update-initramfs -u
pero teniendo en cuenta el alcance del proyecto systemd, no sé cómo funciona en la práctica, o si systemd es o no posible desinstalar)
La mayor parte de la información en las secciones de Comandos y Scripts a continuación está adaptada de algunos de los ejemplos utilizados en ese artículo (que tiene una licencia conveniente al igual que las contribuciones de los usuarios de Stack Exchange bajo la Licencia Creative Commons Reconocimiento-CompartirIgual 3.0 ).
Aquí hay una comparación rápida de comandos comunes y scripts simples, consulte las secciones a continuación para obtener una explicación detallada. Esta respuesta compara el comportamiento anterior de los sistemas basados en Upstart con el nuevo comportamiento de los sistemas basados en systemd, como se hizo en la pregunta, pero tenga en cuenta que los comandos etiquetados como "Upstart" no son necesariamente específicos de Upstart, a menudo son comandos que son comunes a todos los sistemas Linux y Unix no systemd.
su
machinectl shell
(consulte la sección "reemplazo de comando su" a continuación)
screen
systemd-run --user --scope screen
(consulte la sección "Eliminación inesperada de procesos en segundo plano" a continuación)
tmux
systemd-run --user --scope tmux
(consulte la sección "Eliminación inesperada de procesos en segundo plano" a continuación)
start foo
systemctl start foo
stop foo
systemctl stop foo
restart foo
systemctl restart foo
initctl list
systemctl status
init-checkconf /etc/init/foo.conf
systemd-analyze verify /lib/systemd/system/foo.service
initctl list-env
systemctl show-environment
initctl set-env foo=bar
systemctl set-environment foo=bar
initctl unset-env foo
systemctl unset-environment foo
En el inicio, los registros son archivos de texto normales en el directorio / var / log / upstart, por lo que puede procesarlos como de costumbre:
cat /var/log/upstart/foo.log
tail -f /var/log/upstart/foo.log
En systemd, los registros se almacenan en un formato binario interno (no como archivos de texto), por lo que debe usar el journalctl
comando para acceder a ellos:
sudo journalctl -u foo
sudo journalctl -u foo -f
Ejemplo de script inicial escrito en /etc/init/foo.conf
:
description "Job that runs the foo daemon"
start on runlevel [2345]
stop on runlevel [016]
env statedir=/var/cache/foo
pre-start exec mkdir -p $statedir
exec /usr/bin/foo-daemon --arg1 "hello world" --statedir $statedir
Ejemplo de script systemd escrito en /lib/systemd/system/foo.service
:
[Unit]
Description=Job that runs the foo daemon
Documentation=man:foo(1)
[Service]
Type=forking
Environment=statedir=/var/cache/foo
ExecStartPre=/usr/bin/mkdir -p ${statedir}
ExecStart=/usr/bin/foo-daemon --arg1 "hello world" --statedir ${statedir}
[Install]
WantedBy=multi-user.target
Un su
reemplazo de comando se fusionó con systemd en la solicitud de extracción # 1022:
porque, según Lennart Poettering, "su es realmente un concepto roto" .
Explica que "puedes usar su y sudo como antes, pero no esperes que funcione por completo " .
La forma oficial de lograr un su
comportamiento similar es ahora:
machinectl shell
Lennart Poettering lo ha explicado más detalladamente en la discusión para emitir # 825:
"Bueno, ha habido largas discusiones sobre esto, pero el problema es que lo que se supone que debe hacer es muy poco claro. [...] En pocas palabras: su es realmente un concepto roto. Te dará una especie de caparazón , y está bien usarlo para eso, pero no es un inicio de sesión completo, y no debe confundirse con uno ". - Lennart Poettering
Ver también:
Comandos como:
Ya no funciona como se esperaba . Por ejemplo, nohup
es un comando POSIX para asegurarse de que el proceso siga ejecutándose después de cerrar sesión en su sesión. Ya no funciona en systemd. Además, los programas como screen
y tmux
deben invocarse de una manera especial o de lo contrario, los procesos que ejecuta con ellos se eliminarán (aunque no lograr que se eliminen esos procesos suele ser la razón principal de ejecutar screen o tmux en primer lugar).
Esto no es un error, es una decisión deliberada, por lo que no es probable que se solucione en el futuro. Esto es lo que Lennart Poettering ha dicho sobre este tema:
En mi opinión, en realidad era bastante extraño para UNIX que, de forma predeterminada, permitiera que el código de usuario arbitrario permaneciera sin restricciones después del cierre de sesión. Se ha discutido desde hace mucho tiempo entre muchas personas del sistema operativo, que esto debería ser posible, pero ciertamente no debería ser el predeterminado, pero nadie se atrevió hasta ahora a cambiar el interruptor para pasar de un valor predeterminado a una opción. No limpiar las sesiones de los usuarios después de cerrar sesión no solo es feo y algo hackeo, sino también un problema de seguridad. systemd 230 ahora finalmente activó el interruptor y finalmente, por defecto, limpia todo correctamente cuando el usuario cierra la sesión.
Para más información ver:
En cierto modo, systemd funciona al revés: en los trabajos iniciales comienzan tan pronto como pueden y en los trabajos de systemd comienzan cuando tienen que hacerlo. Al final del día, ambos sistemas pueden iniciar los mismos trabajos y en casi el mismo orden, pero piensas en eso mirando desde una dirección opuesta, por así decirlo.
Así es como lo explica Systemd para usuarios principiantes :
El modelo de Upstart para iniciar procesos (trabajos) está "basado en eventos codiciosos", es decir, todos los trabajos disponibles cuyos eventos de inicio se inician se inician lo antes posible. Durante el arranque, el sistema de arranque sintetiza algunos eventos iniciales como el inicio o rcS como la "raíz del árbol", los primeros servicios comienzan en esos y los servicios posteriores comienzan cuando se ejecutan los primeros. Un nuevo trabajo simplemente necesita instalar su archivo de configuración en / etc / init / para activarse.
El modelo de systemd para iniciar procesos (unidades) está "basado en dependencia perezosa", es decir, una unidad solo se iniciará si alguna otra unidad de inicio depende de ella. Durante el arranque, systemd inicia una "unidad raíz" (default.target, puede anularse en grub), que luego se expande de forma transitiva e inicia sus dependencias. Una nueva unidad necesita agregarse como una dependencia de una unidad de la secuencia de arranque (comúnmente multiusuario.target) para activarse.
Ahora algunos datos recientes según Wikipedia:
(Consulte Wikipedia para obtener información actualizada)
En el pasado, se ha propuesto una bifurcación de Debian para evitar systemd . Se creó Devuan GNU + Linux : una bifurcación de Debian sin systemd (gracias a fpmurphy1 por señalarlo en los comentarios).
Para obtener más información sobre esta controversia, consulte:
Declaración de Debian Exodus en 2014 :
Como muchos de ustedes ya sabrán, el voto Init GR Debian promovido por Ian Jackson no fue útil para proteger el legado de Debian y sus usuarios de la avalancha del sistema.
Esta situación prevé un bloqueo en las dependencias del sistema que amenaza de facto la libertad de desarrollo y tiene serias consecuencias para Debian, su flujo ascendente y su flujo descendente.
El CTTE logró intercambiar una dependencia y ganarnos tiempo con una instalación sutil de systemd sobre sysvinit, pero incluso este proceso fue agotador y lleno de drama. Finalmente, hace una semana, Ian Jackson renunció. [...]
Renuncio al Comité Técnico con efecto inmediato.
Si bien es importante que las opiniones del 30-40% del proyecto que están de acuerdo conmigo sigan estando representadas en el TC, yo mismo soy claramente una figura demasiado controvertida en este punto para hacerlo. Debería hacerme a un lado para tratar de reducir la medida en que las conversaciones sobre la gobernanza del proyecto son personalizadas. [...]
Devuan nació de una controversia sobre la decisión de utilizarlo como el sistema de inicio predeterminado para Debian. La posición oficial de Debian en systemd está llena de afirmaciones que otros han desacreditado . Los lectores interesados pueden continuar discutiendo este tema candente en La controversia del sistema . Sin embargo, lo alentamos a mantener la cabeza fría y su voz civilizada. En Devuan estamos más interesados en programarlos mal que en mirar atrás. [...]
Se han creado algunos sitios web y artículos dedicados a la controversia del sistema:
Hay muchas discusiones interesantes sobre Hacker News:
También se pueden observar tendencias similares en otras distribuciones:
advenedizo sigue la filosofía Unix de DOTADIW: "Haz una cosa y hazlo bien". Es un reemplazo para el demonio init tradicional. No hace nada más que iniciar y detener servicios. Otras tareas se delegan a otros subsistemas especializados.
systemd hace mucho más que eso. Además de iniciar y detener servicios, también administra contraseñas, inicios de sesión, terminales, administración de energía, restablecimientos de fábrica, procesamiento de registros, puntos de montaje del sistema de archivos, redes y mucho más; vea el archivo NOTICIAS para ver algunas de las características.
De acuerdo con una Perspectiva para systemd Lo que se ha logrado y la presentación de Lo que se encuentra por delante de Lennart Poettering en 2014 en GNOME.asia, estos son los objetivos principales de systemd, áreas que ya estaban cubiertas y las que aún estaban en progreso:
Nuestros objetivos
- Convierte Linux de una bolsa de bits en un sistema operativo competitivo de uso general.
- Construyendo el sistema operativo de próxima generación de Internet Unificando diferencias sin sentido entre distribuciones
Llevando la innovación de vuelta al sistema operativo central
Escritorio, servidor, contenedor, integrado, móvil, nube, clúster,. . . Estas áreas están más juntas de lo que piensas
- Reducción de la complejidad del administrador, fiabilidad sin supervisión.
- Todo introspectable
- El descubrimiento automático, plug and play es clave
- Arreglamos las cosas donde están rotas, nunca las pegamos
Lo que ya cubrimos:
sistema init, registro de diario, administración de inicio de sesión, administración de dispositivos, administración de archivos temporales y volátiles, registro de formato binario, guardar / restaurar la luz de fondo, guardar / restaurar rfkill, diagrama de arranque, readahead, configuración de almacenamiento encriptado, descubrimiento de partición EFI / GPT, máquina virtual / contenedor registro, gestión mínima de contenedores, gestión de nombres de host, gestión local, gestión del tiempo, gestión de semillas aleatorias, gestión de variables sysctl, gestión de consola,. . .
En qué estamos trabajando:
- administración de redes
- systemd-networkd
- Caché DNS local, respondedor mDNS, respondedor LLMNR, verificación DNSSEC
- IPC en el núcleo
- kdbus, sd-bus
- Sincronización horaria con NTP
- systemd-timesyncd
- Más integración con contenedores
- Sandboxing de servicios
- Sandboxing de aplicaciones
- Formato de imagen del sistema operativo
- Formato de imagen de contenedor
- Formato de imagen de la aplicación
- GPT con autodescubrimiento
- Sistemas sin estado, sistemas instanciables, restablecimiento de fábrica
- / usr es el sistema operativo
- / etc es la configuración (opcional)
- / var es el estado (opcional)
- Inicialización y actualizaciones de nodos atómicos
- Integración con la nube
- Gestión de servicios entre nodos
- Imágenes del sistema operativo verificables
- Todo el camino hasta el firmware
- Carga de arranque
Como señaló fpmurphy1 en los comentarios, "debe señalarse que systemd ha ampliado su alcance de trabajo a lo largo de los años mucho más allá del simple inicio del sistema".
Traté de incluir la mayoría de la información relevante aquí. Aquí estoy comparando las características comunes de Upstart y systemd cuando se usan como sistemas init como se hizo en la pregunta y solo menciono características de systemd que van más allá del alcance de un sistema init porque no se pueden comparar con Startup, pero su presencia es importante entender la diferencia entre esos dos proyectos. La documentación relevante debe verificarse para obtener más información.
Más información se puede encontrar en:
El equipo de LinOxide ha creado una hoja de trucos de Linux Systemd vs SysV Init .
service <foo> start/stop/restart/status
todavía funciona bien. Al igual que la mayoría del software de Unix, systemd proporciona compatibilidad de comandos con valores predeterminados bien conocidos.
Tanto upstart como systemd son intentos de resolver algunos de los problemas con las limitaciones del sistema de inicio tradicional SysV. Por ejemplo, algunos servicios deben comenzar después de otros servicios (por ejemplo, no puede montar sistemas de archivos NFS hasta que la red se esté ejecutando), pero la única forma en que SysV puede manejar eso es establecer los enlaces en el directorio rc # .d tal que uno está antes que el otro. Además, es posible que deba volver a numerar todo más tarde cuando se agreguen o cambien dependencias. Upstart y Systemd tienen configuraciones más inteligentes para definir los requisitos. Además, está el problema con el hecho de que todo es un script de shell de algún tipo, y no todos escriben los mejores guiones de inicio. Eso también afecta la velocidad de la puesta en marcha.
Algunas de las ventajas de systemd que puedo ver:
Una desventaja que conozco es que para aprovechar la asignación previa de socket / FH de systemd, muchos daemons tendrán que ser parcheados para que systemd les pase el FH.
Vi systemd
mencionado en Arch General ML hoy. Así que léelo. El H Online como siempre es una gran fuente de tecnología Linux y es donde encontré mi lugar para comenzar a investigar Systemd como alternativa SysV Init y Upstart . Sin embargo, el artículo H Online (en este caso) no es una lectura muy útil, el uso real detrás de esto es que proporciona enlaces a las lecturas útiles.
La verdadera respuesta está en el anuncio de systemd . Lo que da algunos puntos cruciales de lo que está mal con SysV initd y qué nuevos sistemas deben hacer
Para empezar menos.
Y para comenzar más en paralelo.
Su plan principal para hacer esto parece ser iniciar los servicios solo cuando son necesarios, e iniciar un socket para ese servicio, de modo que el servicio que lo necesita pueda conectarse al socket creado mucho antes de que el demonio esté completamente en línea. Aparentemente, un socket retendrá una pequeña cantidad de datos almacenados, lo que significa que no se perderán datos durante el retraso, se manejará tan pronto como el demonio esté en línea.
Otra parte del plan parece ser no serializar los sistemas de archivos, sino montarlos a pedido también, de esa manera no está esperando su montaje, /home/
etc. (no debe confundirse con /etc
), y / o fsck
cuándo podría los demonios iniciales como /
y /var/
etc. ya están montados. Dijo que iba a usar autofs para este fin.
También tiene el objetivo de crear .desktop
descriptores de inicio de estilo como reemplazo de los scripts. Esto evitará toneladas de sh
procesos lentos e incluso más tenedores de procesos de cosas como sed
y grep
que a menudo se usan en scripts de shell.
También planean no iniciar algunos servicios hasta que se los soliciten, y tal vez incluso los apaguen si ya no son necesarios, por ejemplo, el módulo bluetooth y el daemon solo se necesitan cuando está utilizando un dispositivo bluetooth. Otro ejemplo dado es el demonio ssh. Este es el tipo de cosas que inetd es capaz de hacer. Personalmente, no estoy seguro de que me guste esto, ya que puede significar latencia cuando los necesito, y en el caso de ssh, creo que significa una posible vulnerabilidad de seguridad, si mi inetd estuviera en peligro, todo el sistema lo estaría. Sin embargo, me han informado que usar esto para violar este sistema no es factible y que si lo deseo puedo desactivar esta función por servicio y de otras maneras.
Aparentemente, otra característica será la capacidad de comenzar en función de eventos de tiempo, ya sea en un intervalo programado regularmente o en un momento determinado. Esto es similar a qué crond
y atd
hacer ahora. Aunque me dijeron que no admitirá el usuario "cron". Personalmente, esto suena como lo más inútil. Creo que esto fue escrito / pensado por personas que no trabajan en entornos multiusuario, no hay mucho propósito para el usuario cron si eres el único usuario en el sistema, aparte de no ejecutarse como root. Trabajo diariamente en sistemas multiusuario, y la regla siempre es ejecutar scripts de usuario como el usuario. Pero tal vez no tengo la previsión que tienen, y de ninguna manera hará que no pueda ejecutar crond
o atd
, por lo que no perjudica a nadie más que a los desarrolladores, supongo.
La gran desventaja de systemd es que algunos demonios tendrán que modificarse para aprovecharlo al máximo. Funcionarán ahora, pero funcionarían mejor si se escribieran específicamente para su modelo de socket.
Parece que, en su mayor parte, el problema de la gente del sistema con el advenedizo es el sistema de eventos, y creen que no tiene sentido o es innecesario. Quizás sus palabras lo expresen mejor.
O para decirlo de manera más simple: el hecho de que el usuario recién haya iniciado D-Bus no es en modo alguno una indicación de que NetworkManager debería iniciarse también (pero esto es lo que haría Upstart). Es justo al revés: cuando el usuario solicita NetworkManager, eso definitivamente es una indicación de que D-Bus también debe iniciarse (que es ciertamente lo que la mayoría de los usuarios esperarían, ¿verdad?).
Un buen sistema de inicio debe comenzar solo lo que se necesita, y eso a pedido. Ya sea perezosamente o en paralelo y de antemano. Sin embargo, no debería comenzar más de lo necesario, particularmente no todo lo instalado que pueda usar ese servicio.
Como ya he dicho, esto se discute mucho más ampliamente en el anuncio de systemd .
Bueno, una cosa que la mayoría de ustedes olvidaron es la organización de procesos en cgroups .
Entonces, si systemd inició algo, lo colocará en su propio cgroup y no hay un medio (sin privilegios) para que el proceso escape de ese cgroup. Aquí están las consecuencias de eso:
Para obtener una visión muy detallada de systemd, comenzando con los primeros borradores de diseño (y una crítica detallada de los sistemas init existentes, incluido el sistema inicial y cómo systemd propone solucionarlos), vaya a su página de inicio . Con el tiempo, se han publicado varios artículos sobre startup en LWN . Solo tenga en cuenta que cualquier mención de systemd (o pulseaudio) allí desencadena guerras de fuego interminables.
IMVHO (y como usuario de Fedora) estoy muy contento con eso. Algo en esta línea se había retrasado mucho para manejar la complejidad de los sistemas Linux actuales. Fedora usó advenedizo por un tiempo, pero nunca salió de la etapa de ser un reemplazo elegante para sysvinit, ejecutando principalmente scripts de inicio sin cambios. Su promesa de simplificar la configuración de arranque tiene el costo de nuevamenteconfigurar manualmente las interdependencias, y eso simplemente no funciona. systemd calcula las dependencias por sí mismo (o simplemente permite iniciar cosas sin tener en cuenta las dependencias, se solucionan por sí mismas). Otra gran ventaja (algunos dicen que es una desventaja severa) es que explota las características específicas de Linux hasta el fondo (especialmente los cgroups permiten aislar un demonio y todos sus descendientes, por lo que es fácil de monitorear, limitar los recursos o matarlos como un grupo; hay muchos otros).
Registro en diario: Systemd es literalmente como la carpeta WinSXS cuando se trata de registrar cosas, crea copias de copias a menos que elimine o reduzca manualmente el tamaño del archivo que seguirá consumiendo en su disco. Lo llamo cookies del gestor de arranque.