Mỗi 1 nguồn phân phối - distribution đều có công cụ riêng biệt để xây dựng, tạo nhân từ các nguồn tương ứng. Trong bài viết sau, Quản Trị Mạng sẽ giới thiệu với các bạn phương pháp này trên hệ thống Debian Etch, cụ thể là phương pháp biên dịch kernel tùy chỉnh sử dụng bộ nhân nguyên bản tại đây, và từ đó ứng dụng lên hệ thống. Đồng thời, bài viết cũng chỉ ra phương pháp áp dụng các bản vá đối với các phiên bản kernel khác nhau.
Lưu ý sơ bộ
Chúng ta sẽ thực hiện 2 cách biên dịch phổ biến, cách đầu tiên các bạn sẽ có gói *.deb sau khi hoàn thành. Cách thứ 2 là cách “truyền thông”, và kết quả thu được sẽ sử dụng trên tất cả các sản phẩm của Linux, nhưng không phải là gói *.deb như cách thứ nhất.
Xây dựng gói kernel *.deb
Cài đặt các gói yêu cầu để biên dịch kernel:
Trước tiên, chúng ta cần cập nhật package database:
apt-get update
Và cài đặt các gói cần thiết như sau:
apt-get install kernel-package libncurses5-dev fakeroot wget bzip2 build-essential
Tải bộ mã nguồn của kernel:
Bước tiếp theo, chúng ta phải tải bộ kernel tương ứng về thư mục /usr/src. Truy cập http://www.kernel.org/ và chọn bộ kernel cần biên dịch, ví dụ linux-2.6.21.3.tar.bz2 (toàn bộ nguồn kernel 2.6 tại đây):
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.3.tar.bz2
Giải nén các gói vừa tải về và tạo liên kết động tới thư mục nguồn:
tar xjf linux-2.6.21.3.tar.bz2
ln -s linux-2.6.21.3 linux
cd /usr/src/linux
Áp dụng các bản vá vào nguồn kernel (theo lựa chọn)
Đôi khi, các bạn sẽ cần hệ thống driver mới nhất dành cho phần cứng, nhưng lại không được hỗ trợ bởi kernel mặc định, hoặc tính năng hỗ trợ công nghệ ảo hóa nhưng lại chưa được tích hợp vào bộ kernel này. Trong những trường hợp này, bạn cần áp dụng những bản vá thích hợp (thường có sẵn trên các nguồn cung cấp).
Giả sử chúng ta đã tải những bản patch cần thiết (trong bài viết này là patch.bz2) về thư mục /usr/src. Tại thư mục /usr/src/, gõ lệnh sau:
bzip2 -dc /usr/src/patch.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch.bz2 | patch -p1
Câu lệnh đầu tiên chỉ là kiểm tra, nếu kết quả trả về không báo lỗi nào thì tiếp tục thực thi câu lệnh thứ 2. Không nên tiếp tục chạy câu lệnh 2 nếu câu lệnh 1 có lỗi.
Bên cạnh đó, chúng ta cũng có thể áp dụng phương pháp prepatche vào bộ nguồn của kernel. Ví dụ, nếu bạn cần các tính năng chỉ có trong phiên bản kernel 2.6.22-rc3, nhưng bộ nguồn đầy đủ vẫn chưa được công bố. Thay vào đó, bản patch-2.6.22-rc3.bz2 đã có sẵn, và bạn có thể áp dụng bản vá đó vào bản kernel 2.6.21, nhưng không phải bộ kernel bản 2.6.21.1 hoặc 2.6.21.2… Các bạn có thể tham khảo thêm tại đây.
Phương pháp prepatch tương đương với phiên bản alpha dành cho Linux, chúng tồn tại trong các thư mục kiểm tra để lưu trữ.
Do đó, nếu muốn biên dịch bộ kernel 2.6.22-rc3, bạn phải tải mã nguồn của kernel 2.6.21. Sử dụng câu lệnh sau để áp ụng bản vá 2.6.22-rc3 vào kernel 2.6.21:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.22-rc3.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.22-rc3.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch-2.6.22-rc3.bz2 | patch -p1
Thiết lập, tùy chỉnh kernel
Để làm việc này, copy file thiết lập sẵn có tới /usr/src/linux:
make clean && make mrproper
cp /boot/config-`uname -r` ./.config
sau đó chạy lệnh sau:
make menuconfig
để hiển thị bảng thiết lập. Chọn Load an Alternate Configuration File > .config:
Sau đó tùy chọn các tính năng sẵn có và đi kèm trong menu, lựa chọn và quyết định khi cảm thấy phù hợp với nhu cầu. Khi hoàn thành, chọn Exit và Yes khi được hỏi Do you wish to save your new kernel configuration?
Xây dựng kernel
Để làm việc này, chúng ta sẽ sử dụng 2 câu lệnh sau:
make-kpkg clean
fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers
Sau cú pháp --append-to-version= bạn có thể viết bất cứ chuỗi ký tự nào để nhận diện bộ kernel này, nhưng phải bắt đầu bằng – và không có khoảng trống trong chuỗi.
Quá trình này sẽ diễn ra khá lâu, có thể lên đến hàng giờ tùy thuộc vào những yêu cầu thiết lập và tốc độ xử lý của hệ thống.
Cài đặt bộ kernel mới
Quá trình xây dựng và biên dịch kết thúc, sẽ có 2 gói .deb trong thư mục /usr/src:
cd /usr/src
ls -l
Trong cuộc kiểm tra này, chúng ta thu được 2 gói linux-image-2.6.21.3-custom_2.6.21.3-custom-10.00.Custom_i386.deb (chứa file gốc nguyên bản) và linux-headers-2.6.21.3-custom_2.6.21.3-custom-10.00.Custom_i386.deb (chứa file cần thiết để người sử dụng tự biên dịch sau này). Cài đặt các gói này như sau:
dpkg -i linux-image-2.6.21.3-custom_2.6.21.3-custom-10.00.Custom_i386.deb
dpkg -i linux-headers-2.6.21.3-custom_2.6.21.3-custom-10.00.Custom_i386.deb
Nếu muốn sử dụng trên hệ thống Debian Etch khác thì người dùng chỉ việc copy và lưu trữ trực tiếp, không cần phải biên dịch lại lần nữa.
Đồng thời, file cấu hình GRUB bootloader /boot/grub/menu.lst cũng được điều chỉnh tự động, ramdisk dành cho bộ kernel mới cũng đã được tạo trong /boot. Sau đó khởi động lại hệ thống:
shutdown -r now
Khi bảng thông báo khởi động xuất hiện, lựa chọn bộ kernel mới (mặc định):
Nếu tất cả mọi bước đều được thực hiện tốt, bảng thông báo sẽ xuất hiện với bộ kernel mới. Bạn có thể kiểm tra lại việc sử dụng bộ kernel mới bằng lệnh sau:
uname -r
kết quả thu được sẽ có dạng như sau:
2.6.21.3-custom
Nếu hệ thống không hoạt động, hãy khởi động lại lần nữa và chọn bộ kernel cũ và thử biên dịch lại bộ kernel đó. Và cũng đừng quên xóa bỏ thành phần khởi động của bộ kernel không hoạt động trong danh sách /boot/grub/menu.lst.
Xây dựng bộ kernel theo cách “truyền thống”
Trong phần tiếp theo, chúng ta sẽ miêu tả cách làm khác để thu được bộ kernel, và có thể được sử dụng trên bất kỳ hệ thống Linux nào.
Cài đặt các gói yêu cầu để biên dịch kernel:
Việc trước tiên là cập nhật package database:
apt-get update
và cài đặt gói cần thiết như sau:
apt-get install kernel-package libncurses5-dev fakeroot wget bzip2 build-essential
Tải bộ nguồn kernel
Tương tự như trên, tải bản kernel tới thư mục /usr/src. Truy cậphttp://www.kernel.org/ và lựa chọn bản kernel muốn cài đặt (ví dụ linux-2.6.21.3.tar.bz2 hoặc http://www.kernel.org/pub/linux/kernel/v2.6/):
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.3.tar.bz2
Giải nén gói mã nguồn và tạo liên kết động tới thư mục nguồn kernel như sau:
tar xjf linux-2.6.21.3.tar.bz2
ln -s linux-2.6.21.3 linux
cd /usr/src/linux
Áp dụng các bản vá vào nguồn kernel (theo lựa chọn)
Về cơ bản, trình tự và cách làm tương tự như phương pháp bên trên. Tại thư mục /usr/src/linux, gõ lệnh sau:
bzip2 -dc /usr/src/patch.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch.bz2 | patch -p1
Nếu muốn biên dịch bộ kernel 2.6.22-rc3, bạn cần tải bản mã nguồn của kernel 2.6.21. Bạn có thể sử dụng câu lệnh sau để thực hiện bản vá 2.6.22-rc3 vào kernel 2.6.21:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.22-rc3.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.22-rc3.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch-2.6.22-rc3.bz2 | patch -p1
Sau đó áp dụng các bước như trên để biên dịch và tạo kernel.
Tìm hiểu về bước Post-Installation
Một khi bộ kernel mới được cài đặt, nhưng chúng ta vẫn cần ramdisk đối với kernel tương ứng (nếu không thì hệ thống sẽ không khởi động được), và chúng ta phải điều chỉnh GRUB bootloader về sự thay đổi nhân kernel này:
Trước tiên, gõ lệnh sau:
depmod 2.6.21.3
apt-get install yaird
Tạo ramdisk bằng cú pháp sau:
mkinitrd.yaird -o /boot/initrd.img-2.6.21.3 2.6.21.3
Việc thiết lập, tùy chỉnh GRUB khá đơn giản trên hệ thống Debian Etch:
update-grub
câu lệnh trên sẽ tự động cập nhật kernel và ramdisk mới vào danh sách /boot/grub/menu.lst
Sau đó, khởi động lại hệ thống:
shutdown -r now
Trên đây là 1 số phương pháp cơ bản để xây dựng, biên dịch bộ nhân kernel Linux trên hệ thống Debian Etch.
Chúc các bạn thành công!