xây dựng hình ảnh hạt nhân (.img) bao gồm ramdisk


12

Tôi đã xây dựng nhân Linux của mình (3.0.1) cho Raspberry Pi bằng các bước sau:

1. Downloading kernel source
2. tar xvf source.tar.bz2
3. downloading arm cross compilation tool.
4. tar xvf arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
5. setting up path for cross tool export PATH=$PATH:/home/shan/<cross tool folder>/bin/
6. after entering linux source dir make ARCH=arm versatile_defconfig (is this reliable   with raspberry pi)
7. make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
8. zImage is generated in /arch/arm/boot

Câu hỏi của tôi là, làm thế nào tôi có thể xây dựng kernel.img? Tôi nghĩ rằng nó có chứa zImage + ramdisk nhưng làm thế nào tôi có thể xây dựng cái này?

Ai đó có thể hướng dẫn tôi làm ramdisk và gói hai thứ này vào tập tin kernel.img không? Tôi muốn khởi động kernel này trên Raspberry Pi của tôi.


Đây là một câu hỏi tuyệt vời mà tôi ngạc nhiên chưa được hỏi.
Jivings

Tại sao bạn sử dụng kernel 3.0.1? Là hạt nhân vani này được tìm thấy trên kernel.orgtrang web?
Krzysztof Adamski

vâng, tôi đã tìm thấy cái này từ kernel.org
Chaianu Banerjee

Tôi đã thêm một câu hỏi mới về qemu và hạt nhân mâm xôi pi-2 được biên dịch
chéo

Câu trả lời:


8

tập tin kernel.img

Khi sử dụng kernel Linux, kernel.imgtập tin chỉ được đổi tên linux/arch/arm/boot/Image. Cũng có thể (hoặc ít nhất là có thể lần trước tôi đã kiểm tra) để sử dụng phiên bản nén của tệp này - zImage. Nó có thể chứa tích hợp initramfs(ramdisk) nhưng không bắt buộc. Ví dụ, kernel.imgtập tin chứng khoán không chứa initramfswhile kernel_emergency.img.

Lưu ý: Hướng dẫn biên dịch kernel chính thức trên wiki eLinux đề nghị bạn nên sử dụng imagetool-uncompressed.pycông cụ để chuẩn bị kernel.imgtệp. Nó là cần thiết trong những ngày đầu của RaspberyPi nhưng ngày nay bootloader có thể xử lý các tệp ImagezImagetệp thông thường .

Vấn đề nguồn hạt nhân

Điều rất quan trọng là khi xây dựng kernel cho RaspberryPi, bạn không thể sử dụng bất kỳ phiên bản nào của nó. Chỉ phiên bản đặc biệt được chuyển đến RaspberryPi mới hoạt động. Thật không may, phiên bản ngược dòng hiện tại (tìm thấy trên kernel.orgtrang web) không tương thích với RaspberryPi. Ngoài ra, versatil_configkhông tốt cho RaspberryPi, bạn nên sử dụng bcmrpi_defconfigthay thế (tìm thấy trên các nguồn nhân tương thích RaspberryPi) hoặc bcmrpi_emergency_defconfignếu kế hoạch của bạn về việc sử dụng buildin initramfs.

Hướng dẫn xây dựng hạt nhân

Nơi tốt nhất để lấy các nguồn kernel cho RaspberryPi là trên nền tảng github . Bạn cũng có thể tìm thấy một số giải thích hữu ích về cách lấy nó và cách biên dịch nó trên wiki RasbperryPi chính thức . Đây là phiên bản đơn giản hóa nhỏ của tôi về các bước liên quan (LƯU Ý: Tôi giả sử bạn muốn biên dịch lại kernel. Nó nhanh hơn nhiều và sẽ tạo ra kết quả tương tự nhưng cũng có thể xây dựng kernel trên RaspberryPi):

  1. Tải về toolchain chính thức trên tạo của riêng bạn. Theo cách khác, tôi cho rằng nó đã được cài đặt /usr/bin/arm-linux-gnueabi-*. Nếu bạn có nó ở nơi khác, bạn nên thay đổi CROSS_COMPILEtùy chọn trong tất cả các makelệnh của bạn .

  2. Tới https://github.com/raspberrypi/linux trang web nơi bạn có thể tìm thấy nguồn RapsberryPi hạt nhân chính thức. Bạn có thể tải mã theo hai cách:

    • Là một tệp nén (để sử dụng tùy chọn này, bạn không phải cài đặt gittiện ích và bạn có thể thực hiện việc này ngay cả trên chính RapsberryPi): Nhấp vào ZIPbiểu tượng, một Codetab bên dưới ở đầu trang. Điều này sẽ cho phép bạn tải xuống các tập tin nguồn như ziptập tin. Bạn có thể sử dụng git để làm điều này thay vào đó nhưng điều đó (như được mô tả trên wiki) sẽ cần nhiều không gian và thời gian hơn. Sau đó giải nén tệp để lấy cây nguồn.
    • Sử dụng gittiện ích (điều này không hiệu quả với tôi trên RaspberryPi vì có thể có một lượng RAM nhỏ nhưng có thể hoạt động tốt trên các hệ thống máy tính để bàn ( --depth 1đối số lưu ý ngăn git tải xuống toàn bộ lịch sử phát triển (rất lớn):

      git clone --depth 1 git://github.com/raspberrypi/linux.git
      
  3. Sử dụng cấu hình mặc định được cung cấp bởi nền tảng:

    cp arch/arm/configs/bcmrpi_defconfig .config
    
  4. Chạy make oldconfigvà trả lời một số câu hỏi (nên nhấn enter trong mỗi câu hỏi để lại câu trả lời mặc định):

    make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- oldconfig
    
  5. Biên dịch kernel:

    make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi-
    
  6. Sao chép các mô-đun hạt nhân vào /tmp/modules:

    make ARCH=arm modules_install INSTALL_MOD_PATH=/tmp/modules
    
  7. Sử dụng Imagetập tin nhưkernel.img

  8. Tải lên tất cả các mô-đun từ /tmp/modules/lib/modules/trong máy tính của bạn vào /lib/modules/thư mục trên rootfs RaspberryPi của bạn.

Thêm initramfs

Điều này không cung cấp hướng dẫn về cách tạo initramfs, tuy nhiên. Vì đây là chủ đề rất rộng (về cơ bản, bạn phải tạo ra môi trường không gian người dùng Linux đang hoạt động, thực sự không có giới hạn nào về mức độ phức tạp của nó), bây giờ tôi sẽ không đề cập đến vấn đề này. Tôi sẽ chỉ lưu ý rằng initramfscó thể được sử dụng ở hai dạng khác nhau - dạng độc lập, trong đó tệp riêng biệt và bản dựng trong đó được tích hợp với tệp hình ảnh hạt nhân (giống như trong kernel_emergency.img). Tùy chọn thứ hai nên được hỗ trợ bởi bộ tải khởi động RaspberryPi nhưng có một số tin đồn rằng nó đã bị hỏng trên phiên bản phần sụn hiện tại nên có lẽ bạn nên sử dụng phiên bản dựng.

Cách tốt nhất để bắt đầu là sử dụng nội dung initramfs đang hoạt động (đang được sử dụng cho kernel_emergency.img) bằng cách tải xuống từ kho lưu trữ github nền tảng khác và chỉ sau khi bạn có thể khởi động kernel bằng iniramfshình ảnh này , hãy thử tự xây dựng. Tất cả những gì cần thiết cho việc này là trỏ đến CONFIG_INITRAMFS_SOURCEtùy chọn cấu hình kernel của thư mục đã tải xuống .

Ghi chú cuối cùng

Vì vậy, bạn nên làm điều này trong 3 bước:

  1. Hãy thử xây dựng và khởi động kernel mà không cần initramfstập tin.
  2. Hãy thử thêm initramfsnội dung sẵn sàng vào kernel của bạn.
  3. Thay đổi initramfsnội dung này cho phù hợp với nhu cầu của bạn.

1
Tuyệt vời viết lên, nhưng bạn không nên sử dụng zip; gitchuyển các tập tin một cách hiệu quả và bạn có thể sử dụng depth=1để ngăn chặn lịch sử tải xuống (tôi nghĩ).
Alex Chamberlain

Vâng, điều này là đúng nhưng cố gắng làm điều này trên chính RaspberryPi không phải là ý tưởng hay. Tải xuống zip đang hoạt động rất tốt, mặt khác. Tôi sẽ thêm ghi chú ngắn về việc sử dụng git quá.
Krzysztof Adamski

Biên dịch kernel trên Raspberry Pi là một ý tưởng khủng khiếp.
Alex Chamberlain

@AlexChamberlain: Nó rất chậm nhưng chắc chắn là có thể (tôi đã tự làm việc này). Phải mất một đêm để nó không thực sự xấu. Khác hơn thế, tại sao nó quá khủng khiếp?
Krzysztof Adamski

nếu tôi sử dụng bcmrpi_emergency_defconfig thì nó có chứa initramfs không ??
Chaianu Banerjee

0

Nếu bạn đang chạy cùng một phiên bản Debian trên cả hai, sử dụng X-Apt, dpkg-cross, v.v ... và các công cụ emdebian có thể hoạt động rất tốt.

Nguồn: được sử dụng để phát triển ứng dụng c ++ cho các hệ thống ARM nhúng chạy emdebian.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.