chroot 내에서 시스템 서비스 시작


38

init 스크립트 (또는 openrc)를 사용하면 항상 다른 설치 루트에서 서비스를 실행할 수 있습니다.
그러나 내가 달릴 때 나는 chroot /somepath/to_root /usr/bin/systemctl start someservice얻었다 :

Running in chroot, ignoring request.

systemd 서비스를 강제로 실행하는 방법이 있습니까?

업데이트 :
호스트 시스템이 init 스크립트 또는 openrc를 실행하지만 시스템이 작동하지 않는다는 것을 잊어 버렸습니다 .chroot를 사용하여 최소 쉘을 시작할 수없는 Unix 시스템에 문제를 일으킨다는 것을 잊었습니다.


1
또한 서비스를 chroot로 실행해야합니다. 항상 openrc2 이전에 작동했습니다. 이제 불가능 해 보입니다; (
— neofutur

잘못된 문제를 해결하려고합니다. OpenRC가있는 경우 시스템 서비스를 OpenRC 서비스로 변환해야합니다. 그 주위에는 정말 방법이 없습니다.
— Daniel B

@DanielB : 아니요! systemrescuecd에 대해 들어 본 적이 있습니까?
— user2284570

아니요. 귀하의 질문과 어떻게 관련이 있는지 모르겠습니다.
— Daniel B

답변:


29

시스템 배포판에서 잘 알려진 문제 (Arch Linux, OpenSUSE, Fedora).

Systemd는 sysvinit을 대체하며 이보다 큰 이점을 제공합니다. sysvinit에서 서비스 시작을 요청하면 환경 변수, ulimits 등을 포함하여 스크립트를 호출하는 사람의 실행 컨텍스트를 상속합니다. Systemd는 환경이 항상 동일하기 때문에 서비스가 잘 정의되고 건강하며 일정한 환경에서 서비스를 시작하는 데몬에게 알림을 제공함으로써 이와 반대로 개선합니다.

이것은 chroot 내에서 systemctl을 호출 할 때 chroot 내부와 관련이 없으며 상속 될 환경은 여전히 ​​내 현재 환경이 아닌 PID 1의 환경이라는 것을 의미합니다. 그러나 이것보다 더 나빠집니다 : 통신 소켓이 / run / systemd 안에 있기 때문에 chroot의 프로세스는 init 시스템과 통신 할 수 없습니다!

그렇다면 시스템 배포판에서 chroot를 어떻게 사용합니까?

  1. Linux 컨테이너가 있으면 이 Arch Wiki 페이지 에서으로 인해 30 초 이내에 Linux 컨테이너를 설정하는 방법을 알려줍니다 systemd-nspawn.

  2. 만약 당신이 chroot 환경을 정말로 원한다면, 이 아름답고 맑은 웹 페이지 는 두 가지 작업 솔루션을 제공 할 것입니다 (두 번째는 지점 # 1에서 제공되는 것의 수정 된 버전입니다).


찾았 systemd-nspawn지만 실행할 수 없습니다. 그리고 호스트와 대상 아키텍처 모두에서 서비스를 사용해야하므로 컨테이너 용이 아닙니다.
— user2284570

2
호스트 시스템 루트에서 systemd를 사용하지 않습니다. 필자의 경우 systemd와 openrc를 혼합 할 수 없습니다.
— user2284570

1
@TwoD 작동하지 않습니다. systemd-nspawn"시스템 시스템에서 실행되지 않음"으로 인해 실행 이 실패합니다. 호스트가 systemd를 사용하지 않는 한.
— hvd

1
@TwoD 그리고 나는 전혀 그렇게 들리지 않기 때문에 응답했습니다. :) "실행할 수 없습니다"는 실행 파일을 찾는 데 문제가있는 경우 이상하게 들릴 수 있으므로 문제가 내 의견에 포함 된 것으로 의심됩니다. 실행하면 오류 메시지가 표시되고 유용한 것은 없습니다. 그러나 문제가 실제로 어디에서 찾을 수 있었음에도 불구 systemd-nspawn하고 새로운 루트를 가리키는 것은 도움이되지 않습니다. 호스트가 이미 (시스템을 실행 중이기 때문에) 호스트 버전을 사용할 수 있거나 호스트 버전을 가지고 있지 않지만 새 루트 버전은 작동하지 않습니다.
— hvd

1
systemd에 실행을 거부합니다chroot
— Erkin Alp Güney

4

systemd "서비스"만 무시하므로 데몬 명령을 수동으로 실행하면됩니다.

그래서 대신

service sshd start

나는 사용한다

/usr/sbin/sshd -D &

모든 서비스에서 작동하지는 않습니다. 일부는 Xorg와 같은 시스템 서비스 스타터의 일부로 시작해야합니다.
— user2284570

startx작동합니다 Xorg.
— Erkin Alp Güney

@ ErkinAlpGüney : chroot에 없습니다… Dbus 때문입니다.
— user2284570

4

몇 년 후 나는 대부분의 체계적인 실제 문제에 대한 단 하나의 해결책이 있음을 인정해야한다. 오류는 Systemd 자체이므로

Upstart 또는 Openrc와 같은 문제에 직면하지 않은 문제가 있었기 때문에 Systemd에 정말로 빠져 있습니다.

  • 24Mb의 램만 있고 쓰기 가능한 스토리지가없는 내장형 시스템의 경우에도 cgroup 지원이 필요한 커널 (옵션 파일 대신 구성 파일 내에서 기본적으로 활성화되어 있음) 이 적용됩니다 .
  • 모듈 식이라는 주장에도 불구하고, 런타임에 의존성 지옥은 그것을 강력한 신의 대상으로 만듭니다. 단일 reiser4 rootfs를 통해 부팅하고 싶습니까? 많은 프로그램이 필요하기 때문에 그것은 불가능 systemd-udevd요구하는 systemd-init요구하는 systemd-boot것보다 동시에 설치할 수없는 패키지 grub2도 아니고 Reiser4와 파티션에서 커널 이미지를 읽을 수 있습니다.
  • 블루투스 전화 접속을 통해 인터넷에 연결하고 싶습니까? Samsung java me 전화에서 작동하지 않으면 이전에 수동으로 작동했던 스크립트 및 명령 줄 소프트웨어를 실행할 수 없습니다 networkd.
  • 가장 큰 문제는 Linux 배포판을 빌드하고 유지 관리하는 경우입니다. systemd init 모듈 자체에는 종속성이 너무 커서 다른 설치 패키지를 통해 다른 init 시스템을 선택할 것을 제안 할 수 없습니다.
  • 시스템에서 chroot 할 수 없거나 libdb4.8에서 업그레이드 한 경우 로그를 보는 것이 좋습니다 (최소한 경우 최악의 경우 Microsoft는 xml 형식의 로그 파일을 가지고 있음) .

유일한 해결책 :

Systemd는 ossv4 대신 alsa와 같은 문제를 해결하기위한 비 재적입니다. 따라서 systemd를 사용하는 것이 있으면 모든 데이터를 지우십시오.

dd if=/dev/urandom of=/dev/dm−0 bs=1M

Openrc의 Gentoo와 같은 SysV Init의 문제를 해결하면서 전혀 사용하지 않는 것을 설치하십시오.
내 질문 systemd에 관해서는 Windows® 레지스트리와 같은 것들을 만듭니다. 일부 문제가 해결되면 끝났습니다.


3
무언가의 디자인이 실제로 답변을 얻는 것을 막을 수 있으므로 대답은 작동하는 것으로 전환하는 것입니다 . 그리고 이것은 실제 답변입니다.
— user2284570

1
나는 같은 의견을 가지고 있었고, 이제 조금 더 균형 잡힌 견해를 가지고 있습니다. Systemd는 실제로 죽여야하는 것을 실제로 죽일 수 있다는 큰 장점 이 있습니다 . 커널 cgroup 기능을 사용하여 분기 된 모든 하위 프로세스를 추적하기 때문입니다. 이전 도구 중 어느 것도 그렇게 할 수 없습니다. 또한, /etc/init/*.sh에있는 스크립트의 헛소리를 기억하십니까? 나도 오늘 나에게 나쁜 기억 일뿐입니다. 체계화 된 서비스 파일은 명확하고 약 10 줄 길이 구성 입니다. 200 줄 길이의 스크립트가 아닙니다 . 이러한 큰 장점은 체계화되어 있으며 다른 모든 기능은 단점이라는 데 동의합니다.
— peterh는

Btw, 나는 당신의 대답에 투표를했습니다. 왜냐하면 그 장점들 외에 정확하게 이런 유형의 비평가들,이 톤에서 정확하게 시스템 개발이 개선해야하기 때문입니다. 예를 들어, 방금 chroot에서 postgresql을 시작하려고했는데 루트 시스템을 폐기해야했습니다. 많은, 많은 엉터리 것은, 여전히 권리입니다.
— peterh는

@ peterh : 불행히도 모든 사람이 그것을 공유하지는 않습니다 . 게시물을 삭제한다는 의미입니다. 이것은 Systemd에 대한 SysV init에 관한 것이 아니라 Openrc 또는 Upstart와 같은 것들에 대한 것입니다 (짧은 시작 스크립트뿐만 아니라 병렬 서비스 시작을 허용합니다). 최소한 한 가지를 배웠습니다. 다윈은 주로 Apple ™의 핵심이며 Windows는 Microsoft의 핵심이며 Linux 디자인은 대부분 빨간 모자에 의해 운영됩니다. 속도가 느린 동안 SysV init가 런타임시 수행 할 수있는 작업을 제한하지는 않습니다.
— user2284570

@peterh Services 스크립트는 Openrc를 사용할 때 매우 명확합니다. Systemd에서 cgroup의 문제는 Systemd가 Darwin 또는 NetBSD와 같은 것을 실행하지 못하게하는 옵션이 아닙니다.
— user2284570

3

서비스는 systemctl이 아닌 systemd (pid 1)에 의해 실행되며 (시작 요청 만 전송 함) systemd는 chroot 외부에서 실행되므로 서비스도 마찬가지입니다.

기술적으로는 (systemctl을 루트에 systemd로 전달하여) 구현할 수 있지만 이미 전체 컨테이너를 만드는 도구가 있기 때문에 발생할 가능성은 거의 없습니다 ( systemd-nspawn /somepath/to_root). 그래도 항상 메일 링리스트에 연락 할 수 있습니다.


1
하지만 호스트 시스템은 oepnrc를 사용하기 때문에 systemctl을 사용해야합니다. 완전한 독립적 인 솔루션을 원합니다
— user2284570

3
나는 다음과 같이 말함으로써 물을 더 흐릿하게 할 것이다 : Psst! RootDirectory=당신은 너무 위험하게 공언이 부족하기 때문에 언급 . (-:
— JdeBP

@JdeBP : 변수 RootDirectory와 chroot명령 의 차이점은 무엇입니까 ?
— user2284570

@grawity : 그렇다면 pid 1init가 있다면 무엇을 추가 합니까?
— user2284570

1

이 문제는 한 번 chroot의 네트워크 구성을 사용하여 복구 모드에서 네트워크를 시작하려고 시도했습니다. 마지막으로 이것은 나를 위해 작동합니다.

service --skip-redirect <service> restart

또는:

SYSTEMCTL_SKIP_REDIRECT=_ /etc/init.d/<service> restart

좋은. 그러나 레거시 Init 호환 서비스에서만 작동합니다 (Fedora rawhide의 네트워킹에서는 작동하지 않음) . 내 대답에서 말했듯이 실제 해결책은 systemd를 사용하는 모든 것을 망치는 것입니다.
— user2284570

0

소켓 활성화로 inetd 스타일 서비스를 시작하는 경우 chroot와 바이너리를 모두 inetd 스타일 실행 대상으로 지정하는 구성 파일을 사용하여 stunnel을 시작하는 것이 좋습니다.

SELINUX 문제가있을 수 있습니다. Oracle Linux 7.1 시스템에서는 stunnel이 읽어야하는 모든 파일에서 "chcon -v --type = stunnel_etc_t"를 사용해야했습니다.

소켓의 클라이언트 쪽에서 TLS 암호화를 사용해야합니다 (예 : 구성에서 "client = yes"가있는 다른 기절). 이에 대한 자세한 내용은 알려주세요.


아니 그것은 d- 버스와 같은 것들에 관한 것입니다. 대상 chroot의 문제를 진단하기 위해 수행합니다.
— user2284570

-1

nohupchroot에서 서비스를 시작 하기 위해 명령을 사용할 수 있습니다 . httpd예를 들어 서비스 를 시작하려면 다음과 같이하십시오.

nohup httpd /dev/null &

멈추다 pkill httpd


설치된 바이너리 시스템 스크립트로만 시작할 수있는 Dbus와 같은 서비스는 어떻습니까?
— user2284570

start 명령을 사용하여 디렉토리에서 이러한 서비스를 시작할 수 있습니다.
— ellooku

systemctl에 대한 심볼릭 링크입니다. 그래서 작동하지 않습니다.
— user2284570

Fedora에서 항상 Android에서 실행됩니다. 문제가 무엇인지 모르겠습니다.
— ellooku

결과는이 메시지 Running in chroot, ignoring request.입니다. 나는 당신이 chroot를 통해 항상 그렇게 생각하지 않습니다. 실제로 시작 스크립트에는 systemd가 필요합니다.
— user2284570
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.