android x86_iso_img_make - mehome/openthos GitHub Wiki

#android-x86 ISO生成原理和步骤初步分析

##生成原理

根据对bootable/newinstaller/目录下的Android.mk文件的阅读,android-x86的ISO镜像主要由以下几部分构成:

  • 启动引导文件夹boot(内含efi文件夹和isolinux文件夹)

    • efi文件夹:内含boot文件夹,在boot文件夹内含有一个grub.cfg文件。疑似是efi启动方式的grub引导。其具体内容可能与生成目标的选择(iso_img或efi_img)相关
    • isolinux文件夹:内含安装界面相关文件,用于生成安装界面的图形和逻辑。
  • ramdisk.img

  • initrd.img

  • install.img

  • 系统内核kernel:即编译过程中通过源码编译生成的kernel

  • 系统镜像system.img(或system.sfs具体扩展名取决于是否使用squashfs):根据Android.mk文件中的内容,其中规定了一个变量用来标识是否使用了squashfs,若使用了squashfs会将系统img压缩的相当小,其扩展名也会改变为sfs,若未使用则会相对大一些,扩展名为img。

##生成步骤

既然知道了ISO里面的内容,对生成步骤的考量就简单了一些。通过对Android.mk文件的阅读,我们能够发现这样一个大致的ISO生成步骤:

  • 生成开始前,这些内容已经通过编译产生

    • 系统镜像(system.img或者system.sfs)
    • 用来封装成initrd.img的全部内容
    • 用来封装成install.img的全部内容
    • ramdisk.img文件
    • boot文件夹内的全部内容
    • 系统内核文件kernel(或是指定好的prebuilt kernel)
  • 生成过程

    • 第一步先确定系统镜像的位置
    • 之后将initrd.img压制完成
    • 将install.img压制完成
    • 确定boot文件夹内的内容
    • 将上述内容设置为ISO_IMAGE的依赖文件
    • 确定生成目标的文件名
    • 根据所选目标进行镜像文件的生成(生成iso文件或者支持efi的img文件)
  • 生成方法 iso的生成采用了genisoimage指令。由于对该指令的细节尚不是很了解,在这里首先贴上成功编译的记录文件中对该指令的记录

genisoimage -vJURT -b isolinux/isolinux.bin -c isolinux/boot.cat \
	-no-emul-boot -boot-load-size 4 -boot-info-table \
	-input-charset utf-8 -V "Android-x86 LiveCD" -o out/target/product/x86/android_x86.iso out/target/product/x86/boot out/target/product/x86/ramdisk.img out/target/product/x86/initrd.img out/target/product/x86/install.img out/target/product/x86/system.img out/target/product/x86/kernel

根据对该指令的初步查阅,该指令具体内容如下:

  • -vJURT为生成属性设置:
    • -v为打印出生成细节

    • -J为使用Joliet格式的目录与文件名称

    • -U为允许untranslated的文件名

    • -R为使用使用Rock Ridge Extensions

    • -T为生成TRANS.TBL文件

      上述生成设置使用的详细原因还有待查阅。

  • -b为选择isolinux/isolinux.bin作为开机映像的文件
  • -c为选择将全部的eltorito-catalog内容只作为isolinux/boot.cat文件。
  • -no-emul-boot为标识系统非软盘
  • -boot-load-size 4根据官网提示,是用来防止在部分bios系统下启动失效故将此变量设置为4
  • -boot-info-table 对启动文件优化,直接将其复制即可启动
  • -input-charset utf-8 将镜像内文件名的字符编码设置为utf-8
  • -V "Android-x86 LiveCD" 写入镜像卷标为Android-x86 LiveCD
  • -o 设置镜像的输出位置

根据genisoimage的具体语法规则,在设置好镜像输出位置后需要依次输入要写入镜像的文件。因此在这之后的各个文件目录均为镜像内容,这也与我们实际得到的镜像内容相符合(其中TRANS.TBL文件来自genisoimage命令的-T指令)。

##今后工作 由于对Android.mk文件的具体编写细则还不够了解,今后目标为进一步查阅资料并完整理解Android.mk文件编写目的和详细生成过程,并对该文档进行补完的同时进一步分析ISO生成的关键点。