chuyển đổi giữa các phiên bản kernel khác nhau mà không cần khởi động lại


11

Tôi muốn chuyển đổi giữa các phiên bản kernel khác nhau được cài đặt trên hệ thống của mình mà không cần khởi động lại.

Điều đó có nghĩa là nếu tôi có ' 3.0.0-16-generickernel hiện đang chạy và tôi cũng có kernel cũ hơn 3.0.0-14-genericthì tôi có thể chuyển sang 3.0.0-14-generic(kernel khác) mà không cần khởi động lại.

(Tôi cần thực hiện gỡ lỗi kernel trực tiếp và thực hiện các thay đổi để làm như vậy tôi không thể khởi động lại)

Câu trả lời:


8

Không có cách nào để trao đổi hai Kernels hoàn chỉnh. Tôi chắc rằng bạn có thể hiểu tầm quan trọng của hạt nhân nguyên khối như Linux và tại sao điều đó khiến nó không thể thay thế một cách đơn giản.

Gần nhất bạn có thể nhận được là một quá trình vá trực tiếp bằng cách sử dụng Ksplice . Nó chuyển đổi các bản cập nhật Kernel thành các miếng chêm ma thuật có thể cắm các lỗ hổng trong Kernel đang chạy, cho phép bạn giữ máy tính bật vô thời hạn mà không cần phải khởi động lại. Đối với mục đích của bạn, nó cũng cho phép bạn khôi phục các thay đổi.

Nó là miễn phí cho các phiên bản Ubuntu Desktop để bạn có thể chơi xung quanh nó nhưng bạn phải trả tiền thuê bao cho các máy chủ (trong đó loại điều này là cần thiết nhất).


Chỉ cần xem chỉnh sửa của bạn. Ksplice có lẽ sẽ không giúp ích gì nếu bạn tự hack và xây dựng Kernels của riêng mình để gỡ lỗi vì "dịch vụ" là chúng cung cấp các bản cập nhật đặc biệt và chúng không phải là thứ bạn có thể tự tạo.

Nếu bạn chỉ xây dựng mọi thứ dựa trên kernel chính thức, nó vẫn có thể hoạt động.


Thêm một ý tưởng: Ảo hóa. Bạn có thể xây dựng kernel mới của mình và trao đổi mọi thứ xung quanh trong VM và khởi động lại. Sẽ vẫn cần thời gian để khởi động lại nhưng bạn có thể làm cho VM nhẹ hơn nhiều so với máy phát triển của bạn (dựa trên Ubuntu Server, bỏ máy chủ X nếu bạn không cần, v.v.).


1
nhưng tôi muốn chuyển đổi giữa hai hạt nhân khác nhau trong thư mục / boot của tôi
coder

1
Vâng, bạn sẽ không thể tùy ý chuyển đổi giữa hai hạt nhân. Tôi đã thêm một chỉnh sửa với một ý tưởng khác có thể phù hợp với bạn mặc dù.
Oli

2

Như Oli đã đề cập, bức ảnh đẹp nhất của bạn có lẽ là ảo hóa.

Điều đó nói rằng, nếu bạn đang sửa đổi phần cứng, ảo hóa có thể không cắt nó cho bạn, trong trường hợp đó, bạn có thể sử dụng kexecđể trao đổi kernel đang chạy mà không cần khởi động lại đầy đủ.

Lấy từ trang ArchWikikexec :

kexec -l /boot/new-kernel --initrd=/boot/new-initrd --reuse-cmdline
kexec -e

Lưu ý rằng ở trên vẫn sẽ khởi động lại tất cả các dịch vụ , bao gồm hệ thống init, máy chủ hiển thị, kết nối mạng, v.v. Tuy nhiên, nếu bạn sử dụng hệ thống init đủ nhanh, như systemd, bạn có thể khởi động vào kernel mới của mình sau 2-3 giây, kể từ bạn đang bỏ qua BIOS / UEFI và bộ tải khởi động.


Một mô tả tương tự có thể được tìm thấy trên trang RapidReboot Ubuntu Wiki .


0

Tôi nghĩ rằng những câu trả lời cần phải được cập nhật.

kpatch nay , nhiều mẹ đẻ hơn Ksplice et al.

Tuy nhiên, nó không thể thay đổi cấu trúc dữ liệu trong kernel, vì lý do rõ ràng, vì vậy nó hầu như hữu ích cho các hotpatch bảo mật.

Vấn đề chung luôn là: Các tiến trình đang chạy vẫn giữ cấu trúc dữ liệu kernel xung quanh, hy vọng các hàm kernel sẽ mong đợi chúng và trả lại chúng. Và không có các quy trình được thực hiện cho nó, thực sự không thể biết được, nếu đó là trường hợp. Vì vậy, bạn không thể thay đổi chúng, cho đến khi tất cả các quy trình sử dụng chúng, được khởi động lại. Nó cũng đòi hỏi phải vá trực tiếp tất cả các chương trình đó.
Và tôi thậm chí không đề cập đến thay đổi trình điều khiển, khi phần cứng ở trạng thái đặc biệt. (Vấn đề tương tự như với kexec .)

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.