Quá trình nâng cấp Ubuntu hoạt động như thế nào?


11

Làm thế nào để Ubuntu nâng cấp hoàn toàn lên bản phân phối mới hơn, trong khi hệ điều hành vẫn đang chạy? Tôi đang nâng cấp từ 10.10 lên 11.04 và tôi đã nâng cấp nhiều lần trước đó và đơn giản như chạy update-manager -d và tải xuống và cài đặt chúng, sau đó khởi động lại.

Làm thế nào chính xác làm việc này mặc dù? Làm thế nào để người quản lý nâng cấp có thể cập nhật hệ điều hành trong khi nó vẫn đang được sử dụng?


Được rồi, thêm câu hỏi của tôi trong bình luận tiền thưởng không phải là một ý tưởng tốt. Không giống như tôi có thể chỉnh sửa nó.
Oxwivi

Câu trả lời:


3

Từ kinh nghiệm của tôi, tôi sẽ cho rằng trong khi các gói và mô-đun đang chạy, chúng được giữ trong bộ nhớ và không tham khảo lại bản sao của chúng trên ổ cứng. Bạn có thể thấy điều này nếu bạn chạy một chương trình trong Ubuntu và sau đó loại bỏ các gói liên quan trong khi nó đang chạy. Nó sẽ tiếp tục chạy, nhưng nếu bạn đóng nó, bạn không thể khởi động lại nó.

Tôi sẽ giả sử điều tương tự xảy ra với một bản nâng cấp phân phối. Tất cả các gói liên quan đến phiên bản gốc của Ubuntu vẫn đang chạy mặc dù chúng đã bị gỡ bỏ và thay thế bằng các gói mới, vì vậy cuối cùng khi chúng bị dừng khi khởi động lại hệ thống, các gói mới sẽ tiếp tục.


Điều đó cũng sẽ giải thích tại sao tôi nhận thấy các tính năng mới được thêm vào một số menu khi quá trình nâng cấp tiến triển.
bbosak

15

Dưới đây là một mô tả chi tiết hơn của quá trình. Xin lỗi các văn bản đã nhận được rất lâu.

Kinh nghiệm của tôi bắt nguồn từ Debian, mà toàn bộ hệ thống đóng gói và nâng cấp được sử dụng trong Ubuntu ban đầu được phát minh. Nâng cấp bảo mật Ubuntu hàng ngày tương ứng với việc chạy apt-get upgrademà thường không xóa bất kỳ phần mềm nào. Các bản nâng cấp phát hành lớn tương ứng với apt-get dist-upgradethời gian mà các gói phần mềm có thể được trao đổi hoàn toàn.

Trên thực tế, các thành phần cấp rất thấp thường không được trao đổi trong quá trình nâng cấp phát hành. Ngay sau khi nâng cấp, bạn sẽ tìm thấy hai hình ảnh kernel và initrd trong thư mục / boot của bạn. Điều này là do không giống như các chương trình, các thành phần kernel không thể thay thế cho nhau. Nếu có nhu cầu tải trình điều khiển thiết bị mới trong quá trình nâng cấp, chúng phải tương thích với kernel đang chạy. Sau khi hệ thống khởi động với kernel mới, cái cũ có thể được gỡ bỏ. Lần trước tôi đã kiểm tra điều này phải được thực hiện thủ công, tôi không biết trình cập nhật hiện tại xử lý việc này như thế nào. Đây là BTW. lý do chính, tại sao hình ảnh hạt nhân mang số phiên bản của nó trong tên tệp - vì vậy bạn có thể cài đặt các phiên bản kernel khác nhau cùng một lúc. Tương tự cho đường dẫn mô-đun (/ lib / mô-đun / ...)

Các gói phần mềm được nâng cấp từng cái một, bắt đầu với các gói thấp nhất trong chế độ phụ thuộc. Đó là những thư viện chương trình bình thường như libc và những người khác. Trình tự trong đó các gói được cập nhật không phải là mã hóa cứng mà được tính toán động khi các phụ thuộc gói được giải quyết. Trong hầu hết các trường hợp, các chương trình cũ có thể hoạt động với các thư viện mới, vì vậy sẽ không có vấn đề gì nếu những thư viện đó được thay thế trước.

Bạn phải hiểu ở đây, rằng hệ thống phân biệt giữa các gói được cài đặt thủ công (tức là các gói mà bạn tự yêu cầu trực tiếp, tức là crom) và các gói được cài đặt tự động, trong đó chỉ cài đặt để đáp ứng các gói phụ thuộc được cài đặt thủ công (và phụ thuộc của các phụ thuộc đó ).

Đối với mỗi chương trình được cài đặt thủ công, trình cập nhật chỉ tìm phiên bản mới hơn. Thông thường các chương trình đó chỉ là các gói meta như "ubfox-desktop", không chứa dữ liệu và chỉ phụ thuộc. Các phiên bản mới của thư viện phụ thuộc sẽ được đưa vào, vì chúng được yêu cầu bởi các chương trình được cập nhật trực tiếp (yêu cầu thủ công). Trình cập nhật sẽ luôn cố gắng cài đặt phiên bản có thể sử dụng mới nhất của bất kỳ gói phụ thuộc nào (trong mọi lần nâng cấp không chỉ phát hành nâng cấp).

Các chương trình không thể hoạt động với các phiên bản thư viện mới không thể được khởi động trong thời gian sau khi thư viện được nâng cấp và trước khi chính chương trình cũng được nâng cấp. Nếu các chương trình đó đã được chạy trước khi nâng cấp thư viện, tuy nhiên chúng sẽ tiếp tục chạy, vì phiên bản thư viện cũ vẫn còn trong bộ nhớ miễn là nó vẫn được sử dụng. Các chương trình đã được bắt đầu trước khi chúng được nâng cấp cũng vậy. Những người sẽ không cung cấp các tính năng mới cho đến khi chúng bị chấm dứt và khởi động lại.

Sau khi cập nhật, một số thư viện (hoặc phụ thuộc nói chung) sẽ bị mồ côi. Đó là những thư viện được yêu cầu bởi các phiên bản chương trình cũ, nhưng không còn được yêu cầu bởi các phiên bản mới. Vì các gói này được đánh dấu là tự động cài đặt và vì không có chương trình cài đặt thủ công nào liên quan đến chúng nữa nên các gói này có thể dễ dàng được định vị và gỡ bỏ. Bạn thậm chí có thể quan sát đây là bước cuối cùng của quá trình cập nhật (trình cập nhật là "loại bỏ các gói lỗi thời" hoặc một cái gì đó tương tự).

Một số gói sẽ được cài đặt, nơi chưa được cài đặt trước đó, đó là những phụ thuộc đơn giản mới, được đánh dấu là tự động cài đặt và có thể được gỡ bỏ, nếu yêu cầu đối với chúng sẽ biến mất trong tương lai.

Cơ chế này thậm chí cho phép trao đổi toàn bộ chương trình người dùng. Ví dụ như chuyển từ Gnome2 sang Unity. Vì cả hai chỉ là phụ thuộc tự động của máy tính để bàn Ubuntu, đây là một trong số ít các gói, trong đó phiên bản mới thực sự được yêu cầu ở vị trí đầu tiên.

Các chương trình thường không phụ thuộc vào một phiên bản cụ thể của kernel OS, vì vậy chúng sẽ hoạt động tốt với kernel đang chạy.

Ngoài tất cả những điều này, tôi nghi ngờ trình cập nhật Ubuntu ném một số bản sửa lỗi và cách khắc phục cụ thể vào hỗn hợp, để tránh các tình huống trong đó lý thuyết này bị phá vỡ.

Như bạn có thể thấy trong quá trình cập nhật, có những điều kiện rất tốt trong đó hệ thống chỉ có thể sử dụng được cho một phần hạn chế. Nếu có lỗi xảy ra trong quá trình cập nhật, rất có thể bạn sẽ bị bỏ lại với một hệ thống bị hỏng. Thường thì ngay cả một thứ không thể dễ dàng sửa chữa, vì chương trình nâng cấp cũng có thể bị ảnh hưởng. Hãy nhớ rằng, các chương trình với các phụ thuộc bị hỏng có thể tiếp tục hoạt động, nhưng không được khởi động lại, miễn là các phụ thuộc bị hỏng, điều này cũng đúng với trình cập nhật.

Bạn có thể sử dụng chương trình dòng lệnh apt-markđể tìm ra gói nào được đánh dấu là cài đặt thủ công và gói nào được cài đặt tự động. Bạn cũng có thể chuyển đổi các dấu bằng cách sử dụng cùng một chương trình. Điều này sẽ ảnh hưởng trực tiếp đến quá trình cập nhật.

Trong một thiết lập phần mềm phức tạp hơn, Trình cập nhật đôi khi sẽ yêu cầu bạn giải quyết một cách phụ thuộc bằng tay. Tức là khi một chương trình được cài đặt thủ công được cập nhật và yêu cầu một phiên bản mới của thư viện trong khi một chương trình khác được cài đặt thủ công phụ thuộc vào phiên bản cũ của cùng một thư viện và không thể hoạt động với phiên bản mới. Sau đó, bạn sẽ phải đưa ra lựa chọn của mình, hoặc từ bỏ một trong những chương trình đó hoặc không được nâng cấp cả hai. Vì sự phụ thuộc thường phức tạp nên điều này có thể trở nên rất lộn xộn rất nhanh (bạn có thể đã nghe về thuật ngữ "địa ngục phụ thuộc").

Bây giờ đến các câu hỏi cụ thể:

  1. Khi cơ sở hạ tầng cấp thấp bị thay đổi (cấp thấp như trong kernel, trình điều khiển, thư viện, v.v ... bất cứ điều gì mà người dùng không trực tiếp tương tác), điều gì xảy ra với các nhị phân không dùng nữa?
    • OK ... tôi đã trình bày cái này
  2. Điều gì xảy ra với một ứng dụng đã hoàn toàn không dùng nữa? Ví dụ: Unity 2D (hoặc bất kỳ phần mềm nào khác bị bỏ / không có người bảo trì có gói không ở trong repo mới).
    • Nếu Ứng dụng đã được cài đặt thủ công, nó sẽ tồn tại trong hệ thống, thường gây ra địa ngục phụ thuộc mà tôi đã mô tả.
  3. ubfox-desktop là một siêu dữ liệu lấy các ứng dụng Ubuntu mặc định làm phụ thuộc. Nếu tôi gỡ bỏ Firefox và cài đặt Chrome, Firefox vẫn sẽ được nâng cấp như một phần của nâng cấp chứ?
    • Miễn là nó là trình duyệt tiêu chuẩn của Phiên bản mới, có. Chromium cũng sẽ được nâng cấp. Tôi không chắc chắn nếu bạn có thể loại bỏ Firefox mà không cần gỡ bỏ máy tính để bàn Ubuntu. Lưu ý rằng ngoài các phụ thuộc nghiêm ngặt, hệ thống gói còn biết đến khái niệm khuyến nghị, nơi phần mềm thường sẽ được cài đặt như phụ thuộc, nhưng có thể được gỡ cài đặt sau mà không ảnh hưởng đến bất kỳ điều gì khác ngoài phụ thuộc riêng của nó.
  4. Hơn nữa, điều gì xảy ra nếu một ứng dụng duy nhất được sử dụng phụ thuộc vào gói-x và không còn làm như vậy trong bản phát hành mới; gói-x sẽ được nâng cấp cùng với các gói còn lại mặc dù đã mồ côi?
    • Không.

Chỉ cần hỏi tôi nếu bạn vẫn còn bất kỳ câu hỏi.


Bạn có thể liên kết đến nhiều tài liệu liên quan đến địa ngục phụ thuộc (nhắc nhở tôi về thuật ngữ địa ngục DLL) không? Tôi sử dụng các cài đặt Ubuntu tối thiểu và tôi muốn tìm hiểu cách nâng cấp sẽ hoạt động với tôi.
Oxwivi

Tôi nghĩ rằng tất cả những gì bạn sẽ tìm thấy trên internet về địa ngục phụ thuộc là khiếu nại. Đọc trang người đàn ông apt của bạn, như man apt-get. Tôi thấy nó thường hữu ích khi sử dụng cú pháp lệnh chỉ định phát hành như apt-get -t intrepid install foo/jaunty bar/oneiricvv ..., chỉ là ví dụ. Trên thực tế, điều này có ý nghĩa hơn với Debian khi bạn đôi khi trộn các bản phát hành, trong Ubuntu, điều này ít thông thường hơn. Các chủ đề thú vị cũng có thể được ghim và cài đặt các gói.
Paul Hänsch

3
Bạn giành được giải thưởng cho phản hồi phi mã dài nhất tôi từng thấy trong mạng Stack Exchange.
Patrick

3

Ở cấp độ hệ thống tệp, không giống như Windows, trên hệ thống Unix, bạn có thể xóa các tệp đang mở. Xóa chỉ xóa tên của tệp chứ không phải nội dung của tệp, vì vậy mọi chương trình vẫn mở tệp vẫn có thể truy cập tệp cho đến khi chúng đóng tệp và chỉ sau đó dữ liệu mới được giải phóng.

Vì vậy, quá trình nâng cấp chỉ cần loại bỏ các tệp cũ, thay thế chúng bằng các tệp mới và đối với một số dịch vụ hệ thống nhất định, hãy khởi động lại chúng để phiên bản mới đang chạy.

Có một hoặc hai thành phần không thể khởi động lại mà không khởi động lại toàn bộ máy tính, vì vậy sau khi nâng cấp chúng, bạn sẽ được nhắc khởi động lại để bạn sẽ sử dụng phiên bản mới.


2

Làm thế nào Linux có thể tự cập nhật trong khi nó vẫn được sử dụng?

Chủ yếu là vì Linux (và với nó, hầu hết các bản phân phối) được thiết kế đơn giản theo cách đó. Có thể nâng cấp gói trên hệ thống đang chạy là mục tiêu cho hầu hết các bản phân phối dựa trên Linux.

Với Linux, không có gì có thể ngăn quá trình quản lý gói ghi vào tệp trên đĩa, ngay cả khi tệp đó hiện đang được mở bởi một ứng dụng hoặc tệp là thư viện mã thực thi hoặc chia sẻ hiện đang chạy . Ở mức độ rất thấp, có các khóa bảo vệ quyền truy cập vào tệp trong một thao tác ghi / đọc, nhưng chúng không bao giờ được thiết kế để giữ trong hơn một phần nghìn giây và bất kỳ ứng dụng nào khác cố gắng ghi vào cùng một tệp sẽ chỉ đơn giản là chờ những mili giây đó.

Bạn có thể thay thế một tệp thực thi trong khi nó đang chạy và nó thực sự sẽ không làm gì với quy trình đang chạy, bởi vì quá trình này không còn cần tệp trên đĩa nữa - tất cả mã của nó đã được tải vào bộ nhớ.

Đó là lý do tại sao trên Linux, mặc dù bạn có thể nâng cấp ứng dụng trong khi chạy, nhưng bản nâng cấp sẽ không thực sự có hiệu lực cho đến khi ứng dụng bạn nâng cấp được khởi động lại. Trong trường hợp nâng cấp một quy trình nền như dịch vụ hệ thống, dịch vụ đó sẽ cần phải được khởi động lại. Trong trường hợp bạn đã nâng cấp kernel, thì điều này có nghĩa là khởi động lại.

Không thay thế các tệp của chương trình trong khi nó đang chạy sẽ phá vỡ một số chương trình?

Một số gói trong bản phân phối Linux sẽ chứa các hướng dẫn cài đặt hướng dẫn người quản lý gói dừng một số dịch vụ hệ thống trong khi gói cập nhật và khởi động lại các dịch vụ đó sau khi cập nhật hoàn tất. Điều này ngăn các tình huống, ví dụ, các tệp cấu hình cho một dịch vụ cụ thể được cập nhật và phiên bản đang chạy của dịch vụ có thể không thể đối phó với phiên bản mới hơn của các tệp cấu hình.

Nói chung, các ứng dụng người dùng thông thường không yêu cầu các tệp cấu hình để chạy, ngoại trừ các tệp mà nó tự tạo và đặt ở các vị trí như thư mục gốc của người dùng. Vì vậy, những điều này sẽ không được người quản lý gói chạm vào khi cập nhật.


Tôi đã biết tất cả các chi tiết này, xin vui lòng đọc các bình luận tôi đặt với tiền thưởng của tôi. Tôi muốn biết chính xác Ubuntu, nghĩa là aptxử lý các gói và phụ thuộc nhất định trong quá trình nâng cấp.
Oxwivi

-2

Điều này tương tự như một tính năng khác. Hy vọng điều này sẽ giúp hiểu được quá trình cơ bản.

Tôi đang đề cập đến khả năng "chuyển đổi root" khi hệ điều hành khởi động.

Khi hệ điều hành khởi động, hệ thống tập tin gốc (đọc: "/") ban đầu chỉ có sẵn trong RAM. Trong khi quá trình khởi động này đang chạy, nó sẽ chuyển / từ RAM sang / hệ thống tập tin trên đĩa cứng.


1
Không, cơ chế chroot không được sử dụng trong quá trình nâng cấp hệ thống. Việc nâng cấp được thực hiện trên hệ thống tập tin trực tiếp. Bạn thậm chí có thể xem các menu chương trình của mình được xây dựng lại và các biểu tượng chương trình thay đổi khi chúng được thay thế. Nhưng cơ chế chroot được sử dụng trong cài đặt hệ thống ban đầu, khi một hệ thống mới được "gỡ lỗi" vào môi trường gốc thay đổi trên partiton đĩa mới được tạo.
Paul Hänsch
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.