Làm thế nào để cập nhật nhị phân ứng dụng đang chạy trong quá trình nâng cấp hoạt động?


23

Tôi vừa nâng cấp phiên bản Ubuntu của mình thành natty, trong quá trình nâng cấp, nó đã thay thế hầu hết các ứng dụng đang chạy bằng phiên bản mới hơn.

Cái này hoạt động ra sao? (Không phải các ứng dụng bị sập sao?) Điều gì sẽ xảy ra với ứng dụng nếu một tệp lib được nâng cấp và một ứng dụng đang tìm kiếm một lib cũ hơn cố gắng tải nó?


Câu hỏi hay, nhưng có lẽ tốt hơn được hỏi ở đây: unix.stackexchange.com (Tôi biết URL nói Unix nhưng họ cũng trả lời các câu hỏi Linux!)

Hiểu chức năng thay thế trong khi mở của Linux có vẻ như nó vẫn đang lập trình (nhưng chỉ vừa đủ :)
bdonlan

2
@bdonlan: Nếu bạn đang tải động các thư viện trong suốt quá trình của mình, bạn sẽ nhận thức được rất nhiều về điều này, nếu không nó có thể cắn bạn. Điều này đặc biệt quan trọng nếu bạn đang cố gắng làm điều gì đó bất thường, ví dụ: mã tự sửa đổi, v.v. Nhưng vâng, đó là đường biên giới.
Piskvor

1
Nó không thực sự liên quan đến mã tự sửa đổi, nhưng chắc chắn đó là điều mà ai đó viết thư viện cho linux nên biết, vâng. :)
bdonlan

1
@Piskvor, nghe có vẻ giống như quy trình biên dịch nhiều giai đoạn cho gcc :) Nhưng về cơ bản chỉ có các trình biên dịch làm điều gì đó tương tự, và thông thường bạn sẽ không nâng cấp hệ thống trong khi bạn làm điều đó (ngay cả khi bạn làm, miễn là bạn không sẽ không hạ cấp bất cứ thứ gì trong khi nó đang xử lý, bạn vẫn ổn, vì nó sẽ sử dụng các bản sao được biên soạn riêng của nó về bất cứ thứ gì quan trọng)
bdonlan

Câu trả lời:


31

Linux (và các UNIX khác) rút ra sự phân biệt giữa tên của một tệp ( liên kết ), chính tệp đó (thường được xác định bằng inode ) và xử lý mở đối với tệp. Khi bạn xóa tệp, bạn gọi cuộc unlink()gọi - thao tác này sẽ xóa liên kết đến tệp (bạn cũng có thể sử dụng rename()để ghi đè lên tệp đó bằng một nút khác). Tuy nhiên, nếu mở xử lý đến tập tin (hoặc liên kết khác - các file có thể có nhiều liên kết cứng ) vẫn còn, các inode còn lại, và do đó, nội dung tập tin, cho đến khi tất cả các liên kết và xử lý biến mất.

Vì vậy, việc chạy các chương trình bằng thư viện hoặc bất cứ điều gì giữ một phiên bản xử lý cho phiên bản cũ (thường ngầm thông qua ánh xạ bộ nhớ), vì vậy nó vẫn nằm trên đĩa. Nó không còn có tên tệp nữa và sẽ bị xóa khi tất cả các chương trình sử dụng nó bị tắt (hoặc trong lần khởi động lại tiếp theo, trong quá trình kiểm tra hệ thống tập tin hoặc phát lại tạp chí).

Hơn nữa, lưu ý rằng các chương trình mong đợi 'thư viện cũ' sẽ hoạt động tốt với các phiên bản mới hơn của thư viện. Các thư viện Linux được gán tên tệp ('soname') phản ánh phiên bản ABI (Giao diện nhị phân ứng dụng) do thư viện cung cấp. Ví dụ, thư viện C trên hệ thống của tôi là libc.so.6. Bất kỳ chương trình nào được biên dịch dựa trên phiên bản libc cũ hơn, nhưng vẫn là phiên bản libc triển khai phiên bản 6 ABI, sẽ hoạt động tốt với nó. Thực sự chương trình cũ sẽ tìm kiếm một libc.so.5hoặc libc.so.4hoặc một cái gì đó thay vì; trong trường hợp này, bạn cũng cần giữ phiên bản cũ xung quanh - nhưng vì tên tệp là khác nhau nên đây không phải là vấn đề.


9

Không giống như Windows, bạn có thể xóa hoặc thay thế một tệp đang mở; để đưa ra một lời giải thích đơn giản , các yêu cầu mới cho các tệp mở tệp mới, các thẻ điều khiển hiện có sử dụng tệp tồn tại khi chúng được tạo. Nói cách khác, trong Linux, bạn có thể có các phiên bản tệp / tệp vẫn tồn tại, mặc dù không còn con trỏ tới chúng trong cấu trúc thư mục; những cái đó đã tồn tại không có con trỏ nào cho chúng cả (đóng và tất cả).

Thông thường, một ứng dụng đang chạy tải các thư viện cần thiết lên phía trước, do đó, sự cố bạn mô tả sẽ chỉ xảy ra trong các tình huống thời gian rất cụ thể trong khi gói đang được cài đặt: các ứng dụng đang chạy vẫn sử dụng phiên bản cũ của thư viện, các ứng dụng mới bắt đầu sử dụng mới một.

Điều này không chỉ được sử dụng trong nâng cấp distro, mà còn xảy ra trên mọi nâng cấp gói (nâng cấp dist chỉ thêm một vài bước tự động hơn cho quy trình đó).


0

Nhiều quy trình Linux tiếp tục hoạt động sau khi các gói chúng đến từ đã được nâng cấp - nhưng một số thì không. Theo kinh nghiệm của tôi, KDE không bao giờ hoạt động đúng nếu bạn nâng cấp nó trong khi nó đang chạy. Bạn có thể gặp sự cố và / hoặc thất bại để đăng xuất.

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.