<?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>Ceph on inetshell</title><link>https://inet.sh/es/tags/ceph/</link><description>Recent content in Ceph 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/ceph/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><item><title>Ceph en Proxmox: quitar el HEALTH_WARN 'daemons have recently crashed' y borrar discos de VM huérfanos en RBD</title><link>https://inet.sh/es/posts/proxmox/ceph-crash-archive-rbd-huerfanos/</link><pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/proxmox/ceph-crash-archive-rbd-huerfanos/</guid><description>Dos limpiezas habituales en un Ceph gestionado por Proxmox VE: archivar crashes ya revisados para volver a HEALTH_OK (ceph crash ls-new, info, archive-all) y encontrar y borrar imágenes RBD que ya no pertenecen a ninguna VM (pvesm free, rbd rm, watchers y snapshots que lo impiden).</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></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"># HEALTH_WARN: N daemons have recently crashed</span>
</span></span><span class="line"><span class="cl">ceph crash ls-new
</span></span><span class="line"><span class="cl">ceph crash info &lt;id&gt;          <span class="c1"># qué daemon, cuándo y el backtrace</span>
</span></span><span class="line"><span class="cl">ceph crash archive-all        <span class="c1"># el aviso desaparece; el crash sigue en `ceph crash ls`</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Discos de VM que ya no existe</span>
</span></span><span class="line"><span class="cl">rbd ls -l cephpool
</span></span><span class="line"><span class="cl">pvesm free cephpool:vm-124-disk-1     <span class="c1"># por la capa de storage de Proxmox</span>
</span></span><span class="line"><span class="cl">rbd rm cephpool/vm-124-disk-1         <span class="c1"># o directo en Ceph</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="health_warn-daemons-have-recently-crashed">HEALTH_WARN: daemons have recently crashed</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-text" data-lang="text"><span class="line"><span class="cl">HEALTH_WARN 1 daemons have recently crashed
</span></span><span class="line"><span class="cl">[WRN] RECENT_CRASH: 1 daemons have recently crashed
</span></span><span class="line"><span class="cl">    osd.5 crashed on host pve-node2 at 2026-09-20T03:14:07.123456Z
</span></span></code></pre></td></tr></table>
</div>
</div><p>Es el chequeo <code>RECENT_CRASH</code> del módulo <code>crash</code> del manager: un daemon se cayó, dejó un reporte, y el aviso se queda hasta que un administrador lo <strong>archive</strong>, o hasta que pasen dos semanas (<code>mgr/crash/warn_recent_interval</code>). El daemon casi siempre ya volvió solo; el aviso no dice que siga caído.</p>
<p>Antes de archivar, mira qué fue:</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 crash ls-new
</span></span><span class="line"><span class="cl">ceph crash info 2026-09-20T03:14:07.123456Z_9f1c...
</span></span></code></pre></td></tr></table>
</div>
</div><p>Del <code>info</code> importan <code>entity_name</code> (qué daemon), <code>utc_timestamp</code>, <code>assert_msg</code> o <code>backtrace</code>, y <code>ceph_version</code>. Después:</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><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</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 stat                          <span class="c1"># ¿siguen todos up/in?</span>
</span></span><span class="line"><span class="cl">systemctl status ceph-osd@5            <span class="c1"># en el nodo del OSD</span>
</span></span><span class="line"><span class="cl">journalctl -u ceph-osd@5 --since <span class="s1">&#39;-1h&#39;</span>
</span></span><span class="line"><span class="cl">dmesg -T <span class="p">|</span> grep -iE <span class="s1">&#39;sd[a-z]|nvme|i/o error&#39;</span>
</span></span><span class="line"><span class="cl">smartctl -a /dev/sdX                   <span class="c1"># si el crash coincide con errores de disco</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Con eso decidido, archiva:</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><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 crash archive &lt;id&gt;
</span></span><span class="line"><span class="cl">ceph crash archive-all
</span></span><span class="line"><span class="cl">ceph -s                                <span class="c1"># HEALTH_OK si no hay nada más</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Archivar no arregla nada; solo reconoce que lo viste. Si el mismo OSD reaparece en <code>ls-new</code> cada pocos días, es un disco o una controladora, no un aviso molesto: sácalo del clúster y reemplázalo.</p>
<p>Para limpiar el histórico: <code>ceph crash rm &lt;id&gt;</code> o <code>ceph crash prune &lt;días&gt;</code>. El aviso se puede apagar del todo con <code>ceph config set mgr mgr/crash/warn_recent_interval 0</code>, que es exactamente lo que no quieres en producción.</p>
<h2 id="discos-de-vm-huérfanos-en-rbd">Discos de VM huérfanos en RBD</h2>
<p>Aparecen cuando una VM se borra con el storage inaccesible, un clon o una migración fallan a medias, alguien borra el <code>.conf</code> a mano o queda una restauración incompleta. Ocupan espacio y no salen en la GUI porque ningún <code>.conf</code> los menciona.</p>
<h3 id="encontrarlos">Encontrarlos</h3>
<p>Compara las imágenes del pool con los <code>.conf</code> de <strong>todos</strong> los nodos (en <code>/etc/pve/nodes/</code> está la copia de cada uno):</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><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</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="k">for</span> img in <span class="k">$(</span>rbd ls cephpool<span class="k">)</span><span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">  grep -rqs <span class="s2">&#34;cephpool:</span><span class="nv">$img</span><span class="s2">&#34;</span> /etc/pve/nodes/*/qemu-server /etc/pve/nodes/*/lxc <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="o">||</span> <span class="nb">echo</span> <span class="s2">&#34;sin dueño: </span><span class="nv">$img</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span>
</span></span><span class="line"><span class="cl">rbd ls -l cephpool          <span class="c1"># tamaños</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>pvesm list cephpool</code> da la misma lista con el VMID que Proxmox deduce del nombre; útil para cruzar con <code>qm list</code> y <code>pct list</code> en cada nodo.</p>
<h3 id="si-la-vm-sigue-existiendo">Si la VM sigue existiendo</h3>
<p>Que Proxmox lo vuelva a ver y bórralo desde ahí:</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">qm rescan --vmid <span class="m">124</span>        <span class="c1"># aparece como unused0 en el .conf</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Luego GUI → Hardware → disco <em>Unused</em> → <strong>Remove</strong>, que sí borra la imagen, o <code>pvesm free cephpool:vm-124-disk-1</code>. Ojo: <code>qm set 124 --delete unused0</code> solo lo quita del <code>.conf</code>, no borra datos.</p>
<h3 id="si-la-vm-ya-no-existe">Si la VM ya no existe</h3>
<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">pvesm free cephpool:vm-124-disk-1
</span></span><span class="line"><span class="cl"><span class="c1"># equivalente directo en Ceph:</span>
</span></span><span class="line"><span class="cl">rbd rm cephpool/vm-124-disk-1
</span></span></code></pre></td></tr></table>
</div>
</div><p>Cuando <code>rbd rm</code> se niega:</p>
<table>
  <thead>
      <tr>
          <th>Mensaje</th>
          <th>Causa</th>
          <th>Salida</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>image still has watchers</code></td>
          <td>Algún proceso la tiene abierta (una VM corriendo en otro nodo, un <code>rbd map</code>)</td>
          <td><code>rbd status cephpool/vm-124-disk-1</code> dice quién; apaga esa VM o <code>rbd unmap</code></td>
      </tr>
      <tr>
          <td><code>image has snapshots</code></td>
          <td>Quedan snapshots</td>
          <td><code>rbd snap purge cephpool/vm-124-disk-1</code> y repite</td>
      </tr>
      <tr>
          <td><code>cannot remove a protected snapshot</code></td>
          <td>Es un <code>base-*</code> de plantilla con clones</td>
          <td><code>rbd children cephpool/base-9000-disk-0@__base__</code>; los clones dependen de él, no lo borres</td>
      </tr>
  </tbody>
</table>
<h2 id="trampas">Trampas</h2>
<ul>
<li><strong>Cruza con todos los nodos</strong>, no con <code>qm list</code> del nodo donde estás; el disco de una VM que vive en otro nodo no es un huérfano.</li>
<li><strong><code>base-*</code> no es basura</strong>: son las plantillas. Bórralas solo con <code>qm destroy</code> de la plantilla.</li>
<li><strong>El espacio vuelve despacio</strong>: <code>ceph df</code> tarda un rato en reflejar el borrado mientras los OSD eliminan objetos.</li>
<li><strong>Pool entero de sobra</strong>: <code>pveceph pool destroy &lt;pool&gt; --force --remove_storages</code>; se lleva todo lo que haya dentro.</li>
</ul>
<h2 id="ver-también">Ver también</h2>
<ul>
<li><a href="/es/posts/proxmox/ceph-device-classes-crush-rules/">Ceph: device classes y CRUSH rules</a></li>
<li><a href="/es/posts/proxmox/vm-is-locked-snapshot-delete/">VM is locked (snapshot-delete)</a> — los snapshots RBD huérfanos aparecen ahí</li>
<li>Documentación de Ceph: <a href="https://docs.ceph.com/en/latest/rados/operations/health-checks/#recent-crash">Health checks — RECENT_CRASH</a></li>
</ul>
]]></content:encoded></item><item><title>Proxmox VE sin suscripción: repositorios no-subscription en PVE 9 (deb822) y PVE 8</title><link>https://inet.sh/es/posts/proxmox/repositorios-sin-suscripcion/</link><pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/proxmox/repositorios-sin-suscripcion/</guid><description>Cómo dejar un Proxmox VE sin suscripción actualizando sin errores 401: apagar pve-enterprise y activar pve-no-subscription (y el de Ceph) en PVE 9 con archivos .sources deb822 y en PVE 8 con .list. Incluye apt modernize-sources y el equivalente para Proxmox Backup Server.</description><content:encoded><![CDATA[<h2 id="en-corto">En corto</h2>
<p><strong>PVE 9</strong> (Debian 13 <em>trixie</em>, formato deb822):</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><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><span class="lnt">13
</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">cat &gt; /etc/apt/sources.list.d/proxmox.sources <span class="s">&lt;&lt;&#39;EOF&#39;
</span></span></span><span class="line"><span class="cl"><span class="s">Types: deb
</span></span></span><span class="line"><span class="cl"><span class="s">URIs: http://download.proxmox.com/debian/pve
</span></span></span><span class="line"><span class="cl"><span class="s">Suites: trixie
</span></span></span><span class="line"><span class="cl"><span class="s">Components: pve-no-subscription
</span></span></span><span class="line"><span class="cl"><span class="s">Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Apagar enterprise (sin suscripción devuelve 401 en cada apt update)</span>
</span></span><span class="line"><span class="cl">grep -q <span class="s1">&#39;^Enabled:&#39;</span> /etc/apt/sources.list.d/pve-enterprise.sources <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  <span class="o">||</span> <span class="nb">echo</span> <span class="s1">&#39;Enabled: false&#39;</span> &gt;&gt; /etc/apt/sources.list.d/pve-enterprise.sources
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">apt update <span class="o">&amp;&amp;</span> apt full-upgrade
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>PVE 8</strong> (Debian 12 <em>bookworm</em>, formato de una línea):</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><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</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="nb">echo</span> <span class="s1">&#39;deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription&#39;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  &gt; /etc/apt/sources.list.d/pve-no-subscription.list
</span></span><span class="line"><span class="cl">sed -i <span class="s1">&#39;s/^deb /# deb /&#39;</span> /etc/apt/sources.list.d/pve-enterprise.list
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">apt update <span class="o">&amp;&amp;</span> apt full-upgrade
</span></span></code></pre></td></tr></table>
</div>
</div><p>Si el host tiene Ceph, el repo enterprise de Ceph también hay que apagarlo y cambiarlo por su <code>no-subscription</code> (<a href="/es/posts/proxmox/repositorios-sin-suscripcion/#ceph">abajo</a>).</p>
<h2 id="qué-hace-cada-repositorio">Qué hace cada repositorio</h2>
<table>
  <thead>
      <tr>
          <th>Repo</th>
          <th>Para qué</th>
          <th>Sin suscripción</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>pve-enterprise</code></td>
          <td>Paquetes estables, los más probados. Requiere clave de suscripción</td>
          <td><code>apt update</code> da <strong>401 Unauthorized</strong></td>
      </tr>
      <tr>
          <td><code>pve-no-subscription</code></td>
          <td>Público. Mismos paquetes, un poco antes y con menos pruebas</td>
          <td>Funciona</td>
      </tr>
      <tr>
          <td><code>pve-test</code></td>
          <td>Lo más nuevo, para probar</td>
          <td>Funciona</td>
      </tr>
  </tbody>
</table>
<p>Proxmox lo dice claro: <code>pve-no-subscription</code> es para <strong>pruebas y uso no productivo</strong>; en producción quieren que pagues la suscripción y uses enterprise. Para un lab o un homelab es el repo normal.</p>
<p>El 401 de enterprise no rompe nada por sí mismo, pero cada <code>apt update</code> termina con error y el resto de repos queda a medio refrescar. Apagarlo es el arreglo; no hace falta borrarlo.</p>
<h2 id="pve-9-archivos-sources-deb822">PVE 9: archivos .sources (deb822)</h2>
<p>Desde PVE 9 el instalador ya escribe <code>/etc/apt/sources.list.d/pve-enterprise.sources</code> en formato deb822. Un <code>.sources</code> es un bloque de claves:</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><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-text" data-lang="text"><span class="line"><span class="cl"># /etc/apt/sources.list.d/pve-enterprise.sources
</span></span><span class="line"><span class="cl">Types: deb
</span></span><span class="line"><span class="cl">URIs: https://enterprise.proxmox.com/debian/pve
</span></span><span class="line"><span class="cl">Suites: trixie
</span></span><span class="line"><span class="cl">Components: pve-enterprise
</span></span><span class="line"><span class="cl">Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
</span></span><span class="line"><span class="cl">Enabled: false
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>Enabled: false</code> lo deja escrito pero inactivo. El de no-subscription es el bloque del <a href="/es/posts/proxmox/repositorios-sin-suscripcion/#en-corto">En corto</a>; el de test es igual con <code>Components: pve-test</code>.</p>
<p>Si arrastras archivos <code>.list</code> de una actualización desde PVE 8, apt 3 los convierte solo:</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">apt modernize-sources
</span></span></code></pre></td></tr></table>
</div>
</div><p>Reescribe cada <code>.list</code> como <code>.sources</code> y deja el original como <code>.list.bak</code>.</p>
<h2 id="pve-8-archivos-list">PVE 8: archivos .list</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></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl"># /etc/apt/sources.list.d/pve-enterprise.list
</span></span><span class="line"><span class="cl"># deb https://enterprise.proxmox.com/debian/pve bookworm pve-enterprise
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># /etc/apt/sources.list.d/pve-no-subscription.list
</span></span><span class="line"><span class="cl">deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription
</span></span></code></pre></td></tr></table>
</div>
</div><p>Comentar la línea enterprise con <code>#</code> equivale al <code>Enabled: false</code> de deb822.</p>
<h2 id="ceph">Ceph</h2>
<p>El instalador también deja el repo <strong>enterprise</strong> de Ceph. Mismo tratamiento; el nombre del repo lleva la versión de Ceph que corre el clúster (<code>ceph -v</code>):</p>
<p>PVE 9:</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><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</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"># /etc/apt/sources.list.d/ceph.sources
</span></span><span class="line"><span class="cl">Types: deb
</span></span><span class="line"><span class="cl">URIs: http://download.proxmox.com/debian/ceph-tentacle
</span></span><span class="line"><span class="cl">Suites: trixie
</span></span><span class="line"><span class="cl">Components: no-subscription
</span></span><span class="line"><span class="cl">Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
</span></span></code></pre></td></tr></table>
</div>
</div><p>Cambia <code>ceph-tentacle</code> por <code>ceph-squid</code> si sigues en Squid. Si el archivo original tenía <code>Components: enterprise</code>, reemplázalo entero por este.</p>
<p>PVE 8:</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><span class="lnt">3
</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"># /etc/apt/sources.list.d/ceph.list
</span></span><span class="line"><span class="cl"># deb https://enterprise.proxmox.com/debian/ceph-squid bookworm enterprise
</span></span><span class="line"><span class="cl">deb http://download.proxmox.com/debian/ceph-squid bookworm no-subscription
</span></span></code></pre></td></tr></table>
</div>
</div><p>En bookworm existen <code>ceph-quincy</code>, <code>ceph-reef</code> y <code>ceph-squid</code>; usa el que corresponda a tu clúster, no el más nuevo.</p>
<h2 id="proxmox-backup-server">Proxmox Backup Server</h2>
<p>Idéntico patrón con <code>pbs</code> en la URI y <code>pbs-no-subscription</code> como componente:</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><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</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"># /etc/apt/sources.list.d/proxmox.sources (PBS 4, trixie)
</span></span><span class="line"><span class="cl">Types: deb
</span></span><span class="line"><span class="cl">URIs: http://download.proxmox.com/debian/pbs
</span></span><span class="line"><span class="cl">Suites: trixie
</span></span><span class="line"><span class="cl">Components: pbs-no-subscription
</span></span><span class="line"><span class="cl">Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
</span></span></code></pre></td></tr></table>
</div>
</div><p>Y <code>Enabled: false</code> en <code>pbs-enterprise.sources</code>.</p>
<h2 id="trampas">Trampas</h2>
<ul>
<li><strong>No mezcles suites.</strong> <code>bookworm</code> en PVE 8, <code>trixie</code> en PVE 9. Una línea con la suite equivocada rompe el siguiente <code>full-upgrade</code>.</li>
<li><strong>El keyring ya está.</strong> <code>/usr/share/keyrings/proxmox-archive-keyring.gpg</code> viene con cualquier instalación desde ISO. Solo hace falta descargarlo cuando instalas Proxmox encima de un Debian limpio (lo explica la guía oficial de esa vía).</li>
<li><strong><code>Signed-By</code> es obligatorio en deb822</strong>; sin esa línea apt ignora el repo con un aviso.</li>
<li><strong>Si apt falla con <code>pve-apt-hook: not found</code></strong>, no es un problema de repos: <a href="/es/posts/proxmox/pve-apt-hook-not-found/">ese es otro post</a>.</li>
<li><strong>El aviso de &ldquo;no valid subscription&rdquo; de la GUI</strong> es independiente de los repos y no se arregla aquí; una suscripción Community lo quita y de paso te da el repo enterprise.</li>
</ul>
<p>Referencia: <a href="https://pve.proxmox.com/wiki/Package_Repositories">Package Repositories</a> en la wiki de Proxmox.</p>
]]></content:encoded></item></channel></rss>