oOo VnSharing oOo

Chào mừng đã đến với forum oOo VnSharing oOo.

Bạn chưa đăng kí (hoặc chưa đăng nhập) nên quyền lợi của bạn sẽ bị hạn chế. Việc đăng kí làm thành viên hoàn toàn miễn phí, sau khi đăng kí bạn có thể post bài, tham gia thảo luận, liên lạc với các thành viên khác qua hệ thống tin nhắn riêng, yêu cầu manga/anime... và rất nhiều quyền lợi khác. Thủ tục đăng kí rất nhanh chóng và đơn giản, hãy Đăng Kí Làm Thành Viên!

Nếu bạn quên mật khẩu, xin nhấn vào đây.

Nếu bạn gặp trục trặc trong vấn đề đăng kí hoặc không thể đăng nhập, hãy liên hệ với chúng tôi.
Go Back   oOo VnSharing oOo > VnSharing School > IT - Information Technology > Hướng dẫn - Thủ thuật máy tính

HD cho người mới | ĐĂNG KÍ VIP MEMBER: KHÔNG QUẢNG CÁO, KHÔNG CẦN POST BÀI ĐỂ DOWNLOAD!
Mua sắm bằng Rep! | VnSharing Shop   Facebook


Chính thức đưa host Mega vào sử dụng
Topic giải quyết việc phá forum của mod kẻ lang thang + Clouds-san


Trả lời
 
Ðiều Chỉnh Xếp Bài
  #1  
Old 23-11-2011, 17:22
d3dx9_30.dll's Avatar
d3dx9_30.dll d3dx9_30.dll is offline
Knight
 
Lover
Hạ Thiên Di
Phòng trưng bày huy hiệu
DOS Tan Pink iPod tan DOS Tan DOS Tan 
DOS Tan DOS Tan Red iPod tan DOS Tan 
Tổng số huy hiệu: 15
Tham gia ngày: 21-01-2011
Bài gửi: 1,167
Cấp Độ: 3
Rep: 10
d3dx9_30.dll đang trên đường thành danh

Hướng dẫn Recompile Kernel Linux 2.6.x, 3.0.x và Compile cho nhánh Debian

Hướng dẫn Recompile Kernel Linux 2.6.x, 3.0.x và Compile cho nhánh Debian



Đầu tiên tớ xin nói là việc biên dịch lại (recompile) nhân (kernel) không phải là khó (chỉ cần một chút kiên nhãn là được) nhưng cũng chẳng dễ (yêu cầu tối thiểu bạn phải biết một vài lệnh của Linux) và một...chiếc máy tính trâu một tí.

Đối với người dùng Mac, hay Microsoft Windows, việc biên dịch nhân là một khái niệm lạ, vì nhân của chúng hiển nhiên là "đóng" (phần mềm mã nguồn đóng) nên không thể biên dịch lại nhân được. Linux thì nhân của nó là mã nguồn mở, người dùng có thể tải về và biên dịch lại chúng. Lợi điểm của việc này là gì ?

  • Tạo một 'fresh kernel', trong đó kernel được tối ưu hết mức có thể về dung lượng và thời gian tải.
  • Loại bỏ các chi tiết không dùng đến. Ví dụ, nhân được hỗ trợ cho laptop Toshiba, nhưng bạn đang dùng một chiếc desktop và không cần đến những thứ này, bạn có thể recompile kernel với tùy chọn gỡ bỏ hỗ trợ laptop Toshiba này ra, và dĩ nhiên sẽ không phải mất thời gian để load chi tiết này nữa.
  • Chỉ recompile với những module và driver muốn dùng, loại bỏ những gì không cần thiết (ví dụ : ARM support, AMD chip trong khi bạn dùng chip của Intel,...)

Thường thì kernel của Linux được recompile với hai mục đích chính :
- Tối ưu hóa kernel - cái này đã nói ở trên.
- Vá lỗi mà không tối ưu hóa, hoặc vá lỗi và tối ưu hóa.


Trong tutorial này mình sẽ hướng dẫn các bạn recompile kernel cho hai phiên bản thông dụng cho đến hiện nay : series 2.6.x và series 3.0.x. Series 2.6.x vẫn được dùng cho bản phân phối Ubuntu 11.04 và series 3.0.x được dùng cho phiên bản Ubuntu 11.10. Phiên bản build nhân sẽ là i386, nhưng bạn cũng có thể build cho phiên bản IA64. Đặc biệt sẽ hướng tới việc build nhân cho phiên bản *Ubuntu (Edubuntu, Ubuntu, Kubuntu, Xubuntu, Lubuntu, Mythbuntu, nói chung là nhánh Debian).

Các loại build nhân sẽ trình bày trong Tutorial này :
- Build nhân thô trên tất cả hệ điều hành Linux (nhân 2.6.x)
- Build nhân và đóng gói nhân cho hệ điều hành Linux nhánh Debian (nhân 3.0.x)
- Build nhân thô cho hệ điều hành Linux (nhân 3.0.x)


Một chiếc máy tính tốt với CPU mạnh nhiều RAM sẽ là lợi thế cho bạn, vì việc build nhân Linux nói chung rất lâu, lâu 'kinh khủng', phải build một nhân chỉ có tầm 10-20MB từ mã nguồn hơn 400MB. Trên một máy tính chạy CPU Celeron D331 2.66 GHz (máy cũ của mình), việc build nhân mất gần 1 tiếng và build module mất hơn 2 tiếng.

Bootloader mình khuyên dùng là GRUB 2 (1.99), tức là từ bản Ubuntu 11.04 trở lên. Để phân biệt GRUB 1 và GRUB 2, GRUB 1 lưu config trong /boot/grub/menu.lst, còn GRUB 2 lưu trong /boot/grub/grub.cfg.

Về việc đánh số phiên bản nhân : Linux thường đánh số nhân theo dạng x.y.z, ví dụ 2.6.38, ngoài ra còn số phụ, nhưng chúng ta chỉ nói đến các số chính thống.
- x : Chỉ định cho phiên bản chính thống; ví dụ Linux 2, Linux 3;
- y : Tình trạng phát hành. Nếu đây là số lẻ, thì đây là development kernel, chỉ dùng cho thử nghiệm. Nếu đây số chẵn, thì đây là stable kernel, có thể dùng được, và các bản phân phối đều dùng stable kernel.
- z : Số phụ, là số phát hành, ví dụ 35,36,37...

Một vài ví dụ :
2.6.38.8
3.0.0
3.1.2


Recompile kernel 2.6.x


Trong tutorial này mình sẽ lấy kernel 2.6.38.8 ra làm ví dụ biên dịch. Dòng kernel 2.6.x và 3.0.x nếu biên dịch thô sẽ có cách biên dịch khá giống nhau. Riêng biên dịch và đóng gói cho Debian sẽ được nói riêng. Đầu tiên download kernel về :
Code:
scifi@scifi-945GZ-Micro-775-SE:~$ cd /usr/src
scifi@scifi-945GZ-Micro-775-SE:/usr/src$ sudo wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.38.8.tar.bz2


Quá trình kéo kernel 2.6.x về sẽ bắt đầu. Sử dụng wget là tốt nhất bởi vì bạn không thể đoạt quyền root bằng cách chỉ trỏ chuột trong trình quản lý cửa sổ, trừ khi chính bạn khởi động nó bằng sudo. Sau khi kéo kernel về, hãy giải nén nó, đối với .tar.gz thì hãy giải nén bằng zxvf còn .tar.bz2 là jxvf. Việc đầu tiên là kiểm tra bộ công cụ yêu cầu của kernel có được thỏa mãn không. Nếu các công cụ trên máy tính của bạn có số phiên bản thấp hơn các công cụ được yêu cầu trong kernel, thì việc biên dịch (sẽ) không thành công do nó yếu (!!). Chi tiết công cụ xem trong Documentations/changes sau khi giải nén kernel.
Code:
100%[======================================>] 74,811,146   264K/s   in 4m 50s  

2011-11-23 15:04:11 (252 KB/s) - `linux-2.6.38.8.tar.bz2' saved [74811146/74811146]
Ví dụ của phiên bản 2.6.38.8 :
Code:
o  Gnu C                  3.2                     # gcc --version
o  Gnu make               3.80                    # make --version
o  binutils               2.12                    # ld -v
o  util-linux             2.10o                   # fdformat --version
o  module-init-tools      0.9.10                  # depmod -V
o  e2fsprogs              1.41.4                  # e2fsck -V
o  jfsutils               1.1.3                   # fsck.jfs -V
o  reiserfsprogs          3.6.3                   # reiserfsck -V 2>&1|grep reiserfsprogs
o  xfsprogs               2.6.0                   # xfs_db -V
o  squashfs-tools         4.0                     # mksquashfs -version
o  btrfs-progs            0.18                    # btrfsck
o  pcmciautils            004                     # pccardctl -V
o  quota-tools            3.09                    # quota -V
o  PPP                    2.4.0                   # pppd --version
o  isdn4k-utils           3.1pre1                 # isdnctrl 2>&1|grep version
o  nfs-utils              1.0.5                   # showmount --version
o  procps                 3.2.0                   # ps --version
o  oprofile               0.9                     # oprofiled --version
o  udev                   081                     # udevinfo -V
o  grub                   0.93                    # grub --version
o  mcelog		  0.6
o  iptables               1.4.2                   # iptables -V
Bạn có thể tìm các công cụ này trên mạng, vì cách tìm chúng là ra khỏi giới hạn tutorial này. Bây giờ sẽ chuyển qua bước cấu hình nhân. Đây có thể nói là bước khó vì các tùy chọn rất nhiều và khó tối ưu cho từng máy. Nếu bạn chỉ compile kernel nhằm mục đích vá lỗi thì có thể bỏ qua phần này (tuy nhiên cũng nên đọc lại những lợi ích của việc tối ưu hóa ở phần đầu tiên). Tốt hơn hết là dùng cấu hình nhân do bản phân phối phát hành để "tối ưu hóa càng tối ưu hơn nữa" Lý do ? Dùng cấu hình nhân do bản phân phối cung cấp sẽ giảm thiểu tối đa nhân có thể, và nếu bạn config từ đầu thì (có thể) sẽ gặp một vài lỗi không tương thích aka xung đột với bản phân phối/kernel.

Sau đó cài đặt đồ nghề
Code:
sudo apt-get install kernel-package build-essentials libncurses5 libncurses5-dev
Các bản phân phối như Ubuntu, Fedora hay Red Hat đều có kèm theo các config đi kèm nhân, nằm trong /boot. Ví dụ :
Code:
scifi@scifi-945GZ-Micro-775-SE:/usr/src/linux-2.6.38.8$ cd /boot
scifi@scifi-945GZ-Micro-775-SE:/boot$ ls -l
total 40084
-rw-r--r-- 1 root root   736150 2011-09-29 03:08 abi-2.6.38-12-generic
-rw-r--r-- 1 root root   735445 2011-04-11 16:15 abi-2.6.38-8-generic
-rw-r--r-- 1 root root   137332 2011-09-29 03:08 config-2.6.38-12-generic
-rw-r--r-- 1 root root   137319 2011-04-11 16:15 config-2.6.38-8-generic
drwxr-xr-x 3 root root    12288 2011-11-23 12:45 grub
-rw-r--r-- 1 root root 12852285 2011-11-21 15:56 initrd.img-2.6.38-12-generic
-rw-r--r-- 1 root root 12817002 2011-11-20 18:17 initrd.img-2.6.38-8-generic
-rw-r--r-- 1 root root   160988 2010-10-22 18:43 memtest86+.bin
-rw-r--r-- 1 root root   163168 2010-10-22 18:43 memtest86+_multiboot.bin
-rw------- 1 root root  2109638 2011-09-29 03:08 System.map-2.6.38-12-generic
-rw------- 1 root root  2107662 2011-04-11 16:15 System.map-2.6.38-8-generic
-rw------- 1 root root     1217 2011-09-29 03:10 vmcoreinfo-2.6.38-12-generic
-rw------- 1 root root     1216 2011-04-11 16:18 vmcoreinfo-2.6.38-8-generic
-rw------- 1 root root  4522064 2011-09-29 03:08 vmlinuz-2.6.38-12-generic
-rw-r--r-- 1 root root  4521296 2011-04-11 16:15 vmlinuz-2.6.38-8-generic
scifi@scifi-945GZ-Micro-775-SE:/boot$
Hai dòng
Code:
-rw-r--r-- 1 root root   137332 2011-09-29 03:08 config-2.6.38-12-generic
-rw-r--r-- 1 root root   137319 2011-04-11 16:15 config-2.6.38-8-generic
Chính là hai config cho hai nhân. Các tệp config thực ra chỉ là các tệp văn bản bình thường, bạn có thể load nó vào trình config để làm việc hoặc làm trực tiếp bằng tay (lol). Tốt nhất nên dùng trình config để làm việc này. Đầu tiên ta chuyển vào thư mục của kernel và copy kernel config vào đó (chú ý nếu trong /usr/src thì hãy dùng root và dùng cp với -riv.
Code:
scifi@scifi-945GZ-Micro-775-SE:/boot$ cd /usr/src/linux*
scifi@scifi-945GZ-Micro-775-SE:/usr/src/linux-2.6.38.8$ sudo cp -riv /boot/config-2.6.38-8-generic .config
`/boot/config-2.6.38-8-generic' -> `.config'
scifi@scifi-945GZ-Micro-775-SE:/usr/src/linux-2.6.38.8$
Copy xong . Chú ý là file config phải cùng phiên bản với kernel dự định recompile. Bây giờ đánh lệnh
Code:
sudo make menuconfig
Thực ra có các dạng khác nhau, nhưng tớ vẫn thích dùng màn hình xanh lè với các nút chỉ trỏ hơn. Vì make config rất ư là thô, còn make xconfig hay gconfig thì cần các thư viện Gtk/QT, khá phiền phức.
Sau khi load, chọn Load An Alternate Configuration File để load .config. Bấm Enter.


  • [ ] : Chí được Y/N. Không được chọn Module [M].
  • ( ) : Nhập liệu.
  • < > : Cho phép Module.

Toàn bộ cách Config (thực ra là rất nhiều, mình chỉ điẻm qua một vài cái chính, những gì đánh dấu mặc định mà tối ưu luôn cũng bỏ qua) :

[SPOIL=" "]

General Setup


Enable Loadable Module Support


Enable the block layer


Processor Types And Features




Power Management And ACPI Options


Bus Options (PCI etc.)


Executable File Formats / Emulations


Networking Support


Device Drivers


Sau khi config xong, bạn chọn Save an Alternate Configuration File... Và lưu với chính file .config lúc nãy. Tiếp theo để biên dịch, bạn đánh lệnh :
Code:
scifi@scifi-945GZ-Micro-775-SE:/usr/src/linux-2.6.38.8$ sudo make localmodconfig
Và đánh tiếp lệnh
Code:
sudo make ImageType modules modules_install
trong đó ImageType chỉ định loại hình ảnh, và loại nén hình ảnh nhân.
[b(z)](Image)(Disk)(Lilo)
Tức là có các loại : zImage, bzImage, zDisk, bzDisk, zLilo và bzLilo. bzImage là loại phổ biến nhất nên ta sẽ chọn nó. bz chỉ định loại nén, còn Image chỉ định loại nhân.

Thực ra bạn có thể đánh từng lệnh một
Code:
sudo make ImageType
sudo make modules
sudo make modules_install
Nhưng nếu gộp như trên (sudo make ImageType modules modules_install) sẽ tiện lợi hơn vì các câu lệnh sẽ thực hiện liên tiếp. Hai câu lệnh sau
Code:
sudo make modules
sudo make modules_install
Dùng để tạo và cài Module (lúc nãy chọn bằng M và localmodconfig). Tùy thuộc vào lượng module bạn chọn, thời gian build nhân và module có thể nhanh lâu khác nhau. Sau khi compile xong nhân, đánh
Code:
sudo make install
Để quá trình cài Kernel bắt đầu. Khúc cuối nó sẽ hỏi không tìm thấy /boot/grub/menu.lst để cấu hình lại, chọn N vì đây là GRUB 1 config, nhưng chúng ta dùng GRUB 2, nên sẽ không cần. Chọn N, thoát ra đánh lệnh update-grub để hoàn tất. Reboot lại với kernel mới.





Quá trình recompile/tối ưu hóa nhân Linux 2.6.38.8 đến đây là kết thúc.

Recompile kernel với kernel 3.0.x

Đầu tiên cũng dùng wget để lấy kernel :
Code:
wget http://kernel.org/pub/linux/kernel/v3.x/linux-3.0.9.tar.gz
Sau đó bung nén ra dùng zxvf, cũng thực hiện như kernel 2.6.x như đã trình bày ở trên. Chú ý phải load config từ /boot cho đúng phiên bản nhân 3.0.x, điều chỉnh thích hợp vì config ở series 2.6.x và 3.0.x có hơi khác nhau vài điểm, cũng phải đặt kernel trong /usr/src.

Recompile kernel cho nhánh Debian, kernel 3.0.x

Sẽ compile kernel 3.0.x cho nhánh Debian, đóng gói và cài trên bất cứ máy nào, tất nhiên là gói nền tảng nào hỗ trợ máy cài ấy (vì i386 không dùng được với IA64, of course). Ưu điểm của cách này là :
  • Không phải mất công recompile kernel/copy kernel rồi cấu hình lại, có thể cài hàng loạt.
    (Chỉ có 1 thôi )
Nhược điểm cũng có 1 :
  • Chỉ dùng được cho các máy chạy Debian, nghĩa là nó bó tay với Red Hat hoặc Slackware.
Đầu tiên cài đặt đồ nghề và xem Documentations/Changes như mọi khi

Code:
sudo apt-get install kernel-package build-essentials libncurses5 libncurses5-dev
Sau đó tải nhân về
Code:
wget http://kernel.org/pub/linux/kernel/v3.x/linux-3.0.8.tar.gz


Sau đó copy file cấu hình từ /boot qua để cấu hình tiếp
Code:
cp -riv /boot/config-3* .config
hoặc dùng uname nếu phiên bản dự định recompile cùng phiên bản đang dùng
Code:
cp -riv /boot/config-$(uname -r) .config
Chạy Menuconfig, cấu hình, lưu .config lại và localmodconfig :
Code:
make menuconfig
make localmodconfig
Sau đó cleanup, ta sẽ nhờ 1 công cụ của Debian :
Code:
make-kpkg clean
Lệnh này sẽ tạo ra 2 gói debian chứa nhân; còn quy trình trong câu lệnh này sẽ compile kernel, compile module và đóng gói file .deb :
Code:
sudo fakeroot make-kpkg --initrd --append-to-version=LABEL kernel-image kernel-headers
Ở đây :
*LABEL : Nhãn. Sẽ đi kèm theo tên nhân, ví dụ "Ubuntu, with Linux kernel 3.0.8-11LABEL". Label không được chứa dấu "-","." (chán nhỉ, toàn dấu ưa thích của mềnh ) chỉ được dùng dấu "+","-" và các kí tự viết thường.

Quá trình này cũng khá lâu (nhưng không lâu bằng compile kernel thô). Sau đó sẽ có hai file deb, dùng sudo dpkg -i *.deb để cài nó. Reboot lại với kernel mới.



Kết thúc
Một vài lời kết :

* Compile Kernel rắc rối ở chỗ, phải cấu hình theo ý mình. Các tùy chọn đi kèm theo Help có hướng dẫn khá mơ hồ (nhưng nhiều khi lại hữu ích) nhưng số lượng các cấu hình rất lớn và bạn sẽ (có thể sẽ) chọn nhầm các tùy chọn làm nặng thêm kernel, phá hỏng kernel, config không đúng,...
* Đới với vá lỗi kernel mà không tối ưu, bạn chỉ cần compile kernel mà không cần đụng tới .config.
* Sau khi cài kernel mới thì bạn phải cài lại display driver vì sau khi nạp kernel mới thì display driver initialization sẽ bị fail.


Good luck!!!

(Mọi câu hỏi hãy VM profile mình vì mình sẽ không rảnh thường xuyên để check topic).

thay đổi nội dung bởi: d3dx9_30.dll, 23-11-2011 lúc 17:23
Trả Lời Với Trích Dẫn
Trả lời

Bookmarks & Social Networks


Ðiều Chỉnh
Xếp Bài

Quyền Hạn Của Bạn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 02:20.

Bản quyền oOo VnSharing Group oOo © 2007 - 2012
Vui lòng ghi nguồn VnSharing.net khi bạn dùng các bài viết của site. LIÊN HỆ QUẢNG CÁO: 0945255655. Mail: hyutars@gmail.com
Powered by: vBulletin Copyright © by 2000-2013, Jelsoft Enterprises Ltd.