J'ai également crypté le /data
(sur mon Samsung I9300) et je voulais le réinitialiser pour une mise à niveau. Cela a échoué avec l'erreur que vous avez mentionnée, /tmp/recovery.log
contient :
ClockworkMod Recovery v6.0.3.2
recovery filesystem table
=========================
0 /tmp ramdisk (null) (null) 0
1 /efs ext4 /dev/block/mmcblk0p3 (null) 0
2 /boot emmc /dev/block/mmcblk0p5 (null) 0
3 /recovery emmc /dev/block/mmcblk0p6 (null) 0
4 /cache ext4 /dev/block/mmcblk0p8 (null) 0
5 /system ext4 /dev/block/mmcblk0p9 (null) 0
6 /data ext4 /dev/block/mmcblk0p12 (null) -16384
7 /preload ext4 /dev/block/mmcblk0p10 (null) 0
8 /modem emmc /dev/block/mmcblk0p7 (null) 0
9 /sdcard datamedia /dev/null (null) 0
10 /external_sd ext4 /dev/block/mmcblk1p1 (null) 0
<snip>
-- Wiping data...
Formatting /data...
I:Formatting unknown device.
W:failed to mount /dev/block/mmcblk0p12 (Invalid argument)
Error mounting /data!
Skipping format...
CLAUSE DE NON-RESPONSABILITÉ : Je ne suis pas responsable de tout ce qui ne va pas, y compris (mais pas seulement) les erreurs de l'utilisateur.
Si vous souhaitez effacer le /data
(y compris les médias tels que les photos), suivez les instructions ci-dessous :
-
Démarrez en mode de récupération.
-
Exécuter adb shell
dans un terminal (Linux) ou une invite de commande ("CMD", Windows). Après quelques secondes, vous devriez voir apparaître une ligne contenant ~ #
.
-
AVERTISSEMENT . Vérifiez trois fois la commande que vous saisissez ici. Les espaces blancs et les majuscules sont importants. Si vous faites une erreur ici, vous risquez d'effacer accidentellement toute votre mémoire flash, y compris les images de récupération.
NOTE si vous voulez crypter votre partition plus tard, vous devez laisser 16KiB d'espace non alloué à la fin de la partition.
Dans le adb shell
exécutez la commande mke2fs -t ext4 /dev/block/mmcblk0p12
. Substitut /dev/block/mmcblk0p12
y ext4
selon la table du système de fichiers de récupération (pour /data
). Sortie lors de l'exécution de la commande :
~ # mke2fs -t ext4 /dev/block/mmcblk0p12
mke2fs 1.41.14 (22-Dec-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
755904 inodes, 3022848 blocks
151142 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=3095396352
93 block groups
32768 blocks per group, 32768 fragments per group
8128 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 34 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
-
(Facultatif) Installez le nouveau firmware (par exemple CM 10.1).
-
Redémarrage.
-
(Facultatif) Afin de crypter la partition tout en effaçant toute la partition de données, exécutez vdc cryptfs enablecrypto wipe PIN_OR_PASSWORD
(avant Android 5.0) ou vdc cryptfs enablecrypto wipe password PASSWORD_IN_HEX
(depuis Android 5.0, voir ce poste pour plus de détails).
-
Reconfigurer l'appareil, choisir la langue, saisir le nom, installer des applications, etc.
Détails techniques ci-dessous.
En réinitialisation l'élément du menu s'active erase_volume("/data")
sur recovery.c
qui appelle format_volume("/data")
.
format_volume
est défini dans roots.c
:
int format_volume(const char* volume) {
// <snip>
// check to see if /data is being formatted, and if it is /data/media
// Note: the /sdcard check is redundant probably, just being safe
if (strstr(volume, "/data") == volume && is_data_media() && !handle_data_media) {
return format_unknown_device(NULL, volume, NULL);
}
Puisque le nom du volume commence effectivement par /data
et la table des systèmes de fichiers de récupération contient une entrée pour le type datamedia
y handle_data_media
est initialement zéro, le format format_unknown_device
est appelé. Cette fonction est définie dans extendedcommands.c
comme suit :
int format_unknown_device(const char *device, const char* path, const char *fs_type)
{
LOGI("Formatting unknown device.\n");
if (fs_type != NULL && get_flash_type(fs_type) != UNSUPPORTED)
return erase_raw_partition(fs_type, device);
// if this is SDEXT:, don't worry about it if it does not exist.
if (0 == strcmp(path, "/sd-ext"))
{
// <snip>
}
if (NULL != fs_type) {
// <snip>
}
if (0 != ensure_path_mounted(path))
{
ui_print("Error mounting %s!\n", path);
ui_print("Skipping format...\n");
return 0;
}
fs_type
es NULL
et le path
es /data
. Cela signifie que le chemin du code aboutit à ensure_path_mounted(path)
qui est l'endroit où cette fonction échoue. En regardant le nom, ensure_path_mounted
tente de monter la partition par son nom, ce qui échoue bien sûr puisque la partition chiffrée n'est pas prise en charge par CWM. Par conséquent, CWM refuse de "formater" la partition (en fait, tout ce qu'il fait, c'est effacer tous les fichiers, à l'exception de /data/media
après le montage).
L'objectif est donc de formater /data
avec ext4 (voir le tableau des systèmes de fichiers de récupération) ou monter la partition de données chiffrées d'une manière ou d'une autre. Je n'ai pas pu trouver facilement les outils permettant de monter des partitions cryptées, j'ai donc décidé d'opter pour la solution de facilité et de simplement formater la partition.