Projet

Général

Profil

BtrFs » Historique » Version 4

Fabien Dupont, 09/05/2013 14:26

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 1 Fabien Dupont
De plus, BtrFs est différents 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 1 Fabien Dupont
Les données sont « stripées » sur deux 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 1 Fabien Dupont
* Performance accrue en lecture, un fichier est lue sur deux disques, débit doublé.
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 1 Fabien Dupont
Les données sont « mirrorées » sur deux 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 1 Fabien Dupont
99 1 Fabien Dupont
Cons :
100 1 Fabien Dupont
101 1 Fabien Dupont
* Pour N disques de taille T, on n'a que T octets à disposition.
102 1 Fabien Dupont
103 3 Fabien Dupont
h3. raid10
104 1 Fabien Dupont
105 1 Fabien Dupont
Les données sont « mirrorées » sur N/2 disques puis « stripées » entre les 2 N/2 disques. Il faut donc un minimum de 4 disques.
106 1 Fabien Dupont
107 1 Fabien Dupont
<pre>
108 1 Fabien Dupont
# mkfs.btrfs -d raid10 -m raid10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
109 1 Fabien Dupont
</pre>
110 1 Fabien Dupont
111 1 Fabien Dupont
Par exemple pour un fichier contenant « abcdefgh », on aura sur les disques :
112 1 Fabien Dupont
113 1 Fabien Dupont
<pre>
114 1 Fabien Dupont
        <-------raid0------->
115 1 Fabien Dupont
<-----raid1----->   <-----raid1----->
116 1 Fabien Dupont
+-----+   +-----+   +-----+   +-----+
117 1 Fabien Dupont
| sdb |   | sdc |   | sdd |   | sde |
118 1 Fabien Dupont
+-----+   +-----+   +-----+   +-----+
119 1 Fabien Dupont
|  a  |   |  a  |   |  b  |   |  b  |
120 1 Fabien Dupont
|  c  |   |  c  |   |  d  |   |  d  |
121 1 Fabien Dupont
|  e  |   |  e  |   |  f  |   |  f  |
122 1 Fabien Dupont
|  g  |   |  g  |   |  h  |   |  h  |
123 1 Fabien Dupont
+-----+   +-----+   +-----+   +-----+
124 1 Fabien Dupont
</pre>
125 1 Fabien Dupont
126 1 Fabien Dupont
Pros :
127 1 Fabien Dupont
128 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.
129 1 Fabien Dupont
* Performance accrue en lecture, un fichier est lue sur deux disques, débit doublé.
130 1 Fabien Dupont
* Plusieurs disques sont vus en un seul volume.
131 1 Fabien Dupont
132 1 Fabien Dupont
Cons : 
133 1 Fabien Dupont
134 1 Fabien Dupont
* Pour N disques de taille T, on n'a que (N×T)/2 octets à disposition.
135 2 Fabien Dupont
136 3 Fabien Dupont
h3. raid5 (kernel >= 3.9)
137 2 Fabien Dupont
138 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.
139 2 Fabien Dupont
140 2 Fabien Dupont
<pre>
141 2 Fabien Dupont
# mkfs.btrfs -d raid5 -m raid5 /dev/sdb /dev/sdc /dev/sdd
142 2 Fabien Dupont
</pre>
143 2 Fabien Dupont
144 2 Fabien Dupont
Par exemple pour un fichier contenant « abcdefgh », on aura sur les disques :
145 2 Fabien Dupont
146 2 Fabien Dupont
<pre>
147 2 Fabien Dupont
+-----+   +-----+   +-----+
148 2 Fabien Dupont
| sdb |   | sdc |   | sdd |
149 2 Fabien Dupont
+-----+   +-----+   +-----+
150 2 Fabien Dupont
|  a  |   |  b  |   |  p1 |
151 2 Fabien Dupont
|  p2 |   |  c  |   |  d  |
152 2 Fabien Dupont
|  e  |   |  p3 |   |  f  |
153 2 Fabien Dupont
|  g  |   |  h  |   |  p4 |
154 2 Fabien Dupont
+-----+   +-----+   +-----+
155 2 Fabien Dupont
</pre>
156 2 Fabien Dupont
157 2 Fabien Dupont
Pros :
158 2 Fabien Dupont
159 2 Fabien Dupont
* Sécurité des données forte, 1 disque peut tomber en panne avant de perdre les données.
160 2 Fabien Dupont
* Plusieurs disques sont vus en un seul volume.
161 2 Fabien Dupont
162 2 Fabien Dupont
Cons : 
163 2 Fabien Dupont
164 2 Fabien Dupont
* Pour N disques de taille T, on n'a que (N-1)×T octets à disposition.
165 2 Fabien Dupont
166 2 Fabien Dupont
167 3 Fabien Dupont
h3. raid6 (kernel >= 3.9)
168 2 Fabien Dupont
169 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.
170 2 Fabien Dupont
171 2 Fabien Dupont
<pre>
172 2 Fabien Dupont
# mkfs.btrfs -d raid6 -m raid6 /dev/sdb /dev/sdc /dev/sdd
173 2 Fabien Dupont
</pre>
174 2 Fabien Dupont
175 2 Fabien Dupont
Par exemple pour un fichier contenant « abcdefgh », on aura sur les disques :
176 2 Fabien Dupont
177 2 Fabien Dupont
<pre>
178 2 Fabien Dupont
+-----+   +-----+   +-----+   +-----+
179 2 Fabien Dupont
| sdb |   | sdc |   | sdd |   | sde |
180 2 Fabien Dupont
+-----+   +-----+   +-----+   +-----+
181 2 Fabien Dupont
|  a  |   |  b  |   |  p1 |   |  p1 |
182 2 Fabien Dupont
|  p2 |   |  c  |   |  d  |   |  p2 |
183 2 Fabien Dupont
|  p3 |   |  p3 |   |  e  |   |  f  |
184 2 Fabien Dupont
|  g  |   |  p4 |   |  p4 |   |  h  |
185 2 Fabien Dupont
+-----+   +-----+   +-----+   +-----+
186 2 Fabien Dupont
</pre>
187 2 Fabien Dupont
188 2 Fabien Dupont
Pros :
189 2 Fabien Dupont
190 2 Fabien Dupont
* Sécurité des données forte, 2 disques peut tomber en panne avant de perdre les données.
191 2 Fabien Dupont
* Plusieurs disques sont vus en un seul volume.
192 2 Fabien Dupont
193 2 Fabien Dupont
Cons : 
194 2 Fabien Dupont
195 2 Fabien Dupont
* Pour N disques de taille T, on n'a que (N-2)×T octets à disposition.
196 2 Fabien Dupont
197 2 Fabien Dupont
h2. Administration d'un volume BtrFs
198 2 Fabien Dupont
199 2 Fabien Dupont
h3. Sous-volumes (subvolumes)
200 2 Fabien Dupont
201 2 Fabien Dupont
Un sous-volume n'est _pas_ équivalent à LVM. C'est une racine sous la racine.
202 2 Fabien Dupont
203 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.
204 2 Fabien Dupont
205 2 Fabien Dupont
Par exemple, dans un même volume, on peut avoir :
206 2 Fabien Dupont
207 2 Fabien Dupont
<pre>
208 2 Fabien Dupont
+-+- root (sous volume par défaut)
209 2 Fabien Dupont
| +-- /bin
210 2 Fabien Dupont
| +-- /usr
211 2 Fabien Dupont
| +-- ...
212 2 Fabien Dupont
|
213 2 Fabien Dupont
+-+- home
214 2 Fabien Dupont
| +-- /home
215 2 Fabien Dupont
|
216 2 Fabien Dupont
+-+- snapshot_root1
217 2 Fabien Dupont
| +-- /bin
218 2 Fabien Dupont
| +-- /usr
219 2 Fabien Dupont
| +-- ...
220 2 Fabien Dupont
|
221 2 Fabien Dupont
.
222 2 Fabien Dupont
.
223 2 Fabien Dupont
</pre>
224 2 Fabien Dupont
225 2 Fabien Dupont
h4. Création d'un sous-volume
226 2 Fabien Dupont
227 2 Fabien Dupont
Par exemple, pour créer un sous-volume /mnt/home dans le volume BtrFs monté dans /mnt :
228 2 Fabien Dupont
229 2 Fabien Dupont
<pre>
230 2 Fabien Dupont
# btrfs subvolume create /mnt/home
231 2 Fabien Dupont
</pre>
232 2 Fabien Dupont
233 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.
234 2 Fabien Dupont
235 2 Fabien Dupont
h4. Création d'un snapshot dans un sous-volume :
236 2 Fabien Dupont
237 2 Fabien Dupont
Par exemple, pour créer un snapshot de /mnt/home :
238 2 Fabien Dupont
239 2 Fabien Dupont
<pre>
240 2 Fabien Dupont
# ls -l /mnt/home/fab
241 2 Fabien Dupont
/mnt/home/fab:
242 2 Fabien Dupont
total 0
243 2 Fabien Dupont
# btrfs subvolume snapshot /mnt/home /mnt/snapshot_of_home
244 2 Fabien Dupont
# touch /mnt/home/fab/toto
245 2 Fabien Dupont
# ls -l /mnt/home/fab /mnt/snapshot_of_home/fab
246 2 Fabien Dupont
/mnt/home/fab:
247 2 Fabien Dupont
total 0
248 2 Fabien Dupont
-rw-r--r-- 1 root root 0 May  9 13:49 toto
249 2 Fabien Dupont
250 2 Fabien Dupont
/mnt/snapshot_of_home/fab:
251 2 Fabien Dupont
total 0
252 2 Fabien Dupont
</pre>
253 2 Fabien Dupont
254 2 Fabien Dupont
On voit bien que le snapshot contient l'état de /mnt/home avant la création du fichier toto.
255 2 Fabien Dupont
256 2 Fabien Dupont
h4. Monter un sous-volume
257 2 Fabien Dupont
258 2 Fabien Dupont
Pour monter un sous-volume précédement créé :
259 2 Fabien Dupont
260 2 Fabien Dupont
<pre>
261 2 Fabien Dupont
# btrfs subvolume list /mnt
262 2 Fabien Dupont
ID 261 gen 37 top level 5 path home
263 2 Fabien Dupont
ID 262 gen 41 top level 5 path snapshot_of_home
264 2 Fabien Dupont
# mount /dev/sdb1 /home -o subvolume=home
265 2 Fabien Dupont
#  df -HTP | grep sdb1
266 2 Fabien Dupont
/dev/sdb1      btrfs     8.0T  6.7G  8.0T   1% /home
267 2 Fabien Dupont
/dev/sdb1      btrfs     8.0T  6.7G  8.0T   1% /mnt
268 2 Fabien Dupont
# mkdir /home/fab
269 2 Fabien Dupont
# chown fab:fab /home/fab
270 2 Fabien Dupont
# ls -ld /mnt/home/fab /home/fab
271 1 Fabien Dupont
drwxr-xr-x 1 fab fab 8 May  9 13:49 /mnt/home/fab
272 1 Fabien Dupont
drwxr-xr-x 1 fab fab 8 May  9 13:49 /home/fab
273 1 Fabien Dupont
</pre>
274 3 Fabien Dupont
275 3 Fabien Dupont
h3. Monter un volume au boot (/etc/fstab)
276 3 Fabien Dupont
277 3 Fabien Dupont
h4. Monter un volume
278 3 Fabien Dupont
279 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.
280 3 Fabien Dupont
281 3 Fabien Dupont
Par exemple, pour un volume en raid1 sur /dev/sdb et /dev/sdc monté dans /pub au boot :
282 3 Fabien Dupont
283 3 Fabien Dupont
<pre>
284 3 Fabien Dupont
# grep btrfs /etc/fstab
285 3 Fabien Dupont
/dev/sdb  /pub  btrfs  defaults  0 0
286 3 Fabien Dupont
</pre>
287 3 Fabien Dupont
288 3 Fabien Dupont
h4. Monter un sous-volume (ou un snapshot)
289 3 Fabien Dupont
290 3 Fabien Dupont
Par exemple, pour monter le sous-volume home du volume précédent :
291 3 Fabien Dupont
292 3 Fabien Dupont
<pre>
293 3 Fabien Dupont
# grep btrfs /etc/fstab
294 3 Fabien Dupont
/dev/sdb  /pub  btrfs  defaults                 0 0
295 3 Fabien Dupont
/dev/sdb  /home btrfs  defaults,subvolume=home  0 0
296 3 Fabien Dupont
</pre>
297 3 Fabien Dupont
298 3 Fabien Dupont
h3. Gérer les disques d'un raid
299 3 Fabien Dupont
300 3 Fabien Dupont
h4. Remplacer un disque défaillant
301 3 Fabien Dupont
302 3 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.
303 3 Fabien Dupont
Il doit être remplacé physiquement puis :
304 3 Fabien Dupont
305 3 Fabien Dupont
<pre>
306 3 Fabien Dupont
# mkfs.btrfs /dev/sdc
307 3 Fabien Dupont
# mount -o remount,degraded /dev/sdb
308 3 Fabien Dupont
# btrfs device add /dev/sdc /pub
309 3 Fabien Dupont
# btrfs device delete missing /pub
310 4 Fabien Dupont
# mount -o remount /dev/sdb
311 3 Fabien Dupont
</pre>
312 3 Fabien Dupont
313 3 Fabien Dupont
Il faut toujours exécuter les opérations dans cet ordre : remonter le filesystem en mode dégradé, ajouter le nouveau disque, supprimer le disque « missing ». Ceci permet de ne jamais avoir un volume comprenant moins de disques que ce que le type de raid permet.
314 3 Fabien Dupont
315 3 Fabien Dupont
h4. Convertir un volume single en raid1
316 3 Fabien Dupont
317 3 Fabien Dupont
Par exemple, pour convertir le volume /dev/sdb monté dans /pub en raid1 avec /dev/sdc en plus :
318 3 Fabien Dupont
319 3 Fabien Dupont
<pre>
320 3 Fabien Dupont
# mkfs.btrfs /dev/sdc
321 3 Fabien Dupont
# btrfs device add /dev/sdc /pub
322 3 Fabien Dupont
# btrfs balance start -dconvert=raid1 -mconvert=raid1 /pub
323 3 Fabien Dupont
</pre>
324 3 Fabien Dupont
325 3 Fabien Dupont
La commande « balance » permet de redistribuer les données d'un volume BtrFs en fonction du type de raid.
326 3 Fabien Dupont
327 3 Fabien Dupont
Cette opération est similaire pour convertir en raid0, raid10, etc.
328 3 Fabien Dupont
329 3 Fabien Dupont
h2. Pour plus d'informations
330 3 Fabien Dupont
331 3 Fabien Dupont
https://btrfs.wiki.kernel.org/
332 3 Fabien Dupont
http://en.wikipedia.org/wiki/Btrfs
333 3 Fabien Dupont
http://manpages.debian.net/cgi-bin/man.cgi?sektion=8&query=mkfs.btrfs&apropos=0&manpath=sid&locale=en
334 3 Fabien Dupont
http://manpages.debian.net/cgi-bin/man.cgi?sektion=8&query=btrfs&apropos=0&manpath=sid&locale=en