Nhân Linux là cốt lõi của hệ điều hành, hoạt động như một môi trường trung gian giữa phần cứng và tất cả các tiến trình. Nhân cung cấp việc quản lý bộ nhớ, đa tác vụ, đầu ra/đầu vào, kết nối mạng và nhiều chức năng khác. Hiện nay, nhân Linux rất hiện đại vì có tính module rất cao. Rất thuận lợi cho việc cấu hình và biên dịch lại nhân cho phép người dùng có thể gỡ bỏ những phần của hạt nhân mà không cần thiết cho mục đích sử dụng của hệ thống.
Vì Linux là phần mềm mã nguồn mở, do đó việc truy cập vào mã nguồn của nhân là hoàn toàn tự do. Có nghĩa là bất cứ ai cũng hoàn toàn có thể tự do tùy chỉnh và biên dịch lại nhân cho phù hợp với nhu cầu cụ thể của họ.
Tuy nhiên khi nghĩ đến tùy biến và biên dịch lại nhân, thường người ta nghĩ rằng sẽ phải đọc hàng ngàn dòng chương trình C, nhưng hoàn toàn không phải vậy. Những module nhân không cần thiết có thể được gỡ bỏ mà không cần phải sửa lại bất kỳ một dòng chương trình nào.
Công cụ sẵn có để cấu hình và biên dịch tiến trình hiện nay đã dễ dàng hơn, nhưng đây vẫn là một quá trình khá phức tạp. Hạt nhân cũ không được sao lưu đúng cách và các lỗi trong quá trình biên dịch có thể dẫn đến một vài chức năng của hệ
thống hoạt động không đúng hay tệ hơn, khiến hệ thống không thể khởi động lên được. Vì vậy, cần phải chú ý một số yêu cầu sau:
4.1.3.3. Vì sao phải biên dịch lại nhân?
Biên dịch lại nhân để chữa lỗi của nhân: Nếu các lỗi này thuộc về lõi của nhân thì phải vá nguồn của nhân và biên dịch lại để sửa chữa các lỗi được thông báo.
Biên dịch lại nhân để nâng cao hiệu năng của nhân: Theo mặc định, các bản phân phối Linux thường kèm theo một phiên bản nhân được biên dịch với hầu hết những thành phần có sẵn để có thể đáp ứng rộng rãi cấu hình phần cứng. Lúc khởi điểm, đây đúng là một lợi thế vì rất đơn giản là người dùng không cần phải can thiệp gì cả. Tuy nhiên, sau khi đã cài thành công và nắm chắc máy có những thiết bị gì và biết rõ cần những thành phần nào cho cấu hình của máy thì không có lý do gì phải cài đặt thêm cả những thứ không cần thiết và không dùng đến.
Biên dịch lại nhân để loại bỏ những ―drivers‖ không được dùng và có thể gây lỗi hay gây hiểu lầm cho nhân, khiến hệ thống hoạt động thiếu ổn định và hay gây lỗi.
Biên dịch lại nhân để thử nghiệm một chức năng hoặc một module mình vừa tạo ra
Trường hợp này người dùng thường không hay sử dụng, nhưng lại rất có ích cho các lập trình viên muốn tham gia lập trình module.
Biên dịch lại hạt nhân cũng là cần thiết trong trường hợp một phần cứng mới được thêm vào hệ thống mà hạt nhân hiện tại không hỗ trợ.
4.1.3.3. Quy ước cấu trúc phiên bản hạt nhân
Phiên bản của nhân Linux được quy ước theo các quy tắc cụ thể, đơn giản, dễ nhớ nhưng vô cùng quan trọng khi muốn chọn một phiên bản nào đó của nhân Linux để vá và biên dịch.
Số phiên bản nhân gồm 3 số phân tách nhau bởi dấu chấm như: 2.6.38 Số đầu tiên là số hiệu phiên bản chính.
Số thứ hai là số chỉ định cho tình trạng phiên bản. Nếu số này là số chẵn, nó chỉ định cho phiên bản phát hành ổn định. Ngược lại, nếu là số lẻ, nó chỉ định cho phiên bản không ổn định, thường dùng trong môi trường đang phát triển. Các nhân
thuộc loại này thường có nhiều lỗi và không ổn định. Cộng đồng Linux thường dùng các phiên bản này để tìm lỗi và thông báo cho nhóm phát triển nhân Linux. Và do đó cũng khuyến cáo với người dùng bình thường là không nên dùng các phiên bản phát triển để chạy các ứng dụng.
Số thứ ba là chỉ định cho số hiệu phát hành của một phiên bản nhân Linux. Một phiên bản ổn định của một nhân Linux có thể có nhiều số hiệu phát hành khác nhau (cũng được coi là phiên bản vá lỗi). Chỉ khi phiên bản 2.3.x được xem là hoàn tất, mới trở thành hạt nhân 2.4.0. Các bản vá lỗi sau đó sẽ xuất hiện với phiên bản 2.4.x và công việc phát triển sẽ bắt đầu trên phiên bản 2.5.x.
4.1.3.3. Yêu cầu tối thiểu trong việc biên dịch lại nhân Linux
Để biên dịch được nhân thì cần thiết phải có đủ chỗ chứa trên đĩa. Ít nhất phải có đủ chỗ chứa cho mã nguồn cả trước và sau khi giải nén, chỗ chứa để cài nhân và các module mới sau khi biên dịch.
Yêu cầu thứ hai vô cùng quan trọng là phải có một bộ công cụ cần thiết và đúng phiên bản mới đảm bảo biên dịch thành công được.
Cần quan tâm đến cấu hình của máy, những thông tin này sẽ giúp ta lựa chọn cấu hình hạt nhân phù hợp và không phải mất quá nhiều thời gian cho việc cài đặt những lựa chọn không phù hợp.
4.1.3.3. Cấu hình hạt nhân mới:
Đầu tiên, muốn có một hạt nhân mới để thực hành, ta phải tải nhân từ trên các máy chủ, có thể tải theo liên kết sau http://www.kernel.org/ . Sau đó tùy chọn một nhân để tải về. Tập tin sau khi tải về có định dạng là linux-2.x.x.tar.bz2. Sử dụng câu lệnh tar –jxvf linux-2.x.x.tar.bz2 để giải nén vào thư mục hiện hành.
Có 3 giao diện để cấu hình nhân:
make menuconfig và make xconfig : 2 chế độ này đều cần thêm thư viện hỗ trợ đồ họa, do đó dễ sử dụng và có khả năng thực hiện lại khi cần thiết.
make config: thường chỉ dành cho những người biết rõ mình cần cài đặt những gì và không được phép chọn lại.
Người biên dịch được 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 lựa chọn: Y, M, N. Có những driver không thể biên dịch như một module vì nó phải được tải và liên kết trực tiếp ngay khi nhân khởi động. Cũng có những driver được phép chọn như một module và được tải trong và sau khi nhân được khởi động. Vấn đề quan trọng ở đây là phải 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) cho các drivers này.
Đối với nhân nguyên khối (monolithic kernel): Các drivers dù có được dùng hay không vẫn tải lên khi nhân khởi động và tất nhiên nó sẽ chiếm một phần lớn bộ nhớ. Ưu điểm của lựa chọn này là một khi drivers đã được biên dịch vào nhân thì không còn phải lo lắng đến tính xác 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 module 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 hệ thống. Thêm một ưu điểm nữa là tính hiệu suất cao, khi cần driver thì đã có sẵn và không cần phải tải nữa.
Đối với nhân có cấu trúc module (modular kernel): Chỉ khi nào cần dùng các drivers này mới dc tải. Ưu điểm của lựa chọn này là tiết kiệm được bộ nhớ và tài nguyên của hệ thống. Với lựa chọn này, ta 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. Thêm một ưu điểm nữa là khả năng biên dịch lại chỉ một hoặc một số modules nào đó.
Như vậy, ưu điểm của nhân có cấu trúc module lại chính là nhược điểm của nhân nguyên khối và ngược lại.
4.1.3.3. Các bước thực hiện biên dịch và cài đặt
Đây là các bước thực hiện biên dịch[1] và cài đặt áp dụng cho loạt nhân 2.6.x và được thực hiện trong thư mục chứa mã nguồn:
Bước 1: make clean: dọn dẹp tất cả những objects không còn cần thiết. Bước 2: make bzImage: tạo nhân dạng nén. Đây là bước rất quan trọng, nếu xảy ra sự cố gì sẽ phải quay lại điều chỉnh cấu hình biên dịch nhân và chạy lại B1. Bước này thực hiện khá lâu và kết quả sẽ tạo ra nhân trong thư mục .arch/…/boot. Nhân đã được tạo nhưng chưa được cài.
Bước 3: make modules: biên dịch và tạo ra các modules (mà khi cấu hình ta chọn M). Các module đã được biên dịch sẽ được lưu trữ trong các thư mục tương ứng với từng nhóm drivers trong cây mã nguồn. Đây là giai đoạn lâu nhất trong cả quá trình biên dịch thực sự mã nguồn của nhân.
Bước 4: make modules_install: cài các modules vừa biên dịch vào thư mục
/lib/modules/<kernel_vesion>, bước này bắt buộc người dùng phải là root.
Bước 5: make install: thao tác các bước cần thiết để thiết lập nhân mới trên hệ thống. Bước này bao gồm quá trình lưu trữ nhân cũ, copy nhân mới, copy
System.map mới, điều chỉnh và cập nhật tập tin cấu hình khi khởi động hệ thống. Bước này cũng yêu cầu ở chế độ người dùng root.
Bước 6: sau khi hoàn tất các bước trên, tập tin /boot/grub/grub.conf sẽ tự động cập nhật các thông tin của nhân mới. Tuy nhiên, giá trị default vẫn giữ ở giá trị chỉ định cho nhân hiện đang hoạt động trên máy. Cần chỉnh lại giá trị này để buộc trình khởi động tải lên phiên bản mới nhất (chuyển giá trị default về 0 vì grub đếm thứ tự các nhân từ 0). Sau đó lưu lại tập tin cấu hình.
Bước 7: khởi động lại hệ thống để hoàn tất. Khi vào hệ thống, xem phiên bản nhân đang chạy sử dụng lệnh: uname -r