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 : 변수 RootDirectorychroot명령 의 차이점은 무엇입니까 ?
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.