<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Pavel&apos;s Space</title>
    <description>FLOSS, right?
</description>
    <link>https://pavel.raiskup.cz/</link>
    <atom:link href="https://pavel.raiskup.cz/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Fri, 14 Nov 2025 11:22:52 +0000</pubDate>
    <lastBuildDate>Fri, 14 Nov 2025 11:22:52 +0000</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
      
      <item>
        <title>Reinitialize rpmautospec in your package</title>
        <description>&lt;p&gt;From time to time, you might want to re-initialize &lt;a href=&quot;https://github.com/fedora-infra/rpmautospec&quot;&gt;&lt;em&gt;rpmautospec&lt;/em&gt;&lt;/a&gt;
in your RPM package’s (Dist)Git repo (&lt;em&gt;rpmautospec&lt;/em&gt; is the tool that expands
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%autorelease&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%autochangelog&lt;/code&gt; templates in specfiles).&lt;/p&gt;

&lt;p&gt;The motivations for this step might be simple:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;the tool is analyzing an excessively long Git history&lt;/li&gt;
  &lt;li&gt;you are attempting to handle shallow Git clones&lt;/li&gt;
  &lt;li&gt;you want to migrate the package from one DistGit to another (e.g., from Fedora
to CentOS Stream)&lt;/li&gt;
  &lt;li&gt;you want to avoid executing &lt;a href=&quot;https://github.com/fedora-infra/rpmautospec/pull/319&quot;&gt;Turing-Complete macros in Version or Epoch fields&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;the-principle&quot;&gt;The principle&lt;/h2&gt;

&lt;p&gt;TL;DR: we need to prevent &lt;em&gt;rpmautospec&lt;/em&gt; logic from analyzing beyond the &lt;strong&gt;last
two Git commits&lt;/strong&gt;.  The tool behaves this way only when the very last commit (a)
modifies the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Version:&lt;/code&gt; and (b) changes the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;changelog&lt;/code&gt; file (the file with
expanded &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%changelog&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;This implies we need to make &lt;strong&gt;two&lt;/strong&gt; precisely formatted commits.&lt;/p&gt;

&lt;h2 id=&quot;step-by-step-guide&quot;&gt;Step-by-step guide&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;(Re)generate the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;changelog&lt;/code&gt; file (do not ‘git add’ the file for now; this
change belongs in the second commit):&lt;/p&gt;

    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;rpmautospec generate-changelog &amp;gt; changelog
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;TODO: if &lt;a href=&quot;https://github.com/fedora-infra/rpmautospec/pull/319&quot;&gt;we move from rpm to norpm&lt;/a&gt;, we need to use the full RPM
parser one last time here; document how.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Set a placeholder version, e.g., &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Version: 0&lt;/code&gt;.&lt;/p&gt;

    &lt;p&gt;Do not worry; no builds are performed for the first commit.  You might want
to apply other changes here as well, such as dropping &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%lua&lt;/code&gt; macros from the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Epoch&lt;/code&gt; if present.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Remove the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%autochangelog&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%autorelease&lt;/code&gt; templates from the spec file.
To keep things simple, you can just set &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Release: 0&lt;/code&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Make the first commit&lt;/strong&gt; (spec file changes only, keep the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;changelog&lt;/code&gt;
file changes uncommitted!).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Set the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Version:&lt;/code&gt; field appropriately (think of Turing-Complete macros).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Reintroduce the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%autochangelog&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%autorelease&lt;/code&gt; templates.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Make the second commit&lt;/strong&gt;.  Include the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;changelog&lt;/code&gt; change.  The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Version&lt;/code&gt;
reset we did means that the calculated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%autorelease&lt;/code&gt; is re-started from
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Release: 1&lt;/code&gt;—if you need a different value, say 5, add the string
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[bump release: 5]&lt;/code&gt; into the commit message.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;Optional step&lt;/em&gt;: You might want to add one more empty commit using
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git commit --allow-empty&lt;/code&gt; to bump the Release and generate &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%changelog&lt;/code&gt;
entry. (This depends on your distribution’s policy.)&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You are done!  See also an &lt;a href=&quot;https://gitlab.com/redhat/centos-stream/rpms/mesa/-/merge_requests/73/commits&quot;&gt;example merge-request&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;double-check&quot;&gt;Double-check&lt;/h2&gt;

&lt;p&gt;Check that rpmautospec works by:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;rpmautospec &lt;span class=&quot;nt&quot;&gt;--debug&lt;/span&gt; process-distgit &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;spec &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;spec
&lt;span class=&quot;o&quot;&gt;===========================================================&lt;/span&gt;
Extracting linear &lt;span class=&quot;nb&quot;&gt;history &lt;/span&gt;snippets from branched history...
&lt;span class=&quot;o&quot;&gt;===========================================================&lt;/span&gt;
commit 124279c: reenable autospec with Lua-free Version
Keep processing: commit 124279cc62be84852bb702f49fca5aaae0d93f6c
  epoch_version: 25.04.0.0.84
  child must &lt;span class=&quot;k&quot;&gt;continue&lt;/span&gt;: False
  changelog changed: True
  child changelog removed: None
  our changelog removed: False
  merge unresolvable: False
  spec file present: True
  child must &lt;span class=&quot;k&quot;&gt;continue&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;incoming&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;: True
  child must &lt;span class=&quot;k&quot;&gt;continue&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;outgoing&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;: False
  parent to follow: da9b55c
commit da9b55c: Disable rpmautospec &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;one commit
children_visitors_info[][&lt;span class=&quot;s1&quot;&gt;&apos;child_must_continue&apos;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;: &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;False, False]
Only traversing: commit da9b55c3a6175643788eed8cbcf5475a574cf333
...&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;The second commit, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;da9b55c&lt;/code&gt;, was analyzed, resulting in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;False, False&lt;/code&gt;.  This
indicates there’s no need to analyze any older variants of the spec file.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-patch&quot; data-lang=&quot;patch&quot;&gt;&lt;span class=&quot;err&quot;&gt;$&lt;/span&gt; git diff
&lt;span class=&quot;gi&quot;&gt;+## START: Set by rpmautospec
+## (rpmautospec version 0.8.1)
+## RPMAUTOSPEC: autorelease, autochangelog
+%define autorelease(e:s:pb:n) %{?-p:0.}%{lua:
+    release_number = 5;
+    base_release_number = tonumber(rpm.expand(&quot;%{?-b*}%{!?-b:1}&quot;));
+    print(release_number + base_release_number - 1);
+}%{?-e:.%{-e*}}%{?-s:.%{-s*}}%{!?-n:%{?dist}}
+## END: Set by rpmautospec
&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;...&lt;/span&gt;
 %changelog
&lt;span class=&quot;gd&quot;&gt;-%autochangelog
&lt;/span&gt;&lt;span class=&quot;gi&quot;&gt;+## START: Generated by rpmautospec
+* Thu Jul 03 2025 Kamal Heib &amp;lt;kheib@redhat.com&amp;gt; - 25.04.0.0.84-1
+- Update to upstream 25.04.0-0.84
&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Please note the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;release_number = 5&lt;/code&gt; line and the version-release of the last
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%changelog&lt;/code&gt; entry—that’s what we needed.&lt;/p&gt;

&lt;p&gt;Use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git checkout -p&lt;/code&gt; to reset the changes made to the spec file by the previous
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rpmautospec process-distgit&lt;/code&gt; call. Done.&lt;/p&gt;

</description>
        <pubDate>Tue, 11 Nov 2025 00:00:00 +0000</pubDate>
        <link>https://pavel.raiskup.cz/blog/reinitialize-rpmautospec.html</link>
        <guid isPermaLink="true">https://pavel.raiskup.cz/blog/reinitialize-rpmautospec.html</guid>
        
        
      </item>
      
    
      
      <item>
        <title>Disk partitioning on Fedora Copr Power9 machines</title>
        <description>&lt;div class=&quot;alert alert-info&quot; role=&quot;alert&quot;&gt;
    &lt;i class=&quot;fa fa-info-circle&quot;&gt;&lt;/i&gt;
    &lt;b&gt;Warning:&lt;/b&gt; 
Never directly copy-paste commands from this guide, always think twice
the action you do to avoid &lt;b&gt;DATA LOSS&lt;/b&gt;.

&lt;/div&gt;

&lt;p&gt;Fedora Infrastructure / Red Hat IT folks recently racked three POWER9 servers
for Fedora Copr.  Thank you!  I’m going to quickly recap the steps I took to
make them (almost) work.&lt;/p&gt;

&lt;p&gt;This is a (somewhat easier, this time) follow-up to &lt;a href=&quot;https://pavel.raiskup.cz/blog/fedora-copr-hypervisor-disk-repartitioning.html&quot;&gt;my previous action of that
kind&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;getting-machines-installed&quot;&gt;Getting Machines Installed&lt;/h2&gt;

&lt;p&gt;With Kevin (Fedora Infra), we made a few installation attempts via
the &lt;a href=&quot;https://pagure.io/fedora-infra/ansible/blob/main/f/roles/kickstarts/templates/hardware-fedora-ppc64le-08disk.j2&quot;&gt;kickstart&lt;/a&gt; he prepared.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;The first attempt was with a single large RAID10.  The machine was booting
fine, but that layout would likely be slow for both (a) libvirt disks and (b)
SWAP.  We need &lt;strong&gt;striping&lt;/strong&gt; for both.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Instead of doing the very slow manual re-creation work like
&lt;a href=&quot;https://pavel.raiskup.cz/blog/fedora-copr-hypervisor-disk-repartitioning.html&quot;&gt;previously&lt;/a&gt;, we decided to reinstall the machine with a modified
kickstart—without &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--growfs&lt;/code&gt; and keeping the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/&lt;/code&gt; partition small.  I then
manually created striped &lt;strong&gt;SWAP&lt;/strong&gt; and &lt;strong&gt;RAID0&lt;/strong&gt; for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/libvirt-images&lt;/code&gt;.  This
initially worked fine, and we even started building RPMs on those machines.
However, the machine did not survive a reboot (for newly added clevis &amp;amp;
tang).  We noticed:&lt;/p&gt;

    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;mdadm: failed to add /dev/sde5 to /dev/md/3_0: Invalid argument
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;We thought that the manually created RAIDs on Fedora 43 had broken the
&lt;strong&gt;Petitboot&lt;/strong&gt; bootloader.  Hence…&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;We reinstalled for the 3rd time, with all the RAIDs created by Anaconda
kickstart (that attempt seemed reasonable, because the other MDs also created
by Anaconda were just working fine).  Well, even now the machine failed to
boot, with the very same error.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Yeah, so neither manually created MDs nor the Anaconda installation could make
the &lt;strong&gt;Petitboot&lt;/strong&gt; bootloader happy with our five MDs use-case.&lt;/p&gt;

&lt;h2 id=&quot;debugging&quot;&gt;Debugging&lt;/h2&gt;

&lt;p&gt;When I switched to the &lt;strong&gt;Petitboot&lt;/strong&gt; command-line shell and re-scanned the MDs
(failing the mdadm command), things became a bit more normal.  At least &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/boot&lt;/code&gt;
and the root filesystem (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/&lt;/code&gt;) on the RAID arrays started working!&lt;/p&gt;

&lt;details&gt;
&lt;summary&gt;Here is the full &lt;strong&gt;mdadm --assemble --scan&lt;/strong&gt; error output.&lt;/summary&gt;


&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;mdadm: /dev/md/unused-249:1 has been started with 8 drives.
mdadm: /dev/md/unused-249:0 has been started with 8 drives.
mdadm: /dev/md/unused-249:2 has been started with 8 drives.
mdadm: failed to add /dev/sdb3 to /dev/md/unused-249:3: Invalid argument
mdadm: failed to add /dev/sdc3 to /dev/md/unused-249:3: Invalid argument
mdadm: failed to add /dev/sdd3 to /dev/md/unused-249:3: Invalid argument
mdadm: failed to add /dev/sde3 to /dev/md/unused-249:3: Invalid argument
mdadm: failed to add /dev/sdf3 to /dev/md/unused-249:3: Invalid argument
mdadm: failed to add /dev/sdg3 to /dev/md/unused-249:3: Invalid argument
mdadm: failed to add /dev/sdh3 to /dev/md/unused-249:3: Invalid argument
mdadm: failed to add /dev/sda3 to /dev/md/unused-249:3: Invalid argument
mdadm: failed to RUN_ARRAY /dev/md/unused-249:3: Invalid argument
mdadm: failed to add /dev/sdb2 to /dev/md/unused-249:4: Invalid argument
mdadm: failed to add /dev/sdc2 to /dev/md/unused-249:4: Invalid argument
mdadm: failed to add /dev/sdd2 to /dev/md/unused-249:4: Invalid argument
mdadm: failed to add /dev/sde2 to /dev/md/unused-249:4: Invalid argument
mdadm: failed to add /dev/sdf2 to /dev/md/unused-249:4: Invalid argument
mdadm: failed to add /dev/sdg2 to /dev/md/unused-249:4: Invalid argument
mdadm: failed to add /dev/sdh2 to /dev/md/unused-249:4: Invalid argument
mdadm: failed to add /dev/sda2 to /dev/md/unused-249:4: Invalid argument
mdadm: failed to RUN_ARRAY /dev/md/unused-249:4: Invalid argument
mdadm: failed to add /dev/sdb3 to /dev/md/unused-249:3: Invalid argument
mdadm: failed to add /dev/sdc3 to /dev/md/unused-249:3: Invalid argument
mdadm: failed to add /dev/sdd3 to /dev/md/unused-249:3: Invalid argument
mdadm: failed to add /dev/sde3 to /dev/md/unused-249:3: Invalid argument
mdadm: failed to add /dev/sdf3 to /dev/md/unused-249:3: Invalid argument
mdadm: failed to add /dev/sdg3 to /dev/md/unused-249:3: Invalid argument
mdadm: failed to add /dev/sdh3 to /dev/md/unused-249:3: Invalid argument
mdadm: failed to add /dev/sda3 to /dev/md/unused-249:3: Invalid argument
mdadm: failed to RUN_ARRAY /dev/md/unused-249:3: Invalid argument
mdadm: failed to add /dev/sdb2 to /dev/md/unused-249:4: Invalid argument
mdadm: failed to add /dev/sdc2 to /dev/md/unused-249:4: Invalid argument
mdadm: failed to add /dev/sdd2 to /dev/md/unused-249:4: Invalid argument
mdadm: failed to add /dev/sde2 to /dev/md/unused-249:4: Invalid argument
mdadm: failed to add /dev/sdf2 to /dev/md/unused-249:4: Invalid argument
mdadm: failed to add /dev/sdg2 to /dev/md/unused-249:4: Invalid argument
mdadm: failed to add /dev/sdh2 to /dev/md/unused-249:4: Invalid argument
mdadm: failed to add /dev/sda2 to /dev/md/unused-249:4: Invalid argument
mdadm: failed to RUN_ARRAY /dev/md/unused-249:4: Invalid argument&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;/details&gt;
&lt;p&gt;&lt;br /&gt;
Kevin also observed these weird disk errors:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;fdisk: device has more than 2^32 sectors, can&apos;t use all of them
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Anyway, after a manual post-start &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--assemble --scan&lt;/code&gt; manually, and I got the
most important MDs working so the machine could boot.  At least something!&lt;/p&gt;

&lt;h2 id=&quot;planning-the-fix&quot;&gt;Planning the fix&lt;/h2&gt;

&lt;p&gt;The error we &lt;strong&gt;saw&lt;/strong&gt; seemed to be related to some &lt;strong&gt;32-bit limit&lt;/strong&gt;.  What if we
&lt;strong&gt;re-created&lt;/strong&gt; the non-working RAIDs once more, manually, directly inside
Petitboot’s shell?  I &lt;strong&gt;believed&lt;/strong&gt; that MDs created in Petitboot would later be
readable by &lt;strong&gt;Petitboot&lt;/strong&gt;..&lt;/p&gt;

&lt;p&gt;On the booted machine:&lt;/p&gt;

&lt;details&gt;
&lt;summary&gt;[root@unused-249 ~]# lsblk /dev/sdh&lt;/summary&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;root@unused-249 ~]# lsblk /dev/sdh
NAME                                            MAJ:MIN RM   SIZE RO TYPE   MOUNTPOINTS
sdh                                               8:112  0   3.6T  0 disk
├─sdh1                                            8:113  0     8M  0 part
├─sdh2                                            8:114  0     3T  0 part
│ └─md4                                           9:4    0    24T  0 raid0
│   └─luks-bd506244-b18a-4ea8-9af1-15db95c63d7d 252:2    0    24T  0 crypt  /vmvolumes
├─sdh3                                            8:115  0    64G  0 part
│ └─md3                                           9:3    0 511.5G  0 raid0
│   └─luks-3d68312d-7c05-42d2-86b9-be636676d5bf 252:0    0 511.5G  0 crypt
├─sdh4                                            8:116  0    32G  0 part
│ └─md2                                           9:2    0 127.9G  0 raid10
│   └─luks-fde52936-8c89-479d-9d70-cede214f7314 252:1    0 127.9G  0 crypt  /
├─sdh5                                            8:117  0  1000M  0 part
│ └─md0                                           9:0    0   999M  0 raid1  /boot
└─sdh6                                            8:118  0   500M  0 part
  └─md1                                           9:1    0 499.9M  0 raid1  /boot/efi&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;/details&gt;

&lt;p&gt;&lt;br /&gt;
Ok, we’ll recreate &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;md3&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;md4&lt;/code&gt;, i.e. everything on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sd*2&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sd*3&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;cleanup-first&quot;&gt;Cleanup first&lt;/h2&gt;

&lt;p&gt;Stop swap:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;swapoff -a
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Comment-out things from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/fstab&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/crypttab&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/mdadm.conf&lt;/code&gt;
appropriately.  All the stuff related to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;md{3,4}&lt;/code&gt;!  Then:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;umount /vmvolumes

cryptsetup close luks-bd506244-b18a-4ea8-9af1-15db95c63d7d
cryptsetup close luks-3d68312d-7c05-42d2-86b9-be636676d5bf

mdadm --stop md3
mdadm --stop md4

mdadm --zero-superblock /dev/sd*2
mdadm --zero-superblock /dev/sd*3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Reboot to Petitboot&lt;/strong&gt;!&lt;/p&gt;

&lt;h2 id=&quot;back-in-petitboot-shell&quot;&gt;Back in Petitboot shell&lt;/h2&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# mdadm --create /dev/md3 /dev/sd*2 --level=0 --raid-devices=8
# mdadm --create /dev/md4 /dev/sd*3 --level=0 --raid-devices=8
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Reboot once more, and… &lt;strong&gt;voilà&lt;/strong&gt;, even though we have five MDs
(boot/efi/vmvolumes/swap/root), &lt;strong&gt;the machine boots&lt;/strong&gt;, and Petitboot is happy!&lt;/p&gt;

&lt;p&gt;So let’s re-configure &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mdadm.conf&lt;/code&gt; to cover the two new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;md3&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;md4&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[root@vmhost-p09-copr03 ~][PROD-RDU3]# cat /etc/mdadm.conf
# mdadm.conf written out by anaconda
MAILADDR root
ARRAY /dev/md0 metadata=1.2 UUID=aaaaaaaa:bbbbbbbb:cccccccc:dddddddd
ARRAY /dev/md1 metadata=1.0 UUID=bbbbbbbb:cccccccc:dddddddd:aaaaaaaa
ARRAY /dev/md2 metadata=1.2 UUID=aaaaaaaa:bbbbbbbb:cccccccc:dddddddd
ARRAY /dev/md3 metadata=1.2 UUID=bbbbbbbb:cccccccc:dddddddd:aaaaaaaa
ARRAY /dev/md4 metadata=1.2 UUID=aaaaaaaa:bbbbbbbb:cccccccc:dddddddd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Encrypt SWAP with a random key:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cryptsetup open --type plain /dev/md4 swap_crypt --key-file /dev/urandom
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Setup automatic decryption of SWAP:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# echo swap_crypt   UUID=$(mdadm --detail --scan | grep md/4 | sed &apos;s/.*UUID=//&apos;) /dev/urandom  swap,plain,cipher=aes-xts-plain64,size=256 &amp;gt;&amp;gt; /etc/crypttab
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Create the SWAP:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;mkswap /dev/mapper/swap_crypt
echo /dev/mapper/swap_crypt   none    swap    sw      0       0 &amp;gt;&amp;gt; /etc/fstab
swapon -a
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Create auto-decryption for the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/libvirt-images&lt;/code&gt; (note we don’t mount, that’s
done by &lt;a href=&quot;https://pagure.io/fedora-infra/ansible/blob/c447162152f0b6c5a2a28ec08aae6618c0f160f7/f/roles/copr/hypervisor/tasks/main.yml#_65-68&quot;&gt;copr-hypervisor playbook&lt;/a&gt;).&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dd if=/dev/urandom of=/root/libvirt-luks-images.key bs=4096 count=1
cryptsetup luksFormat /dev/md3 /root/libvirt-luks-images.key
cryptsetup luksOpen /dev/md3 vmimages_crypt --key-file /root/libvirt-luks-images.key
mkfs.ext4 -L vmvolumes /dev/mapper/vmimages_crypt
chmod 0600 /root/libvirt-luks-images.key
echo vmimages_crypt  UUID=$(mdadm --detail --scan | grep md/3 | sed &apos;s/.*UUID=//&apos;) /root/libvirt-luks-images.key  luks &amp;gt;&amp;gt; /etc/crypttab
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Backup old grub config!  And then fix it (all MDs but efi mentioned?).&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;echo $(for i in $(mdadm --detail --scan | sort | grep -e md/4 -e md/3 | sed &apos;s/.*UUID=//&apos;); do echo rd.md.uuid=$i; done)
rd.md.uuid=48a41879:9301e678:bf629bf1:b05eb5ae rd.md.uuid=1e0bd440:a22ea797:fef650fd:5df66d17
grubby --update-kernel=ALL --args &apos;rd.md.uuid=663b53dc:bab1869d:84e94f2a:7fee5168 rd.luks.uuid=luks-1483fbff-398d-49bf-8a6b-e16e839c261a rd.md.uuid=06df0fa7:0a1ac337:18840fd9:96e5f9e5 net.ifnames=0 console=ttyS1,115200&apos;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Rebuild initramfs:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dracut -f
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Uh!  UUIDs don’t work reliably in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/crypttab&lt;/code&gt;, but since we fixed
intitramfs, it is OK to use symbolic &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/dev/mdX&lt;/code&gt; references:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;vmimages_crypt /dev/md3 /root/libvirt-luks-images.key luks
swap_crypt /dev/md4 /dev/urandom swap,plain,cipher=aes-xts-plain64,size=256
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Reboot, and enjoy!  Now, let’s fix the &lt;a href=&quot;https://pagure.io/fedora-infra/ansible/blob/c447162152f0b6c5a2a28ec08aae6618c0f160f7/f/roles/copr/hypervisor/tasks/main.yml#_65-68&quot;&gt;ipv6 issues&lt;/a&gt;, but that’s a different
story.&lt;/p&gt;

</description>
        <pubDate>Tue, 21 Oct 2025 00:00:00 +0000</pubDate>
        <link>https://pavel.raiskup.cz/blog/fedora-copr-p09-hypervisors.html</link>
        <guid isPermaLink="true">https://pavel.raiskup.cz/blog/fedora-copr-p09-hypervisors.html</guid>
        
        
      </item>
      
    
      
      <item>
        <title>Fedora Copr builders - September 2025</title>
        <description>&lt;p&gt;It’s been more than four years since &lt;a href=&quot;https://pavel.raiskup.cz/blog/copr-farm-of-builders.html&quot;&gt;my last post&lt;/a&gt; like this.&lt;/p&gt;

&lt;p&gt;A few changes have happened since then, so let me do a quick recap.&lt;/p&gt;

&lt;h2 id=&quot;changes-in-last-4-years-aka-news&quot;&gt;Changes in last 4 years, a.k.a. “News”&lt;/h2&gt;

&lt;p&gt;Namely, Fedora Copr now provides native build support for all supported Fedora
architectures: &lt;strong&gt;aarch64&lt;/strong&gt;, &lt;strong&gt;ppc64le&lt;/strong&gt;, &lt;strong&gt;s390x&lt;/strong&gt;, and &lt;strong&gt;x86_64&lt;/strong&gt;.  This means
we no longer have to emulate any architecture using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;qemu-user-static&lt;/code&gt;.  It’s
faster, and more reliable.&lt;/p&gt;

&lt;p&gt;Some package builds are known to be especially demanding, so we’ve created a way
to request &lt;a href=&quot;https://docs.pagure.org/copr.copr/user_documentation/powerful_builders.html#high-performance-builders&quot;&gt;high-performance workers&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Although it’s not news (it’s over three years old), IBM has started sponsoring
the &lt;strong&gt;s390x&lt;/strong&gt; architecture through a community account in IBM Cloud.  Since
then, we’ve managed to bump and reorganize our quota a few times, and we also
have high-performance &lt;strong&gt;s390x&lt;/strong&gt; workers.  Thank you, IBM!&lt;/p&gt;

&lt;p&gt;A more recent development is the &lt;a href=&quot;https://github.com/fedora-copr/copr/issues/3092&quot;&gt;ppc64le high-performance&lt;/a&gt; profile
support, thanks to &lt;a href=&quot;https://osuosl.org/&quot;&gt;OSUOSL&lt;/a&gt;.  By the way, OSUOSL is our only source of
Power10 machines right now.  Thank you, OSUOSL!&lt;/p&gt;

&lt;p&gt;Since 2022 we’ve started using &lt;a href=&quot;https://rpm-software-management.github.io/mock/Feature-rhelchroots.html&quot;&gt;Red Hat-subscribed Fedora builders&lt;/a&gt;
to allow users to build against the official Red Hat Enterprise Linux content.
Since then, we’ve booted and subscribed millions of ephemeral Fedora VMs.  Thank
you, Red Hat.&lt;/p&gt;

&lt;p&gt;Mirek has become one of the main administrators for the Fedora community EC2
account.  He’s also started moving our EC2 machines from spot/on-demand to
reserved instances, which allows for more cost-effective planning.  EC2 machines
handle a large portion of &lt;strong&gt;x86_64&lt;/strong&gt; builds and all of the &lt;strong&gt;aarch64&lt;/strong&gt; builds,
and EC2 also sponsors other parts of Fedora Copr infrastructure.  Thank you,
Amazon AWS team!  Mirek is also paying close attention to accounting for
resources in Fedora community account and &lt;a href=&quot;https://github.com/xsuchy/fedora-infra-scripts&quot;&gt;cleaning up unused things
there&lt;/a&gt;.  Thank you, Mirek.&lt;/p&gt;

&lt;h2 id=&quot;the-current-status&quot;&gt;The Current Status&lt;/h2&gt;

&lt;p&gt;The number of machines has &lt;a href=&quot;https://download.copr.fedorainfracloud.org/resalloc/pools&quot;&gt;roughly doubled&lt;/a&gt; since the last time:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2025-09-05-copr-farm/Screenshot_20250905_135901.png&quot; alt=&quot;Screenshot from Pools page showing we start 400+ VMs&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Thanks to a few optimizations, our throughput has more than doubled—Fedora Copr
can now handle tens of thousands of Mock builds daily:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2025-09-05-copr-farm/Screenshot_20250905_135503.png&quot; alt=&quot;Chart describing that we even build 40k+ Mock builds daily&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We currently have machines dedicated to the following architectures:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;aarch64&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;37 EC2 reserved machines&lt;/li&gt;
      &lt;li&gt;Up to 30 EC2 spot machines&lt;/li&gt;
      &lt;li&gt;Up to 8 EC2 on-demand machines&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;s390x&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Up to 18 IBM Cloud on-demand machines (across 6 locations in São Paulo and Madrid)&lt;/li&gt;
      &lt;li&gt;Up to 2 IBM Cloud high-performance machines&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;ppc64le&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Our own hardware:
        &lt;ul&gt;
          &lt;li&gt;28 Power8 machines&lt;/li&gt;
          &lt;li&gt;31 Power9 machines&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;OSUOSL machines:
        &lt;ul&gt;
          &lt;li&gt;Up to 15 standard machines&lt;/li&gt;
          &lt;li&gt;Up to 3 high-performance machines&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;x86_64&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;80 of our own machines, always running in the Fedora Lab&lt;/li&gt;
      &lt;li&gt;46 EC2 reserved machines&lt;/li&gt;
      &lt;li&gt;Up to 70 EC2 spot machines&lt;/li&gt;
      &lt;li&gt;Up to 20 EC2 on-demand machines&lt;/li&gt;
      &lt;li&gt;Up to 20 powerful EC2 machines&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In total, we have &lt;strong&gt;235 machines running at all times&lt;/strong&gt; and the ability to &lt;strong&gt;auto-scale up to 428 machines&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;future-plans&quot;&gt;Future Plans&lt;/h2&gt;

&lt;p&gt;The Power8 machines are aging, and with the help of the Fedora Infrastructure
team, we plan on replacing them with newer &lt;a href=&quot;https://github.com/fedora-copr/copr/issues/3786&quot;&gt;Power9 machines&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The number of workers we have is mostly sufficient for current load.  While we
would like to have more &lt;strong&gt;s390x&lt;/strong&gt; machines, computational power is not the main
concern for the Fedora Copr team.  Our primary challenge is storage (our current
RAID deployment provides about &lt;strong&gt;40TB&lt;/strong&gt;).  Another area of concern is the
computational power required on the &lt;a href=&quot;https://docs.pagure.org/copr.copr/developer_documentation/architecture.html&quot;&gt;copr-backend&lt;/a&gt; to keep the RPM
repository metadata up-to-date.  To address these, we plan to &lt;a href=&quot;https://github.com/fedora-copr/copr/issues/2533&quot;&gt;“outsource” our
storage via PULP&lt;/a&gt;, which should offload these things to the
subject-matter-expert team—and allow us to concentrate on achieving an even
higher build throughput.&lt;/p&gt;

&lt;p&gt;Additionally, we may want to &lt;a href=&quot;https://github.com/fedora-copr/copr/issues/3864&quot;&gt;dedicate a separate VM for the Resalloc
machine&lt;/a&gt;.  The process of machine allocation is quite demanding,
involving hundreds of shell and Python processes to control the machines being
started.&lt;/p&gt;

</description>
        <pubDate>Fri, 05 Sep 2025 00:00:00 +0000</pubDate>
        <link>https://pavel.raiskup.cz/blog/copr-farm-of-builders-2025.html</link>
        <guid isPermaLink="true">https://pavel.raiskup.cz/blog/copr-farm-of-builders-2025.html</guid>
        
        
      </item>
      
    
      
      <item>
        <title>Empower your writing with Ramalama</title>
        <description>&lt;p&gt;Have you ever asked ChatGPT or other online AI services to review and correct
your emails or posts for you?  Have you ever pondered over what the service or
company, such as OpenAI, does with the text you provide them “for free”?  What
are the potential risks of sharing private content, possibly leading to
copyright headaches?&lt;/p&gt;

&lt;p&gt;I am going to demonstrate how I use &lt;a href=&quot;https://ramalama.ai/&quot;&gt;Ramalama&lt;/a&gt; and local models instead of
ChatGPT for English corrections, on a moderately powerful laptop.  The latest
container-based tooling surrounding the Ramalama project makes running Language
Models (LLMs) on Fedora effortless and free of those risks.&lt;/p&gt;

&lt;h2 id=&quot;installation-and-starting&quot;&gt;Installation and starting&lt;/h2&gt;

&lt;p&gt;Ramalama is packaged for Fedora!  Just go with:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dnf install -y ramalama
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It is a fairly swift action, I assure you.  Do not be misled though.  You will
need to download gigabytes of data later on, during the Ramalama runtime :-)&lt;/p&gt;

&lt;p&gt;I take privacy seriously, the more isolation the better.  Even though
Ramalama claims it isolates the model I’d like to isolate Ramalama itself.
Therefore, I create a new user called “ramalama” with the command:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;useradd ramalama &amp;amp;&amp;amp; sudo su - ramalama
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This satisfies me, as I trust the Ramalama/Podman team’s that they do not
escalate privileges (at least I don’t see any setuid bits, etc.).&lt;/p&gt;

&lt;h2 id=&quot;experimenting-with-models&quot;&gt;Experimenting with models&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ramalama run: error: the following arguments are required: MODEL&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The tool does a lot for you, but you still need to research which model is most
likely the one you require. I haven’t done an extensive research myself,
but I’ve heard rumors that LLama3 or Mistral are relatively good options for
English on laptops.  Lemme try:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ ramalama run llama3
Downloading ollama://llama3:latest ...
Trying to pull ollama://llama3:latest ...
 99% |█████████████████████████████████████████████████████████████████████████ |    4.33 GB/   4.34 GB 128.84 MB/s
Getting image source signatures
Copying blob 97024d81bb02 done   |_
Copying blob 97971704aef2 done   |_
Copying blob 2b2bdebbc339 done   |_
Copying config d13a3de051 done   |_
Writing manifest to image destination
🦭 &amp;gt; Hello, who is there?
Hello! I&apos;m an AI, not a human, so I&apos;m not &quot;there&quot; in the classical sense. I exist solely as a digital entity,
designed to understand and respond to natural language inputs. I&apos;m here to help answer your questions, provide
information, and chat with you about various topics. What&apos;s on your mind?
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Be prepared for that large download (6GB in my case, not just the 4.3GB model;
I’m including the Ramalama Podman image as well).&lt;/p&gt;

&lt;h2 id=&quot;the-command-line-sucks-here-server-helps&quot;&gt;The command-line sucks here, server helps&lt;/h2&gt;

&lt;p&gt;Very early on, you’ll find that the command-line prompt doesn’t make it easy for
you to type new lines; therefore, asking the model for help with composing
multi-line emails isn’t straightforward.  Yes, you can use Python’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;multi\nline
strings\nlike this one&lt;/code&gt;, but for this you’ll at least need a conversion tool.&lt;/p&gt;

&lt;p&gt;I want to have a similar UI with the ChatGPT, and it is possible!&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ ramalama serve llama3
OpenAI RESTAPI: http://localhost:8080
... starting ...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Getting this in web browser:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2025-06-23-ramalama/model-starting.png&quot; alt=&quot;Model starting&quot; /&gt;&lt;/p&gt;

&lt;p&gt;But after a while:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;...
srv  log_server_r: request: POST /v1/chat/completions 192.168.0.4 500
srv  log_server_r: request: GET / 192.168.0.4 200
srv  log_server_r: request: GET /props 192.168.0.4 200
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2025-06-23-ramalama/prompt.png&quot; alt=&quot;The UI prompt in web browser&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Admittedly, that’s just too much.  I don’t need a full prompt; I’d still prefer
a simple command-line interface that would let me provide multiline strings and
respond with the model’s answer.  Nah, we need to package &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;python-openai&lt;/code&gt; into
Fedora (but it is not yet there).&lt;/p&gt;

&lt;h2 id=&quot;performance-concerns&quot;&gt;Performance concerns&lt;/h2&gt;

&lt;p&gt;Both llama3 and Mistral respond surprisingly quickly.  The reply starts
immediately, and they print approximately 30 tokens per second.  Contrastingly,
Deepseek takes much longer to respond, approximately a minute, but the token
rate is roughly equivalent.&lt;/p&gt;

&lt;p&gt;I was surprised to find that while the GPU was fully utilized, NVTOP did not
report any additional GPU memory consumption (before, during or after model
provided the answer).  Does anyone have any ideas as to why this might be the
case?&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2025-06-23-ramalama/nvtop.png&quot; alt=&quot;NVTOP not reporting memory consumption&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;The mentioned models perform exceptionally well for my use-case.  My
interactions with the model look like:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;fix english:
the multi-line text
that I want to correct
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;and the outputs are noticeably superior to the inputs :-).&lt;/p&gt;

&lt;p&gt;More experimentation is possible with different models, temperature settings,
RAG, and more.  Refer to ramalama run –help for details.&lt;/p&gt;

&lt;p&gt;However, I have been encountering some hardware issues with my Radeon 780M.
If I run my laptop for an extended period, starting the prompt with a lengthy
question can trigger a black screen situation, leaving no other interactions
possible (reboot needed).  If you have any suggestions on how to debug these
issues, please let me know.&lt;/p&gt;

</description>
        <pubDate>Mon, 23 Jun 2025 00:00:00 +0000</pubDate>
        <link>https://pavel.raiskup.cz/blog/ramalama.html</link>
        <guid isPermaLink="true">https://pavel.raiskup.cz/blog/ramalama.html</guid>
        
        
      </item>
      
    
      
      <item>
        <title>Access to serial console in EC2</title>
        <description>&lt;p&gt;Even in the cloud, it is sometimes convenient to monitor systemd logs via the
&lt;a href=&quot;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/troubleshoot-using-serial-console.html&quot;&gt;serial console&lt;/a&gt; (or even log into the machine) when services like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sshd&lt;/code&gt;
fail or disks fail to mount.  With EC2, you can use SSH for this purpose.&lt;/p&gt;

&lt;h2 id=&quot;get-the-instance-id&quot;&gt;Get the instance ID&lt;/h2&gt;

&lt;p&gt;Either go to the console (web-ui) and get the instance ID there, or just ssh to
the machine and query the &lt;a href=&quot;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html&quot;&gt;Metadata Service&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ ssh &amp;lt;user&amp;gt;@&amp;lt;host&amp;gt;
$ TOKEN=$(curl -X PUT &quot;http://169.254.169.254/latest/api/token&quot; -H &quot;X-aws-ec2-metadata-token-ttl-seconds: 21600&quot;)
$ curl -H &quot;X-aws-ec2-metadata-token: $TOKEN&quot; http://169.254.169.254/latest/meta-data/instance-id ; echo
i-015xxxxxxxxxxxxxx
$ exit
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;access-the-serial-console&quot;&gt;Access the serial console&lt;/h2&gt;

&lt;p&gt;On your machine, setup a few environment variables:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ instance_id=i-015xxxxxxxxxxxxxx
$ pubkey=/home/praiskup/.ssh/id_rsa.pub
$ region=us-east-1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Tell EC2 what SSH key you want to use first, and then ssh to the console:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ aws ec2-instance-connect send-serial-console-ssh-public-key \
    --instance-id &quot;$instance_id&quot; \
    --serial-port 0 \
    --ssh-public-key file://&quot;$pubkey&quot; \
    --region &quot;$region&quot;
-----------------------------------------------------
|           SendSerialConsoleSSHPublicKey           |
+----------------------------------------+----------+
|                RequestId               | Success  |
+----------------------------------------+----------+
|  xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  |  True    |
+----------------------------------------+----------+

$ ssh &quot;$instance_id&quot;.port0@serial-console.ec2-instance-connect.&quot;$region&quot;.aws
copr-fe-dev login: 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;work-with-the-console-over-ssh&quot;&gt;Work with the console over SSH&lt;/h2&gt;

&lt;p&gt;Use the neat SSH control keys, start with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~?&lt;/code&gt;, quit the session with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~.&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;copr-fe-dev login: ~?
Supported escape sequences:
 ~.   - terminate connection (and any multiplexed sessions)
 ~B   - send a BREAK to the remote system
 ~R   - request rekey
 ~V/v - decrease/increase verbosity (LogLevel)
 ~^Z  - suspend ssh
 ~#   - list forwarded connections
 ~&amp;amp;   - background ssh (when waiting for connections to terminate)
 ~?   - this message
 ~~   - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Watch the systemd logs over SSH:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[root@copr-fe-dev ~][STG]# reboot 
         Stopping session-160.scope - Session 160 of User root...
         Stopping session-49.scope - Session 49 of User root...
[  OK  ] Removed slice system-modprobe.slice - Slice /system/modprobe.
[  OK  ] Removed slice system-sshd\x2dkeygen.slice - Slice /system/sshd-keygen.
[  OK  ] Removed slice system-systemd\x2dzr…- Slice /system/systemd-zram-setup.
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;make-grub2-menu-available&quot;&gt;Make grub2 menu available&lt;/h2&gt;

&lt;p&gt;Currently there’s a &lt;a href=&quot;https://bugzilla.redhat.com/show_bug.cgi?id=2329760&quot;&gt;problem with Grub in EC2&lt;/a&gt;,
but in general you would be doing something like:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ cp /boot/grub2/grub.cfg /var/tmp/     # backup
$ grub2-editenv - unset menu_auto_hide  # https://fedoraproject.org/wiki/Changes/HiddenGrubMenu
$ vim /etc/default/grub                 # change the $GRUB_TIMEOUT
$ grub2-mkconfig &amp;gt; /boot/grub2/grub.cfg # re-generate
$ vim -d /boot/grub2/grub.cfg /var/tmp/grub.cfg  # review!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You might notice a problem that I did, &lt;a href=&quot;https://fosstodon.org/@praiskup/113557853677016655&quot;&gt;systemd disallows reboot over EC2
console&lt;/a&gt;, not reported for now.  The EC2 console has no “send
ctrl+alt+delete” button, nor an on-screen keyboard.  You can’t send
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ctrl+alt+delte&lt;/code&gt; over the SSH-console.  SysRq is disabled of course (by
default).  Could we have something like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ctrl+R&lt;/code&gt; for rebooting?  Not sure.&lt;/p&gt;

</description>
        <pubDate>Sun, 01 Dec 2024 00:00:00 +0000</pubDate>
        <link>https://pavel.raiskup.cz/blog/serial-console-in-ec2.html</link>
        <guid isPermaLink="true">https://pavel.raiskup.cz/blog/serial-console-in-ec2.html</guid>
        
        
      </item>
      
    
      
      <item>
        <title>Debugging Jekyll posts locally</title>
        <description>&lt;p&gt;Just a quick post about a small side-project.  For a few years now, I’ve
been maintaining a &lt;a href=&quot;https://github.com/praiskup/jekyll-container&quot;&gt;Jekyll Container image&lt;/a&gt;.  Mostly for my own
convenience—whether I’m working on posts for this blog or writing
&lt;a href=&quot;https://rpm-software-management.github.io/mock/&quot;&gt;documentation for Mock&lt;/a&gt; (or other).  I thought I’d share a few
words about it now.&lt;/p&gt;

&lt;h2 id=&quot;keep-my-box-clean-and-dry&quot;&gt;Keep My Box Clean! (and DRY)&lt;/h2&gt;

&lt;p&gt;The motivation was simple: to be able to debug Jekyll/GitHub Pages posts
locally before pushing them to GitHub.  I wanted to do this consistently
across multiple pages, and I didn’t want to repeat myself in the future
(following the DRY principle).&lt;/p&gt;

&lt;p&gt;Back then, I realized that running Jekyll locally wasn’t a trivial task—at
least not on Fedora, if, like me, you prefer staying on a “pure” Fedora
system (meaning you only install software distributed through Fedora
repositories).  Notably, installing the GitHub Pages additions from gems
&lt;a href=&quot;https://talk.jekyllrb.com/t/error-no-implicit-conversion-of-hash-into-integer/5890/5&quot;&gt;wasn’t easy either&lt;/a&gt;, and &lt;a href=&quot;https://stackoverflow.com/questions/75452016/installation-messed-up-with-ruby-unable-to-install-jekyll&quot;&gt;it still isn’t&lt;/a&gt; (as of autumn 2024).
Building your own container can also cause &lt;a href=&quot;https://github.com/jekyll/jekyll/issues/8846&quot;&gt;some headaches&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;jekyll-made-easy&quot;&gt;Jekyll made easy&lt;/h2&gt;

&lt;p&gt;So here we are—assuming you have a blog post or any documentation root
directory, you can run the Jekyll server in a container, and available on
&lt;a href=&quot;http://localhost:4000/&quot;&gt;http://localhost:4000/&lt;/a&gt;, using just:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ jekyll-host ./your-jekyll-root
Installing deps, may take several minutes
=========================================
 Server listens on http://127.0.0.1:4000
 Jekyll Log: /tmp/jekyll-server.log (in container)
 Install logs: /tmp/bundler-install.log (in container)
=========================================
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jekyll-host&lt;/code&gt; script (which must be in your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$PATH&lt;/code&gt;) is just a &lt;a href=&quot;https://github.com/praiskup/jekyll-container/blob/main/jekyll-host&quot;&gt;one-line
wrapper&lt;/a&gt; around a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;podman run&lt;/code&gt; command that uses a pre-built
container image hosted and built by &lt;a href=&quot;https://quay.io/&quot;&gt;https://quay.io/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I prefer to stay 100% focused on writing, not on the infrastructure.
After a quick chat with my colleagues, it seems this setup could be
helpful to others as well.  If that’s the case, enjoy!&lt;/p&gt;

</description>
        <pubDate>Fri, 11 Oct 2024 00:00:00 +0000</pubDate>
        <link>https://pavel.raiskup.cz/blog/jekyll-container.html</link>
        <guid isPermaLink="true">https://pavel.raiskup.cz/blog/jekyll-container.html</guid>
        
        
      </item>
      
    
      
      <item>
        <title>Cleaning up rolling distro builds in Copr</title>
        <description>
</description>
        <pubDate>Mon, 01 Jul 2024 00:00:00 +0000</pubDate>
        <link>https://pavel.raiskup.cz/blog/copr-rolling-cleanup.html</link>
        <guid isPermaLink="true">https://pavel.raiskup.cz/blog/copr-rolling-cleanup.html</guid>
        
        
      </item>
      
    
      
      <item>
        <title>Need something extra? Employ your own Copr builders!</title>
        <description>&lt;p&gt;Each Copr deployment needs to &lt;a href=&quot;https://github.com/praiskup/resalloc&quot;&gt;manage&lt;/a&gt; a farm of builders (normally
virtual machines) across various clouds, with various architectures and
performance profiles.&lt;/p&gt;

&lt;p&gt;For example, in the &lt;a href=&quot;https://copr.fedorainfracloud.org/&quot;&gt;Fedora Copr instance&lt;/a&gt;, where there is normally
a reasonable amount of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x86_64/amd64&lt;/code&gt; builders, users very often wait for
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;s390x/Z&lt;/code&gt; builders.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;https://github.com/fedora-copr/copr/commit/9e71174fca5bd18feee1ebc3959cf6f36c4b0c28&quot;&gt;recent Copr contribution&lt;/a&gt; has given us option to allocate
&lt;a href=&quot;https://docs.pagure.org/copr.copr/user_documentation/powerful_builders.html&quot;&gt;high-performance builders&lt;/a&gt; for specific build tasks.  And as a nice
side effect, it also opened the door to providing any other &lt;strong&gt;custom workers&lt;/strong&gt;.
And, if you don’t want to wait in the queue anymore, you can also have &lt;strong&gt;workers
dedicated to your team&lt;/strong&gt;!&lt;/p&gt;

&lt;h2 id=&quot;whats-needed&quot;&gt;What’s Needed?&lt;/h2&gt;

&lt;p&gt;Copr administrators should be able to configure a new pool(s) of VMs (builders)
for you, and then make &lt;em&gt;your builds&lt;/em&gt; use them.&lt;/p&gt;

&lt;p&gt;Of course, admins will need your permission to start the machines in your name.
There’s already a built-in support for working with &lt;em&gt;IBM Cloud&lt;/em&gt;, &lt;em&gt;OpenStack&lt;/em&gt;,
&lt;em&gt;EC2&lt;/em&gt; or &lt;em&gt;LibVirt&lt;/em&gt; (so a cloud token is needed, or SSH access to hypervisor).
Support for other clouds could be added, too — we’d just need a bit more help
from you (scripting and golden-image preparation).&lt;/p&gt;

&lt;p&gt;You need to make a budget decision.  Your builders can either be booted on
demand (which may delay the build processing by 2 or 3 minutes, but it
depends…) or use the VM pre-allocation mechanism (a few builders are booted in
advance, you pay the cloud costs for them, but they are pre-prepared to take
your tasks immediately).&lt;/p&gt;

&lt;p&gt;Then one note (similar like with the &lt;em&gt;high-performance builders&lt;/em&gt;).  For the
configured builds, your cloud account (and only that) will be used for virtual
machine allocation, and it probably isn’t limitless.&lt;/p&gt;

&lt;h2 id=&quot;community-sponsors&quot;&gt;Community Sponsors&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Resalloc&lt;/em&gt; also allows Copr admins to configure additional pools of workers for
the general public.  This can be beneficial for interesting use-cases (platform
enablement, specific hardware needs, AI-related builds, etc.), or even just to
boost the overall Copr throughput.  If you plan to help the community this way,
or you already do, THANK YOU very much!&lt;/p&gt;

&lt;h2 id=&quot;what-next&quot;&gt;What next?&lt;/h2&gt;

&lt;p&gt;Please consult the options with us, either on the &lt;a href=&quot;https://lists.fedorahosted.org/archives/list/copr-devel%40lists.fedorahosted.org/&quot;&gt;copr-devel list&lt;/a&gt;, the
team e-mail &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;copr-team@redhat.com&lt;/code&gt;, or &lt;a href=&quot;https://github.com/fedora-copr/copr/issues/new&quot;&gt;submit an issue&lt;/a&gt;.&lt;/p&gt;

</description>
        <pubDate>Sat, 22 Jun 2024 00:00:00 +0000</pubDate>
        <link>https://pavel.raiskup.cz/blog/custom-copr-builders.html</link>
        <guid isPermaLink="true">https://pavel.raiskup.cz/blog/custom-copr-builders.html</guid>
        
        
      </item>
      
    
      
      <item>
        <title>RFC: Planning Copr → PULP RPM content movement</title>
        <description>&lt;p&gt;The Fedora Copr storage hosts (beginning of Y2024) approximately 33TB of
data (RPM repositories and RPM files).  The data is stored on a Fedora
server, utilizing a &lt;a href=&quot;https://pagure.io/fedora-infra/ansible/blob/5d5ec547ea386c3636f59b99e0546f10788705f1/f/inventory/group_vars/copr_back_aws#_51-59&quot;&gt;rather complicated lvm+raid setup&lt;/a&gt;, all hosted
on AWS EC2, typically hidden behind CDN (&lt;a href=&quot;https://aws.amazon.com/cloudfront/&quot;&gt;AWS CloudFront&lt;/a&gt;).
Modifying this setup and further maintenance is non-trivial (adding new arrays
of disks into LVM, migrating the box to new Fedora releases, etc).&lt;/p&gt;

&lt;p&gt;We’d like to use something that auto-scales long-term, either something
like Amazon EFS (seems more expensive compared to our current setup) or S3
(implies a significant rewrite of Copr code).&lt;/p&gt;

&lt;p&gt;Also, things used to be relatively trivial years ago.  With the current
data payload though, even some of our logic needs &lt;a href=&quot;https://github.com/fedora-copr/copr/issues?q=is%3Aissue+is%3Aopen+label%3Apulp&quot;&gt;to be
updated&lt;/a&gt; (both for convenience and performance).&lt;/p&gt;

&lt;p&gt;Wait, we are not the first team hosting RPMs, right?  There’s
&lt;a href=&quot;https://pulpproject.org/&quot;&gt;PULP&lt;/a&gt;!  Why not delegate the heavy-lifting to the project
designed for RPM content hosting (actually having the S3 support)?  Sure,
the switch &lt;a href=&quot;https://github.com/fedora-copr/copr/issues/2533&quot;&gt;is not going to be trivial&lt;/a&gt;.  In this post, I’d like
to at least propose the basic “stages” for the hostname migration (how
users consume the storage).&lt;/p&gt;

&lt;h2 id=&quot;the-old-state&quot;&gt;The old state&lt;/h2&gt;

&lt;p&gt;The results are served by lighttpd on the Copr Backend box, in the
&lt;a href=&quot;https://copr-be.cloud.fedoraproject.org/results/&quot;&gt;non-cached results directory&lt;/a&gt;, and &lt;a href=&quot;https://download.copr.fedorainfracloud.org/results/&quot;&gt;cached by
CloudFronts&lt;/a&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fp.o = fedoraproject.org&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fic.o =
fedorainfracloud.org&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/pulp-content-hosting/old-state.png&quot; alt=&quot;the diagram of the old flow&quot; /&gt;&lt;/p&gt;

&lt;p&gt;All users consume content through CDN,
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;download.copr.fedorainfracloud.org&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;the-migration-time&quot;&gt;The migration time&lt;/h2&gt;

&lt;p&gt;We’ll start with a new hostname related to the PULP server.  We are not
sure whether we’ll use the &lt;a href=&quot;https://docs.pulpproject.org/pulpcore/components.html&quot;&gt;PULP built-in HA&lt;/a&gt;,
&lt;a href=&quot;https://aws.amazon.com/cloudfront/&quot;&gt;CloudFront&lt;/a&gt;, or both.  Initially, we’ll begin moving a small set of
projects, and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;copr-be.cloud.fp.o&lt;/code&gt; box will have to start redirecting
(some) requests to them to, e.g., &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pulp.copr.fp.o&lt;/code&gt;.  You may wonder if
this “redirection” is supported by DNF5, DNF, and YUM customers — it is
(tested even on CentOS 6).&lt;/p&gt;

&lt;p&gt;Migrated Copr projects will provide updated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.repo&lt;/code&gt; files (like
&lt;a href=&quot;https://copr.fedorainfracloud.org/coprs/g/copr/copr/repo/fedora-rawhide/group_copr-copr-fedora-rawhide.repo&quot;&gt;this&lt;/a&gt;), pointing to the PULP hostname.  So, when users
start consuming project content, e.g., with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dnf copr enable&lt;/code&gt;, their
machines will not have to follow the redirects!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/pulp-content-hosting/migration.png&quot; alt=&quot;how things get redirected during migration time&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;once-done&quot;&gt;Once done&lt;/h2&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;download.corp.fedorainfracloud.org&lt;/code&gt; no longer points to the
CloudFront cache but directly to the PULP host.  This change will be
necessary for some indefinite amount of time to remain compatible with the
old &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.repo&lt;/code&gt; file installations.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/pulp-content-hosting/final-state.png&quot; alt=&quot;the diagram for the new, after-migration flow&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;bad-idea&quot;&gt;Bad idea?&lt;/h2&gt;

&lt;p&gt;The primary motivation for this flow is to ensure the smoothest possible
experience throughout all phases (repositories available all the time).&lt;/p&gt;

&lt;p&gt;Please let us know if you have any concerns or questions.  Otherwise, just stay
tuned for further updates!&lt;/p&gt;

</description>
        <pubDate>Fri, 15 Mar 2024 00:00:00 +0000</pubDate>
        <link>https://pavel.raiskup.cz/blog/copr-and-pulp-content-hosting.html</link>
        <guid isPermaLink="true">https://pavel.raiskup.cz/blog/copr-and-pulp-content-hosting.html</guid>
        
        
      </item>
      
    
      
      <item>
        <title>AI-driven RPM Build Failure diagnosis</title>
        <description>
</description>
        <pubDate>Tue, 16 Jan 2024 00:00:00 +0000</pubDate>
        <link>https://pavel.raiskup.cz/blog/ai-log-detective.html</link>
        <guid isPermaLink="true">https://pavel.raiskup.cz/blog/ai-log-detective.html</guid>
        
        
      </item>
      
    
  </channel>
</rss>
