Nhân Linux là một “nhân hiện đại” có tính module rất cao. Từ kernel phiên bản 2.6.x trở đi, có rất nhiều chức năng và mở rộng. Với tinh thần “biên dịch nhân”, một yếu tố chính yếu và quan trọng nhất cần ghi nhận đó là tính phân bộ (modularity) của nhân Linux. Đối với người dùng bình thường, modularity cho phép chọn lựa cách biên dịch các drivers của nhân theo dạng modules hay theo dạng biên dịch trực tiếp vào nhân. Thông thường, khi xác lập cấu hình cho nhân có ba chọn lựa: Y, M và N. Có những “driver” không thể biên dịch như một module vì nó phải được load and link trực tiếp ngay khi nhân khởi động. Cũng có những “driver” cho phép chọn như một module và được tải trong khi và sau khi nhân được khởi động. Điểm chính yếu cần nắm bắt trong giới hạn chủ đề “Biên dịch nhân Linux” là hiểu rõ tại sao phải chọn M (cho module), Y (cho biên dịch trực tiếp) và N (không dùng) các drivers này.

  • Biên dịch trực tiếp vào kernel có nghĩa là các “drivers” này dù có được dùng hay không vẫn được tải lên khi nhân khởi động và tất nhiên nó sẽ chiếm một phần bộ nhớ. Lợi điểm chính của chọn lựa này là một khi “drivers” đã được biên dịch vào nhân thì không còn phải quan ngại đến tính trung thực của nhân và các driver nữa. Các hệ thống làm việc đòi hỏi tính bảo mật cao không dùng modules mà biên dịch thẳng vào nhân để tránh trường hợp các modules không tin cậy “bị” cài vào nhân lúc nào đó trong quá trình hoạt động của máy. Lợi điểm kế tiếp của chọn lựa này là tính hiệu xuấtxuất (rất nhỏ), khi cần driver thì đã có sẵn và không cần ứng tải nữa.
  • Biên dịch như các modules cho nhân có nghĩa là chỉ khi nào cần dùng các “drivers” này mới được ứng tải. Lợi điểm của chọn lựa này nổi bật ở khía cạnh xử dụng bộ nhớ và tài nguyên trên máy. Với lựa chọn này, bạn có thể tạo nên một nhân rất nhỏ và dễ dàng di chuyển cho nhiều mục đích khác nhau. Lợi điểm kế tiếp là khả năng biên dịch lại chỉ một hoặc một số modules nào đó (cần cập nhật chẳng hạn). Tất nhiên để thực hiện chuyện này thì phải thoả mãn tất cả những đòi hỏi về tính phụ thuộc cho hệ thống.

(Theo Hoàng Ngọc Diêu)

Bài viết này mình sẽ hướng dẫn các bạn tái biên dịch nhân của CentOS 6 x86_x64 theo cách đơn giản nhất.

Các bước biên dịch lại nhân Linux.

Trước tiên ta cần tải bộ nhân mới nhất về từ website https://www.kernel.org/. Phiên bản mới nhất cho các distro họ Redhat hiện tại là 2.6.32.71. Khi biên các bạn update hệ thống của bạn bằng yum hay bằng các gói binary có sẵn thì kết quả từ lệnh `uname -r` sẽ là 2.6.32-573.22.1.el6.x86_64. Giả sử ta để gói mã nguồn nằm trong thư mục /usr/src

Sau khi tải về mã nguồn của nhân, ta cần cài một số gói phụ trợ:

[root@localhost src]# yum install gcc make binutils util-linux module-init-tools ncurses-devel e2fsprogs jfsutils reiserfsprogs rpm-build

Ta xả nén mã nguồn nhân bằng lệnh:

[root@localhost src]# unxz linux-2.6.32.71.tar.xz && tar -xvf linux-2.6.32.71.tar

Chuyển vào thư mục chứa nhân và tiến hành cấu hình

[root@localhost src]# cd linux-2.6.32.71

Dọn dẹp mã nguồn (xóa mọi file đã được biên dịch từ lần trước nếu có)

[root@localhost linux-2.6.32.71]# make clean && make mrproper

Bây giờ ta cần tạo một file config cho nhân mới. Tôi khuyên các bạn nên sử dụng lại file config cũ của nhân hiện tại rồi tiến hành sửa đổi nó thì như thế độ tương thích với distro hiện tại sẽ tốt hơn.

Copy file cấu hình vào thư mục hiện tại.

[root@localhost linux-2.6.32.71]# cp /boot/config-`uname -r` ./.config

Lưu ý rằng file .config này là một file ẩn. Đối với file này bạn có nhiều cách để cấu hình nó. Thứ nhất là edit trực tiếp file này. Thứ hai là sử dụng lệnh `make config` (sẽ tạo ra file .config mới) và nó sẽ hỏi ta hàng loạt câu hỏi và ta chỉ việc chọn Y (biên dịch thẳng vào nhân)/N (không biên dịch)/M (biên dịch dưới dạng module) cho từng lựa chọn tuy nhiên nếu bạn chọn sai câu trả lời, bạn sẽ không thể quay trở lại câu hỏi trước đó để chọn lại (có thể mở file ra và sửa những chỗ sai). Thứ hai là sử dụng lệnh `make menuconfig` để cấu hình dưới dạng đồ họa trên nền shell và sử dụng bàn phím để cấu hình các lựa chọn. Thứ ba là sử dụng lệnh `make xconfig` cũng giống như cách thứ hai nhưng bạn có thể dùng chuột.

Ở đây mình sẽ chọn cách thứ hai.

[root@localhost linux-2.6.32.71]# make menuconfig
Biên dịch nhân - menuconfig
Biên dịch nhân – menuconfig

Để nạp file config có sẵn, bạn đưa con trỏ xuống dưới và chọn `Load an Alternate Configuration File` để load file config hiện tại lên.

Biên dịch nhân - Load config
Biên dịch nhân – Load config
Biên dịch nhân - Load config
Biên dịch nhân – Load config

Tuy nhiên, phiên bản mã nguồn hiện tại khi biên dịch xong sẽ có mã là 2.6.32-573.22.1.el6.x86_64 trùng với phiên bản hiện tại tôi đang sử dụng nên tôi phải đổi tên của bản nhân sẽ được biên dịch để sau khi cài xong nhân ta còn thấy sự khác biệt. Để đổi tên, ta chọn `General setup` -> `Local version – append to kernel release`. Tại đây, ta chèn thêm một chuỗi vào file release của nhân.

Biên dịch nhân - Đổi tên kernel
Biên dịch nhân – Đổi tên kernel

Sau đó, bạn đi vào từng mục sửa những gì cần thiết rồi save file cấu hình lại.

Biên dịch nhân - Lưu cấu hình
Biên dịch nhân – Lưu cấu hình

Tiến hành biên dịch với lệnh:

[root@localhost linux-2.6.32.71]# make

Quá trình này diễn ra khá lâu. Máy ảo của tôi sử dụng chip xung nhịp 3.0Ghz mất khoảng 25 phút để biên dịch. Ở mức xung 2.3Ghz thì mất khoảng 40 phút.

Sau khi biên dịch hoàn tất, ta cài các module:

[root@localhost linux-2.6.32.71]# make modules_install

Cuối cùng là cài đặt nhân:

[root@localhost linux-2.6.32.71]# make install

Sau khi hoàn tất, bạn sẽ thấy kernel của chúng ta xuất hiện trong thư mục /boot và cấu hình khởi động đã được ghi vào /boot/grub/menu.lst

Biên dịch nhân - kết quả
Biên dịch nhân – kết quả
Biên dịch nhân - kết quả
Biên dịch nhân – kết quả

Reboot, bấm Enter trong lúc boot để chọn phiên bản nhân sẽ boot.

Biên dịch nhân - kết quả
Biên dịch nhân – kết quả
Biên dịch nhân - kết quả
Biên dịch nhân – kết quả

Đào Xuân Hưng – AdminVietnam.org