mirroir readonly du Gitit wiki.evolix.org (attention, ne rien commiter/merger sur ce dépôt) https://wiki.evolix.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

HowtoRAIDLogiciel.md 11 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. ---
  2. title: Howto RAID logiciel sous Linux
  3. categories: RAID
  4. ...
  5. * Documentation : <https://raid.wiki.kernel.org/index.php/Linux_Raid>
  6. Sous Linux, on peut utiliser du [RAID](https://fr.wikipedia.org/wiki/RAID_%28informatique%29) logiciel : c'est géré via le module noyau **md-mod** qui permet de faire des volumes RAID0/1/5 (et [autres](https://raid.wiki.kernel.org/index.php/Introduction#The_RAID_levels)) sur des périphériques bloc.
  7. ## Installation
  8. ~~~
  9. # apt install mdadm
  10. $ /sbin/mdadm -V
  11. mdadm - v3.3.2 - 21st August 2014
  12. $ /sbin/modinfo md_mod
  13. filename: /lib/modules/3.16.0-4-amd64/kernel/drivers/md/md-mod.ko
  14. alias: block-major-9-*
  15. alias: md
  16. description: MD RAID framework
  17. license: GPL
  18. depends:
  19. intree: Y
  20. vermagic: 3.16.0-4-amd64 SMP mod_unload modversions
  21. parm: start_dirty_degraded:int
  22. ~~~
  23. ## Création d'un volume RAID
  24. On doit ensuite créer des partitions de type *Linux raid autodetect* (code *'FD*') :
  25. Par exemple avec `parted` :
  26. ~~~
  27. # parted /dev/sdz
  28. (parted) mkpart logical 51,5GB 200GB
  29. (parted) align-check optimal 8
  30. 8 aligned
  31. (parted) set 8 raid on
  32. (parted) p
  33. [...]
  34. 8 51,5GB 200GB 148GB logical raid
  35. ~~~
  36. Par exemple 2 partitions */dev/sdy1* et */dev/sdz1* de tailles identiques pour créer un volume RAID1.
  37. On initialise le ainsi le RAID :
  38. ~~~
  39. # mdadm --create /dev/md42 --chunk=64 --metadata=default --level=raid1 --raid-devices=2 /dev/sdy1 /dev/sdz1
  40. # mdadm --query /dev/md42
  41. /dev/md0: 1332.53GiB raid1 2 devices, 0 spares. Use mdadm --detail for more detail.
  42. # mdadm --detail /dev/md42
  43. /dev/md0:
  44. Version : 1.2
  45. Creation Time : Fri Nov 19 17:22:46 2010
  46. Raid Level : raid1
  47. Array Size : 1397260542 (1332.53 GiB 1430.79 GB)
  48. Used Dev Size : 1397260542 (1332.53 GiB 1430.79 GB)
  49. Raid Devices : 2
  50. Total Devices : 2
  51. Persistence : Superblock is persistent
  52. Update Time : Sat Nov 20 01:05:41 2010
  53. State : active
  54. Active Devices : 2
  55. Working Devices : 2
  56. Failed Devices : 0
  57. Spare Devices : 0
  58. Name : cap:0 (local to host cap)
  59. UUID : 02549957:1e2c95c8:306391ad:c979ee50
  60. Events : 35
  61. Number Major Minor RaidDevice State
  62. 0 8 33 0 active sync /dev/sdy1
  63. 1 8 49 1 active sync /dev/sdz1
  64. ~~~
  65. Vous avez donc */dev/md42* : un périphérique de stockage utilisable.
  66. Vous pouvez maintenant le formater, par exemple en _ext4_ :
  67. ~~~
  68. # mkfs.ext4 /dev/md42
  69. ~~~
  70. Vous devez répéter cette opération pour avoir plusieurs volumes RAID, notamment
  71. pour avoir plusieurs partitions (/var, /usr/, /home, etc.), vous aurez donc de
  72. multiples partitions *Linux raid autodetect* sur vos disques.
  73. Chaque volume RAID doit être présent dans `/etc/mdadm/mdadm.conf` avec son UUID (c'est géré automatiquement en thérie) :
  74. ~~~
  75. ARRAY /dev/md42 UUID=457bb528:02ab827a:a7d2dac2:42fd5302
  76. ~~~
  77. ## Opérations sur les disques et volumes RAID
  78. ### Remplacer un disque
  79. Cas classique : vous avez un disque défectueux (prenons */dev/sdz*) et plusieurs volumes RAID,
  80. par exemple *md1*, *md2*, etc. Voici précisément comment le remettre en place :
  81. En table de partitions DOS :
  82. ~~~
  83. # sfdisk -d /dev/sda > /tmp/part.out
  84. # sfdisk -f /dev/sdz < /tmp/part.out
  85. # partprobe /dev/sdz
  86. ~~~
  87. En table de partitions GPT (valable à partir de Debian 7) :
  88. ~~~
  89. # apt install gdisk
  90. # sgdisk -R=/dev/sdz /dev/sda
  91. # sgdisk -G /dev/sdz
  92. ~~~
  93. Puis on restaure les partitions, par exemple :
  94. ~~~
  95. # mdadm /dev/md1 --add /dev/sdz1
  96. mdadm: added /dev/sdz1
  97. # mdadm /dev/md2 --add /dev/sdz2
  98. mdadm: added /dev/sdz2
  99. # mdadm /dev/md3 --add /dev/sdz3
  100. mdadm: added /dev/sdz3
  101. # mdadm /dev/md5 --add /dev/sdz5
  102. mdadm: added /dev/sdz5
  103. # mdadm /dev/md6 --add /dev/sdz7
  104. mdadm: added /dev/sdz7
  105. ~~~
  106. > *Note* : `sfdisk` peut nécessiter d'avoir un disque déjà partitionné, le contournement est de créer une partition quelconque avant de l'utiliser avec un disque vierge.
  107. ### Sortir une partition d'un volume RAID
  108. Si vous devez sortir un disque d'un volume RAID pour une raison ou une autre :
  109. ~~~
  110. # mdadm /dev/md42 --fail /dev/sdz1
  111. mdadm: set /dev/sdz1 faulty in /dev/md42
  112. # mdadm /dev/md42 --remove /dev/sdz1
  113. mdadm: hot removed /dev/sdz1 from /dev/md42
  114. ~~~
  115. ### Désactiver un volume RAID
  116. ~~~
  117. # mdadm --stop /dev/md42
  118. mdadm: stopped /dev/md42
  119. ~~~
  120. ### Créer un volume RAID sans disposer de tous les disques
  121. On peut vouloir (re-)créer un volume RAID sans pour autant disposer de tous les disques au moment de l'opération (récupération des données d'un ancien disque lorsqu'on ne dispose que de deux emplacements par exemple) :
  122. ~~~
  123. # mdadm --create /dev/md42 --level=1 --force --raid-devices=1 /dev/sdy1
  124. ~~~
  125. On peut alors formater */dev/md42*, et copier les fichiers dessus, avant d'ajouter le disque manquant à la grappe (remplacement du disque original dans cet exemple) :
  126. ~~~
  127. # mdadm --manage /dev/md42 --add /dev/sdz1
  128. # mdadm --grow /dev/md42 --raid-devices=2
  129. # cat /proc/mdstat
  130. Personalities : [raid1]
  131. md42: active raid1 sdy1[1] sdz1[0]
  132. 1893933820 blocks super 1.2 [2/1] [U_]
  133. [>....................] recovery = 4.0% (75859776/1893933820) finish=493.5min speed=61391K/sec
  134. ~~~
  135. ### Vérification d'un volume RAID
  136. Pour lancer une vérification d'un volume RAID :
  137. ~~~
  138. # /usr/share/mdadm/checkarray /dev/md42
  139. checkarray: I: check queued for array md42.
  140. # cat /proc/mdstat
  141. md42: active raid1 sdw1[3] sdx1[0] sdy1[1] sdy1[2]
  142. 203712 blocks [4/4] [UUUU]
  143. [==========>..........] check = 52.0% (106240/203712) finish=1.5min speed=1032K/sec
  144. ~~~
  145. > *Note* : attention, cette vérification est évidemment gourmande en I/O disque
  146. Pour annuler une vérification en cours :
  147. ~~~
  148. # /usr/share/mdadm/checkarray --cancel /dev/md42
  149. checkarray: I: cancel request queued for array md42.
  150. ~~~
  151. ## Monitoring
  152. Pour voir les volumes RAID en activité :
  153. ~~~
  154. # mdadm --detail --scan
  155. ~~~
  156. ### Le fichier /proc/mdstat
  157. Ce pseudo-fichier contient la liste des volumes RAID avec le type, l'état, les disques utilisés :
  158. ~~~
  159. # cat /proc/mdstat
  160. md1 : active raid1 sdb1[1] sda1[0]
  161. 512896 blocks [2/2] [UU]
  162. md2 : active raid1 sdb2[1] sda2[0]
  163. 1023936 blocks [2/2] [UU]
  164. md3 : active raid1 sdb3[1] sda3[0]
  165. 10239936 blocks [2/2] [UU]
  166. ~~~
  167. Le *[UU]* indique que les disques sont opérationnels. Si un des disques est en erreur, le *U* sera remplacé par un _.
  168. ### Le démon mdadm
  169. Un démon _mdadm_ est lancé par défaut pour détecter la panne d'un disque dur (entre autre), et envoyer un email le cas échéant.
  170. ~~~
  171. # ps -ef |grep mdadm
  172. root 3858 1 0 Apr15 ? 00:00:19 /sbin/mdadm --monitor --pid-file /var/run/mdadm/monitor.pid --daemonise --scan --syslog
  173. ~~~
  174. On s'assurera que le fichier */etc/default/mdadm* contient les informations :
  175. ~~~
  176. INITRDSTART='all'
  177. AUTOSTART=true
  178. AUTOCHECK=true
  179. START_DAEMON=true
  180. ~~~
  181. Dès qu'une panne disque est détectée, mdadm inscrit l'information dans _syslog_ :
  182. ~~~
  183. May 10 14:28:44 serveur mdadm[3858]: Fail event detected on md device /dev/md42, component device /dev/sdz1
  184. ~~~
  185. Un mail est également envoyé à root (par défaut) pour l'informer de la situation. Le destinataire du mail peut se changer dans le fichier de configuration */etc/mdadm/mdadm.conf* grâce à la directive *MAILADDR* :
  186. ~~~
  187. MAILADDR notification@example.com
  188. ~~~
  189. ### mdadm day
  190. Tous les 1er dimanches du mois, un script est lancé en crontab pour lancer une vérification de tous les volumes RAID :
  191. ~~~
  192. $ grep -v ^# /etc/cron.d/mdadm
  193. 57 0 * * 0 root if [ -x /usr/share/mdadm/checkarray ] && [ $(date +\%d) -le 7 ]; then /usr/share/mdadm/checkarray --cron --all --idle --quiet; fi
  194. ~~~
  195. Si nécessaire d'interrompre cette vérification : `/usr/share/mdadm/checkarray --cancel --all`
  196. ## Plomberie
  197. ### superblock
  198. <https://raid.wiki.kernel.org/index.php/RAID_superblock_formats>
  199. Le RAID logiciel sous Linux réserve un peu de place sur chaque périphérique : c'est le **superblock**.
  200. Cet espace contient les _metadatas_ : taille, journal, bitmap (si activé), bad blocks log, etc.
  201. Il y a plusieurs formats de superblock (0.9, 1, 1.0, 1.1…) : le défaut est désormais **1.2**
  202. Avec le format 1.2, 4K sont réservés au début du périphérique pour les _metadatas_. Cela rend indispensable la compréhension de ce format pour son utilise (exemple : GRUB doit forcément comprendre le format 1.2 pour pouvoir lire les données).
  203. ## FAQ
  204. ### Changer la taille du cache
  205. Pour synchroniser un volume RAID (la valeur par défaut de 4096K) :
  206. ~~~
  207. # echo 32768 > /sys/block/md42/md/stripe_cache_size
  208. ~~~
  209. > *Note* : Attention, cela consomme davantage de CPU/RAM.
  210. > *Note* : Cela semble obsolète sur les Linux récents
  211. ### Activer le bitmap
  212. Cela permet d'identifier les blocs modifiés et gagner du temps en cas de future resynchronisation.
  213. ~~~
  214. # mdadm --grow --bitmap=internal /dev/md42
  215. ~~~
  216. > **Note** : C'est activé par défaut en Debian 8. Avec des méta-donées en v1.20.
  217. ### Erreur "does not have a valid v0.90 superblock"
  218. Si vous obtenez des erreurs du type :
  219. ~~~
  220. kernel: md: invalid raid superblock magic on sda1
  221. kernel: md: sda1 does not have a valid v0.90 superblock, not importing!
  222. ~~~
  223. C'est que l'auto-détection du noyau Linux n'a pas fonctionné (il paraît que c'est [obsolète](http://bugs.debian.org/627281)).
  224. Il faut donc manuellement ajouter les lignes correspondant au volume RAID dans le fichier `/etc/mdadm/mdadm.conf` grâce à l'outil `/usr/share/mdadm/mkconf`.
  225. ### Erreur "does not appear to be active"
  226. Si un volume est inactif (par exemple après le changement d'un disque) :
  227. ~~~
  228. # cat /proc/mdstat
  229. Personalities : [raid1] [raid6] [raid5] [raid4]
  230. md9 : inactive sda10[0](S) sdc10[2](S) sdb10[5](S)
  231. 5568856791 blocks super 1.2
  232. ~~~
  233. Vous avez beau tout faire pour le réactiver :
  234. ~~~
  235. # mdadm /dev/md9 --remove /dev/sdd10
  236. # mdadm --stop /dev/md9
  237. # mdadm --assemble /dev/md9
  238. # mdadm --detail /dev/md9
  239. mdadm: md device /dev/md9 does not appear to be active.
  240. # mdadm --stop /dev/md9
  241. # mdadm --assemble --force /dev/md9
  242. mdadm: device 4 in /dev/md9 has wrong state in superblock, but /dev/sdd10 seems ok
  243. mdadm: /dev/md9 assembled from 3 drives and 1 spare - not enough to start the array while not clean - consider --force.
  244. ~~~
  245. Mais rien à faire, votre volume reste inactif… même avec 4 disques :
  246. ~~~
  247. # cat /proc/mdstat
  248. Personalities : [raid1] [raid6] [raid5] [raid4]
  249. md9 : inactive sda10[0](S) sdd10[4](S) sdc10[2](S) sdb10[5](S)
  250. 7425142388 blocks super 1.2
  251. ~~~
  252. La solution est d'invoquer une prière vaudoue et de lancer `--assemble --force --scan` :
  253. ~~~
  254. # mdadm --stop /dev/md9
  255. mdadm: stopped /dev/md9
  256. # mdadm --assemble --force --scan /dev/md9
  257. mdadm: clearing FAULTY flag for device 3 in /dev/md9 for /dev/sdd10
  258. mdadm: Marking array /dev/md9 as 'clean'
  259. mdadm: failed to add /dev/sdd10 to /dev/md9: Device or resource busy
  260. mdadm: /dev/md9 has been started with 3 drives (out of 4).
  261. ~~~
  262. Votre volume est désormais actif, il vous reste qu'à ajouter le nouveau disque pour lancer la reconstruction.
  263. ### Accélérer la resynchro
  264. ~~~
  265. # echo 50000 > /proc/sys/dev/raid/speed_limit_min
  266. ~~~
  267. Pour plus détails, voir <https://www.cyberciti.biz/tips/linux-raid-increase-resync-rebuild-speed.html>