Mỗi bản phân phối có một số công cụ cụ thể để xây dựng một hạt nhân tùy chỉnh từ các nguồn. Bài viết này nói về việc biên dịch một hạt nhân trên hệ thống Debian (Etch). Bài viết mô tả cách xây dựng một hạt nhân tùy chỉnh bằng cách sử dụng các nguồn hạt nhân chưa sửa đổi mới nhất từ www.kernel.org (hạt nhân vanilla) để bạn không phụ thuộc vào các hạt nhân do bản phân phối của bạn cung cấp. Nó cũng cho thấy cách vá các nguồn kernel nếu bạn cần các tính năng không có trong đó.
Tôi không đưa ra bất kỳ đảm bảo nào rằng điều này sẽ hiệu quả với bạn!
Phương pháp thứ hai là biên dịch kernel theo cách "truyền thống". Cách này có hiệu quả với mọi bản phân phối Linux, nhưng tất nhiên, bạn sẽ không có được gói .deb của kernel.
Sau đó, chúng tôi cài đặt tất cả các gói cần thiết như thế này:
Sau đó, chúng tôi giải nén các nguồn hạt nhân và tạo một liên kết tượng trưng linux đến thư mục nguồn hạt nhân:
Bây giờ hãy giả sử bạn đã tải xuống bản vá cần thiết (tôi gọi là patch.bz2 trong ví dụ này) vào /usr/src. Đây là cách bạn áp dụng bản vá vào các nguồn kernel của mình (bạn vẫn phải ở trong thư mục /usr/src/linux):
Lệnh đầu tiên chỉ là một bài kiểm tra, nó không làm gì với các nguồn của bạn. Nếu nó không hiển thị lỗi, bạn có thể chạy lệnh thứ hai thực sự áp dụng bản vá. Đừng làm vậy nếu lệnh đầu tiên hiển thị lỗi!
Bạn cũng có thể áp dụng các bản vá lỗi kernel cho các nguồn kernel của mình. Ví dụ, nếu bạn cần một tính năng chỉ có trong kernel 2.6.22-rc3, nhưng các nguồn đầy đủ vẫn chưa được phát hành cho kernel này. Thay vào đó, một patch-2.6.22-rc3.bz2 khả dụng. Bạn có thể áp dụng bản vá lỗi đó cho các nguồn kernel 2.6.21, nhưng không áp dụng cho kernel 2.6.21.1 hoặc 2.6.21.2, v.v. Điều này được giải thích trên http://kernel.org/patchtypes/pre.html:
Các bản vá trước tương đương với các bản phát hành alpha cho Linux; chúng nằm trong các thư mục thử nghiệm trong kho lưu trữ. Chúng phải được áp dụng bằng tiện ích patch(1) cho mã nguồn của bản phát hành đầy đủ trước đó với số phiên bản 3 phần (ví dụ: bản vá trước 2.6.12-rc4 phải được áp dụng cho các nguồn kernel 2.6.11, không phải, ví dụ, 2.6.11.10.)
Vì vậy, nếu bạn muốn biên dịch kernel 2.6.22-rc3, bạn phải tải xuống các nguồn kernel 2.6.21 (http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.tar.bz2) ở bước 3 thay vì kernel 2.6.21.3!
Đây là cách bạn áp dụng bản vá 2.6.22-rc3 cho kernel 2.6.21:
Sau đó, chúng ta chạy
để mở menu cấu hình kernel. Vào Tải tệp cấu hình thay thế và chọn .config (chứa cấu hình của hạt nhân đang hoạt động hiện tại của bạn) làm tệp cấu hình:
Sau đó, duyệt qua menu cấu hình hạt nhân và đưa ra lựa chọn của bạn. Khi bạn hoàn tất và chọn Thoát, hãy trả lời câu hỏi sau (Bạn có muốn lưu cấu hình hạt nhân mới của mình không?) bằng Có:
Sau --append-to-version=, bạn có thể viết bất kỳ chuỗi nào giúp bạn xác định hạt nhân, nhưng chuỗi đó phải bắt đầu bằng dấu trừ (-) và không được chứa khoảng trắng.
Bây giờ hãy kiên nhẫn, quá trình biên dịch hạt nhân có thể mất vài giờ, tùy thuộc vào cấu hình hạt nhân và tốc độ bộ xử lý của bạn.
Trên hệ thống thử nghiệm của tôi, chúng được gọi là linux-image-2.6.21.3-custom_2.6.21.3-custom-10.00.Custom_i386.deb (chứa kernel thực tế) và linux-headers-2.6.21.3-custom_2.6.21.3-custom-10.00.Custom_i386.deb (chứa các tệp cần thiết nếu bạn muốn biên dịch các mô-đun kernel bổ sung sau này). Tôi cài đặt chúng như thế này:
(Bây giờ bạn thậm chí có thể chuyển hai tệp .deb sang các hệ thống Debian Etch khác và cài đặt chúng ở đó theo đúng cách, nghĩa là bạn không phải biên dịch lại hạt nhân ở đó nữa.)
Vậy là xong. Tệp cấu hình bộ nạp khởi động GRUB /boot/grub/menu.lst đã được tự động sửa đổi và một đĩa ram cho hạt nhân mới đã được tạo trong /boot.
Bây giờ hãy khởi động lại hệ thống:
Tại dấu nhắc khởi động, hãy chọn hạt nhân mới của bạn (phải được chọn theo mặc định):
Nếu mọi thứ diễn ra tốt đẹp, nó sẽ đưa ra hạt nhân mới. Bạn có thể kiểm tra xem nó có thực sự sử dụng hạt nhân mới của bạn hay không bằng cách chạy
Nó sẽ hiển thị một cái gì đó giống như
Nếu hệ thống không khởi động, hãy khởi động lại hệ thống và chọn hạt nhân cũ của bạn tại dấu nhắc khởi động. Bây giờ bạn có thể thử lại để biên dịch một hạt nhân đang hoạt động. Đừng quên xóa các khổ của hạt nhân không hoạt động khỏi /boot/grub/menu.lst.
Sau đó, chúng ta cài đặt tất cả các gói cần thiết như sau:
Sau đó, chúng tôi giải nén các nguồn hạt nhân và tạo một liên kết tượng trưng linux đến thư mục nguồn hạt nhân:
Bây giờ hãy giả sử bạn đã tải xuống bản vá cần thiết (tôi gọi là patch.bz2 trong ví dụ này) vào /usr/src. Đây là cách bạn áp dụng bản vá vào các nguồn kernel của mình (bạn vẫn phải ở trong thư mục /usr/src/linux):
Lệnh đầu tiên chỉ là một bài kiểm tra, nó không làm gì với các nguồn của bạn. Nếu nó không hiển thị lỗi, bạn có thể chạy lệnh thứ hai thực sự áp dụng bản vá. Đừng làm vậy nếu lệnh đầu tiên hiển thị lỗi!
Bạn cũng có thể áp dụng các bản vá lỗi kernel cho các nguồn kernel của mình. Ví dụ, nếu bạn cần một tính năng chỉ có trong kernel 2.6.22-rc3, nhưng các nguồn đầy đủ vẫn chưa được phát hành cho kernel này. Thay vào đó, một patch-2.6.22-rc3.bz2 khả dụng. Bạn có thể áp dụng bản vá lỗi đó cho các nguồn kernel 2.6.21, nhưng không áp dụng cho kernel 2.6.21.1 hoặc 2.6.21.2, v.v. Điều này được giải thích trên http://kernel.org/patchtypes/pre.html:
Các bản vá lỗi tương đương với các bản phát hành alpha cho Linux; chúng nằm trong các thư mục thử nghiệm trong kho lưu trữ. Chúng phải được áp dụng bằng tiện ích patch(1) cho mã nguồn của bản phát hành đầy đủ trước đó với số phiên bản gồm 3 phần (ví dụ: bản vá trước 2.6.12-rc4 phải được áp dụng cho các nguồn kernel 2.6.11, không phải 2.6.11.10.)
Vì vậy, nếu bạn muốn biên dịch kernel 2.6.22-rc3, bạn phải tải xuống các nguồn kernel 2.6.21 (http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.tar.bz2) ở bước 3 thay vì kernel 2.6.21.3!
Đây là cách bạn áp dụng bản vá 2.6.22-rc3 cho kernel 2.6.21:
Sau đó, chúng tôi chạy
sẽ hiển thị menu cấu hình kernel. Đi tới Tải tệp cấu hình thay thế và chọn .config (chứa cấu hình của kernel đang hoạt động hiện tại của bạn) làm tệp cấu hình:
Sau đó, duyệt qua menu cấu hình kernel và đưa ra lựa chọn của bạn. Khi bạn hoàn tất và chọn Thoát, hãy trả lời câu hỏi sau (Bạn có muốn lưu cấu hình hạt nhân mới của mình không?) bằng Có:
Bây giờ hãy kiên nhẫn, quá trình biên dịch kernel có thể mất vài giờ, tùy thuộc vào cấu hình kernel và tốc độ bộ xử lý của bạn.
Đầu tiên, chúng ta thực hiện như sau:
Sau đó, chúng ta tạo một ramdisk bằng lệnh sau:
GRUB cấu hình rất dễ trên Debian Etch. Tất cả những gì chúng ta phải làm là chạy
Điều này sẽ phát hiện ra kernel và ramdisk mới và cập nhật /boot/grub/menu.lst cho chúng ta.
Bây giờ hãy khởi động lại hệ thống:
Tại dấu nhắc khởi động, hãy chọn kernel mới của bạn (phải được chọn theo mặc định). Nếu mọi thứ diễn ra tốt đẹp, nó sẽ đưa ra kernel mới. Bạn có thể kiểm tra xem nó có thực sự sử dụng kernel mới của bạn hay không bằng cách chạy
Điều này sẽ hiển thị một cái gì đó giống như
Nếu hệ thống không khởi động, hãy khởi động lại hệ thống và chọn kernel cũ của bạn tại dấu nhắc khởi động. Bây giờ bạn có thể thử lại để biên dịch kernel đang hoạt động. Đừng quên xóa các khổ thơ của hạt nhân không hoạt động khỏi /boot/grub/menu.lst.
Tôi không đưa ra bất kỳ đảm bảo nào rằng điều này sẽ hiệu quả với bạn!
1 Lưu ý sơ bộ
Tôi sẽ mô tả hai cách biên dịch một kernel mới. Sử dụng phương pháp đầu tiên, bạn sẽ có một gói kernel .deb có thể được cài đặt trên hệ thống và bạn có thể chia sẻ với những người khác và cài đặt trên các hệ thống Debian Etch khác.Phương pháp thứ hai là biên dịch kernel theo cách "truyền thống". Cách này có hiệu quả với mọi bản phân phối Linux, nhưng tất nhiên, bạn sẽ không có được gói .deb của kernel.
2 Xây dựng gói .deb của kernel
Chương này sẽ hướng dẫn cách xây dựng kernel và tạo ra gói .deb mà bạn có thể cài đặt và chia sẻ với người khác.2.1 Cài đặt các gói cần thiết để biên dịch kernel
Đầu tiên, chúng ta sẽ cập nhật cơ sở dữ liệu gói của chúng tôi:
Mã:
apt-get update
Mã:
apt-get install kernel-package ncurses-dev fakeroot wget bzip2 build-essential
2.2 Tải xuống các nguồn hạt nhân
Tiếp theo, chúng tôi tải xuống hạt nhân mong muốn của mình vào /usr/src. Truy cập www.kernel.org và chọn hạt nhân bạn muốn cài đặt, ví dụ: linux-2.6.21.3.tar.bz2 (bạn có thể tìm thấy tất cả các kernel 2.6 tại đây: http://www.kernel.org/pub/linux/kernel/v2.6/). Sau đó, bạn có thể tải xuống /usr/src như sau:
Mã:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.3.tar.bz2
Mã:
tar xjf linux-2.6.21.3.tar.bz2
ln -s linux-2.6.21.3 linux
cd /usr/src/linux
2.3 Áp dụng các bản vá cho các nguồn hạt nhân (Tùy chọn)
Đôi khi bạn cần trình điều khiển cho phần cứng không được hạt nhân mới hỗ trợ theo mặc định hoặc bạn cần hỗ trợ cho các kỹ thuật ảo hóa hoặc một số công nghệ tiên tiến khác chưa có trong kernel. Trong tất cả các trường hợp này, bạn phải vá các nguồn kernel (với điều kiện là có bản vá khả dụng...).Bây giờ hãy giả sử bạn đã tải xuống bản vá cần thiết (tôi gọi là patch.bz2 trong ví dụ này) vào /usr/src. Đây là cách bạn áp dụng bản vá vào các nguồn kernel của mình (bạn vẫn phải ở trong thư mục /usr/src/linux):
Mã:
bzip2 -dc /usr/src/patch.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch.bz2 | patch -p1
Bạn cũng có thể áp dụng các bản vá lỗi kernel cho các nguồn kernel của mình. Ví dụ, nếu bạn cần một tính năng chỉ có trong kernel 2.6.22-rc3, nhưng các nguồn đầy đủ vẫn chưa được phát hành cho kernel này. Thay vào đó, một patch-2.6.22-rc3.bz2 khả dụng. Bạn có thể áp dụng bản vá lỗi đó cho các nguồn kernel 2.6.21, nhưng không áp dụng cho kernel 2.6.21.1 hoặc 2.6.21.2, v.v. Điều này được giải thích trên http://kernel.org/patchtypes/pre.html:
Các bản vá trước tương đương với các bản phát hành alpha cho Linux; chúng nằm trong các thư mục thử nghiệm trong kho lưu trữ. Chúng phải được áp dụng bằng tiện ích patch(1) cho mã nguồn của bản phát hành đầy đủ trước đó với số phiên bản 3 phần (ví dụ: bản vá trước 2.6.12-rc4 phải được áp dụng cho các nguồn kernel 2.6.11, không phải, ví dụ, 2.6.11.10.)
Vì vậy, nếu bạn muốn biên dịch kernel 2.6.22-rc3, bạn phải tải xuống các nguồn kernel 2.6.21 (http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.tar.bz2) ở bước 3 thay vì kernel 2.6.21.3!
Đây là cách bạn áp dụng bản vá 2.6.22-rc3 cho kernel 2.6.21:
Mã:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.22-rc3.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.22-rc3.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch-2.6.22-rc3.bz2 | patch -p1
2.4 Cấu hình Kernel
Bạn nên sử dụng cấu hình của kernel đang hoạt động hiện tại làm cơ sở cho kernel mới. Do đó, chúng ta sao chép cấu hình hiện tại vào /usr/src/linux:
Mã:
make clean && make mrproper
cp /boot/config-`uname -r` ./.config
Mã:
make menuconfig
Sau đó, duyệt qua menu cấu hình hạt nhân và đưa ra lựa chọn của bạn. Khi bạn hoàn tất và chọn Thoát, hãy trả lời câu hỏi sau (Bạn có muốn lưu cấu hình hạt nhân mới của mình không?) bằng Có:
2.5 Xây dựng hạt nhân
Để xây dựng hạt nhân, hãy thực hiện hai lệnh sau:
Mã:
make-kpkg clean
fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers
Bây giờ hãy kiên nhẫn, quá trình biên dịch hạt nhân có thể mất vài giờ, tùy thuộc vào cấu hình hạt nhân và tốc độ bộ 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, bạn có thể tìm thấy hai gói .deb trong thư mục /usr/src.
Mã:
cd /usr/src
ls -l
Mã:
dpkg -i linux-image-2.6.21.3-custom_2.6.21.3-custom-10.00.Custom_i386.deb
dpkg -i linux-headers-2.6.21.3-custom_2.6.21.3-custom-10.00.Custom_i386.deb
Vậy là xong. Tệp cấu hình bộ nạp khởi động GRUB /boot/grub/menu.lst đã được tự động sửa đổi và một đĩa ram cho hạt nhân mới đã được tạo trong /boot.
Bây giờ hãy khởi động lại hệ thống:
Mã:
shutdown -r now
Nếu mọi thứ diễn ra tốt đẹp, nó sẽ đưa ra hạt nhân mới. Bạn có thể kiểm tra xem nó có thực sự sử dụng hạt nhân mới của bạn hay không bằng cách chạy
Mã:
uname -r
Mã:
2.6.21.3-custom
3 Xây dựng hạt nhân theo cách truyền thống
Chương này mô tả một cách tiếp cận khác có thể được sử dụng trên bất kỳ hệ thống Linux nào (ngoài các chi tiết như tạo ramdisk hoặc cập nhật bộ nạp khởi động). Tất nhiên là bạn sẽ không kết thúc với một gói hạt nhân .deb.3.1 Cài đặt các gói cần thiết để biên dịch Kernel
Đầu tiên, chúng ta cập nhật cơ sở dữ liệu gói của mình:
Mã:
apt-get update
Mã:
apt-get install kernel-package libncurses5-dev fakeroot wget bzip2 build-essential
3.2 Tải xuống các nguồn Kernel
Tiếp theo, chúng ta tải xuống kernel mong muốn của mình vào /usr/src. Truy cập www.kernel.org và chọn kernel bạn muốn cài đặt, ví dụ: linux-2.6.21.3.tar.bz2 (bạn có thể tìm thấy tất cả các kernel 2.6 tại đây: http://www.kernel.org/pub/linux/kernel/v2.6/). Sau đó, bạn có thể tải xuống /usr/src như sau:
Mã:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.3.tar.bz2
Mã:
tar xjf linux-2.6.21.3.tar.bz2
ln -s linux-2.6.21.3 linux
cd /usr/src/linux
3.3 Áp dụng các bản vá cho các nguồn hạt nhân (Tùy chọn)
Đôi khi, bạn cần trình điều khiển cho phần cứng không được hạt nhân mới hỗ trợ theo mặc định hoặc bạn cần hỗ trợ cho các kỹ thuật ảo hóa hoặc một số công nghệ tiên tiến khác chưa có trong kernel. Trong tất cả các trường hợp này, bạn phải vá các nguồn kernel (với điều kiện là có bản vá khả dụng...).Bây giờ hãy giả sử bạn đã tải xuống bản vá cần thiết (tôi gọi là patch.bz2 trong ví dụ này) vào /usr/src. Đây là cách bạn áp dụng bản vá vào các nguồn kernel của mình (bạn vẫn phải ở trong thư mục /usr/src/linux):
Mã:
bzip2 -dc /usr/src/patch.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch.bz2 | patch -p1
Bạn cũng có thể áp dụng các bản vá lỗi kernel cho các nguồn kernel của mình. Ví dụ, nếu bạn cần một tính năng chỉ có trong kernel 2.6.22-rc3, nhưng các nguồn đầy đủ vẫn chưa được phát hành cho kernel này. Thay vào đó, một patch-2.6.22-rc3.bz2 khả dụng. Bạn có thể áp dụng bản vá lỗi đó cho các nguồn kernel 2.6.21, nhưng không áp dụng cho kernel 2.6.21.1 hoặc 2.6.21.2, v.v. Điều này được giải thích trên http://kernel.org/patchtypes/pre.html:
Các bản vá lỗi tương đương với các bản phát hành alpha cho Linux; chúng nằm trong các thư mục thử nghiệm trong kho lưu trữ. Chúng phải được áp dụng bằng tiện ích patch(1) cho mã nguồn của bản phát hành đầy đủ trước đó với số phiên bản gồm 3 phần (ví dụ: bản vá trước 2.6.12-rc4 phải được áp dụng cho các nguồn kernel 2.6.11, không phải 2.6.11.10.)
Vì vậy, nếu bạn muốn biên dịch kernel 2.6.22-rc3, bạn phải tải xuống các nguồn kernel 2.6.21 (http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.tar.bz2) ở bước 3 thay vì kernel 2.6.21.3!
Đây là cách bạn áp dụng bản vá 2.6.22-rc3 cho kernel 2.6.21:
Mã:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.22-rc3.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.22-rc3.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch-2.6.22-rc3.bz2 | patch -p1
3.4 Cấu hình Kernel
Bạn nên sử dụng cấu hình của kernel đang hoạt động hiện tại làm cơ sở cho kernel mới của mình. Do đó, chúng tôi sao chép cấu hình hiện tại vào /usr/src/linux:
Mã:
make clean && make mrproper
cp /boot/config-`uname -r` ./.config
Mã:
make menuconfig
Sau đó, duyệt qua menu cấu hình kernel và đưa ra lựa chọn của bạn. Khi bạn hoàn tất và chọn Thoát, hãy trả lời câu hỏi sau (Bạn có muốn lưu cấu hình hạt nhân mới của mình không?) bằng Có:
3.5 Xây dựng và cài đặt hạt nhân
Để xây dựng hạt nhân, hãy thực hiện các lệnh sau:
Mã:
make all
make modules_install
make install
3.6 Các bước sau khi cài đặt
Bây giờ kernel mới đã được cài đặt, nhưng chúng ta vẫn cần một ramdisk cho kernel mới của mình (nếu không, hệ thống rất có thể sẽ không khởi động được!), và chúng ta cần thông báo cho bộ nạp khởi động GRUB về kernel mới của mình.Đầu tiên, chúng ta thực hiện như sau:
Mã:
depmod 2.6.21.3
apt-get install yaird
Mã:
mkinitrd.yaird -o /boot/initrd.img-2.6.21.3 2.6.21.3
Mã:
update-grub
Bây giờ hãy khởi động lại hệ thống:
Mã:
shutdown -r now
Mã:
uname -r
Mã:
2.6.21.3
4 Liên kết
- Debian: http://www.debian.org
- Kho lưu trữ hạt nhân Linux: http://www.kernel.org