Hướng dẫn biên dịch nhân Linux
Hướng dẫn biên dịch nhân Linux
Biên d ch nhân Linux
Tác gi : Hoàng Ng c Diêu
M cl c
1 T ng quan v nhân Linux trên phương
di n biên d ch l i 3
1.1 Nhân Linux và vi c biên d ch l i nhân 3
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) 3
2 T i sao c n biên d ch l i nhân Linux? 5
3 C u trúc và quy ư c s hi u phiên b n
c a nhân Linux 6
4 Đòi h i t i thi u trong vi c biên d ch l i
nhân Linux 6
4.1 Đòi h i cho nhân Linux 2.4.x 7
4.2 Đòi h i cho nhân Linux 2.6.x 8
5 Xác đ nh c u hình (hardware) c a máy 9
6 Các bư c chu n b 9
6.1 T o m t đĩa m m kh i đ ng cho nhân đang dùng 9
6.2 T i mã ngu n 10
6.3 Ki m tra th c tính c a mã ngu n 11
6.4 X nén mã ngu n 12
6.5 Dùng "config" nào thì thích h p? 14
7 Ch nh c u hình biên d ch nhân Linux 14
7.1 Thành ph n c a c u hình biên d ch nhân Linux 14
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 14
7.1.2 Thành ph n c u hình nhân Linux cho lo t nhân 2.6.x 17
7.2 Đi u ch nh c u hình biên d ch nhân Linux 18
7.2.1 Các công c đ xác l p c u hình 19
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
8.1 Bư c t o dependency, d n d p và t o nhân 22
8.2 Bư c t o modules và cài modules 24
8.3 Tách r i mã ngu n và h sơ output trên lo t nhân 2.6.x 25
8.3.1 "make help", m t ti n ích m i trên lo t nhân 2.6.x 26
–1–
8.3.2 Tách r i mã ngu n và output files 27
9 Cài đ t nhân 27
9.1 Cài đ t v i "make install" 28
9.1.1 Đ i v i GRUB 28
9.1.2 Đ i v i LILO 29
9.2 Các bư c cài đ t b ng tay 31
9.2.1 T o initrd 31
9.2.2 Copy nhân và System.map 32
9.2.3 Ch nh c u hình c a bootloader config 33
10 Kh i đ ng l i máy và ch nh lý n u g p
tr c tr c 35
10.1 B treo khi kh i đ ng vào linux 35
10.2 B treo trong quá trình nhân đư c load 36
11 Vá và biên d ch nhân 37
11.1 Các đi m quan tr ng trư c khi vá 37
11.2 T i, x và vá 38
–2–
1 T ng quan v nhân Linux trên phương di n biên d ch
li
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
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)
$ wget http://www.kernel.org/pub/linux/kern...>.tar.bz2 (
Xác th c ch ký và th c tính c a mã ngu n:
$ gpg --verify .tar.bz2.sign .tar.bz2
X nén gói ch a mã ngu n:
$ bzip2 -dc .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/ 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ư
b n phân ph i 1 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
con 2 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
b n th nghi m 3 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 extra-version
3 development
–6–
4.1 Đòi h i cho nhân Linux 2.4.x
Công c Phiên b n t i thi u Cách xác đ nh phiên b n
Gnu C 2.91.66 gcc --version
Gnu make 3.77 make –version
binutils 2.9.1.0.25 ld -v
util-linux 2.10o fdformat --version
modutils 2.4.2 insmod -V
e2fsprogs 1.19 tune2fs
reiserfsprogs 3.x.0b reiserfsck 2>&1| grep reiserfsprogs
pcmcia-cs 3.1.21 cardmgr -V
PPP 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 Phiên b n t i thi u Cách xác đ nh phiên b n
Gnu C 2.95.3 gcc --version
Gnu make 3.78 make --version
binutils 2.12 ld -v
util-linux 2.10o fdformat --version
module-init-tools 0.9.10 depmod -V
e2fsprogs 1.29 tune2fs
jfsutils 1.1.3 fsck.jfs -V
reiserfsprogs 3.6.3 reiserfsck -V 2>&1| grep reiserfsprogs
xfsprogs 2.1.0 xfs_db -V
pcmcia-cs 3.1.21 cardmgr -V
quota-tools 3.09 quota -V
PPP 2.4.0 pppd --version
isdn4k-utils 3.1pre1 isdnctrl 2>&1| grep version
nfs-utils 1.0.5 showmount –version
procps 3.1.13 ps --version
oprofile 0.5.3 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
c ng và ki u 4 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
kh i đ ng 5 í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 model
5 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:
trang http://www.yolinux.com/TUTORIALS/LinuxTutorialRecoveryAndBootDisk.html
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 :
$ wget http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.26.tar.bz2
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
•
http://sources.redhat.com/bzip2/ cho bzip2
•
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à
b n t i v . Chi ti t hư ng d n cho quy trình này http://www.kernel.org/signature.html
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
$ wget http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.26.tar.bz2
dùng wget đ l y .sign c a phiên b n mã ngu n v a đư c t i v
– 11 –
$ wget http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.26.tar.bz2.sign
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
s t o ra 1 chu i ch và s tương t như:
2fe2a5fabcc3a33722b4ffe05714bec3 *.
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 (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
tr cũng như các thi t b đi u tác (controllers) cho các c ng song song 6 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
thich v i PC 7 (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
/Documentation/networking/ (thư ng là /usr/src/linux-2.x.xx/Documentation/networking/).
6 parallel ports
7 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
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 8 và song
song 9, thi t b chu t 10, 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
ph n thi t b d ng block 11. Đâ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 serial
9 parellel
10 mouse
11 block devices
– 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" ( /Documentation/mono.
/Documentation/binfmt misc.txt, /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
nhóm. Các ch n l a thu c v các thi t b như card đ h a 12, card âm thanh 13, 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 graphic card
13 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 –