Bắt đầu một dịch vụ systemd bên trong chroot


38

Với init script (hoặc với openrc) tôi luôn có thể chạy các dịch vụ từ một gốc cài đặt khác.
nhưng khi tôi chạy chroot /somepath/to_root /usr/bin/systemctl start someservicetôi đã nhận được:

Running in chroot, ignoring request.

Có cách nào để buộc systemd chạy dịch vụ không?

Cập nhật:
Tôi quên nói hệ thống máy chủ của tôi chạy init script hoặc openrc, nhưng không bao giờ systemd và tôi sử dụng chroot để khắc phục các hệ thống Unix thậm chí không thể khởi chạy shell tối thiểu.


1
Tôi cũng cần chạy các dịch vụ vào một chroot, nó luôn hoạt động trước openrc2, dường như là không thể bây giờ; (
neofutur

Bạn đang cố gắng giải quyết vấn đề sai. Nếu bạn có OpenRC, bạn cần chuyển đổi dịch vụ systemd thành dịch vụ OpenRC. Thực sự không có cách nào xung quanh đó.
Daniel B

@DanielB: KHÔNG! Bạn đã bao giờ nghe nói về systemrescuecd chưa?
dùng2284570

Không. Tôi cũng không thấy nó liên quan đến câu hỏi của bạn như thế nào.
Daniel B

Câu trả lời:


29

Một vấn đề nổi tiếng trong các bản phát hành hệ thống (Arch Linux, OpenSUSE, Fedora).

Systemd thay thế sysvinit và cung cấp một lợi thế lớn cho việc này. Trong sysvinit, khi bạn yêu cầu một dịch vụ bắt đầu, nó sẽ kế thừa bối cảnh thực thi của người đang gọi tập lệnh, bao gồm các biến môi trường, các lỗ hổng, v.v. Systemd cải thiện điều này ngược lại bằng cách thông báo một daemon, sẽ khởi động dịch vụ trong một môi trường ổn định, lành mạnh, ổn định, trong đó tất nhiên các màn trình diễn của các dịch vụ dễ dự đoán hơn, vì môi trường luôn giống nhau.

Điều này ngụ ý rằng, khi tôi gọi systemctl từ bên trong chroot, việc tôi ở bên trong chroot là không liên quan, môi trường sẽ được kế thừa vẫn là của PID 1, không phải là hiện tại của tôi. Nhưng nó còn tệ hơn thế này: vì các ổ cắm giao tiếp được đặt bên trong / run / systemd, một quá trình trong một chroot thậm chí sẽ không thể nói chuyện với hệ thống init!

Vì vậy, làm thế nào để bạn đi về chroot'ing trong distro systemd?

  1. Nếu tất cả những gì bạn muốn làm là có một thùng chứa Linux, trang Arch Wiki này sẽ cho bạn biết cách thiết lập một thùng chứa Linux trong chưa đầy 30 giây, nhờ systemd-nspawn.

  2. Nếu thay vào đó bạn thực sự muốn có một môi trường chroot, trang Web đẹp và rõ ràng này sẽ cung cấp cho bạn hai giải pháp hoạt động (giải pháp thứ hai là phiên bản sửa đổi của trang được cung cấp tại điểm # 1).


Tôi đã tìm kiếm systemd-nspawnnhưng tôi không thể chạy nó. Và Không, điều này không dành cho một container vì dịch vụ cần được sử dụng bởi cả máy chủ và kiến ​​trúc đích.
dùng2284570

2
Rằng tôi không bao giờ sử dụng systemd trong hệ thống máy chủ của tôi. Trong trường hợp của tôi, tôi không thể trộn systemd với openrc.
dùng2284570

1
@TwoD Điều đó sẽ không làm việc. Chạy systemd-nspawnkhông thành công với "Không chạy trên hệ thống systemd." trừ khi máy chủ đang sử dụng systemd.
hvd

1
@TwoD Và tôi đã trả lời vì nó hoàn toàn không giống tôi. :) "Tôi không thể chạy nó" là một điều kỳ quặc để nói nếu bạn gặp khó khăn trong việc tìm kiếm thực thi, đó là lý do tại sao tôi nghi ngờ rằng vấn đề là những gì tôi đưa vào nhận xét của mình: chạy nó mang lại thông báo lỗi đó và không Không làm gì hữu ích. Nhưng ngay cả khi nó chỉ ra vấn đề thực sự là tìm ở đâu systemd-nspawn, thì việc chỉ vào root mới sẽ không giúp ích gì. Hoặc máy chủ đã có sẵn nó (vì nó đang chạy systemd), trong trường hợp đó có thể sử dụng phiên bản máy chủ hoặc máy chủ không có nó, nhưng phiên bản gốc mới sẽ không hoạt động.
hvd

1
systemdsẽ từ chối để được chạy trongchroot
Erkin Alp Güney

4

systemd chỉ bỏ qua "dịch vụ", vì vậy tôi chỉ chạy các lệnh daemon bằng tay.

Vì vậy, thay vì

service sshd start

tôi sử dụng

/usr/sbin/sshd -D &

Điều này không làm việc cho tất cả các dịch vụ. Một số yêu cầu phải được bắt đầu như một phần của bộ khởi động dịch vụ hệ thống như Xorg.
dùng2284570

startxsẽ làm việc cho Xorg.
Erkin Alp Güney

@ ErkinAlpGüney: không có trong chroot Vì vì Dbus.
dùng2284570

4

Vài năm sau tôi phải thừa nhận rằng chỉ có một giải pháp cho hầu hết các vấn đề thực tế của Systemd. Vì lỗi là do Systemd.

Tôi thực sự chán ngấy với Systemd vì tôi gặp phải những vấn đề mà tôi chưa bao giờ phải đối mặt với những thứ như Upstart hay Openrc:

  • Việc thực thi kernel yêu cầu hỗ trợ cgroups (thay vì được tùy chọn nhưng được bật theo mặc định bên trong tệp cấu hình) ngay cả đối với các hệ thống nhúng chỉ có 24Mb ram và không có lưu trữ có thể ghi.
  • Bất chấp tuyên bố là mô-đun, trong thời gian chạy, địa ngục phụ thuộc làm cho nó trở thành một đối tượng thần mạnh: muốn khởi động trên một rootfs reiser4? Không thể vì nhiều chương trình yêu cầu systemd-udevdyêu systemd-initcầu systemd-bootgói không thể cài đặt cùng lúc hơn là grub2không thể đọc ảnh kernel từ phân vùng reiser4.
  • Bạn muốn kết nối với internet thông qua quay số Bluetooth? Nếu nó không hoạt động với điện thoại samsung java me của bạn, thì bạn không thể chạy các tập lệnh và phần mềm dòng lệnh trước đây hoạt động thủ công vì networkd.
  • Mặc dù tôi nhận ra vấn đề lớn nhất là nếu bạn đang xây dựng và duy trì bản phân phối Linux của riêng mình: bản thân mô-đun init systemd có quá nhiều phụ thuộc mà bạn không thể đề xuất để chọn một hệ thống init khác thông qua các gói cài đặt khác nhau.
  • Chúc may mắn khi xem nhật ký nếu bạn không thể chroot trong hệ thống của mình hoặc nếu bạn đã nâng cấp từ libdb4.8 (trong khi đó, trong trường hợp xấu nhất, Microsoft có tệp nhật ký ở định dạng xml) .

Giải pháp duy nhất :

Systemd là phức tạp không cần thiết để giải quyết các vấn đề: như alsa thay vì ossv4. Vì vậy, nếu bạn có một cái gì đó sử dụng systemd, chỉ cần xóa tất cả dữ liệu:

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

và cài đặt một cái gì đó hoàn toàn không sử dụng nó trong khi giải quyết các vấn đề của SysV init như Gentoo với Openrc.
Liên quan đến hệ thống câu hỏi của tôi làm cho những thứ như sổ đăng ký Windows®: nếu một phần của nó bị sai sót, thì nó đã kết thúc.


3
Vui lòng nhận ra rằng thiết kế của một cái gì đó thực sự có thể ngăn không nhận được câu trả lời để câu trả lời là chuyển sang một cái gì đó hoạt động . Và đó là một câu trả lời thực sự.
dùng2284570

1
Tôi đã có cùng quan điểm, bây giờ tôi có quan điểm cân bằng hơn một chút. Systemd có một lợi thế siêu lớn là nó thực sự có thể giết chết những gì nên bị giết . Đó là bởi vì nó theo dõi tất cả các quy trình con rẽ nhánh với tính năng cgroup kernel. Không có công cụ cũ nào có thể làm điều đó. Hơn nữa, bạn có nhớ những thứ nhảm nhí của các tập lệnh trong /etc/init/*.sh?I không, nhưng nó chỉ là một ký ức tồi tệ đối với tôi ngày hôm nay. Các tập tin dịch vụ systemd rõ ràng và dài khoảng 10 dòng configs . Không phải 200 dòng script dài . Những lợi thế to lớn này có hệ thống, tôi đồng ý rằng tất cả các tính năng khác của nó là bất lợi.
peterh nói phục hồi Monica

Btw, tôi đã bình chọn câu trả lời của bạn bởi vì, bên cạnh những lợi thế của nó, chính xác là loại phê bình này, chính xác trong giai điệu này là những gì mà sự phát triển systemd yêu cầu phải cải thiện. Ví dụ, tôi vừa thử khởi động một postgresql trong một chroot và tôi đã phải làm hỏng hệ thống gốc của mình để làm điều đó. Nhiều, nhiều thứ nhảm nhí vẫn còn đó, phải không.
peterh nói phục hồi Monica

@peterh: tiếc là không phải ai cũng chia sẻ nó. Ý tôi là đến lúc xóa bài. Đây không phải là về SysV init với Systemd mà là chống lại những thứ như Openrc hoặc thậm chí Upstart (cho phép các tập lệnh khởi động ngắn cũng như khởi động dịch vụ song song). Ít nhất tôi đã học được một điều: Darwin chủ yếu là ᴏꜱ của Apple ™ Windows là thiết kế của Microsoft và Linux chủ yếu được điều hành bởi mũ đỏ. Mặc dù SysV init trong khi chậm hơn không hạn chế bạn ở những gì bạn có thể làm trong thời gian chạy.
dùng2284570

Các tập lệnh dịch vụ @peterh cũng rất rõ ràng khi bạn sử dụng Openrc. Vấn đề với cgroup trên Systemd là đây không phải là một tùy chọn mà bằng cách ngăn Systemd chạy những thứ như Darwin hoặc NetBSD.
dùng2284570

3

Không. Dịch vụ được thực thi bởi systemd (pid 1), không phải bởi systemctl trực tiếp (chỉ gửi yêu cầu bắt đầu) và vì systemd chạy bên ngoài chroot, nên dịch vụ cũng vậy.

Mặc dù về mặt kỹ thuật có thể thực hiện được điều này (bằng cách tạo systemctl bằng cách nào đó chuyển root của nó sang systemd), điều đó khó có thể xảy ra vì đã có một công cụ để tạo các container đầy đủ ( systemd-nspawn /somepath/to_root). Bạn luôn có thể liên hệ với danh sách gửi thư mặc dù.


1
Đẹp, nhưng tôi cần sử dụng systemctl vì hệ thống máy chủ của tôi sử dụng oepnrc. Tôi muốn giải pháp độc lập hoàn toàn
user2284570

3
Tôi sẽ làm vẩn đục nước hơn nữa bằng cách nói: Psst! Đề cập RootDirectory=là tốt vì bạn rất nguy hiểm thiếu upvote. (-:
JdeBP

@JdeBP: Sự khác biệt (về mặt kết quả) giữa biến RootDirectorychrootlệnh là gì?
dùng2284570

@grawity: Vậy có gì bổ sung nếu pid 1là init?
dùng2284570

1

Đối mặt với vấn đề này một khi đã cố gắng đưa lên mạng trong chế độ cứu hộ bằng cách sử dụng cấu hình mạng từ chroot. Cuối cùng, điều này làm việc cho tôi:

service --skip-redirect <service> restart

hoặc là:

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

Tốt đẹp. Nhưng nó chỉ hoạt động với các dịch vụ tương thích Ban đầu kế thừa (sẽ không hoạt động để kết nối mạng bằng da thô Fedora) . Như tôi đã nói trong câu trả lời của mình, giải pháp thực sự là làm hỏng mọi thứ sử dụng systemd.
dùng2284570

0

Nếu bạn đang khởi chạy một dịch vụ kiểu inetd với kích hoạt ổ cắm, hãy xem xét khởi chạy stunnel thay vì một tệp cấu hình chỉ định cả chroot và nhị phân của bạn làm mục tiêu khởi động kiểu inetd.

Lưu ý rằng bạn có thể có vấn đề TỰ ĐỘNG. Trên hệ thống Oracle Linux 7.1, tôi đã phải "chcon -v --type = stunnel_etc_t" trên tất cả các tệp mà stunnel cần đọc.

Bạn sẽ cần sử dụng mã hóa TLS ở phía máy khách của ổ cắm (nghĩa là một stunnel khác có "client = yes" trong cấu hình). Hãy cho tôi biết nếu bạn muốn biết thêm chi tiết về điều này.


không, đó là về những thứ như d-bus. Tôi làm điều đó để chẩn đoán các vấn đề trên chroot mục tiêu.
dùng2284570

-1

Bạn có thể sử dụng nohuplệnh để bắt đầu dịch vụ trong chroot. Để bắt đầu httpddịch vụ chẳng hạn, tôi làm như thế này.

nohup httpd /dev/null &

để ngăn chặn nó pkill httpd


Điều gì về các dịch vụ như Dbus chỉ có thể được khởi động bởi tập lệnh hệ thống nhị phân được cài đặt?
dùng2284570

Bạn có thể bắt đầu các dịch vụ như vậy từ thư mục của nó bằng lệnh start.
ellooku

Đó là một liên kết với hệ thống. Vì vậy, nó không hoạt động.
dùng2284570

Tôi làm điều này mọi lúc trên Fedora chạy trên Android của tôi. Có thể tôi không biết vấn đề của bạn là gì.
ellooku

Hậu quả là thông điệp này : Running in chroot, ignoring request.. Tôi không nghĩ rằng bạn làm điều đó mọi lúc mặc dù chroot. Thật vậy, kịch bản khởi động yêu cầu systemd.
dùng2284570
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.