From 3465376d9a1ff6ceb1b8a0ccb176cf4f86616df2 Mon Sep 17 00:00:00 2001 From: Aaron Rainbolt Date: Mon, 17 Nov 2025 18:01:40 -0600 Subject: [PATCH] Finish packaging environment setup sections --- lubuntu-packaging-guide.rst | 335 ++++++++++++++++++++++++++++++++++++ 1 file changed, 335 insertions(+) diff --git a/lubuntu-packaging-guide.rst b/lubuntu-packaging-guide.rst index 438962b..25affa8 100644 --- a/lubuntu-packaging-guide.rst +++ b/lubuntu-packaging-guide.rst @@ -374,3 +374,338 @@ The steps are, roughly: * Create a shared folder for working on packages on both the VM and host. * Install and configure packaging utilities. * Test the system by building sample source and binary packages. + +KVM preparation and VM installation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The most common way to use KVM is through virt-manager, a GUI app that is +somewhat similar to VirtualBox. Under the hood, it uses libvirt, QEMU, and KVM +to run VMs. + +.. NOTE:: + KVM virtualization, much like the rest of Linux, has a lot of different + pieces that work together. QEMU emulates hardware and CPU instructions that + can't be run at full speed, KVM runs CPU instructions that can be run at + full speed, and libvirt makes it easier for applications to work with + QEMU/KVM virtual machines. virt-manager then provides a graphical user + interface for libvirt. + +Installation is fairly simple; open QTerminal and run:: + + sudo apt install virt-manager libvirt-clients libvirt-daemon virtiofsd + sudo systemctl enable libvirtd.service + sudo systemctl start libvirtd.service + +You should now be able to create virtual machines using virt-manager. + +.. NOTE:: + When talking about virtual and physical systems, the physical machine that + runs the VMs is typically called the "host", while the VMs themselves are + typically called "guests". + +The next thing to do is to download the latest pre-release image of Lubuntu. +Like mentioned above, it is important to use the latest possible version of +Ubuntu to prevent issues with package builds later. The latest ISO can be +found +``__. +It is generally a good idea to verify your ISO download using GnuPG and +sha256sum. To do this: + +1. Create a directory to store the ISO at. ``$HOME/ISO/Lubuntu`` is a good + location. +2. Download the ``CODENAME-desktop-amd64.iso``, ``SHA256SUMS``, and + ``SHA256SUMS.gpg`` files for Lubuntu, and move them to the newly created + directory. +3. Open QTerminal in the new directory, and import the PGP key used to sign + Ubuntu ISO images: + ``gpg --keyserver keyserver.ubuntu.com --recv-keys 843938DF228D22F7B3742BC0D94AA3F0EFE21092`` +4. Verify the SHA256SUMS file is unmodified using GnuPG: + ``gpg --keyid-format=long --verify SHA256SUMS.gpg SHA256SUMS``. This + command should show output that looks similar to this:: + + gpg: Signature made Tue 26 Aug 2025 12:14:14 PM CDT + gpg: using RSA key 843938DF228D22F7B3742BC0D94AA3F0EFE21092 + gpg: Good signature from "Ubuntu CD Image Automatic Signing Key (2012) " [unknown] + gpg: WARNING: This key is not certified with a trusted signature! + gpg: There is no indication that the signature belongs to the owner. + Primary key fingerprint: 8439 38DF 228D 22F7 B374 2BC0 D94A A3F0 EFE2 1092 + +5. Ensure you see the words "Good signature" in the output of GnuPG. If you + see "No public key" or "BAD signature", your download is corrupt. If you + see "Good signature", the SHA256SUMS file is authentic and intact. +6. Verify the ISO file is unmodified using sha256sum: + ``sha256sum -c SHA256SUMS``. This command should show output that looks + like ``resolute-desktop-amd64.iso: OK``. If you see this, your ISO download + is authentic and intact. + +Once you have a verified Lubuntu download, it's finally time we can create the +VM! To do this: + +1. Open the application menu, and launch "Virtual Machine Manager". +2. Wait until the "Connecting" notice near the top of the window disappears. +3. Click the "Create a new virtual machine" button (it's in the very top-left + corner of the window). +4. In the "Create a new virtual machine" window, under "Choose how you would + like to install the operating system", click "Local install media (ISO + image or CDROM), then click "Forward". +5. At the top-right corner of the window, under "Choose ISO or CDROM install + media", click "Browse...". +6. In the "Locate ISO media volume" window, click "Browse Local". +7. In the file selector, navigate to the directory containing the Lubuntu ISO, + then click the ISO file and click "Open". +8. Uncheck the "Automatically detect from the installation media / source" + checkbox. +9. In the "Choose the operating system you are installing" text box, type + "Ubuntu". +10. In the popup that papears, click "ubuntu 25.10 (ubuntu25.10)", then click + "Forward". +11. Set a reasonable amount of RAM and number of CPUs for your hardware. + Package builds usually don't require that much memory or CPU power, but + sometimes they can benefit from lots of memory and CPU power, so it's a + good idea to allocate at least 8192 MB RAM and 4 CPUs if possible. +12. Set a reasonable amount of disk space for the VM. Package builds can take + a lot of disk space, so allocating at least 64 GB is highly recommended + here. +13. Set the VM name to something descriptive (i.e. ``lubuntu-dev``), then + click "Finish". We'll refer to this VM as ``lubuntu-dev`` in the rest of + this document. + +The Lubuntu ISO should boot, and you can install it like you normally would. +For best performance, the ``ext4`` filesystem should be used. We won't cover +the Lubuntu installation process here, it's fairly straightforward. Once the +installed system boots up, you should check for updates and install them using +Lubuntu Update (or by running ``sudo apt update && sudo apt full-upgrade`` in +a terminal). + +Once all updates are installed, click the application menu inside +``lubuntu-dev``, then hover over "Leave" and click "Shutdown". When LXQt asks +if you want to switch off your computer, click "Yes". (It is important that +you shut down the VM using LXQt's GUI buttons, do NOT run ``shutdown now`` in +a terminal! Doing the first shutdown in this manner prevents an LXQt bug that +breaks several features of Lubuntu.) + +Shared folder setup +^^^^^^^^^^^^^^^^^^^ + +When doing Debian packaging, you will frequently have to modify packages on +both the host and guest systems. Rather than moving files between the guest +and the host all the time, it's easier to use a shared folder. This allows +both the guest and host to see and work on a set of files in the shared +directory. + +.. NOTE:: + KVM shared folders understand UNIX file permissions, so if a file is owned + by a particular UID on the host, it will appear as being owned by that same + UID in the guest. The default UID for the first user in Lubuntu is 1000. If + your user on the host system has UID 1000, things should work normally, but + if your UID on the host is something other than 1000, you will almost + certainly run into file ownership issues when trying to modify files in the + shared folder within the guest. If this happens, you should create a new + user in the guest with the same UID as your user account on the host, then + do your packaging work using that user account. + +.. WARNING:: + Do not share your entire home directory with the guest. This can expose + your PGP key to the guest, which is a security hazard. + +To add a shared folder to the VM: + +1. In the host OS, create a new directory to share between the host and the + guest. We'll assume the shared folder is at ``$HOME/vmshare``. +2. Create a file named ``test-marker.txt`` in ``$HOME/vmshare``. Well use this + to ensure that the shared folder actually works later. +3. Ensure the ``lubuntu-dev`` window is open but the VM itself is powered off. + (You should see the words "Guest is not running." in the middle of the + window.) +4. Click the "Show virtual hardware details" button (it's in the top toolbar, + and is the second button from the left). +5. In the left-hand sidebar, click "Memory", then check the "Enable shared + memory" checkbox and click "Apply"." +6. Underneath the left-hand sidebar, click "Add Hardware". +7. In the "Add New Virtual Hardware" window, in the left-hand sidebar, click + "Filesystem". +8. Ensure that the "Driver" is set to "virtiofs", then set the "Source path" + to ``/home/USERNAME/vmshare`` and the "Target path" to ``vmshare``. + (Replace ``USERNAME`` with your username on the host system.) +9. Click "Finish" to add the shared folder to the VM. + +Next, to set up the VM to automatically mount this shared folder on startup: + +1. Ensure the ``lubuntu-dev`` window is open, then click the "Power on the + virtual machine" button (it's in the top toolbar, looks like a play button, + and is the third button from the left). +2. Log in if necessary. +3. In the guest, open QTerminal, and run the following commands, replacing + ``USERNAME`` with the guest's account's username. This will create a + systemd unit for mounting the shared folder, enable it so it starts on + bootup, and then start it so that the shared folder immediately starts + working:: + + mkdir $HOME/vmshare + cat <<'EOF' | sudo tee /etc/systemd/system/mount-vmshare.service + [Unit] + Description=Mount shared folder on startup + + [Service] + Type=oneshot + RemainAfterExit=true + ExecStart=mount -t virtiofs vmshare /home/USERNAME/vmshare + + [Install] + WantedBy=multi-user.target + EOF + sudo systemctl enable mount-vmshare.service + sudo systemctl start mount-vmshare.service + +4. The shared folder should be immediately mounted. In the guest, run + ``ls $HOME/vmshare``, and verify that you can see the file + ``test-marker.txt`` in the directory. +5. In the guest, run ``touch $HOME/vmshare/test-marker-guest.txt``. +6. On the host, run ``ls $HOME/vmshare``, and verify that you can see the + ``test-marker-guest.txt`` file. + +If both test files can be seen on both the guest and the host, the shared +folder is working. With that out of the way, we can get to the fun part; +installing tools for Debian packaging! + +Installing and configuring packaging utilities +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Like mentioned earlier, we're going to be using ``sbuild`` as our primary +packaging tool. We'll go into a bit of detail about what all ``sbuild`` does +and how later. For now, we're just going to get it and the rest of the Debian +packaging tools installed and ready to work. + +1. Ensure the ``lubuntu-dev`` window is open and the VM is running. +2. In the guest, open QTerminal, and run the following commands to install + ``sbuild`` and several other packaging utilities:: + + sudo apt install ubuntu-dev-tools debhelper devscripts mmdebstrap git sbuild + +3. In the guest, configure ``sbuild``. The following configuration is + relatively basic, works for almost everything, and integrates automatic + package caching. Replace ``Your Name`` and ``name@example.com`` as + appropriate. Do NOT remove the ``1;`` at the end of this config, or it will + break ``sbuild``. To create the config file:: + + mkdir -p $HOME/.config/sbuild + cat <<'EOF' > $HOME/.config/sbuild/config.pl + $maintainer_name = 'Your Name '; + $distribution = "resolute"; + $build_arch_all = 1; + $purge_build_directory = "successful"; + $purge_session = "successful"; + $purge_build_deps = "successful"; + $log_dir = $ENV{HOME}."/ubuntu/logs"; + $chroot_mode = "unshare"; + $unshare_mmdebstrap_keep_tarball = 1; + $unshare_mmdebstrap_extra_args = [ + "*" => [ "--include=debhelper,auto-apt-proxy,ca-certificates" ], + "resolute" => [ "--include=debhelper,auto-apt-proxy,ca-certificates", "--components=main,universe,restricted,multiverse" ], + "questing" => [ "--include=debhelper,auto-apt-proxy,ca-certificates", "--components=main,universe,restricted,multiverse" ], + "plucky" => [ "--include=debhelper,auto-apt-proxy,ca-certificates", "--components=main,universe,restricted,multiverse" ], + "noble" => [ "--include=debhelper,auto-apt-proxy,ca-certificates", "--components=main,universe,restricted,multiverse" ], + ]; + $lintian_opts = [ '-E', '-v', '-I', '-L', '+pedantic' ]; + $clean_source = 0; + 1; + EOF + +4. In the guest, configure ``quilt``. We'll explain more about what this tool + is and what it does later:: + + cat <<'EOF' > $HOME/.quiltrc + for where in ./ ../ ../../ ../../../ ../../../../ ../../../../../; do + if [ -e ${where}debian/rules -a -d ${where}debian/patches ]; then + export QUILT_PATCHES=debian/patches + break + fi + done + QUILT_PUSH_ARGS="--color=auto" + QUILT_DIFF_ARGS="--no-timestamps --no-index -p ab --color=auto" + QUILT_REFRESH_ARGS="--no-timestamps --no-index -p ab" + QUILT_DIFF_OPTS='-p' + EOF + +5. In the guest, configure ``git``. You may already know what this tool does, + but we'll explain more about it later. Replace ``Your Name`` and + ``name@example.com`` as appropriate:: + + git config --global user.name 'Your Name' + git config --global user.email 'name@example.com' + +6. In the guest, configure ``dch``. We'll explain more about what this tool is + and what it does later. Replace ``Your Name`` and ``name@example.com`` as + appropriate:: + + cat <<'EOF' >> $HOME/.bashrc + export EMAIL='name@example.com' + export DEBEMAIL='name@example.com' + export DEBFULLNAME='Your Name' + EOF + +7. In the guest, run ``source $HOME/.bashrc`` so the new settings you've + created for ``dch`` take effect in the currently running shell. +8. On the host, run the following commands to install some necessary packaging + tools there as well:: + + sudo apt install debhelper devscripts + +There's a lot going on here, most of which won't make sense right now. We'll +go into detail about what all these options do later on in this guide. + +At this point, your packaging environment is configured and ready to use. It's +time for the last step of setup; building a test package! + +Testing the packaging environment +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +To make sure everything's working smoothly, we're going to use ``sbuild`` to +build binary packages for ``lxqt-about``, the same package we showed an +overview of at the beginning of this document. ``lxqt-about``'s packaging is +stored in the Lubuntu Git instance, so we're going to download the packaging +from there and build it. + +1. Ensure the ``lubuntu-dev`` window is open and the VM is running. +2. In the guest, open QTerminal, and create a directory at + ``$HOME/vmshare/pkg`` to do packaging in. Then change to the directory:: + + mkdir $HOME/vmshare/pkg + cd $HOME/vmshare/pkg + +3. In the guest, download the Debian packaging for the ``lxqt-about`` package + from Lubuntu Git:: + + git clone https://git.lubuntu.me/Lubuntu/lxqt-about-packaging.git + +4. In the guest, change to the new ``lxqt-about-packaging`` directory with + ``cd lxqt-about-packaging``. +5. In the guest, run ``ls``, and ensure you see a single directory named + ``debian``. + +.. NOTE:: + If you remember the overview of ``lxqt-about`` from the start of this + document, you might be confused here, since you only see a ``debian`` + directory, not a full package. This is normal; Lubuntu does not duplicate + upstream source code in our packaging, since it's a waste of space and + isn't needed for package builds to still work. + +6. In the guest, download the source code for ``lxqt-about`` by running + ``uscan --download-current-version``. ``uscan`` is a packaging tool used + to download source code for packaged applications. + +.. NOTE:: + Due to a + `bug `__, + this might not work for all packages yet. + +7. In the guest, build the package with the following command:: + + sbuild -d resolute + +8. In the guest, run ``ls ..``. If all went well, you should see an + ``lxqt-about`` deb file, alongside several other files. + +That's it! If the above worked, you now have a working packaging environment! +We're now ready to move past system setup, and start learning how packaging +works.