Cara mengkompilasi file tambahan ke direktori root ROM Android

8

Saya sedang membangun kernel Android khusus berdasarkan kode sumber kernel Cyanogenmod ROM. Saya ingin menambahkan folder dan file ke folder root OS ( /). Sebagai contoh, setelah mengkompilasi kernel saya, saya ingin folder tambahan bernama toto(path absolut = /toto) dibuat.

Saya benar-benar tidak tahu file mana yang harus diedit dan bagaimana melakukan pekerjaannya.


Catatan: Jika Anda adalah pengguna Android (bukan pengembang ROM) yang ingin menambahkan file ke Anda rootfs, silakan lihat pertanyaan Android.SE yang relevan sebagai gantinya.

deadeert
sumber
3
Android adalah sistem Linux, tetapi karena pertanyaannya khusus untuk Android, bukan untuk semua Unix. Tempat yang lebih baik adalah di android.stackexchange.com
enedil
@enedil Secara umum, pertanyaan Android di luar topik di sini, karena Android bukan Linux dalam pengertian umum (hanya menggunakan kernel Linux). Namun, pertanyaan yang sama akan berlaku untuk sistem Linux tertanam lainnya, jadi saya pikir tidak masalah di sini.
Gilles 'SO- berhenti bersikap jahat'
@Graeme Sebenarnya, sistem file root dikompilasi ke dalam setiap kernel. Biasanya kosong dan kami membongkar arsip cpio ke dalamnya - gambar initramf kami. Anda dapat memasukkan apa pun yang Anda inginkan di dalamnya pada waktu kompilasi.
mikeserv
@enedil Dalam hal ini, saya yakin pertanyaan ini sepenuhnya sesuai topik. Android berbeda paling banyak dari unix lain di userspace,tetapi dari Linux lain, in-kernelperbedaannya hanya sejumlah kecil tambalan. Faktanya, popularitas Android adalah pendorong utama di balik pengembangan kernel, dan telah berlangsung selama beberapa tahun. Lihatlah changelogs dari kernel.org dan tentukan sendiri seberapa relevan banyak hal dengan sistem seluler - khususnya Android.
mikeserv
Pertanyaan serupa di Android.SE: Bagaimana cara membongkar dan mengedit boot.imguntuk porting ROM? : jawaban di sana menjelaskan cara mengambil dan mengedit boot.imgfile, memungkinkan untuk terus mengubah konten direktori root perangkat.
WhiteWinterWolf

Jawaban:

7

Pada Android, seperti pada banyak sistem berbasis Linux, kernel pertama gunung sebuah initramfs di /. Initramf disimpan dalam RAM; itu dimuat dari arsip CPIO yang disimpan bersama dengan kernel itu sendiri (atau di tempat lain di mana bootloader dapat menemukannya).

Sebagian besar sistem Linux desktop memiliki initramfs kecil yang berisi cukup banyak program dan file konfigurasi untuk me-mount sistem file root sebenarnya, yang kemudian dipasang /, menggantikan initramfs. Android, seperti beberapa sistem Linux tertanam, membuat initramfs terpasang selamanya. Initramfs Android hanya berisi /init, adbddan beberapa file konfigurasi.

Untuk Cyanogenmod, Anda dapat menemukan instruksi pembuatan di panduan porting . Anda ingin menyalin lebih banyak file ke ramdisk (gambar initramfs, dalam terminologi Android), jadi Anda perlu menambahkannya ke PRODUCT_COPY_FILESdaftar di device_*.mkmakefile untuk perangkat Anda.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Sebenarnya file initramfs gambar kita adalah yang berisi file-file konfigurasi, sistem initramfs file dikompilasi ke dalam setiap kernel.
mikeserv
1
@ mikeserv Saya mengundang Anda untuk membiasakan diri dengan konsep metonymy . Menulis teknis menggunakannya kurang dari pidato biasa, tetapi kadang-kadang mendapatkan penggunaan.
Gilles 'SO- berhenti menjadi jahat'
Saya akan melakukannya, tetapi pertama-tama saya harus memeriksanya di kamus ...
mikeserv
Anda membuat poin yang sangat bagus, dan seperti yang saya katakan sebelumnya, satu-satunya alasan saya bersikeras tentang hal ini adalah sepertinya itu sangat sedikit dipahami tetapi itu benar-benar sangat mudah, jadi saya cenderung mengacaukan topik ini - yang saya minta maaf . Saya hanya berpikir akan lebih mudah untuk menunjukkan kepada orang lain betapa mudahnya untuk merekayasa sistem Anda sendiri dari kernel jika detail di atas dibuat jelas. Sekali lagi, aku minta maaf, Gilles, maksudku tidak menghina sama sekali.
mikeserv
@ mikeserv Terima kasih atas saran Anda. Saya menemukan file yang digunakan untuk menyalin gumpalan (blbs.mk). Saya masih tidak mengerti file mana yang harus diedit untuk menambahkan folder folder di rootfs (/). Saya dapat mengakses file init * .rc dari rom, tetapi sekarang saya tidak mengeditnya (dengan menambahkan mkdir / titi misalnya) file-file ini akan memungkinkan saya untuk menambah folder saya secara permanen (/ titi). Setelah apa saya akan menambahkan dalam file PRODUCT_COPY_FILES + = / titi / myfile: <localpath> / myfiles. Ada petunjuk? Terima kasih lagi
deadeert
1

Kernel docs menjelaskan cara mengemas gambar ke dalam kernel itu sendiri. Dari kernel.org :

Apa itu rootfs?

Rootfsadalah contoh khusus dari ramfs(atau tmpfs, jika itu diaktifkan), yang selalu ada di sistem 2.6. Anda tidak dapat mengrootfs - unmount dengan alasan yang kira-kira sama dengan Anda tidak dapat mematikan proses init; Daripada memiliki kode khusus untuk memeriksa dan menangani daftar kosong, ini lebih kecil dan sederhana untuk kernel untuk memastikan daftar tertentu tidak menjadi kosong.

Sebagian besar sistem hanya memasang sistem file lain rootfsdan mengabaikannya. Jumlah ruang contoh kosong ramf mengambil kecil.

Jika CONFIG_TMPFS diaktifkan, rootfsakan digunakan tmpfsalih-alih ramfssecara default. Untuk memaksa ramfs, tambahkan "rootfstype=ramfs"ke baris perintah kernel.

Apa itu initramfs?

Semua kernel Linux 2.6 berisi"cpio"arsip formatgzip, yang diekstraksi ke dalam rootfsketika kernel boot. Setelah mengekstraksi, kernel memeriksa untuk melihat apakahrootfsberisi file"init" , dan jika demikian dieksekusi sebagai PID 1. Jika ditemukan,initproses ini bertanggung jawab untuk membawa sistem ke sisa jalan, termasuk menemukan dan memasang perangkat root sebenarnya ( jika ada). Jikarootfstidak mengandunginitprogram setelahcpioarsiptertanamdiekstraksi ke dalamnya, kernel akan jatuh ke kode yang lebih lama untuk menemukan dan me-mount partisi root, kemudian jalankan beberapa varian/sbin/initdari itu.

Semua ini berbeda dari initrd lama dalam beberapa cara:

  • Initrd lama selalu merupakan file terpisah, sedangkan arsip initramfs ditautkan ke citra kernel linux. (Direktori linux - * / usr dikhususkan untuk membuat arsip ini selama pembuatan.)

  • File initrd yang lama adalah imej filesystem gzip (dalam beberapa format file, seperti ext2, yang membutuhkan driver yang dibangun ke dalam kernel), sedangkan arsip initramfs yang baru adalah arsip cpio yang di-gzip (seperti tar hanya lebih sederhana, lihat cpio (1) dan Dokumentasi / awal-userspace / buffer-format.txt). Kode ekstraksi cpio kernel tidak hanya sangat kecil, tetapi juga teks dan data yang dapat dibuang selama proses boot.

  • Program dijalankan oleh initrd lama (yang disebut / initrd, bukan / init) melakukan beberapa pengaturan dan kemudian kembali ke kernel, sedangkan program init dari initramfs tidak diharapkan untuk kembali ke kernel. (Jika / init perlu melepaskan kontrol, ia dapat overmount / dengan perangkat root baru dan mengeksekusi program init lain. Lihat utilitas switch_root, di bawah ini.)

  • Saat mengganti perangkat root lain, initrd akan pivot_root dan kemudian umount ramdisk. Tetapi initramfs adalah rootfs: Anda tidak bisa pivot_root rootfs, maupun unmount. Alih-alih hapus semua dari rootfs untuk membebaskan ruang (find -xdev / -exec rm '{}' ';'), overmount rootfs dengan root baru (cd / newmount; mount --move. /; Chroot.), lampirkan stdin / stdout / stderr ke / dev / console baru, dan exec init baru.

Karena ini adalah proses yang sangat gigih (dan melibatkan menghapus perintah sebelum Anda dapat menjalankannya), paket klibc memperkenalkan program pembantu (utils / run_init.c) untuk melakukan semua ini untuk Anda. Sebagian besar paket lain (seperti busybox) menamai perintah ini "switch_root".

Populasi initramfs:

Proses build kernel 2.6 selalu membuat arsip initramfs berformat cpio gzip dan menautkannya ke dalam biner kernel yang dihasilkan. Secara default, arsip ini kosong (menghabiskan 134 byte pada x86).

Pilihan konfigurasi CONFIG_INITRAMFS_SOURCE (di Umum Pengaturan di menuconfig,dan tinggal di usr/Kconfig) dapat digunakan untuk menentukan sumber untuk initramfsarsip, yang akan secara otomatis dimasukkan ke biner yang dihasilkan. Opsi ini dapat menunjuk ke * arsip yang ada gzip cpio*, direktori yang berisi file yang akan diarsipkan, atau spesifikasi file teks seperti contoh berikut:

 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

Jalankan " usr/gen_init_cpio" (setelah kernel membangun) untuk mendapatkan pesan penggunaan yang mendokumentasikan format file di atas.

Satu keuntungan dari file konfigurasi adalah rootakses tidak diperlukan untuk mengatur izin atau membuat node perangkat dalam arsip baru.

(Perhatikan bahwa dua contoh entri "file" berharap menemukan file bernama " init.sh" dan " busybox" di direktori yang disebut " initramfs", di bawah linuxdirektori -2.6. *. Lihat Dokumentasi / awal-ruang pengguna / README untuk detail lebih lanjut.)

Kernel tidak tergantung pada cpioalat eksternal . Jika Anda menentukan direktori alih-alih file konfigurasi, infrastruktur build kernel membuat file konfigurasi dari direktori tersebut ( usr/Makefilepanggilan scripts/gen_initramfs_list.sh), dan mulai mengemas direktori tersebut menggunakan file konfigurasi (dengan memasukkannya ke usr/gen_init_cpio, yang dibuat dari usr/gen_init_cpio.c). cpioKode pembuatan waktu pembuatan kernel sepenuhnya mandiri, dan ekstraktor waktu boot kernel juga (jelas) mandiri.

mikeserv
sumber