Sự khác biệt giữa các lệnh này để đưa xuống máy chủ Linux là gì?


65

Đọc "Sự khác biệt giữa các lệnh Halt và Shutdown là gì?" , Tôi thường có ý tưởng tắt lệnh làm gì, có hoặc không có tùy chọn -h / -r.

Lệnh "tạm dừng" thực hiện tắt nguồn hệ thống đến mức 0 của hệ thống.

Lệnh "shutdown" thực hiện tắt nguồn hệ thống để chạy cấp 1 mà không có lệnh -h hoặc -r.

Điều gì về lệnh "poweroff" thì nó đi vào cấp 0 hoặc 1? Đây có phải là sự khác biệt chính duy nhất giữa ba lệnh này?



Đây là một số trong những điều khác biệt đáng kể cho ví dụ Solaris và FreeBSD. (Ở đó, họ thường (gần như) ngay lập tức tạm dừng / tắt máy chủ, mà không thay đổi đường băng để tắt công cụ trước)
Gert van den Berg

Câu trả lời:


120

Và bây giờ, câu trả lời systemd.

Bạn đang sử dụng, theo thẻ trên câu hỏi của bạn, Red Hat Enterprise Linux. Kể từ phiên bản 7, đã sử dụng systemd. Không có câu trả lời nào khác đúng cho thế giới của systemd; thậm chí không phải là một số giả định trong câu hỏi của bạn.

  • Quên về đường băng ; chúng tồn tại, nhưng chỉ như các miếng chêm tương thích. Tài liệu systemd nói rằng khái niệm này là "lỗi thời". Nếu bạn đang bắt đầu tìm hiểu công cụ này trên hệ điều hành systemd, đừng bắt đầu ở đó.
  • Hãy quên đi trang hướng dẫn mà marcelm trích dẫn; nó hoàn toàn không phải từ bộ công cụ phù hợp và là một mô tả về lệnh của bộ công cụ khác, không chính xác cho systemd. Đây là một trong những haltlệnh cho các inittiện ích "Hệ thống 5" của van Smoorenburg .
  • Bỏ qua các tuyên bố /sbin/haltlà một liên kết tượng trưng đến /sbin/reboot; Điều đó không đúng với systemd. Không có rebootchương trình riêng biệt nào cả.
  • Bỏ qua các câu lệnh halthoặc rebootgọi một shutdownchương trình với các đối số dòng lệnh; chúng cũng không đúng với systemd. Không có shutdownchương trình riêng biệt nào cả.

Mỗi bộ công cụ quản lý hệ thống có phiên bản của các tiện ích này. systemd, mới nổi, quà vặt , van Smoorenburg init, và BSD inittất cả đều có riêng của họ halt, poweroffvà vân vân. Trên mỗi cơ học của họ là hơi khác nhau. Các trang hướng dẫn của họ cũng vậy.

Trong bộ công cụ systemd halt, poweroff,reboot , telinit, và shutdowntất cả các liên kết tượng trưng đến /bin/systemctl. Chúng đều là các miếng chêm tương thích ngược, chỉ đơn giản là các tốc ký để gọi giao diện dòng lệnh chính của systemd : systemctl. Tất cả đều ánh xạ tới (và trên thực tế là) cùng một chương trình. (Theo quy ước, shell cho nó biết tên mà nó đã được gọi bởi.)

mục tiêu, không phải đường băng

Hầu hết các lệnh đó là các tốc ký để báo cho systemd, bằng cách sử dụng systemctl, để cô lập một mục tiêu cụ thể . Cách ly được giải thích trong systemctltrang hướng dẫn (qv), nhưng có thể, vì mục đích của câu trả lời này, được cho là bắt đầu một mục tiêu và ngăn chặn bất kỳ mục tiêu nào khác. Các mục tiêu tiêu chuẩn được sử dụng trong systemd được liệt kê trên systemd.specialtrang hướng dẫn (8).

Các sơ đồ trên bootuptrang hướng dẫn (7) trong bộ công cụ systemd, đặc biệt là trang cuối cùng, cho thấy có ba mục tiêu "cuối cùng" có liên quan ở đây:

  • halt.target- Khi hệ thống đã đạt đến trạng thái cách ly hoàn toàn mục tiêu này, nó sẽ gọi reboot(RB_HALT_SYSTEM)cuộc gọi hệ thống. Hạt nhân sẽ cố gắng vào một chương trình giám sát ROM, hoặc đơn giản là tạm dừng CPU (sử dụng bất kỳ cơ chế nào phù hợp để làm như vậy).
  • reboot.target- Khi hệ thống đã đạt đến trạng thái cô lập hoàn toàn mục tiêu này, nó sẽ gọi reboot(RB_AUTOBOOT)cuộc gọi hệ thống (hoặc tương đương với dòng lệnh ma thuật). Nhân sẽ cố gắng kích hoạt khởi động lại.
  • poweroff.target- Khi hệ thống đã đạt đến trạng thái cách ly hoàn toàn mục tiêu này, nó sẽ gọi reboot(RB_POWER_OFF)cuộc gọi hệ thống. Hạt nhân sẽ cố gắng loại bỏ nguồn điện khỏi hệ thống, nếu có thể.

Đây là những điều mà bạn nên suy nghĩ như là trạng thái hệ thống cuối cùng, không phải chạy cấp độ. Lưu ý từ sơ đồ rằng chính hệ thống đích systemd mã hóa những thứ mà trong các hệ thống khác, ẩn chứ không rõ ràng: chẳng hạn như khái niệm rằng mỗi mục tiêu cuối cùng này bao gồm shutdown.targetmục tiêu, để một mô tả các dịch vụ phải được dừng trước khi tắt có chúng mâu thuẫn với các shutdown.targetmục tiêu.

systemctlcố gắng gửi yêu cầu đến systemd-logindkhi người dùng gọi không phải là siêu người dùng. Nó cũng vượt qua sự tắt máy bị trì hoãn qua systemd-shutdownd. Và một số wallthông báo kích hoạt thông báo. Những sự phức tạp đó sang một bên, sẽ khiến câu trả lời này dài hơn nhiều lần, giả sử rằng bạn hiện đang là siêu người dùng và không yêu cầu một hành động theo lịch trình:

  • systemctl isolate halt.target có các tốc ký:
    • shutdown -H now
    • systemctl halt
    • đồng bằng halt
  • systemctl isolate reboot.target có các tốc ký:
    • shutdown -r now
    • telinit 6
    • systemctl reboot
    • đồng bằng reboot
  • systemctl isolate poweroff.target có các tốc ký:
    • shutdown -P now
    • telinit 0
    • shutdown now
    • systemctl poweroff
    • đồng bằng poweroff
  • systemctl isolate rescue.target có các tốc ký:
    • telinit 1
    • systemctl rescue
  • systemctl isolate multi-user.target có các tốc ký:
    • telinit 2
    • telinit 3
    • telinit 4
  • systemctl isolate graphical.target có tốc ký:
    • telinit 5

Sau khi phân tích cú pháp các dòng lệnh khác nhau khác nhau, cuối cùng tất cả chúng đều kết thúc trong cùng một đường dẫn mã bên trong systemctlchương trình.

Ghi chú:

  • Hành vi truyền thống của tùy chọn ít hơn shutdown nowlà chuyển sang chế độ một người dùng . Đây không phải là trường hợp với systemd. rescue.target- chế độ một người dùng được đổi tên thành chế độ cứu trong systemd - không thể truy cập bằng shutdownlệnh.
  • telinit thực sự không hoàn toàn bỏ qua tất cả những và liên kết tượng trưng trong hệ thống tập tin mà các trang hướng dẫn mô tả. Các ánh xạ aforgiven được gắn vào chương trình, trong một bảng.runlevelN.targetdefault.targetsystemctl
  • systemd không có khái niệm về mức chạy hiện tại . Hoạt động của các lệnh này không có điều kiện dựa trên bất kỳ "nếu bạn đang ở cấp độ N ".
  • Các --forcetùy chọn vào halt, rebootpowerofflệnh cũng giống như nói --force --forceđến systemctl halt, systemctl rebootsystemctl powerofflệnh. Điều này làm cho systemctlcố gắng gọi reboot()trực tiếp. Thông thường nó chỉ cố gắng cô lập mục tiêu.
  • telinitkhông giống như init. Chúng là các chương trình khác nhau trong thế giới systemd, sau này là tên gọi khác của systemdchương trình, không phải cho systemctlchương trình. Các systemdchương trình không nhất thiết phải biên soạn với bất kỳ khả năng tương thích van Smoorenburg ở tất cả, và trên một số hệ điều hành systemd phàn nàn về việc bị gọi sai nếu ai đó cố gắng .init N

đọc thêm


1
Điều này rất chung chung đối với hầu hết các hệ thống Linux hiện đại, vì vậy, ví dụ câu trả lời wiert.me/2012/12/30/NH Sau tất cả những năm băn khoăn, cuối cùng tôi cũng hiểu chuyện gì đang xảy ra và tại sao.
Jeroen Wiert Pluimers

systemctl rebootnên tương đương với systemctl start reboot.target --job-mode=replace-irreversible. Sử dụng bất kỳ chế độ công việc khác là ít mạnh mẽ hơn. unix.stackexchange.com/questions/381739/ Ấn
sourcejedi

1
Tôi đọc toàn bộ phản hồi của bạn và tiếp thu những gì tôi có thể. Một câu hỏi vẫn còn, cùng một câu hỏi tôi đã đến đây, là systemctl rebootcách "an toàn" để khởi động lại, ví dụ như init 6đó là cách chúng ta sẽ khởi động lại an toàn?
Brian Thomas

25
  • halthướng dẫn phần cứng dừng tất cả các chức năng của CPU , nhưng để nó ở trạng thái bật nguồn. Điều này thường có nghĩa là ai đó phải khởi động lại hoặc tắt máy bằng tay bằng cách nhấn nút nguồn sau đó. Cách cụ thể để đạt được điều này là kiến ​​trúc cụ thể, nhưng ví dụ, tập lệnh x86 cung cấp các HLThướng dẫn tạm dừng bộ xử lý trung tâm (CPU) cho đến khi ngắt bên ngoài tiếp theo được kích hoạt.

  • poweroff, giống như halt, dừng CPU nhưng cũng gửi tín hiệu phần cứng ACPI sẽ hướng dẫn hệ thống bắt đầu với việc tắt hoàn toàn và ngay lập tức. Điều này gần tương đương với việc nhấn nút nguồn trên máy tính để bàn thông thường.

Cả hai haltpoweroffthường liên kết tượng trưng đến rebootthực thi, mà thường sẽ gọi những shutdowncông cụ với các đối số thích hợp ( -h, -Phoặc r) tùy thuộc vào nếu halt, poweroffhoặc rebootđược sử dụng để gọi công cụ. Tuy nhiên, khi --forcetùy chọn được chuyển đến reboothoặc khi ở runlevel 0 hoặc 6, rebootsẽ gọi lệnh reboot()hệ thống bằng chính mã lệnh thích hợp.


Thomas, cảm ơn bạn rất nhiều vì đã giải thích. Tôi muốn biết những gì về việc làm #init 0, không có nhiều khác biệt phải không?
Win.T

@ Win.T Chuyển sang runlevel 0 bằng cách sử dụng ví dụ /sbin/init 0hoặc /sbin/telinit 0nên giống như tạm dừng hệ thống, mặc dù các bước cụ thể được thực hiện sẽ phụ thuộc vào hệ thống init được đề cập, chẳng hạn như System-V init , upstart hoặc systemd . Nếu bạn đang chạy RHEL, bạn sẽ sử dụng systemd.
Thomas Nyman

4
Lưu ý đến bản thân: mỗi khi ai đó phàn nàn về cuộc gọi API Win32 phức tạp, hãy cho họ xem lại khởi động lại (2).
dùng253751

@immibis Nhưng khởi động lại là cố tình phức tạp. Nó đòi hỏi những lá cờ ma thuật nên rất khó thực hiện một cách tình cờ.
Kevin Cox

4
@KevinCox Đó là lý lẽ cho việc yêu cầu cờ ma thuật. Đây không phải là đối số để chấp nhận 4 giá trị khác nhau cho Magic2, cũng không phải là hành vi khác nhau trong không gian tên PID, cũng như không đưa một số hoạt động hầu như không liên quan (như cài đặt hành vi khởi động lại trên Ctrl-Alt-Delete) vào một chức năng.
user253751

1

halt, poweroffshutdown -hhoàn toàn tương đương. Trong thực tế, dừng lại và poweroff không làm gì ngoài gọi shutdown -h. Từ trang dừng / poweroff:

Nếu tạm dừng hoặc khởi động lại được gọi khi hệ thống không ở trạng thái runlevel 0 hoặc 6, nói cách khác khi nó chạy bình thường, thay vào đó, tắt máy sẽ được gọi (với cờ -h hoặc -r). Để biết thêm thông tin, xem trang web tắt máy (8).

Tắt máy sau đó tiến hành tắt hệ thống bằng cách chuyển sang runlevel 0.

Dừng và tắt nguồn (và khởi động lại) thực hiện vai trò kép; khi được thực hiện trong quá trình tắt (nghĩa là trong runlevel 0 hoặc 6), chúng thực hiện các thao tác cấp thấp cần thiết để dừng vật lý, tắt nguồn hoặc khởi động lại máy, như được mô tả trong câu trả lời khác.


2
Phiên bản nào của RHEL bạn đang sử dụng? Thông thường có một sự khác biệt giữa tạm dừng và poweroff (mặc dù trong một thời gian, nó không phải là trường hợp trong nhiều bản phân phối, nhưng đó là một lỗi).
Bruno
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.