SysV, Upstart 및 시스템화 된 init 스크립트 공존 이해하지 못한다.

내 시스템 (16.04)에는 파일 /lib/systemd/system/network-manager.service과 가 있습니다 /etc/init.d/network-manager.

나는 이것이 어떻게 (그리고 왜) 작동하는지 이해하지 못한다. 항상로 네트워크 관리자를 다시 시작합니다 sudo service network-manager restart. 이 엉망이 어떻게 든 체계화되어서는 안됩니까? 여전히 작동하는 것 같습니다.

service --status-all모든 종류의 서비스를 나열합니까? 16.04는 Upstart 대신 systemd를 사용해서는 안됩니까?

누군가이 공존이 어떻게 작동하는지 설명해주세요.



답변

한 번에 하나의 init 시스템 만 활성화 할 수 있습니다. 16.04에 시스템이 구성되었습니다.

다수의 패키지는 여러 init 시스템 용 파일과 함께 제공되므로 다른 OS의 여러 init 시스템으로 관리 할 수 ​​있습니다. Ubuntu에서는 여러 개의 init 시스템 용 스크립트가 모두 동시에 사용되지는 않지만 설치되기도합니다.

최신 init 시스템은 이전 시스템과의 호환성을 유지하려고합니다. 특히 systemd는 Upstart 및 SysV init 스크립트와의 호환성을 유지하려고합니다.

언급 한 “init.d”스크립트의 경우 Upstart 스크립트가 아니라 “SysV”초기화 스크립트입니다. 또한 “SysV”init 스크립트는 “/etc/rc5.d”와 같은 디렉토리에 심볼릭 링크 된 경우에만 부팅시 시작됩니다. Network Manager 에는 symlink가 설치되어 있지 않습니다 .

systemd오래된 “SysV”init 스크립트를 관리 하는 방법을 이해하려면 systemd는 /etc/init.d scirpts를 어떻게 사용합니까?를 참조하십시오 . .

이제 “service network-manager restart”를 사용하여 Network Manager를 다시 시작하는 이유에 대한 질문에 답하십시오. 이 service명령은 Upstart 스크립트 및 SysV init 스크립트와 함께 사용되며 이전 스크립트를 선호합니다. Network Manager에는 또한 16.04의 Upstart 스크립트가 설치되어 있습니다 /etc/init/network-manager.conf.

의 결과를 검토하면 현재 상황 sudo strace service network-manager restart을 파악할 수 있습니다. 먼저, 출력은 systemctl호출되고 있음을 보여 주며 , 명령이 systemd로 리디렉션되고 있음을 나타냅니다. 먼저 파일을 연 직후 /usr/bin/service파일에서 쉘 스크립트로 읽기 시작하는 것을 볼 수 있습니다.

open("/usr/sbin/service", O_RDONLY)     = 3
...
read(10, "#!/bin/sh\n\n#####################"..., 8192) = 8192

이제 이것이 service셸 스크립트 라는 것을 알았 으므로 소스 코드를 확인하십시오. 소스 코드에서이를 is_systemd감지하고 설정했습니다. 체계적인 경우에는 명령이로 다시 쓰여지는 것을 볼 수 있습니다 systemctl restart network-manager.

따라서 세 개의 init 시스템이 공존하고 호환성이 있지만 복잡한 계층이 있습니다. 앞으로 진행되는 작업의 복잡성을 최소화하려면 시스템 단위 파일과 systemctl도구를 사용하여 서비스를 관리 하는 것이 가장 좋습니다 .


답변