求助大神:能不能把定制版的ROM修改成grub引导的系统
androidx86吧
全部回复
仅看楼主
level 6
nhb2318 楼主
最近,我研究了一段时间的刷机教程,我的平板是台电的X98Pro,原机自带win10和android5.1,自买入以后一直寻求着RemixOS的适配,因为感觉这个系统最适合平板用了。
后来,Remix OS PC发布了,我安装后没有触摸,没有WIFI,没有声音,不能旋转屏幕。
我继续等待……
等待中,我还尝试着在RemixOS的initrd.img中添加驱动,结果失败。
继续实践……
后来,相近机型X98Plus的RemixOS出来了,我试刷了一下,居然可以启动了,但启动后电量为0%,一拔电源就关机,WIFI能用,触摸能用,我很兴奋,终于找到相近的ROM了,之前我找过很多相近机型的Remix刷机包,均无法启动。
尝试修改……
我把PlusRemix中system.img解包打包,刷入无法开机,卡第一屏不动了,即使是不改变任何东西,单纯的解包打包,刷入后依然不行,我尝试了Linux环境和Windows环境下的各种解包打包工具,make_ext4fs,ROM助手,ROM定制大师,RMXtool等。结果是只要一动Remix的system.img就开不了机了。
再想想别的办法……
能不能把X98Plus的Remix定制包做成RemixPC的安装包,改原来fastboot刷入分区的方法为RemixPC的install安装的方法。
我比较了两种方法所使用的“包”:
台电X98Plus的Remix定制包里面包括:boot.img,system.img,recovery.img,cache.img,afu.bin,ifwi.bin,firmware.bin,gpt.bin,flash.json等,没有initrd.img
而Remix OS PC里包括:
kernel,initrd.img,ramdisk.img,system.img,install.img
两者不同处是:
安装方式不同,定制包刷机是利用fastboot工具,执行flash.json刷机代码,将各个文件直接刷到指定的分区;安装包安装是grub将内核参数Install=1传递给kernel执行install.img,把system.img和ramdisk.img释放到指定的分区,当然也可以不解压,直接把这4个img文件和kernel文件放到一个磁盘或者一个文件夹里,通过grub.cfg来引导和挂载img,从而启动remix系统。
包里文件不同是,定制包里的system.img是sparse ext4 image格式,不可以挂载,必须通过simg2img转化成标准的img,可挂载的那种;而安装包里的system.img是raw ext4 image格式,标准EXT4格式的,是可以挂载的那种。
在硬盘上形成的分区不同,定制包刷机后,我们发现硬盘被gpt.bin分区了许多小分区,1M~10G不等,windows的NTFS分区已经被排到了第15个分区了,有bootloader分区,有androidsystem分区,有data分区,还有cache分区等等;而安装包安装后,只有一个盘,硬盘格式可以是ntfs,也可以是fat32,还可以是ext4的,只需要一个硬盘,只要在EFI分区里把grub引导代码写好就OK了,它会自动detected系统分区,来启动系统。
还有一个关键的不同点是,定制包里没有initrd.img,而安装包里有这个initrd.img,我搜索了一下,网上大多都是解释这个文件作用的,太宏观了,没有一个人真真研究它里面的内容,它的原理。前几日,在贴吧里看到几位大神聊天,提到这个文件,说定制刷机包之所以没有initrd.img,是因为厂家把intrd.img和ramdisk.img,都合并到boot.img里了。
如果真是这样,那么有什么办法把boot.img拆分呢,目前以我的能力只能把boot.img拆分为kernel和ramdisk.img,并不能把initrd.img分离出来,以grub的方式来启动定制包。
请问大神,有没有什么办法?
我们的目的是以grub的方式来启动定制的remixOS,不以bootloader的方式启动。
2016年07月01日 08点07分 1
level 8
你知不知道android ia跟android x86有啥区别?
你这想法三年间无数小白提起过
——来自 爱贴吧 Windows Phone 8.1 客户端
2016年07月01日 09点07分 2
level 8
自己去找自己机型每个模块的linux驱动,交叉编译去
——来自 爱贴吧 Windows Phone 8.1 客户端
2016年07月01日 09点07分 3
level 8
android ia没initrd,安卓手机也没initrd,boot.img里面只有ramdisk和kernel;
android x86的initrd不属于安卓的一部分,之所以android x86只要一个分区,完全因为initrd负责挂载
——来自 爱贴吧 Windows Phone 8.1 客户端
2016年07月01日 09点07分 4
level 8
try_mount()
{
RW=$1; shift
if [ "${ROOT#*:/}" != "$ROOT" ]; then
# for NFS roots, use nolock to avoid dependency to portmapper
RW="nolock,$RW"
fi
# FIXME: any way to mount ntfs gracefully?
mount -o $RW $@ || mount.ntfs-3g -o rw,force $@
}
check_root()
{
if [ "`dirname $1`" = "/dev" ]; then
[ -e $1 ] || return 1
blk=`basename $1`
[ ! -e /dev/block/$blk ] && ln $1 /dev/block
dev=/dev/block/$blk
else
dev=$1
fi
try_mount ro $dev /mnt || return 1
if [ -n "$iso" -a -e /mnt/$iso ]; then
mount --move /mnt /iso
mkdir /mnt/iso
mount -o loop /iso/$iso /mnt/iso
SRC=iso
elif [ ! -e /mnt/$SRC/ramdisk.img ]; then
return 1
fi
zcat /mnt/$SRC/ramdisk.img | cpio -id > /dev/null
if [ -e /mnt/$SRC/system.sfs ]; then
mount -o loop /mnt/$SRC/system.sfs /sfs
mount -o loop /sfs/system.img system
elif [ -e /mnt/$SRC/system.img ]; then
remount_rw
mount -o loop /mnt/$SRC/system.img system
elif [ -d /mnt/$SRC/system ]; then
remount_rw
mount --bind /mnt/$SRC/system system
else
rm -rf *
return 1
fi
mkdir mnt
echo " found at $1"
rm /sbin/mke2fs
hash -r
}
remount_rw()
{
# "foo" as mount source is given to workaround a Busybox bug with NFS
# - as it's ignored anyways it shouldn't harm for other filesystems.
mount -o remount,rw foo /mnt
}
2016年07月01日 10点07分 5
这就是android x86的initrd ——来自 爱贴吧 Windows Phone 8.1 客户端
2016年07月01日 10点07分
@13042819930520 这些代码在哪找到?怎么修改?
2016年07月01日 15点07分
回复 nhb2318 : 就在android x86的initrd.img里面,init这个文件;ramdisk.img里面也有个init文件,这俩init没半毛钱关系 ——来自 爱贴吧 Windows Phone 8.1 客户端
2016年07月01日 16点07分
解包boot.img里面的init,跟androidx86的ramdisk.img的init,性质一样,无法打开这个init,打开是乱码,无法对比它们的区别 ——来自 爱贴吧 Windows Phone 8.1 客户端
2016年07月01日 16点07分
1