Làm thế nào để vô hiệu hóa hành vi vỏ khẩn cấp systemd agressive?


10

Theo mặc định, systemd rơi vào shell khẩn cấp với một lỗi nhỏ nhất. Ví dụ: nếu một trong các mount tại fstab không thành công vì một số lý do, hệ thống sẽ không thể khởi động ngay lập tức. Tôi quản lý hàng tá hệ thống sản xuất đa dạng và tôi thấy hành vi này rất tai hại. (Trên thực tế tôi nghĩ đó là một thất bại lớn về thiết kế, nhưng đó là ý kiến ​​cá nhân).

Tôi muốn tăng khả năng phục hồi khởi động hệ thống. Tối ưu hệ thống phải luôn khởi động, thiếu trình điều khiển, gắn kết, v.v. không nên bỏ vỏ khẩn cấp, (chỉ hiển thị cảnh báo thay thế) trừ khi lỗi đã cho sẽ khiến đăng nhập bảng điều khiển hoàn toàn không thể. Những gì có thể được chạy, nên được chạy.

Tôi biết systemd tự động tạo các tệp * .mount từ / etc / fstab và tôi có thể sử dụng tùy chọn nofail với thời gian chờ x-systemd.device nhỏ (hoặc tự xác định các tệp .mount có liên quan). Tuy nhiên nó sẽ không giải quyết được vấn đề của tôi, tôi muốn làm cho hệ thống trở nên linh hoạt hơn, "vá" fstab mỗi lần không thuận tiện và tôi không chắc có bao nhiêu "sự cố" khác có thể xảy ra sẽ khiến hệ thống của tôi không thể khởi động chỉ vì Một số nhà phát triển ở đâu đó nghĩ rằng nó đủ quan trọng.

Theo cách nào đó, tôi muốn lấy lại quyền kiểm soát máy của mình và không để systemd quyết định vấn đề nào đủ nghiêm trọng để phá vỡ quy trình khởi động. Có thể không?


vấn đề thực sự btw là gì? Tôi biết hai điều - không thể đăng nhập qua ssh và dấu nhắc sulogin chỉ cho phép root, không phải người dùng sudo, để có quyền truy cập trong chế độ khẩn cấp. những điều đó có bao gồm những thiệt hại mà bạn phải chịu không?
nguồn

Trên thực tế, hệ thống sẽ dễ truy cập hơn nhiều nếu hai dịch vụ này được bắt đầu, vâng. Tối ưu hệ thống nên khởi động mọi thứ có thể được khởi động giống như trong thời gian SysV cũ (log log lỗi 'thay vì cái chết đau đớn bởi vỏ khẩn cấp) và chỉ khởi động vỏ trong trường hợp có lỗi nghiêm trọng.
goteguru

Câu trả lời:


7

Đó thực sự chỉ là thất bại gắn kết, đó là tất cả những gì bạn cần thay đổi.

Vì vậy, thư yêu cầu của bạn sẽ là tầm thường để trả lời. Tạo một tập tin thả xuống:

# /etc/systemd/system/local-fs.target.d/nofail.conf

# Clear OnFailure= (set it to nothing)
[Unit]
OnFailure=

Tôi tin rằng điều này sẽ không thêm vấn đề mới, ngoài những vấn đề mà linux sysvinit đã phải chịu bằng cách cho phép kịch bản lỗi một phần này.


Tuy nhiên, bạn cũng chỉ ra câu hỏi systemd nên đợi bao lâu để các thiết bị khối được chỉ định trở nên khả dụng. Tôi có thể thấy không có cách nào để cấu hình cái này, mà không cung cấp một sự thay thế cho toàn bộ trình tạo fstab. https://www.freedesktop.org/software/systemd/man/systemd.generator.html

Nếu bạn đổ một lượng lớn mã ít được sử dụng rộng rãi ở đây, có vẻ như không thể tăng khả năng phục hồi của hệ thống. Tôi nghĩ rằng giải pháp gần nhất sẽ là vá máy phát fstab hiện có. Nó không phức tạp ồ ạt, tôi nghi ngờ bạn có thể thoát khỏi nó / theo kịp bất kỳ thay đổi đáng kể nào.

Về mặt kỹ thuật, nếu phân phối của bạn đã có một khép kín mountallkịch bản sysvinit, bạn có thể thử hooking rằng trong Nhưng điều đó sẽ thay đổi đáng kể quá trình khởi động -. Nó thực sự hơn của một ngã ba. Tôi sẽ không đề nghị cách tiếp cận đó.


https://unix.stackexchange.com/a/393711/29483

Nếu bạn tìm kiếm thông qua các tập tin đơn vị, chỉ có một vài cách để khởi động trở lại emergency.target. Đó thường là khi một .mountđơn vị cho một hệ thống tập tin cục bộ bị lỗi, gây ra local-fs.target lỗi. Hoặc khi initramfs của bạn không thể gắn kết hệ thống tập tin gốc, nếu initramfs của bạn sử dụng systemd.

local-fs.targetOnFailure=emergency.target. Và nó bị lỗi vì các đơn vị cho các hệ thống tệp cục bộ được tự động thêm vào danh sách Yêu cầu của local-fs.target (trừ khi chúng có DefaultDependencies=no).

$ systemctl show --property Requires local-fs.target
Requires=-.mount home.mount boot.mount boot-efi.mount

2
Tôi cho rằng tôi nên đưa [Unit]\nOnFailure= vào nofail.conf của tôi. Dường như có thể định cấu hình thời gian chờ trong /etc/systemd/system.conf (thông qua tùy chọn DefaultTimeoutStartSec chung). Hệ thống của tôi thường đủ nhanh, dù sao thập niên 90 dường như là quá mức cần thiết. Giải pháp này có vẻ đầy hứa hẹn.
goteguru

Trong trường hợp của tôi, tôi thiết lập OnFailure=trong /lib/systemd/system/local-fs.targetthay vì /etc/systemd(Ubuntu 16.04 trên AWS)
ThiagoAlves

@ThiagoAlves bạn không nên làm điều đó, nó sẽ bị ghi đè lên các nâng cấp hệ thống. Thực hiện theo các hướng dẫn trong câu trả lời hoặc yêu cầu làm rõ :-).
nguồn

@sourcejedi Tôi đã thử câu trả lời nhưng nó không hiệu quả với tôi
ThiagoAlves

1
@ThiagoAlves Cảm ơn phản hồi của bạn. Tôi đã làm cho câu trả lời ít mơ hồ hơn, vì vậy chúng ta có thể rõ ràng hơn về việc đó có phải là vấn đề hay không. Tức là, tôi tự hỏi nếu bạn chắc chắn bao gồm [Unit]trước OnFailure=.
sourcejedi

0

Tắt tự động gắn kết của bất kỳ hệ thống tập tin nào không cần thiết cho hoạt động khởi động bằng cách thêm noautotùy chọn gắn kết vào /etc/fstabmục nhập của nó :

/dev/sdxy /u01 nfs defaults 0 0

đến:

/dev/sdyx /u01 nfs noauto 0 0

và sau đó gắn hệ thống tập tin sau khi khởi động bằng cách sử dụng một dòng trong /etc/rc.local:

mount /u01

Ví dụ này sử dụng NFS nhưng nó cũng có thể áp dụng cho các LUN được nhập từ máy chủ tệp.


1
Vâng, tôi biết noauto, nhưng nếu tôi thay đổi fstab mỗi lần, nofail sẽ là lựa chọn tốt hơn nhiều. Dù sao cũng cảm ơn.
goteguru

0

Hãy thử điều này có thể?

systemctl mask emergency.service
systemctl mask emergency.target

4
Bạn đã thử điều này? Điều gì xảy ra khi systemd gặp lỗi trong khi khởi động, với mục tiêu khẩn cấp bị che?
Stephen Kitt
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.