Projet

Général

Profil

BtrFs » Historique » Version 5

Fabien Dupont, 10/05/2013 10:51

1 1 Fabien Dupont
h1. BtrFs
2 1 Fabien Dupont
3 2 Fabien Dupont
{{>toc}}
4 2 Fabien Dupont
5 1 Fabien Dupont
h2. Présentation
6 1 Fabien Dupont
7 1 Fabien Dupont
BtrFs (se prononce « Butter FS ») est un filesystem de type CoW (« Copy on Write »). C'est à dire que deux données identiques (même CRC32) ne sont écrites qu'une seule fois sur le filesystem jusqu'à ce qu'une des deux soit modifiées.
8 1 Fabien Dupont
9 1 Fabien Dupont
Exemple :
10 1 Fabien Dupont
11 1 Fabien Dupont
<pre>
12 1 Fabien Dupont
$ cat toto > fichier1        # « toto » est écrit quelque part sur le disque dur
13 1 Fabien Dupont
$ cat toto > fichier2        # fichier2 devient un pointeur vers fichier1
14 1 Fabien Dupont
$ sed -ie 's/o/a/g' fichier2 # « tata » est écrit quelque part sur le disque dur
15 1 Fabien Dupont
                             # et fichier2 n'est plus un pointeur vers fichier1
16 1 Fabien Dupont
</pre>
17 1 Fabien Dupont
18 5 Fabien Dupont
De plus, BtrFs est différent des systèmes de fichiers « classiques » (ext2/3/4) car il offre les fonctionnalités suivantes :
19 1 Fabien Dupont
20 1 Fabien Dupont
* possibilité d'écrire le filesystem sur plusieurs disques : raid1, raid0, raid10 et depuis le kernel 3.9, raid5 ou raid6.
21 1 Fabien Dupont
* sous-volumes : il n'y a pas de notion de partitions mais un répertoire peut devenir la racine d'un nouveau volume.
22 1 Fabien Dupont
* snapshots : une image peut être créée et utilisée pour sauvegarder ou restaurer l'état d'un filesystem (ou d'un sous-volume) à un instant T.
23 1 Fabien Dupont
24 1 Fabien Dupont
h2. Création d'un filesystem BtrFs sous debian
25 1 Fabien Dupont
26 1 Fabien Dupont
Le paquet « btrfs-tools » offre les outils permettant la création et la gestion d'un filesystem BtrFs.
27 1 Fabien Dupont
28 1 Fabien Dupont
<pre>
29 1 Fabien Dupont
# apt-get install btrfs-tools
30 1 Fabien Dupont
</pre>
31 1 Fabien Dupont
32 1 Fabien Dupont
h3. Single
33 1 Fabien Dupont
34 1 Fabien Dupont
Les données et les métadonnées sont écrites sur un seul disque.
35 1 Fabien Dupont
36 1 Fabien Dupont
<pre>
37 1 Fabien Dupont
# mkfs.btrfs -d single /dev/sdb
38 1 Fabien Dupont
</pre>
39 1 Fabien Dupont
40 1 Fabien Dupont
h3. raid0
41 1 Fabien Dupont
42 5 Fabien Dupont
Les données sont « stripées » sur N disques. Il faut donc un minimum de 2 disques.
43 1 Fabien Dupont
44 1 Fabien Dupont
<pre>
45 1 Fabien Dupont
# mkfs.btrfs -d raid0 -m raid0 /dev/sdb /dev/sdc
46 1 Fabien Dupont
</pre>
47 1 Fabien Dupont
48 1 Fabien Dupont
Par exemple pour un fichier contenant « abcdefgh », on aura sur les disques :
49 1 Fabien Dupont
50 1 Fabien Dupont
<pre>
51 1 Fabien Dupont
+-----+   +-----+
52 1 Fabien Dupont
| sdb |   | sdc |
53 1 Fabien Dupont
+-----+   +-----+
54 1 Fabien Dupont
|  a  |   |  b  |
55 1 Fabien Dupont
|  c  |   |  d  |
56 1 Fabien Dupont
|  e  |   |  f  |
57 1 Fabien Dupont
|  g  |   |  h  |
58 1 Fabien Dupont
+-----+   +-----+
59 1 Fabien Dupont
</pre>
60 1 Fabien Dupont
61 1 Fabien Dupont
Pros :
62 1 Fabien Dupont
63 5 Fabien Dupont
* Performance accrue en lecture : un fichier est lu sur N disques, débit multiplié par N.
64 1 Fabien Dupont
* Plusieurs disques sont vus en un seul volume.
65 1 Fabien Dupont
66 1 Fabien Dupont
Cons :
67 1 Fabien Dupont
68 1 Fabien Dupont
* Sécurité des données faible, si un seul disque tombe en panne, l'ensemble des données est perdue.
69 1 Fabien Dupont
70 1 Fabien Dupont
h3. raid1
71 1 Fabien Dupont
72 5 Fabien Dupont
Les données sont « mirrorées » sur N disques. Il faut donc un minimum de 2 disques.
73 1 Fabien Dupont
74 1 Fabien Dupont
<pre>
75 1 Fabien Dupont
# mkfs.btrfs -d raid1 -m raid1 /dev/sdb /dev/sdc
76 1 Fabien Dupont
</pre>
77 1 Fabien Dupont
78 1 Fabien Dupont
Par exemple pour un fichier contenant « abcdefgh », on aura sur les disques :
79 1 Fabien Dupont
80 1 Fabien Dupont
<pre>
81 1 Fabien Dupont
+-----+   +-----+
82 1 Fabien Dupont
| sdb |   | sdc |
83 1 Fabien Dupont
+-----+   +-----+
84 1 Fabien Dupont
|  a  |   |  a  |
85 1 Fabien Dupont
|  b  |   |  b  |
86 1 Fabien Dupont
|  c  |   |  c  |
87 1 Fabien Dupont
|  d  |   |  d  |
88 1 Fabien Dupont
|  e  |   |  e  |
89 1 Fabien Dupont
|  f  |   |  f  |
90 1 Fabien Dupont
|  g  |   |  g  |
91 1 Fabien Dupont
|  h  |   |  h  |
92 1 Fabien Dupont
+-----+   +-----+
93 1 Fabien Dupont
</pre>
94 1 Fabien Dupont
95 1 Fabien Dupont
Pros :
96 1 Fabien Dupont
97 1 Fabien Dupont
* Sécurité des données forte, N-1 disques peuvent tomber en panne avant de perdre les données.
98 5 Fabien Dupont
* Performance accrue en lecture, un fichier est lu sur N disques, débit multiplié par N.
99 1 Fabien Dupont
100 1 Fabien Dupont
Cons :
101 1 Fabien Dupont
102 1 Fabien Dupont
* Pour N disques de taille T, on n'a que T octets à disposition.
103 1 Fabien Dupont
104 3 Fabien Dupont
h3. raid10
105 1 Fabien Dupont
106 5 Fabien Dupont
Les données sont « mirrorées » sur N/2 disques puis « stripées » entre les deux N/2 disques. Il faut donc un minimum de 4 disques.
107 1 Fabien Dupont
108 1 Fabien Dupont
<pre>
109 1 Fabien Dupont
# mkfs.btrfs -d raid10 -m raid10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
110 1 Fabien Dupont
</pre>
111 1 Fabien Dupont
112 1 Fabien Dupont
Par exemple pour un fichier contenant « abcdefgh », on aura sur les disques :
113 1 Fabien Dupont
114 1 Fabien Dupont
<pre>
115 1 Fabien Dupont
        <-------raid0------->
116 1 Fabien Dupont
<-----raid1----->   <-----raid1----->
117 1 Fabien Dupont
+-----+   +-----+   +-----+   +-----+
118 1 Fabien Dupont
| sdb |   | sdc |   | sdd |   | sde |
119 1 Fabien Dupont
+-----+   +-----+   +-----+   +-----+
120 1 Fabien Dupont
|  a  |   |  a  |   |  b  |   |  b  |
121 1 Fabien Dupont
|  c  |   |  c  |   |  d  |   |  d  |
122 1 Fabien Dupont
|  e  |   |  e  |   |  f  |   |  f  |
123 1 Fabien Dupont
|  g  |   |  g  |   |  h  |   |  h  |
124 1 Fabien Dupont
+-----+   +-----+   +-----+   +-----+
125 1 Fabien Dupont
</pre>
126 1 Fabien Dupont
127 1 Fabien Dupont
Pros :
128 1 Fabien Dupont
129 1 Fabien Dupont
* Sécurité des données forte, N-1 disques dans chaque morceau du raid0 peuvent tomber en panne avant de perdre les données.
130 5 Fabien Dupont
* Performance accrue en lecture, un fichier est lu sur N disques, débit multiplié par N.
131 1 Fabien Dupont
* Plusieurs disques sont vus en un seul volume.
132 1 Fabien Dupont
133 1 Fabien Dupont
Cons : 
134 1 Fabien Dupont
135 1 Fabien Dupont
* Pour N disques de taille T, on n'a que (N×T)/2 octets à disposition.
136 2 Fabien Dupont
137 3 Fabien Dupont
h3. raid5 (kernel >= 3.9)
138 2 Fabien Dupont
139 2 Fabien Dupont
Les données sont « stripées » sur N-1 disques puis la parité d'un « stripe » est écrite sur le dernier disque. Il faut donc un minimum de 3 disques.
140 2 Fabien Dupont
141 2 Fabien Dupont
<pre>
142 2 Fabien Dupont
# mkfs.btrfs -d raid5 -m raid5 /dev/sdb /dev/sdc /dev/sdd
143 2 Fabien Dupont
</pre>
144 2 Fabien Dupont
145 2 Fabien Dupont
Par exemple pour un fichier contenant « abcdefgh », on aura sur les disques :
146 2 Fabien Dupont
147 2 Fabien Dupont
<pre>
148 2 Fabien Dupont
+-----+   +-----+   +-----+
149 2 Fabien Dupont
| sdb |   | sdc |   | sdd |
150 2 Fabien Dupont
+-----+   +-----+   +-----+
151 2 Fabien Dupont
|  a  |   |  b  |   |  p1 |
152 2 Fabien Dupont
|  p2 |   |  c  |   |  d  |
153 2 Fabien Dupont
|  e  |   |  p3 |   |  f  |
154 2 Fabien Dupont
|  g  |   |  h  |   |  p4 |
155 2 Fabien Dupont
+-----+   +-----+   +-----+
156 2 Fabien Dupont
</pre>
157 2 Fabien Dupont
158 2 Fabien Dupont
Pros :
159 2 Fabien Dupont
160 2 Fabien Dupont
* Sécurité des données forte, 1 disque peut tomber en panne avant de perdre les données.
161 2 Fabien Dupont
* Plusieurs disques sont vus en un seul volume.
162 2 Fabien Dupont
163 2 Fabien Dupont
Cons : 
164 2 Fabien Dupont
165 2 Fabien Dupont
* Pour N disques de taille T, on n'a que (N-1)×T octets à disposition.
166 2 Fabien Dupont
167 2 Fabien Dupont
168 3 Fabien Dupont
h3. raid6 (kernel >= 3.9)
169 2 Fabien Dupont
170 2 Fabien Dupont
Les données sont « stripées » sur N-2 disques puis la parité d'un « stripe » est « mirrorée » sur 2 disques. Il faut donc un minimum de 4 disques.
171 2 Fabien Dupont
172 2 Fabien Dupont
<pre>
173 2 Fabien Dupont
# mkfs.btrfs -d raid6 -m raid6 /dev/sdb /dev/sdc /dev/sdd
174 2 Fabien Dupont
</pre>
175 2 Fabien Dupont
176 2 Fabien Dupont
Par exemple pour un fichier contenant « abcdefgh », on aura sur les disques :
177 2 Fabien Dupont
178 2 Fabien Dupont
<pre>
179 2 Fabien Dupont
+-----+   +-----+   +-----+   +-----+
180 2 Fabien Dupont
| sdb |   | sdc |   | sdd |   | sde |
181 2 Fabien Dupont
+-----+   +-----+   +-----+   +-----+
182 2 Fabien Dupont
|  a  |   |  b  |   |  p1 |   |  p1 |
183 2 Fabien Dupont
|  p2 |   |  c  |   |  d  |   |  p2 |
184 1 Fabien Dupont
|  p3 |   |  p3 |   |  e  |   |  f  |
185 2 Fabien Dupont
|  g  |   |  p4 |   |  p4 |   |  h  |
186 2 Fabien Dupont
+-----+   +-----+   +-----+   +-----+
187 2 Fabien Dupont
</pre>
188 2 Fabien Dupont
189 2 Fabien Dupont
Pros :
190 2 Fabien Dupont
191 5 Fabien Dupont
* Sécurité des données forte, 2 disques peuvent tomber en panne avant de perdre les données.
192 2 Fabien Dupont
* Plusieurs disques sont vus en un seul volume.
193 2 Fabien Dupont
194 2 Fabien Dupont
Cons : 
195 2 Fabien Dupont
196 2 Fabien Dupont
* Pour N disques de taille T, on n'a que (N-2)×T octets à disposition.
197 2 Fabien Dupont
198 2 Fabien Dupont
h2. Administration d'un volume BtrFs
199 2 Fabien Dupont
200 2 Fabien Dupont
h3. Sous-volumes (subvolumes)
201 2 Fabien Dupont
202 2 Fabien Dupont
Un sous-volume n'est _pas_ équivalent à LVM. C'est une racine sous la racine.
203 2 Fabien Dupont
204 2 Fabien Dupont
Un sous-volume peut contenir une hierarchie de fichiers ou bien une image (« snapshot ») d'un autre sous-volume à un instant T.
205 2 Fabien Dupont
206 2 Fabien Dupont
Par exemple, dans un même volume, on peut avoir :
207 2 Fabien Dupont
208 2 Fabien Dupont
<pre>
209 2 Fabien Dupont
+-+- root (sous volume par défaut)
210 2 Fabien Dupont
| +-- /bin
211 2 Fabien Dupont
| +-- /usr
212 2 Fabien Dupont
| +-- ...
213 2 Fabien Dupont
|
214 2 Fabien Dupont
+-+- home
215 2 Fabien Dupont
| +-- /home
216 2 Fabien Dupont
|
217 2 Fabien Dupont
+-+- snapshot_root1
218 2 Fabien Dupont
| +-- /bin
219 2 Fabien Dupont
| +-- /usr
220 2 Fabien Dupont
| +-- ...
221 2 Fabien Dupont
|
222 2 Fabien Dupont
.
223 2 Fabien Dupont
.
224 2 Fabien Dupont
</pre>
225 2 Fabien Dupont
226 2 Fabien Dupont
h4. Création d'un sous-volume
227 2 Fabien Dupont
228 2 Fabien Dupont
Par exemple, pour créer un sous-volume /mnt/home dans le volume BtrFs monté dans /mnt :
229 2 Fabien Dupont
230 2 Fabien Dupont
<pre>
231 2 Fabien Dupont
# btrfs subvolume create /mnt/home
232 2 Fabien Dupont
</pre>
233 2 Fabien Dupont
234 2 Fabien Dupont
/!\ /mnt/home ne doit _pas_ exister. Il apparaîtra tel un répertoire, du point de vue de l'utilisateur mais ce n'en n'est pas un.
235 2 Fabien Dupont
236 2 Fabien Dupont
h4. Création d'un snapshot dans un sous-volume :
237 2 Fabien Dupont
238 2 Fabien Dupont
Par exemple, pour créer un snapshot de /mnt/home :
239 2 Fabien Dupont
240 2 Fabien Dupont
<pre>
241 2 Fabien Dupont
# ls -l /mnt/home/fab
242 2 Fabien Dupont
/mnt/home/fab:
243 2 Fabien Dupont
total 0
244 2 Fabien Dupont
# btrfs subvolume snapshot /mnt/home /mnt/snapshot_of_home
245 2 Fabien Dupont
# touch /mnt/home/fab/toto
246 2 Fabien Dupont
# ls -l /mnt/home/fab /mnt/snapshot_of_home/fab
247 2 Fabien Dupont
/mnt/home/fab:
248 2 Fabien Dupont
total 0
249 2 Fabien Dupont
-rw-r--r-- 1 root root 0 May  9 13:49 toto
250 2 Fabien Dupont
251 2 Fabien Dupont
/mnt/snapshot_of_home/fab:
252 2 Fabien Dupont
total 0
253 2 Fabien Dupont
</pre>
254 2 Fabien Dupont
255 2 Fabien Dupont
On voit bien que le snapshot contient l'état de /mnt/home avant la création du fichier toto.
256 2 Fabien Dupont
257 1 Fabien Dupont
h4. Monter un sous-volume
258 2 Fabien Dupont
259 2 Fabien Dupont
Pour monter un sous-volume précédement créé :
260 2 Fabien Dupont
261 2 Fabien Dupont
<pre>
262 2 Fabien Dupont
# btrfs subvolume list /mnt
263 2 Fabien Dupont
ID 261 gen 37 top level 5 path home
264 2 Fabien Dupont
ID 262 gen 41 top level 5 path snapshot_of_home
265 5 Fabien Dupont
# mount /dev/sdb1 /home -o subvol=home
266 2 Fabien Dupont
#  df -HTP | grep sdb1
267 2 Fabien Dupont
/dev/sdb1      btrfs     8.0T  6.7G  8.0T   1% /home
268 2 Fabien Dupont
/dev/sdb1      btrfs     8.0T  6.7G  8.0T   1% /mnt
269 2 Fabien Dupont
# mkdir /home/fab
270 2 Fabien Dupont
# chown fab:fab /home/fab
271 2 Fabien Dupont
# ls -ld /mnt/home/fab /home/fab
272 1 Fabien Dupont
drwxr-xr-x 1 fab fab 8 May  9 13:49 /mnt/home/fab
273 1 Fabien Dupont
drwxr-xr-x 1 fab fab 8 May  9 13:49 /home/fab
274 1 Fabien Dupont
</pre>
275 3 Fabien Dupont
276 3 Fabien Dupont
h3. Monter un volume au boot (/etc/fstab)
277 3 Fabien Dupont
278 3 Fabien Dupont
h4. Monter un volume
279 3 Fabien Dupont
280 3 Fabien Dupont
N'importe lequel des disques d'un volume raid* peut être monté. BtrFs déduira le type de volume et les autres disques utilisés.
281 3 Fabien Dupont
282 3 Fabien Dupont
Par exemple, pour un volume en raid1 sur /dev/sdb et /dev/sdc monté dans /pub au boot :
283 3 Fabien Dupont
284 3 Fabien Dupont
<pre>
285 3 Fabien Dupont
# grep btrfs /etc/fstab
286 1 Fabien Dupont
/dev/sdb  /pub  btrfs  defaults  0 0
287 3 Fabien Dupont
</pre>
288 3 Fabien Dupont
289 3 Fabien Dupont
h4. Monter un sous-volume (ou un snapshot)
290 3 Fabien Dupont
291 3 Fabien Dupont
Par exemple, pour monter le sous-volume home du volume précédent :
292 3 Fabien Dupont
293 3 Fabien Dupont
<pre>
294 3 Fabien Dupont
# grep btrfs /etc/fstab
295 5 Fabien Dupont
/dev/sdb  /pub  btrfs  defaults              0 0
296 5 Fabien Dupont
/dev/sdb  /home btrfs  defaults,subvol=home  0 0
297 3 Fabien Dupont
</pre>
298 3 Fabien Dupont
299 3 Fabien Dupont
h3. Gérer les disques d'un raid
300 3 Fabien Dupont
301 3 Fabien Dupont
h4. Remplacer un disque défaillant
302 3 Fabien Dupont
303 1 Fabien Dupont
Par exemple, pour un raid10 sur /dev/sdb, /dev/sdc, /dev/sdd et /dev/sde monté dans /pub, soudainement /dev/sdc tombe en panne.
304 1 Fabien Dupont
Il doit être remplacé physiquement puis :
305 1 Fabien Dupont
306 1 Fabien Dupont
<pre>
307 1 Fabien Dupont
# mkfs.btrfs /dev/sdc
308 1 Fabien Dupont
# mount -o remount,degraded /dev/sdb
309 1 Fabien Dupont
# btrfs device add /dev/sdc /pub
310 3 Fabien Dupont
# btrfs device delete missing /pub
311 3 Fabien Dupont
# mount -o remount /dev/sdb
312 3 Fabien Dupont
</pre>
313 3 Fabien Dupont
314 5 Fabien Dupont
Il faut toujours exécuter les opérations dans cet ordre :
315 5 Fabien Dupont
316 5 Fabien Dupont
* remonter le filesystem en mode dégradé
317 5 Fabien Dupont
* ajouter le nouveau disque
318 5 Fabien Dupont
* supprimer le disque « missing ».
319 5 Fabien Dupont
320 5 Fabien Dupont
Ceci permet de ne jamais avoir un volume comprenant moins de disques que ce que le type de raid permet.
321 3 Fabien Dupont
322 3 Fabien Dupont
h4. Convertir un volume single en raid1
323 3 Fabien Dupont
324 3 Fabien Dupont
Par exemple, pour convertir le volume /dev/sdb monté dans /pub en raid1 avec /dev/sdc en plus :
325 3 Fabien Dupont
326 3 Fabien Dupont
<pre>
327 3 Fabien Dupont
# mkfs.btrfs /dev/sdc
328 3 Fabien Dupont
# btrfs device add /dev/sdc /pub
329 3 Fabien Dupont
# btrfs balance start -dconvert=raid1 -mconvert=raid1 /pub
330 3 Fabien Dupont
</pre>
331 3 Fabien Dupont
332 3 Fabien Dupont
La commande « balance » permet de redistribuer les données d'un volume BtrFs en fonction du type de raid.
333 3 Fabien Dupont
334 3 Fabien Dupont
Cette opération est similaire pour convertir en raid0, raid10, etc.
335 3 Fabien Dupont
336 3 Fabien Dupont
h2. Pour plus d'informations
337 3 Fabien Dupont
338 3 Fabien Dupont
https://btrfs.wiki.kernel.org/
339 3 Fabien Dupont
http://en.wikipedia.org/wiki/Btrfs
340 3 Fabien Dupont
http://manpages.debian.net/cgi-bin/man.cgi?sektion=8&query=mkfs.btrfs&apropos=0&manpath=sid&locale=en
341 3 Fabien Dupont
http://manpages.debian.net/cgi-bin/man.cgi?sektion=8&query=btrfs&apropos=0&manpath=sid&locale=en