<?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>Crush on inetshell</title><link>https://inet.sh/es/tags/crush/</link><description>Recent content in Crush 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/crush/index.xml" rel="self" type="application/rss+xml"/><item><title>Ceph en Proxmox: device classes y CRUSH rules para separar SAS, SSD y NVMe</title><link>https://inet.sh/es/posts/proxmox/ceph-device-classes-crush-rules/</link><pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/proxmox/ceph-device-classes-crush-rules/</guid><description>Cómo hacer que un pool de Ceph en Proxmox VE use solo un tipo de disco: asignar device classes a los OSD (set-device-class, con rm-device-class antes si ya tenían una), crear una CRUSH rule replicada por clase y apuntar el pool a esa regla con pveceph o ceph osd pool set. Incluye clases personalizadas como sas.</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><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</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"><span class="c1"># 1. Clase del OSD. Si ya tiene una (hdd/ssd/nvme automática), quítala primero: Ceph no la pisa</span>
</span></span><span class="line"><span class="cl">ceph osd crush rm-device-class osd.5
</span></span><span class="line"><span class="cl">ceph osd crush set-device-class sas osd.5
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. Regla que solo coloca datos en esa clase (root &#34;default&#34;, dominio de fallo &#34;host&#34;)</span>
</span></span><span class="line"><span class="cl">ceph osd crush rule create-replicated replicated_sas default host sas
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. Pool nuevo sobre la regla, dado de alta como storage en Proxmox</span>
</span></span><span class="line"><span class="cl">pveceph pool create vm-sas --crush_rule replicated_sas --add_storages <span class="m">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># ...o mover un pool que ya existe (reequilibra todos sus datos)</span>
</span></span><span class="line"><span class="cl">pveceph pool <span class="nb">set</span> vm-fast --crush_rule replicated_sas
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="por-qué">Por qué</h2>
<p>La regla por defecto de Ceph (<code>replicated_rule</code>) reparte objetos entre <strong>todos</strong> los OSD sin mirar qué disco hay debajo. En un clúster mixto eso significa que el pool &ldquo;rápido&rdquo; también cae en los discos lentos y rinde como el peor de ellos.</p>
<p>Desde Luminous cada OSD lleva una <strong>device class</strong>. Ceph la detecta sola al arrancar (<code>hdd</code>, <code>ssd</code> o <code>nvme</code>) y una CRUSH rule puede limitarse a una clase: internamente crea una jerarquía sombra (<code>default~sas</code>) con solo esos OSD y coloca ahí todo el pool. La clase es una etiqueta libre: además de las automáticas puedes usar <code>sas</code>, <code>sata</code>, <code>archive</code> o lo que te sirva para separar.</p>
<h2 id="ver-el-estado">Ver el estado</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></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">ceph osd tree                        <span class="c1"># columna CLASS por OSD</span>
</span></span><span class="line"><span class="cl">ceph osd crush class ls              <span class="c1"># clases que existen</span>
</span></span><span class="line"><span class="cl">ceph osd crush class ls-osd sas      <span class="c1"># OSD de una clase</span>
</span></span><span class="line"><span class="cl">ceph osd crush tree --show-shadow    <span class="c1"># las jerarquías sombra default~&lt;clase&gt;</span>
</span></span><span class="line"><span class="cl">ceph osd crush rule ls
</span></span><span class="line"><span class="cl">ceph osd crush rule dump replicated_sas
</span></span><span class="line"><span class="cl">ceph osd pool ls detail              <span class="c1"># crush_rule &lt;id&gt; de cada pool</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="cambiar-la-clase-de-un-osd">Cambiar la clase de un OSD</h2>
<p>Si el OSD ya tiene clase, <code>set-device-class</code> no la sobrescribe:</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-text" data-lang="text"><span class="line"><span class="cl">Error EBUSY: osd.5 has already bound to class &#39;hdd&#39;, can not reset class to &#39;sas&#39;;
</span></span><span class="line"><span class="cl">use &#39;ceph osd crush rm-device-class &lt;id&gt;&#39; to remove old class first
</span></span></code></pre></td></tr></table>
</div>
</div><p>De ahí el <code>rm-device-class</code> previo. Varios OSD de una vez:</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">ceph osd crush rm-device-class osd.5 osd.6 osd.7
</span></span><span class="line"><span class="cl">ceph osd crush set-device-class sas osd.5 osd.6 osd.7
</span></span></code></pre></td></tr></table>
</div>
</div><p>No existe un paso de &ldquo;crear la clase&rdquo;: el <code>ceph osd crush class create</code> de las primeras versiones de Luminous se eliminó, y la clase aparece con el primer OSD que la recibe. Para renombrarla en todo el clúster, <code>ceph osd crush class rename sas sas-10k</code>.</p>
<p>Una clase asignada a mano <strong>sobrevive a los reinicios</strong> del OSD: al arrancar, el OSD intenta poner su clase automática y recibe el mismo <code>EBUSY</code>. Si prefieres que los OSD nuevos nazcan sin clase para asignarla tú, <code>ceph config set osd osd_class_update_on_start false</code>; a cambio, ningún OSD nuevo tendrá clase automática.</p>
<h2 id="la-regla">La regla</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></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">ceph osd crush rule create-replicated &lt;nombre&gt; &lt;root&gt; &lt;dominio-de-fallo&gt; &lt;clase&gt;
</span></span><span class="line"><span class="cl">ceph osd crush rule create-replicated replicated_sas default host sas
</span></span><span class="line"><span class="cl">ceph osd crush rule create-replicated replicated_nvme default host nvme
</span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li><code>root</code> es <code>default</code> salvo que hayas montado tu propio árbol CRUSH.</li>
<li><code>host</code> como dominio de fallo pone cada réplica en un nodo distinto. Con <code>size 3</code> necesitas <strong>al menos tres nodos</strong> con OSD de esa clase, o los PG se quedan <code>undersized</code>.</li>
<li>Para pools erasure-coded la clase va en el perfil: <code>pveceph pool create ec-sas --erasure-coding k=4,m=2,device-class=sas</code>.</li>
</ul>
<h2 id="el-pool">El pool</h2>
<p>Nuevo, con storage de Proxmox incluido:</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">pveceph pool create vm-sas --crush_rule replicated_sas --size <span class="m">3</span> --min_size <span class="m">2</span> --add_storages <span class="m">1</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Existente: <code>pveceph pool set vm-fast --crush_rule replicated_sas</code>, o en la GUI <strong>Ceph → Pools → Edit → Crush Rule</strong>. Es lo mismo que <code>ceph osd pool set vm-fast crush_rule replicated_sas</code>. El cambio dispara un <strong>backfill de todo el pool</strong> hacia los OSD de la clase; hazlo en ventana de mantenimiento y síguelo con <code>ceph -s</code>.</p>
<h2 id="trampas">Trampas</h2>
<ul>
<li><strong>Cuenta los OSD antes de la regla.</strong> Tres nodos, <code>size 3</code>, y solo dos con discos <code>sas</code>: el pool nunca llega a <code>active+clean</code>.</li>
<li><strong>Las clases automáticas se equivocan</strong> con controladoras RAID/HBA que presentan SSD como rotacionales. Revisa <code>ceph osd tree</code> después de añadir discos y corrige con <code>rm-device-class</code> + <code>set-device-class</code>.</li>
<li><strong>Mover un pool grande de regla es mover todos sus datos.</strong> Sube <code>osd_max_backfills</code> solo si sabes lo que haces; por defecto va lento a propósito.</li>
<li><strong>Borrar un pool que se resiste</strong>: <code>pveceph pool destroy &lt;pool&gt; --force --remove_storages</code> (los datos se van con él).</li>
</ul>
<h2 id="ver-también">Ver también</h2>
<ul>
<li><a href="/es/posts/proxmox/ceph-crash-archive-rbd-huerfanos/">Ceph en Proxmox: crashes y discos huérfanos</a></li>
<li><a href="/es/posts/proxmox/repositorios-sin-suscripcion/">Repositorios sin suscripción</a> — incluye el repo de Ceph</li>
<li>Documentación de Ceph: <a href="https://docs.ceph.com/en/latest/rados/operations/crush-map/#device-classes">CRUSH Maps — Device classes</a></li>
</ul>
]]></content:encoded></item></channel></rss>