<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Raid on inetshell</title><link>https://inet.sh/es/tags/raid/</link><description>Recent content in Raid on inetshell</description><generator>Hugo</generator><language>es</language><lastBuildDate>Fri, 25 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://inet.sh/es/tags/raid/index.xml" rel="self" type="application/rss+xml"/><item><title>mdadm: añadir un disco y crecer un RAID 5 (reshape) sin perder datos</title><link>https://inet.sh/es/posts/linux/mdadm-anadir-disco-crecer-raid5/</link><pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/linux/mdadm-anadir-disco-crecer-raid5/</guid><description>Ampliar un RAID 5 de mdadm con un disco más: mdadm --add, mdadm --grow --raid-devices con --backup-file en otro disco, vigilar el reshape en /proc/mdstat, acelerarlo con speed_limit_min y después crecer el sistema de archivos con resize2fs o xfs_growfs. Con lo que hay que comprobar antes y lo que no se puede deshacer.</description><content:encoded><![CDATA[<h2 id="en-corto">En corto</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">mdadm --add /dev/md0 /dev/sdd
</span></span><span class="line"><span class="cl">mdadm --grow /dev/md0 --raid-devices<span class="o">=</span><span class="m">4</span> --backup-file<span class="o">=</span>/root/md0-grow.bak   <span class="c1"># en OTRO disco, nunca en el array</span>
</span></span><span class="line"><span class="cl">cat /proc/mdstat                            <span class="c1"># reshape = [====&gt;....] 23.4% ... finish=310min</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># cuando termine:</span>
</span></span><span class="line"><span class="cl">resize2fs /dev/md0                          <span class="c1"># ext4, en caliente</span>
</span></span><span class="line"><span class="cl">xfs_growfs /mnt/vol1                        <span class="c1"># xfs, montado</span>
</span></span><span class="line"><span class="cl">rm /root/md0-grow.bak
</span></span></code></pre></td></tr></table>
</div>
</div><p>De 3 discos a 4 en un RAID 5: la capacidad útil pasa de 2 a 3 discos. El reshape reescribe todos los stripes y tarda <strong>horas o días</strong> según el tamaño; el array sigue en servicio mientras tanto.</p>
<h2 id="antes-de-tocar-nada">Antes de tocar nada</h2>
<ol>
<li>
<p><strong>Backup.</strong> El reshape es la operación más delicada de md: reescribe todos los datos con el array en producción. Si algo se va a romper, es aquí.</p>
</li>
<li>
<p><strong>Array sano.</strong> <code>mdadm --detail /dev/md0</code> debe decir <code>State : clean</code> sin <code>degraded</code>, <code>recovering</code> ni <code>resyncing</code>. Nunca hagas <code>--grow</code> sobre un array degradado.</p>
</li>
<li>
<p><strong>Discos sanos.</strong> <code>smartctl -H /dev/sdX</code> en todos los miembros. Un disco que muere a mitad del reshape de un RAID 5 es pérdida total.</p>
</li>
<li>
<p><strong>Disco nuevo del mismo tamaño o mayor.</strong> Si el array usa particiones en vez de discos completos, copia la tabla del disco existente al nuevo:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sfdisk -d /dev/sda <span class="p">|</span> sfdisk /dev/sdd            <span class="c1"># MBR</span>
</span></span><span class="line"><span class="cl">sgdisk -R /dev/sdd /dev/sda <span class="o">&amp;&amp;</span> sgdisk -G /dev/sdd   <span class="c1"># GPT (-G regenera los GUID)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>y añade <code>/dev/sdd1</code> en lugar de <code>/dev/sdd</code>.</p>
</li>
</ol>
<h2 id="paso-a-paso">Paso a paso</h2>
<p><strong>1. Añadir el disco.</strong> Entra como <em>spare</em>:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">mdadm --add /dev/md0 /dev/sdd
</span></span><span class="line"><span class="cl">mdadm --detail /dev/md0 <span class="p">|</span> tail -6       <span class="c1"># ... 3 8 48 - spare /dev/sdd</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>2. Crecer el array.</strong> Es lo que arranca el reshape:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">mdadm --grow /dev/md0 --raid-devices<span class="o">=</span><span class="m">4</span> --backup-file<span class="o">=</span>/root/md0-grow.bak
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>--backup-file</code> guarda una copia de los stripes que están siendo reescritos en el tramo crítico del reshape. Tiene que estar en un disco <strong>que no forme parte del array</strong> y que no sea <code>tmpfs</code>. En arrays con metadata 1.2 y espacio libre antes del área de datos mdadm a veces avisa de que no lo necesita; darlo no hace daño.</p>
<p><strong>3. Vigilar.</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">watch -n <span class="m">30</span> cat /proc/mdstat
</span></span></code></pre></td></tr></table>
</div>
</div><p>Por defecto md se autolimita para no matar el rendimiento (<code>speed_limit_min</code> = 1000 KB/s cuando hay carga). Si el array no está atendiendo a nadie, súbelo:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sysctl -w dev.raid.speed_limit_min<span class="o">=</span><span class="m">200000</span>
</span></span><span class="line"><span class="cl">sysctl -w dev.raid.speed_limit_max<span class="o">=</span><span class="m">500000</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>4. Crecer el sistema de archivos.</strong> Cuando <code>/proc/mdstat</code> ya no muestre <code>reshape</code>, <code>mdadm --detail</code> dará <code>Raid Devices : 4</code> y un <code>Array Size</code> mayor. El sistema de archivos sigue ocupando el tamaño viejo:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">resize2fs /dev/md0            <span class="c1"># ext2/3/4, funciona montado</span>
</span></span><span class="line"><span class="cl">xfs_growfs /mnt/vol1          <span class="c1"># xfs, se indica el punto de montaje, montado</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>5. Limpieza.</strong> Borra el backup-file. <code>/etc/mdadm/mdadm.conf</code> no cambia: la línea <code>ARRAY</code> identifica el array por UUID, no por número de discos. Si <code>/</code> vive en el array, regenera el initramfs por prudencia (<code>update-initramfs -u</code> en Debian/Ubuntu, <code>dracut -f</code> en RHEL/Fedora).</p>
<h2 id="trampas">Trampas</h2>
<ul>
<li><strong>No se puede deshacer.</strong> Una vez empieza el reshape solo termina hacia delante. Puedes reiniciar la máquina (continúa solo al ensamblar) pero no cancelarlo.</li>
<li><strong>Corte de luz a mitad.</strong> Si al arrancar el array no se ensambla, <code>mdadm --assemble /dev/md0 --backup-file=/root/md0-grow.bak /dev/sd[abcd]</code>; ahí es donde el backup-file se gana el nombre.</li>
<li><strong>Bitmap.</strong> Si mdadm se niega por el <em>write-intent bitmap</em>, quítalo antes y vuelve a ponerlo al terminar: <code>mdadm --grow --bitmap=none /dev/md0</code> … <code>mdadm --grow --bitmap=internal /dev/md0</code>.</li>
<li><strong>Cambiar el chunk</strong> (<code>mdadm --grow --chunk=128 /dev/md0</code>) también es un reshape completo, con las mismas reglas.</li>
<li><strong>Discos grandes en RAID 5</strong> son una apuesta: con 4 discos de 8 TB, la reconstrucción tras un fallo dura días sin redundancia. El mismo <code>--grow</code> permite pasar a RAID 6: <code>mdadm --grow /dev/md0 --level=6 --raid-devices=5 --backup-file=…</code>.</li>
<li><strong>Discos completos vs particiones.</strong> Mezclar <code>/dev/sdd</code> con <code>/dev/sda1</code> funciona pero luego confunde; sigue el patrón que ya tenga el array.</li>
</ul>
<p>Referencias: <a href="https://raid.wiki.kernel.org/index.php/Growing">Growing</a> en la Linux RAID Wiki y <code>man 8 mdadm</code> (sección <em>GROW MODE</em>).</p>
]]></content:encoded></item></channel></rss>