Biên dịch một kernel trên hệ thống CentOS

Màu nền
Font chữ
Font size
Chiều cao dòng

Biên dịch một kernel như thế nào - cách thức trên hệ thống CentOS

Mỗi phân phối Linux đều có một số chức năng cụ thể hỗ trợ xây dựng một kernel (nhân hệ điều hành) tuỳ biến từ các nguồn liên quan. Bài này thực hiện biên dịch nhân kernel trên hệ thống CentOS. Chúng tôi sẽ mô tả cách xây dựng nhân kernel tuỳ biến sử dụng các nguồn kernel không chỉnh sửa mới nhất từ website www.kernel.org (hoặc vanilla kernel), có thể áp dụng với bất kỳ nhân kernel nào được hỗ trợ trong phân phối của bạn. Bài này cũng sẽ mô tả cách ghép nối các nguồn kernel nếu bạn không muốn có chúng riêng rẽ trong nhân của mình.

Chú ý là trong bài này, tất cả ví dụ mẫu đều được thực trên hệ thống CentOS 4.4.

Đây chỉ là một trong nhiều cách thức thực hiện. Chúng tôi tiến hành thành công trên CentOS 4.4, nhưng không dám đảm bảo với bạn sẽ thành công 100%. Hãy xác định cụ thể hệ thống phân phối của mình và lựa chọn phương thức phù hợp. Tất cả đều tương tự như những gì được hướng dẫn trong các phần dưới đây.

1. Chú ý mở đầu

Ở đây chúng tôi sẽ giới thiệu hai cách xây dựng nhân kernel trên hệ thống CentOS. Cách thứ nhất là kiểu gói rpm kernel, bạn có thể cài đặt hoặc chia sẻ với người khác. Cách thứ hai có thể áp dụng cho toàn bộ phân phối Linux, nhưng không thể kết thúc bằng một gói rpm.

2. Xây dựng một kernel gói rpm

Phần này cung cấp cách thức xây dựng kernel kết thúc bằng một gói rpm giúp bạn có thể cài đặt hoặc chia sẻ với người khác.

2.1 Download các nguồn kernel

Đầu tiên chúng ta cần download các nhân kernel cần thiết vào thư mục /usr/src. Vào website www.kernel.org,chọn nhân kernel muốn cài đặt, ví dụ như linux-2.6.18.3.tar.bz2. (Bạn có thể tìm các kernel 2.6 ở đây). Sau đó download chúng vào thư mục /usr/src như sau:

cd /usr/src

wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.3.tar.bz2

Mở gói nguồn kernel và tạo liên kết đồng thời linux tới thư mục nguồn kernel như sau:

tar xjf linux-2.6.18.3.tar.bz2

ln -s linux-2.6.18.3 linux

cd /usr/src/linux

2.2 Chỉnh sửa thư mục /etc/modprobe.conf

Bây giờ chúng ta phải chú thích mô hình mptscsi trong thư mục /etc/modprobe.conf. Vì nếu không một lỗi sẽ xuất hiện khi bạn cố gắng tạo ra đĩa ram (ramdisk) cho kernel mới, dạng như sau:

No module mptscsi found for kernel 2.6.18.3-default, aborting.

(Không tìm thấy modul mptscsi cho kernel 2.6.18.3 mặc định, huỷ bỏ).

vi /etc/modprobe.conf

alias eth0 pcnet32

alias scsi_hostadapter mptbase

# alias scsi_hostadapter1 mptscsi

alias scsi_hostadapter2 mptfc

alias scsi_hostadapter3 mptspi

alias scsi_hostadapter4 mptsas

alias scsi_hostadapter5 mptscsih

2.3 Ghép nối các nguồn Kernel (Tuỳ chọn)

Đôi khi bạn cần định hướng cho phần cứng không được hỗ trợ mặc định trong kernel mới hoặc cần hỗ trợ cho các kỹ thuật ảo hoá hay một số kỹ thuật bleeding-edge khác chưa được thực hiện trong kernel mới. Khi đó bạn cần phải ghép nối các nguồn kernel bằng một bản ghép nối được cung cấp sẵn.

Bây giờ, giả sử bạn đã download được các bản ghép nối cần thiết (trong ví dụ này gọi là patch.bz2) vào thư mục /usr/src. Thực hiện ghép nối các nguồn kernel như sau (bạn vẫn phải ở trong thư mục /usr/src/linux):

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ỉ nhằm mục đích kiểm tra. Nó không thực hiện điều gì liên quan đến các nguồn của bạn. Nếu không có lỗi nào xuất hiện, bạn có thể chạy câu lệnh thứ hai, thực sự liên quan đến ghép nối. Đừng thực hiện nó nếu câu lệnh thứ nhất gặp lỗi.

Nếu các bản ghép nối được nén theo trong gzip (.gz) thay vì bzip2 (.bz2) thì thực hiện như sau:

gunzip -c /usr/src/patch.gz | patch -p1 --dry-run

gunzip -c /usr/src/patch.gz | patch -p1

Bạn cũng có thể dùng các bản "tiền ghép nối" cho nguồn kernel. Ví dụ, nếu bạn cần một thành phần chỉ hoạt động trong kernel 2.6.19-rc6 nhưng toàn bộ nguồn đã có chưa hỗ trợ cho kernel này. Khi đó bạn có thể dùng bản patch-2.6.19-rc6.bz2. Nhưng bản patch này chỉ dùng được cho nguồn kernel 2.6.18 mà không dùng được cho nguồn 2.6.18.1, 2.6.18.2 hay 2.6.18.3, v.v...Điều này được giải thích trên http://kernel.org/patchtypes/pre.html:

Các bản ghép nối tương ứng với các phiên bản alpha của Linux. Chúng "sống"trong các thư mục kiểm tra ở phần lưu trữ. Chung sẽ được sử dụng với tiện ích patch(1) cho mã nguồn của phiên bản đầy đủ trước với 3 số phiên bản (VD như bản 2.6.12-rc4 nên sử dụng cho các nguồn kernel 2.6.11 chứ không phải cho nguồn 2.6.11.10 hoặc tương tự).

Vì thế nếu bạn muốn biên dịch kernel 2.6.19-rc6, bạn phải tải các nguồn kernel 2.6.18 (http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2) ở bước 3 thay vì 2.6.18.3.

Đây là cách bạn sử dụng bản ghép nối 2.6.19-rc6 cho kernel 2.6.18:

cd /usr/src

wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc6.bz2

cd /usr/src/linux

bzip2 -dc /usr/src/patch-2.6.19-rc6.bz2 | patch -p1 --dry-run

bzip2 -dc /usr/src/patch-2.6.19-rc6.bz2 | patch -p1

2.4 Cấu hình Kernel

Bạn nên sử dụng cấu hình kernel hiện tại là thành phần cơ sở cho kernel mới. Bạn có thể copy lại cấu hình đã tồn tại này vào thư mục /usr/src/linux:

make clean && make mrproper

cp /boot/config-'uname -r' ./.config

Sau đó chúng ta chạy:

make menuconfig

Câu lệnh này đưa ra menu cấu hình kernel. Vào Load an Alternate Configuration File và chọn .config (thư mục chứa thông tin cấu hình của kernel hiện tại) để thiết lập file cấu hình cho kernel mới:

Sau đó lựa chọn cấu hình qua menu kernel. Phải đặc tả xâu xác định phiên bản kernel dưới General Setup ---> () Local version - append to kernel release. Tôi sử dụng chế độ mặc định -default nên gói rpm kernel sẽ được đặt tên là kernel-2.6.18.3default-1.i386.rpm. Bạn có thể để lại một xâu rỗng hoặc mô tả xâu khác giúp bạn xác định được kernel (như: -custom hoặc bất cứ xâu nào bạn thích).

Chú ý: Nếu như sau khi đã cài đặt kernel-2.6.18.3default-1.i386.rpm nhưng bạn lại quyết định biên dịch gói rpm kernel 2.6.18.3 khác, nhất thiết bạn phải sử dụng xâu phiên bản khác (như -default1, -default2,...). Nếu không bạn không thể cài đặt được kernel mới, vì rpm sẽ thông báo rằng kernel-2.6.18.3default-1.i386.rpm đã được cài đặt.

Sau khi thực hiện xong và chọn Exit, hãy trả lời câu hỏi tiếp sau đó: Do you wish to save your new kernel configuration? (Bạn có muốn ghi lại cấu hình kernel mới hay không?) là Yes.

2.5 Xây dựng kernel

Để xây dựng kernel, đơn giản chỉ cần thực thi câu lệnh sau:

make rpm

Bây giờ hãy kiên nhẫn, quá trình biên dịch kernel có thể mất vài giờ, tuỳ thuộc vào cấu hình kernel và tốc độ vi xử lý của bạn.

2.6 Cài đặt kernel mới

Sau khi xây dựng kernel thành công, một gói src.rpm và rpm được tạo. Gói src.rpm có thể được tìm thấy trong thư mục /usr/src/redhat/SRPMS/. Bạn có thể tìm ra tên nó bằng cách chạy:

ls -l /usr/src/redhat/SRPMS/

Trên hệ thống của tôi nó được gọi là kernel-2.6.18.3default-1.src.rpm.

Gói rpm có thể được tìm thấy trong /usr/src/redhat/RPMS/i386/, /usr/src/redhat/RPMS/i586/, /usr/src/redhat/RPMS/i686/, hay /usr/src/redhat/RPMS/x86_64/, ..., tuỳ thuộc vào cấu trúc của bạn. Trong hệ thống của tôi, nó được đặt ở vị trí /usr/src/redhat/RPMS/i386/. Và bằng cách chạy

ls -l /usr/src/redhat/RPMS/i386/

Tôi tìm ra tên của nó là kernel-2.6.18.3default-1.i386.rpm.

Bây giờ chúng ta có thể cài đặt gói rpm kernel như sau:

cd /usr/src/redhat/RPMS/i386/

rpm -ivh --nodeps kernel-2.6.18.3default-1.i386.rpm

Hãy chú ý lệnh chuyển đổi --nodeps: nếu bạn không dùng nó, bạn sẽ thấy có lỗi xuất hiện như sau:

error: Failed dependencies:

kernel >= 2.6.10 conflicts with lksctp-tools-1.0.2-6.4E.1.i386

(Nghĩa là: lỗi phụ thuộc; kernel >= 2.6.10 xung đột với lksctp-tools-1.0.2-6.4E.1.i386).

Nếu lờ đi phụ thuộc này cũng không ảnh hưởng gì đến hệ thống.

Bây giờ bạn có thể chuyển gói rpm kernel sang các hệ thống CentOS khác và cài đặt chúng ở đó bằng cách hoàn toàn tương tự. Như thế có nghĩa là bạn không phải biên dịch lại kernel trong máy sao chép.

Tiếp theo chúng ta sẽ cùng tạo một ramdisk (đĩa ram) cho kernel mới. Nếu không có thành phần này hệ thống gần như sẽ không boot (khởi động) kernel mới.

Code:

mkinitrd /boot/initrd-2.6.18.3-default.img 2.6.18.3-default

2.7 Cấu hình bộ tải khởi động GRUB

Bây giờ chúng ta phải cấu hình bộ tải khởi động GRUB để kernel mới boot khi chúng ta khởi động lại máy.

Chạy câu lệnh sau:

ls -l /boot

Để tìm kernel mới (thường bắt đầu bằng vmlinuz, như: vmlinuz-2.6.18.3-default) và ramdisk (thường bắt đầu bằng initrd, như initrd-2.6.18.3-default.img).

Sau đó chỉnh sửa /boot/grub/menu. Hãy xem lại các đoạn nhân kernel đã có hoặc đang hoạt động ở đó, lấy một đoạn làm mẫu cho đoạn mới để thay thế nhân kernel và ramdisk. Tiếp đến, bổ sung đoạn trên lên tất cả các đoạn khác.

vi /boot/grub/menu.lst

Ví dụ, thành phần menu.lst của tôi trông giống như sau trước khi tôi bổ sung đoạn mới:

# grub.conf generated by anaconda

#

# Note that you do not have to rerun grub after making changes to this file

# NOTICE: You have a /boot partition. This means that

# all kernel and initrd paths are relative to /boot/, eg.

# root (hd0,0)

# kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00

# initrd /initrd-version.img

#boot=/dev/sda

default=0

timeout=5

splashimage=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title CentOS (2.6.9-42.0.3.EL)

root (hd0,0)

kernel /vmlinuz-2.6.9-42.0.3.EL ro root=/dev/VolGroup00/LogVol00

initrd /initrd-2.6.9-42.0.3.EL.img

title CentOS-4 i386 (2.6.9-42.EL)

root (hd0,0)

kernel /vmlinuz-2.6.9-42.EL ro root=/dev/VolGroup00/LogVol00

initrd /initrd-2.6.9-42.EL.img

Và sau khi bổ sung là:

# grub.conf generated by anaconda

#

# Note that you do not have to rerun grub after making changes to this file

# NOTICE: You have a /boot partition. This means that

# all kernel and initrd paths are relative to /boot/, eg.

# root (hd0,0)

# kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00

# initrd /initrd-version.img

#boot=/dev/sda

default=0

timeout=5

splashimage=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title CentOS (2.6.18.3-default)

root (hd0,0)

kernel /vmlinuz-2.6.18.3-default ro root=/dev/VolGroup00/LogVol00

initrd /initrd-2.6.18.3-default.img

title CentOS (2.6.9-42.0.3.EL)

root (hd0,0)

kernel /vmlinuz-2.6.9-42.0.3.EL ro root=/dev/VolGroup00/LogVol00

initrd /initrd-2.6.9-42.0.3.EL.img

title CentOS-4 i386 (2.6.9-42.EL)

root (hd0,0)

kernel /vmlinuz-2.6.9-42.EL ro root=/dev/VolGroup00/LogVol00

initrd /initrd-2.6.9-42.EL.img

Bây giờ khởi động lại hệ thống:

shutdown -r now

Nếu mọi thứ đều hoạt động tốt, bạn đã sẵn sàng lên kernel mới. Bạn có thể kiểm tra xem liệu đã thực sự dùng được kernel mới hay chưa bằng cách chạy lệnh:

uname -r

Nó sẽ trả ra kết quả dạng như sau:

2.6.18.3-default

Nếu hệ thống vẫn chưa bắt đầu hoạt động, hãy khởi động lại nó. Khi bạn nhìn thấy:

Hãy ấn bất kỳ phím nào đó để vào menu GRUB:

Chọn kernel cũ của bạn và khởi động hệ thống. Bây giờ bạn có thể cố gắng biên dịch lại kernel đang hoạt động. Đừng quên bỏ đi các đoạn nhân kernel không hoạt động từ /boot/grub/menu.lst.

3. Xây dựng nhân kernel theo cách truyền thống.

Phần này mô tả một phương thức khác có thể dùng được cho tất các hệ thống Linux. Nhưng vì không có hệ thống CentOS nào cụ thể nên tất nhiên bạn sẽ không được kết thúc với một gói rpm kernel.

3.1. Download các nguồn kernel.

Chúng ta có thể download kernel mong muốn vào thư mục /usr/src. Vào website www.kernel.org và chọn kernel bạn muốn cài đặt, ví dụ như linux-2.6.18.3.tar.bz2 (Bạn có thể tìm thấy tất cả các kernel 2.6 ở đây: http://www.kernel.org/pub/linux/kernel/v2.6/). Sau đó tải kernel đã chọn vào thư mục /usr/src như sau:

cd /usr/src

wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.3.tar.bz2

Sau đó mở gói các nguồn kernel, tạo một liên kết linux đồng thời (symlink) tới thư mục nguồn kernel:

tar xjf linux-2.6.18.3.tar.bz2

ln -s linux-2.6.18.3 linux

cd /usr/src/linux

3.2 Chỉnh sửa thư mục /etc/modprobe.conf

Tương tự như trên, bây giờ chúng ta cũng phải đưa ra chú thích modul mptscsi trong thư mục /etc/modprobe.conf. Nếu không chúng ta sẽ nhận được cảnh báo sau khi xây dựng kernel mới:

WARNING: No module mptscsi found for kernel 2.6.18.3, continuing anyway

(Cảnh báo: Không tìm thấy modul mptscsi cho kernel 2.6.18.3, chương trình vẫn tiếp tục).

vi /etc/modprobe.conf

alias eth0 pcnet32

alias scsi_hostadapter mptbase

# alias scsi_hostadapter1 mptscsi

alias scsi_hostadapter2 mptfc

alias scsi_hostadapter3 mptspi

alias scsi_hostadapter4 mptsas

alias scsi_hostadapter5 mptscsih

3.3 Ghép nối các nguồn kernel (tuỳ chọn):

Mục đích của phần này giống như đã giới thiệu trong mục 2.1 ở trên

Bây giờ, giả sử bạn đã download được các bản ghép nối cần thiết (trong ví dụ này gọi là patch.bz2 ) vào thư mục /usr/src. Thực hiện ghép nối các nguồn kernel như sau (bạn vẫn phải ở trong thư mục /usr/src/linux):

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ỉ nhằm mục đích kiểm tra. Nó không thực hiện điều gì liên quan đến các nguồn của bạn. Nếu không có lỗi nào xuất hiện, bạn có thể chạy câu lệnh thứ hai, thực sự liên quan đến ghép nối. Đừng thực hiện nó nếu câu lệnh thứ nhất gặp lỗi.

Nếu các bản ghép nối được nén theo trong gzip (.gz) thay vì bzip2 (.bz2) thì thực hiện như sau:

Code:

gunzip -c /usr/src/patch.gz | patch -p1 --dry-run

gunzip -c /usr/src/patch.gz | patch -p1

Giống như trên, bạn cũng có thể dùng các bản "tiền ghép nối" cho nguồn kernel. Ví dụ, nếu bạn cần một thành phần chỉ hoạt động trong kernel 2.6.19-rc6 nhưng toàn bộ nguồn đã có chưa hỗ trợ cho kernel này. Khi đó bạn có thể dùng bản patch-2.6.19-rc6.bz2. Nhưng bản patch này chỉ dùng được cho nguồn kernel 2.6.18 mà không dùng được cho nguồn 2.6.18.1, 2.6.18.2 hay 2.6.18.3, v.v... Điều này được giải thích trên http://kernel.org/patchtypes/pre.html:

Các bản ghép nối tương ứng với các phiên bản alpha của Linux. Chúng "sống" trong các thư mục kiểm tra ở phần lưu trữ. Chung sẽ được sử dụng với tiện ích patch(1) cho mã nguồn của phiên bản đầy đủ trước với 3 số phiên bản (VD như bản 2.6.12-rc4 nên sử dụng cho các nguồn kernel 2.6.11 chứ không phải cho nguồn 2.6.11.10 hoặc tương tự).

Vì thế nếu bạn muốn biên dịch kernel 2.6.19-rc6, bạn phải tải các nguồn kernel 2.6.18 (http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2) ở bước 3 thay vì 2.6.18.3.

Đây là cách bạn sử dụng bản ghép nối 2.6.19-rc6 cho kernel 2.6.18:

cd /usr/src

wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc6.bz2

cd /usr/src/linux

bzip2 -dc /usr/src/patch-2.6.19-rc6.bz2 | patch -p1 --dry-run

bzip2 -dc /usr/src/patch-2.6.19-rc6.bz2 | patch -p1

3.4 Cấu hình kernel.

Cũng giống như trên, Bạn nên sử dụng cấu hình kernel hiện tại là thành phần cơ sở cho kernel mới. Bạn có thể copy lại cấu hình đã tồn tại này vào thư mục /usr/src/linux:

make clean && make mrproper

cp /boot/config-'uname -r' ./.config

Sau đó chúng ta chạy:

make menuconfig

Câu lệnh này đưa ra menu cấu hình kernel. Vào Load an Alternate Configuration File và chọn .config (thư mục chứa thông tin cấu hình của kernel hiện tại) để thiết lập file cấu hình cho kernel mới:

Sau đó lựa chọn qua menu cấu hình kernel. Khi bạn làm xong, chọn Exit và trả lời câu hỏi (Do you wish to save your new kernel configuration? - Bạn có muốn ghi lại cấu hình kernel mới không) là Yes.

3.5. Xây dựng và cài đặt kernel.

Để xây dựng và cài đặt kernel, thực thi ba câu lệnh sau:

make all

make modules_install

make install

Bây giờ hãy kiên nhẫn, quá trình biên dịch kernel có thể phải mất hàng giờ, tuỳ thuộc vào cấu hình và tốc độc vi xử lý của bạn. Câu lệnh cuối cùng sẽ tự động tạo một ramdisk cũng như thư mục /boot/grub/menu.lst.cho bạn.

Bây giờ hãy chỉnh sửa /boot/grub/menu.lst. Bạn nên tìm một stanza (có thể hiểu là một đoạn) cho kernel mới của bạn ở đầu danh sách. Nhưng để chắc chắn kernel mới được boot, bạn phải thiết lập giá trị mặc định là 0.

Code:

vi /boot/grub/menu.lst

menu.lst của tôi giống như sau:

# grub.conf generated by anaconda

#

# Note that you do not have to rerun grub after making changes to this file

# NOTICE: You have a /boot partition. This means that

# all kernel and initrd paths are relative to /boot/, eg.

# root (hd0,0)

# kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00

# initrd /initrd-version.img

#boot=/dev/sda

default=0

timeout=5

splashimage=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title CentOS (2.6.18.3)

root (hd0,0)

kernel /vmlinuz-2.6.18.3 ro root=/dev/VolGroup00/LogVol00

initrd /initrd-2.6.18.3.img

title CentOS (2.6.9-42.0.3.EL)

root (hd0,0)

kernel /vmlinuz-2.6.9-42.0.3.EL ro root=/dev/VolGroup00/LogVol00

initrd /initrd-2.6.9-42.0.3.EL.img

title CentOS-4 i386 (2.6.9-42.EL)

root (hd0,0)

kernel /vmlinuz-2.6.9-42.EL ro root=/dev/VolGroup00/LogVol00

initrd /initrd-2.6.9-42.EL.img

Bây giờ khởi động lại máy:

shutdown -r now

Nếu không có vấn đề gì xảy ra, bạn hoàn toàn có thể dùng kernel mới. Bạn có thể kiểm tra lại bằng câu lệnh:

uname -r

2.6.18.3

Nếu ổn định và hoạt động tốt, nó sẽ trả ra: 2.6.18.3

Nếu hệ thống không hoạt động, hãy khởi động lại máy. Khi bạn nhìn thấy:

Hãy ấn bất kỳ phím nào đó để vào menu GRUB:

Chọn kernel cũ của bạn và khởi động hệ thống. Bây giờ bạn có thể cố gắng biên dịch lại một kernel đang hoạt động. Đừng quên bỏ stanza của kernel không hoạt động từ thư mục /boot/grub/menu.lst..

4. Liên kết.

• CentOS: http://www.centos.org

• The Linux Kernel Archives: http://www.kernel.org

Trần Thu (Theo Howtoforge.com)

Nguồn bài viết từ quantrimang.com

Software is like sex, it's better when it's free - Linus Torvalds

Bạn đang đọc truyện trên: Truyen2U.Pro

#linux