Project

General

Profile

RestoreEfsNvDataBackupFile » History » Version 4

Denis 'GNUtoo' Carikli, 07/04/2020 06:10 AM
fix reboot

1 1 Denis 'GNUtoo' Carikli
h1. RestoreEfsNvDataBackupFile
2
3
{{TOC}}
4
5
h2. Introduction
6
7
Many devices supported by Replicant have a partition with the modem data (IMEI, etc) which is called EFS.
8
9
That partition is used by Replicant to enable the modem to store data, by making files inside that partition available to the modem through a network protocol between Replicant and the modem.
10
11
The advantage of that architecture is that Replicant has more control, and the modem (which runs nonfree software) has less control over the data it uses.
12
13
However as with every other computer system, files can get corrupted, especially if the power goes away suddenly, while data is being written in some of the files.
14
15
That can happen with batteries that are in very bad conditions: very old batteries can still last several hours, but if the smartphones tries to consume too much power (mA / miliampers) at once, the battery can be unable to provide that much power at the same time, which results in the voltage dropping and the smartphone or tablets being turned off suddenly, without having the time to properly save any data it may be writing.
16
17
In addition to the issue described above, the modem data partition contains data that is crucial (like the IMEI) and we don't know (yet) how to reconstruct the files that are in that partition. And without them, the modem will not work. This is why doing a backup of the data that is in this partition is crucial.
18
19
So if you didn't do that backup yet, you can follow the instructions in the [[BackupTheEFS]] wiki page.
20
21
The [[BackupTheEFS]] page has information on which devices have a modem data partition (some devices supported by Replicant don't have a modem for instance).
22
23
h2. Warning
24
25
If you don't want your device to break, really make sure you have a backup of the modem data partition. The backup can be done with the instruction that are in the [[BackupTheEFS]] wiki page.
26
27
If all the files in the modem data partition are destroyed for a reason or another, you won't be able to receive SMS, make calls, get 3G data connections, etc.
28
29
We don't know how to repair that (yet).
30
31
h2. Restoring nv_data.bin
32
33
If only the nv_data.bin file is corrupted , you can easily restore it, without having to restore a full backup.
34
35
h3. Making a new backup
36
37
Before starting, it's a good idea to make a new backup of the modem data partition, and name it in a way that is self-explanatory. For instance you could put it in a directory named 'backup-with-corrupted-nvdata-bin' not to confuse it with other backups that do not contain any corrupted files. As repeated before, you can use the [[BackupTheEFS]] instructions to do a backup.
38
39
Making a new backup has several advantages:
40
* If you lost your old backups you have a new one
41
* If you have your old backups somewhere else (like on another computer), you don't risk erasing them by mistake
42
43
Make sure not to erase the old backups while making a new one.
44
45
At the time of writing, the [[BackupTheEFS]] contain the following command:
46
<pre>
47
REPLICANT_EFS_BACKUP_DIR=~/replicant_devices/0123456789abcdef/backup_efs
48
mkdir -p $REPLICANT_EFS_BACKUP_DIR && cd $REPLICANT_EFS_BACKUP_DIR
49
</pre>
50
51
This creates a directory named replicant_devices in your home, with inside a directory named 0123456789abcdef, with inside a directory named backup_efs.
52
Then it makes you go in that directory from the command line. This way the next commands will save the backups in that directory.
53
54
We can easily substitute that command with another one:
55
<pre>
56
REPLICANT_EFS_BACKUP_DIR=~/replicant_devices/backup-with-corrupted-nvdata-bin-of-fourth-jully-2020/backup_efs
57
mkdir -p $REPLICANT_EFS_BACKUP_DIR && cd $REPLICANT_EFS_BACKUP_DIR
58
</pre>
59
60
Here instead of creating the 0123456789abcdef directory, it will create one named backup-with-corrupted-nvdata-bin-of-fourth-jully-2020. We can change that as we need to make sure that the directory has a name that is self explanatory, not to confuse the half-corrupted backups with ones that are not corrupted at all.
61
62
Alternatively if the replicant_devices, 0123456789abcdef or backup_efs directories don't exist, you can also follow the [[BackupTheEFS]] and rename the directories as you wish once the backup is done. 
63
64
Or if you have an old backup, you could rename its directories to make sure you don't accidentally overwrite it.
65
66
h3. Setup ADB
67
68
The [[BackupTheEFS]] page has instructions to setup ADB. So if you just did a backup you should be good.
69
70
However if you already had an old backup somewhere and didn't do a new one, you will need to make sure that ADB is setup.
71
72
To do that, you can follow the [[ADB|setting up ADB on your computer]] instructions, so that you can access a root shell on your device.
73
74
*NOTE*: when prompted on your Replicant device, make sure that you check the box that says *Always allow from this computer* when you grant your computer USB debugging permissions. Otherwise, you will be unable to obtain root shell access on your Replicant device when you reboot it into the recovery OS to actually perform the EFS backup.
75
76
*NOTE*: for security reasons, you may want to [[BackupTheEFS#Revoke-USB-debugging-permissions|revoke these non-expiring permissions]] once the EFS backup is complete.
77
78
h3. Reboot into the recovery
79
80
You can reboot your device into the recovery by one of the following methods:
81
82
h4. Using ADB
83
84
Run the following on your computer:
85
86
<pre>
87
adb reboot recovery
88
</pre>
89
90
h4. Using your Replicant device's user interface
91
92
Do the following:
93
94
# Make sure that your device is booted under Replicant.
95
# Press the power button until a menu appears.
96
# Press *Reboot*.
97
# Select *Recovery* and then press *ok*.
98
99
h3. Ensure that your device's system partition is mounted
100
101
In order to get a root shell in the recovery, your devices system partition must be mounted.
102
103
On certain devices, "the system partition is already mounted":https://redmine.replicant.us/issues/1934, so you might already be able to get a root shell without mounting the system partition again.
104
105
In any case, it's still best to do the following to make sure that the system partition is mounted:
106
107
# Select *Advanced*.
108
# Select *Mount /system*.
109
# Press the back key to get back to the general menu.
110
111
h3. Copy and pasting commands
112
113
The next sections will have commands that you can copy and paste. To ensure that they work correctly it's best to:
114
* Type them in the same terminal window
115
* Copy/paste one line at the same time. For instance if you copy 10 lines and just paste then, in some cases you could have some issues.
116
117
Also to make sure that they are really executed, you can press the 'enter' key after having pasted them. 
118
119
Pressing 'enter' twice will not hurt as the command will still be executed only once.
120
121 3 Denis 'GNUtoo' Carikli
h3. How this works
122 1 Denis 'GNUtoo' Carikli
123
The nv_data.bin file seem to be the file that is corrupted the most, probably because it is more often written to than the other files.
124
125
On most devices it can be found at several locations:
126
* /efs/nv_data.bin
127
* /efs/.nv_data.bak
128
129
The second one is a backup file. Note the '.' in front of the nv_data.bak. That dot ('.') is part of the file name. So that file name is '.nv_data.bak'.
130
131
When a file name starts with a dot, many tools (like file managers, command line utilities like 'ls', etc) will not list that file by default.
132
133
This convention enables to 'hide' some files. In GNU/Linux, this is typically used to 'hide' the configuration files used by graphical programs. Without that, it wound't be very convenient as you would see hundreds of extra files in your home. And in GNU/Linux the graphical programs still need to store their configuration somewhere.
134
135
For instance if you want to list all the files in your home in GNU/Linux, including the hidden ones you can use the following command:
136
<pre>
137
ls -a ~
138
</pre>
139
140 3 Denis 'GNUtoo' Carikli
The '~' is a shortcut/alias for your home, and the '-a' switch tells ls to list all files (including the hidden ones). Note that it will also list '.' and '..' which you can ignore in this tutorial (they are special 'shortcuts' to the current directory and the parent directory).
141 1 Denis 'GNUtoo' Carikli
142
So here we need to replace 'nv_data.bin' with '.nv_data.bak'. And as '.nv_data.bak' is a hidden file, we will use the concept of hidden files later on.
143
144 3 Denis 'GNUtoo' Carikli
h4. Mount the modem data partition
145
146 1 Denis 'GNUtoo' Carikli
To do that we first need to mount the modem data partition (named efs) to a directory (here we will use /efs).
147
148
Your device should already be in the recovery, ready to accept commands through adb.
149
150
Not all the devices have their modem data partition at the same place. Because of that, the mount instructions are device specific.
151
152 2 Denis 'GNUtoo' Carikli
You can use the following instructions to mount the modem data partition, but make sure that you use the ones that corresponds to your device.
153 1 Denis 'GNUtoo' Carikli
154 3 Denis 'GNUtoo' Carikli
h5. Galaxy S 2 (I9100), Galaxy S 3 (I9300), Galaxy S 3 4G (I9305), Galaxy Note (N7000), or Galaxy Note 2 (N7100)
155 1 Denis 'GNUtoo' Carikli
156
<pre>
157
adb shell "mkdir /efs"
158
adb shell "mount /dev/block/platform/*/by-name/EFS /efs"
159
</pre>
160
161 3 Denis 'GNUtoo' Carikli
h5. Galaxy Nexus (I9250)
162 1 Denis 'GNUtoo' Carikli
163
<pre>
164
adb shell "mkdir /efs"
165
adb shell "mount /dev/block/platform/*/*/by-name/efs /efs"
166
</pre>
167
168 3 Denis 'GNUtoo' Carikli
h5. Galaxy Tab 2 7.0 (P3100)
169 1 Denis 'GNUtoo' Carikli
<pre>
170
adb shell "mkdir /efs"
171
adb shell "mount /dev/block/platform/*/*/by-name/EFS /efs"
172
</pre>
173
174 3 Denis 'GNUtoo' Carikli
h4. Actually replace nv_data.bin
175 1 Denis 'GNUtoo' Carikli
176
Now that the modem data partition is mounted to /efs, we can proceed to replace nv_data.bin.
177
178
179 3 Denis 'GNUtoo' Carikli
First we can list all the files in /efs to make sure everything is good so far:
180 1 Denis 'GNUtoo' Carikli
<pre>
181 3 Denis 'GNUtoo' Carikli
adb shell "ls -a /efs/"
182 1 Denis 'GNUtoo' Carikli
</pre>
183
184 3 Denis 'GNUtoo' Carikli
Here with a Galaxy SIII (GT-I9300), it gives the following output:
185
<pre>
186
.                .nv_data.bak         FactoryApp    h2k.dat     nv_data.bin.md5 
187
..               .nv_data.bak.md5     bluetooth     imei        wifi            
188
.nv_core.bak     .nv_state            drm           nv.log      wv.keys         
189
.nv_core.bak.md5 00000000.authtokcont gyro_cal_data nv_data.bin 
190
</pre>
191 1 Denis 'GNUtoo' Carikli
192 3 Denis 'GNUtoo' Carikli
So we can clearly see the nv_data.bin and .nv_data.bak
193 1 Denis 'GNUtoo' Carikli
194 3 Denis 'GNUtoo' Carikli
We will then proceed to replace /efs/nv_data.bin by /efs/.nv_data.bak. This can be done with the following command:
195
<pre>
196
adb shell "cp /efs/.nv_data.bak /efs/nv_data.bin"
197
</pre>
198 1 Denis 'GNUtoo' Carikli
199 3 Denis 'GNUtoo' Carikli
It's a good idea to verify that everything went fine. This can be done with the following command:
200
<pre>
201
adb shell "cmp /efs/.nv_data.bak /efs/nv_data.bin"
202
</pre>
203 1 Denis 'GNUtoo' Carikli
204 3 Denis 'GNUtoo' Carikli
If everything went fine, it shound't print anything.
205
206
If not, it will print an error similar to this one:
207
<pre>
208
/efs/.nv_data.bak /efs/nv_data.bin differ: char 1, line 1
209
</pre>
210
Note that the 'char 1, line 1' might differ.
211
212
So now we finally replaced nv_data.bin, however we need to do the exact same operation to replace nv_data.bin.md5 with .nv_data.bak.
213
214
The nv_data.bin.md5 file contains something called a "checksum":https://en.wikipedia.org/wiki/Checksum : it's a short sequence of numbers and letters that can be used to matematically verify if nv_data.bin wasn't accidentally corrupted by verifying if all the data in nv_data.bin match the checksum in nv_data.bin.md5
215
216
As we replaced nv_data.bin by the content of .nv_data.bak, we need to also replace nv_data.bin.md5 by the content of .nv_data.bak.md5, otherwise the modem will think that nv_data.bin is corrupted.
217
218
To do that we can use the following command:
219
<pre>
220
adb shell "cp /efs/.nv_data.bak.md5 /efs/nv_data.bin.md5"
221
</pre>
222
223
Then we can also verify like before that evertyhign went fine:
224
<pre>
225
adb shell "cp /efs/.nv_data.bak.md5 /efs/nv_data.bin.md5"
226
</pre>
227
228
If not, we might have an output that looks like that:
229
<pre>
230
/efs/.nv_data.bak.md5 /efs/nv_data.bin.md5 differ: char 1, line 1
231
</pre>
232
233 4 Denis 'GNUtoo' Carikli
h4. Umount / Unmount the modem data partition
234 3 Denis 'GNUtoo' Carikli
235 4 Denis 'GNUtoo' Carikli
We're now mostly done. We still need to properly umount the modem filesystem partition to prevent corruptions.
236 3 Denis 'GNUtoo' Carikli
237 4 Denis 'GNUtoo' Carikli
We can do it with the following command:
238 1 Denis 'GNUtoo' Carikli
<pre>
239
adb shell "umount /efs" 
240
adb shell "rmdir /efs" 
241
</pre>
242
243
h2. Reboot your device
244
245 4 Denis 'GNUtoo' Carikli
Once the the umount is done, you can finally reboot your device into Replicant by one of two ways.
246 1 Denis 'GNUtoo' Carikli
247
You can reboot by running the following command on your computer:
248
<pre>
249
adb reboot
250
</pre>
251
252
Or alternatively you can use the Replicant recovery graphical user interface to reboot by selecting *Reboot system now*.
253
254
h2. Revoke USB debugging permissions
255
256
If you are concerned about security, you may want to revoke the non-expiring USB debugging permissions that you granted to your computer earlier (which you may of course grant again at any time, as desired). This control is located at *Settings* > *Developer options* > *Revoke USB debugging authorizations*.
257
258
That's it! Your device's EFS partition is now backed up. Your device should be running Replicant normally again.