<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Mdadm on bramp.net</title>
    <link>https://blog.bramp.net/</link>
    <description>Recent content in Mdadm on bramp.net</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-GB</language>
    <lastBuildDate>Sun, 12 Sep 2021 13:09:07 -0700</lastBuildDate>
    <atom:link href="https://blog.bramp.net/tags/mdadm/" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Recovering a RAID-5 Intel Storage Matrix on Linux (without the hardware)</title>
      <link>https://blog.bramp.net/post/2021/09/12/recovering-a-raid-5-intel-storage-matrix-on-linux-without-the-hardware/</link>
      <pubDate>Sun, 12 Sep 2021 13:09:07 -0700</pubDate>
      
      <guid>https://blog.bramp.net/post/2021/09/12/recovering-a-raid-5-intel-storage-matrix-on-linux-without-the-hardware/</guid>
      <description><p>I recently found hard drives from an old RAID array I stopped using over a decade ago. I wanted to <a href="https://raid.wiki.kernel.org/index.php/RAID_Recovery">recover the data</a> from these disks, and that turned out to be more challenging than expected. This post outlines the steps, and hopefully helps someone else in future.</p>
<p>This was a four 750GB disk RAID-5 array using Intel Storage Matrix &ldquo;fake-raid&rdquo; (now called <a href="https://en.wikipedia.org/wiki/Intel_Rapid_Storage_Technology">Intel Rapid Storage Technology</a>). This is a RAID solution that uses a mix of software and hardware. I no longer have this Intel hardware, and in fact I no longer have a machine that would accept four drives. Luckily <code>mdadm</code> seems to have a pure software implementation of Intel Storage Matrix, so I hatched a plan. I would:</p>
<ol>
<li>Create disk images for each of the four drives,</li>
<li>Mount the images locally as block devices,</li>
<li>Use <code>mdadm</code> to construct an array,</li>
<li>Copy the data into my backups.</li>
</ol>
<h1 id="1-create-disk-images">1. Create disk images</h1>
<p>I have a <a href="https://www.google.com/search?q=usb+sata+adapter">USB SATA adapter</a>, and connected one drive at a time to my PC. This computer has a single local 12 TB drive, which I would store the disk images to. I start to create the disk images using:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ sudo dd <span class="k">if</span><span class="o">=</span>/dev/sdc <span class="nv">of</span><span class="o">=</span>1.raw
</span></span></code></pre></div><p>This worked great for the first disk, but the 2nd disk fail around the 600GB point. It seems this drive has developed bad blocks, but I kept my fingers crossed that this was still recoverable since this was RAID-5 after all. I switched up to using <a href="https://www.gnu.org/software/ddrescue/"><code>ddrescue</code></a>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ sudo ddrescue /dev/sdc 2.raw 2.log --try-again --force --verbose
</span></span></code></pre></div><p>This worked great, and was able to create a full 750GB image, slowly retiring the failed blocks, recovering as much as possible. After about a week of copying I had four disk images, <code>1.raw</code>, <code>2.raw</code>, <code>3.raw</code>, <code>4.raw</code>, with only the 2nd disk having problems.</p>
<p>I now, <code>chmod -w *.raw</code> to remove write permissions to the images, helping to prevent a future step accidently altered the images.</p>
<h1 id="2-mounting-the-images">2. Mounting the images</h1>
<p>To mount the images I use <code>losetup</code> (roughly following instructions <a href="https://askubuntu.com/questions/663027/create-raid-array-of-image-files">here</a>), specifically:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ sudo losetup -r /dev/loop31 1.raw
</span></span><span class="line"><span class="cl">$ sudo losetup -r /dev/loop32 2.raw
</span></span><span class="line"><span class="cl">$ sudo losetup -r /dev/loop33 3.raw
</span></span><span class="line"><span class="cl">$ sudo losetup -r /dev/loop34 4.raw
</span></span></code></pre></div><p>Later I would use <code>sudo losetup -d /dev/loop3[1234]</code> to unmount these images. I then decided to inspect these drives, to see what partitions were on them:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ sudo fdisk -l /dev/loop31
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Disk /dev/loop31: 698.65 GiB, <span class="m">750156374016</span> bytes, <span class="m">1465149168</span> sectors
</span></span><span class="line"><span class="cl">Units: sectors of <span class="m">1</span> * <span class="nv">512</span> <span class="o">=</span> <span class="m">512</span> bytes
</span></span><span class="line"><span class="cl">Sector size <span class="o">(</span>logical/physical<span class="o">)</span>: <span class="m">512</span> bytes / <span class="m">512</span> bytes
</span></span><span class="line"><span class="cl">I/O size <span class="o">(</span>minimum/optimal<span class="o">)</span>: <span class="m">512</span> bytes / <span class="m">512</span> bytes
</span></span><span class="line"><span class="cl">Disklabel type: dos
</span></span><span class="line"><span class="cl">Disk identifier: 0xd204616a
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Device        Boot Start        End    Sectors Size Id Type
</span></span><span class="line"><span class="cl">/dev/loop31p1          <span class="m">1</span> <span class="m">4294967295</span> <span class="m">4294967295</span>   2T ee GPT
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ sudo fdisk -l /dev/loop32
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Disk /dev/loop32: 698.65 GiB, <span class="m">750156374016</span> bytes, <span class="m">1465149168</span> sectors
</span></span><span class="line"><span class="cl">Units: sectors of <span class="m">1</span> * <span class="nv">512</span> <span class="o">=</span> <span class="m">512</span> bytes
</span></span><span class="line"><span class="cl">Sector size <span class="o">(</span>logical/physical<span class="o">)</span>: <span class="m">512</span> bytes / <span class="m">512</span> bytes
</span></span><span class="line"><span class="cl">I/O size <span class="o">(</span>minimum/optimal<span class="o">)</span>: <span class="m">512</span> bytes / <span class="m">512</span> bytes
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ sudo fdisk -l /dev/loop33
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Disk /dev/loop33: 698.65 GiB, <span class="m">750156374016</span> bytes, <span class="m">1465149168</span> sectors
</span></span><span class="line"><span class="cl">Units: sectors of <span class="m">1</span> * <span class="nv">512</span> <span class="o">=</span> <span class="m">512</span> bytes
</span></span><span class="line"><span class="cl">Sector size <span class="o">(</span>logical/physical<span class="o">)</span>: <span class="m">512</span> bytes / <span class="m">512</span> bytes
</span></span><span class="line"><span class="cl">I/O size <span class="o">(</span>minimum/optimal<span class="o">)</span>: <span class="m">512</span> bytes / <span class="m">512</span> bytes
</span></span><span class="line"><span class="cl">Disklabel type: dos
</span></span><span class="line"><span class="cl">Disk identifier: 0x899c1289
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Device        Boot      Start        End    Sectors   Size Id Type
</span></span><span class="line"><span class="cl">/dev/loop33p1        <span class="m">33488921</span> <span class="m">4294836216</span> <span class="m">4261347296</span>     2T ee GPT
</span></span><span class="line"><span class="cl">/dev/loop33p2        <span class="m">35651584</span>   <span class="m">35651584</span>          <span class="m">0</span>     0B  <span class="m">0</span> Empty
</span></span><span class="line"><span class="cl">/dev/loop33p3               <span class="m">0</span>    <span class="m">1377535</span>    <span class="m">1377536</span> 672.6M <span class="m">12</span> Compaq diagnostics
</span></span><span class="line"><span class="cl">/dev/loop33p4      <span class="m">3071040408</span> <span class="m">3104693987</span>   <span class="m">33653580</span>    16G <span class="m">64</span> Novell Netware <span class="m">286</span>
</span></span></code></pre></div><p>Disk 1 had a single partition, disk 2 and 4 had no partitions, and the 3rd disk had four! Those partitions looked a little weird, and I wondered for a minute if I mixed up my drives, or reformatted them at some point. I tried to mount them to no success, so I just assumed the RAID added something that looked like a real partition table. So I moved onto the next step.</p>
<h1 id="3-use-mdadm-to-construct-an-array">3. Use <code>mdadm</code> to construct an array.</h1>
<p>This is where it got difficult, due to limitations of mounting local disks, and the Intel Storage Matrix support.</p>
<p>I started by asking <code>mdadm</code> to examine the images (telling it to use <code>imsm</code>):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ sudo mdadm --examine -e imsm /dev/loop31
</span></span><span class="line"><span class="cl">mdadm: /dev/loop31 is not attached to Intel<span class="o">(</span>R<span class="o">)</span> RAID controller.
</span></span><span class="line"><span class="cl">mdadm: Failed to retrieve serial <span class="k">for</span> /dev/loop31
</span></span><span class="line"><span class="cl">mdadm: Failed to load all information sections on /dev/loop31
</span></span></code></pre></div><p>Well that’s not a great start. If I understand the error <code>/dev/loop31 is not attached to Intel(R) RAID controller</code> it implies I need to connect my drive (or in this case loopback disk image) via a real RAID controller. Well that defeats my whole plan. After some googling, I found this <a href="https://askubuntu.com/questions/1239082/reassemble-intel-rst-raid-on-another-mainboard">stackoverflow post</a> pointing out there is a <code>IMSM_NO_PLATFORM=1</code> environment various I could set. The messaging <code>is not attached to Intel(R) RAID controller</code> was really a warning, and had no actual bearing on the problem.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ sudo <span class="nv">IMSM_NO_PLATFORM</span><span class="o">=</span><span class="m">1</span> mdadm --examine -e imsm <span class="se">\
</span></span></span><span class="line"><span class="cl">  /dev/loop31 /dev/loop32 /dev/loop33 /dev/loop34
</span></span><span class="line"><span class="cl">mdadm: no recogniseable superblock on /dev/loop34
</span></span><span class="line"><span class="cl">mdadm: Cannot assemble mbr metadata on /dev/loop33
</span></span><span class="line"><span class="cl">mdadm: no recogniseable superblock on /dev/loop32
</span></span><span class="line"><span class="cl">mdadm: Cannot assemble mbr metadata on /dev/loop31
</span></span></code></pre></div><p>A new set of errors, but they did not look promising. More head scratching, and I hit a bit of a dead end. I now wondered if the drives were corrupt, making the superblocks unreadable. I decided to start to read the source code for <code>mdadm</code> to try and understand the superblock format, and see what was wrong.</p>
<p>It indicated the <a href="https://github.com/neilbrown/mdadm/blob/5f4184557a98bb641a7889e280265109c73e2f43/super-intel.c#L242">superblock</a> (the data structure containing information about the array) was two sectors from the end of the disk, starting with the string <code>Intel Raid ISM Cfg Sig. </code>.</p>
<p>Guessing that a sector is 512 bytes long, I did the following:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ tail -c <span class="m">1024</span> 3.raw  <span class="p">|</span> hd
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="m">00000000</span>  <span class="m">49</span> 6e <span class="m">74</span> <span class="m">65</span> 6c <span class="m">20</span> <span class="m">52</span> <span class="m">61</span>  <span class="m">69</span> <span class="m">64</span> <span class="m">20</span> <span class="m">49</span> <span class="m">53</span> 4d <span class="m">20</span> <span class="m">43</span>  <span class="p">|</span>Intel Raid ISM C<span class="p">|</span>
</span></span><span class="line"><span class="cl"><span class="m">00000010</span>  <span class="m">66</span> <span class="m">67</span> <span class="m">20</span> <span class="m">53</span> <span class="m">69</span> <span class="m">67</span> 2e <span class="m">20</span>  <span class="m">31</span> 2e <span class="m">33</span> 2e <span class="m">30</span> <span class="m">30</span> <span class="m">00</span> <span class="m">00</span>  <span class="p">|</span><span class="nb">fg</span> Sig. 1.3.00..<span class="p">|</span>
</span></span><span class="line"><span class="cl"><span class="m">00000020</span>  cc c0 3d de <span class="m">48</span> <span class="m">02</span> <span class="m">00</span> <span class="m">00</span>  <span class="m">40</span> d5 <span class="m">11</span> d4 <span class="m">09</span> ae <span class="m">19</span> <span class="m">00</span>  <span class="p">|</span>..<span class="o">=</span>.H...@.......<span class="p">|</span>
</span></span><span class="line"><span class="cl"><span class="m">00000030</span>  f8 <span class="m">11</span> <span class="m">00</span> <span class="m">00</span> <span class="m">10</span> <span class="m">00</span> <span class="m">00</span> a0  <span class="m">04</span> <span class="m">01</span> <span class="m">02</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="p">|</span>................<span class="p">|</span>
</span></span><span class="line"><span class="cl"><span class="m">00000040</span>  <span class="m">40</span> d5 <span class="m">11</span> d4 <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="p">|</span>@...............<span class="p">|</span>
</span></span><span class="line"><span class="cl"><span class="m">00000050</span>  <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="p">|</span>................<span class="p">|</span>
</span></span><span class="line"><span class="cl">*
</span></span><span class="line"><span class="cl">000000d0  <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="m">53</span> <span class="m">31</span> <span class="m">33</span> <span class="m">55</span> 4a <span class="m">31</span> 4b <span class="m">51</span>  <span class="p">|</span>........S13UJ1KQ<span class="p">|</span>
</span></span><span class="line"><span class="cl">000000e0  <span class="m">34</span> <span class="m">30</span> <span class="m">33</span> <span class="m">33</span> <span class="m">33</span> <span class="m">37</span> <span class="m">00</span> <span class="m">00</span>  f0 <span class="m">66</span> <span class="m">54</span> <span class="m">57</span> <span class="m">00</span> <span class="m">00</span> <span class="m">01</span> <span class="m">00</span>  <span class="p">|</span>403337...fTW....<span class="p">|</span>
</span></span><span class="line"><span class="cl">000000f0  3a <span class="m">01</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="p">|</span>:...............<span class="p">|</span>
</span></span><span class="line"><span class="cl"><span class="m">00000100</span>  <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="m">53</span> <span class="m">31</span> <span class="m">33</span> <span class="m">55</span> 4a <span class="m">44</span> <span class="m">57</span> <span class="m">51</span>  <span class="p">|</span>........S13UJDWQ<span class="p">|</span>
</span></span><span class="line"><span class="cl"><span class="m">00000110</span>  <span class="m">33</span> <span class="m">34</span> <span class="m">36</span> <span class="m">34</span> <span class="m">35</span> <span class="m">37</span> <span class="m">00</span> <span class="m">00</span>  f0 <span class="m">66</span> <span class="m">54</span> <span class="m">57</span> <span class="m">00</span> <span class="m">00</span> <span class="m">02</span> <span class="m">00</span>  <span class="p">|</span>346457...fTW....<span class="p">|</span>
</span></span><span class="line"><span class="cl"><span class="m">00000120</span>  3a <span class="m">01</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="p">|</span>:...............<span class="p">|</span>
</span></span><span class="line"><span class="cl"><span class="m">00000130</span>  <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="m">53</span> <span class="m">31</span> <span class="m">33</span> <span class="m">55</span> 4a <span class="m">44</span> <span class="m">57</span> <span class="m">51</span>  <span class="p">|</span>........S13UJDWQ<span class="p">|</span>
</span></span><span class="line"><span class="cl"><span class="m">00000140</span>  <span class="m">33</span> <span class="m">34</span> <span class="m">36</span> <span class="m">36</span> <span class="m">36</span> <span class="m">38</span> <span class="m">00</span> <span class="m">00</span>  f0 <span class="m">66</span> <span class="m">54</span> <span class="m">57</span> <span class="m">00</span> <span class="m">00</span> <span class="m">03</span> <span class="m">00</span>  <span class="p">|</span>346668...fTW....<span class="p">|</span>
</span></span><span class="line"><span class="cl"><span class="m">00000150</span>  3a <span class="m">01</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="p">|</span>:...............<span class="p">|</span>
</span></span><span class="line"><span class="cl"><span class="m">00000160</span>  <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="m">53</span> <span class="m">31</span> <span class="m">33</span> <span class="m">55</span> 4a <span class="m">31</span> 4b <span class="m">51</span>  <span class="p">|</span>........S13UJ1KQ<span class="p">|</span>
</span></span><span class="line"><span class="cl"><span class="m">00000170</span>  <span class="m">34</span> <span class="m">30</span> <span class="m">33</span> <span class="m">33</span> <span class="m">32</span> <span class="m">34</span> 3a <span class="m">30</span>  <span class="m">00</span> <span class="m">66</span> <span class="m">54</span> <span class="m">57</span> ff ff ff ff  <span class="p">|</span>403324:0.fTW....<span class="p">|</span>
</span></span><span class="line"><span class="cl"><span class="m">00000180</span>  <span class="m">02</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="p">|</span>................<span class="p">|</span>
</span></span><span class="line"><span class="cl"><span class="m">00000190</span>  <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="m">52</span> <span class="m">41</span> <span class="m">49</span> <span class="m">44</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="p">|</span>........RAID....<span class="p">|</span>
</span></span><span class="line"><span class="cl">000001a0  <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="m">00</span> f8 <span class="nb">fc</span> <span class="m">05</span> <span class="m">01</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="p">|</span>................<span class="p">|</span>
</span></span><span class="line"><span class="cl">000001b0  8c <span class="m">10</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="m">00</span> <span class="m">00</span> <span class="m">01</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="p">|</span>................<span class="p">|</span>
</span></span><span class="line"><span class="cl">000001c0  <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="p">|</span>................<span class="p">|</span>
</span></span><span class="line"><span class="cl">*
</span></span><span class="line"><span class="cl">000001e0  <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  a6 a8 ae <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="p">|</span>................<span class="p">|</span>
</span></span><span class="line"><span class="cl">000001f0  <span class="m">00</span> <span class="m">02</span> <span class="m">00</span> ff <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="p">|</span>................<span class="p">|</span>
</span></span><span class="line"><span class="cl"><span class="m">00000200</span>  <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  <span class="p">|</span>................<span class="p">|</span>
</span></span><span class="line"><span class="cl">*
</span></span><span class="line"><span class="cl"><span class="m">00000400</span>
</span></span></code></pre></div><p>Boom, the super block was there, started with a valid header, and even had other fields that looked correct (e.g S13UJ1KQ being a serial number of the drive).</p>
<p>Ok, so now I’m confused about what is wrong, and I wondered if this was a bug in <code>mdadm</code>. Going back I remember the first error I got contained <code>Failed to retrieve serial</code>, and I noticed the serial numbers were in the super block (e.g S13UJ1KQ). It then occurred to me, that once I imaged the hard drives, the images don’t contain the serial numbers!</p>
<p>Inspecting the code some more, it would fail with that error if it was unable to read the drive’s serial number. The loopback device doesn’t support serial numbers, so this started to make sense. I did however found a undocumented environment variable <code>IMSM_DEVNAME_AS_SERIAL</code>, which would instead of reading the serial number from the hardware, just use the name of the device as the serial (e.g <code>/dev/loop31</code>). This feature seems explicitly designed to help testing the <code>mdadm</code> codebase.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ sudo <span class="nv">IMSM_DEVNAME_AS_SERIAL</span><span class="o">=</span><span class="m">1</span> <span class="nv">IMSM_NO_PLATFORM</span><span class="o">=</span><span class="m">1</span> mdadm --examine -e imsm /dev/loop31 /dev/loop32 /dev/loop33 /dev/loop34
</span></span><span class="line"><span class="cl">…
</span></span><span class="line"><span class="cl">/dev/loop31:
</span></span><span class="line"><span class="cl">          Magic : Intel Raid ISM Cfg Sig.
</span></span><span class="line"><span class="cl">        Version : 1.3.00
</span></span><span class="line"><span class="cl">    Orig Family : d411d540
</span></span><span class="line"><span class="cl">         Family : d411d540
</span></span><span class="line"><span class="cl">     Generation : 0019ae09
</span></span><span class="line"><span class="cl">     Attributes : All supported
</span></span><span class="line"><span class="cl">           UUID : ff44bc31:56060902:afb34379:b0faf183
</span></span><span class="line"><span class="cl">       Checksum : de3dc0cc correct
</span></span><span class="line"><span class="cl">    MPB Sectors : <span class="m">2</span>
</span></span><span class="line"><span class="cl">          Disks : <span class="m">4</span>
</span></span><span class="line"><span class="cl">   RAID Devices : <span class="m">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>RAID<span class="o">]</span>:
</span></span><span class="line"><span class="cl">           UUID : 676c222f:760eaf46:97bd30b8:989d2470
</span></span><span class="line"><span class="cl">     RAID Level : <span class="m">5</span>
</span></span><span class="line"><span class="cl">        Members : <span class="m">4</span>
</span></span><span class="line"><span class="cl">          Slots : <span class="o">[</span>UUU_<span class="o">]</span>
</span></span><span class="line"><span class="cl">    Failed disk : <span class="m">3</span>
</span></span><span class="line"><span class="cl">      This Slot : ?
</span></span><span class="line"><span class="cl">    Sector Size : <span class="m">512</span>
</span></span><span class="line"><span class="cl">     Array Size : <span class="m">4395431936</span> <span class="o">(</span>2095.91 GiB 2250.46 GB<span class="o">)</span>
</span></span><span class="line"><span class="cl">   Per Dev Size : <span class="m">1465144328</span> <span class="o">(</span>698.64 GiB 750.15 GB<span class="o">)</span>
</span></span><span class="line"><span class="cl">  Sector Offset : <span class="m">0</span>
</span></span><span class="line"><span class="cl">    Num Stripes : <span class="m">11446438</span>
</span></span><span class="line"><span class="cl">     Chunk Size : <span class="m">64</span> KiB
</span></span><span class="line"><span class="cl">       Reserved : <span class="m">0</span>
</span></span><span class="line"><span class="cl">  Migrate State : idle
</span></span><span class="line"><span class="cl">      Map State : degraded
</span></span><span class="line"><span class="cl">    Dirty State : clean
</span></span><span class="line"><span class="cl">     RWH Policy : off
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  Disk00 Serial : S13UJ1KQ403337
</span></span><span class="line"><span class="cl">          State : active
</span></span><span class="line"><span class="cl">             Id : <span class="m">00010000</span>
</span></span><span class="line"><span class="cl">    Usable Size : <span class="m">1465138766</span> <span class="o">(</span>698.63 GiB 750.15 GB<span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  Disk01 Serial : S13UJDWQ346457
</span></span><span class="line"><span class="cl">          State : active
</span></span><span class="line"><span class="cl">             Id : <span class="m">00020000</span>
</span></span><span class="line"><span class="cl">    Usable Size : <span class="m">1465138766</span> <span class="o">(</span>698.63 GiB 750.15 GB<span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  Disk02 Serial : S13UJDWQ346668
</span></span><span class="line"><span class="cl">          State : active
</span></span><span class="line"><span class="cl">             Id : <span class="m">00030000</span>
</span></span><span class="line"><span class="cl">    Usable Size : <span class="m">1465138766</span> <span class="o">(</span>698.63 GiB 750.15 GB<span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  Disk03 Serial : S13UJ1KQ403324:0
</span></span><span class="line"><span class="cl">          State : active
</span></span><span class="line"><span class="cl">             Id : ffffffff
</span></span><span class="line"><span class="cl">    Usable Size : <span class="m">1465138526</span> <span class="o">(</span>698.63 GiB 750.15 GB<span class="o">)</span>
</span></span></code></pre></div><p>Ok, slowly making progress! Now it lists all the superblock information, and I was happy to see <code>Checksum : de3dc0cc correct</code>, etc. However, it listed <code>Failed disk : 3</code>, and <code>This Slot : ?</code>. It made me think without the valid serial numbers, it didn’t know which drive was which, and thus couldn’t assemble the array.</p>
<blockquote>
<p>This made me ponder that if I was ever going to create a RAID array implementation, I would not make it depend on information from the hardware. How do folks re-image disks? What is wrong with some GUID in the superblock to identify the disk? Ok digression aside.</p>
</blockquote>
<p>To move forward, I needed to trick <code>mdadm</code> to think that serial <code>/dev/loop31</code> was actually the real hardware. I went back to my drives, and visibility inspected them to check the serial numbers.</p>
<pre tabindex="0"><code>  Disk00 Serial : S13UJ1KQ403337   1.raw
  Disk01 Serial : S13UJDWQ346457   2.raw
  Disk02 Serial : S13UJDWQ346668   4.raw
  Disk03 Serial : S13UJ1KQ403324   3.raw
</code></pre><p>At this point, I realised I had accidentally swapped drives 3 and 4. Quickly renaming them got them into the correct order.</p>
<p>Since I had already looked over the mdadm source code, it seemed a simple clean codebase, so I decided to change it to accept serial numbers. After a little while I did the hackiest thing possible:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-diff" data-lang="diff"><span class="line"><span class="cl"><span class="gh">diff --git a/super-intel.c b/super-intel.c
</span></span></span><span class="line"><span class="cl"><span class="gh">index da376251..d466d911 100644
</span></span></span><span class="line"><span class="cl"><span class="gd">--- a/super-intel.c
</span></span></span><span class="line"><span class="cl"><span class="gi">+++ b/super-intel.c
</span></span></span><span class="line"><span class="cl"><span class="gu">@@ -3994,6 +3994,20 @@ static int nvme_get_serial(int fd, void *buf, size_t buf_len)
</span></span></span><span class="line"><span class="cl">        if (!name)
</span></span><span class="line"><span class="cl">                return 1;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gi">+       if (strcmp(name, &#34;loop31&#34;) == 0) {
</span></span></span><span class="line"><span class="cl"><span class="gi">+               strcpy((char *)buf, &#34;S13UJ1KQ403337&#34;);
</span></span></span><span class="line"><span class="cl"><span class="gi">+               return 0;
</span></span></span><span class="line"><span class="cl"><span class="gi">+       } else if (strcmp(name, &#34;loop32&#34;) == 0) {
</span></span></span><span class="line"><span class="cl"><span class="gi">+               strcpy((char *)buf, &#34;S13UJDWQ346457&#34;);
</span></span></span><span class="line"><span class="cl"><span class="gi">+               return 0;
</span></span></span><span class="line"><span class="cl"><span class="gi">+       } else if (strcmp(name, &#34;loop33&#34;) == 0) {
</span></span></span><span class="line"><span class="cl"><span class="gi">+               strcpy((char *)buf, &#34;S13UJDWQ346668&#34;);
</span></span></span><span class="line"><span class="cl"><span class="gi">+               return 0;
</span></span></span><span class="line"><span class="cl"><span class="gi">+       } else if (strcmp(name, &#34;loop34&#34;) == 0) {
</span></span></span><span class="line"><span class="cl"><span class="gi">+               strcpy((char *)buf, &#34;S13UJ1KQ403324&#34;);
</span></span></span><span class="line"><span class="cl"><span class="gi">+               return 0;
</span></span></span><span class="line"><span class="cl"><span class="gi">+       }
</span></span></span><span class="line"><span class="cl"><span class="gi">+
</span></span></span><span class="line"><span class="cl">        if (strncmp(name, &#34;nvme&#34;, 4) != 0)
</span></span><span class="line"><span class="cl">                return 1;
</span></span></code></pre></div><p>The <code>nvme_get_serial</code> function now had hard coded serial numbers when reading loop3[1234]. This obviously isn’t a generalised solution, but worked for me. Go open source!.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ make mdadm
</span></span><span class="line"><span class="cl">…
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ sudo <span class="nv">IMSM_NO_PLATFORM</span><span class="o">=</span><span class="m">1</span> ./mdadm --examine -e imsm /dev/loop31 /dev/loop32 /dev/loop33 /dev/loop34
</span></span></code></pre></div><p>Examine looked good, so the moment of truth, let’s assemble.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ sudo <span class="nv">IMSM_NO_PLATFORM</span><span class="o">=</span><span class="m">1</span> ./mdadm --assemble --readonly -e imsm /dev/md0 /dev/loop31 /dev/loop32 /dev/loop33 /dev/loop34
</span></span><span class="line"><span class="cl">mdadm: Container /dev/md0 has been assembled with <span class="m">3</span> drives
</span></span></code></pre></div><p>Ok mixed success, it says 3 drives, but I would expect 4… But let’s keep going</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ sudo ./mdadm --assemble --scan
</span></span><span class="line"><span class="cl">mdadm: Started /dev/md/RAID_0 with <span class="m">3</span> devices
</span></span></code></pre></div><p>W00t! It Started without errors!</p>
<p>I now have a <code>/dev/md0</code>, <code>/dev/md127</code> and <code>/dev/md127p1</code> devices.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ sudo mount -o ro /dev/md127p1 /mnt/raid5
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ ls /mnt/raid5
</span></span><span class="line"><span class="cl">… lots of old files...
</span></span></code></pre></div><p>YAY. Finished!</p>
<p>Ok, I’m not sure why it says three drives not four.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ sudo ./mdadm --detail /dev/md127
</span></span><span class="line"><span class="cl">/dev/md127:
</span></span><span class="line"><span class="cl">         Container : /dev/md0, member <span class="m">0</span>
</span></span><span class="line"><span class="cl">        Raid Level : raid5
</span></span><span class="line"><span class="cl">        Array Size : <span class="m">2197715968</span> <span class="o">(</span>2.05 TiB 2.25 TB<span class="o">)</span>
</span></span><span class="line"><span class="cl">     Used Dev Size : <span class="m">732572032</span> <span class="o">(</span>698.64 GiB 750.15 GB<span class="o">)</span>
</span></span><span class="line"><span class="cl">      Raid Devices : <span class="m">4</span>
</span></span><span class="line"><span class="cl">     Total Devices : <span class="m">3</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">             State : clean, degraded
</span></span><span class="line"><span class="cl">    Active Devices : <span class="m">3</span>
</span></span><span class="line"><span class="cl">   Working Devices : <span class="m">3</span>
</span></span><span class="line"><span class="cl">    Failed Devices : <span class="m">0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            Layout : left-asymmetric
</span></span><span class="line"><span class="cl">        Chunk Size : 64K
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Consistency Policy : resync
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">              UUID : 676c222f:760eaf46:97bd30b8:989d2470
</span></span><span class="line"><span class="cl">    Number   Major   Minor   RaidDevice State
</span></span><span class="line"><span class="cl">       <span class="m">2</span>       <span class="m">7</span>       <span class="m">31</span>        <span class="m">0</span>      active sync   /dev/loop31
</span></span><span class="line"><span class="cl">       <span class="m">1</span>       <span class="m">7</span>       <span class="m">32</span>        <span class="m">1</span>      active sync   /dev/loop32
</span></span><span class="line"><span class="cl">       <span class="m">0</span>       <span class="m">7</span>       <span class="m">33</span>        <span class="m">2</span>      active sync   /dev/loop33
</span></span><span class="line"><span class="cl">       -       <span class="m">0</span>        <span class="m">0</span>        <span class="m">3</span>      removed
</span></span></code></pre></div><p>This does seem to imply a drive is missing. Maybe it doesn’t matter, as it mounted successfully, and I can copy all my data off the array.</p>
<h1 id="conclusion">Conclusion</h1>
<p>This did not seem the easiest task, and there were a few road bumps along the way. Hopefully the hacks in here will help someone else out in a similar situation.</p>
<p>To finally clean up, you can run this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ sudo umount /mnt/raid5
</span></span><span class="line"><span class="cl">$ sudo mdadm --stop /dev/md127
</span></span><span class="line"><span class="cl">$ sudo mdadm --stop /dev/md0
</span></span><span class="line"><span class="cl">$ sudo losetup -d /dev/loop3<span class="o">[</span>1234<span class="o">]</span>
</span></span></code></pre></div></description>
    </item>
    
  </channel>
</rss>
