Điểm:20

Tại sao bản cập nhật kernel ngày nay cần nửa gigabyte dung lượng ổ đĩa?

lá cờ ru

Tôi nhận được thông báo về các bản cập nhật cho Ubuntu 20.04. Tôi luôn kiểm tra danh sách các bản cập nhật để quyết định mức độ nghiêm trọng của việc sao lưu mà tôi cần thực hiện trước khi cập nhật. Bản cập nhật nhân hôm nay (5.13.0.28.31~20.04.15) cần thêm nửa gigabyte dung lượng ổ đĩa:

nâng cấp apt $ sudo 
...
Các gói MỚI sau đây sẽ được cài đặt:
  linux-headers-5.13.0-28-generic linux-hwe-5.13-headers-5.13.0-28
  linux-image-5.13.0-28-generic linux-modules-5.13.0-28-generic
  linux-mô-đun-thêm-5.13.0-28-chung
Các gói sau sẽ được nâng cấp:
  linux-generic-hwe-20.04 linux-headers-generic-hwe-20.04
  linux-image-generic-hwe-20.04 linux-libc-dev
4 để nâng cấp, 5 để cài đặt mới, 0 để đổi mới và 0 để không nâng cấp
Cần lấy 95,0 MB dung lượng lưu trữ.
Sau thao tác này, 508 MB dung lượng đĩa bổ sung sẽ được sử dụng.

Tôi biết rằng Ubuntu cho phép một số nhân cùng tồn tại, vì vậy nhân này phải sử dụng dung lượng đĩa mới thay vì thay thế phần mềm hiện có, nhưng nó vẫn có vẻ lớn. Tôi đã không ghi chú, nhưng tôi nghĩ rằng một bản cập nhật kernel thường là vài trăm MB.Trước đây tôi chưa bao giờ nhận thấy kích thước của các hạt nhân hay có điều gì đó bất thường trong bản cập nhật hôm nay?

Điểm:43
lá cờ pw
Oli

Có một vài điều khác nhau đang diễn ra ở đây, tùy thuộc vào sự tò mò của bạn nằm ở đâu ...

Các bản cập nhật hạt nhân được phân phối dưới dạng các gói độc lập, không phải nâng cấp đơn giản

Hầu hết hệ thống của bạn được đóng gói theo cách sao cho khi trích xuất bản nâng cấp, nó sẽ thay thế phiên bản trước. Các hạt nhân được đóng gói với phiên bản của chúng trong tên gói. Điều này mang lại cho bạn khả năng quay trở lại phiên bản trước nếu có sự cố xảy ra.

Bạn không cần phải giữ các hạt nhân cũ xung quanh. Ngay khi bạn biết cái mới hoạt động, bạn có thể loại bỏ cái cũ. sudo apt autoremove sẽ làm điều này cho bạn, nhưng hãy đảm bảo phiên bản mới hoạt động trước.

nhân lớn (và đang ngày càng lớn hơn)

Vì vậy, chúng tôi đã xác định lý do tại sao việc cài đặt kernel cập nhật lại chiếm thêm dung lượng, nhưng tại sao rất nhiều khoảng trống?

Ubuntu vận chuyển một hạt nhân được xây dựng cho nhiều lựa chọn phần cứng. Canonical muốn nó Chỉ hoạt động™ khi bạn cắm mọi thứ vào. Mọi phiên bản phụ đều có thêm nhiều trình điều khiển hơn. Tốc độ xóa các trình điều khiển cũ thường chậm hơn nhiều.

Vì vậy, theo thời gian, chúng tôi mong đợi nhân sẽ nở ra về kích thước. Bionic's 4.15.0-101.102 có kích thước khoảng 60% so với HWE 5.13.0 của Focal. Điều này chủ yếu được thể hiện thông qua việc có ít mô-đun hơn, đặc biệt là trong mô-đun-thêm.

Tôi thích coi đây là sự tiến bộ. Dung lượng ổ đĩa và băng thông là rẻ đối với hầu hết chúng ta, vì vậy việc ưu tiên hỗ trợ trình điều khiển là điều hợp lý. Tôi không nghĩ những gì chúng ta đang thấy ở đây là bất thường.

Nhưng tại sao các gói của họ quá nhỏ? Làm cách nào để tải xuống 94 MB chiếm 508 MB dung lượng ổ đĩa?

Họ nén [thực sự] tốt. Bạn có thể thấy điều này bằng cách tải xuống các gói và sử dụng một đoạn script nhỏ để hiển thị kích thước đã giải nén của chúng.

  • Nhận các gói: tải xuống apt linux-generic-hwe-20.04 linux-headers-generic-hwe-20.04 linux-image-generic-hwe-20.04 linux-headers-5.13.0-28-generic linux-hwe-5.13-headers-5.13.0- 28 linux-image-5.13.0-28-generic linux-modules-5.13.0-28-generic linux-modules-extra-5.13.0-28-generic
  • So sánh kích thước "vật lý" của chúng với kích thước nội dung của chúng: cho f trong *.deb; làm stat --printf="%5n\t%s\t" "$f"; dpkg -c $f; xong

Đó là khá thô vào thời điểm đó. Bạn có thể đưa nó vào Calc để hiển thị tổng số và tỷ lệ phần trăm:

nhập mô tả hình ảnh ở đây

Hơi hơn 508 MB dung lượng đĩa kết hợp (trước DKMS cũng vậy) nhưng có lẽ bạn đã tải xuống một số gói. Dù bằng cách nào, bạn có thể thấy rằng một số gói lớn hơn rất nhiều.

Tôi muốn Hạt nhân nhỏ hơn!

Và bạn có thể có chúng. Chỉ cần nhìn xuống nội dung gói mô-đun bổ sung, tôi có thể thấy hàng trăm MB những thứ tôi không cần. Than ôi, có một số tôi cần mặc dù.

Bạn có thể (khá dễ dàng) xây dựng Hạt nhân của riêng bạn. Có các tập lệnh xây dựng (Tôi hiện đang sử dụng linux-tkg). Hiện tại, nó có dung lượng 450 MB trên đĩa nhưng tôi có thể chạy nó thông qua một người trợ giúp như tạo localmodconfig để cắt các mô-đun đã xây dựng của nó xuống chỉ còn những thứ hiện được tải. Điều này sẽ loại bỏ khoảng 95% các mô-đun.

Vấn đề với phương pháp này là tốn thời gian của CPU và thời gian của tôi để cập nhật nó khi có bản cập nhật. Bạn đang ở trên của riêng bạn. Hầu hết mọi người đều tốt hơn với kernel được duy trì.

lá cờ in
Một vấn đề khác với cách tiếp cận xây dựng của riêng bạn là bạn vẫn phải kích hoạt các trình điều khiển mà bạn _có thể_ cần (ví dụ: tôi xây dựng các hạt nhân của riêng mình, nhưng vẫn kích hoạt hầu hết các trình điều khiển phần cứng USB, vì tôi có thể mong đợi một cách hợp lý rằng tôi có thể cần bất kỳ trong số chúng trong thời gian ngắn), hoặc bạn phải xây dựng lại mỗi khi có gì đó về phần cứng của bạn thay đổi (và `localmodconfig`, tôi đã kiểm tra lần cuối, cần một nhân đầy đủ để hoạt động).
lá cờ pw
Oli
@AustinHemmelgarn Tôi đồng ý, bạn chắc chắn cần lên kế hoạch trước với `localmodconfig`. Thêm lại mọi thứ có thể tốn nhiều công sức. Chạy một công cụ như [modprobed-db](https://github.com/graysky2/modprobed-db) thường xuyên trước thời hạn có thể hữu ích để theo dõi các mô-đun bạn thực sự sử dụng trong một khoảng thời gian. Nhưng đúng vậy, ngay cả khi loại bỏ các bộ điều hợp mạng mà bạn không sử dụng cũng tiết kiệm được 50 MB. Rửa sạch và lặp lại trên bộ điều khiển lưu trữ, bộ điều hợp đồ họa và bạn có thể nhanh chóng lên tới 150 MB mà không phải đổ mồ hôi.
lá cờ in
@Oli Đồng ý, thậm chí chỉ cần loại bỏ những thứ mà bạn biết rằng bạn không cần thực sự có thể là một khoản tiết kiệm rất lớn, đó là một phần lý do tại sao tôi xây dựng hạt nhân của riêng mình (phần khác là tôi muốn một số thứ nhất định mà hầu hết các bản phân phối không được bật theo mặc định).
lá cờ in
@Oli sẽ rất gọn gàng nếu một bản phân phối bao bọc modprobed-db và các bản cập nhật kernel từ nguồn theo cách mà các mô-đun không cần thiết tiếp tục bị loại bỏ ở hậu trường mà không cần sự tương tác thủ công của người dùng.
lá cờ et
Bạn có thể tạo tệp `dpkg.cfg.d` với các mục nhập `path-exclude`/`path-include` để tránh giải nén các mô-đun mà bạn không cần — được thực hiện cẩn thận, điều này giúp giảm dung lượng ổ đĩa cần thiết cho các mô-đun hạt nhân trong khi tránh phải xây dựng chúng từ nguồn.
Điểm:22
lá cờ my

Tại sao bản cập nhật kernel ngày nay cần nửa gigabyte dung lượng ổ đĩa?

Nó không chính xác như những gì nó trông giống như.Nó cho bạn thấy rằng 508 MB của đĩa sẽ được sử dụng, nhưng nó có cho bạn biết rằng dung lượng lưu trữ này là vĩnh viễn không? Điều gì sẽ xảy ra nếu tôi nói với bạn rằng gần 450 MB trong số chúng sẽ được giải phóng sau khi chạy một lệnh đơn giản?

Nói chung, khi thực hiện nâng cấp lớn, các tệp và thư mục mới phải được đặt. Tuy nhiên, nó sẽ không tự động xóa những cái cũ hơn. Dẫn đến việc sử dụng đĩa mở rộng!

Sau khi nâng cấp kernel, bạn có thể xóa các mô-đun kernel cũ không được hỗ trợ đó bằng cách chạy:

sudo apt autoremove

Nó sẽ loại bỏ tất cả các hạt nhân trước đó và các mô-đun của chúng, giúp giải phóng gần 450 MB dung lượng đĩa.


hỏi đáp

Tại sao bản cập nhật kernel ngày nay cần nửa gigabyte dung lượng ổ đĩa?

Đó là bởi vì nó phải đặt các tập tin mới. Nó sẽ không xóa các tệp cũ hơn, dẫn đến việc sử dụng đĩa kéo dài.

Tôi không ghi chú, nhưng tôi nghĩ một bản cập nhật kernel thường khoảng vài trăm MB

Vâng, trên thực tế, bản nâng cấp này chỉ có dung lượng 60-80MB.

có điều gì bất thường về bản cập nhật hôm nay không?

Vâng, đây là một nâng cấp hạt nhân lớn. Có thể bạn chưa biết rằng Ubuntu 20.04 sẽ sớm được nâng cấp lên giai đoạn thứ 4. Vì vậy, bạn sẽ nhận được nhiều nâng cấp như thế này. Hãy sẵn sàng cho Ubuntu 20.04.04!!


Tại sao hạt lại to như vậy?

Nhân Linux quản lý và kiểm soát các tài nguyên phần cứng như I/O (mạng, lưu trữ, đồ họa và các thiết bị giao diện người dùng khác nhau, v.v.), bộ nhớ và CPU cho thiết bị hoặc máy tính của bạn. Mỗi khi có bản nâng cấp mới, bạn sẽ nhận được trình điều khiển và tài nguyên mới hơn để có tài nguyên phần cứng tốt hơn.

Nếu bạn đang sử dụng thẻ không dây có trình điều khiển được tạo tùy chỉnh, thì bạn phải biên dịch lại trình điều khiển sau khi nhân mới hơn khởi động. Tuy nhiên, còn các mô-đun khác thì sao? Các mô-đun bạn không cần vẫn còn trong hệ thống của bạn. Tại sao có iwlwifi khi tôi sử dụng rtw99? Nhân Linux đi kèm với hàng nghìn trình điều khiển khác nhau cho mọi loại thiết bị. Theo mặc định, đúng cách sẽ cài đặt TẤT CẢ chúng. Đây là một trong những lý do chính tại sao bạn nên tự biên dịch nhân Linux.Để tự biên dịch nhân Linux mà không cần những thứ không cần thiết, hãy tham khảo chủ đề này, bình luận #2.


Sự khác biệt giữa Kích thước tải xuống và Kích thước đã cài đặt.

Tại sao nó hiển thị:

Cần lấy 95,0 MB dung lượng lưu trữ.

Mặc dù thông báo "508 MB dung lượng đĩa bổ sung sẽ được sử dụng"?

Đó là vì Nén.

Các .deb còn được gọi là định dạng "lưu trữ" sử dụng thuật toán nén không mất dữ liệu để phù hợp với một số lượng lớn tệp trong một .deb mà không làm tăng kích thước của nó. Bạn có thể chạy lệnh sau để thấy sự khác biệt giữa kích thước đã cài đặt và kích thước tải xuống.

apt show linux-generic-hwe-20.04 linux-headers-generic-hwe-20.04 linux-image-generic-hwe-20.04 linux-headers-5.13.0-28-generic linux-hwe-5.13-headers-5.13.0- 28 linux-image-5.13.0-28-generic linux-modules-5.13.0-28-generic linux-modules-extra-5.13.0-28-generic | egrep "Size|Package" | grep -v APT

Đây là một bảng cho thấy sự khác biệt:

Bưu kiện Kích thước cài đặt Kích thước tải xuống
Gói: linux-generic-hwe-20.04 Kích thước cài đặt: 19,5 kB Kích thước tải xuống: 1.928 B
Gói: linux-headers-generic-hwe-20.04 Kích thước cài đặt: 19,5 kB Kích thước tải xuống: 2.516 B
Gói: linux-image-generic-hwe-20.04 Kích thước cài đặt: 19,5 kB Kích thước tải xuống: 2.628 B
Gói: linux-headers-5.13.0-28-generic Kích thước cài đặt: 24,5 MB Kích thước tải xuống: 2.569 kB
Gói: linux-hwe-5.13-headers-5.13.0-28 Kích thước cài đặt: 75,9 MB Kích thước tải xuống: 11,8 MB
Gói: linux-image-5.13.0-28-generic Kích thước cài đặt: 10,2 MB Kích thước tải xuống: 10.0 MB
Gói: linux-modules-5.13.0-28-generic Kích thước cài đặt: 99,3 MB Kích thước tải xuống: 18,3 MB
Gói: linux-mô-đun-thêm-5.13.0-28-chung Kích thước cài đặt: 298 MB Kích thước tải xuống: 51,1 MB
raj avatar
lá cờ cn
raj
Kinh nghiệm của tôi là trình cập nhật phần mềm trong Ubuntu thường yêu cầu xóa các nhân cũ ngay sau khi cài đặt bản cập nhật nhân mới. Tôi thường không phải xóa bất cứ thứ gì theo cách thủ công.
raj avatar
lá cờ cn
raj
Thật khó để sử dụng máy tính để bàn mà không có GUI (bạn sẽ duyệt Web như thế nào?) :) và vì trình cập nhật phần mềm vẫn xử lý các bản cập nhật nên tôi không thấy có gì bất thường khi nó yêu cầu tôi cài đặt các bản cập nhật mới và để loại bỏ các hạt nhân cũ không sử dụng.Nó không xảy ra sau một "thời gian dài", nhưng thường trong vòng vài giờ sau khi cài đặt phiên bản kernel mới, đôi khi ngay sau khi cài đặt kernel mới. Tôi thấy đây là một cách hoạt động thích hợp. BTW. Tôi chắc chắn thích Synaptic hơn là chạy `apt` theo cách thủ công :)
Điểm:0
lá cờ in

Tất cả những điều trên là hoàn toàn đúng.

Tuy nhiên, một phần của câu trả lời, (và tại sao các câu trả lời trên hoạt động), dựa trên cách Linux xử lý tệp "đã xóa" - nó không Thực ra bị xóa cho đến khi mọi thứ sử dụng nó kết thúc.

Ví dụ:
Giả sử một ứng dụng, "Super Duper Text Editor", và cũng giả sử rằng bạn có một số cửa sổ đang mở với văn bản bạn đang chỉnh sửa.

Ngoài ra, giả sử một bản cập nhật cho Super Duper Text Editor đã được cài đặt. Các phiên chỉnh sửa hiện tại của bạn không bị ghi đè ngay lập tức, chúng sẽ biến mất sau khi bạn đóng chúng.

Như thế này:

  1. Bạn có một số phiên bản của trình soạn thảo văn bản đang mở.
  2. Bạn cập nhật nó.
    • Trình cập nhật "hủy liên kết" mục nhập thư mục với tệp cũ, (hoặc tạo lại nó) và thêm liên kết vào tệp mới, với mục nhập thư mục gốc được đánh dấu là "đã xóa"
    • Các liên kết hiện có đến các phiên của bạn vẫn còn cho đến khi các phiên hiện có bị đóng.
  3. Tất cả các tệp mới được thêm vào nhưng các tệp hiện có vẫn đang được sử dụng sẽ không bị hủy vì chúng vẫn đang được sử dụng.
  4. Cuối cùng, khi bạn lưu công việc và đóng cửa sổ, số lượng liên kết hoạt động tới các tệp cũ giảm xuống bằng không. (hãy nhớ rằng liên kết của thư mục đã bị xóa khi gói được cập nhật.)

Khi số lượng liên kết đến một tệp giảm xuống 0, tệp được coi là "đã xóa" và không gian đó được phục hồi để hệ thống tệp sử dụng lại và được đánh dấu là có sẵn trong siêu khối và/hoặc bitmap ổ đĩa.

Cuối cùng, (hoặc đặc biệt là sau khi khởi động lại), tất cả các tệp cũ không có liên kết nào và trò chơi công bằng sẽ bị ghi đè.

Tôi chắc chắn rằng có những chi tiết tôi đã bỏ sót, nhưng đó là cách hoạt động chung của nó.

lá cờ pw
Oli
Tôi không thấy điều này liên quan đến các bản cập nhật Kernel như thế nào. Nó có thể áp dụng cho những thứ khác nhưng Hạt nhân được đóng gói với chuỗi phiên bản của chúng trong tên gói; chỉ có một siêu gói trỏ đến một phiên bản mới. Khi bạn thực hiện cập nhật Kernel, nó không chỉ nằm trong bộ nhớ mà còn là một bản sao hoàn toàn mới của kernel được cài đặt cùng với những cái cũ.
Jim JR Harris avatar
lá cờ in
" nó là một bản sao hoàn toàn mới của hạt nhân đang được cài đặt song song với những cái cũ" . . . và do cách Linux xử lý việc xóa tệp, dung lượng ổ đĩa sẽ tăng gấp đôi cho đến lần khởi động lại tiếp theo. Làm thế nào là điều này không liên quan ??
muru avatar
lá cờ us
@JimJRHarris "dung lượng ổ đĩa sẽ tăng gấp đôi cho đến lần khởi động lại tiếp theo" ... tuy nhiên, điều đó không áp dụng cho cách cập nhật nhân, vì mỗi hình ảnh nhân là một tệp có tên khác nhau. Vì vậy, cho đến khi gói của kernel cũ hơn bị xóa, tệp đó sẽ vẫn tồn tại. Cho dù bạn khởi động lại hay không không liên quan.
Jim JR Harris avatar
lá cờ in
Điểm tốt. Cảm ơn bạn đã làm rõ.
marcelm avatar
lá cờ cn
_"do cách Linux xử lý việc xóa tệp, dung lượng ổ đĩa sẽ tăng gấp đôi cho đến lần khởi động lại tiếp theo." _ - Không, dung lượng ổ đĩa được giải phóng khi nhân cũ bị xóa, không cần khởi động lại. Nó không liên quan gì đến ngữ nghĩa hủy liên kết của Linux, bởi vì cả hình ảnh hạt nhân đang chạy cũng như các mô-đun hạt nhân được tải đều không giữ cho các tệp bận rộn như vậy. Bạn có thể tự xác minh điều này bằng cách sử dụng `lsof`, `df` và `rm`; hình ảnh/mô-đun hạt nhân đã xóa ngay lập tức giải phóng dung lượng đĩa. Rất tiếc, câu trả lời của bạn không áp dụng cho trường hợp này.
raj avatar
lá cờ cn
raj
@marcelm Nó luôn hoạt động với tôi nên ngay sau khi cài đặt bản cập nhật kernel mới, trình cập nhật phần mềm yêu cầu xóa kernel cũ không cần thiết nữa. Vì vậy, tôi hầu như không bao giờ phải loại bỏ các hạt nhân cũ bằng tay.
marcelm avatar
lá cờ cn
@raj Tôi chưa bao giờ yêu cầu xóa thủ công là cần thiết. Tôi chỉ đơn thuần chỉ ra rằng "các tệp đã xóa vẫn đang bận không giải phóng dung lượng ổ đĩa" không được áp dụng ở đây.
Matthew avatar
lá cờ ru
Cảm ơn bạn cho câu trả lời này. Đó là thông tin, nhưng nó dường như không trả lời câu hỏi chính xác này.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.