[Tutorial] [Xperia™ U] Cómo usar la función dual boot

Moderadores: Kravenbcn, largeroliker, fidelcastro, cerealkiller, pspCaracas, dark_sasuke, m0skit0, LnD, ka69, zacky06

Avatar de Usuario
DaniPhii
Habitual
Habitual
Mensajes: 273
Registrado: 19 Sep 2009, 19:17
PSN ID: DaniPhii
Gamertag Xbox Live: DaniPhii
Twitter: DaniPhii
Ubicación: Spain

[Tutorial] [Xperia™ U] Cómo usar la función dual boot

Mensaje por DaniPhii »

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:

  • 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:

  1. Cómo arrancar la ROM actual desde Xperia Boot Menu.

    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... :roll: ).


    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:

    Código: Seleccionar todo

    adb shell
    su
    cd /storage/sdcard0/tareasboot
    mkdir boot
    Ahora, si vuestro kernel es un boot.img:

    Código: Seleccionar todo

    kernel_dump ./boot boot.img
    Y si es un kernel.elf

    Código: Seleccionar todo

    kernel_dump ./boot kernel.elf
    Resultado:
    Spoiler:
    Tutorial1.PNG
    Veréis que con esos comandos hemos creado una carpeta boot dentro de tareasboot. Pues tenemos que copiar el initrd.gz dentro de la carpeta ICS o JB que hay en bootmenu, dependiendo de la versión de Android que sea nuestra ROM principal. El zImage que ha quedado en la carpeta boot no nos sirve, pues no tiene aplicado el parche KEXEC para que pueda arrancar con Boot Menu. 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 adjunto 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
    Spoiler:

    Código: Seleccionar todo

    [rom-1]
    menutitle=Android ICS
    kernel=/sdcard/bootmenu/ICS/zImage
    ramdisk=/sdcard/bootmenu/ICS/initrd.gz
    cmdline=cachepolicy=writealloc noinitrd init=init zram.enabled=1 board_id=1 logo.nologo root=/dev/ram0 rw rootwait console=null androidboot.console=null androidboot.hardware=st-ericsson mem=96M@0 mem_mtrace=15M@96M mem_mshared=1M@111M mem_modem=16M@112M mem=32M@128M mem_issw=1M@160M hwmem=79M@161M mem=272M@240M mpcore_wdt.mpcore_margin=359
    [rom-2]
    menutitle=CyanogenMod 10.1
    kernel=/sdcard/bootmenu/CM10.1/zImage
    ramdisk=/sdcard/bootmenu/CM10.1/initrd.gz
    cmdline=cachepolicy=writealloc noinitrd init=init zram.enabled=1 board_id=1 logo.nologo root=/dev/ram0 rw rootwait console=null androidboot.console=null androidboot.hardware=st-ericsson mem=96M@0 mem_mtrace=15M@96M mem_mshared=1M@111M mem_modem=16M@112M mem=32M@128M mem_issw=1M@160M hwmem=79M@161M mem=272M@240M mpcore_wdt.mpcore_margin=359
    [rom-3]
    menutitle=Recovery Menu
    kernel=/sdcard/bootmenu/recovery/zImage
    ramdisk=/sdcard/bootmenu/recovery/initrd.gz
    cmdline=cachepolicy=writealloc noinitrd init=init zram.enabled=1 board_id=1 logo.nologo root=/dev/ram0 rw rootwait console=null androidboot.console=null androidboot.hardware=st-ericsson mem=96M@0 mem_mtrace=15M@96M mem_mshared=1M@111M mem_modem=16M@112M mem=32M@128M mem_issw=1M@160M hwmem=79M@161M mem=272M@240M mpcore_wdt.mpcore_margin=359

    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:

    Código: Seleccionar todo

    [rom-1]
    menutitle=Android JB
    kernel=/sdcard/bootmenu/JB/zImage
    ramdisk=/sdcard/bootmenu/JB/initrd.gz
    cmdline=cachepolicy=writealloc noinitrd init=init zram.enabled=1 board_id=1 logo.nologo root=/dev/ram0 rw rootwait console=null androidboot.console=null androidboot.hardware=st-ericsson mem=96M@0 mem_mtrace=15M@96M mem_mshared=1M@111M mem_modem=16M@112M mem=32M@128M mem_issw=1M@160M hwmem=79M@161M mem=272M@240M mpcore_wdt.mpcore_margin=359
    [rom-2]
    menutitle=CyanogenMod 10.1
    kernel=/sdcard/bootmenu/CM10.1/zImage
    ramdisk=/sdcard/bootmenu/CM10.1/initrd.gz
    cmdline=cachepolicy=writealloc noinitrd init=init zram.enabled=1 board_id=1 logo.nologo root=/dev/ram0 rw rootwait console=null androidboot.console=null androidboot.hardware=st-ericsson mem=96M@0 mem_mtrace=15M@96M mem_mshared=1M@111M mem_modem=16M@112M mem=32M@128M mem_issw=1M@160M hwmem=79M@161M mem=272M@240M mpcore_wdt.mpcore_margin=359
    [rom-3]
    menutitle=Recovery Menu
    kernel=/sdcard/bootmenu/recovery/zImage
    ramdisk=/sdcard/bootmenu/recovery/initrd.gz
    cmdline=cachepolicy=writealloc noinitrd init=init zram.enabled=1 board_id=1 logo.nologo root=/dev/ram0 rw rootwait console=null androidboot.console=null androidboot.hardware=st-ericsson mem=96M@0 mem_mtrace=15M@96M mem_mshared=1M@111M mem_modem=16M@112M mem=32M@128M mem_issw=1M@160M hwmem=79M@161M mem=272M@240M mpcore_wdt.mpcore_margin=359
    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.

    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:

    Código: Seleccionar todo

    cmdline=cachepolicy=writealloc noinitrd init=init board_id=1 logo.nologo root=/dev/ram0 rw rootwait console=null androidboot.console=null androidboot.hardware=st-ericsson mem=96M@0 mem_mtrace=15M@96M mem_mshared=1M@111M mem_modem=16M@112M mem=32M@128M mem_issw=1M@160M hwmem=79M@161M mem=272M@240M mpcore_wdt.mpcore_margin=359
    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.

    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:
    Spoiler:

    Código: Seleccionar todo

    adb shell
    su
    df
    Resultado:
    Spoiler:
    Tutorial2.png
    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:
    Spoiler:
    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: Seleccionar todo

    adb shell
    su
    cd /storage/sdcard0/
    mkdir ROM2
    Para crear la partición /system:

    Código: Seleccionar todo

    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: Seleccionar todo

    dd if=/dev/zero of=/storage/sdcard0/ROM2/data.ext4 bs=4096 count=90112
    Para crear la partición /cache:

    Código: Seleccionar todo

    dd if=/dev/zero of=/storage/sdcard0/ROM2/cache.ext4 bs=4096 count=38400
    Resultado:
    Spoiler:
    Tutorial3.png
    Ahora es cuando me explico y empiezo de cháchara otra vez. :lol:
    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. :roll:

    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:
    Spoiler:

    Código: Seleccionar todo

    adb shell

    losetup /dev/block/loop1 /sdcard/ROM2/system.ext4
    losetup /dev/block/loop2 /sdcard/ROM2/data.ext4
    losetup /dev/block/loop3 /sdcard/ROM2/cache.ext4

    make_ext4fs /dev/block/loop1
    make_ext4fs /dev/block/loop2
    make_ext4fs /dev/block/loop3

    e2fsck -f -y /dev/block/loop1
    e2fsck -f -y /dev/block/loop2
    e2fsck -f -y /dev/block/loop3

    tune2fs -o journal_data_writeback /dev/block/loop2
    tune2fs -o journal_data_writeback /dev/block/loop3

    losetup -d /dev/block/loop1
    losetup -d /dev/block/loop2
    losetup -d /dev/block/loop3

    umount /sdcard

    exit
    adb reboot
    Resultado:
    Spoiler:
    Tutorial4.PNG
    Tutorial5.png
    Y con esto tenemos preparadas nuestras particiones para instalar en ellas nuestra ROM secundaria. Ahora vamos al 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:
    Spoiler:

    Código: Seleccionar todo

    adb shell
    su
    cd /data/local/tmp
    mkdir ramdisk
    chmod 644 ./ramdisk
    cd ramdisk
    gunzip < ../initrd.gz | cpio -i -d
    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í:
    Spoiler:
    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:

    Código: Seleccionar todo

    adb shell
    su
    cd /data/local/tmp
    mkdir recovery
    chmod 644 ./recovery
    cd recovery
    gunzip < ../recovery_ramdisk.gz | cpio -i -d
    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:
      Si no está este archivo, ignoradlo, no está en todos los RAM disk.

      Código: Seleccionar todo

      # These declarations must match the mount statements in
      # <buildroot>/device/semc/riogrande/files/init.riogrande.rc

      /data ext4 /dev/block/loop2
      /cache ext4 /dev/block/loop3
      /modemfs ext4 /dev/block/mmcblk0p6
    • init.rc:
      Encuentra la línea:

      Código: Seleccionar todo

      mkdir /system
      Escribe, justo encima de esa línea, esta otra:

      Código: Seleccionar todo

      mkdir /sde
    • recovery.fstab (puede estar en /etc, en la raíz o en ambos directorios):
      Es posible que encontréis ligeras variaciones, dependiendo de la versión del kernel con la que esteis tratando.

      Código: Seleccionar todo

      # mount point fstype device [device2] fstype2

      /boot emmc /dev/null
      /system ext4 /dev/block/loop1
      /data ext4 /dev/block/loop2
      /cache ext4 /dev/block/loop3
      /sdcard vfat /dev/block/mmcblk0p14
      # /sd-ext ext4 /dev/block/mmcblk0p2
      /emmc vfat /dev/block/mmcblk1p1 /dev/block/mmcblk1
    • init.st-ericsson.rc:

      Código: Seleccionar todo

      on fs
      # If you change anything here, make sure to update
      # <root>/vendor/semc/system/bootstrap/masterreset/fstab.riogrande
      # accordingly.

      # Wait for eMMC device to become available
      wait /dev/block/mmcblk0p14

      mkdir /sde
      mount vfat /dev/block/mmcblk0p14 /sde rw
      exec /sbin/losetup /dev/block/loop1 /sde/ROM2/system.ext4
      exec /sbin/losetup /dev/block/loop2 /sde/ROM2/data.ext4
      exec /sbin/losetup /dev/block/loop3 /sde/ROM2/cache.ext4

      # Mount system partition
      mount ext4 /dev/block/loop1 /system ro

      # Mount user data partition
      exec /system/bin/logwrapper /system/bin/e2fsck -y /dev/block/loop2
      setprop ro.crypto.state unsupported
      mount ext4 /dev/block/loop2 /data nosuid nodev noatime noauto_da_alloc

      # Mount cache partition
      mount ext4 /dev/block/loop3 /cache nosuid nodev noatime

      mount ext4 /dev/block/mmcblk0p6 /modemfs nosuid nodev noatime

      # FOTA must be started after partitions are mounted
      # and property service is initialized
      exec /sbin/fota-ua c
    Para ROMs Jelly Bean y KitKat:
    • init.rc
      Encuentra la línea:

      Código: Seleccionar todo

      mkdir /system
      Escribe, justo encima de esa línea, esta otra:

      Código: Seleccionar todo

      mkdir  /sde
    • fstab.st-ericsson

      Código: Seleccionar todo

      # 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 (puede estar en /etc, en la raíz o en ambos directorios):
      Es posible que encontréis ligeras variaciones, dependiendo de la versión del kernel con la que estéis tratando.

      Código: Seleccionar todo

      # mount point fstype device [device2] fstype2

      /boot emmc /dev/null
      /system ext4 /dev/block/loop1
      /data ext4 /dev/block/loop2
      /cache ext4 /dev/block/loop3
      /sdcard vfat /dev/block/mmcblk0p14
      /external_sd vfat /dev/block/mmcblk1p1 /dev/block/mmcblk1
    • init.st-ericsson.rc

      Código: Seleccionar todo

      on fs
      # If you change anything here, make sure to update
      # <root>/vendor/semc/system/bootstrap/masterreset/fstab.riogrande
      # accordingly.

      setprop ro.crypto.state unsupported

      wait /dev/block/mmcblk0p14
      mkdir /sde
      mount vfat /dev/block/mmcblk0p14 /sde rw wait
      exec /sbin/losetup /dev/block/loop1 /sde/ROM2/system.ext4
      exec /sbin/losetup /dev/block/loop2 /sde/ROM2/data.ext4
      exec /sbin/losetup /dev/block/loop3 /sde/ROM2/cache.ext4
      exec /sbin/e2fsck -y /dev/block/loop2

      mount_all fstab.st-ericsson
    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í:

    Código: Seleccionar todo

    adb shell
    su
    cd /data/local/tmp
    chmod 644 ./recovery
    mkbootfs ./recovery | gzip > recovery_ramdisk.gz
    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í:
    Spoiler:
    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:
      Si no está este archivo, ignoradlo, no está en todos los RAM disk.

      Código: Seleccionar todo

      # These declarations must match the mount statements in
      # <buildroot>/device/semc/riogrande/files/init.riogrande.rc

      /data ext4 /dev/block/loop2
      /cache ext4 /dev/block/loop3
      /modemfs ext4 /dev/block/mmcblk0p6
    • init.rc:
      Encuentra la línea:

      Código: Seleccionar todo

      mkdir /system
      Escribe, justo encima de esa línea, esta otra:

      Código: Seleccionar todo

      mkdir /sde
    • recovery.fstab (puede estar en /etc, en la raíz o en ambos directorios):
      Es posible que encontréis ligeras variaciones, dependiendo de la versión del kernel con la que esteis tratando.

      Código: Seleccionar todo

      # mount point fstype device [device2] fstype2

      /boot emmc /dev/null
      /system ext4 /dev/block/loop1
      /data ext4 /dev/block/loop2
      /cache ext4 /dev/block/loop3
      /sdcard vfat /dev/block/mmcblk0p14
      # /sd-ext ext4 /dev/block/mmcblk0p2
      /emmc vfat /dev/block/mmcblk1p1 /dev/block/mmcblk1
    • init.st-ericsson.rc:

      Código: Seleccionar todo

      on fs
      # If you change anything here, make sure to update
      # <root>/vendor/semc/system/bootstrap/masterreset/fstab.riogrande
      # accordingly.

      # Wait for eMMC device to become available
      wait /dev/block/mmcblk0p14

      mkdir /sde
      mount vfat /dev/block/mmcblk0p14 /sde rw
      exec /sbin/losetup /dev/block/loop1 /sde/ROM2/system.ext4
      exec /sbin/losetup /dev/block/loop2 /sde/ROM2/data.ext4
      exec /sbin/losetup /dev/block/loop3 /sde/ROM2/cache.ext4

      # Mount system partition
      mount ext4 /dev/block/loop1 /system ro

      # Mount user data partition
      exec /system/bin/logwrapper /system/bin/e2fsck -y /dev/block/loop2
      setprop ro.crypto.state unsupported
      mount ext4 /dev/block/loop2 /data nosuid nodev noatime noauto_da_alloc

      # Mount cache partition
      mount ext4 /dev/block/loop3 /cache nosuid nodev noatime

      mount ext4 /dev/block/mmcblk0p6 /modemfs nosuid nodev noatime

      # FOTA must be started after partitions are mounted
      # and property service is initialized
      exec /sbin/fota-ua c
    Para ROMs Jelly Bean y KitKat:
    • init.rc
      Encuentra la línea:

      Código: Seleccionar todo

      mkdir /system
      Escribe, justo encima de esa línea, esta otra:

      Código: Seleccionar todo

      mkdir  /sde
    • fstab.st-ericsson

      Código: Seleccionar todo

      # 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 (puede estar en /etc, en la raíz o en ambos directorios):
      Es posible que encontréis ligeras variaciones, dependiendo de la versión del kernel con la que estéis tratando.

      Código: Seleccionar todo

      # mount point fstype device [device2] fstype2

      /boot emmc /dev/null
      /system ext4 /dev/block/loop1
      /data ext4 /dev/block/loop2
      /cache ext4 /dev/block/loop3
      /sdcard vfat /dev/block/mmcblk0p14
      /external_sd vfat /dev/block/mmcblk1p1 /dev/block/mmcblk1
    • init.st-ericsson.rc

      Código: Seleccionar todo

      on fs
      # If you change anything here, make sure to update
      # <root>/vendor/semc/system/bootstrap/masterreset/fstab.riogrande
      # accordingly.

      setprop ro.crypto.state unsupported

      wait /dev/block/mmcblk0p14
      mkdir /sde
      mount vfat /dev/block/mmcblk0p14 /sde rw wait
      exec /sbin/losetup /dev/block/loop1 /sde/ROM2/system.ext4
      exec /sbin/losetup /dev/block/loop2 /sde/ROM2/data.ext4
      exec /sbin/losetup /dev/block/loop3 /sde/ROM2/cache.ext4
      exec /sbin/e2fsck -y /dev/block/loop2

      mount_all fstab.st-ericsson
    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:
    Spoiler:

    Código: Seleccionar todo

    adb shell
    su
    cd /data/local/tmp
    chmod 644 ./ramdisk
    mkbootfs ./ramdisk | gzip > initrd.gz
    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? :D

    Para el error de segmentación, mira esto:
    Spoiler:
    Ocurre porque hay un binario repetido en tu ROM. Es el mkbootfs y está en /sbin. Si lo borras y acto seguido conectas el teléfono en modo ADB e intentas hacerlo, no debe de haber error alguno.

    Hago hincapié en lo de "acto seguido" porque, si reinicias el teléfono, volverás a tener ese binario en esa carpeta. Esto ocurre porque el binario se encuentra en la carpeta de igual nombre dentro del RAM disk del kernel que usas para arrancar la ROM, es en el arranque cuando se vuelve a cargar dicho binario en la RAM y volverás a tener ese mismo problema. Para solucionarlo definitivamente, como ya sabes desempaquetar, editar y reempaquetar un RAM disk, simplemente desempaquetas el RAM disk de tu ROM principal (cosa que no hemos necesitado hacer en ninguna otra ocasión, pero en este caso habría que hacerlo), borras el binario en cuestión, reempaquetas y listo para usar tu ROM principal en un futuro sin necesidad de estar borrando ese binario en cuestión cada vez que quieras reempaquetar un RAM disk desde ADB.
    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 cosas que hacer en el script:

    • Eliminar la función inicial "assert":
      Spoiler:

      Código: Seleccionar todo

      assert(getprop("ro.product.device") == "ST25i" || getprop("ro.build.product") == "ST25i" || 
             getprop("ro.product.device") == "ST25a" || getprop("ro.build.product") == "ST25a" ||
             getprop("ro.product.device") == "kumquat" || getprop("ro.build.product") == "kumquat");
    • 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:

      Código: Seleccionar todo

      package_extract_file("boot.img", "/dev/block/mmcblk0p9");
    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! ;)

    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. :D


  3. 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.
    :D

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!
No tiene los permisos requeridos para ver los archivos adjuntos a este mensaje.
PSP-2004 ZY · TA-085v1 · 6.60 ME-2.3

Responder