Cập nhật kernel Linux, trong khi để phần còn lại của hệ thống


25

Tôi là người dùng OpenBSD. Trong FAQ của OpenBSD có ghi:

OpenBSD là một hệ thống hoàn chỉnh, dự định sẽ được giữ đồng bộ. Nó không phải là một kernel cộng với các tiện ích có thể được nâng cấp riêng biệt với nhau.

Khi bạn nâng cấp một hệ thống, bạn làm như vậy trong một lần; hạt nhân và hệ thống cơ sở được thay thế. Sau đó, bạn đi và cập nhật các gói bên thứ 3 của bạn . Nếu biên dịch từ nguồn , bạn biên dịch lại kernel và khởi động nó. Sau đó, bạn xây dựng lại hệ thống cơ sở và sau đó là các gói bạn đã cài đặt. Nếu hơn một vài tuần / tháng kể từ lần cuối bạn xây dựng lại mọi thứ, trước tiên bạn hãy cài đặt một ảnh chụp nhanh và xây dựng lại từ đó (nếu bạn đang theo dõi chi nhánh CVS mới nhất).

Có một hạt nhân không đồng bộ, hệ thống cơ sở và / hoặc các gói của bên thứ 3 là nguồn gây ra các vấn đề tiềm ẩn và ít nhiều khiến bạn không nhận được bất kỳ trợ giúp nghiêm trọng nào từ danh sách gửi thư chính thức.

Tôi khá ổn với điều này. Trên thực tế, đây là một trong những lý do tôi sử dụng OpenBSD. Nó làm cho hệ thống trở thành một đơn vị nhất quán và giúp tôi dễ dàng hình thành một cái nhìn tổng quan về tinh thần của nó.

Nó như thế nào trên Linux? Hầu hết các Linux mà tôi biết là không có "hệ thống cơ sở" theo nghĩa tương tự như BSD, mà là một tập hợp các gói được cung cấp bởi nhà cung cấp phân phối. Sau đó, phần mềm tiếp theo được thêm vào bởi một quản trị viên cục bộ theo cách mà ranh giới giữa những gì đã có từ đầu và những gì được thêm vào sau đó, tốt nhất là mờ.

Linux (nói chung) không có hạt nhân mạnh để khớp nối không gian người dùng? Hạt nhân được cập nhật, theo như tôi biết, giống như bất kỳ gói phần mềm nào khác, và nó làm tôi hơi bối rối rằng điều này hoàn toàn có thể. Thêm vào đó là một số nhân thậm chí biên dịch các hạt nhân tùy chỉnh (không được khuyến khích trên OpenBSD) và có vô số phiên bản kernel khác nhau được liệt kê trong menu khởi động của chúng.

Ai hoặc điều gì đảm bảo rằng các hệ thống con khác nhau của hệ thống Linux có thể hợp tác với nhau mặc dù chúng được cập nhật độc lập với nhau?

Lý do tôi hỏi là vì một người dùng khác trên trang này đã hỏi tôi liệu thay thế kernel trong hệ thống Linux của anh ta bằng phiên bản mới hơn "có thể thực hiện được" hay không. Đến từ khía cạnh OpenBSD, tôi không thể nói rằng có, điều này sẽ được đảm bảo để không phá vỡ hệ thống.


Tôi sử dụng "Linux" ở trên như một cách viết tắt cho "phân phối Linux", các tiện ích kernel +.


Đó là một cách khác để nói rằng OpenBSD chỉ có một bản phân phối duy nhất. Nhiều mục trình đơn grub trên một hệ thống Linux thông thường là để quay trở lại kernel trước đó trong trường hợp (thường) mới nhất không thể khởi động vì một số lý do.
Thorbjørn Ravn Andersen

Câu trả lời:


29

Linus Torvalds có quan điểm rất mạnh mẽ đối với những thay đổi của nhân dẫn đến hồi quy không gian người dùng (xem câu hỏi " Nhân Linux: phá vỡ không gian người dùng " để biết chi tiết).

Giao diện giữa không gian người dùng và kernel được cung cấp bởi các cuộc gọi hệ thống. Các hạt nhân mới hơn có thể có nhiều cuộc gọi hệ thống hơn và thay đổi trong các cuộc gọi thoát khi những thay đổi đó không phá vỡ các ứng dụng hiện có. Khi giao diện gọi hệ thống có tham số cờ, các nhân mới thường hiển thị chức năng mới bằng cờ bit mới. Bằng cách này, kernel duy trì khả năng tương thích ngược với các ứng dụng cũ.

Khi không thể thay đổi giao diện hiện tại mà không phá vỡ không gian người dùng, các cuộc gọi hệ thống bổ sung đã được thêm vào để cung cấp chức năng mở rộng. Đây là lý do tại sao có ba phiên bản dupvà hai phiên bản umountgọi hệ thống.

Chính sách có một không gian người dùng ổn định là lý do tại sao các bản cập nhật kernel hiếm khi gây ra sự cố trong các ứng dụng không gian người dùng và bạn thường không mong đợi các vấn đề sau khi nâng cấp kernel.

Tuy nhiên, độ ổn định API tương tự không được đảm bảo cho các giao diện kernel và các chi tiết triển khai khác . Sysfs (on /sys) và procsfs (on /proc/) hiển thị chi tiết triển khai kernel trên cấu hình thời gian chạy, phần cứng, mạng, quy trình, vv được sử dụng bởi các ứng dụng cấp thấp. Các giao diện đó có thể thay đổi theo cách không tương thích giữa các phiên bản kernel nếu có lý do chính đáng. Các thay đổi vẫn cố gắng giảm thiểu sự không tương thích nếu có thể và có các quy tắc về cách các ứng dụng có thể sử dụng các giao diện theo cách ít có khả năng gây ra sự cố nhất. Tác động cũng bị hạn chế vì các ứng dụng cấp thấp không nên sử dụng các giao diện này.

@PeterCordes đã chỉ ra rằng nếu một thay đổi trong Procfs hoặc sysfs phá vỡ một ứng dụng được sử dụng bởi các tập lệnh init phân phối của bạn, bạn có thể gặp vấn đề.

Điều này phụ thuộc phần nào vào cách phân phối của bạn cập nhật kernel (hỗ trợ dài hạn hoặc đường chính) và thậm chí sau đó các vấn đề tương đối hiếm vì các bản phân phối thường gửi các công cụ cập nhật cùng một lúc.

@StephenKitt nói thêm rằng không gian người dùng được nâng cấp có thể yêu cầu phiên bản kernel mới hơn, trong trường hợp đó, hệ thống có thể không thể khởi động với kernel cũ và ghi chú phát hành phân phối đề cập đến điều này khi thích hợp.


1
Về lâu dài sẽ rất hữu ích khi mở rộng giải thích này bằng một bản tóm tắt về giao diện người dùng kernel (còn gọi là các cuộc gọi hệ thống) vì nó giải thích cơ chế mà các hạt nhân được cấu hình khác nhau không phá vỡ các ứng dụng.
wallyk

3
Ngay cả các Procfs ( /proc) và sysfs ( /sys) được giữ ổn định nhất có thể, theo cùng một chính sách / triết lý "không phá vỡ không gian người dùng". Ngoài ra, ioctl()mã trên các tập tin thiết bị en.wikipedia.org/wiki/Ioctl . Nó vượt xa khả năng tương thích ABI của hệ thống đơn giản, nhưng như bạn nói khi có lý do chính đáng, mọi thứ sẽ thay đổi /proc/sys. Nó sẽ không phá vỡ hầu hết các chương trình trực tiếp, nhưng nếu nó phá vỡ một chương trình không gian người dùng cấp thấp được sử dụng bởi các tập lệnh init của distro của bạn, bạn có thể gặp vấn đề. May mắn là điều này là hiếm.
Peter Cordes

Trên thực tế, một số tệp như rfkillchuyển đổi IIRC đã thay đổi vị trí trên một số nâng cấp kernel. Vì vậy, /proc/sysít ổn định hơn nhiều so với giao diện tòa nhà. May mắn thay, các bản phân phối thường không bao gồm các nâng cấp kernel như vậy trừ khi đó là bản nâng cấp phiên bản phân phối chính.
Ruslan

3
Có hai khía cạnh để xem xét ở đây: nâng cấp kernel và nâng cấp không gian người dùng. Nhờ tính ổn định ABI của kernel, việc nâng cấp kernel khá an toàn (ngay cả khi có /proc/systhay đổi thường - việc gỡ bỏ mất nhiều năm). Tuy nhiên, việc nâng cấp không gian người dùng có thể yêu cầu kernel mới và bạn có thể kết thúc với một hệ thống không thể khởi động nếu bạn không có kernel mới. Ghi chú phát hành distro đề cập đến điều này khi thích hợp (vì vậy đừng nâng cấp distro một cách mù quáng, hãy đọc ghi chú phát hành).
Stephen Kitt

1
Có các hướng dẫn cho các tệp / Proc và / sys và cách không gian người dùng nên đọc chúng để cho phép thêm nhiều trường trong các hạt nhân mới hơn. / Proc / stat chẳng hạn, hoặc / Proc / meminfo. Không gian người dùng dự kiến ​​sẽ bỏ qua các trường được thêm vào.
Zan Lynx

11

Hạt nhân Linux và không gian người dùng của một bản phân phối Linux, vốn bị chi phối bởi các công cụ người dùng được phát triển bởi dự án GNU, được kết nối lỏng lẻo. Một phần là do thiết kế, và một phần là do sự cần thiết.

Không giống như các BSD, nơi nhân cũng như không gian người dùng cơ sở được thiết kế và duy trì cùng nhau, nhân Linux và không gian người dùng của nó được phát triển và được duy trì bởi những người khác nhau. Vì vậy, việc giữ chúng liên kết chặt chẽ với nhau sẽ rất khó khăn, ngay cả khi cộng đồng mong muốn, điều mà tôi không nghĩ là có.

Và @sebasth cũng đưa ra một điểm tuyệt vời rằng một chính sách lớn của dự án nhân Linux là nó không được phá vỡ không gian người dùng. Mà tất nhiên là một yếu tố khác thực thi khớp nối lỏng lẻo.

Tuy nhiên, vẫn còn một số mức độ khớp nối. Một nhân Linux đủ cũ sẽ không hoạt động với các bản phân phối hiện đại.


2
@ Abigail đây là chọn nit, nhưng thể cung cấp khả năng tương thích , nếu không gian người dùng thực hiện các dự phòng thích hợp (thậm chí các dự phòng bị suy giảm) cho các tính năng kernel bị thiếu. Nó thường không được mong muốn hoặc thậm chí đáng giá, nhưng một số phần mềm thực hiện điều này ( glibcví dụ). (Nhưng vâng, đây không phải là một lời hứa hạt nhân, đó là một lời hứa về không gian người dùng.)
Stephen Kitt

7

Tôi hiểu rằng Linux hạt nhân và mọi thứ khác đều là phụ trợ. Bạn chắc chắn có thể nâng cấp kernel độc lập với (nhiều) gói đã cài đặt, vì chúng thường được gắn với các thư viện hơn là chính kernel. Nhìn chung, bạn sẽ chỉ thấy sự ghép nối như vậy giữa các phiên bản kernel và trình điều khiển phần cứng (ví dụ: trình điều khiển GPU). Một số phần mềm chỉ tương thích với các phiên bản nhất định của kernel, nhưng phải được chỉ định trong tài liệu riêng của các chương trình đó.

Điều khá phổ biến là có hai bộ gói nhân được cài đặt trên một hệ thống - gói hiện đang được sử dụng và gói đã cài đặt trước đó. Khi nâng cấp, sau khi đảm bảo phiên bản mới hoạt động chính xác, phiên bản cũ nhất có thể được gỡ bỏ và bạn vẫn có một dự phòng an toàn đã biết. Red Hat (và anh em họ của nó) chẳng hạn, package-cleanup --oldkernels --count 2phải thực hiện việc này một cách tự động.


Ngay cả một cái gì đó như kmod , mà bạn nghĩ sẽ cần phải được gắn với phiên bản kernel, có một chút chậm trễ trong các phiên bản mà nó sẽ làm việc với.
Ignacio Vazquez-Abrams

4

Bên cạnh tất cả các lập luận tốt ở đây, tôi có thể thêm một vài điểm sẽ giúp.

Chúng tôi đã biết chính sách nhóm kernel và khi phân phối Linux, chúng tôi cố gắng giữ mã nguồn kernel càng tinh khiết càng tốt. Điều này có nghĩa là, bất cứ khi nào có lỗ hổng phát sinh hoặc thứ gì đó cần một bản vá, chúng tôi sẽ thông báo cho nhóm kernel và cố gắng giúp đỡ với các bản vá, nhưng cuối cùng, quyết định cuối cùng là từ nhóm kernel.

Một số bản phân phối thêm các bản vá bổ sung nhiều hơn các bản phân phối khác, nhưng ý tưởng là giữ nó vì nó đến từ các nhà phát triển thượng nguồn. Rõ ràng, có một số chương trình cần cấu hình kernel đặc biệt, đặc biệt là trình điều khiển ảo hóa và bên thứ ba và thông thường, cả hai đều được sử dụng để làm việc với một phiên bản kernel cụ thể hoặc ít nhất là một phiên bản không quá cũ ... lý do là chúng thử để làm việc với các tính năng kernel mới nhất và do đó, nếu bạn cố chạy chúng với kernel cũ, chúng có thể không chạy đúng.

Một yếu tố nữa cần lưu ý là tất cả các bản phân phối Linux đều có một nhóm bảo trì, những người đảm bảo rằng tất cả các phần mềm đều tương thích với hệ thống. Đó là lý do tại sao hầu hết mọi bản phân phối đều có phiên bản ổn định và không ổn định. Các nhà phát triển làm việc với phần mềm "không ổn định" và khi tất cả được kiểm tra, họ đánh dấu là ổn định, chỉ sau đó, người dùng bình thường mới có thể nâng cấp gói, vì vậy nếu người hỏi bạn là người dùng bình thường thì an toàn 90% rằng phần mềm được kiểm tra tốt .

Vì vậy, ai là cộng đồng, và sau đó là cách tiếp cận phổ biến, chúng ta cần phần mềm làm việc cùng nhau và không phá vỡ hệ thống, đó là lý do tại sao chúng ta cố gắng tuân theo một số tiêu chuẩn như Tiêu chuẩn phân cấp tệp .

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.