[ST25] [UB] DUAL BOOT (arrancar más de un sistema con Xperia Boot Menu)
Gracias nuevamente a Munjeni, uno de los mejores desarrolladores de software para smartphones Xperia™, ahora tenemos la posibilidad de instalar más de una ROM (dual boot) en nuestro Xperia™ U.
De momento podemos arrancar con dual boot ROMs Ice Cream Sandwich, Jelly Bean y KitKat, pero no descarto que en un futuro podamos usar también ROMs Gingerbread. Solo necesitaríamos que alguien aplicara el parche KEXEC a un kernel de Gingerbread.
Si seguís bien el tutorial no tendréis por qué tener ningún problema, pero que quede claro que no me responsabilizo de cualquier daño que le hagáis a vuestro Xperia™ U. Cualquier duda, ya sabéis que para contestar estoy. Como siempre, tened una copia de vuestra NAND actualizada por si no os sale bien.
Requisitos:
Bueno, pues dicho esto, empezamos: 1. Cómo arrancar la ROM actual desde Xperia Boot Menu.
(Click para mostrar/ocultar)
1.1. Lo primero que tenéis que hacer es descargar este fichero (mirror aquí) que contiene todo lo necesario (aparte de los requisitos) para empezar. Dentro veréis unas carpetas numeradas, para que también vayáis por orden y a la par de los pasos que describo aquí.
Seguid la instrucción de la carpeta 1. Cuando tengáis la carpeta bootmenu en vuestra memoria interna (la de la ROM no, donde tenéis las fotos, música, etc.), entrad dentro y os explico su estructura para que la entendáis.
Tenemos tres carpetas llamadas CM10.1, ICS y JB, las cuales contienen un kernel y un RAM disk cada una, correspondientes a cada ROM que podremos arrancar (en nuestro caso serán dos de ellas). La carpeta recovery contiene un menú Recovery por si no tenemos Recovery en la ROM actual (de aquí en adelante, será la ROM principal: si tenéis Recovery en dicha ROM, no será necesaria la carpeta recovery). Además tenemos un settings.ini. Las únicas carpetas que tienen una estructura completa son CM10.1 y recovery. Dentro de cada una hay un archivo zImage, el cual es el kernel, y un archivo initrd.gz, es decir, el RAM disk. El kernel en esas dos carpetas y en la carpeta JB es para ROMs Jelly Bean. El RAM disk de CM10.1 ya está editado por mí para arrancar una ROM CyanogenMod 10.1 desde la carpeta donde crearemos posteriormente las particiones, la carpeta ROM2 dentro de la memoria interna. El kernel en la carpeta ICS es para ROMs Ice Cream Sandwich. Todos los kernels están parcheados con el parche KEXEC para poder arrancar con la funcionalidad dual boot. Las carpetas incluidas aquí en bootmenu no pueden contener espacios en su nombre, pues al intentar arrancar la ROM a la que haga referencia desde el Boot Menu, dará error.
¿Hasta aquí todo claro? ¿Más o menos? Si tenéis alguna duda, ya sabéis para qué está el hilo: preguntad todo lo que queráis. Bien, ahora paso a explicaros el settings.ini. Si lo abris, entenderéis mejor el funcionamiento. Tenéis tres arranques casi configurados, pero nos vamos a fijar en el segundo para entenderlos todos, miremos el de la ROM CyanogenMod 10.1. Como podéis ver, por cada arranque hay cuatro opciones configurables: el título, la ruta del kernel, la ruta del RAM disk y la línea de comandos. La que no vamos a tener que editar es la línea de comandos, pues está preparada en cada caso ya para nuestro Xperia™ U. Habría que editarla si el kernel que usáis asigna valores distintos de RAM y dichas modificaciones las podéis consultar también al desempaquetar el boot.img. Las otras tres opciones de cada arranque, que son el título y las rutas del kernel y el RAM disk, las editaremos al menos en la [rom-1]. El título que le pongáis puede ser directamente el nombre de vuestra ROM principal, y en las rutas, tenéis que cambiar el main por ICS o JB según sea la versión de vuestra ROM principal. Podéis añadir un máximo de 9 arranques, pero tenemos espacio limitado en nuestra memoria interna, así que no podrán ser más de 4 aproximadamente (aunque pa' qué tantas, si con 2 va que chuta, jajaja... ).
1.2. Ahora vamos a extraer el RAM disk y el kernel de vuestra ROM principal. Para ello, necesitaremos copiar en /system/bin las herramientas de la carpeta 2 del fichero adjunto. Hay que dar permisos 755 (rwx r-x r-x) a las 5 herramientas y reiniciar el terminal para aplicar bien los cambios.
Tenéis que extraer el boot.img (o el kernel.elf si no es el caso) que tengáis actualmente instalado en vuestra ROM (o podéis aprovechar para instalar un nuevo kernel) y colocarlo en vuestra memoria interna, en una carpeta nueva y llamadla tareasboot por ejemplo. Después, conectad el teléfono en modo depuración y conectad con él mediante ADB en un símbolo del sistema. Entonces, ejecutad los siguientes comandos:
(Click para mostrar/ocultar)
Código:
adb shell
su
cd /storage/sdcard0/tareasboot
mkdir boot
Ahora, si vuestro kernel es un boot.img:
Código:
kernel_dump ./boot boot.img
Y si es un kernel.elf
Código:
kernel_dump ./boot kernel.elf
Resultado:
Veréis que con esos comandos hemos creado una carpeta boot dentro de tareasboot. Pues tenemos que copiar el initrd.gz y el zImage dentro de la carpeta ICS o JB que hay en bootmenu, dependiendo de la versión de Android que sea nuestra ROM principal. Si el zImage no tiene aplicado el parche KEXEC para que pueda arrancar con Boot Menu, no serviría. Por eso he incluido en el adjunto dos kernel preparados para usar en dos carpetas distintas, uno para ICS y otro para JB. No tenemos aún un kernel GB con el parche KEXEC, pero cuando esté disponible, actualizaré el tutorial para que quien quiera pueda usar GB con la funcionalidad dual boot.
La estructura de carpetas ha de ser la siguiente:
Para aquellos que tengan ICS como ROM principal:
CM10.1
initrd.gz (este ya estaba en el ZIP)
zImage
ICS
initrd.gz (el resultante de la extracción)
zImage
JB
zImage
recovery
initrd.gz
zImage
settings.ini
Para aquellos que tengan JB como ROM principal:
CM10.1
initrd.gz (este ya estaba en el ZIP)
zImage
ICS
zImage
JB
initrd.gz (el resultante de la extracción)
zImage (el resultante de la extracción solo en caso de tener el parche KEXEC, en caso negativo será el que ya venía incluido)
recovery
initrd.gz
zImage
settings.ini
La ROM principal tiene que estar en [rom-1] para que al encender el móvil, sin tocar ninguna tecla, sea la que se ejecute por defecto en unos segundos, aunque eso lo podéis cambiar cuando tengáis instalada una segunda ROM.
1.3. Para poder instalar el Xperia Boot Menu, tan solo tenéis que flashear el boot_menu.img que hay en la carpeta 3 del adjunto mediante Flashtool en modo fastboot. Si no sabéis cómo hacer este paso, buscad una guía sobre cómo utilizar Flashtool.
1.4. Cuando arranquéis el teléfono, os aparecerá por primera vez el Boot Menu con los distintos arranques configurados en settings.ini. Esperad si queréis o seleccionad directamente la ROM principal y arrancadla (tercer botón naranja para seleccionar). Una vez arrancada la ROM, los que no hayan sobrescrito el zImage incluido por el resultante de vuestra extracción, os habréis quedado sin WiFi. Para arreglarlo, tenéis que copiar los módulos en la carpeta 4, los que correspondan a vuestra versión de Android, en /system/lib/modules y darle permisos 644 (rw- r-- r--) a todos los ficheros copiados y sobrescritos. Una vez hecho, reiniciáis y volverá a funcionar el WiFi. Si conseguís ir bien hasta aquí, podéis continuar con el siguiente bloque de instrucciones.Aclaración: la sustitución de los módulos del WiFi depende del kernel que queráis instalar para arrancar vuestra ROM. Hay kernels con el parche KEXEC ya aplicado (Experimental, Nemesis...) y no hay necesidad de sustituir módulos en vuestra ROM, pues normalmente ya vienen integrados en el RAM disk. Pero cuando no es así, vendrían incluidos en el ZIP de instalación, por lo que habría que sustituirlos por eso. Cuando es así (es decir, cuando van incluidos en el RAM disk), se cargan directamente los que haya ahí, ignorando los que hay en el directorio /system/lib/modules. Para instalar un kernel diferente del que incluyo en el ZIP que habéis descargado (el cual es de Munjeni), tan solo tenéis que desempaquetar el boot.img correspondiente al kernel deseado y sustituir tanto el zImage como el initrd.gz, tal y como he indicado anteriormente. Os recuerdo que también tendréis que sustituir parte de la línea de comandos que arranca el kernel. El archivo cmdline contiene las asignaciones de memoria concretas para ese kernel. Por eso tendréis que modificar esos parámetros en el fichero settings.ini.
Para que sepáis a qué parámetros me refiero, aquí dejo un ejemplo:
Ahora podéis seguir con la siguiente parte del tutorial.
2. Cómo crear las particiones donde instalar la ROM secundaria y cómo arrancarla.
(Click para mostrar/ocultar)
2.1. Para poder continuar, tenemos que tener espacio libre suficiente, yo recomiendo bastante más de 1 GB (1,5 GB estará bien). Necesitamos crear 3 particiones, las cuales serán system.ext4, data.ext4 y cache.ext4. El tamaño que asignéis a la partición system.ext4 tendrá que ser siempre algo mayor que el tamaño descomprimido de la ROM secundaria que queráis instalar más las Google Apps también, si es que las queréis instalar posteriormente, claro.
Ahora os proporciono los comandos a ejecutar para obtener información sobre los dispositivos, crear y preparar las particiones. Para ello, tenéis que tener encendido vuestro teléfono y conectado en modo depuración.
Podemos ver los dispositivos que tiene nuestro teléfono entrando en /dev/block/, y veremos que hay distintos dispositivos loop. La idea será montar nuestras nuevas particiones en tres de esos dispositivos disponibles. En nuestro caso, usaremos los dispositivos (bloques) loop1, loop2 y loop3. Pero no me adelantaré más a los acontecimientos, sigamos por orden.
Ejecutad en un símbolo del sistema lo siguiente:
Resultado:
Como veis, he marcado en rojo ciertas cosas a tener en cuenta. Las tres particiones /system, /data y /cache, en las que se encuentra nuestra ROM principal, están montadas en los dispositivos mmcblk0p10, mmcblk0p11 y mmcblk0p12, respectivamente. El tamaño total de estas particiones viene expresado en bloques de 1 KB, es decir, viene expresado en kilobytes. Por ejemplo:
Tamaño de /system: 1032088 1K-blocks = 1032088 × 1 = 1032088 KB
1032088 KB ÷ 1024 KB = 1007,898 MB ≅ 1 GB
Ahora pasamos a crear las particiones. Para ello, os muestro los comandos a seguir, pero no los ejecutéis hasta que los hayáis entendido con mi explicación posterior a ellos. Cerrad el símbolo del sistema y abrid uno nuevo para seguir mejor los pasos.
Comandos:
(Click para mostrar/ocultar)Para comenzar un shell superusuario en ADB (como antes) y crear un nuevo directorio (llamado ROM2) en nuestra memoria interna, donde crearemos nuestras particiones:
Código:
adb shell
su
cd /storage/sdcard0/
mkdir ROM2
Para crear la partición /system:
Código:
dd if=/dev/zero of=/storage/sdcard0/ROM2/system.ext4 bs=4096 count=166400
losetup /dev/block/loop1 /storage/sdcard0/ROM2/system.ext4
blkid /dev/block/mmcblk0p10
mke2fs -T ext4 -O has_journal,extent,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize -U UUID_que_devuelve_blkid -I 256 /dev/block/loop1
Para crear la partición /data:
Código:
dd if=/dev/zero of=/storage/sdcard0/ROM2/data.ext4 bs=4096 count=90112
Para crear la partición /cache:
Código:
dd if=/dev/zero of=/storage/sdcard0/ROM2/cache.ext4 bs=4096 count=38400
Resultado:
Ahora es cuando me explico y empiezo de cháchara otra vez. ![risitas](https://static.htcmania.com/images/caritas/risitas.gif)
Si no os gusta leer tanto, no leáis, pero luego no os quejéis de haberle hecho algo al teléfono y que no funcione bien el dual boot.
Tras crear la carpeta ROM2 con el comando mkdir, procedemos a crear las particiones. En la que me centraré para explicar el proceso es obviamente en la partición /system. Para el comando dd, NUNCA (repito, NUNCA) intercambiéis de lugar los valores de los parámetros if y of porque podéis brickear el teléfono. El parámetro bs especifica el tamaño en bytes que tendrá cada bloque y el parametro count el número de bloques (los valores marcados en rojo en la captura de pantalla). Esto, en el caso de /system, quiere decir que tendremos 166400 bloques de 4096 B (4 KB). Entonces:
Tamaño de /system: 166400 4K-blocks = 166400 × 4 = 665600 KB
665600 KB ÷ 1024 KB = 650 MB
Podéis hacer particiones de un tamaño mayor o menor. Eso lo dejo a vuestra elección, aunque yo recomiendo que hagáis particiones de un tamaño algo mayor al que vayáis a usar.
Para averiguar el número de bloques que queréis que tenga vuestra partición (es decir, el valor a introducir en el parámetro count), podéis calcularlo multiplicando por 256 el tamaño deseado en MB. Ejemplo:
Si x = 500 MB,
y = 256x = 256 × 500 = 128000 4K-blocks.
Tarda un poco en crearse cada partición (en mi caso system.ext4 ha tardado algo más de un minuto, lo podéis ver en la captura de pantalla). Con el número de bloques que os propongo, la ROM secundaria os ocupará en total 1,125 GB (1 GB y 128 MB). Os recomiendo un mínimo de 0,5 GB de memoria libre después de este proceso. Incluso podéis crear las particiones desde vuestro mismo teléfono con los mismos comandos, pero es más tedioso que con ADB y lo que tarda menos es despreciable:
El comando losetup monta la partición que queramos en el dispositivo loop que le indiquemos (comando en color verde). Puede que al intentar ejecutar este comando os devuelva"losetup: not found". Esto se debe a la versión de BusyBox que tenéis instalada en vuestra ROM. Con la versión 1.20.1 no tendréis problemas.
Si el problema persiste, puede que sea problema de vuestra ROM principal (o del kernel) y tengáis que usar otra (u otro kernel). Como último recurso podéis probar, antes de cambiarla, desde un terminal en Android siendo superusuario, pero no os aseguro nada, por eso recomiendo que cambiéis de kernel o ROM. ![rolleyes2](https://static.htcmania.com/images/caritas/rolleyes2.gif)
El comando blkid nos proporciona el UUID de una partición, en nuestro caso el de la partición mmcblk0p10, es decir, la partición /system de nuestra ROM principal (valor en hexadecimal en color azul). ¿Para qué? Para que al dar formato a nuestra nueva partición del sistema de la ROM secundaria arranque correctamente. Si no, no podríamos arrancar el sistema de la ROM secundaria por muy bien que la instalemos en la partición. Por ello, especificamos el UUID de nuestra partición /system en nuestra nueva partición system.ext4 con el parámetro -U en el comando mke2fs.
¿Cómo vais hasta aquí? Si seguís todos los pasos bien, no tenéis que tener problema alguno. Ahora, tenéis que desconectar el teléfono, apagarlo y quedaros en el Xperia Boot Menu. Para parar la cuenta atrás, moveros alguna vez por las opciones. Entonces, conectad de nuevo el teléfono. Tendréis acceso ADB, a menos que tengáis que reinstalar el driver porque vuestro PC no lo reconozca del mismo modo que con el sistema Android arrancado.
Una vez consigáis tener acceso ADB desde el Xperia Boot Menu, ejecutad estos comandos:
Resultado:
(Click para mostrar/ocultar)Tutorial4.PNG Tutorial5.png
Si hubiera algún problema con alguna partición en algún momento, recurrid siempre primero al comando e2fsck para comprobar errores. Por ejemplo, en la siguiente captura vemos que la partición /data había sufrido daños:
Tutorial6.png
Así, repararíamos los errores en las particiones y posteriormente solo sería necesario un wipe de las cachés para arrancar la ROM secundaria con normalidad.
El comando make_ext4fs da un formato completo a las particiones y prepara el sistema de archivos para que sea utilizable (y sobre todo, formateable desde el Recovery).
El comando e2fsck comprueba el sistema de archivos una vez creado para verificar que todos los bloques de memoria están correctos.
El comando tune2fs sirve para predeterminar ciertas opciones cada vez que las particiones /data y /cache sean montadas en los dispositivos loop2 y loop3 respectivamente. En concreto, configuran esas dos particiones para que, en caso de un cierre sucio del sistema, pueda conservarse la información sin que se dañe (lo cual no es necesario para la partición /system, pues donde hay un continuo flujo de datos es en las otras particiones).
Una vez hayamos terminado, tendremos preparadas nuestras particiones para instalar en ellas nuestra ROM secundaria. Ahora vamos a ver cómo instalarla y arrancarla.
2.2. Aquí vamos a ver cómo modificar el RAM disk de nuestra ROM secundaria, dependiendo de si es una ROM Ice Cream Sandwich, Jelly Bean o KitKat.
Mientras que para arrancar nuestra ROM principal solamente tuvimos que colocar el RAM disk del kernel de nuestra ROM en su correspondiente carpeta, para la ROM secundaria tenemos que editarlo, no podemos dejarlo tal cual. Si lo dejáramos tal cual, el RAM disk montaría las particiones de nuestra ROM principal, cosa que no nos interesa. Lo que queremos es que el RAM disk editado monte las particiones que hemos creado previamente para trabajar solo sobre ellas.
Tenemos que extraer el RAM disk del kernel de la ROM que queráis instalar como secundaria igual que extrajimos el de nuestra ROM principal en el apartado 1.2. Para no confundir ningún archivo, os recomiendo que borréis todo el contenido de la carpeta tareasboot, aunque de todos modos vamos a trabajar en un directorio diferente. Cuando hayáis extraído el initrd.gz a la carpeta tareasboot, dentro de /data/local/tmp y darle permisos 644.
Ahora ejecutad estos comandos para desempaquetarlo:
Una vez desempaquetado el RAM disk a la carpeta ramdisk, mirad dentro y comprobad si hay o no un fichero llamado recovery_ramdisk.gz en la carpeta sbin.
Si lo hay, seguid aquí:
(Click para mostrar/ocultar)El fichero recovery_ramdisk.gz es el menú Recovery, que viene empaquetado aparte y monta las particiones por su cuenta, entonces también hay que editarlo para evitar cualquier interacción con la ROM primaria. Como ya hemos desempaquetado el RAM disk del kernel, el procedimiento restante en este caso es este: desempaquetar, editar y volver a empaquetar el RAM disk del Recovery, sustituir el Recovery en la carpeta sbin por el que hemos editado, y editar y volver a empaquetar el RAM disk del kernel.
Para desempaquetar el RAM disk del Recovery, copiadlo también a /data/local/tmp, dadle permisos 644 y ejecutad estos comandos para desempaquetarlo:
Ahora copiad la carpeta recovery a la memoria interna y de ahí al PC. Editaremos los siguientes archivos con Notepad++ o cualquier otro editor de texto UNIX/UTF-8:
Para ROMs Ice Cream Sandwich:
fstab:
init.rc
recovery.fstab (puede estar en /etc, en la raíz o en ambos directorios):
init.st-ericsson.rc:
Para ROMs Jelly Bean y KitKat:
init.rc
fstab.st-ericsson
(Click para mostrar/ocultar)
Código:
# Android fstab file.
# <src> <mnt_point> <type> <mnt_flags and options> <fs_mgr_flags>
# The filesystem that contains the filesystem checker binary (typically /system) cannot
# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK
/dev/block/mmcblk0p6 /modemfs ext4 noatime,nosuid,nodev,nomblk_io_submit,errors=panic wait,check
/dev/blockloop1 /system ext4 ro wait
/dev/blockloop2 /data ext4 noatime,nosuid,nodev,nomblk_io_submit,errors=panic wait,check
/dev/blockloop3 /cache ext4 noatime,nosuid,nodev,nomblk_io_submit,errors=panic wait,check
recovery.fstab (puede estar en /etc, en la raíz o en ambos directorios):
init.st-ericsson.rc
Si notáis que falta algún archivo que editar en el RAM disk del Recovery, no os preocupéis, editad como os indico los que aparezcan, porque tendréis que volver a consultar estas modificaciones ahora después cuando editéis el RAM disk del kernel. Antes de eso, vamos a empaquetar el RAM disk editado del Recovery y a colocarlo en su sitio.
Copiad la carpeta recovery de vuelta a /data/local/tmp , borrando antes la carpeta que ya hay allí y también el recovery_ramdisk.gz para evitar confusiones. Ahora, conectando mediante ADB reempaquetamos el RAM disk del Recovery así:
Después de esto, deberéis tener un nuevo recovery_ramdisk.gz en la carpeta /data/local/tmp. Este es el que tenemos que copiar en la carpeta /data/local/tmp/ramdisk/sbin, sobreescribiendo el que ya había. Y ahora nos toca editar los archivos de la carpeta ramdisk.
Para ello, hay que hacer el mismo proceso que con la carpeta recovery, pero esta vez con la carpeta ramdisk. Copiad la carpeta, como antes, a la memoria interna y de ahí a vuestro PC para trabajar sobre ella. Volvemos a hacer uso de Notepad++ para editar los mismos ficheros citados anteriormente y del mismo modo. Cuando hayáis terminado de editar los archivos de texto, copiad la carpeta al lugar donde estaba, en /data/local/tmp. Os recomiendo borrar el initrd.gz que hay en estos momentos en la carpeta tmp, para evitar confusiones al igual que antes.
Si no lo hay, seguid aquí:
(Click para mostrar/ocultar)Copiad la carpeta ramdisk entera a vuestro PC para trabajar sobre ella. Ahora es cuando haremos uso de Notepad++ o cualquier otro editor de texto UNIX/UTF-8. Editaremos los siguientes ficheros, dependiendo de si el RAM disk es de una ROM Ice Cream Sandwich o una Jelly Bean.
Para ROMs Ice Cream Sandwich:
fstab:
init.rc
recovery.fstab
init.st-ericsson.rc:
Para ROMs Jelly Bean y KitKat:
init.rc
fstab.st-ericsson
(Click para mostrar/ocultar)
Código:
# Android fstab file.
# <src> <mnt_point> <type> <mnt_flags and options> <fs_mgr_flags>
# The filesystem that contains the filesystem checker binary (typically /system) cannot
# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK
/dev/block/mmcblk0p6 /modemfs ext4 noatime,nosuid,nodev,nomblk_io_submit,errors=panic wait,check
/dev/block/loop1 /system ext4 ro wait
/dev/block/loop2 /data ext4 noatime,nosuid,nodev,nomblk_io_submit,errors=panic wait,check
/dev/block/loop3 /cache ext4 noatime,nosuid,nodev,nomblk_io_submit,errors=panic wait,check
recovery.fstab
init.st-ericsson.rc
Cuando hayáis terminado de editar los archivos de texto, copiad la carpeta al lugar donde estaba, en la carpeta data/local/tmp. Recomiendo borrar el initrd.gz que hay en estos momentos en la carpeta tmp, para evitar confusiones y para comprobar que los siguientes comandos generan uno nuevo.
Para empaquetar el RAM disk ya editado, ejecutad estos comandos:
Resultado (tanto de la extracción como del reempaquetado, en la captura trabajé sobre otros directorios y en Android Terminal, pero el resultado es el mismo):
Como comprobaréis, tenéis un nuevo initrd.gz en la carpeta tmp si todo ha ido bien. Ese initrd.gz es el que tenéis que colocar en una carpeta como las que ya tenéis en la carpeta bootmenu, junto al zImage correspondiente ya sea para ICS o JB, y además crear una entrada nueva en el fichero settings.ini siguiendo la misma sintaxis. Este RAM disk editado permite montar las nuevas particiones para flashear la ROM secundaria y arrancarla desde el Xperia Boot Menu. Genial, ¿no? ![Smile](https://static.htcmania.com/images/caritas/smile.gif)
Para el error de segmentación, pasad por este post.
Como veis, yo ya incluyo una carpeta llamada CM10.1 con el RAM disk de dicha ROM editada por mí mismo para montar las particiones creadas en el directorio ROM2 como a lo largo de todo este tutorial (esto quiere decir que, si habéis creado las particiones en otro directorio, no os servirá). Esto es un regalo que les hago a aquellos que se sientan demasiado torpes para seguir este proceso y quieran tener como ROM secundaria la cada vez más perfeccionada CyanogenMod 10.1. Ahora explico lo último que queda por hacer, algo que es obligatorio para aquellos que quieran ahorrarse este punto 2.2 y quieran tener dual boot con CM 10.1 como ROM secundaria.
2.3. Para terminar, tenemos que hacer algunas modificaciones en el script del ZIP que instalará nuestra ROM como secundaria.
El script en el ZIP está en "META-INF\com\google\android\updater-script" (editadlo también con Notepad++).
Estas son las modificaciones que hacer en el script:
- Eliminar la función inicial "assert":
- Sustituir "mmcblk0p10" cada vez que aparezca por "loop1".
- Sustituir "mmcblk0p11" cada vez que aparezca por "loop2".
- Sustituir "mmcblk0p12" cada vez que aparezca por "loop3".
- Eliminar la función que flashea el kernel. Para ello, busca "boot.img" o "kernel.elf", dependiendo del formato del kernel que haya en el ZIP, y borra la función que lo flashea. Ejemplo:
Una vez hayáis terminado, actualizar el script en el ZIP con compresión "deflate" o "store" (dependiendo de si usáis 7-Zip o WinRAR), copiadlo a la memoria interna, reiniciad el teléfono, iniciar la ROM secundaria, entrar en el Recovery de la ROM secundaria, formatear /system, /data y /cache, instalar el ZIP y reiniciad el teléfono de nuevo. Ahora ya debería de arrancar tanto una ROM como otra si habéis hecho todo como indico. ¡Disfrutad! ![green](https://static.htcmania.com/images/caritas/icon_mrgreen.gif) Opcional: ya que la mayoría de veces que instalamos una ROM se regenera el ID de dispositivo de forma aleatoria, cuando iniciéis sesión en vuestra cuenta de Google desde la ROM secundaria, el teléfono será detectado como si fuera otro distinto. Para solucionar esto, os recomiendo hacer al menos que hagáis una copia de seguridad (la que queráis) desde Titanium Backup, reiniciéis y arranquéis vuestra ROM secundaria, instaléis Titanium Backup en ella y abridlo. El primer mensaje que recibiréis (aparte del de dar permisos root, obviamente) será sobre el ID de vuestro dispositivo. Ahí podéis decidir si restaurar con el ID que tenéis en vuestra ROM principal para que vuestro teléfono sea el mismo para los servicios de Google tanto usando una ROM como otra, o bien dejar intacto ese ID, para lo cual os recomendaría que cambiéis la ruta en la que vayáis a hacer copia de seguridad en vuestra ROM secundaria. Pero, ante todo, yo recomiendo conservar el mismo ID en ambas ROMs. Es lo más sencillo y lo menos problemático.
Posible error menor, pendiente por solucionar: puede ocurrir que después de usar un tiempo ambas ROMs (o nada más empezar a usarlas), hay un bug menor relativo a los datos que guardan las ROMs en una partición común, la /storage/sdcard0/.android_secure (donde se guardan aplicaciones trasladadas de la partición /data al almacenamiento interno, y/o datos de las mismas, aunque también datos de aplicaciones de sistema). Los efectos de este bug son los siguientes, de mayor a menor grado:
- Si tenemos una aplicación instalada solo en una de las dos ROMs, cuando arranquemos aquella en la que no esté instalada, puede dañarse o eliminarse, por lo que tendremos que reinstalarla en la ROM donde la tuviéramos instalada.
- El contenido multimedia no es detectado por aplicaciones de sistema como Galería, Apollo, etcétera. Tampoco es detectado por aplicaciones de usuario.
- Si el contenido es total o parcialmente detectado, la información de nuestras pistas de música descargada de la red se corrompe tanto en la ROM principal como en la ROM secundaria.
- Al realizar alguna captura de pantalla o alguna fotografía, puede que de error de memoria. Si no da error, la captura o fotografía en cuestión podrá verse desde la Galería, pero no se verá ni rastro de las capturas y fotografías realizadas desde la ROM principal.
De momento hay que estar a la espera de que se solvente este bug, pero es un poco raro porque a algunos les pasa y a otros no. Depende de diversos factores, pero como siempre, seguramente tenga una solución que, sencilla o no, trataré de explicar por aquí lo mejor posible.
3. Cómo eliminar en un futuro las particiones adiciones y, por tanto, la ROM secundaria.
EXPERIMENTAL. Cómo modificar la tabla de particiones para instalar la ROM secundaria fuera del almacenamiento interno.
(Click para mostrar/ocultar)
Próximamente desarrollaré esta sección más a fondo (aquí es donde surgió mi idea).
¿Para qué servirá esto? Para que en lugar de usar dispositivos loop que monten nuestras particiones, dispondremos de tres particiones lógicas más en los 8 GB de memoria interna que tiene nuestro teléfono. Así, nuestras particiones EXT4 dejarán de estar alojadas en nuestra partición FAT32 (nuestro almacenamiento interno). Para conseguirlo, reparticionaremos parte del espacio disponible en la partición extendida /dev/block/mmcblk0p4, concretamente el espacio disponible desde la partición 10 a la 14, ambas inclusive. Si no entendemos lo que hacemos aquí, hay riesgo de convertir nuestro teléfono en un bonito pisapapeles (y como bien dije al principio, no me responsabilizo del daño que le hagáis a vuestro teléfono).
Mi propuesta es pasar de esta tabla de particiones por defecto...
... a otra similar a esta:
Esta modificación está sujeta a cualquier cambio. En esta propuesta es obvia la preferencia que se le daría a la ROM primaria. Como ya sabemos, las particiones de la ROM primaria son las particiones 10, 11 y 12. La partición 14 corresponde al almacenamiento interno. Las particiones 15, 16 y 17 serían las correspondientes a la ROM secundaria (/system, /data y /cache respectivamente, al igual que las particiones 10, 11 y 12). Los tamaños pueden variarse para tener más espacio donde se desee, pero hay que calcularlo bien todo.
Ya entraré en detalles cuando lo haga en mi teléfono para colocar capturas de pantalla de todo el proceso. ![sonrisa](https://static.htcmania.com/images/caritas/sonrisa.gif)
¡Ya lo he hecho! ![platato](https://static.htcmania.com/images/caritas/platano_bailon2.gif)
Aquí veis el resultado y el estado de la eMMC de mi teléfono:
He sufrido percances y sustos en este proceso, así que elaboraré esta parte del tutorial para que no tengáis problemas. ![green2](https://static.htcmania.com/images/caritas/green2.gif)
Para particionar así la memoria he hecho uso de fdisk, cuyo binario está incluido en el Xperia Boot Menu y es accesible desde ADB. Entraré más adelante en explicar cómo lo he usado.
Mejoras que surgen de esta modificación:
- Tenemos control total sobre el tamaño de las particiones. Si no queremos ROM secundaria en particiones lógicas, podemos calcular valores nuevos para tener el mismo número de particiones pero con 5 GB o más de almacenamiento interno en lugar de los 4 GB por defecto, restando espacio a las particiones del sistema (esto es muy útil para quienes escuchan mucha música, ven muchos vídeos e instalan pocas aplicaciones, por poner un ejemplo).
- Podemos formatear nuestro almacenamiento interno sin perder nuestra ROM secundaria. Esto es conveniente por si alguna vez necesitamos formatear nuestro almacenamiento interno (por algún error o daño en el sistema de archivos debido a una transferencia de datos interrumpida por error, etcétera). Lo único a tener en cuenta es que tendremos que reponer la carpeta bootmenu con las configuraciones, kernels y RAM disks de nuestras ROMs para poder arrancarlas desde Xperia Boot Menu.
Inconvenientes que surgen de esta modificación:
- CWM deja de servirnos como Recovery, solo podemos usar TWRP usemos el kernel que usemos o instalemos la ROM que sea. No me preguntéis por qué, pero las nuevas particiones se dañan por completo cuando se formatean con CWM. Solo desde TWRP he conseguido dejarlas en perfecto estado.
- No podremos usar Flashtool para reinstalar una ROM de stock como principal. Flashtool prepara la tabla de particiones por defecto para instalar una ROM de stock, por lo que cualquier ROM que queramos instalar en nuestras particiones tendrá que ser a través de TWRP. Si usamos Flashtool, nuestra tabla de particiones volverá a su estado original y con la ROM de stock elegida, por lo que perderemos todo (almacenamiento interno y todo lo relativo a nuestras ROMs).
Aquí os muestro qué habría que hacer para editar RAM disks e instalar ROMs en las nuevas particiones:
(Click para mostrar/ocultar)
Estos cambios están algo desactualizados (sobre todo para modificar el RAM disk de un Recovery TWRP), pero sirven como guía para hacer correctamente las modificaciones. Todo archivo que lleve fstab escrito en su nombre es muy seguro que necesita ser modificado.
Diferencias en la modificación de RAM disks para arrancar ROMs instaladas en las particiones 15, 16 y 17:
Para ROMs Ice Cream Sandwich:
fstab:
recovery.fstab
init.st-ericsson.rc:
Para ROMs Jelly Bean y KitKat:
fstab.st-ericsson
(Click para mostrar/ocultar)
Código:
# Android fstab file.
# <src> <mnt_point> <type> <mnt_flags and options> <fs_mgr_flags>
# The filesystem that contains the filesystem checker binary (typically /system) cannot
# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK
/dev/block/mmcblk0p6 /modemfs ext4 noatime,nosuid,nodev,nomblk_io_submit,errors=panic wait,check
/dev/block/mmcblk0p15 /system ext4 ro wait
/dev/block/mmcblk0p16 /data ext4 noatime,nosuid,nodev,nomblk_io_submit,errors=panic wait,check
/dev/block/mmcblk0p17 /cache ext4 noatime,nosuid,nodev,nomblk_io_submit,errors=panic wait,check
recovery.fstab
Y estas son las diferencias en el script:
- Sustituir "mmcblk0p10" cada vez que aparezca por "mmcblk0p15".
- Sustituir "mmcblk0p11" cada vez que aparezca por "mmcblk0p16".
- Sustituir "mmcblk0p12" cada vez que aparezca por "mmcblk0p17".
Si pasa tiempo sin que actualice esta sección y queréis saber más, podéis escribirme por privado, os atenderé lo antes posible.
He de agradecer a AGONTUK y a Munjeni que hayan hecho posible mi tutorial, porque si no fuera por su dedicación y su esfuerzo, yo no habría aprendido nada de lo que aquí explico para que otros (sobre todo quienes no saben inglés) lo puedan entender mejor si es posible.
Última edición por DaniPhii Día 05/08/14 a las 20:22:31.
Razón: nueva sección donde en un futuro explicaré cómo modificar la tabla de particiones y así poder instalar la ROM secundaria fuera del almacenamiento interno.
|