[Tutorial] [Xperia™ U] Cómo usar la función dual boot
Publicado: 22 Nov 2013, 13:09
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 (también para modelos Sola y Go).
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:
He de agradecer a NoobCoder 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.
Fuente y últimas actualizaciones en este enlace.
¡Un saludo!
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:
- Root.
- Bootloader desbloqueado.
- Modo depuración para tener conexión con Android Debug Bridge (ADB).
- Saber utilizar Flashtool.
- Editor de texto en UNIX/UTF-8 (recomiendo Notepad++).
- Concentración y entender en todo momento lo que se está haciendo.
Bueno, pues dicho esto, empezamos:
- Cómo arrancar la ROM actual desde Xperia Boot Menu.
- Cómo crear las particiones donde instalar la ROM secundaria y cómo arrancarla.
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:Spoiler: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:Spoiler:
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:Resultado:Spoiler:Ahora es cuando me explico y empiezo de cháchara otra vez.Spoiler:
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.
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:Spoiler:Y con esto tenemos preparadas nuestras particiones para instalar en ellas nuestra ROM secundaria. Ahora vamos al cómo instalarla y arrancarla.Spoiler:
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.Spoiler:
Si lo hay, seguid aquí:Si no lo hay, seguid aquí:Spoiler:Spoiler:
Para empaquetar el RAM disk ya editado, ejecutad estos comandos: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?Spoiler:
Para el error de segmentación, mira esto: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.Spoiler:
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 cosas que hacer en el script:- Eliminar la función inicial "assert":Spoiler:
- 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:Spoiler:
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:- 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. - Eliminar la función inicial "assert":
- Cómo eliminar en un futuro las particiones adiciones y, por tanto, la ROM secundaria.
Tan sencillo como borrar manualmente la carpeta que contiene las particiones y flasheando con Flashtool en modo fastboot el kernel que queráis para vuestra ROM principal, eliminando así el Xperia Boot Menu.
También, para que funcionen el WiFi y demás, tendréis que sustituir los módulos en /system/lib/modules/ por los de vuestra ROM o vuestro kernel y darle a todos permisos 644 (rw- r-- r--).
Así de simple.
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. 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 del 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 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:
Spoiler:
Spoiler:
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
Spoiler:
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
recovery/
initrd.gz
zImage
settings.ini
Spoiler:
NUEVO (22/11/2013): Aquí tenéis otro boot preparado por mí también para la Nightly 22-11-2013 de CyanogenMod 11. Podéis utilizarlo tal cual o para comparar con todo lo que explico en este tutorial. Clic aquí.
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, 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.
Nota: 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. Así, se cargan directamente los que haya en el RAM disk, 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. 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:
Spoiler:
He de agradecer a NoobCoder 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.
Fuente y últimas actualizaciones en este enlace.
¡Un saludo!