Làm thế nào một hạt nhân xấu đã phá vỡ Ubuntu và tại sao nó có thể xảy ra lần nữa

Bạn không đơn độc nếu bạn đã dành vài ngày đầu tiên của tháng 6 để chiến đấu với sự hoảng loạn của kernel trong Ubuntu 20. 04, và bây giờ chúng ta đã hiểu tại sao

Nhiều hệ thống chạy Docker trên phiên bản hệ điều hành đó đã không sử dụng được vào đầu tháng trước do sự cố với bản vá nhân Linux dành riêng cho Ubuntu và đây có thể không phải là lần cuối cùng

Toàn bộ sự cố là do cập nhật kernel xấu cho Ubuntu 20. 04, bản phát hành hỗ trợ dài hạn (LTS) của Canonical, được phát hành vào hoặc khoảng ngày 8 tháng 6. Ngay sau khi bản vá được cài đặt, các báo cáo lỗi bắt đầu xuất hiện

Ngăn xếp hỗ trợ phần cứng (HWE), bổ sung hỗ trợ cho phần cứng mới hơn bằng cách vận chuyển các nhân được cập nhật và Ubuntu thường xuyên đưa ra các nhân mới thông qua các bản cập nhật HWE này, nhanh chóng được xác định là nguyên nhân gốc rễ của sự cố trong các hệ thống Ubuntu chạy Docker. Do đó, một số người dùng đã báo cáo hình ảnh VM trên AWS, GCP, Azure và Oracle đã bị ảnh hưởng. Mặc dù bật tính năng này thường là quy trình thủ công cho hệ thống máy chủ, nhưng đây là tính năng tiêu chuẩn trên nhiều hình ảnh Ubuntu có sẵn trên đám mây. HWE thường được kích hoạt sẵn để cài đặt máy tính để bàn mới

Một số người dùng thậm chí đã báo cáo bản cập nhật gây ra bootloop và cách khắc phục duy nhất là quay lại khởi động kernel đang hoạt động trước đó. Bản thân lỗi đã gây ra sự hoảng loạn kernel mỗi khi bộ chứa Docker được khởi động. Nhân hệ thống hoảng loạn, Ubuntu khởi động, bộ chứa Docker bắt đầu, v.v. Điều này rất có thể là do bộ chứa Docker của họ đã được định cấu hình để bắt đầu cùng với phần còn lại của hệ thống

Làm cho vấn đề tồi tệ hơn, dịch vụ nâng cấp không giám sát của Ubuntu, chịu trách nhiệm giữ cho các hệ thống được vá và thường không gặp sự cố, khiến việc tránh cập nhật kernel cụ thể này trở nên khó khăn hơn

Bản vá nhân nhằm giải quyết sự cố với hệ thống tệp môi trường vùng chứa và _________ overlayfsshiftfs, nguyên nhân gây ra sự cố. Một hạt nhân sửa đổi đã được Ubuntu phát hành vài ngày sau đó để giải quyết vấn đề. Do thời gian hỗ trợ tương đối dài, Ubuntu 20. 04 tiếp tục là một lựa chọn phổ biến cho môi trường sản xuất mặc dù tác động của bản vá lỗi này rất khó đánh giá

Trớ trêu thay, một phân tích được xuất bản trong tuần này bởi Jordan Webb và được chia sẻ qua LWN cho thấy rằng 5 năm hỗ trợ khiến các bản phát hành LTS trở nên phổ biến cũng là một phần nguyên nhân.

  • Linux chạy trên máy tính xách tay Tuxedo Pulse G2
  • nhà phát triển Gnome. Gtk 5 có thể ngừng hỗ trợ cho X11
  • Trung Quốc vận động hậu thuẫn cho Kylin Linux trong cuộc xung đột với Windows
  • Máy tính để bàn Ubuntu Unity đã trở lại sau một thời gian dài vắng bóng

Điều quan trọng cần lưu ý là các nhân Linux của Ubuntu cho đến phiên bản 21. 04 bao gồm một hệ thống tệp liên quan đến vùng chứa khác có tên là aufs; Bản vá lỗi liên quan đến shiftfs đã được nhập vào Ubuntu 20. 04 bởi các nhà phát triển của dự án, nhưng một phần của mã vá đã bị loại bỏ vì nó phụ thuộc vào aufs, không có sẵn tại thời điểm nhập ngược. Tuy nhiên, aufs đã có mặt trong 5. Ubuntu 20 sử dụng 13 nhân. 04 CTNH

Bất cứ khi nào một bộ chứa Docker xuất hiện, do điều này và các thay đổi đối với hoạt động bên trong của _111, một tham chiếu đến bộ nhớ đã trống () trong cấu trúc dữ liệu nhân sẽ được giải phóng, dẫn đến hoảng loạn. Webb tuyên bố rằng xung đột này đã được phát hiện nhanh chóng và khắc phục trong thế kỷ 5. 15 nguồn kernel cho Ubuntu. Tuy nhiên, không rõ vì lý do gì, 5. 13 hạt nhân trong Ubuntu 20HWE 04 đã bị bỏ lỡ và sẽ tiếp tục gặp sự cố

Như Webb đã nói

Khi các bản vá liên quan đến shiftfs từ 5. 8 nhánh hạt nhân đã được chuyển sang 5. Bản vá đã khắc phục sự cố map_files và shiftfs bị loại khỏi 5. 13 và 5. 15 vì nó phụ thuộc vào AUFS, vốn đã bị xóa khỏi nhân của Ubuntu. Bản vá bị thiếu đã được phát hiện và thêm vào 5 nhân của Ubuntu khi các nhân đó được nhập vào Ubuntu 20. 04, nơi AUFS vẫn được hỗ trợ. 13 và 5, cũng như 15 cây

Hàm được thêm bởi bản vá cố gắng giải phóng tham chiếu đến tệp cấu trúc bằng cách sử dụng fput(), nhưng cấu trúc này đã được giải phóng do lệnh gọi fput() trước đó. Đáng buồn thay, phần bên trong của lớp phủ đã thay đổi theo thời gian theo cách cuối cùng khiến bản vá không chính xác. Kernel hoảng loạn vì điều đó

Ubuntu phiên bản 21. 10, trong đó 5Vì kernel mặc định là phiên bản 13 nên điều này không gây ra bất kỳ sự cố nào vì khối #ifdef xung quanh mã của bản vá ngăn không cho AUFS được kích hoạt để biên dịch vào kernel. Vấn đề phát sinh khi 5. 13 và 5. 15 đã được xây dựng lại cho Ubuntu 20. Hệ thống tệp phụ trợ (AUFS) đã được bật trong các bản dựng này và mã chứa hàm fput() không liên quan đã được biên dịch vì nhân HWE phải hỗ trợ tất cả các tính năng mà nhân mà nó đang thay thế hỗ trợ

Bất kỳ ai vừa quay lại để tìm thấy các triển khai máy chủ của họ hoặc khởi động máy ảo nên quay lại kernel trước đó và cập nhật hệ thống của họ vì sự cố cụ thể này đã được khắc phục

Với độ dài của các bản phát hành LTS của Canonical, thật không may, các gremlin như thế này có thể khó tránh khỏi, điều này dẫn đến việc các nhà phát triển phải xử lý đồng thời nhiều nhánh của kernel

Theo Webb, việc duy trì một bản vá kernel out-of-tree trong bất kỳ khoảng thời gian nào là một nhiệm vụ tốn nhiều công sức, ông cũng lưu ý rằng mọi thứ sẽ không sớm trở nên tốt hơn đối với các nhà phát triển kernel Ubuntu và thậm chí có thể trở nên tồi tệ hơn.

Nếu bạn đã dành những ngày đầu tháng 6 để chiến đấu với sự hoảng loạn kernel trong Ubuntu 20. 04, bạn không đơn độc – và bây giờ chúng tôi biết tại sao

Một vấn đề với bản vá nhân Linux dành riêng cho Ubuntu vào đầu tháng trước đã khiến nhiều hệ thống chạy Docker trên hương vị đó của hệ điều hành không sử dụng được và có lẽ đây sẽ không phải là lần cuối cùng

Toàn bộ sự cố có thể bắt nguồn từ một bản cập nhật kernel dành riêng cho bản phân phối xấu cho Ubuntu 20. 04 — Bản phát hành hỗ trợ dài hạn (LTS) của Canonical — bắt đầu được tung ra vào khoảng ngày 8 tháng 6. Trong vòng vài giờ sau khi bản vá tấn công hệ thống, các báo cáo lỗi đã bắt đầu được gửi đến

Nguồn gốc của sự cố đã nhanh chóng được cách ly với các hệ thống Ubuntu chạy Docker với ngăn xếp hỗ trợ phần cứng (HWE) được bật. Như tên cho thấy, HWE bổ sung hỗ trợ cho phần cứng mới hơn bằng cách vận chuyển các hạt nhân được cập nhật - và Ubuntu thường xuyên đưa ra các hạt nhân mới thông qua các bản cập nhật HWE này. Mặc dù bật tính năng này thường là một quy trình thủ công cho các hệ thống máy chủ, nhưng đây là một tính năng tiêu chuẩn trên nhiều hình ảnh Ubuntu có sẵn trên đám mây. Cuối cùng, một số người dùng đã báo cáo hình ảnh VM trên AWS, GCP, Azure và Oracle đã bị ảnh hưởng. HWE cũng thường được bật theo mặc định cho các cài đặt máy tính để bàn mới

Bản thân lỗi đã gây ra sự hoảng loạn kernel bất cứ khi nào bộ chứa Docker được khởi động. Một số người dùng thậm chí đã báo cáo bản cập nhật dẫn đến bootloop và cách khắc phục duy nhất là quay trở lại kernel đang hoạt động trước đó trong khi khởi động. Điều này có lẽ là do bộ chứa Docker của chúng được thiết lập để bắt đầu với phần còn lại của hệ thống, gây ra một vòng luẩn quẩn trong đó Ubuntu khởi động, bộ chứa Docker khởi động, nhân hệ thống hoảng loạn… rửa đi, lặp lại

Tệ hơn nữa, dịch vụ nâng cấp không giám sát của Ubuntu, chịu trách nhiệm giữ cho các hệ thống được vá lỗi và thường không gặp sự cố, khiến cho bản cập nhật nhân cụ thể này trở nên khó tránh hơn

Sự cố bắt nguồn từ sự cố với /proc/self/map_files và hệ thống tệp môi trường vùng chứa overlayfsshiftfs mà bản vá nhân dự định khắc phục. Một nhân sửa đổi đã được Ubuntu phát hành vài ngày sau đó để giải quyết vấn đề. Tác động của bản vá lỗi này rất khó đánh giá, nhưng Ubuntu 20. 04 vẫn là một lựa chọn phổ biến cho môi trường sản xuất nhờ tuổi thọ hỗ trợ tương đối dài

Trớ trêu thay, 5 năm hỗ trợ khiến các bản phát hành LTS trở nên phổ biến cũng là một phần nguyên nhân, theo một phân tích trong tuần này của Jordan Webb, được chia sẻ qua LWN

  • Tuxedo Pulse G2. Linux trong lòng bạn
  • Gtk 5 có thể bỏ hỗ trợ X11, nhà phát triển Gnome cho biết
  • Trung Quốc tập hợp hỗ trợ cho Kylin Linux trong cuộc chiến trên Windows
  • Máy tính để bàn Ubuntu Unity trở lại từ cõi chết sau vài năm gián đoạn

Một điểm quan trọng trong câu chuyện này là Ubuntu có tới 21. 04 bao gồm một hệ thống tệp liên quan đến bộ chứa khác aufs trong nhân Linux của nó; . Khi các nhà phát triển của Ubuntu đưa bản vá lỗi liên quan đến shiftfs vào Ubuntu 20. 04, một phần của mã vá lỗi đã bị loại bỏ vì nó phụ thuộc vào aufs không xuất hiện trong quá trình nhập ngược – nhưng trên thực tế, aufs đã có trong 5. 13 được sử dụng bởi Ubuntu 20. 04 CTNH

Do đó, và những thay đổi đối với cách thức hoạt động của overlayfs bên trong, một tham chiếu đến bộ nhớ đã trống() trong cấu trúc dữ liệu hạt nhân sẽ được giải phóng, gây ra sự hoảng loạn. Điều này sẽ xảy ra bất cứ khi nào một Docker container xuất hiện. Theo Webb, cuộc xung đột này đã được phát hiện gần như ngay lập tức và được sửa trong Ubuntu 5. 15 nguồn hạt nhân. Nhưng vì những lý do không rõ ràng, 5. 13 hạt nhân trong Ubuntu 20. 04 HWE đã bị bỏ qua và sẽ tiếp tục sụp đổ.  

Như Webb đã nói

Khi các nhà phát triển của Ubuntu chuyển các bản vá liên quan đến shiftfs từ 5. 8 nhánh hạt nhân đến 5 của họ. 13 và 5. 15, bản vá khắc phục sự cố với map_files và shiftfs đã bị loại bỏ, vì nó phụ thuộc vào AUFS, vốn đã bị loại bỏ khỏi nhân của Ubuntu. Khi những hạt nhân đó được nhập vào Ubuntu 20. 04, trong đó AUFS tiếp tục được hỗ trợ, bản vá còn thiếu đã được chú ý và nó đã được áp dụng cho Ubuntu 5. 13 và 5. 15 cây cũng được

Thật không may, phần bên trong của lớp phủ đã thay đổi theo thời gian theo cách cuối cùng khiến bản vá không chính xác. Do đó, khi một tệp trên overlayfs được ánh xạ vào bộ nhớ, chức năng được thêm bởi bản vá cố gắng giải phóng tham chiếu đến tệp cấu trúc bằng cách sử dụng fput(), nhưng cấu trúc đã được giải phóng do lệnh gọi fput() trước đó. Điều đó khiến kernel hoảng loạn

Trên Ubuntu 21. 10, trong đó 5. 13 là kernel mặc định, điều này không gây ra vấn đề gì. Vì AUFS không được kích hoạt, khối #ifdef xung quanh mã do bản vá đưa vào đã ngăn không cho mã được biên dịch vào nhân. Sự cố xảy ra khi 5. 13 và 5. 15 được xây dựng lại cho Ubuntu 20. 04. Vì nhân HWE cần hỗ trợ tất cả các tính năng được hỗ trợ bởi nhân mà nó đang thay thế, nên AUFS đã được bật trong các bản dựng này và mã chứa hàm fput() không liên quan đã được biên dịch trong

Vấn đề cụ thể này đã được giải quyết và bất kỳ ai hiện chỉ quay lại để tìm thấy vòng lặp khởi động triển khai máy ảo hoặc máy chủ của họ nên quay lại nhân cũ hơn và cập nhật hệ thống của họ

Thật không may, các gremlin như thế này khó có thể tránh được do tuổi thọ của các bản phát hành LTS của Canonical, điều này đã dẫn đến việc các nhà phát triển phải tung hứng nhiều nhánh của nhân cùng một lúc

"Duy trì một bản vá kernel out-of-tree trong bất kỳ khoảng thời gian nào là một nhiệm vụ khó khăn," Webb viết, đồng thời nói thêm rằng tình hình khó có thể dễ dàng hơn đối với các nhà phát triển kernel Ubuntu và thực sự có thể trở nên khó khăn hơn trong thời gian dài. ®

Tại sao xảy ra hoảng loạn hạt nhân?

Nguyên nhân rất có thể là phần mềm bị lỗi . Lỗi hạt nhân cũng có thể do phần cứng bị hỏng hoặc không tương thích, bao gồm cả các thiết bị bên ngoài được gắn vào máy Mac của bạn. Nếu sự hoảng loạn hạt nhân là do sự cố đã biết, thì phần mềm bị lỗi sẽ được xác định.

Làm thế nào các vấn đề hoảng loạn hạt nhân có thể được giải quyết?

Dưới đây là một số cách khắc phục sự cố và giải quyết vấn đề. .
Cập nhật phần mềm và trình điều khiển. Các phiên bản phần mềm lỗi thời hoặc bị hỏng có thể gây ra sự cố cho hệ thống Mac, bao gồm cả sự cố kernel. .
Kiểm tra báo cáo sự cố. .
Xóa phần mở rộng kernel của bên thứ ba. .
Giải phóng không gian đĩa. .
thay ram

Bạn có thể phục hồi sau cơn hoảng loạn hạt nhân không?

Khoảng loạn hạt nhân (đôi khi được viết tắt là KP) là một biện pháp an toàn được thực hiện bởi nhân hệ điều hành khi phát hiện một lỗi nghiêm trọng bên trong trong đó hoặc là nó không thể khôi phục một cách an toàn or continuing to run the system would have a higher risk of major data loss.

Làm thế nào chúng ta có thể làm giảm kernel?

Hạ cấp với Ubuntu Mainline Kernel Installer .
Bước 1. Xem qua danh sách các hạt nhân có sẵn trong UMKI. .
Bước 2. Chọn kernel bạn muốn hạ cấp xuống và chọn nó bằng chuột. .
Bước 3. Khi bạn cài đặt xong kernel, hãy khởi động lại