The Wombelix Post - Linuxhttps://dominik.wombacher.cc/2023-07-12T00:00:00+02:00Linux Professional Institute LPIC-22023-07-12T00:00:00+02:002023-07-12T00:00:00+02:00Dominik Wombachertag:dominik.wombacher.cc,2023-07-12:/posts/linux-professional-institute-lpic-2.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Today was finally the day I passed the second Exam <strong>202-450</strong> and became <strong>LPIC-2</strong> certified.
I passed the first Exam, <em>201-450</em> already in October 2019, but failed the second one ... <a class="read-more" href="/posts/linux-professional-institute-lpic-2.html"> [read more]</a></p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Today was finally the day I passed the second Exam <strong>202-450</strong> and became <strong>LPIC-2</strong> certified.
I passed the first Exam, <em>201-450</em> already in October 2019, but failed the second one.</p>
<p>Then life happened, other personal and professional priorities, finishing the LPIC-2 was long time
on my list but I never actually did it. Last year on Cyber Monday I bought the Voucher to "force"
me to get it done this year.</p>
<p>I was on vacation for two weeks and used some of this time to prepare for the Exam, which was even
harder as I remembered it, and passed this time with a decent score. The resources I used to Study:</p>
<ul class="simple">
<li><a class="reference external" href="https://lpic2book.github.io/src/">The LPIC2 Exam Prep</a> (open source)</li>
<li><a class="reference external" href="https://www.wiley.com/en-us/LPIC+2%3A+Linux+Professional+Institute+Certification+Study+Guide%3A+Exam+201+and+Exam+202%2C+2nd+Edition-p-9781119150794">LPIC-2 Study Guide</a> (Wiley / Sybex, ISBN: 978-1-119-15079-4)</li>
<li><a class="reference external" href="https://www.pearsonitcertification.com/store/lpic-2-cert-guide-201-400-and-202-400-exams-9780789757142">Cert Guide LPIC-2</a> (Pearson IT Certification, ISBN-13: 978-0-7897-5714-2))</li>
</ul>
<p>They are all good in their own way and teach a lot about the different topics, but without
reading through man pages and official docs, by memorizing CLI tools and parameter as well as
the syntax of all the involved config files, in addition to those books, it's not possible to pass.</p>
<p>The Exam Questions are hard and mostly very in-depth what they are asking and expect you to know.</p>
<p>When I started to Study, people asked me why, I already have a lot of Linux related
certifications and many years of experience. First it was something I started years ago and didn't
finished, which felt wrong. Second, it's now a container and cloud world out there, but "classic"
Linux administrator knowledge, like Bind, LDAP, Samba, Postfix or Dovecot, is still valuable.</p>
<p>Preparing for the Exam helped me to brush up my knowledge, I didn't used some of the tools in years,
but it was great to build and configure something without automation or containers. I'm sure I can
reuse a lot of these knowledge and transfer it into "the new world" as well.</p>
<p><strong>Summary</strong>: The LPIC-2 validates the candidate’s ability to administer small to medium–sized mixed networks.</p>
<p>Source & Copyright: <a class="reference external" href="https://www.lpi.org">https://www.lpi.org</a></p>
<div class="section" id="skills">
<h2>Skills</h2>
<ul class="simple">
<li>perform advanced system administration, including common tasks regarding the Linux kernel, system startup and maintenance</li>
<li>perform advanced Management of block storage and file systems as well as advanced networking and authentication and system security, including firewall and VPN</li>
<li>install and configure fundamental network services, including DHCP, DNS, SSH, Web servers, file servers using FTP, NFS and Samba, email delivery</li>
</ul>
<p>Source & Copyright: <a class="reference external" href="https://www.lpi.org">https://www.lpi.org</a></p>
</div>
<div class="section" id="certificate">
<h2>Certificate</h2>
<ul class="simple">
<li>Downloads<ul>
<li><a class="reference external" href="/certificates/Dominik_Wombacher_LPIC-2.pdf">Certificate</a> (PDF, 144K)</li>
</ul>
</li>
<li>Links<ul>
<li><a class="reference external" href="https://lpi.org/v/LPI000417309/rj2mqfnw9r">Certificate Verification</a>
(Archive: <a class="reference external" href="https://web.archive.org/web/20230713125639/https://cs.lpi.org/caf/Xamman/certification/verify/LPI000417309/rj2mqfnw9r">[1]</a>,
<a class="reference external" href="https://archive.today/2023.07.13-125642/https://cs.lpi.org/caf/Xamman/certification/verify/LPI000417309/rj2mqfnw9r">[2]</a>)</li>
</ul>
</li>
</ul>
</div>
jDeepL - Unofficial DeepL App for Linux based on JavaFX2022-05-30T00:00:00+02:002022-05-30T00:00:00+02:00Dominik Wombachertag:dominik.wombacher.cc,2022-05-30:/posts/jdeepl_unofficial_deepl_app_for_linux_based_on_javafx.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>I'm a daily DeepL User, the Windows App is convenient but nothing comparable was available for Linux, so I build my own.</p>
<p>jDeepL is a very simple GUI Application based ... <a class="read-more" href="/posts/jdeepl_unofficial_deepl_app_for_linux_based_on_javafx.html"> [read more]</a></p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>I'm a daily DeepL User, the Windows App is convenient but nothing comparable was available for Linux, so I build my own.</p>
<p>jDeepL is a very simple GUI Application based on JavaFX, developed and tested on openSUSE Tumbleweed with KDE Plasma.</p>
<p>You can find the GPL v3 licensed Source Code here: <a class="reference external" href="https://dominik.wombacher.cc/~git/jDeepL/">https://dominik.wombacher.cc/~git/jDeepL/</a></p>
<p>It's in an early stage but covers the most important functionality: Translating the marked text by pressing <code>CTRL + C + C</code>.</p>
<p>At least that's for me the most important one from the official Windows App ;)</p>
<p>I will probably improve it further within the next time, feel free to Contribute.</p>
<p>Further details can be found in the README: <a class="reference external" href="https://dominik.wombacher.cc/~git/jDeepL/about/">https://dominik.wombacher.cc/~git/jDeepL/about/</a></p>
Customized openSUSE Images, to run on Proxmox VE out of the box, build on OBS2022-04-26T00:00:00+02:002023-07-02T00:00:00+02:00Dominik Wombachertag:dominik.wombacher.cc,2022-04-26:/posts/customized_opensuse_images_to_run_on_proxmox_ve_out_of_the_box_build_on_obs.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>I'm using openSUSE whenever possible but had some trouble to use the official images on <a class="reference external" href="https://proxmox.com">Proxmox</a>.
There is mostly a <code>kvm-and-xen</code> image available, but that doesn't contain <code>cloud-init</code>
and / or ... <a class="read-more" href="/posts/customized_opensuse_images_to_run_on_proxmox_ve_out_of_the_box_build_on_obs.html"> [read more]</a></p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>I'm using openSUSE whenever possible but had some trouble to use the official images on <a class="reference external" href="https://proxmox.com">Proxmox</a>.
There is mostly a <code>kvm-and-xen</code> image available, but that doesn't contain <code>cloud-init</code>
and / or <code>qemu-guest-agent</code>, but for my use case, automated IPv6-only deployments, both are mandatory.</p>
<p>Proxmox supports <em>cloud-init</em> to configure basics like search domain, nameserver, user, password and ssh key.
If the <em>qemu-guest-agent</em> is installed, the IPv6 address configured via SLAAC is available through the
API as soon the VM was booted.</p>
<p>In regards to openSUSE MicroOS the situation was even worse, only the <code>OpenStack-Cloud</code> image
includes <em>cloud-init</em> but relies on the package <code>cloud-init-config-MicroOS</code> which installs a
<code>/etc/cloud/cloud.cfg</code> without a <em>default_user</em> section and enabled root user.</p>
<p>That way configuring a User account with sudo permissions via <em>cloud-init</em> will just not work.</p>
<p>So after some playing around with different approaches and especially due to the fact that I use a lot of different
openSUSE Images, I decided to branch the relevant projects / packages on <a class="reference external" href="https://build.opensuse.org">https://build.opensuse.org</a> and let OBS do the
heavy lifting for me to build and publish the different images.</p>
<p>Leap 15.3 and 15.4 required also an adjustment of the OBS Project Config, most important for automation was
<em>staticlinks</em> to ensure the same link will work even after a new build.</p>
<pre class="code text literal-block">
%if "%_repository" == "images"
Type: kiwi
Repotype: staticlinks
Patterntype: none
%endif
# slsaprovenance - as described at https://slsa.dev/provenance/v0.2
BuildFlags: slsaprovenance
</pre>
<p>After some further testing, let's see which of my changes might be possible to get included upstream.</p>
<p>I'm also working on Proxmox VE "optimized" images for other Distributions like Rocky Linux or Debian,
I will probably pick a different approach to customize them, but that's something for another Post some day.</p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#opensuse-microos" id="toc-entry-1">openSUSE MicroOS</a><ul>
<li><a class="reference internal" href="#open-build-service-obs-project" id="toc-entry-2">Open Build Service (OBS) Project</a></li>
<li><a class="reference internal" href="#download" id="toc-entry-3">Download</a></li>
<li><a class="reference internal" href="#customizations" id="toc-entry-4">Customizations</a></li>
</ul>
</li>
<li><a class="reference internal" href="#opensuse-tubmleweed-jeos" id="toc-entry-5">openSUSE Tubmleweed JeOS</a><ul>
<li><a class="reference internal" href="#open-build-service-obs-project-1" id="toc-entry-6">Open Build Service (OBS) Project</a></li>
<li><a class="reference internal" href="#download-1" id="toc-entry-7">Download</a></li>
<li><a class="reference internal" href="#customizations-1" id="toc-entry-8">Customizations</a></li>
</ul>
</li>
<li><a class="reference internal" href="#opensuse-leap-15-3-jeos" id="toc-entry-9">openSUSE Leap 15.3 JeOS</a><ul>
<li><a class="reference internal" href="#open-build-service-obs-project-2" id="toc-entry-10">Open Build Service (OBS) Project</a></li>
<li><a class="reference internal" href="#download-2" id="toc-entry-11">Download</a></li>
<li><a class="reference internal" href="#customizations-2" id="toc-entry-12">Customizations</a></li>
</ul>
</li>
<li><a class="reference internal" href="#opensuse-leap-15-4-jeos" id="toc-entry-13">openSUSE Leap 15.4 JeOS</a><ul>
<li><a class="reference internal" href="#open-build-service-obs-project-3" id="toc-entry-14">Open Build Service (OBS) Project</a></li>
<li><a class="reference internal" href="#download-3" id="toc-entry-15">Download</a></li>
<li><a class="reference internal" href="#customizations-3" id="toc-entry-16">Customizations</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="opensuse-microos">
<h2><a class="toc-backref" href="#toc-entry-1">openSUSE MicroOS</a></h2>
<div class="section" id="open-build-service-obs-project">
<h3><a class="toc-backref" href="#toc-entry-2">Open Build Service (OBS) Project</a></h3>
<p><a class="reference external" href="https://build.opensuse.org/package/show/home:wombelix:branches:devel:kubic:images/openSUSE-MicroOS">https://build.opensuse.org/package/show/home:wombelix:branches:devel:kubic:images/openSUSE-MicroOS</a></p>
</div>
<div class="section" id="download">
<h3><a class="toc-backref" href="#toc-entry-3">Download</a></h3>
<p>openSUSE Mirror (Automatic Build / Sync): <a class="reference external" href="https://download.opensuse.org/repositories/home:/wombelix:/branches:/devel:/kubic:/images/openSUSE_Tumbleweed/">https://download.opensuse.org/repositories/home:/wombelix:/branches:/devel:/kubic:/images/openSUSE_Tumbleweed/</a></p>
</div>
<div class="section" id="customizations">
<h3><a class="toc-backref" href="#toc-entry-4">Customizations</a></h3>
<p>Please be aware: The below diff should give you an idea about the changes, it will not be updated, please check the OBS Project for the latest revision</p>
<pre class="code diff literal-block">
<span class="pygments-gh">Index: _multibuild</span><span class="pygments-w">
</span><span class="pygments-gh">===================================================================</span><span class="pygments-w">
</span><span class="pygments-gd">--- _multibuild (revision 105)</span><span class="pygments-w">
</span><span class="pygments-gi">+++ _multibuild (revision 8)</span><span class="pygments-w">
</span><span class="pygments-gu">@@ -1,8 +1,15 @@</span><span class="pygments-w">
</span><multibuild><span class="pygments-w">
</span><span class="pygments-gi">+ <flavor>pve</flavor></span><span class="pygments-w">
</span><span class="pygments-gi">+ <flavor>ContainerHost-pve</flavor></span><span class="pygments-w">
</span><span class="pygments-gi">+ <flavor>Kubic-kubeadm-pve</flavor></span><span class="pygments-w">
</span><span class="pygments-gi">+ <flavor>k3s-pve</flavor></span><span class="pygments-w">
</span><span class="pygments-gi">+</span><span class="pygments-w">
</span> <!-- Special case: Pi2, VBox and onie only get plain MicroOS --><span class="pygments-w">
</span><span class="pygments-gi">+ <!--</span><span class="pygments-w">
</span> <flavor>RaspberryPi2</flavor><span class="pygments-w">
</span> <flavor>VirtualBox</flavor><span class="pygments-w">
</span> <flavor>onie</flavor><span class="pygments-w">
</span><span class="pygments-gi">+ --></span><span class="pygments-w">
</span> <!--<span class="pygments-w">
</span> for a in kvm-and-xen VMware MS-HyperV OpenStack-Cloud Pine64 Rock64 RaspberryPi Vagrant hardware; do<span class="pygments-w">
</span> for f in "" "ContainerHost-" "Kubic-kubeadm-"; do<span class="pygments-w">
</span><span class="pygments-gu">@@ -10,6 +17,7 @@</span><span class="pygments-w">
</span> done<span class="pygments-w">
</span> done<span class="pygments-w">
</span> --><span class="pygments-w">
</span><span class="pygments-gi">+ <!--</span><span class="pygments-w">
</span> <flavor>kvm-and-xen</flavor><span class="pygments-w">
</span> <flavor>ContainerHost-kvm-and-xen</flavor><span class="pygments-w">
</span> <flavor>Kubic-kubeadm-kvm-and-xen</flavor><span class="pygments-w">
</span><span class="pygments-gu">@@ -48,4 +56,5 @@</span><span class="pygments-w">
</span> <flavor>k3s-Vagrant</flavor><span class="pygments-w">
</span> <flavor>k3s-SelfInstall</flavor><span class="pygments-w">
</span> <flavor>k3s-DigitalOcean-Cloud</flavor><span class="pygments-w">
</span><span class="pygments-gi">+ --></span><span class="pygments-w">
</span></multibuild><span class="pygments-w">
</span><span class="pygments-gh">Index: config.sh</span><span class="pygments-w">
</span><span class="pygments-gh">===================================================================</span><span class="pygments-w">
</span><span class="pygments-gd">--- config.sh (revision 105)</span><span class="pygments-w">
</span><span class="pygments-gi">+++ config.sh (revision 8)</span><span class="pygments-w">
</span><span class="pygments-gu">@@ -157,6 +157,7 @@</span><span class="pygments-w">
</span>ignition_platform='metal'<span class="pygments-w">
</span>case "${kiwi_profiles}" in<span class="pygments-w">
</span><span class="pygments-gi">+ *pve*) ignition_platform='qemu' ;;</span><span class="pygments-w">
</span> *kvm*) ignition_platform='qemu' ;;<span class="pygments-w">
</span> *DigitalOcean*) ignition_platform='digitalocean' ;;<span class="pygments-w">
</span> *VMware*) ignition_platform='vmware' ;;<span class="pygments-w">
</span><span class="pygments-gu">@@ -281,3 +282,21 @@</span><span class="pygments-w">
</span> chmod 0600 /home/vagrant/.ssh/authorized_keys<span class="pygments-w">
</span> chown -R vagrant /home/vagrant<span class="pygments-w">
</span>fi<span class="pygments-w">
</span><span class="pygments-gi">+</span><span class="pygments-w">
</span><span class="pygments-gi">+#======================================</span><span class="pygments-w">
</span><span class="pygments-gi">+# Configure PVE specifics</span><span class="pygments-w">
</span><span class="pygments-gi">+#--------------------------------------</span><span class="pygments-w">
</span><span class="pygments-gi">+if [[ "$kiwi_profiles" == *"pve"* ]]; then</span><span class="pygments-w">
</span><span class="pygments-gi">+ cat > /etc/cloud/cloud.cfg.d/default_user.cfg <<-EOF</span><span class="pygments-w">
</span><span class="pygments-gi">+ users:</span><span class="pygments-w">
</span><span class="pygments-gi">+ - default</span><span class="pygments-w">
</span><span class="pygments-gi">+ disable_root: true</span><span class="pygments-w">
</span><span class="pygments-gi">+ system_info:</span><span class="pygments-w">
</span><span class="pygments-gi">+ default_user:</span><span class="pygments-w">
</span><span class="pygments-gi">+ name: geeko</span><span class="pygments-w">
</span><span class="pygments-gi">+ lock_passwd: True</span><span class="pygments-w">
</span><span class="pygments-gi">+ groups: [cdrom, users]</span><span class="pygments-w">
</span><span class="pygments-gi">+ sudo: ["ALL=(ALL) NOPASSWD:ALL"]</span><span class="pygments-w">
</span><span class="pygments-gi">+ shell: /bin/bash</span><span class="pygments-w">
</span><span class="pygments-gi">+ EOF</span><span class="pygments-w">
</span><span class="pygments-gi">+fi</span><span class="pygments-w">
</span><span class="pygments-gh">Index: openSUSE-MicroOS.kiwi</span><span class="pygments-w">
</span><span class="pygments-gh">===================================================================</span><span class="pygments-w">
</span><span class="pygments-gd">--- openSUSE-MicroOS.kiwi (revision 105)</span><span class="pygments-w">
</span><span class="pygments-gi">+++ openSUSE-MicroOS.kiwi (revision 8)</span><span class="pygments-w">
</span><span class="pygments-gu">@@ -13,6 +13,7 @@</span><span class="pygments-w">
</span> <profile name="k3s" description="MicroOS with k3s"/><span class="pygments-w">
</span> <profile name="Kubic-kubeadm" description="MicroOS with CRI-O and kubeadm"/><span class="pygments-w">
</span> <!-- Platforms --><span class="pygments-w">
</span><span class="pygments-gi">+ <profile name="pve" description="Proxmox VE (pve) for x86_64" arch="x86_64"/></span><span class="pygments-w">
</span> <profile name="kvm-and-xen" description="kvm-and-xen" arch="x86_64,aarch64"/><span class="pygments-w">
</span> <profile name="VMware" description="VMware for x86_64" arch="x86_64"/><span class="pygments-w">
</span> <profile name="MS-HyperV" description="Hyper-V for x86_64" arch="x86_64"/><span class="pygments-w">
</span><span class="pygments-gu">@@ -27,6 +28,10 @@</span><span class="pygments-w">
</span> <profile name="SelfInstall" description="Self Installing Image" arch="x86_64,aarch64"/><span class="pygments-w">
</span> <profile name="onie" description="ONIE Installer Image" arch="x86_64"/><span class="pygments-w">
</span> <!-- Images (flavor + platform) --><span class="pygments-w">
</span><span class="pygments-gi">+ <profile name="ContainerHost-pve" description="MicroOS with Podman for Proxmox VE (pve)" arch="x86_64"></span><span class="pygments-w">
</span><span class="pygments-gi">+ <requires profile="pve"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <requires profile="ContainerHost"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ </profile></span><span class="pygments-w">
</span> <profile name="ContainerHost-kvm-and-xen" description="MicroOS with Podman for KVM and HVM Xen" arch="x86_64,aarch64"><span class="pygments-w">
</span> <requires profile="kvm-and-xen"/><span class="pygments-w">
</span> <requires profile="ContainerHost"/><span class="pygments-w">
</span><span class="pygments-gu">@@ -59,6 +64,10 @@</span><span class="pygments-w">
</span> <requires profile="Vagrant"/><span class="pygments-w">
</span> <requires profile="ContainerHost"/><span class="pygments-w">
</span> </profile><span class="pygments-w">
</span><span class="pygments-gi">+ <profile name="Kubic-kubeadm-pve" description="kubeadm with CRI-O for Proxmox VE (pve)" arch="x86_64"></span><span class="pygments-w">
</span><span class="pygments-gi">+ <requires profile="pve"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <requires profile="Kubic-kubeadm"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ </profile></span><span class="pygments-w">
</span> <profile name="Kubic-kubeadm-kvm-and-xen" description="kubeadm with CRI-O for KVM and HVM Xen" arch="x86_64,aarch64"><span class="pygments-w">
</span> <requires profile="kvm-and-xen"/><span class="pygments-w">
</span> <requires profile="Kubic-kubeadm"/><span class="pygments-w">
</span><span class="pygments-gu">@@ -103,6 +112,10 @@</span><span class="pygments-w">
</span> <requires profile="SelfInstall"/><span class="pygments-w">
</span> <requires profile="Kubic-kubeadm"/><span class="pygments-w">
</span> </profile><span class="pygments-w">
</span><span class="pygments-gi">+ <profile name="k3s-pve" description="MicroOS with k3s for Proxmox VE (pve)" arch="x86_64"></span><span class="pygments-w">
</span><span class="pygments-gi">+ <requires profile="pve"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <requires profile="k3s"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ </profile></span><span class="pygments-w">
</span> <profile name="k3s-kvm-and-xen" description="MicroOS with k3s for KVM and HVM Xen" arch="x86_64,aarch64"><span class="pygments-w">
</span> <requires profile="kvm-and-xen"/><span class="pygments-w">
</span> <requires profile="k3s"/><span class="pygments-w">
</span><span class="pygments-gu">@@ -144,6 +157,39 @@</span><span class="pygments-w">
</span> <requires profile="k3s"/><span class="pygments-w">
</span> </profile><span class="pygments-w">
</span> </profiles><span class="pygments-w">
</span><span class="pygments-gi">+ <preferences profiles="pve" arch="x86_64"></span><span class="pygments-w">
</span><span class="pygments-gi">+ <version>16.0.0</version></span><span class="pygments-w">
</span><span class="pygments-gi">+ <packagemanager>zypper</packagemanager></span><span class="pygments-w">
</span><span class="pygments-gi">+ <bootloader-theme>openSUSE</bootloader-theme></span><span class="pygments-w">
</span><span class="pygments-gi">+ <rpm-excludedocs>true</rpm-excludedocs></span><span class="pygments-w">
</span><span class="pygments-gi">+ <locale>en_US</locale></span><span class="pygments-w">
</span><span class="pygments-gi">+ <type</span><span class="pygments-w">
</span><span class="pygments-gi">+ image="vmx"</span><span class="pygments-w">
</span><span class="pygments-gi">+ filesystem="btrfs"</span><span class="pygments-w">
</span><span class="pygments-gi">+ format="qcow2"</span><span class="pygments-w">
</span><span class="pygments-gi">+ firmware="uefi"</span><span class="pygments-w">
</span><span class="pygments-gi">+ bootpartition="false"</span><span class="pygments-w">
</span><span class="pygments-gi">+ bootkernel="custom"</span><span class="pygments-w">
</span><span class="pygments-gi">+ devicepersistency="by-uuid"</span><span class="pygments-w">
</span><span class="pygments-gi">+ btrfs_root_is_snapshot="true"</span><span class="pygments-w">
</span><span class="pygments-gi">+ btrfs_root_is_readonly_snapshot="true"</span><span class="pygments-w">
</span><span class="pygments-gi">+ btrfs_quota_groups="true"</span><span class="pygments-w">
</span><span class="pygments-gi">+ spare_part="5G" spare_part_mountpoint="/var" spare_part_fs="btrfs" spare_part_is_last="true" spare_part_fs_attributes="no-copy-on-write"</span><span class="pygments-w">
</span><span class="pygments-gi">+ ></span><span class="pygments-w">
</span><span class="pygments-gi">+ <bootloader name="grub2" console="gfxterm" /></span><span class="pygments-w">
</span><span class="pygments-gi">+ <systemdisk></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="home"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="root"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="opt"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="srv"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="boot/grub2/i386-pc"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="boot/grub2/x86_64-efi" mountpoint="boot/grub2/x86_64-efi"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="boot/writable"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="usr/local"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ </systemdisk></span><span class="pygments-w">
</span><span class="pygments-gi">+ <size unit="G">20</size></span><span class="pygments-w">
</span><span class="pygments-gi">+ </type></span><span class="pygments-w">
</span><span class="pygments-gi">+ </preferences></span><span class="pygments-w">
</span> <preferences profiles="kvm-and-xen" arch="x86_64"><span class="pygments-w">
</span> <version>16.0.0</version><span class="pygments-w">
</span> <packagemanager>zypper</packagemanager><span class="pygments-w">
</span><span class="pygments-gu">@@ -720,6 +766,10 @@</span><span class="pygments-w">
</span> <package name="patterns-containers-kubic_loadbalancer"/><span class="pygments-w">
</span> <package name="patterns-containers-kubic_worker"/><span class="pygments-w">
</span> </packages><span class="pygments-w">
</span><span class="pygments-gi">+ <packages type="image" profiles="pve"></span><span class="pygments-w">
</span><span class="pygments-gi">+ <package name="qemu-guest-agent"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <package name="patterns-microos-cloud"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ </packages></span><span class="pygments-w">
</span> <packages type="image" profiles="kvm-and-xen"><span class="pygments-w">
</span> <!-- KVM and Xen specific packages --><span class="pygments-w">
</span> <package name="xen-tools-domU" arch="x86_64"/><span class="pygments-w">
</span>
</pre>
</div>
</div>
<div class="section" id="opensuse-tubmleweed-jeos">
<h2><a class="toc-backref" href="#toc-entry-5">openSUSE Tubmleweed JeOS</a></h2>
<div class="section" id="open-build-service-obs-project-1">
<h3><a class="toc-backref" href="#toc-entry-6">Open Build Service (OBS) Project</a></h3>
<p><a class="reference external" href="https://build.opensuse.org/package/show/home:wombelix:branches:Virtualization:Appliances:Images:openSUSE-Tumbleweed/kiwi-templates-JeOS">https://build.opensuse.org/package/show/home:wombelix:branches:Virtualization:Appliances:Images:openSUSE-Tumbleweed/kiwi-templates-JeOS</a></p>
</div>
<div class="section" id="download-1">
<h3><a class="toc-backref" href="#toc-entry-7">Download</a></h3>
<p>openSUSE Mirror (Automatic Build / Sync): <a class="reference external" href="https://download.opensuse.org/repositories/home:/wombelix:/branches:/Virtualization:/Appliances:/Images:/openSUSE-Tumbleweed/images/">https://download.opensuse.org/repositories/home:/wombelix:/branches:/Virtualization:/Appliances:/Images:/openSUSE-Tumbleweed/images/</a></p>
</div>
<div class="section" id="customizations-1">
<h3><a class="toc-backref" href="#toc-entry-8">Customizations</a></h3>
<p>Please be aware: The below diff should give you an idea about the changes, it will not be updated, please check the OBS Project for the latest revision</p>
<pre class="code diff literal-block">
<span class="pygments-gh">Index: JeOS.kiwi</span><span class="pygments-w">
</span><span class="pygments-gh">===================================================================</span><span class="pygments-w">
</span><span class="pygments-gd">--- JeOS.kiwi (revision 70)</span><span class="pygments-w">
</span><span class="pygments-gi">+++ JeOS.kiwi (revision 2)</span><span class="pygments-w">
</span><span class="pygments-gu">@@ -9,6 +9,7 @@</span><span class="pygments-w">
</span> <specification>openSUSE Tumbleweed JeOS</specification><span class="pygments-w">
</span> </description><span class="pygments-w">
</span> <profiles><span class="pygments-w">
</span><span class="pygments-gi">+ <profile name="pve" description="JeOS for Proxmox VE (pve)" arch="x86_64"/></span><span class="pygments-w">
</span> <!-- Those two are only used as deps --><span class="pygments-w">
</span> <profile name="kvm-and-xen" description="JeOS for KVM and Xen" arch="aarch64,x86_64"/><span class="pygments-w">
</span> <profile name="VMware" description="JeOS for VMware" arch="x86_64"/><span class="pygments-w">
</span><span class="pygments-gu">@@ -17,6 +18,39 @@</span><span class="pygments-w">
</span> <profile name="OpenStack-Cloud" description="JeOS for OpenStack Cloud" arch="x86_64"/><span class="pygments-w">
</span> <profile name="RaspberryPi" description="JeOS for the Raspberry Pi" arch="aarch64"/><span class="pygments-w">
</span> </profiles><span class="pygments-w">
</span><span class="pygments-gi">+ <preferences profiles="pve" arch="x86_64"></span><span class="pygments-w">
</span><span class="pygments-gi">+ <version>15.1.0</version></span><span class="pygments-w">
</span><span class="pygments-gi">+ <packagemanager>zypper</packagemanager></span><span class="pygments-w">
</span><span class="pygments-gi">+ <bootloader-theme>openSUSE</bootloader-theme></span><span class="pygments-w">
</span><span class="pygments-gi">+ <rpm-excludedocs>true</rpm-excludedocs></span><span class="pygments-w">
</span><span class="pygments-gi">+ <type</span><span class="pygments-w">
</span><span class="pygments-gi">+ image="vmx"</span><span class="pygments-w">
</span><span class="pygments-gi">+ filesystem="btrfs"</span><span class="pygments-w">
</span><span class="pygments-gi">+ format="qcow2"</span><span class="pygments-w">
</span><span class="pygments-gi">+ bootloader="grub2"</span><span class="pygments-w">
</span><span class="pygments-gi">+ firmware="uefi"</span><span class="pygments-w">
</span><span class="pygments-gi">+ efipartsize="33"</span><span class="pygments-w">
</span><span class="pygments-gi">+ kernelcmdline="rw quiet systemd.show_status=1 console=ttyS0,115200 console=tty0"</span><span class="pygments-w">
</span><span class="pygments-gi">+ bootpartition="false"</span><span class="pygments-w">
</span><span class="pygments-gi">+ bootkernel="custom"</span><span class="pygments-w">
</span><span class="pygments-gi">+ devicepersistency="by-uuid"</span><span class="pygments-w">
</span><span class="pygments-gi">+ btrfs_quota_groups="true"</span><span class="pygments-w">
</span><span class="pygments-gi">+ btrfs_root_is_snapshot="true"</span><span class="pygments-w">
</span><span class="pygments-gi">+ ></span><span class="pygments-w">
</span><span class="pygments-gi">+ <systemdisk></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="home"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="root"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="opt"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="srv"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="boot/grub2/i386-pc"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="boot/grub2/x86_64-efi" mountpoint="boot/grub2/x86_64-efi"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="usr/local"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="var" copy_on_write="false"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ </systemdisk></span><span class="pygments-w">
</span><span class="pygments-gi">+ <size unit="G">24</size></span><span class="pygments-w">
</span><span class="pygments-gi">+ </type></span><span class="pygments-w">
</span><span class="pygments-gi">+ </preferences></span><span class="pygments-w">
</span><span class="pygments-gi">+</span><span class="pygments-w">
</span> <preferences profiles="kvm-and-xen" arch="x86_64"><span class="pygments-w">
</span> <version>15.1.0</version><span class="pygments-w">
</span> <packagemanager>zypper</packagemanager><span class="pygments-w">
</span><span class="pygments-gu">@@ -284,6 +318,15 @@</span><span class="pygments-w">
</span> <package name="zypper-needs-restarting"/> <!-- Some deployment script use this (bsc#1173548) --><span class="pygments-w">
</span> </packages><span class="pygments-w">
</span><span class="pygments-gi">+ <packages type="image" profiles="pve"></span><span class="pygments-w">
</span><span class="pygments-gi">+ <package name="btrfsprogs"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <package name="btrfsmaintenance"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <package name="grub2-snapper-plugin"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <package name="snapper-zypp-plugin"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <package name="snapper"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <package name="firewalld"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ </packages></span><span class="pygments-w">
</span><span class="pygments-gi">+</span><span class="pygments-w">
</span> <!-- Not needed in OpenStack as it uses XFS and cloud-init --><span class="pygments-w">
</span> <packages type="image" profiles="kvm-and-xen,VMware,MS-HyperV,RaspberryPi"><span class="pygments-w">
</span> <!-- Only for btrfs --><span class="pygments-w">
</span><span class="pygments-gu">@@ -305,7 +348,7 @@</span><span class="pygments-w">
</span> <package name="firewalld"/><span class="pygments-w">
</span> </packages><span class="pygments-w">
</span><span class="pygments-gd">- <packages type="image" profiles="kvm-and-xen,VMware,MS-HyperV,OpenStack-Cloud"></span><span class="pygments-w">
</span><span class="pygments-gi">+ <packages type="image" profiles="kvm-and-xen,VMware,MS-HyperV,OpenStack-Cloud,pve"></span><span class="pygments-w">
</span> <!-- Shim for secure boot everywhere except for RPi --><span class="pygments-w">
</span> <package name="shim" arch="aarch64,x86_64"/><span class="pygments-w">
</span> </packages><span class="pygments-w">
</span><span class="pygments-gu">@@ -315,14 +358,14 @@</span><span class="pygments-w">
</span> <package name="xen-libs"/><span class="pygments-w">
</span> <package name="kernel-default-base"/><span class="pygments-w">
</span> </packages><span class="pygments-w">
</span><span class="pygments-gd">- <packages type="image" profiles="kvm-and-xen,OpenStack-Cloud"></span><span class="pygments-w">
</span><span class="pygments-gi">+ <packages type="image" profiles="kvm-and-xen,OpenStack-Cloud,pve"></span><span class="pygments-w">
</span> <package name="qemu-guest-agent"/><span class="pygments-w">
</span> </packages><span class="pygments-w">
</span> <packages type="image" profiles="VMware"><span class="pygments-w">
</span> <package name="open-vm-tools" arch="x86_64"/><span class="pygments-w">
</span> <package name="kernel-default-base"/><span class="pygments-w">
</span> </packages><span class="pygments-w">
</span><span class="pygments-gd">- <packages type="image" profiles="OpenStack-Cloud"></span><span class="pygments-w">
</span><span class="pygments-gi">+ <packages type="image" profiles="OpenStack-Cloud,pve"></span><span class="pygments-w">
</span> <package name="cloud-init"/><span class="pygments-w">
</span> <package name="cloud-init-config-suse" /><span class="pygments-w">
</span> <package name="xfsprogs"/><span class="pygments-w">
</span><span class="pygments-gu">@@ -360,7 +403,7 @@</span><span class="pygments-w">
</span> <package name="gzip"/><span class="pygments-w">
</span> </packages><span class="pygments-w">
</span><span class="pygments-gd">- <packages type="bootstrap" profiles="kvm-and-xen"></span><span class="pygments-w">
</span><span class="pygments-gi">+ <packages type="bootstrap" profiles="kvm-and-xen,pve"></span><span class="pygments-w">
</span> <package name="openSUSE-release-appliance-kvm"/><span class="pygments-w">
</span> </packages><span class="pygments-w">
</span> <packages type="bootstrap" profiles="OpenStack-Cloud"><span class="pygments-w">
</span><span class="pygments-gh">Index: _multibuild</span><span class="pygments-w">
</span><span class="pygments-gh">===================================================================</span><span class="pygments-w">
</span><span class="pygments-gd">--- _multibuild (revision 70)</span><span class="pygments-w">
</span><span class="pygments-gi">+++ _multibuild (revision 2)</span><span class="pygments-w">
</span><span class="pygments-gu">@@ -1,7 +1,10 @@</span><span class="pygments-w">
</span><multibuild><span class="pygments-w">
</span><span class="pygments-gi">+ <flavor>pve</flavor></span><span class="pygments-w">
</span><span class="pygments-gi">+ <!--</span><span class="pygments-w">
</span> <flavor>kvm-and-xen</flavor><span class="pygments-w">
</span> <flavor>VMware</flavor><span class="pygments-w">
</span> <flavor>MS-HyperV</flavor><span class="pygments-w">
</span> <flavor>OpenStack-Cloud</flavor><span class="pygments-w">
</span> <flavor>RaspberryPi</flavor><span class="pygments-w">
</span><span class="pygments-gi">+ --></span><span class="pygments-w">
</span></multibuild><span class="pygments-w">
</span>
</pre>
</div>
</div>
<div class="section" id="opensuse-leap-15-3-jeos">
<h2><a class="toc-backref" href="#toc-entry-9">openSUSE Leap 15.3 JeOS</a></h2>
<div class="section" id="open-build-service-obs-project-2">
<h3><a class="toc-backref" href="#toc-entry-10">Open Build Service (OBS) Project</a></h3>
<p><a class="reference external" href="https://build.opensuse.org/package/show/home:wombelix:branches:Virtualization:Appliances:Images:openSUSE-Leap-15.3/kiwi-templates-JeOS">https://build.opensuse.org/package/show/home:wombelix:branches:Virtualization:Appliances:Images:openSUSE-Leap-15.3/kiwi-templates-JeOS</a></p>
</div>
<div class="section" id="download-2">
<h3><a class="toc-backref" href="#toc-entry-11">Download</a></h3>
<p>openSUSE Mirror (Automatic Build / Sync): <a class="reference external" href="https://download.opensuse.org/repositories/home:/wombelix:/branches:/Virtualization:/Appliances:/Images:/openSUSE-Leap-15.3/images/">https://download.opensuse.org/repositories/home:/wombelix:/branches:/Virtualization:/Appliances:/Images:/openSUSE-Leap-15.3/images/</a></p>
</div>
<div class="section" id="customizations-2">
<h3><a class="toc-backref" href="#toc-entry-12">Customizations</a></h3>
<p>Please be aware: The below diff should give you an idea about the changes, it will not be updated, please check the OBS Project for the latest revision</p>
<pre class="code diff literal-block">
<span class="pygments-gh">Index: JeOS.kiwi</span><span class="pygments-w">
</span><span class="pygments-gh">===================================================================</span><span class="pygments-w">
</span><span class="pygments-gd">--- JeOS.kiwi (revision 13)</span><span class="pygments-w">
</span><span class="pygments-gi">+++ JeOS.kiwi (revision 3)</span><span class="pygments-w">
</span><span class="pygments-gu">@@ -9,6 +9,7 @@</span><span class="pygments-w">
</span> <specification>openSUSE Leap 15.3 JeOS</specification><span class="pygments-w">
</span> </description><span class="pygments-w">
</span> <profiles><span class="pygments-w">
</span><span class="pygments-gi">+ <profile name="pve" description="JeOS for Proxmox VE (pve)" arch="x86_64"/></span><span class="pygments-w">
</span> <profile name="kvm-and-xen" description="JeOS for KVM and Xen" arch="x86_64"/><span class="pygments-w">
</span> <profile name="kvm" description="JeOS for KVM" arch="aarch64"/><span class="pygments-w">
</span> <profile name="VMware" description="JeOS for VMware" arch="x86_64"/><span class="pygments-w">
</span><span class="pygments-gu">@@ -16,6 +17,47 @@</span><span class="pygments-w">
</span> <profile name="OpenStack-Cloud" description="JeOS for OpenStack Cloud" arch="x86_64"/><span class="pygments-w">
</span> <profile name="RaspberryPi" description="JeOS for the Raspberry Pi" arch="aarch64"/><span class="pygments-w">
</span> </profiles><span class="pygments-w">
</span><span class="pygments-gi">+ <preferences profiles="pve"></span><span class="pygments-w">
</span><span class="pygments-gi">+ <version>15.3</version></span><span class="pygments-w">
</span><span class="pygments-gi">+ <packagemanager>zypper</packagemanager></span><span class="pygments-w">
</span><span class="pygments-gi">+ <bootsplash-theme>openSUSE</bootsplash-theme></span><span class="pygments-w">
</span><span class="pygments-gi">+ <bootloader-theme>openSUSE</bootloader-theme></span><span class="pygments-w">
</span><span class="pygments-gi">+ <!-- those settings are applied by suseConfig in config.sh</span><span class="pygments-w">
</span><span class="pygments-gi">+ <locale>en_US</locale></span><span class="pygments-w">
</span><span class="pygments-gi">+ <keytable>us.map.gz</keytable></span><span class="pygments-w">
</span><span class="pygments-gi">+ <timezone>Europe/Berlin</timezone></span><span class="pygments-w">
</span><span class="pygments-gi">+ <hwclock>utc</hwclock></span><span class="pygments-w">
</span><span class="pygments-gi">+ --></span><span class="pygments-w">
</span><span class="pygments-gi">+ <rpm-excludedocs>true</rpm-excludedocs></span><span class="pygments-w">
</span><span class="pygments-gi">+ <type</span><span class="pygments-w">
</span><span class="pygments-gi">+ image="vmx"</span><span class="pygments-w">
</span><span class="pygments-gi">+ filesystem="btrfs"</span><span class="pygments-w">
</span><span class="pygments-gi">+ format="qcow2"</span><span class="pygments-w">
</span><span class="pygments-gi">+ bootloader="grub2"</span><span class="pygments-w">
</span><span class="pygments-gi">+ firmware="uefi"</span><span class="pygments-w">
</span><span class="pygments-gi">+ efipartsize="33"</span><span class="pygments-w">
</span><span class="pygments-gi">+ kernelcmdline="systemd.show_status=1 console=ttyS0,115200 console=tty0 quiet"</span><span class="pygments-w">
</span><span class="pygments-gi">+ bootpartition="false"</span><span class="pygments-w">
</span><span class="pygments-gi">+ bootkernel="custom"</span><span class="pygments-w">
</span><span class="pygments-gi">+ devicepersistency="by-uuid"</span><span class="pygments-w">
</span><span class="pygments-gi">+ btrfs_quota_groups="true"</span><span class="pygments-w">
</span><span class="pygments-gi">+ btrfs_root_is_snapshot="true"</span><span class="pygments-w">
</span><span class="pygments-gi">+ ></span><span class="pygments-w">
</span><span class="pygments-gi">+ <systemdisk></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="home"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="root"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="tmp"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="opt"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="srv"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="boot/grub2/i386-pc"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="boot/grub2/x86_64-efi" mountpoint="boot/grub2/x86_64-efi"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="usr/local"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="var" copy_on_write="false"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ </systemdisk></span><span class="pygments-w">
</span><span class="pygments-gi">+ <size unit="G">24</size></span><span class="pygments-w">
</span><span class="pygments-gi">+ </type></span><span class="pygments-w">
</span><span class="pygments-gi">+ </preferences></span><span class="pygments-w">
</span><span class="pygments-gi">+</span><span class="pygments-w">
</span> <preferences profiles="kvm-and-xen"><span class="pygments-w">
</span> <version>15.3</version><span class="pygments-w">
</span> <packagemanager>zypper</packagemanager><span class="pygments-w">
</span><span class="pygments-gu">@@ -296,10 +338,19 @@</span><span class="pygments-w">
</span> </packages><span class="pygments-w">
</span> <!-- Shim for secure boot everywhere except for RPi --><span class="pygments-w">
</span><span class="pygments-gd">- <packages type="image" profiles="kvm-and-xen,kvm,VMware,MS-HyperV,OpenStack-Cloud"></span><span class="pygments-w">
</span><span class="pygments-gi">+ <packages type="image" profiles="kvm-and-xen,kvm,VMware,MS-HyperV,OpenStack-Cloud,pve"></span><span class="pygments-w">
</span> <package name="shim" arch="aarch64,x86_64"/><span class="pygments-w">
</span> </packages><span class="pygments-w">
</span><span class="pygments-gi">+ <packages type="image" profiles="pve"></span><span class="pygments-w">
</span><span class="pygments-gi">+ <package name="btrfsprogs"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <package name="btrfsmaintenance"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <package name="grub2-snapper-plugin"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <package name="snapper-zypp-plugin"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <package name="snapper"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <package name="firewalld"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ </packages></span><span class="pygments-w">
</span><span class="pygments-gi">+</span><span class="pygments-w">
</span> <!-- Not needed in OpenStack as it uses XFS and cloud-init --><span class="pygments-w">
</span> <packages type="image" profiles="kvm-and-xen,kvm,VMware,MS-HyperV,RaspberryPi"><span class="pygments-w">
</span> <!-- Only for btrfs --><span class="pygments-w">
</span><span class="pygments-gu">@@ -322,17 +373,17 @@</span><span class="pygments-w">
</span> <package name="xen-tools-domU" arch="x86_64"/><span class="pygments-w">
</span> <package name="xen-libs" arch="x86_64"/><span class="pygments-w">
</span> </packages><span class="pygments-w">
</span><span class="pygments-gd">- <packages type="image" profiles="kvm-and-xen,kvm"></span><span class="pygments-w">
</span><span class="pygments-gi">+ <packages type="image" profiles="kvm-and-xen,kvm,pve"></span><span class="pygments-w">
</span> <package name="kernel-default-base"/><span class="pygments-w">
</span> </packages><span class="pygments-w">
</span><span class="pygments-gd">- <packages type="image" profiles="kvm-and-xen,kvm,OpenStack-Cloud"></span><span class="pygments-w">
</span><span class="pygments-gi">+ <packages type="image" profiles="kvm-and-xen,kvm,OpenStack-Cloud,pve"></span><span class="pygments-w">
</span> <package name="qemu-guest-agent"/><span class="pygments-w">
</span> </packages><span class="pygments-w">
</span> <packages type="image" profiles="VMware"><span class="pygments-w">
</span> <package name="open-vm-tools" arch="x86_64"/><span class="pygments-w">
</span> <package name="kernel-default-base"/><span class="pygments-w">
</span> </packages><span class="pygments-w">
</span><span class="pygments-gd">- <packages type="image" profiles="OpenStack-Cloud"></span><span class="pygments-w">
</span><span class="pygments-gi">+ <packages type="image" profiles="OpenStack-Cloud,pve"></span><span class="pygments-w">
</span> <package name="cloud-init" /><span class="pygments-w">
</span> <package name="cloud-init-config-suse" /><span class="pygments-w">
</span> <package name="xfsprogs" /><span class="pygments-w">
</span><span class="pygments-gu">@@ -363,7 +414,7 @@</span><span class="pygments-w">
</span> <package name="openSUSE-release"/><span class="pygments-w">
</span> </packages><span class="pygments-w">
</span><span class="pygments-gd">- <packages type="bootstrap" profiles="kvm,kvm-and-xen"></span><span class="pygments-w">
</span><span class="pygments-gi">+ <packages type="bootstrap" profiles="kvm,kvm-and-xen,pve"></span><span class="pygments-w">
</span> <package name="openSUSE-release-appliance-kvm"/><span class="pygments-w">
</span> </packages><span class="pygments-w">
</span> <packages type="bootstrap" profiles="OpenStack-Cloud"><span class="pygments-w">
</span><span class="pygments-gh">Index: _multibuild</span><span class="pygments-w">
</span><span class="pygments-gh">===================================================================</span><span class="pygments-w">
</span><span class="pygments-gd">--- _multibuild (revision 13)</span><span class="pygments-w">
</span><span class="pygments-gi">+++ _multibuild (revision 3)</span><span class="pygments-w">
</span><span class="pygments-gu">@@ -1,8 +1,11 @@</span><span class="pygments-w">
</span><multibuild><span class="pygments-w">
</span><span class="pygments-gi">+ <flavor>pve</flavor></span><span class="pygments-w">
</span><span class="pygments-gi">+ <!--</span><span class="pygments-w">
</span> <flavor>kvm-and-xen</flavor><span class="pygments-w">
</span> <flavor>kvm</flavor><span class="pygments-w">
</span> <flavor>VMware</flavor><span class="pygments-w">
</span> <flavor>MS-HyperV</flavor><span class="pygments-w">
</span> <flavor>OpenStack-Cloud</flavor><span class="pygments-w">
</span> <flavor>RaspberryPi</flavor><span class="pygments-w">
</span><span class="pygments-gi">+ --></span><span class="pygments-w">
</span></multibuild><span class="pygments-w">
</span>
</pre>
</div>
</div>
<div class="section" id="opensuse-leap-15-4-jeos">
<h2><a class="toc-backref" href="#toc-entry-13">openSUSE Leap 15.4 JeOS</a></h2>
<div class="section" id="open-build-service-obs-project-3">
<h3><a class="toc-backref" href="#toc-entry-14">Open Build Service (OBS) Project</a></h3>
<p><a class="reference external" href="https://build.opensuse.org/package/show/home:wombelix:branches:Virtualization:Appliances:Images:openSUSE-Leap-15.4/kiwi-templates-JeOS">https://build.opensuse.org/package/show/home:wombelix:branches:Virtualization:Appliances:Images:openSUSE-Leap-15.4/kiwi-templates-JeOS</a></p>
</div>
<div class="section" id="download-3">
<h3><a class="toc-backref" href="#toc-entry-15">Download</a></h3>
<p>openSUSE Mirror (Automatic Build / Sync): <a class="reference external" href="https://download.opensuse.org/repositories/home:/wombelix:/branches:/Virtualization:/Appliances:/Images:/openSUSE-Leap-15.4/images/">https://download.opensuse.org/repositories/home:/wombelix:/branches:/Virtualization:/Appliances:/Images:/openSUSE-Leap-15.4/images/</a></p>
</div>
<div class="section" id="customizations-3">
<h3><a class="toc-backref" href="#toc-entry-16">Customizations</a></h3>
<p>Please be aware: The below diff should give you an idea about the changes, it will not be updated, please check the OBS Project for the latest revision</p>
<pre class="code diff literal-block">
<span class="pygments-gh">Index: JeOS.kiwi</span><span class="pygments-w">
</span><span class="pygments-gh">===================================================================</span><span class="pygments-w">
</span><span class="pygments-gd">--- JeOS.kiwi (revision 2)</span><span class="pygments-w">
</span><span class="pygments-gi">+++ JeOS.kiwi (revision 3)</span><span class="pygments-w">
</span><span class="pygments-gu">@@ -9,6 +9,7 @@</span><span class="pygments-w">
</span> <specification>openSUSE Leap 15.4 JeOS</specification><span class="pygments-w">
</span> </description><span class="pygments-w">
</span> <profiles><span class="pygments-w">
</span><span class="pygments-gi">+ <profile name="pve" description="JeOS for Proxmox VE (pve)" arch="x86_64"/></span><span class="pygments-w">
</span> <profile name="kvm-and-xen" description="JeOS for KVM and Xen" arch="x86_64"/><span class="pygments-w">
</span> <profile name="kvm" description="JeOS for KVM" arch="aarch64"/><span class="pygments-w">
</span> <profile name="VMware" description="JeOS for VMware" arch="x86_64"/><span class="pygments-w">
</span><span class="pygments-gu">@@ -16,6 +17,47 @@</span><span class="pygments-w">
</span> <profile name="OpenStack-Cloud" description="JeOS for OpenStack Cloud" arch="x86_64"/><span class="pygments-w">
</span> <profile name="RaspberryPi" description="JeOS for the Raspberry Pi" arch="aarch64"/><span class="pygments-w">
</span> </profiles><span class="pygments-w">
</span><span class="pygments-gi">+ <preferences profiles="pve"></span><span class="pygments-w">
</span><span class="pygments-gi">+ <version>15.4</version></span><span class="pygments-w">
</span><span class="pygments-gi">+ <packagemanager>zypper</packagemanager></span><span class="pygments-w">
</span><span class="pygments-gi">+ <bootsplash-theme>openSUSE</bootsplash-theme></span><span class="pygments-w">
</span><span class="pygments-gi">+ <bootloader-theme>openSUSE</bootloader-theme></span><span class="pygments-w">
</span><span class="pygments-gi">+ <!-- those settings are applied by suseConfig in config.sh</span><span class="pygments-w">
</span><span class="pygments-gi">+ <locale>en_US</locale></span><span class="pygments-w">
</span><span class="pygments-gi">+ <keytable>us.map.gz</keytable></span><span class="pygments-w">
</span><span class="pygments-gi">+ <timezone>Europe/Berlin</timezone></span><span class="pygments-w">
</span><span class="pygments-gi">+ <hwclock>utc</hwclock></span><span class="pygments-w">
</span><span class="pygments-gi">+ --></span><span class="pygments-w">
</span><span class="pygments-gi">+ <rpm-excludedocs>true</rpm-excludedocs></span><span class="pygments-w">
</span><span class="pygments-gi">+ <type</span><span class="pygments-w">
</span><span class="pygments-gi">+ image="vmx"</span><span class="pygments-w">
</span><span class="pygments-gi">+ filesystem="btrfs"</span><span class="pygments-w">
</span><span class="pygments-gi">+ format="qcow2"</span><span class="pygments-w">
</span><span class="pygments-gi">+ bootloader="grub2"</span><span class="pygments-w">
</span><span class="pygments-gi">+ firmware="uefi"</span><span class="pygments-w">
</span><span class="pygments-gi">+ efipartsize="33"</span><span class="pygments-w">
</span><span class="pygments-gi">+ kernelcmdline="rw systemd.show_status=1 console=ttyS0,115200 console=tty0 quiet"</span><span class="pygments-w">
</span><span class="pygments-gi">+ bootpartition="false"</span><span class="pygments-w">
</span><span class="pygments-gi">+ bootkernel="custom"</span><span class="pygments-w">
</span><span class="pygments-gi">+ devicepersistency="by-uuid"</span><span class="pygments-w">
</span><span class="pygments-gi">+ btrfs_quota_groups="true"</span><span class="pygments-w">
</span><span class="pygments-gi">+ btrfs_root_is_snapshot="true"</span><span class="pygments-w">
</span><span class="pygments-gi">+ ></span><span class="pygments-w">
</span><span class="pygments-gi">+ <systemdisk></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="home"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="root"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="tmp"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="opt"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="srv"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="boot/grub2/i386-pc"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="boot/grub2/x86_64-efi" mountpoint="boot/grub2/x86_64-efi"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="usr/local"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <volume name="var" copy_on_write="false"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ </systemdisk></span><span class="pygments-w">
</span><span class="pygments-gi">+ <size unit="G">24</size></span><span class="pygments-w">
</span><span class="pygments-gi">+ </type></span><span class="pygments-w">
</span><span class="pygments-gi">+ </preferences></span><span class="pygments-w">
</span><span class="pygments-gi">+</span><span class="pygments-w">
</span> <preferences profiles="kvm-and-xen"><span class="pygments-w">
</span> <version>15.4</version><span class="pygments-w">
</span> <packagemanager>zypper</packagemanager><span class="pygments-w">
</span><span class="pygments-gu">@@ -298,10 +340,19 @@</span><span class="pygments-w">
</span> </packages><span class="pygments-w">
</span> <!-- Shim for secure boot everywhere except for RPi --><span class="pygments-w">
</span><span class="pygments-gd">- <packages type="image" profiles="kvm-and-xen,kvm,VMware,MS-HyperV,OpenStack-Cloud"></span><span class="pygments-w">
</span><span class="pygments-gi">+ <packages type="image" profiles="kvm-and-xen,kvm,VMware,MS-HyperV,OpenStack-Cloud,pve"></span><span class="pygments-w">
</span> <package name="shim" arch="aarch64,x86_64"/><span class="pygments-w">
</span> </packages><span class="pygments-w">
</span><span class="pygments-gi">+ <packages type="image" profiles="pve"></span><span class="pygments-w">
</span><span class="pygments-gi">+ <package name="btrfsprogs"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <package name="btrfsmaintenance"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <package name="grub2-snapper-plugin"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <package name="snapper-zypp-plugin"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <package name="snapper"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ <package name="firewalld"/></span><span class="pygments-w">
</span><span class="pygments-gi">+ </packages></span><span class="pygments-w">
</span><span class="pygments-gi">+</span><span class="pygments-w">
</span> <!-- Not needed in OpenStack as it uses XFS and cloud-init --><span class="pygments-w">
</span> <packages type="image" profiles="kvm-and-xen,kvm,VMware,MS-HyperV,RaspberryPi"><span class="pygments-w">
</span> <!-- Only for btrfs --><span class="pygments-w">
</span><span class="pygments-gu">@@ -324,17 +375,17 @@</span><span class="pygments-w">
</span> <package name="xen-tools-domU" arch="x86_64"/><span class="pygments-w">
</span> <package name="xen-libs" arch="x86_64"/><span class="pygments-w">
</span> </packages><span class="pygments-w">
</span><span class="pygments-gd">- <packages type="image" profiles="kvm-and-xen,kvm"></span><span class="pygments-w">
</span><span class="pygments-gi">+ <packages type="image" profiles="kvm-and-xen,kvm,pve"></span><span class="pygments-w">
</span> <package name="kernel-default-base"/><span class="pygments-w">
</span> </packages><span class="pygments-w">
</span><span class="pygments-gd">- <packages type="image" profiles="kvm-and-xen,kvm,OpenStack-Cloud"></span><span class="pygments-w">
</span><span class="pygments-gi">+ <packages type="image" profiles="kvm-and-xen,kvm,OpenStack-Cloud,pve"></span><span class="pygments-w">
</span> <package name="qemu-guest-agent"/><span class="pygments-w">
</span> </packages><span class="pygments-w">
</span> <packages type="image" profiles="VMware"><span class="pygments-w">
</span> <package name="open-vm-tools" arch="x86_64"/><span class="pygments-w">
</span> <package name="kernel-default-base"/><span class="pygments-w">
</span> </packages><span class="pygments-w">
</span><span class="pygments-gd">- <packages type="image" profiles="OpenStack-Cloud"></span><span class="pygments-w">
</span><span class="pygments-gi">+ <packages type="image" profiles="OpenStack-Cloud,pve"></span><span class="pygments-w">
</span> <package name="cloud-init" /><span class="pygments-w">
</span> <package name="cloud-init-config-suse" /><span class="pygments-w">
</span> <package name="xfsprogs" /><span class="pygments-w">
</span><span class="pygments-gu">@@ -365,7 +416,7 @@</span><span class="pygments-w">
</span> <package name="openSUSE-release"/><span class="pygments-w">
</span> </packages><span class="pygments-w">
</span><span class="pygments-gd">- <packages type="bootstrap" profiles="kvm,kvm-and-xen"></span><span class="pygments-w">
</span><span class="pygments-gi">+ <packages type="bootstrap" profiles="kvm,kvm-and-xen,pve"></span><span class="pygments-w">
</span> <package name="openSUSE-release-appliance-kvm"/><span class="pygments-w">
</span> </packages><span class="pygments-w">
</span> <packages type="bootstrap" profiles="OpenStack-Cloud"><span class="pygments-w">
</span><span class="pygments-gh">Index: _multibuild</span><span class="pygments-w">
</span><span class="pygments-gh">===================================================================</span><span class="pygments-w">
</span><span class="pygments-gd">--- _multibuild (revision 2)</span><span class="pygments-w">
</span><span class="pygments-gi">+++ _multibuild (revision 3)</span><span class="pygments-w">
</span><span class="pygments-gu">@@ -1,8 +1,11 @@</span><span class="pygments-w">
</span><multibuild><span class="pygments-w">
</span><span class="pygments-gi">+ <flavor>pve</flavor></span><span class="pygments-w">
</span><span class="pygments-gi">+ <!--</span><span class="pygments-w">
</span> <flavor>kvm-and-xen</flavor><span class="pygments-w">
</span> <flavor>kvm</flavor><span class="pygments-w">
</span> <flavor>VMware</flavor><span class="pygments-w">
</span> <flavor>MS-HyperV</flavor><span class="pygments-w">
</span> <flavor>OpenStack-Cloud</flavor><span class="pygments-w">
</span> <flavor>RaspberryPi</flavor><span class="pygments-w">
</span><span class="pygments-gi">+ --></span><span class="pygments-w">
</span></multibuild><span class="pygments-w">
</span>
</pre>
<p>Getting started with OBS took a while but then it's really amazing how easy it is to branch existing
packages, doesn't matter if it's classic rpm, vm or container images, apply changes and get results.</p>
</div>
</div>
Import 'protective MBR' GPT disk images like SUSE or openSUSE to LVM-Thin with disabled zeroing cause corruption2022-04-14T00:00:00+02:002022-04-15T00:00:00+02:00Dominik Wombachertag:dominik.wombacher.cc,2022-04-14:/posts/import_protective-mbr_gpt_disk_images_like_suse_or_opensuse_to_lvm-thin_with_disabled_zeroing_cause_corruption.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Any available SUSE and openSUSE KVM Image I tried, ended in a VM that stuck on boot
with the message "a start job is running for /dev/disk/by-uuid"
or ... <a class="read-more" href="/posts/import_protective-mbr_gpt_disk_images_like_suse_or_opensuse_to_lvm-thin_with_disabled_zeroing_cause_corruption.html"> [read more]</a></p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Any available SUSE and openSUSE KVM Image I tried, ended in a VM that stuck on boot
with the message "a start job is running for /dev/disk/by-uuid"
or dropped into the dracut emergency shell after a timeout.</p>
<p>No partitions could be found, only "/dev/sda" was visible from inside the VM,
gdisk dropped a lot of warnings and errors as well:</p>
<pre class="code text literal-block">
Caution! After loading partitions, the CRC doesn't check out!
Warning! Main and backup partition tables differ! Use the 'c' and 'e' options
on the recovery & transformation menu to examine the two tables.
Warning! One or more CRCs don't match. You should repair the disk!
Main header: OK
Backup header: OK
Main partition table: ERROR
Backup partition table: ERROR
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: damaged
****************************************************************************
Caution: Found protective or hybrid MBR and corrupt GPT. Using GPT, but disk
verification and recovery are STRONGLY recommended.
****************************************************************************
Warning! Secondary partition table overlaps the last partition by
18315034227491254276 blocks!
You will need to delete this partition or resize it in another utility.
</pre>
<p>I tried it on a Proxmox VE Host with a LVM-Thin Datastore, a closer look at the
LVM-Thin Device of one of the affected VMs confirmed the missing partitions:</p>
<pre class="code text literal-block">
fdisk -l /dev/mapper/pve-vm--9181--disk--0
Disk /dev/mapper/pve-vm--9181--disk--0: 24 GiB, 25769803776 bytes, 50331648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 524288 bytes / 524288 bytes
Disklabel type: dos
Disk identifier: 0x406b6f28
Device Boot Start End Sectors Size Id Type
/dev/mapper/pve-vm--9181--disk--0-part1 1 50331647 50331647 24G ee GPT
Partition 1 does not start on physical sector boundary.
</pre>
<p>I chased that issue down for weeks and almost gave up because I didn't found any clue,
it just felt like no one ever faced a similar issue before.
After lot of different tests on multiple systems and configurations,
my LVM-Thin Storage seemed to cause the issue and by accident I finally found a hint in the
<a class="reference external" href="https://forum.proxmox.com/threads/corrupt-gpt-after-restore-on-pve-7-0-from-backup-on-pve-6-4-qemu-vm-lvm-thin-storage-ovmf.94785/">Proxmox Forum</a>
(Archive: <a class="reference external" href="https://web.archive.org/web/20220414194037/https://forum.proxmox.com/threads/corrupt-gpt-after-restore-on-pve-7-0-from-backup-on-pve-6-4-qemu-vm-lvm-thin-storage-ovmf.94785/">[1]</a>,
<a class="reference external" href="https://archive.today/2022.04.14-194050/https://forum.proxmox.com/threads/corrupt-gpt-after-restore-on-pve-7-0-from-backup-on-pve-6-4-qemu-vm-lvm-thin-storage-ovmf.94785/">[2]</a>).</p>
<p>Indeed, no Idea why but I disabled zeroing on the LV during conversion to Thin:</p>
<pre class="code text literal-block">
lvconvert --type thin-pool pve/lv_test -Zn -y
</pre>
<p>The official <a class="reference external" href="https://pve.proxmox.com/wiki/Storage:_LVM_Thin">Proxmox Documentation</a>
(Archive: <a class="reference external" href="https://web.archive.org/web/20220312200416/https://pve.proxmox.com/wiki/Storage:_LVM_Thin">[1]</a>,
<a class="reference external" href="https://archive.today/2022.04.14-194733/https://pve.proxmox.com/wiki/LVM2">[2]</a>)
doesn't mention the Parameter <code>-Zn</code>, obviously because of very good reasons.</p>
<p>Tests with a new LVM-Thin with enabled zeroing (default) confirmed that all issues I faced earlier seem to be caused by that.
A new VM based on the same <code>qcow2</code> image as before is now starting without any issue,
delay or timeout, just as expected, also the partition table looks way better:</p>
<pre class="code text literal-block">
fdisk -l /dev/mapper/pve-vm--9181--disk--0
Disk /dev/mapper/pve-vm--9181--disk--0: 24 GiB, 25769803776 bytes, 50331648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 65536 bytes / 65536 bytes
Disklabel type: gpt
Disk identifier: 0D13903E-0408-4963-9C0D-A455B37C6062
Device Start End Sectors Size Type
/dev/mapper/pve-vm--9181--disk--0-part1 2048 6143 4096 2M BIOS boot
/dev/mapper/pve-vm--9181--disk--0-part2 6144 73727 67584 33M EFI System
/dev/mapper/pve-vm--9181--disk--0-part3 73728 50331614 50257887 24G Linux filesystem
</pre>
<p>I installed some VMs "normally" by booting a .iso files, also importing qcow2 images with a "flat" / "oldschool" Partition Layout,
like the Rocky Linux Generic Cloud Image, which comes with a single XFS formatted MBR Partition, was working without the above problems.</p>
<p>So it looks like that's something specific to disk images with 'protective MBR' GPT and EFI Partitions.
So far only SUSE and openSUSE Images seem to use such a Layout by default.</p>
<p>To be perfectly honest, I didn't have a fully technical explanation why disabled zeroing on LVM-Thin
has such an impact when importing PMBR disks. I can only assume that during the LV creation and <code>qcow2</code>
import as well as conversion to <code>raw</code> there is some messing around with the first few sectors.</p>
<p>Fact is: I enabled zeroing on the LVM-Thin LV, everything got back to normal and the pre-build images behave now as they are supposed to.</p>
Provide outgoing IPv4 connectivity to Docker Container on a IPv6-only Host via clatd (464xlat)2022-04-10T00:00:00+02:002022-04-10T00:00:00+02:00Dominik Wombachertag:dominik.wombacher.cc,2022-04-10:/posts/provide_outgoing_ipv4_connectivity_for_docker_container_on_a_ipv6-only_host_via_clatd_464xlat.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>My experiences are based on a recent <a class="reference external" href="https://goharbor.io">Harbor</a>
setup on <a class="reference external" href="https://rockylinux.org">Rocky Linux</a>, but should be easily
transferable to any other Application and Linux Distribution.</p>
<p>The journey began after Harbor was ... <a class="read-more" href="/posts/provide_outgoing_ipv4_connectivity_for_docker_container_on_a_ipv6-only_host_via_clatd_464xlat.html"> [read more]</a></p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>My experiences are based on a recent <a class="reference external" href="https://goharbor.io">Harbor</a>
setup on <a class="reference external" href="https://rockylinux.org">Rocky Linux</a>, but should be easily
transferable to any other Application and Linux Distribution.</p>
<p>The journey began after Harbor was up and running and the vulnerability Scanner Trivy,
used to Scan pushed Images, failed to get it's updates from a IPv4-only address.</p>
<p>So the goal was to get outgoing IPv4 working, incoming traffic is handled by a HAProxy and not further described.</p>
<p>Some background about the Infrastructure:
The Proxmox VE Server that host the VM has public IPv4 and IPv6 connectivity,
is running radvd to advertise a /64 prefix to a bridge interface,
Bind / Named to provide DNS64 and Tayga for NAT64.</p>
<p>This Setup allows the VM to automatically configure IPv6 via SLAAC
and also talk to IPv4 targets, e.g. github.com, out of the box.
DNS Resolution is done by Bind with enabled DNS64 option on the Proxmox Host,
which also act as Gateway for the VM.</p>
<p>If no AAAA Record is available for a site, Bind will return one where the IPv4 address is embedded in a IPv6 address.
In my setup I defined <code>64:ff9b::/96</code> for that purpose, example result for github.com (IPv4: 140.82.121.4):</p>
<pre class="code text literal-block">
dig github.com aaaa +short
64:ff9b::8c52:7903
</pre>
<p>Tayga, running on the Proxmox Host, will receive this IPv6 traffic from the VM and perform NAT64,
viola github.com is accessible from the IPv6-only VM. More about that setup in a earlier
<a class="reference external" href="https://dominik.wombacher.cc/posts/proxmox_and_nat64_jool_seems_incompatible_with_pve_firewall_tayga_to_rescue.html">Post</a>.</p>
<pre class="code text literal-block">
--------------------- --------------------------
| Proxmox Host | | Virtual Machine |
| | | |
| public IPv4 /32 | | IPv6 only, SLAAC |
Internet ---- | public IPv6 /64 | ---- bridge ---- | Resolver: Proxmox Host |
| radvd > vmbr0 | | Gateway: Proxmox Host |
| Bind DNS64 | --------------------------
| Tayga NAT64 |
---------------------
Internet <> eth0 <> vmbr0 <> <> eth0
</pre>
<p>If you put Docker into the mix, things getting complicated due to the fact that everything was build with IPv4 in mind.</p>
<p>Even though there is some sort of IPv6 Support in the meantime, it's not really usable in my opinion.
You can achieve that Docker assigns a IPv6 from a given Prefix (recommend: /80) to each Container.
But that need to be configured in <code>/etc/docker/daemon.json</code> for the default network
and separately via cli or docker-compose for every custom network.</p>
<p>It's a random public reachable IP address and all ports will exposed, independent of the Container configuration.
Also managing DNS Records for those random generated, not predictable Container IPs, is nearly impossible
and SLAAC or at least DHCPv6 is not supported at all.</p>
<p>Apropos DNS, Docker embedded DNS, which is enabled on Custom Networks and can't be disabled, only support IPv4.
So as soon you work with custom networks, which is quite common with Docker Compose, you have to set it globally via
<code>/etc/docker/daemon.json</code>, which is only a good idea if all you container going to use IPv6 or alternatively
manually overwrite <code>/etc/resolv.conf</code> inside the specific Container, e.g. by read-only mount a file,
to get name resolution working.</p>
<p>Also you can't disable IPv4, so your Container will always get a (private) IPv4 in addition to the public IPv6 address.
That means on a IPv6 only Host, NAT64 as described above doesn't work and connecting to IPv4 only targets like github.com will fail.</p>
<p>You can use <a class="reference external" href="https://github.com/robbertkl/docker-ipv6nat">ipv6nat</a> to get rid of some of the earlier mentioned limitations,
but this doesn't solve the IPv4 connectivity problem and still requires to setup IPv6 prefixes manually for every docket network.</p>
<p>After investing quite some time in IPv6 and Docker I came to the conclusion to stay away from it,
at least until embedded DNS support IPv6 and disabling IPv4 is possible.</p>
<p>I decided to run Docker just as ever, with NAT and private IP4 addresses assigned to each container.
To provide the necessary Translation from IPv4 > IPv6 I use <a class="reference external" href="https://github.com/toreanderson/clatd">clatd</a>,
which use Tayga under the hood and performs the heavy lifting for your.</p>
<pre class="code text literal-block">
--------------------- -------------------------- ------------------------
| Proxmox Host | | Virtual Machine | | Docker Container |
| | | | | |
| public IPv4 /32 | | IPv6 only, SLAAC | | Private IPv4 address |
Internet ---- | public IPv6 /64 | ---- bridge ---- | Resolver: Proxmox Host | ---- bridge ---- | Resolve: Public DNS |
| radvd > vmbr0 | | Gateway: Proxmox Host | | Gateway: VM |
| Bind DNS64 | | clatd (464xlat) | ------------------------
| Tayga NAT64 | --------------------------
---------------------
IPv4 Container
--------------
Internet <> eth0 <> vmbr0 <> <> eth0 <> clat <> <> docker0 <> <> eth0
IPv4 IPv6 IPv6 IPv4 IPv4 IPv4
</pre>
<p>A quick look on the setup, focused on the clatd related parts, assumption that docker is already up and running.
Probably the most important is to allow masquerade in the public firewalld zone, otherwise the packages will silently dropped.</p>
<pre class="code bash literal-block">
<span class="pygments-c1"># Allow masquerade to avoid silent package drop
</span>sudo<span class="pygments-w"> </span>firewall-cmd<span class="pygments-w"> </span>--zone<span class="pygments-o">=</span>public<span class="pygments-w"> </span>--add-masquerade<span class="pygments-w"> </span>--permanent<span class="pygments-w">
</span>sudo<span class="pygments-w"> </span>firewall-cmd<span class="pygments-w"> </span>--reload<span class="pygments-w">
</span><span class="pygments-c1"># Install EPEL Repositories, required for clatd and tayga
</span>sudo<span class="pygments-w"> </span>nf<span class="pygments-w"> </span>config-manager<span class="pygments-w"> </span>--set-enabled<span class="pygments-w"> </span>powertools<span class="pygments-w">
</span>sudo<span class="pygments-w"> </span>dnf<span class="pygments-w"> </span>install<span class="pygments-w"> </span>epel-release<span class="pygments-w">
</span>sudo<span class="pygments-w"> </span>dnf<span class="pygments-w"> </span>install<span class="pygments-w"> </span>make<span class="pygments-w"> </span>git<span class="pygments-w"> </span>tar<span class="pygments-w">
</span><span class="pygments-c1"># Download and install clatd
</span><span class="pygments-nb">cd</span><span class="pygments-w"> </span>~<span class="pygments-w">
</span>git<span class="pygments-w"> </span>clone<span class="pygments-w"> </span>https://github.com/toreanderson/clatd<span class="pygments-w">
</span>sudo<span class="pygments-w"> </span>make<span class="pygments-w"> </span>-C<span class="pygments-w"> </span>clatd<span class="pygments-w"> </span>install<span class="pygments-w"> </span>installdeps<span class="pygments-w">
</span>sudo<span class="pygments-w"> </span>systemctl<span class="pygments-w"> </span><span class="pygments-nb">enable</span><span class="pygments-w"> </span>--now<span class="pygments-w"> </span>clatd<span class="pygments-w">
</span><span class="pygments-c1"># Configure global IPv4 DNS Server, used by all Container
# Privacy friendly Server by Freifunk München https://ffmuc.net/wiki/doku.php?id=knb:dohdot
</span>/etc/docker/daemon.json<span class="pygments-w">
</span><span class="pygments-sb">```</span><span class="pygments-w">
</span><span class="pygments-o">{</span><span class="pygments-w">
</span><span class="pygments-s2">"dns"</span><span class="pygments-w"> </span>:<span class="pygments-w"> </span><span class="pygments-o">[</span><span class="pygments-w"> </span><span class="pygments-s2">"5.1.66.255"</span>,<span class="pygments-w"> </span><span class="pygments-s2">"185.150.99.255"</span><span class="pygments-w"> </span><span class="pygments-o">]</span><span class="pygments-w">
</span><span class="pygments-o">}</span><span class="pygments-w">
</span><span class="pygments-sb">```</span><span class="pygments-w">
</span>sudo<span class="pygments-w"> </span>systemctl<span class="pygments-w"> </span>restart<span class="pygments-w"> </span>docker<span class="pygments-w">
</span>
</pre>
<p>Drawback: That way Container will _not_ be able to reach IPv6-only Systems, the target need to be reachable via IPv4.</p>
<p>At least in my case that's acceptable, main goal is to ensure Trivy can download updates, if you need outgoing IPv6,
you have to go either with <a class="reference external" href="https://github.com/robbertkl/docker-ipv6nat">ipv6nat</a> or the docker build-in IPv6 feature.</p>
<p>There seem to be no perfect one-size-fits-all Solution, so as often in IT, you have to pick the right tool for the job.</p>
sshd error - Bind to port failed: Cannot assign requested address2022-03-02T00:00:00+01:002022-03-02T00:00:00+01:00Dominik Wombachertag:dominik.wombacher.cc,2022-03-02:/posts/sshd_error_bind_to_port_failed_cannot_assign_requested_address.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>I faced a very weird issue today, sshd failed to start on boot because <em>ListenAddress</em> was set
but <em>network.target</em> doesn't mean IP addresses are already assigned and ready. So ... <a class="read-more" href="/posts/sshd_error_bind_to_port_failed_cannot_assign_requested_address.html"> [read more]</a></p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>I faced a very weird issue today, sshd failed to start on boot because <em>ListenAddress</em> was set
but <em>network.target</em> doesn't mean IP addresses are already assigned and ready. So the configured
IP isn't available, therefore sshd can't bind a Port and failed with <em>fatal: Cannot bind any address</em>.</p>
<p>I thought this can be fixed by adjusting the sshd systemd unit, everything I found online also pointed
into that direction, for example a <a class="reference external" href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=982950">Debian</a>
(Archive: <a class="reference external" href="https://web.archive.org/web/20220302224510/https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=982950">[1]</a>,
<a class="reference external" href="https://archive.today/2022.03.02-224450/https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=982950">[2]</a>)
and <a class="reference external" href="https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/216847/">Ubuntu</a>
(Archive: <a class="reference external" href="https://web.archive.org/web/20210901133033/https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/216847/">[1]</a>,
<a class="reference external" href="https://archive.today/2022.03.02-224617/https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/216847/">[2]</a>) Bug report.</p>
<pre class="code text literal-block">
/etc/systemd/system/ssh.service.d/override.conf
[Unit]
After=network-online.target auditd.service
</pre>
<p>The above systemd override seem to be one of the popular solutions which works for a lot of people.
Unfortunately none of the various After/Wants combinations worked in my case on Debian 11.</p>
<p>I had to go with the workaround to allow system wide port binding to not (yet) assigned IP addresses
by adjusting two sysctl values as described on <a class="reference external" href="https://serverfault.com/a/941426">serverfault</a>
(Archive: <a class="reference external" href="https://web.archive.org/web/20220302224659/https://serverfault.com/questions/941421/servers-fail-to-bind-to-addresses-at-boot/941426">[1]</a>,
<a class="reference external" href="https://archive.today/2022.03.02-224737/https://serverfault.com/questions/941421/servers-fail-to-bind-to-addresses-at-boot/941426%23941426">[2]</a>).</p>
<pre class="code text literal-block">
net.ipv4.ip_nonlocal_bind=1
net.ipv6.ip_nonlocal_bind=1
</pre>
<p>Probably not the most elegant solution but it's working and due to the fact that multiple IP addresses are
assigned to the Server, I have to specify on which the SSH Daemon is listening and can't just let em bind to all.</p>
Certified Specialist in Performance Tuning - Hardest Red Hat Exam2021-10-22T00:00:00+02:002021-10-22T00:00:00+02:00Dominik Wombachertag:dominik.wombacher.cc,2021-10-22:/posts/certified-specialist-in-performance-tuning-hardest-red-hat-exam.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>I took five Red Hat Exams within the last six months and have to say, the by far
hardest one was EX442 (Certified Specialist in Performance Tuning).
Despite a lot ... <a class="read-more" href="/posts/certified-specialist-in-performance-tuning-hardest-red-hat-exam.html"> [read more]</a></p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>I took five Red Hat Exams within the last six months and have to say, the by far
hardest one was EX442 (Certified Specialist in Performance Tuning).
Despite a lot of experience with Linux Systems and intensive preparation,
I wasn't able to pass the Exam.</p>
<p>The areas "Using utilities to monitor system and application behavior" and
"Configuring PCP monitoring" were most challenging and caused me to fail.</p>
<p>I used the <em>A Cloud Guru</em> Course to prepare, which I didn't found much helpful to be honest.
Experience was quite similar is during my preparation for the
<a class="reference external" href="https://dominik.wombacher.cc/posts/red-hat-certified-specialist-in-linux_diagnostics_and_troubleshooting.html">"Red Hat Certified Specialist in Linux Diagnostics and Troubleshooting"</a>,
mainly high level, lot of Exam relevant stuff missing and so on.</p>
<p>I still had the eBook from my expired Red Hat Learning Subscription available,
which I used in addition after finishing the ACG Course. But this time, even this wasn't enough.</p>
<p>During the Exam, tools and techniques are required which were even in the offical Course documents
more or less just a side node on a Page, not marked as somehow important or part of any Lab.</p>
<p>Heard rumors that Red Hat internal this Exam is called "the widow maker" and known to be very hard.
Might also related to the fact that the Topic is quite specially and sometimes a little boring ;)</p>
<p>So overal I just picked the wrong Exam, I learned a lot so it wasn't wasted time, but for the three other
Exams required to become a Red Hat Certified Architect, I will probably focus more on Kubernetes / OpenShift, let's see.</p>
openSUSE Tumbleweed: Issues on resume from hibernate / suspend to disk2021-10-03T00:00:00+02:002021-10-03T00:00:00+02:00Dominik Wombachertag:dominik.wombacher.cc,2021-10-03:/posts/opensuse-tumbleweed-issues-on-resume-from-hibernate-suspend-to-disk.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>So far I always used <strong>sleep</strong> when closing the lid of my Notebook,
was ok even though you risk that your battery runs empty and your system shutdown.
Wanted to ... <a class="read-more" href="/posts/opensuse-tumbleweed-issues-on-resume-from-hibernate-suspend-to-disk.html"> [read more]</a></p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>So far I always used <strong>sleep</strong> when closing the lid of my Notebook,
was ok even though you risk that your battery runs empty and your system shutdown.
Wanted to activate <strong>hibernate</strong> which then would also support <strong>hybrid sleep</strong>,
what seem to be compareable with what Apple does to achieve a massive <em>standby</em> and short wakeup time on the MacBook.</p>
<p>During the Setup I already created a Swap Partition equal to the size of my Memory,
so I thought this should all work out of the box, but didn't.</p>
<p>Found a <a class="reference external" href="https://www.reddit.com/r/openSUSE/comments/hjec9g/resume_from_hibernation_is_not_working/">Post on reddit</a>
(Archive: <a class="reference external" href="https://archive.today/2021.10.03-102238/https://www.reddit.com/r/openSUSE/comments/hjec9g/resume_from_hibernation_is_not_working/">[1]</a>)
and a related <a class="reference external" href="https://bugzilla.suse.com/show_bug.cgi?id=1187381">Bug Report</a>
(Archive: <a class="reference external" href="https://web.archive.org/web/20211003103337/https://bugzilla.suse.com/show_bug.cgi?id=1187381">[1]</a>,
<a class="reference external" href="https://archive.today/2021.10.03-103302/https://bugzilla.suse.com/show_bug.cgi?id=1187381">[2]</a>), both contained contrary information.
Based on Reddit the <em>resume</em> module would be missing in <em>initrd</em> and should be included.
The Bug makes clear that <em>systemd-hibernate-resume</em> is used and _not_ the <em>resume</em> module that could be added by <em>dracut</em>.</p>
<p>I trust the Bug Report more, but adding <em>resume=/dev/mapper/system-swap</em>
(Has to be the path to your Swap Partition and might differ)
to <strong>/etc/default/grub</strong> didn't solved the issue.
So I generated a new <em>initramfs</em> by running <em>dracut -f</em>, without modifying any config,
afterwards <strong>hibernate</strong> and <strong>hybrid sleep</strong> were working.</p>
<pre class="code text literal-block">
grep resume /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="splash=silent mitigations=auto quiet resume=/dev/mapper/system-swap"
sudo grub2-mkconfig -o /boot/efi/EFI/opensuse/grub.cfg
sudo dracut -f
</pre>
<p>No Idea why I had to rebuild the <em>initramfs</em>, should already be done (automatically) during the last Kernel Upgrade,
anyway, I can now use <strong>hybrid sleep</strong> which looks actually very good so far.
Roughtly 30 - 60 sec until sleep after closing the lid, resume just a few seconds,
not really different to <strong>sleep</strong> as far I can see.</p>
Sophos Anti-Virus for Linux - Hidden On-Access Scan debug option2021-05-12T00:00:00+02:002021-05-12T00:00:00+02:00Dominik Wombachertag:dominik.wombacher.cc,2021-05-12:/posts/sophos-anti-virus-for-linux-hidden-on-access-scan-debug-option.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>I had to learn that it can be quite challenging to troubleshoot performance issues related Sophos Anti-Virus for Linux or to identify paths with high I/O load that might ... <a class="read-more" href="/posts/sophos-anti-virus-for-linux-hidden-on-access-scan-debug-option.html"> [read more]</a></p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>I had to learn that it can be quite challenging to troubleshoot performance issues related Sophos Anti-Virus for Linux or to identify paths with high I/O load that might require an adjusted Policy or even Exclude.</p>
<p>In a Situation were SAV processes generate 100% load on one or more CPU Cores, there is definitely something wrong that need a closer look.</p>
<p>Sophos does provide a lot of config settings but just very limited debug capabilities, at least when you trust the official manual and knowledge base.</p>
<p>But there is a hidden and not public documented config setting to log all On-Access Scan activities. For sure that might generate a huge amount of data and therefore should only activated a limited time during an ongoing troubleshooting session.</p>
<p>Activate:</p>
<pre class="code text literal-block">
/opt/sophos-av/bin/savconfig set OnAccessRecordAllScans enable
systemctl restart sav-protect
</pre>
<p>Log files will be written to <strong>/opt/sophos-av/tmp/</strong>, you should stop <em>sav-protect</em> and copy the logs to another location before deativating the debug mode.</p>
<p>Deactivate:</p>
<pre class="code text literal-block">
/opt/sophos-av/bin/savconfig set OnAccessRecordAllScans disable
systemctl restart sav-protect
</pre>
<p>It would actually be way easier if Sophos would cover such topics in their own documentation.</p>
ScummVM did the trick!2020-04-03T15:43:00+02:002020-04-03T15:43:00+02:00Dominik Wombachertag:dominik.wombacher.cc,2020-04-03:/posts/scummvm-did-the-trick.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>After playing around with DOSBox a while ago i gave ScummVM a try and actually it couldn't be easier.
I picked Discworld II and after adding it i could just ... <a class="read-more" href="/posts/scummvm-did-the-trick.html"> [read more]</a></p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>After playing around with DOSBox a while ago i gave ScummVM a try and actually it couldn't be easier.
I picked Discworld II and after adding it i could just start it without changing any settings at all, impressive.</p>
<p>I'm quite sure it will work very well with other old Games of my collection, we will see.</p>
Accessing SMB Share on old NAS failed from Linux2019-12-24T13:33:00+01:002019-12-24T13:33:00+01:00Dominik Wombachertag:dominik.wombacher.cc,2019-12-24:/posts/accessing-smb-share-on-old-nas-failed-from-linux.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Sometimes it can be challenging to use some old Hardware.
In my case I found an old <em>Buffalo LinkStation LS-WTGL</em> NAS from around 2008.</p>
<p>Connecting from an up-to-date openSUSE System ... <a class="read-more" href="/posts/accessing-smb-share-on-old-nas-failed-from-linux.html"> [read more]</a></p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Sometimes it can be challenging to use some old Hardware.
In my case I found an old <em>Buffalo LinkStation LS-WTGL</em> NAS from around 2008.</p>
<p>Connecting from an up-to-date openSUSE System surprisingly failed with the Error Message:</p>
<p><code>Unable to initialize messaging context. protocol negotiation failed: NT_STATUS_CONNECTION_DISCONNECTED</code></p>
<p>But what's the issue? I was able to connect to my <em>QNAP TS-253A</em> NAS without problems.
So i played around with different parameters of the smbclient cli tool, no success.</p>
<p>After a while the Hint in a <a class="reference external" href="https://ask.fedoraproject.org/t/unable-to-mount-samba-share-on-fedora-31-which-fedora-30-windows-has-no-problem-with/4077">Ask Fedora!</a>
(Archive: <a class="reference external" href="https://web.archive.org/web/20210225143935/https://ask.fedoraproject.org/t/unable-to-mount-samba-share-on-fedora-31-which-fedora-30-windows-has-no-problem-with/4077/4">[1]</a>,
<a class="reference external" href="http://archive.today/2021.02.25-143929/https://ask.fedoraproject.org/t/unable-to-mount-samba-share-on-fedora-31-which-fedora-30-windows-has-no-problem-with/4077/1">[2]</a>)
Thread from eeijlar put me into the right Direction.
The workaround, also mentioned in <a class="reference external" href="https://bugzilla.redhat.com/show_bug.cgi?id=1768117">Red Hat Bug 1768117</a>
(Archive: <a class="reference external" href="https://web.archive.org/web/20201111203350/https://bugzilla.redhat.com/show_bug.cgi?id=1768117">[1]</a>,
<a class="reference external" href="http://archive.today/2021.02.25-144057/https://bugzilla.redhat.com/show_bug.cgi?id=1768117">[2]</a>),
solved the issue and i was able to mount my SMB Shares from the old Buffalo NAS.</p>
<p>eeijlar:</p>
<pre class="literal-block">
> Update /etc/samba/smb.conf with:
> [global]
> client min protocol = NT1
</pre>
<p>For security reasons, the SMB1 / NT1 protocol is disabled by default in Samba 4.11 and higher.
But some old NAS only support these outdated protocol.</p>
<p>I highly suggest that you only enable it temporary and migrate your files.</p>
No Sound in DOSBox on Linux2019-12-06T18:53:00+01:002019-12-06T18:53:00+01:00Dominik Wombachertag:dominik.wombacher.cc,2019-12-06:/posts/no-sound-in-dosbox-on-linux.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>I installed DOSBox to play some old DOS Games like Discworld on Linux (openSUSE Tumbleweed) but didn't had sound prior figure out the correct MIDI Port and adjusting the dosbox ... <a class="read-more" href="/posts/no-sound-in-dosbox-on-linux.html"> [read more]</a></p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>I installed DOSBox to play some old DOS Games like Discworld on Linux (openSUSE Tumbleweed) but didn't had sound prior figure out the correct MIDI Port and adjusting the dosbox config accordingly.</p>
<p>Due to the fact that i installed Unreal Tournament from 1999 already (successful!) on my Linux Notebook, it's obvious that i had to do the same with some even older Games too :D</p>
<p>I thought executing "pmidi -l" would show the correct MIDI Port, but at least in my case, further steps were necessary.</p>
<p>The troubleshooting approach described in the <a class="reference external" href="https://askubuntu.com/questions/79944/dosbox-has-no-sound">AskUbuntu Forum</a>
(Archive: <a class="reference external" href="https://web.archive.org/web/20180102021001/https://askubuntu.com/questions/79944/dosbox-has-no-sound">[1]</a>,
<a class="reference external" href="http://archive.today/2021.02.25-232132/https://askubuntu.com/questions/79944/dosbox-has-no-sound">[2]</a>)
is my favorite and did the trick.</p>
<p>You have to Download a test MIDI File, start a MIDI Server, start the playback and if you have audio, put the correct Port into your dosbox config.</p>
<pre class="code text literal-block">
zypper install timidity
zypper install pmidi
cd /tmp
wget http://www.angelfire.com/fl/herky/images/teddybear.mid
pmidi -l
# Port Client name Port name
# 14:0 Midi Through Midi Through Port-0
timidity -iA
# Requested buffer size 32768, fragment size 8192
# ALSA pcm 'default' set buffer size 32768, period size 8192 bytes
# TiMidity starting in ALSA server mode
# Opening sequencer port: 128:0 128:1 128:2 128:3
pmidi -p 128:0 teddybear.mid
</pre>
<p>In my case, pmidi identified Port "14:0" but based on the test with timidity i have to use "128:0" instead.</p>
<p>So i changed the corresponding parameter in my dosbox config:</p>
<pre class="code ini literal-block">
<span class="pygments-k">[midi]</span><span class="pygments-w">
</span><span class="pygments-na">midiconfig</span><span class="pygments-o">=</span><span class="pygments-s">128:0</span><span class="pygments-w">
</span>
</pre>
<p>When you start dosbox from the console, you should see something like the following an hear the nicest MIDI sound when starting an old Game ;)</p>
<pre class="code text literal-block">
ALSA:Client initialised [128:0]
MIDI:Opened device:alsa
</pre>
<p>I will play around with ScummVM as well within the next days, so i'm quite sure further Posts regarding some sort of gaming on Linux will follow soon!</p>
Unreal Tournament (UT99) on openSUSE Tumbleweed Linux2019-12-05T13:38:00+01:002021-02-26T21:52:00+01:00Dominik Wombachertag:dominik.wombacher.cc,2019-12-05:/posts/unreal-tournament-ut99-on-opensuse-tumbleweed-linux.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>To be honest, i didn't played Unreal Tournament from 1999 for years but after i found the Game CD, i just had to install and play it on my Linux ... <a class="read-more" href="/posts/unreal-tournament-ut99-on-opensuse-tumbleweed-linux.html"> [read more]</a></p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>To be honest, i didn't played Unreal Tournament from 1999 for years but after i found the Game CD, i just had to install and play it on my Linux Notebook :D</p>
<div class="section" id="tl-dr">
<h2>TL;DR</h2>
<p>Summary how to install Unreal Tournament (Classic / 1999) on openSUSE Tumbleweed Linux:</p>
<ol class="arabic simple">
<li>Add <strong>games</strong> Repository and install package <strong>gtk</strong></li>
</ol>
<blockquote>
<ul class="simple">
<li>either via YaST or through the <a class="reference external" href="https://software.opensuse.org/package/gtk">openSUSE Software repository</a></li>
</ul>
</blockquote>
<pre class="code text literal-block">
zypper addrepo https://download.opensuse.org/repositories/games/openSUSE_Tumbleweed/games.repo
zypper refresh
zypper install gtk
</pre>
<ol class="arabic simple" start="2">
<li>Install missing 32bit libraries</li>
</ol>
<pre class="code text literal-block">
zypper install libX11-6-32bit
zypper install libXext6-32bit
zypper install libglvnd-32bit
zypper install Mesa-libGL1-32bit
zypper install pulseaudio-utils-32bit
</pre>
<ol class="arabic simple" start="3">
<li>Download and run the UT99 installer</li>
</ol>
<blockquote>
<ul class="simple">
<li>Update 2021-02-26: The address used by wget below - pointing to <strong>liflg.org</strong> - isn't working anymore and redirect to Github, you can use <a class="reference external" href="https://web.archive.org/web/20180614001819if_/https://liflg.reto-schneider.ch/files/final/unreal.tournament_436-multilanguage.run">archive.org #2</a> instead.</li>
</ul>
</blockquote>
<pre class="code text literal-block">
# wget https://liflg.org/?what=dl&catid=6&gameid=51&filename=unreal.tournament_436-multilanguage.run
wget https://web.archive.org/web/20180614001819if_/https://liflg.reto-schneider.ch/files/final/unreal.tournament_436-multilanguage.run
chmod +x unreal.tournament_436-multilanguage.run
./unreal.tournament_436-multilanguage.run
</pre>
<ol class="arabic simple" start="4">
<li>Enjoy UT99</li>
</ol>
<pre class="code text literal-block">
padsp <InstallPath>/ut
</pre>
</div>
<div class="section" id="the-whole-journey">
<h2>The whole journey</h2>
<p>I own a <a class="reference external" href="https://www.tuxedocomputers.com/en/Linux-Hardware/Linux-Notebooks/10-14-inch/TUXEDO-InfinityBook-Pro-14-v5.tuxedo">TUXEDO InfinityBook Pro 14 v5</a>
(Archive: <a class="reference external" href="http://archive.today/2021.02.20-153838/https://www.tuxedocomputers.com/en/Linux-Hardware/Linux-Notebooks/10-14-inch/TUXEDO-InfinityBook-Pro-14-v5.tuxedo">[1]</a>)
with an Intel UHD Graphics 620 Chip, running openSUSE Tumbleweed Linux, should hopefully be sufficient to play an 20 year old Game ;)</p>
<div class="section" id="linux-installer">
<h3>Linux Installer</h3>
<p>The Installer can be downloaded from <a class="reference external" href="https://liflg.org/?catid=6&amp;gameid=51">Linux Installers for Linux Games</a>,
i picked <code>unreal.tournament_436-multilanguage.run</code> and <code>unreal.tournament.official.bonus.pack.collection.run</code> - the other one available is for the <em>Game of the Year</em> (goty) Edition.</p>
<ul class="simple">
<li>Update 2021-02-26: The above link to <strong>Linux Installers for Linux Games</strong> isn't working anymore and redirect to Github, you can use the following Backup Links instead:<ul>
<li><strong>liflg.org</strong> Page: <a class="reference external" href="https://web.archive.org/web/20181027111203/https://www.liflg.org/?catid=6&gameid=51">archive.org #1</a></li>
<li>UT99 Installer: <a class="reference external" href="https://web.archive.org/web/20180614001819if_/https://liflg.reto-schneider.ch/files/final/unreal.tournament_436-multilanguage.run">archive.org #2</a></li>
<li>UT99 BonusPack: <a class="reference external" href="https://web.archive.org/web/20171203202118if_/https://liflg.reto-schneider.ch/files/final/unreal.tournament.official.bonus.pack.collection.run">archive.org #3</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="troubleshooting">
<h3>Troubleshooting</h3>
<p>GTK in Version 1 is required by both installer, after some research i found the package in the <a class="reference external" href="https://software.opensuse.org/package/gtk">openSUSE Software repository</a>.</p>
<p>After installing the GTK package and inserting the Game CD into my external Drive, i just started the installer, adjusted the Install Path and started the installation.</p>
<p>Seems just too easy!?</p>
<p>Yep, after starting UT, i received an error message that <code>libX11.so.6 is missing</code>.
Looks like the 32bit version is not installed by default, <code>zypper install libX11-6-32bit</code> solved that problem.
Same with the next missing library <strong>libXext.so.6</strong>, <code>zypper install libXext6-32bit</code>.</p>
<p>Well, next Error:</p>
<pre class="code text literal-block">
Signal: SIGIOT [iot trap]
Aborting.
</pre>
<p>Let's take a look into the log file by running <code>cat ~/.loki/ut/System/UnrealTournament.log</code>:</p>
<pre class="code text literal-block">
Log: binding libGL.so.1
Critical: appError called:
Critical: Could not load OpenGL library
</pre>
<p>Ok, different kind of error message but after some research same as above, there is a 32bit version of <strong>libGL.so.1</strong> but, for sure, i only had the 64bit one installed by default.
Running <code>zypper install libglvnd-32bit</code> solved that issue too.</p>
<p>Hmm but again the <strong>SIGIOT</strong> error occurred, let's take a look into the log files:</p>
<pre class="code text literal-block">
Log: OpenGL
Critical: appError called:
Critical: Couldn't set video mode: Couldn't find matching GLX visual
</pre>
<p>Lesson learned, to get a 20 year old game running on a bleeding edge Distribution in 2019, you have to install a bunch of 32bit libraries ;)
This time <strong>Mesa-libGL1-32bit</strong> was missing and need to be installed.</p>
<p>And voila, it's starting! without sound :O ... Quite sure it's a missing 32bit lib again ...
I found some hints regarding PulseAudio in the <a class="reference external" href="https://wiki.debian.org/Games/UT99">Debian Wiki</a>
(Archive: <a class="reference external" href="https://web.archive.org/web/20201112021136/https://wiki.debian.org/Games/UT99">[1]</a>,
<a class="reference external" href="http://archive.today/2017.11.01-215614/https://wiki.debian.org/Games/UT99">[2]</a>).
So i installed <strong>pulseaudio-utils-32bit</strong> and after starting the game with <code>padsp ut</code> instead just <code>ut</code> i had sound :D</p>
</div>
<div class="section" id="audio-issues">
<h3>Audio Issues</h3>
<p>To get rid of delays in the Audio Output, it was necessary to adjust one line in the config file <code>~/.loki/ut/System/UnrealTournament.ini</code> as well:</p>
<pre class="code text literal-block">
# Change this:
AudioDevice=ALAudio.ALAudioSubsystem
# To that:
AudioDevice=Audio.GenericAudioSubsystem
</pre>
</div>
<div class="section" id="play-online">
<h3>Play Online</h3>
<p>It looks like that lot of audio sample rates which are required to play Online are not supported using the GenericAudioSubsystem.
Connection to most of the UT Server fail and you find an Error about <strong>unsupported Rate</strong> in your <strong>UnrealTournament.log</strong> file.
The workaround so far was to use the ALAudioSubsystem with a delay in the Audio Output :(</p>
<p>Also lot Public Server require an installed NPLoader.
Lot of different Version can be found at: <a class="reference external" href="http://utgl.unrealadmin.org/NPLoader/">http://utgl.unrealadmin.org/NPLoader/</a></p>
<p>You have to Download either the <em>Linux.tar.gz</em> or the <em>.dll</em>, <em>.so</em> as well <em>.u</em> file and copy all of them in your <em>System</em> folder of your UT Installation.</p>
</div>
<div class="section" id="well-done">
<h3>Well done</h3>
<p>Even if i had to look around for some time to locate and fix most of the issues, install a bunch of 32bit libraries, adjust something in the config as well start the game with an extra parameter, it's worth it!
Didn't know the exact FPS count but look and feel is like 20 years ago and i love it!</p>
<p>Btw. installing the Bonus Pack was very straight forward with the <code>unreal.tournament.official.bonus.pack.collection.run</code> script.</p>
<p>Enjoy Unreal Tournament from 1999 on your Linux Machine!</p>
</div>
</div>
Apple AirPods on Linux?2019-10-26T12:55:00+02:002019-10-26T12:55:00+02:00Dominik Wombachertag:dominik.wombacher.cc,2019-10-26:/posts/apple-airpods-on-linux.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>I was wondering if my Apple AirPods would work on openSUSE Linux out of the Box.
Just enable pairing mode, click on connect and all fine? Not exactly, it failed ... <a class="read-more" href="/posts/apple-airpods-on-linux.html"> [read more]</a></p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>I was wondering if my Apple AirPods would work on openSUSE Linux out of the Box.
Just enable pairing mode, click on connect and all fine? Not exactly, it failed with the default settings and some additional Steps were necessary.</p>
<ol class="arabic simple">
<li>Set <code>ControllerMode = dual</code> in config File <strong>/etc/bluetooth/main.conf</strong></li>
</ol>
<ul class="simple">
<li>On openSUSE Tumbleweed (Patch Level 10/2019) the config file doesn't seem exist by default. I copied the example of the bluez Package located in <strong>/usr/share/doc/packages/bluez/</strong></li>
</ul>
<pre class="code text literal-block">
sudo cp /usr/share/doc/packages/bluez/main.conf /etc/bluetooth/main.conf
sudo vim /etc/bluetooth/main.conf
# Restricts all controllers to the specified transport. Default value
# is "dual", i.e. both BR/EDR and LE enabled (when supported by the HW).
# Possible values: "dual", "bredr", "le"
ControllerMode = dual
sudo systemctl restart bluetooth
</pre>
<ol class="arabic simple" start="2">
<li>Add Parameter <code>--noplugin=avrcp</code> at the end of <code>ExecStart</code> in <strong>bluetooth.service</strong>, otherwise the AirPods running with poor Sound Quality and very low volume</li>
</ol>
<ul class="simple">
<li>Source: <a class="reference external" href="https://wiki.archlinux.org/index.php/Bluetooth_headset#Apple_Airpods_have_low_volume">https://wiki.archlinux.org/index.php/Bluetooth_headset#Apple_Airpods_have_low_volume</a>
(Archive: <a class="reference external" href="https://web.archive.org/web/20190908054157/https://wiki.archlinux.org/index.php/Bluetooth_headset">[1]</a>,
<a class="reference external" href="http://archive.today/2021.02.25-235417/https://wiki.archlinux.org/index.php/Bluetooth_headset%23Apple_Airpods_have_low_volume">[2]</a>)</li>
</ul>
<pre class="code text literal-block">
sudo systemctl edit --full bluetooth.service
[...]
ExecStart=/usr/lib/bluetooth/bluetoothd --noplugin=avrcp
[...]
sudo systemctl restart bluetooth
</pre>
<p>After those few adjustments they actually working quite good as Headphone.
The Microphone is not working yet, maybe i will take a look into that later.</p>
Linux Professional Institute LPIC-12019-09-02T00:00:00+02:002019-09-02T00:00:00+02:00Dominik Wombachertag:dominik.wombacher.cc,2019-09-02:/posts/linux-professional-institute-lpic-1.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Today i passed the <strong>Linux Professional Institute LPIC-1</strong> Exam and earned the Certification.</p>
<p><strong>Summary</strong>: The LPIC-1 will validate the candidate's ability to perform maintenance tasks on the command line,
install ... <a class="read-more" href="/posts/linux-professional-institute-lpic-1.html"> [read more]</a></p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Today i passed the <strong>Linux Professional Institute LPIC-1</strong> Exam and earned the Certification.</p>
<p><strong>Summary</strong>: The LPIC-1 will validate the candidate's ability to perform maintenance tasks on the command line,
install and configure a computer running Linux and configure basic networking.</p>
<p>The LPIC-1 is designed to reflect current research and validate a candidate's proficiency in real world system administration.</p>
<p>Source & Copyright: <a class="reference external" href="https://www.lpi.org">https://www.lpi.org</a></p>
<div class="section" id="skills">
<h2>Skills</h2>
<ul class="simple">
<li>Understand the architecture of a Linux system</li>
<li>Install and maintain a Linux workstation, including X11 and setup it up as a network client</li>
<li>Work at the Linux command line, including common GNU and Unix commands</li>
<li>Handle files and access permissions as well as system security</li>
<li>Perform easy maintenance tasks: help users, add users to a larger system, backup and restore, shutdown and reboot.</li>
</ul>
<p>Source & Copyright: <a class="reference external" href="https://www.lpi.org">https://www.lpi.org</a></p>
</div>
<div class="section" id="certificate">
<h2>Certificate</h2>
<ul class="simple">
<li>Downloads<ul>
<li><a class="reference external" href="/certificates/Dominik_Wombacher_LPIC-1.pdf">Certificate</a> (PDF, 144K)</li>
</ul>
</li>
<li>Links<ul>
<li><a class="reference external" href="https://lpi.org/v/LPI000417309/s87z3h5sfr">Certificate Verification</a>
(Archive: <a class="reference external" href="https://web.archive.org/web/20210227113324/https://cs.lpi.org/caf/Xamman/certification/verify/LPI000417309/s87z3h5sfr">[1]</a>,
<a class="reference external" href="http://archive.today/2021.02.27-113354/https://cs.lpi.org/caf/Xamman/certification/verify/LPI000417309/s87z3h5sfr">[2]</a>)</li>
</ul>
</li>
</ul>
</div>