Cách biên dịch các tệp bổ sung vào thư mục gốc của ROM Android


8

Tôi đang xây dựng kernel Android tùy chỉnh dựa trên mã nguồn kernel của Cyanogenmod ROM. Tôi muốn thêm các thư mục và tệp vào thư mục gốc của HĐH ( /). Chẳng hạn, sau khi đã biên dịch kernel của tôi, tôi muốn tạo một thư mục bổ sung có tên toto(perfect path = /toto) để tạo.

Tôi thực sự không biết tập tin nào phải chỉnh sửa và cách thực hiện công việc.


Lưu ý: Nếu bạn là người dùng Android (không phải nhà phát triển ROM) muốn thêm tệp vào của bạn rootfs, vui lòng xem câu hỏi Android.SE có liên quan thay thế.


3
Android là một hệ thống Linux, nhưng như câu hỏi dành riêng cho Android, không phải cho tất cả các Unix. Nơi tốt hơn cho nó là trên android.stackexchange.com
enedil

@enedil Nói chung, các câu hỏi của Android không có chủ đề ở đây, vì Android không phải là Linux theo nghĩa thông thường (nó chỉ sử dụng nhân Linux). Tuy nhiên, câu hỏi tương tự sẽ được áp dụng cho các hệ thống nhúng Linux khác, vì vậy tôi nghĩ rằng nó ổn ở đây.
Gilles 'SO- ngừng trở nên xấu xa'

@Graeme Trên thực tế, hệ thống tập tin gốc được biên dịch vào mọi kernel. Thông thường nó trống và chúng tôi giải nén một kho lưu trữ cpio vào nó - hình ảnh initramfs của chúng tôi. Bạn có thể đặt bất cứ thứ gì bạn muốn trong đó vào thời gian biên dịch.
mikeerv

@enedil Trong trường hợp này, tôi tin rằng câu hỏi này hoàn toàn thuộc chủ đề. Android khác với hầu hết các bản unix khác trong userspace,nhưng với các Linux khác, sự in-kernelkhác biệt chỉ là một số bản vá. Trên thực tế, sự phổ biến của Android là một động lực chính thúc đẩy sự phát triển hạt nhân và đã được một vài năm. Hãy xem các thay đổi kernel.org và tự quyết định mức độ phù hợp của nhiều hệ thống di động - cụ thể là Android.
mikeerv

Một câu hỏi tương tự trên Android.SE: Làm cách nào để giải nén và chỉnh sửa boot.imgđể chuyển ROM? : câu trả lời ở đó giải thích cách tìm nạp và chỉnh sửa boot.imgtệp, cho phép liên tục thay đổi nội dung thư mục gốc của thiết bị.
WhiteWinterWolf

Câu trả lời:


7

Trên Android, giống như trên nhiều hệ thống dựa trên Linux, hạt nhân trước tiên gắn kết một initramfs trên /. Các initramfs được lưu trữ trong RAM; nó được tải từ kho lưu trữ CPIO được lưu trữ cùng với chính kernel (hoặc ở một nơi khác nơi bộ nạp khởi động có thể tìm thấy nó).

Hầu hết các hệ thống Linux trên máy tính để bàn đều có một initramfs nhỏ chứa vừa đủ các chương trình và tệp cấu hình để gắn kết hệ thống tập tin gốc thực sự, sau đó được gắn vào /, thay thế các initramfs. Android, giống như một số hệ thống nhúng Linux, giữ cho các initramfs được gắn kết mãi mãi. Initramfs Android chỉ chứa /init, adbdvà một vài tập tin cấu hình.

Đối với Cyanogenmod, bạn có thể tìm thấy hướng dẫn xây dựng trong hướng dẫn chuyển . Bạn muốn sao chép nhiều tệp hơn vào ramdisk (hình ảnh initramfs, theo thuật ngữ Android), vì vậy bạn cần thêm chúng vào PRODUCT_COPY_FILESdanh sách trong tệp tạo tệp device_*.mkcho thiết bị của mình.


Trên thực tế tệp initramfs hình ảnh của chúng tôi là những gì chứa các tệp cấu hình đó, initramfs hệ thống tệp được biên dịch vào mọi kernel.
mikeerv

1
@mikeerv Tôi mời bạn làm quen với khái niệm hoán dụ . Viết kỹ thuật sử dụng nó ít hơn so với lời nói thông thường, nhưng nó được sử dụng thường xuyên.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi sẽ làm như vậy, nhưng trước tiên tôi phải kiểm tra nó trong từ điển ...
mikeerv

Bạn đưa ra một quan điểm rất tốt, và như tôi đã nói trước đây, lý do duy nhất tôi kiên quyết về điều này là có vẻ như nó rất ít hiểu nhưng nó thực sự rất thẳng thắn, vì vậy tôi có xu hướng tìm hiểu về chủ đề này - vì tôi xin lỗi . Tôi chỉ nghĩ rằng sẽ dễ dàng hơn để cho người khác thấy việc thiết kế hệ thống của bạn từ kernel trở nên đơn giản hơn nếu chi tiết trên được làm rõ. Một lần nữa, tôi xin lỗi, Gilles, ý tôi là không xúc phạm điều gì.
mikeerv

@mikeerv Cảm ơn lời khuyên của bạn. Tôi định vị tệp được sử dụng để sao chép các đốm màu (blbs.mk). Tôi vẫn không hiểu tập tin nào phải được chỉnh sửa để thêm thư mục thư mục tại rootfs (/). Tôi có thể truy cập vào các tệp init * .rc của rom, nhưng hiện tại tôi không chỉnh sửa (bằng cách thêm mkdir / titi), các tệp này sẽ cho phép tôi thêm vĩnh viễn các thư mục của mình (/ Titi). Sau đó, tôi sẽ thêm vào tệp PRODUCT_COPY_FILES + = / titi / myfile: <localpath> / myfiles. Có manh mối nào không? Cảm ơn một lần nữa
deadeert

1

Các tài liệu kernel giải thích cách đóng gói một hình ảnh vào chính kernel. Từ kernel.org :

Rootfs là gì?

Rootfslà một phiên bản đặc biệt của ramfs(hoặc tmpfs, nếu được bật), luôn có trong 2.6 hệ thống. Bạn không thể ngắt kết nốirootfs với cùng một lý do mà bạn không thể giết tiến trình init; thay vì có mã đặc biệt để kiểm tra và xử lý một danh sách trống, hạt nhân nhỏ hơn và đơn giản hơn để đảm bảo các danh sách nhất định không thể trở nên trống rỗng.

Hầu hết các hệ thống chỉ gắn kết hệ thống tập tin khác rootfsvà bỏ qua nó. Lượng không gian mà một ramfs trống chiếm rất ít.

Nếu CONFIG_TMPFS được bật, rootfssẽ sử dụng tmpfsthay vì ramfstheo mặc định. Để buộc ramfs, thêm "rootfstype=ramfs"vào dòng lệnh kernel.

Initramfs là gì?

Tất cả các nhân Linux Linux chứa một"cpio"kho lưu trữ định dạng đượcnén, được trích xuất rootfskhi kernel khởi động. Sau khi giải nén, kiểm tra hạt nhân để xem nếurootfscó chứa một tập tin"init" , và nếu như vậy nó thực thi nó như PID 1. Nếu tìm thấy, nàyinitquá trình chịu trách nhiệm về việc đưa hệ thống phần còn lại của con đường lên, bao gồm định vị và gắn các thiết bị gốc thực ( nếu có). Nếurootfskhông chứainitchương trình sau khicpiolưu trữnhúngđược trích xuất vào nó, kernel sẽ chuyển sang mã cũ hơn để xác định vị trí và gắn kết phân vùng gốc, sau đó thực hiện một số biến thể trong/sbin/initsố đó.

Tất cả điều này khác với initrd cũ theo nhiều cách:

  • Các initrd cũ luôn là một tệp riêng biệt, trong khi kho lưu trữ initramfs được liên kết với hình ảnh kernel linux. (Thư mục linux - * / usr được dành để tạo kho lưu trữ này trong quá trình xây dựng.)

  • Tệp initrd cũ là một hình ảnh hệ thống tập tin được nén (ở một số định dạng tệp, chẳng hạn như ext2, cần một trình điều khiển được tích hợp trong kernel), trong khi kho lưu trữ initramfs mới là một kho lưu trữ cpio được nén (như chỉ đơn giản là tar, xem cpio (1) và Tài liệu / không gian người dùng sớm / bộ đệm-format.txt). Mã trích xuất cpio của kernel không chỉ cực kỳ nhỏ, mà còn là __init văn bản và dữ liệu có thể bị loại bỏ trong quá trình khởi động.

  • Chương trình được chạy bởi initrd cũ (được gọi là / initrd, không phải / init) đã thực hiện một số thiết lập và sau đó quay trở lại kernel, trong khi chương trình init từ initramfs dự kiến ​​sẽ không quay trở lại kernel. (Nếu / init cần tắt điều khiển, nó có thể vượt qua / với một thiết bị gốc mới và thực hiện một chương trình init khác. Xem tiện ích switch_root, bên dưới.)

  • Khi chuyển đổi một thiết bị gốc khác, initrd sẽ p Pivot_root và sau đó vượt qua ramdisk. Nhưng initramfs là rootfs: bạn không thể root pfs_root, cũng không ngắt kết nối nó. Thay vào đó, hãy xóa mọi thứ ra khỏi rootfs để giải phóng không gian (find -xdev / -exec rm '{}' ';'), vượt qua rootfs bằng root mới (cd / newmount; mount --move. /; Chroot.), đính kèm stdin / stdout / stderr vào new / dev / console và thực thi init mới.

Vì đây là một quá trình khó khăn đáng chú ý (và liên quan đến việc xóa các lệnh trước khi bạn có thể chạy chúng), gói klibc đã giới thiệu một chương trình trợ giúp (utils / run_init.c) để làm tất cả điều này cho bạn. Hầu hết các gói khác (như busybox) đã đặt tên cho lệnh này là "switch_root".

Khởi tạo dân cư:

Quá trình xây dựng kernel 2.6 luôn tạo ra một kho lưu trữ initramfs định dạng được nén và liên kết nó với tệp nhị phân kernel. Theo mặc định, kho lưu trữ này trống (tiêu thụ 134 byte trên x86).

Tùy chọn cấu hình CONFIG_INITRAMFS_SOURCE (trong Cài đặt chung trong menuconfig,và sống usr/Kconfig) có thể được sử dụng để chỉ định nguồn cho initramfskho lưu trữ, sẽ tự động được kết hợp vào nhị phân kết quả. Tùy chọn này có thể trỏ đến một kho lưu trữ * đã được nén * hiện cócpio , một thư mục chứa các tệp sẽ được lưu trữ hoặc một đặc tả tệp văn bản, ví dụ như sau:

 dir /dev 755 0 0
 nod /dev/console 644 0 0 c 5 1
 nod /dev/loop0 644 0 0 b 7 0
 dir /bin 755 1000 1000
 slink /bin/sh busybox 777 0 0
 file /bin/busybox initramfs/busybox 755 0 0
 dir /proc 755 0 0
 dir /sys 755 0 0
 dir /mnt 755 0 0
 file /init initramfs/init.sh 755 0 0

Chạy " usr/gen_init_cpio" (sau khi xây dựng kernel) để nhận thông báo sử dụng ghi lại định dạng tệp ở trên.

Một lợi thế của tệp cấu hình rootlà không cần truy cập để đặt quyền hoặc tạo các nút thiết bị trong kho lưu trữ mới.

(Lưu ý rằng hai mục nhập "tệp" ví dụ này sẽ tìm thấy các tệp có tên " init.sh" và " busybox" trong thư mục có tên " initramfs", trong thư mục linux-2.6. *. Xem Tài liệu / không gian người dùng sớm / README để biết thêm chi tiết.)

Hạt nhân không phụ thuộc vào các cpiocông cụ bên ngoài . Nếu bạn chỉ định một thư mục thay vì tệp cấu hình, cơ sở hạ tầng xây dựng của kernel sẽ tạo một tệp cấu hình từ thư mục đó ( usr/Makefilecác cuộc gọi scripts/gen_initramfs_list.sh) và tiến hành đóng gói thư mục đó bằng tệp cấu hình (bằng cách cung cấp cho nó usr/gen_init_cpio, được tạo từ đó usr/gen_init_cpio.c). cpioMã tạo thời gian xây dựng của kernel hoàn toàn khép kín và trình trích xuất thời gian khởi động của kernel cũng (rõ ràng) là khép kín.

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.