Bài giảng Biên dịch nhân Linux - Hoàng Ngọc Diêu

Biên dịch nhân Linux  
Tác giả: Hoàng Ngọc Diêu  
Mục lục  
1
Tổng quan về nhân Linux trên phương  
diện biên dịch lại  
3
3
3
1.1  
1.2  
Nhân Linux và việc biên dịch lại nhân  
Tóm tắt các bước biên dịch (dành cho những ai thiếu kiên nhẫn)  
2
3
Tại sao cần biên dịch lại nhân Linux?  
5
6
Cấu trúc và quy ước số hiệu phiên bản  
của nhân Linux  
4
Đòi hỏi tối thiểu trong việc biên dịch lại  
nhân Linux  
6
7
8
4.1  
4.2  
Đòi hỏi cho nhân Linux 2.4.x  
Đòi hỏi cho nhân Linux 2.6.x  
5
Xác định cấu hình (hardware) của máy  
9
6
Các bước chuẩn bị  
Tạo một đĩa mềm khởi động cho nhân đang dùng  
Tải mã nguồn  
9
9
10  
11  
12  
14  
6.1  
6.2  
6.3  
6.4  
6.5  
Kiểm tra thực tính của mã nguồn  
Xả nén mã nguồn  
Dùng "config" nào thì thích hợp?  
7
Chỉnh cấu hình biên dịch nhân Linux  
Thành phần của cấu hình biên dịch nhân Linux  
Thành phần cấu hình biên dịch nhân Linux phiên bản 2.4.x  
Thành phần cấu hình nhân Linux cho loạt nhân 2.6.x  
Điều chỉnh cấu hình biên dịch nhân Linux  
Các công cụ để xác lập cấu hình  
14  
14  
14  
17  
18  
19  
7.1  
7.1.1  
7.1.2  
7.2  
7.2.1  
7.2.2  
Một số điểm cần chú ý trong giai đoạn hình thành cấu hình  
biên dịch nhân  
20  
8
Các bước biên dịch  
22  
22  
24  
25  
26  
8.1  
8.2  
8.3  
8.3.1  
Bước tạo dependency, dọn dẹp và tạo nhân  
Bước tạo modules và cài modules  
Tách rời mã nguồn và hồ sơ output trên loạt nhân 2.6.x  
"make help", một tiện ích mới trên loạt nhân 2.6.x  
– 1 –  
8.3.2  
Tách rời mã nguồn và output files  
27  
9
Cài đặt nhân  
27  
28  
28  
29  
31  
31  
32  
33  
9.1  
Cài đặt với "make install"  
Đối với GRUB  
9.1.1  
9.1.2  
9.2  
9.2.1  
9.2.2  
9.2.3  
Đối với LILO  
Các bước cài đặt bằng tay  
Tạo initrd  
Copy nhân và System.map  
Chỉnh cấu hình của bootloader config  
10 Khởi động lại máy và chỉnh lý nếu gặp  
trục trặc  
35  
35  
36  
10.1  
10.2  
Bị treo khi khởi động vào linux  
Bị treo trong quá trình nhân được load  
11 Vá và biên dịch nhân  
37  
37  
38  
11.1  
11.2  
Các điểm quan trọng trước khi vá  
Tải, xả và vá  
– 2 –  
1 Tổng quan về nhân Linux trên phương diện biên dịch  
lại  
1.1 Nhân Linux và việc biên dịch lại nhân  
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ânkernel để 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.  
1.2 Tóm tắt các bước biên dịch (dành cho những ai thiếu kiên  
nhẫn)  
Biên dịch nhân Linux rất đơn giản nếu như đã hiểu rõ các quy trình và các bước thực  
hiện. Sau đây là các lệnh cần thiết, giả định bạn đã có trọn bộ các công cụ cần thiết để  
biên dịch:  
– 3 –  
Chuyển vào thư mục /usr/src, nơi thông thường chứa mã nguồn để biên dịch nhân:  
$ cd /usr/src  
<KERNEL_SRC> là phiên bản kernel cần biên dịch, ví dụ ở đây tải mã nguồn được nén ở  
dạng bz2)  
Xác thực chữ ký và thực tính của mã nguồn:  
$ gpg --verify <KERNEL_SRC>.tar.bz2.sign <KERNEL_SRC>.tar.bz2  
Xả nén gói chứa mã nguồn:  
$ bzip2 -dc <KERNEL_SRC>.tar.bz2 | tar xvf -  
Nếu muốn dùng giao diện đồ họa để điều chỉnh các chọn lựa cho cấu hình nhân thì dùng  
lệnh:  
$ make xconfig  
Tập họp lệnh dùng để tạo các file phụ thuộc và các file bao gồm (include), tiếp theo là  
dọn dẹp các objects không cần thiết và biên dịch nhân ở dạng nén:  
$ make dep clean bzImage  
Biên dịch các modules đã được chọn lựa bằng lệnh:  
$ make modules  
Chchuyển sang chế độ super user cho lệnh tiếp theo:  
$ su  
Cài các modules vào thư mục /lib/modules/<KERNERL_SRC> với quyền của super  
user:  
# make modules_install  
Cài đặt nhân và các file cần thiết vào thư mục /boot:  
# make install  
Bước thứ 10 có thể thay thế bằng một loạt thao tác bằng tay (chi tiết ở phần 9.2) nếu như  
1
bản phân phối Linux không có sẵn một số công cụ thuộc gói mkinitrd (chỉ có trong  
bản RedHat và các bản dựa trên RedHat).  
1
distribution  
– 4 –  
Lưu ý: đối với loạt nhân 2.6.x, bạn có thể dùng các bước như trên. Tuy nhiên bước  
"make dep" không cần thiết nữa. Bài viết này bao gồm cho cả phiên bản 2.4.x và 2.6.x  
nên có một số chi tiết không cần thiết cho kernel 2.6.x. Tuy vậy, những chi tiết này sẽ  
không ảnh hưởng đến sự thành công của quy trình biên dịch nhân.  
2 Tại sao cần biên dịch lại nhân Linux?  
Đối với người dùng đã quen với những hệ điều hành "đóng" thì khái niệm biên dịch lại  
nhân là một khái niệm hết sức lạ lẫm. Điều này cũng dễ hiểu vì kernel của các hệ điều  
hành "đóng" hiển nhiên là "đóng" và người dùng bình thường không thể có cơ hội tiếp  
cận với mã nguồn của nhân để có thể biên dịch lại nhân nếu muốn. Trong khi đó, mã  
nguồn của nhân Linux hoàn toàn "mở" và đây là điều kiện rất thuận lợi cho vấn đề biên  
dịch lại nhân. Câu hỏi được đặt ra là tại sao lại cần phải biên dịch lại nhân Linux ?  
Câu trả lời ngắn: không cần nếu như không cần và cần nếu như cần :)  
Câu trả lời dài: có vô số lý do khiến cho người dùng cần phải biên dịch lại nhân Linux.  
Sau đây là một số trường hợp thường gặp nhất:  
a. tái biên dịch kernel để 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 nó để sửa chữa các lỗi được công bố.  
b. 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 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 (có thể hiện diện trên các  
máy). Đây là điểm lợi tổng quát lúc khởi điểm. 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ì (sound card, graphic card, network cards, SCSI  
card..... ) 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 bao gồm trọn bộ các thứ không cần thiết và không dùng. Đối với nhân  
2.4.x, mức độ nâng cao hiệu năng không rõ rệt (ngoại trừ dùng phương pháp test load  
để đo). Tuy nhiên, từ phiên bản 2.6.x trở đi, việc biên dịch lại và điều chỉnh "driver"  
cho nhân tạo hiệu xuất rõ rệt, nhất là trong việc điều chỉnh "thời biểu" (scheduling)  
của các công tác mà hệ thống phải đảm nhiệm.  
c. biên dịch lại nhân để loại bỏ những "drivers" không được dùng và có thể gây "hiểu  
lầm" cho nhân, tạo ra trường hợp máy có những triệu chứng hoạt động thiếu ổn định  
và hay gây lỗi.  
d. 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 không nhiều như các trường hợp trên nhưng cũng nằm trong các lý  
do phổ biến.  
– 5 –  
3 Cấu trúc và quy ước số hiệu phiên bản của nhân  
Linux  
Phiên bản của nhân Linux có quy ước rất đơn giản và dễ nhớ. Vấn đề này cần nắm rõ  
trước khi chọn một phiên bản nào đó của nhân Linux để vá và biên dịch.  
Phiên bản của nhân Linux bao gồm ba nhóm số tách ra bởi các dấu chấm. Ví dụ: 2.4.26  
Số thứ nhất: 2 là số hiệu phiên bản chính  
Số thứ nhì: 4 là 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 ổn định (stable), có thể dùng cho môi trường production. Nếu số này là số lẻ,  
nó chỉ định cho phiên bản không ổn định, nó thường dùng trong môi trường đang phát  
triển (development). Các kernel thuộc dạng này thường có nhiều lỗi và không ổn định.  
Nếu 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 thì  
đây là điều rất tốt. Không nên dùng phiên bản phát triển cho môi trường production.  
Số thứ ba: 26 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.  
Đây là các quy ước chung cho dạng nhân Linux "vanilla" có nghĩa là ứng dụng cho  
các phiên bản nhân từ http://www.kernel.org, các phiên bản nhân được điều  
chỉnh bởi mỗi bản phân phối có những điểm dị biệt. Có nhiều bản Linux xử dụng số hiệu  
2
con cho phiên bản nhân họ đã điều chỉnh. Ví dụ RedHat có những cập nhật phụ cho các  
kernel như: 2.4.20-8 chẳng hạn. Điều cần nắm ở đây là chỉ nên xử dụng phiên bản ổn  
định (stable) của nhân Linux (số chẵn ở giữa) cho môi trường production và dùng phiên  
3
bản thử nghiệm của nhân Linux (số lẻ) cho môi trường thử nghiệm và phát triển.  
4 Đòi hỏi tối thiểu trong việc biên dịch lại nhân Linux  
Trước khi bắt tay vào việc biên dịch lại nhân Linux, điều cần thiết là phải có đủ chỗ chứa  
trên đĩa. Ít nhất là phải đủ chỗ chứa cho mã nguồn (trước và sau khi xả nén), chỗ chứa để  
cài kernel và các modules mới sau khi biên dịch.  
Đòi hỏi quan trọng khác là phải có một bộ công cụ cần thiết và đúng phiên bản. Không  
thể biên dịch được nhân nếu không thoả mãn yêu cầu này. Phiên bản cho bộ công cụ với  
mỗi phiên bản nhân khác nhau. Nên nhớ, nhóm phát triển nhân yêu cầu bạn phải có đúng  
phiên bản của các công cụ để đảm bảo việc biên dịch nhân thành công.  
2
3
extra-version  
development  
– 6 –  
4.1 Đòi hỏi cho nhân Linux 2.4.x  
Công cụ  
Gnu C  
Phiên bản tối thiểu  
2.91.66  
3.77  
Cách xác định phiên bản  
gcc --version  
Gnu make  
binutils  
make –version  
2.9.1.0.25  
2.10o  
ld -v  
util-linux  
modutils  
e2fsprogs  
reiserfsprogs  
pcmcia-cs  
PPP  
fdformat --version  
insmod -V  
2.4.2  
1.19  
tune2fs  
3.x.0b  
reiserfsck 2>&1| grep reiserfsprogs  
cardmgr -V  
3.1.21  
2.4.0  
pppd --version  
isdn4k-utils  
3.1pre1  
isdnctrl 2>&1| grep version  
Tham khảo thêm chi tiết các công cụ này và địa chỉ để tải các công cụ cho đúng (ít  
nhất phải cùng phiên bản đã cung cấp ở trên hoặc mới hơn) trong hồ sơ Documenta-  
tion/changes của mã nguồn nhân mà bạn đang dự tính biên dịch.  
– 7 –  
4.2 Đòi hỏi cho nhân Linux 2.6.x  
Công cụ  
Gnu C  
Phiên bản tối thiểu  
2.95.3  
3.78  
Cách xác định phiên bản  
gcc --version  
Gnu make  
binutils  
make --version  
2.12  
ld -v  
util-linux  
module-init-tools  
e2fsprogs  
jfsutils  
2.10o  
fdformat --version  
depmod -V  
0.9.10  
1.29  
tune2fs  
1.1.3  
fsck.jfs -V  
reiserfsprogs  
xfsprogs  
3.6.3  
reiserfsck -V 2>&1| grep reiserfsprogs  
xfs_db -V  
2.1.0  
pcmcia-cs  
quota-tools  
PPP  
3.1.21  
3.09  
cardmgr -V  
quota -V  
2.4.0  
pppd --version  
isdnctrl 2>&1| grep version  
showmount –version  
ps --version  
isdn4k-utils  
nfs-utils  
3.1pre1  
1.0.5  
procps  
3.1.13  
0.5.3  
oprofile  
oprofiled --version  
Tham khảo thêm chi tiết các công cụ này và địa chỉ để tải các công cụ cho đúng (ít  
nhất phải cùng phiên bản đã cung cấp ở trên hoặc mới hơn) trong hồ sơ Documenta-  
tion/changes của mã nguồn nhân bạn đang dự tính biên dịch.  
Nếu phiên bản của các công cụ trên máy cũ hơn các phiên bản đưa ra ở trên, bạn cần  
phải tải phiên bản mới (đã biên dịch) từ website của bản phân phối nào bạn đang dùng.  
Bạn cũng có thể chọn cách tải mã nguồn của từng công cụ về biên dịch lại. Cách này  
mất thời gian hơn rất nhiều và chỉ thích hợp cho những ai đã quen thuộc với vấn đề biên  
dịch mã nguồn trên Linux. Lợi điểm của cách này là bạn tạo cho mình một bộ công cụ  
rất "sạch" vì đã biên dịch theo ý, thích hợp với môi trường của máy (và vừa đủ).  
Đối với phần cứng IA64, bạn cần phiên bản GCC cho 64bit, nên tham khảo chi tiết ở  
http://gcc.gnu.org/install/specific.html (nếu bạn may mắn có  
một con IA64 để thử)  
– 8 –  
5 Xác định cấu hình (hardware) của máy  
Phần lớn người dùng bình thường ít khi quan tâm đến cấu hình của máy ngoại trừ có nhu  
cầu cụ thể. Ngay cả những ai dùng Linux đã lâu và không cần phải biên dịch lại nhân,  
cũng ít khi quan tâm đến cấu hình phần cứng của máy. Dù có biết nhiều hay ít về cấu  
hình phần cứng của máy mình dùng, bạn vẫn phải thu thập thông tin chính xác của cấu  
hình trước khi bắt tay vào việc điều chỉnh cấu hình cho việc biên dịch nhân.  
Giả định mọi chỉnh lý đã ổn định và làm việc tốt đẹp (do trình cài đặt tự dò tìm (detect)  
trong khi cài Linux hay do bạn phải điều chỉnh lại), bạn cần biên dịch lại nhân Linux và  
cần thâu thập thông tin về cấu hình của máy, hai lệnh sau cung cấp các chi tiết phần cứng  
có trên máy:  
# /sbin/lspci  
Lệnh này liệt kê trọn bộ các "card" đang trực tiếp làm việc trên máy, phiên bản phần  
4
cứng và kiểu của chúng.  
# cat /proc/cpuinfo  
để xem chi tiết bộ xử lý trung tâm (CPU) của máy là loại gì. Nếu bản Linux mà bạn  
dùng không có /proc filesystem thì bạn có thể dùng lệnh dmesg để thu thập thông tin  
về phần cứng trên máy của mình. Ngoài ra, lệnh lsmod cũng ít nhiều giúp bạn xác định  
các modules đang được dùng trên máy và tên của các modules này.  
Những thông tin thâu thập được ở đây hết sức quan trọng trong giai đoạn điều chỉnh cấu  
hình cho việc biên dịch nhân. Nó giúp bạn xác định các chọn lựa đúng cho cấu hình máy,  
tránh đi những trở ngại có thể rất mất thời gian sau này.  
6 Các bước chuẩn bị  
6.1 Tạo một đĩa mềm khởi động cho nhân đang dùng  
Đây là một bước cần thiết đề phòng sự cố gì đó khiến bạn không thể khởi động vào hệ  
thống Linux sau khi cài nhân mới. Trường hợp này hiếm khi xảy ra trong quá trình biên  
dịch nhân và cài nhân mới nếu bạn thực hiện và điều chỉnh đúng. Những sự cố với trình  
5
khởi động ít thấy xảy ra vì trình khởi động đã được thiết lập hoàn chỉnh trước khi cập  
nhật nhân. Phần lớn giai đoạn điều chỉnh lại cấu hình của LILO hoặc GRUB không chính  
xác tạo trở ngại. Vấn đề này sẽ được đề cập sau. Trước mắt chúng ta cần tạo một đĩa mềm  
khởi động.  
4
5
model  
bootloader, LILO hoặc GRUB  
– 9 –  
Có rất nhiều cách để tạo một đĩa mềm khởi động lấy từ nhân hiện đang chạy trên máy.  
Thay vì trình bày nhiều cách khác nhau cho việc tạo đĩa mềm khởi động, ở đây tôi chỉ  
đề cập đến phương thức đơn giản nhất. Cách dễ nhất có lẽ là dùng mkbootdisk. Đây là  
một công cụ được cài mặc định trên các bản RedHat và hầu hết các bản phân phối dựa  
trên RedHat. Nếu công cụ này không hiện diện trên máy, bạn có thể tải mã nguồn về và  
biên dịch. Chạy lệnh:  
# mkbootdisk --device /dev/fd0 ‘uname -r‘  
trong đó ‘uname -r‘ là lệnh để lấy phiên bản nhân hiện dùng trên máy. Nếu không  
muốn phiên bản này, bạn có thể gõ vào phiên bản nào đó theo ý (tất nhiên là phiên bản  
kernel này phải hiện hữu trên hệ thống).  
/dev/fd0 là "device" chỉ cho đĩa mềm thứ nhất trên máy (tương tự như drive A: trên  
DOS). Bạn phải chọn đúng "device" thì mới có dữ liệu viết vào đĩa mềm mình muốn tạo.  
Quy trình này chỉ mất khoảng vài phút. Sau khi tạo đĩa mềm khởi động ở trên, bạn nên  
dùng nó để thử khởi động vào Linux trước khi thực hiện các bước kế tiếp. Nên nhớ phải  
chỉnh BIOS để cho phép máy khởi động từ A:  
có các hướng dẫn tạo đĩa cấp cứu rất hay. Bạn nên tham khảo thêm nếu trên máy mình  
dùng không có sẵn công cụ mkbootdisk.  
6.2 Tải mã nguồn  
Mã nguồn của nhân Linux (cả phiên bản ổn định lẫn đang phát triển) có rất nhiều nơi  
trên Internet. Nên vào trang trung tâm của nhân Linux ở http://www.kernel.  
org và tham khảo danh sách "mirrors" để tìm nơi "gần" chỗ mình cư ngụ nhất để tải về.  
Nơi "gần" không nhất thiết là "gần" theo phương diện địa lý mà nên chọn "gần" nhất dựa  
trên "ping time". Chịu khó lấy vài địa chỉ trên mirror và ping những địa chỉ này để chọn  
lấy nơi có ping time ngắn nhất mà tải về. Bằng cách sẽ giúp bạn đỡ mất thời gian và tiện  
cho vấn đề chia xẻ băng thông.  
Có nhiều cách tải mã nguồn. Bạn có thể dùng trình duyệt (browser) để tải qua giao thức  
http hoặc dùng một trình ftp nào đó để tải qua giao thức ftp. Bạn cũng có thể dùng wget.  
Có lẽ đây là cách tiện nhất và nhanh nhất nếu biết rõ địa chỉ và đường dẫn đến gói mình  
muốn tải. Ví dụ:  
trong trường hợp này, gói cụ thể cần tải là linux-2.4.26.tar.bz2.  
Mã nguồn ổn định của Linux kernel được nén ở hai dạng khác nhau: dạng có đuôi là .gz  
(dùng GNUzip để nén) và dạng có đuôi .bz2 (dùng bzip2 để nén). Thông thường cả hai  
tiện ích nén/xả nén trên đều có sẵn trong các bản Linux thông dụng. Nếu không có sẵn  
– 10 –  
trên máy thì tìm trong trong CD của bản Linux (tham khảo thêm tài liệu của distribution  
mình dùng cho cách cài thêm phần mềm vào máy) hoặc tải về từ:  
• http://www.gzip.org cho GNUzip  
6.3 Kiểm tra thực tính của mã nguồn  
Điều quan trọng khi tải mã nguồn của nhân, nên tải luôn chữ ký GPG .sign cho phiên  
bản tương ứng. Mục đích là để kiểm tra thực tính của mã nguồn được tải về. Khi mã  
nguồn của nhân Linux được công bố, chúng được dồn lại thành một gói (.tar) và sau đó  
được nén bằng GNUzip hoặc bzip2, cả hai loại này sau khi được nén đều được tạo "chữ  
ký" .sign.  
Kiểm tra thực tính của mã nguồn được tải về bằng phương pháp kiểm tra "chữ ký" của  
từng gói mã nguồn là một thói quen cần thiết. Lý do: các mã nguồn mở nói chung được  
công bố và phổ biến rộng rãi, ai cũng có thể chỉnh sửa (một cách không chính thức và  
không được nhóm phát triển chính thức cho phép) rồi đưa lên một máy chủ nào đó trên  
Internet. Người dùng tải về, biên dịch và cài trên máy mà không kiểm tra thực tính của  
chúng (và mã nguồn này có những thay đổi mờ ám) thì hậu quả khó mà lường.  
Quy trình kiểm tra "chữ ký" chỉ đơn giản gói gọn trong một dòng lệnh:  
$ gpg --verify linux-2.4.26.tar.bz2.sign linux-2.4.26.tar.bz2  
trong đó linux-2.4.26.tar.bz2.sign là "chữ ký" của gói linux-2.4.26.tar.bz2 được tải về từ  
server chứa mã nguồn nhân Linux linux-2.4.26.tar.bz2 là gói mã nguồn nhân Linux được  
nén bằng bzip2.  
Trước khi có thể kiểm tra thành công bằng lệnh trên, bạn phải có gpg đã cài trong máy,  
tải và nhập chìa khóa công cộng (public key) của máy chủ chứa mã nguồn nhân Linux mà  
Quy trình tải mã nguồn nhân Linux và kiểm tra thực tính của mã nguồn này có thể tóm  
tắt bằng một ví dụ như sau:  
Chuyển vào thư mục chứa mã nguồn của máy ở /usr/src là nơi thông thường. Đối với  
phiên bản nhân 2.6.x, bạn có thể dùng thư mục khác tùy ý:  
$ cd /usr/src  
Dùng wget để lấy một phiên bản mã nguồn từ server về ở dạng .bz2  
dùng wget để lấy .sign của phiên bản mã nguồn vừa được tải về  
– 11 –  
Dùng trình gpg với tùy chọn –verify để kiểm thực tính của mã nguồn vừa tải về  
$ gpg --verify linux-2.6.10.tar.bz2.sign linux-2.6.10.tar.bz2  
Ngoài phương pháp dùng chữ ký cho vấn đề kiểm chứng thực tính của mã nguồn (không  
chỉ mã nguồn của nhân Linux), bạn cũng thấy rất nhiều nơi trên Internet dùng "MD5sum"  
cho mục đích này (cho đến nay, mã nguồn nhân Linux kernel dùng chữ ký để kiểm chứng,  
không dùng MD5sum). Quy trình kiểm tra "MD5sum" chỉ đơn giản là một quy trình tạo  
một "MD5sum" từ mã nguồn được tải về trên máy và so sánh kết quả "MD5sum" này với  
hồ sơ "MD5sum" được tải về kèm với mã nguồn. Nếu "MD5sum" bạn tạo ra trên máy  
của mình với cùng gói mã nguồn mà không trùng hợp với "MD5sum" nguyên thuỷ tải  
về từ server thì thực tính của phần mã nguồn này không đáng tin cậy. Cách tốt nhất là  
chỉ nên tải mã nguồn ở những địa chỉ phố biến và đáng tin cậy. Cẩn thận hơn nữa (really  
paranoid), thì so sánh MD5sum với một số máy chủ chứa mã nguồn khác nhau.  
Kiểm tra thực tính của mã nguồn bằng MD5 checksum khá đơn giản. Tiện ích md5sum  
có sẵn hần như trên mọi bản phân phối. Lệnh tạo MD5 checksum đơn giản là lệnh:  
# md5sum <file_cần_kiểm_tra>  
sẽ tạo ra 1 chuỗi chữ và số tương tự như:  
2fe2a5fabcc3a33722b4ffe05714bec3 *<file_cần_kiểm_tra>.  
Nếu chuỗi này trùng với chuỗi được cung cấp chính thức với mã nguồn thì mã nguồn này  
có thực tính và đáng tin cậy.  
6.4 Xả nén mã nguồn  
Tùy vào gói mã nguồn được tải về thuộc dạng nén .gz hay .bz2 mà dùng tiện ích thích  
hợp để xả nén. Như đã tóm tắt trong phần 6.3 ở trên, gói mã nguồn được chứa trong  
/usr/src (wget được chạy sau khi cd vào /usr/src), cho nên bạn phải ở trong thư  
mục này trước khi thao tác các bước kế tiếp (không thì các bước kế tiếp phải thêm và  
đường dẫn đến nơi chứa gói mã nguồn). Đối với phiên bản nhân 2.6.x, mã nguồn của  
nhân Linux có thể được xả, chứa và biên dịch từ bất cứ nơi đâu trên hệ thống. Tuy nhiên,  
để giữ cho hệ thống sạch và thống nhất, bạn nên giữ mã nguồn ở /usr/src.  
Nếu gói mã nguồn có dạng .gz thì dùng:  
$ gunzip linux-2.x.xx.tar.gz  
x.xx là bất cứ phiên bản nào bạn tải về. Sau đó thực hiện tiếp:  
– 12 –  
$ tar xf linux-2.x.xx.tar  
Lệnh này dùng tùy chọn x để xả (extract) và f để chỉ định file nào cần được xả, ở đây hồ  
sơ (file) cần được xả là linux-2.x.xx.tar.  
Hai lệnh trên cũng có thể gộp chung lại như sau:  
$ tar xfz linux-2.x.xx.tar.gz  
lệnh này dùng thêm tùy chọn z để ngầm xả nén .gz file "on-the-fly" trước khi xả gói  
tar.  
Hoặc có thể tạo cùng kết quả bằng cách khác nữa:  
$ gzip -dc linux-2.x.xx.tar.gz | tar xvf -  
cụm lệnh này dùng chương trình gzip để xả nén (tùy chọn -d) ra stdout (tùy chọn -c) và  
"tee" nó qua chương trình tar để xả gói tar ra "on-the-fly". Cả cách này và cách ở trên  
đều tiện dụng cho những ai eo hẹp dung lượng trên đĩa.  
Nếu gói mã nguồn có dạng .bz2 thì dùng:  
$ bunzip2 linux-2.x.xx.tar.bz2  
$ tar xf linux-2.x.xx.tar  
Hai lệnh trên cũng có thể gộp chung lại như sau:  
$ tar xfj linux-2.x.xx.tar.bz2  
lệnh này dùng thêm tùy chọn j để ngầm xả nén .bz2 file "on-the-fly" trước khi xả gói  
tar.  
Hoặc có thể tạo cùng kết quả bằng cách khác nữa:  
$ bzip2 -dc linux-2.x.xx.tar.bz2 | tar xvf -  
cụm lệnh này dùng chương trình bzip2 để xả nén (tùy chọn -d) ra stdout (tùy chọn -c)  
và "tee" nó qua chương trình tar để xả gói tar ra "on-the-fly". Cả cách này và cách ở  
trên đều tiện dụng cho những ai eo hẹp dung lượng trên đĩa.  
Cả ba trường hợp đều cho kết quả là một thư mục có tên là linux-2.x.xx bên trong  
thư mục /usr/src/.  
Trong phần này, chúng ta chỉ đề cập đến trường hợp tải trọn bộ mã nguồn của nhân Linux  
về để biên dịch. Trường hợp đã có mã nguồn cũ hơn của nhân Linux trên máy và chỉ cần  
tải bản vá lỗi và "vá" thì có quy trình khác. Vấn đề này sẽ đề cập sau.  
– 13 –  
6.5 Dùng "config" nào thì thích hợp?  
Cấu hình biên dịch nhân Linux đơn giản là một "text file" chứa các biến với giá trị Y  
(Yes), N (No) hoặc M (Module). Các giá trị này được xử dụng trong quá trình biên dịch;  
chúng dùng để xác định những gì không được biên dịch, những gì được biên dịch và nếu  
được biên dịch thì sẽ theo dạng nào.  
Tùy vào cách sắp xếp của mỗi bản phân phối Linux, cấu hình biên dịch nhân Linux  
nằm nhiều nơi khác nhau. Hồ sơ cấu hình theo mặc định của "vanilla" kernel nằm ở  
./arch/i386/defconfig (nếu dùng dòng phần cứng IA32 nói chung), các hồ sơ cấu hình  
khác cho những dòng phần cứng khác nằm ở ./arch/$ARCH/defconfig; trong đó $ARCH  
là dòng phần cứng của máy. Nếu dùng cấu hình mặc định, không chỉnh sửa thì nhân sẽ  
được tái biên dịch trọn bộ theo giá trị mặc định và chắc hẳn, nhân này sẽ không thích hợp  
cho bạn (ngay cả nếu nó được biên dịch thành công). Điều này đi ngược lại mục đích cần  
biên dịch lại nhân Linux ngay từ đầu. Bạn có thể dùng hồ sơ cấu hình này để khởi đầu  
và chỉnh sửa giá trị cho thích hợp. Đây là một bước rất khó khăn cho những ai chưa từng  
đi qua giai đoạn này và không có sẵn một cấu hình biên dịch nhân hoàn chỉnh cho máy.  
Cấu hình cho nhân hiện hữu trên máy cũng có thể nằm trong thư mục /boot ở dạng  
config-2.x.xx nếu bạn dùng nhân do RedHat (hoặc dựa trên RedHat) và một số bản  
phân phối khác cung cấp. Bạn có thể an toàn dùng cấu hình này và chỉnh sửa, loại bỏ các  
chi tiết (driver module) không cần dùng. Nếu hệ thống đã được biên dịch nhân trước đây,  
bạn có thể tìm thấy cấu hình biên dịch nhân Linux có tên là .config, được lưu trong  
thư mục <KERNEL_SRC> (nơi trước đây mã nguồn của nhân được xả nén và biên dịch).  
7 Chỉnh cấu hình biên dịch nhân Linux  
7.1 Thành phần của cấu hình biên dịch nhân Linux  
Thành phần trong cấu hình biên dịch nhân Linux cho phiên bản 2.4.x và 2.6.x có một số  
điểm tương đồng và dị biệt. Tuy nhiên, quy trình chọn Y, N hoặc M cho các modules vẫn  
như nhau. Bước chọn lựa và chỉnh liệu cấu hình biên dịch nhân Linux là một bước mất  
nhiều thời gian nhất, nó cũng là một bước gây nhiều trở ngại nhất nếu chỉnh sửa không  
hợp lý hoặc thiếu sót.  
7.1.1 Thành phần cấu hình biên dịch nhân Linux phiên bản 2.4.x  
7.1.1.1 Code Maturity Level Options  
Chọn lựa của mục này cho phép dùng các modules/drivers còn ở trạng thái "alpha" (thử  
nghiệm). Nếu hệ thống làm việc là một máy production, cần tính ổn định cao thì nên tắt  
bỏ chọn lựa của phần này. Làm như thế sẽ tắt bỏ rất nhiều modules/drivers thuộc dạng  
– 14 –  
"alpha" trong những phần bên dưới. Nếu muốn thử dùng một số modules/drivers ở dạng  
alpha thì nên cho phép phần này (Y) và cẩn thận khi lựa chọn các modules được biên  
dịch sau này. Việc chọn lựa các "alpha" drivers ở chế độ mặc định của các nhân Linux  
trong nhiều bản phân phối Linux là một trong những nguyên nhân chính tạo nên tình  
trạng bất ổn định trên một số hệ thống Linux. Nếu chọn lựa các driver này một cách cẩn  
thận, cơ hội va phải tình trạng bất ổn định sẽ giảm thiểu rõ rệt.  
7.1.1.2 Loadable Module Support  
Đây là chức năng nòng cốt của nhân Linux (loadable module). Như đã đề cập ở phần  
tổng quan (phần 1), các module có thể tải (loadable modules) là tiện dụng và linh động,  
cho nên bạn gần như sẽ chọn Y trong trường hợp này. Trong trường hợp bạn cần dùng  
module được viết thêm bên ngoài nhân chính thức (3rd party modules), bạn phải chọn  
"enable set version information on all modules symbols" trong mục này. Nếu bạn cần  
biên dịch trọn bộ các drivers thẳng vào nhân và không dùng modules (vì lý do bảo mật  
chẳng hạn), bạn có thể chọn N ở đây. Bạn cũng phải chọn "Y" cho trọn bộ các drivers  
trong cấu hình biên dịch nhân để thích hợp với chọn lựa "N" cho phần Loadable Module  
Support này.  
7.1.1.3 Processor Type and Features  
Phần này có lẽ là phần tối quan trọng trong cấu hình biên dịch nhân Linux. Đây là nơi  
để chọn đúng CPU đang dùng trên máy. Ngoài ra còn rất nhiều chọn lựa khác nhau cho  
vấn đền system scheduling, SMP (symetrical multi-processing) nếu máy có nhiều CPU,  
hỗ trợ bộ nhớ lớn,.... Nếu bạn chọn CPU là i386 thì có lẽ sẽ không có sự cố vì i386 là  
architecture chung nhất (cả Intel và AMD CPU đều chạy với chọn lựa i386). Tuy nhiên,  
chọn lựa này sẽ không đạt hiệu năng tối đa và thích hợp cho từng loại CPU cụ thể. Nên  
chọn đúng CPU để bảo đảm hiệu năng của máy và nhất là để tránh trường hợp không thể  
khởi động vào Linux sau khi cài nhân mới (vì loại CPU chỉnh định cho nhân không đúng  
với CPU có trên máy hay nói một cách kỹ thuật, instructions giữa nhân và máy không  
đồng bộ).  
7.1.1.4 General Setup  
Mục này cho phép chọn lựa các ứng dụng hỗ trợ cho những thiết bị (cards) trên máy  
như ISA, PCI, PCMCIA và các chức năng thuộc về vấn đề quản trị năng lượng cao cấp  
(Advanced Power Management).  
7.1.1.5 Memory Technology Devices  
Phần này cho phép lựa chọn những ứng dụng thiết bị liên quan đến bộ nhớ. Nếu bạn dùng  
các thiết bị như máy ảnh số hoặc các loại compact flash thì bạn nên chỉnh lý phần này  
cho thích hợp.  
– 15 –  
7.1.1.6 Block Devices  
Đây là một phần rất quan trọng trong cấu hình biên dịch nhân Linux. Nó bao gồm các  
chọn lựa cho những thiết bị thông thường và cần thiết như đĩa cứng, đĩa mềm, băng lưu  
6
trữ cũng như các thiết bị điều tác (controllers) cho các cổng song song và RAID. Hầu  
như các chọn lựa trong mục này đều cần thiết; đặc biệt là chức năng hỗ trợ initrd cần  
thiết để tải sẵn các drivers cần thiết ở dạng module trong quá trình khởi động máy.  
7.1.1.7 Multi-Device support (RAID and LVM)  
Phần này chuyên chú đến các chức năng cần thiết cho hệ thống ở cấp độ máy chủ. Các  
chọn lựa ở đây hỗ trợ những thiết bị như RAID và LVM. Nếu máy của bạn hiện đang  
dùng RAID và LVM thì không thể bỏ qua phần này trong quá trình xác lập cấu hình biên  
dịch nhân Linux. Chọn lựa trong phần này đòi hỏi phải hiểu rõ nhu cầu dùng những công  
nghệ thuộc dạng này trên máy. Nếu máy không dùng đến những công nghệ này, bạn có  
thể an toàn tắt bỏ chúng (dùng N). Nên nhớ, nếu tắt bỏ RAID trong phần này thì phải tắt  
bỏ chọn lựa RAID trong phần "block devices" ở trên để tránh gặp phải lỗi biên dịch sau  
này.  
7.1.1.8 ATA/IDE/MFM/RLL support  
Phần này bao gồm các chọn lựa và hỗ trợ cho IDE và ATAPI dùng trên các thiết bị tương  
7
thich với PC (và trên nhiều architecture khác hiện có trên thị trường). Hầu hết các hệ  
thống cần các chức năng hỗ trợ trong phần này.  
7.1.1.9 Cryptography Support (CryptoAPI)  
Đây là một phần khá mới và lý thú trong mã nguồn của nhân Linux 2.4.x (chỉ được giới  
thiệu và công bố trong các phiên bản sau này của 2.4.x). Phần này có những lựa chọn  
thuộc về vấn đề "mã hoá" cho filesystem. Bạn có thể biên dịch các chọn lựa trong mục  
này và xử dụng (hoặc không) trên máy tùy ý.  
7.1.1.10 Networking Options  
Đây là một phần rất quan trọng trong cấu hình biên dịch nhân Linux nếu bạn muốn  
máy của mình kết nối với mạng. Nó bao gồm các chọn lựa cho cả hai chuẩn IPv4 và  
IPv6. Đây cũng là một phần hết sức phức tạp, cho nên, để có thể hiểu rõ và chọn lựa  
đúng cho hiệu năng tối đa của máy về mặt networking, bạn nên tham khảo các tài liệu  
về mạng Linux, ít nhất là nên đọc các tài liệu kèm theo trong mã nguồn nhân Linux ở  
<KERNL SRC>/Documentation/networking/ (thường là /usr/src/linux-2.x.xx/Documentation/networking/).  
6
7
parallel ports  
pc-compatible  
– 16 –  
7.1.1.11 SCSI Support  
Phần chọn lựa cho SCSI ít được những người dùng bình thường quan tâm đến vì không  
mấy ai dùng SCSI cho máy con. Tuy nhiên nếu bạn dùng SCSI card (hoặc SCSI built-in  
trên bo mạch chủ (motherboard)) hoặc dùng CDR/W qua IDE nhưng chạy ở dạng mô  
phỏng SCSI thì phải điều chỉnh các chọn lựa trong mục này. Điều quan trọng cần nhớ,  
nếu không dùng tiện dụng initrd, khi chọn lựa SCSI cho một filesystem chạy trên đĩa  
SCSI bạn phải biên dịch trực tiếp các tùy chọn cho SCSI vào nhân thay vì dùng dưới  
dạng module. Nếu không, nhân sẽ treo trong giai đoạn khởi động vì module hỗ trợ SCSI  
chưa được tải lên trong giai đoạn này.  
7.1.1.12 Character Devices  
8
Trong mục này có khá nhiều lựa chọn tập trung vào các thiết bị như nối tiếp và song  
9
10  
song , thiết bị chuột , joysticks (để chơi games). Tắt hoặc mở các lựa chọn trong mục  
này thường ít tạo ảnh hưởng nghiêm trọng.  
7.1.1.13 File Systems  
Mục này chứa trọn bộ các chọn lựa liên quan đến hệ thồng file (file system) và các loại  
file system được hỗ trợ trên Linux (bao gồm FAT, FAT32, NTFS, ISO cho CD-ROM....).  
Các file system phụ trợ như NTFS, FAT... có thể được biên dịch như một module cho  
nhân. Không nên biên dịch các modules cho file system dùng để "mount" trong giai đoạn  
khởi động như ext3, jbd mà nên biên dịch thẳng vào nhân (Lý do tương tự như đã đề cập  
trong phần "SCSI Support" ở trên). Cách này sẽ làm kích thước nhân lớn hơn nhưng sẽ  
an toàn và đơn giản hơn. Chức năng hỗ trợ initrd có thể dùng để tải các modules cần  
thiết trong quá trình khởi động nhân Linux nhưng phải nhớ bật chức năng này lên trong  
11  
phần thiết bị dạng block . Đây là vấn đề tùy chọn của từng cá nhân.  
7.1.2 Thành phần cấu hình nhân Linux cho loạt nhân 2.6.x  
7.1.2.1 Code Maturity Level Options  
Phần này tương tự như đã đề cập ở trên cho nhân 2.4.x.  
7.1.2.2 General Setup  
Phần này tương tự như đã đề cập ở trên cho nhân 2.4.x.  
8
9
serial  
parellel  
mouse  
block devices  
10  
11  
– 17 –  
7.1.2.3 Loadable Module Support  
Phần này tương tự như đã đề cập ở trên cho nhân 2.4.x.  
7.1.2.4 Processor Type and Features  
Phần này tương tự như đã đề cập ở trên cho nhân 2.4.x.  
7.1.2.5 Power Management Options  
Phần này tương tự như đã đề cập ở trên cho nhân 2.4.x.  
7.1.2.6 Executable File Formats  
Đây là một mục riêng biệt trong cấu hình biên dịch nhân của loạt nhân 2.6.x. Nếu bạn  
quan tâm đến "a.out", "elf" và "misc", nên nghiên cứu kỹ phần này qua các tài liệu  
kèm theo với mã nguồn nhân, đặt biệt cho các tiện dụng của "misc" ( <KERNEL SRC>/Documentation/mono.  
<KERNEL SRC>/Documentation/binfmt misc.txt, <KERNEL SRC>/Documentation/filesystem/proc.txt)  
7.1.2.7 Device Drivers  
Đây là một mục mới trong phần cấu hình biên dịch nhân của loạt nhân 2.6.x. Thật ra  
device drivers nằm rải rác khắp nơi trong cấu hình biên dịch nhân của loạt nhân 2.4.x. Ở  
loạt nhân 2.6.x, mọi vấn đề liên quan đến "device drivers" được gom lại trong cùng một  
12  
13  
nhóm. Các chọn lựa thuộc về các thiết bị như card đồ họa , card âm thanh , USB, SCSI  
và vấn đề hiệu chỉnh chúng đều tập trung ở đây.  
7.1.2.8 File Systems  
Phần này tương tự như đã đề cập ở trên cho nhân 2.4.x.  
7.1.2.9 Security Options  
Phần này dành riêng cho các vấn đề về bảo mật của nhân. Cho đến nay vẫn còn đang  
phát triển, tuy nhiên, đây là phần đầy hứa hẹn cho một nhân Linux mang tính bảo mật  
cao.  
7.2 Điều chỉnh cấu hình biên dịch nhân Linux  
Sau đây là một số phương pháp để xác lập cấu hình biên dịch nhân Linux.  
12  
13  
graphic card  
sound card  
– 18 –  
7.2.1 Các công cụ để xác lập cấu hình  
Như đã đề cập ở phần 6.5, mặc định cấu hình biên dịch nhân nằm ở ./arch/i386/defconfig.  
Khi khởi động một công cụ (config tool) nó sẽ tự động đọc và dùng nội dung của file  
cấu hình mặc định này trước khi bạn chỉnh sửa.  
Để chỉnh cấu hình biên dịch nhân Linux, chuyển vào thư mục chứa mã nguồn của nhân  
(đã xả nén):  
$ cd /usr/src/linux-2.4.26  
ví dụ này dùng nhân có số hiệu nhân 2.4.26 - xem lại phần xả nén ở phần 6.4) và việc  
đầu tiên rất nên làm đó là chạy lệnh:  
$ make mrproper  
Không kể bạn dùng bản phân phối Linux nào và phiên bản nhân Linux nào, bạn nên  
chạy lệnh này trước khi thực hiện quy trình biên dịch lại nhân. Target "mrproper" dùng  
để xoá hết tất cả những gì còn "vất vưởng" trong các thư mục chứa mã nguồn của nhân  
Linux để chắc chắn rằng mã nguồn trước khi được biên dịch phải ở tình trạng "sạch sẽ".  
Có ba phương tiện "config" phổ biến có thể dùng để chỉnh cấu hình biên dịch nhân Linux.  
Sau khi chuyển vào thư mục /usr/src/linux-2.4.26, bạn có thể chọn một trong ba  
cách sau:  
• make config  
• make menuconfig  
• make xconfig  
Trong đó:  
• make config là phương tiện đơn giản nhất và không đòi hỏi thêm bất cứ thư viện nào  
khác để chạy công cụ này. make config sẽ đưa ra một loạt câu hỏi và sau khi nhận  
được câu trả lời của bạn (Y, N, M như đã nói ở trên sau khi bạn nhấn phím Enter,  
xác nhận câu trả lời của mình), nó sẽ hình thành một cấu hình biên dịch nhân Linux.  
Nhược điểm của phương tiện này là ở chỗ, nếu bạn lỡ trả lời sai (chọn Y, N hoặc M  
và gõ phím Enter), bạn không thể quay ngược lại để điều chỉnh mà phải bắt đầu lại  
từ đầu. Phương tiện "make config" này chỉ tiện lợi cho những ai rất kinh nghiệm  
và nắm rõ mình cần gì trong cấu hình biên dịch nhân. Nó cũng tiện lợi cho quy trình  
chỉnh cấu hình biên dịch nhân từ xa (qua giao diện dòng lệnh (console) và không  
dùng được giao diện đồ họa vì lý do gì đó). Sau khi hoàn tất các câu hỏi, công cụ  
này sẽ lưu trữ một cấu hình biên dịch nhân (được lưu ở dạng .config trong thư mục  
chứa mã nguồn của nhân Linux) và sẵn sàng cho bước tạo các file phụ thuộc cho việc  
– 19 –  
Tải về để xem bản đầy đủ
pdf 42 trang baolam 20480 Free
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Biên dịch nhân Linux - Hoàng Ngọc Diêu", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbien_dich_nhan_linux_hoang_ngoc_dieu.pdf