Finish packaging environment setup sections
This commit is contained in:
parent
04b8744750
commit
3465376d9a
@ -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
|
||||
`<on cdimage.ubuntu.com https://cdimage.ubuntu.com/lubuntu/daily-live/pending/>`__.
|
||||
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) <cdimage@ubuntu.com>" [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 <name@example.com>';
|
||||
$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 <https://bugs.launchpad.net/ubuntu/+source/devscripts/+bug/2122486>`__,
|
||||
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.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user