<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Linux on RESEARCHUT</title><link>https://researchut.com/tags/linux/</link><description>Recent content in Linux on RESEARCHUT</description><generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>rrs@researchut.com (Ritesh Raj Sarraf)</managingEditor><webMaster>rrs@researchut.com (Ritesh Raj Sarraf)</webMaster><lastBuildDate>Sat, 20 Dec 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://researchut.com/tags/linux/index.xml" rel="self" type="application/rss+xml"/><item><title>Immutable Debian</title><link>https://researchut.com/blog/Immutable_Atomic_Debian/</link><pubDate>Sat, 20 Dec 2025 00:00:00 +0000</pubDate><author>rrs@researchut.com (Ritesh Raj Sarraf)</author><guid>https://researchut.com/blog/Immutable_Atomic_Debian/</guid><description>&lt;h2 id="immutable-atomic-linux-distirbutions">Immutable Atomic Linux Distirbutions&lt;/h2>
&lt;p>Of late, I&amp;rsquo;ve been hearing a lot of (good) things about Immutable Linux
Distributions, from friends, colleagues and mentors. It has been
something on my plate for some time, to explore. But given the nature of
the subject, it has been delayed for a while. Reasons are simple; I can
only really judge this product if I use it for some time; and it has to
be on my primary daily driver machine.&lt;/p>
&lt;p>Personal life, this year, has been quite challenging as well. Thus it got pushed to until now.&lt;/p>
&lt;h3 id="chrome-os">Chrome OS&lt;/h3>
&lt;p>I&amp;rsquo;ve realized that I&amp;rsquo;ve been quite late to a lot of Linux parties.
Containers, Docker, Kubernetes, Golang, Rust, Immutable Linux and many
many more.&lt;/p>
&lt;p>Late to the extent that I&amp;rsquo;ve had a Chrome Book lying at home for many
months but never got to tinker with it at all.&lt;/p>
&lt;p>Having used it for just around 2 weeks now, I can see what a great
product Google built with it. In short, this is exactly how a Linux
desktop integration should be. The GUI integration is just top notch.
There&amp;rsquo;s consistency across all applications rendered on the Chrome OS&lt;/p>
&lt;p>The integration of [X]Wayland and friends is equally good. Maybe Google
should consider opensourcing all those components. IIRC, exo,
sommelier, xwayland, ash and many more.&lt;/p>
&lt;p>I was equally happy to see their &lt;code>Linux Development Environment&lt;/code>
offering on supported hardware. While tightly integrated, it still
allows power users to tinker things around. I was quite impressed to see
nested containers in &lt;code>crostini&lt;/code>. Job well done.&lt;/p>
&lt;p>All of this explains why there&amp;rsquo;s much buzz about &lt;code>Immutable Atomic Linux Distributions&lt;/code> these days.&lt;/p>
&lt;p>Then, there&amp;rsquo;s the Android integration, which is just awesome in case you
care of it. Both &lt;code>libndk&lt;/code> and &lt;code>libhoudini&lt;/code> are well integrated and
nicely usable.&lt;/p>
&lt;h3 id="immutable-linux-distributions">Immutable Linux Distributions&lt;/h3>
&lt;p>This holiday season I wanted to find and spend some time catching up on
stuff I had been prolonging.&lt;/p>
&lt;p>I chose to explore this subject while trying to remain in familiar
Debian land. So my first look was to see if there was any product
derived out of the Debian base.&lt;/p>
&lt;p>That brought me to &lt;code>Vanilla OS Orchid&lt;/code>. This is a fresh out of oven
project, recently switched to being based on Debian Sid. Previous
iteration used Ubuntu as the base.&lt;/p>
&lt;p>Vanilla OS turned out to be quite good an experience. The stock
offering is created well enough to serve the general audience. And the
framework is such wonderfully structured that seasoned users can tinker
around with it, without much fuss.&lt;/p>
&lt;p>Vanilla OS uses an A/B Partition model for how system updates are
rolled. At any point, when a new OTA update is pushed, it gets applied
to the inactive A/B partition. And it gets activated at next boot. If things
break, user has the option to switch to the previous state. Just the
usual set of expectations one would have with an immutable distribution.&lt;/p>
&lt;p>What they&amp;rsquo;ve done beautifully is:&lt;/p>
&lt;ul>
&lt;li>Integration Device Mapper LVM for A/B Partition&lt;/li>
&lt;li>Linux Container OCI images to provison/flash A/B Paritions&lt;/li>
&lt;li>Developed &lt;code>abroot&lt;/code> utility for A/B Partition management&lt;/li>
&lt;li>APX (Distrobox) integration for container workflows, with multiple Linux flavors&lt;/li>
&lt;li>No &lt;code>sudo&lt;/code>. Everything done via &lt;code>pkexec&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>But the most awesome thing I liked in Vanilla OS is &lt;a href="https://github.com/rickysarraf/custom-image">custom images&lt;/a>. This allows power users to easily tinker with the developer workflow and generate new images, tailored for their specific use cases. All of this done levraging the GitHub/GitLab CI/CD workflows, which I think is just plain awesome. Given that payload is of the OCI format, the CICD workflow just generates new OCI images and publishes to a registry. And then the same is pulled to the client as an OTA.&lt;/p>
&lt;p>Hats off to this small team/community for doing such nice integration
work, ultimately producing a superb Immutable Atomic Linux Distribution
based on the Debian base.&lt;/p>
&lt;h3 id="immutable-linux">Immutable Linux&lt;/h3>
&lt;p>My primary work machine has grown over the years, being on the rolling
Debian Testing/Unstable channel. And I don&amp;rsquo;t much feel the itch ever to
format my (primary) machine so quick, no matter how great the counter
offer is.&lt;/p>
&lt;p>So that got me wondering how to have some of bling of the immutable
world that I&amp;rsquo;ve tasted (Thanks Chrome OS and Vanilla OS). With a fair
idea of what they offer in features, I drew a line to what I&amp;rsquo;d want on
my primary machine.&lt;/p>
&lt;ul>
&lt;li>read-only rootfs&lt;/li>
&lt;li>read-only /etc/&lt;/li>
&lt;/ul>
&lt;p>This also kinda hardens my systems to an extent that I can&amp;rsquo;t
accidentally cause catastrophic damage to it.&lt;/p>
&lt;p>The feature I&amp;rsquo;m letting go of is the A/B Partition (rpm-ostree for Fedora
land). While a good feature, having to integrate it into my current
machine is going to be very very challenging.&lt;/p>
&lt;p>I actually feel that, the core assumption the Immutable Distros make,
that all hardware is going to &lt;code>Just Work&lt;/code>, is flawed. While Linux has
substantially improved over the past years, there&amp;rsquo;s still a hit/miss
when introducing very recent hardware.&lt;/p>
&lt;p>Immutable Linux is targeted for the novice user, who won&amp;rsquo;t accidentally
mess with the system. But what would the novice user do in case they
have issues with their recently purchased hardware, that they are
attempting to run (Immutable) Linux on.&lt;/p>
&lt;h3 id="riteshs-immutable-debian">Ritesh&amp;rsquo;s Immutable Debian&lt;/h3>
&lt;p>With the premise set, on to sailing in immutable land.&lt;/p>
&lt;p>There&amp;rsquo;s another ground breaking innovation that has been happening;
which I think everyone is aware of. And may be using it as well, direct
or indirect.&lt;/p>
&lt;p>&lt;em>Artificial Intelligence&lt;/em>&lt;/p>
&lt;p>While I&amp;rsquo;ve only been a user for a couple of months as I draft this post,
I&amp;rsquo;m now very much impressed with all this innovation. Being at the
consumer end has me appreciating it for what it has offered thus far.
And I haven&amp;rsquo;t even scratched the surface. I&amp;rsquo;m making attempts at
developing understanding of &lt;em>Machine Learning&lt;/em> and &lt;em>Artificial
Intelligence&lt;/em> but there&amp;rsquo;s a looonnngg way to go still.&lt;/p>
&lt;p>What I&amp;rsquo;m appreciating the most is the availability of the AI Technology.
It has helped me be more efficient. And thus I get to use the gain
(time) with family.&lt;/p>
&lt;p>To wrap, what I tailored my primary OS to, wouldn&amp;rsquo;t have been possible
without assistance from AI.&lt;/p>
&lt;p>With that, I disclaim that the rest of this article is primarily drafted
by my AI Companion. This is going to serve me as a reference for future,
when I forget about how all of this was structured.&lt;/p>
&lt;h1 id="-system-architecture-immutable-debian-btrfs--mergerfs">🏗️ System Architecture: Immutable Debian (Btrfs + MergerFS)&lt;/h1>
&lt;p>This system is a custom-hardened &lt;strong>Immutable Workstation&lt;/strong> based on Debian Testing/Unstable. It utilizes native Btrfs properties and surgical VFS mounting to isolate the Operating System from persistent data.&lt;/p>
&lt;h2 id="1-storage-strategy-subvolume-isolation">1. Storage Strategy: Subvolume Isolation&lt;/h2>
&lt;p>The system resides on a LUKS-encrypted NVMe partition, using a flattened subvolume layout to separate the &amp;ldquo;Gold Master&amp;rdquo; OS from volatile and persistent data.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Mount Point&lt;/th>
&lt;th style="text-align:left">Subvolume Path&lt;/th>
&lt;th style="text-align:left">State&lt;/th>
&lt;th style="text-align:left">Purpose&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;code>/&lt;/code>&lt;/td>
&lt;td style="text-align:left">&lt;code>/ROOTVOL&lt;/code>&lt;/td>
&lt;td style="text-align:left">&lt;strong>RO&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The core OS image.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>/etc&lt;/code>&lt;/td>
&lt;td style="text-align:left">&lt;code>/ROOTVOL/etc&lt;/code>&lt;/td>
&lt;td style="text-align:left">&lt;strong>RO&lt;/strong>&lt;/td>
&lt;td style="text-align:left">System configuration (Snapshot-capable).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>/home/rrs&lt;/code>&lt;/td>
&lt;td style="text-align:left">&lt;code>/ROOTVOL/home/rrs&lt;/code>&lt;/td>
&lt;td style="text-align:left">&lt;strong>RW&lt;/strong>&lt;/td>
&lt;td style="text-align:left">User data and Kitty terminal configs.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>/var/lib&lt;/code>&lt;/td>
&lt;td style="text-align:left">&lt;code>/ROOTVOL/var/lib&lt;/code>&lt;/td>
&lt;td style="text-align:left">&lt;strong>RW&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Docker, Apt state, and system DBs.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>/var/spool&lt;/code>&lt;/td>
&lt;td style="text-align:left">&lt;code>/ROOTVOL/var/spool&lt;/code>&lt;/td>
&lt;td style="text-align:left">&lt;strong>RW&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Mail queues and service state.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>/swap&lt;/code>&lt;/td>
&lt;td style="text-align:left">&lt;code>/ROOTVOL/swap&lt;/code>&lt;/td>
&lt;td style="text-align:left">&lt;strong>RW&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Isolated path for No_COW Swapfile.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>/disk-tmp&lt;/code>&lt;/td>
&lt;td style="text-align:left">&lt;code>/ROOTVOL/disk-tmp&lt;/code>&lt;/td>
&lt;td style="text-align:left">&lt;strong>RW&lt;/strong>&lt;/td>
&lt;td style="text-align:left">MergerFS overflow tier.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="11-etcfstab">1.1 /etc/fstab&lt;/h3>
&lt;pre tabindex="0">&lt;code>❯ cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use &amp;#39;blkid&amp;#39; to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# &amp;lt;file system&amp;gt; &amp;lt;mount point&amp;gt; &amp;lt;type&amp;gt; &amp;lt;options&amp;gt; &amp;lt;dump&amp;gt; &amp;lt;pass&amp;gt;
# --- ROOT &amp;amp; BOOT ---
/dev/mapper/nvme0n1p3_crypt / btrfs autodefrag,compress=zstd,discard=async,noatime,defaults,ro 0 0
/dev/nvme0n1p2 /boot ext4 defaults 0 2
/dev/nvme0n1p1 /boot/efi vfat umask=0077 0 1
# --- SWAP ---
# Mount the &amp;#34;Portal&amp;#34; to the swap subvolume using UUID (Robust)
UUID=4473b40b-bb46-43d6-b69c-ef17bfcac41c /swap btrfs subvol=/ROOTVOL/swap,defaults,noatime 0 0
# Activate the swap file by path (Correct for files)
/swap/swapfile none swap defaults 0 0
# --- DATA / MEDIA ---
UUID=439e297a-96a5-4f81-8b3a-24559839539d /media/rrs/TOSHIBA btrfs noauto,compress=zstd,space_cache=v2,subvolid=5,subvol=/,user
# --- MERGERFS ---
# --- DISK-TMP (MergerFS Overflow Tier) ---
# Ensure this ID matches your actual disk-tmp subvolume
UUID=4473b40b-bb46-43d6-b69c-ef17bfcac41c /disk-tmp btrfs subvolid=417,discard=async,defaults,noatime,compress=zstd 0 0
tmpfs /ram-tmp tmpfs defaults 0 0
/ram-tmp:/disk-tmp /tmp fuse.mergerfs x-systemd.requires=/ram-tmp,x-systemd.requires=/disk-tmp,defaults,allow_other,use_ino,nonempty,minfreespace=1G,category.create=all,moveonenospc=true 0 0
# --- IMMUTABILITY PERSISTENCE LAYERS ---
# We explicitly mount these subvolumes so they remain Writable later.
# UUID is the same as your /var/lib entry (your main Btrfs volume).
# 1. /var/lib (Docker, Apt state) - ID 50659
UUID=4473b40b-bb46-43d6-b69c-ef17bfcac41c /var/lib btrfs subvolid=50659,discard=async,defaults,noatime,compress=zstd 0 0
# 2. /home/rrs (User Data) - ID 13032
UUID=4473b40b-bb46-43d6-b69c-ef17bfcac41c /home/rrs btrfs subvolid=13032,discard=async,defaults,noatime,compress=zstd 0 0
# 3. /etc (System Config) - ID 13030
UUID=4473b40b-bb46-43d6-b69c-ef17bfcac41c /etc btrfs subvolid=13030,discard=async,defaults,noatime,compress=zstd,ro 0 0
# 4. /var/log (Logs) - ID 406
UUID=4473b40b-bb46-43d6-b69c-ef17bfcac41c /var/log btrfs subvolid=406,discard=async,defaults,noatime,compress=zstd 0 0
# 5. /var/cache (Apt Cache) - ID 409
UUID=4473b40b-bb46-43d6-b69c-ef17bfcac41c /var/cache btrfs subvolid=409,discard=async,defaults,noatime,compress=zstd 0 0
# 6. /var/tmp (Temp files) - ID 401
UUID=4473b40b-bb46-43d6-b69c-ef17bfcac41c /var/tmp btrfs subvolid=401,discard=async,defaults,noatime,compress=zstd 0 0
# /var/spool
UUID=4473b40b-bb46-43d6-b69c-ef17bfcac41c /var/spool btrfs subvolid=50689,discard=async,defaults,noatime,compress=zstd 0 0
&lt;/code>&lt;/pre>&lt;h2 id="2-tiered-memory-model-tmp">2. Tiered Memory Model (/tmp)&lt;/h2>
&lt;p>To balance performance and capacity, &lt;code>/tmp&lt;/code> is managed via &lt;strong>MergerFS&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Tier 1 (RAM):&lt;/strong> &lt;code>tmpfs&lt;/code> mounted at &lt;code>/ram-tmp&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Tier 2 (Disk):&lt;/strong> Btrfs subvolume mounted at &lt;code>/disk-tmp&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Logic:&lt;/strong> Files are written to RAM first. If RAM falls below 1GB available, files spill over to the Btrfs disk tier.&lt;/li>
&lt;/ul>
&lt;h2 id="3-hibernation--swap-logic">3. Hibernation &amp;amp; Swap Logic&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Size:&lt;/strong> 33 GiB (Configured for Suspend-to-Disk with 24GB RAM).&lt;/li>
&lt;li>&lt;strong>Attribute:&lt;/strong> The &lt;code>/swap&lt;/code> subvolume is marked &lt;strong>No_COW (+C)&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>Kernel Integration:&lt;/strong>
&lt;ul>
&lt;li>&lt;code>resume=UUID=...&lt;/code> (Points to the unlocked LUKS container).&lt;/li>
&lt;li>&lt;code>resume_offset=...&lt;/code> (Physical extent mapping for Btrfs).&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="31-systemd-sleephibernation">3.1 systemd sleep/Hibernation&lt;/h3>
&lt;pre tabindex="0">&lt;code>❯ cat /etc/systemd/sleep.conf.d/sleep.conf
[Sleep]
HibernateDelaySec=12min
&lt;/code>&lt;/pre>&lt;p>and&lt;/p>
&lt;pre tabindex="0">&lt;code>❯ cat /etc/systemd/logind.conf.d/logind.conf
[Login]
HandleLidSwitch=suspend-then-hibernate
HandlePowerKey=suspend-then-hibernate
HandleSuspendKey=suspend-then-hibernate
SleepOperation==suspend-then-hibernate
&lt;/code>&lt;/pre>&lt;h2 id="4-immutability--safety-mechanisms">4. Immutability &amp;amp; Safety Mechanisms&lt;/h2>
&lt;p>The system state is governed by two key components:&lt;/p>
&lt;h3 id="a-the-control-script-immutectl">A. The Control Script (&lt;code>immutectl&lt;/code>)&lt;/h3>
&lt;p>Handles the state transition by flipping Btrfs properties and VFS mount flags in the correct order.&lt;/p>
&lt;ul>
&lt;li>&lt;code>sudo immutectl unlock&lt;/code>: Sets &lt;code>ro=false&lt;/code> and remounts &lt;code>rw&lt;/code>.&lt;/li>
&lt;li>&lt;code>sudo immutectl lock&lt;/code>: Sets &lt;code>ro=true&lt;/code> and remounts &lt;code>ro&lt;/code>.&lt;/li>
&lt;/ul>
&lt;pre tabindex="0">&lt;code>❯ cat /usr/local/bin/immutectl
#!/bin/bash
# Ensure script is run as root
if [[ $EUID -ne 0 ]]; then
echo &amp;#34;This script must be run as root (sudo).&amp;#34;
exit 1
fi
ACTION=$1
case $ACTION in
unlock)
echo &amp;#34;🔓 Unlocking / and /etc for maintenance...&amp;#34;
# 1. First, tell the Kernel to allow writes to the mount point
mount -o remount,rw /
mount -o remount,rw /etc
# 2. Now that the VFS is RW, Btrfs will allow you to change the property
btrfs property set / ro false
btrfs property set /etc ro false
echo &amp;#34;Status: System is now READ-WRITE.&amp;#34;
;;
lock)
echo &amp;#34;🔒 Locking / and /etc (Immutable Mode)...&amp;#34;
sync
btrfs property set / ro true
btrfs property set /etc ro true
# We still attempt remount, but we ignore failure since Property is the Hard Lock
mount -o remount,ro / 2&amp;gt;/dev/null
mount -o remount,ro /etc 2&amp;gt;/dev/null
echo &amp;#34;Status: System is now READ-ONLY (Btrfs Property Set).&amp;#34;
;;
status)
echo &amp;#34;--- System Immutability Status ---&amp;#34;
for dir in &amp;#34;/&amp;#34; &amp;#34;/etc&amp;#34;; do
# Get VFS state
VFS_STATE=$(grep &amp;#34; $dir &amp;#34; /proc/mounts | awk &amp;#39;{print $4}&amp;#39; | cut -d, -f1)
# Get Btrfs Property state
BTRFS_PROP=$(btrfs property get &amp;#34;$dir&amp;#34; ro | cut -d= -f2)
# Determine overall health
if [[ &amp;#34;$BTRFS_PROP&amp;#34; == &amp;#34;true&amp;#34; ]]; then
FINAL_STATUS=&amp;#34;LOCKED (RO)&amp;#34;
else
FINAL_STATUS=&amp;#34;UNLOCKED (RW)&amp;#34;
fi
echo &amp;#34;Path: $dir&amp;#34;
echo &amp;#34; - VFS Layer (Mount): $VFS_STATE&amp;#34;
echo &amp;#34; - Btrfs Property: ro=$BTRFS_PROP&amp;#34;
echo &amp;#34; - Effective State: $FINAL_STATUS&amp;#34;
# Check for mismatch (The &amp;#34;Busy&amp;#34; scenario)
if [[ &amp;#34;$VFS_STATE&amp;#34; == &amp;#34;rw&amp;#34; &amp;amp;&amp;amp; &amp;#34;$BTRFS_PROP&amp;#34; == &amp;#34;true&amp;#34; ]]; then
echo &amp;#34; ⚠️ NOTICE: VFS is RW but Btrfs is RO. System is effectively Immutable.&amp;#34;
fi
echo &amp;#34;&amp;#34;
done
;;
*)
echo &amp;#34;Usage: $0 {lock|unlock|status}&amp;#34;
exit 1
;;
esac
&lt;/code>&lt;/pre>&lt;h3 id="b-the-smart-seal-immutability-sealservice">B. The Smart Seal (&lt;code>immutability-seal.service&lt;/code>)&lt;/h3>
&lt;p>A systemd one-shot service that ensures the system is locked on boot.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Fail-safe:&lt;/strong> The service checks &lt;code>/proc/cmdline&lt;/code> for the standalone word &lt;code>rw&lt;/code>. If found (via GRUB manual override), the seal is aborted to allow emergency maintenance.&lt;/li>
&lt;/ul>
&lt;pre tabindex="0">&lt;code>❯ cat /etc/systemd/system/immutability-seal.service
[Unit]
Description=Ensure Btrfs Immutable Properties are set on Boot (unless rw requested)
DefaultDependencies=no
After=systemd-remount-fs.service
Before=local-fs.target
# Don&amp;#39;t run in emergency/rescue modes
#ConditionPathExists=!/run/systemd/seats/seat0
[Service]
Type=oneshot
# The robust check: exit if &amp;#39;rw&amp;#39; exists as a standalone word
ExecStartPre=/bin/sh -c &amp;#39;! grep -qE &amp;#34;\brw\b&amp;#34; /proc/cmdline&amp;#39;
ExecStartPre=mount -o remount,rw /
ExecStart=/usr/bin/btrfs property set / ro true
ExecStart=/usr/bin/btrfs property set /etc ro true
ExecStartPost=mount -o remount,ro /
RemainAfterExit=yes
[Install]
WantedBy=local-fs.target
&lt;/code>&lt;/pre>&lt;h2 id="5-monitoring--maintenance">5. Monitoring &amp;amp; Maintenance&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Nagging:&lt;/strong> A systemd user-timer runs &lt;code>immutability-nag&lt;/code> every 15 minutes to notify the desktop session if the system is currently in an &amp;ldquo;Unlocked&amp;rdquo; state.&lt;/li>
&lt;li>&lt;strong>Verification:&lt;/strong> Use &lt;code>sudo immutectl status&lt;/code> to verify that both the VFS Layer and Btrfs Properties are in sync.&lt;/li>
&lt;/ul>
&lt;h3 id="51-nagging">5.1 Nagging&lt;/h3>
&lt;pre tabindex="0">&lt;code>❯ cat ~/bin/immutability-nag
#!/bin/bash
# Check Btrfs property
BTRFS_STATUS=$(btrfs property get / ro | cut -d= -f2)
if [[ &amp;#34;$BTRFS_STATUS&amp;#34; == &amp;#34;false&amp;#34; ]]; then
# Use notify-send (Standard, fast, non-intrusive)
notify-send -u critical -i security-low \
&amp;#34;🔓 System Unlocked&amp;#34; \
&amp;#34;Root is currently WRITABLE. Run &amp;#39;immutectl lock&amp;#39; when finished.&amp;#34;
fi
&lt;/code>&lt;/pre>&lt;p>and&lt;/p>
&lt;pre tabindex="0">&lt;code>❯ usystemctl cat immutability-nag.service
# /home/rrs/.config/systemd/user/immutability-nag.service
[Unit]
Description=Check Btrfs immutability and notify user
# Ensure it doesn&amp;#39;t run before the graphical session is ready
After=graphical-session.target
[Service]
Type=oneshot
ExecStart=%h/bin/immutability-nag
# Standard environment for notify-send to find the DBus session
Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%U/bus
[Install]
WantedBy=default.target
   ~   20:35:15
❯ usystemctl cat immutability-nag.timer
# /home/rrs/.config/systemd/user/immutability-nag.timer
[Unit]
Description=Check immutability every 15 mins
[Timer]
OnStartupSec=5min
OnUnitActiveSec=15min
[Install]
WantedBy=timers.target
&lt;/code>&lt;/pre>&lt;p>And the resultant nag in action.
&lt;link rel="stylesheet" href="https://researchut.com/css/hugo-easy-gallery.css" />
&lt;div class="box" >
&lt;figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">
&lt;div class="img">
&lt;img itemprop="thumbnail" src="https://researchut.com/images/immutable-seal.jpeg" alt="Immutable Debian Nag"/>
&lt;/div>
&lt;a href="https://researchut.com/images/immutable-seal.jpeg" itemprop="contentUrl">&lt;/a>
&lt;figcaption>&lt;h4>Immutable Debian Nag&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;/div>
&lt;/p>
&lt;h3 id="52-verification">5.2 Verification&lt;/h3>
&lt;pre tabindex="0">&lt;code>❯ sudo immutectl status
[sudo] password for rrs:
--- System Immutability Status ---
Path: /
- VFS Layer (Mount): rw
- Btrfs Property: ro=false
- Effective State: UNLOCKED (RW)
Path: /etc
- VFS Layer (Mount): rw
- Btrfs Property: ro=false
- Effective State: UNLOCKED (RW)
   ~   21:14:08
❯ sudo immutectl lock
🔒 Locking / and /etc (Immutable Mode)...
Status: System is now READ-ONLY (Btrfs Property Set).
   ~   21:14:15
❯ sudo immutectl status
--- System Immutability Status ---
Path: /
- VFS Layer (Mount): rw
- Btrfs Property: ro=true
- Effective State: LOCKED (RO)
⚠️ NOTICE: VFS is RW but Btrfs is RO. System is effectively Immutable.
Path: /etc
- VFS Layer (Mount): rw
- Btrfs Property: ro=true
- Effective State: LOCKED (RO)
⚠️ NOTICE: VFS is RW but Btrfs is RO. System is effectively Immutable.
&lt;/code>&lt;/pre>&lt;hr>
&lt;p>&lt;strong>Date Configured:&lt;/strong> December 2025&lt;br>
&lt;strong>Philosophy:&lt;/strong> The OS is a diagnostic tool. If an application fails to write to a locked path, the application is the variable, not the system.&lt;/p>
&lt;h2 id="wrap">Wrap&lt;/h2>
&lt;p>Overall, I&amp;rsquo;m very very happy with, the result of a day of working
together with AI. I wouldn&amp;rsquo;t have gotten things done so quick in such
time if it wasn&amp;rsquo;t around. Such great is this age of AI.&lt;/p></description></item><item><title>KDE PowerDevil Systemd Inhibit</title><link>https://researchut.com/blog/KDE_PowerDevil_systemd_inhibitors/</link><pubDate>Tue, 28 Oct 2025 00:00:00 +0000</pubDate><author>rrs@researchut.com (Ritesh Raj Sarraf)</author><guid>https://researchut.com/blog/KDE_PowerDevil_systemd_inhibitors/</guid><description>&lt;p>With KDE 6.5.0, PowerDevil has &lt;del>broken&lt;/del> forced its own set of
suspend/hibernate inhibitors onto logind. And to my knowledge, there&amp;rsquo;s no way to disable them.&lt;/p>
&lt;!-- raw HTML omitted -->
&lt;!-- raw HTML omitted -->
&lt;link rel="stylesheet" href="https://researchut.com/css/hugo-easy-gallery.css" />
&lt;div class="box" >
&lt;figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">
&lt;div class="img">
&lt;img itemprop="thumbnail" src="https://researchut.com/images/powerdevil-logind-inhibitors.jpeg" alt="KDE PowerDevil Settings Window"/>
&lt;/div>
&lt;a href="https://researchut.com/images/powerdevil-logind-inhibitors.jpeg" itemprop="contentUrl">&lt;/a>
&lt;/figure>
&lt;/div>
&lt;p>As a user, I&amp;rsquo;d prefer to set lid action as &lt;code>Do nothing&lt;/code> and really
expect KDE/PowerDevil to do nothing in that regard.
But with KDE 6.5.0 PowerDevil forces those inhibitors whatsoever.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>❯ systemd-inhibit --list
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>WHO UID USER PID COMM WHAT WHY &amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ModemManager &lt;span style="color:#ae81ff">0&lt;/span> root &lt;span style="color:#ae81ff">3541&lt;/span> ModemManager sleep ModemManager needs to reset devices &amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>NetworkManager &lt;span style="color:#ae81ff">0&lt;/span> root &lt;span style="color:#ae81ff">3453&lt;/span> NetworkManager sleep NetworkManager needs to turn off networks &amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>UPower &lt;span style="color:#ae81ff">0&lt;/span> root &lt;span style="color:#ae81ff">4342&lt;/span> upowerd sleep Pause device polling &amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>PowerDevil &lt;span style="color:#ae81ff">1000&lt;/span> rrs &lt;span style="color:#ae81ff">82735&lt;/span> org_kde_powerde handle-power-key:handle-suspend-key:handle-hibernate-key:handle-lid-switch KDE handles power events &amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Screen Locker &lt;span style="color:#ae81ff">1000&lt;/span> rrs &lt;span style="color:#ae81ff">4844&lt;/span> kwin_wayland sleep Ensuring that the screen gets locked before going to sleep &amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">5&lt;/span> inhibitors listed.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This essentially prohibits logind to act on the lid actions. And instead forces the user to depend on nothing else and other than PowerDevil. This assumes the wishful thought that PowerDevil is Solid.&lt;/p>
&lt;p>I&amp;rsquo;d love to continue using my suspend workflow via systemd&amp;rsquo;s
&lt;code>suspend-then-hibernate&lt;/code> target as it has been working reliably for years. And
it also allows me to customize the behavior as I see fit.&lt;/p>
&lt;p>Of course, I do have the option to trigger &lt;code>systemd suspend-then-hibernate&lt;/code> manually, every time, before closing the lid. But
computers and automation has spoilt things.&lt;/p>
&lt;p>The quick workaround/fix is to delegate it to ACPI, on platforms that
support it. Thankfully all of x86 to my knowledge.&lt;/p>
&lt;p>So, in ACPI actions I&amp;rsquo;ve a new config set to:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>❯ cat /etc/acpi/actions/lm_lid.sh
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#! /bin/sh&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>grep close /proc/acpi/button/lid/LID/state &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> systemctl suspend-then-hibernate
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>And with that I can be back to reliably (and carelessly)
&lt;code>suspend-then-hibernate&lt;/code> my laptop.&lt;/p></description></item><item><title>apt-offline 1.8.6</title><link>https://researchut.com/blog/apt_offline_186/</link><pubDate>Wed, 26 Feb 2025 18:56:04 +0530</pubDate><author>rrs@researchut.com (Ritesh Raj Sarraf)</author><guid>https://researchut.com/blog/apt_offline_186/</guid><description>&lt;h2 id="apt-offline-186">apt-offline 1.8.6&lt;/h2>
&lt;p>&lt;em>&lt;strong>apt-offline&lt;/strong>&lt;/em> version 1.8.6 was released almost 3 weeks ago on 08/February/2025&lt;/p>
&lt;p>This release includes many bug fixes from community users.&lt;/p>
&lt;ul>
&lt;li>Error out if we cannot initialize the APT lock.
Thanks to Matthew Maslak&lt;/li>
&lt;li>check for checksum and handle appropriately (#217)
Thanks to Dan Whitman (Github:kyp44)&lt;/li>
&lt;li>Honor the &amp;ndash;allow-unauthenticated option.
Thanks to João A (Github: Jonybat)&lt;/li>
&lt;li>Retry when server reports 429 Too Many Requests occurs.
Thanks to Zoltan Kelemen (Github: misterzed88)&lt;/li>
&lt;li>Also support file:/// url types.
Thanks to c4bhuf@github&lt;/li>
&lt;li>Honor user specified extra gpg keyrings&lt;/li>
&lt;/ul>
&lt;h3 id="changelog">Changelog&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>apt-offline (1.8.6-1) unstable; urgency=medium
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Error out if we cannot initialize the APT lock.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Thanks to Matthew Maslak
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * check for checksum and handle appropriately (#217)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Thanks to Dan Whitman (Github:kyp44)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Honor the --allow-unauthenticated option.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Thanks to João A (Github: Jonybat)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Retry when server reports 429 Too Many Requests occurs.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Thanks to Zoltan Kelemen (Github: misterzed88)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Also support file:/// url types.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Thanks to c4bhuf@github
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Honor user specified extra gpg keyrings
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> -- Ritesh Raj Sarraf &amp;lt;rrs@debian.org&amp;gt; Sat, 08 Feb 2025 20:46:24 +0530
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="resources">Resources&lt;/h3>
&lt;ul>
&lt;li>Tarball and Zip archive for &lt;em>&lt;strong>apt-offline&lt;/strong>&lt;/em> are available &lt;a href="https://github.com/rickysarraf/apt-offline/releases/tag/v1.8.6">here&lt;/a>&lt;/li>
&lt;li>Packages should be &lt;a href="https://packages.debian.org/apt-offline">available&lt;/a> in Debian.&lt;/li>
&lt;li>Development for &lt;em>&lt;strong>apt-offline&lt;/strong>&lt;/em> is currently hosted &lt;a href="https://github.com/rickysarraf/apt-offline">here&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Systemd Service Hang</title><link>https://researchut.com/blog/Systemd_Service_Hang/</link><pubDate>Fri, 22 Apr 2022 00:00:00 +0000</pubDate><author>rrs@researchut.com (Ritesh Raj Sarraf)</author><guid>https://researchut.com/blog/Systemd_Service_Hang/</guid><description>&lt;p>Finally, TIL, what can all be the reason for systemd services to hang indefinitely. The internet is flooded with numerous reports on this topic but no clear answers. So no more uselessly marked workarounds like: &lt;code>systemctl daemon-reload&lt;/code> and &lt;code>systemctl-daemon-reexec&lt;/code> for this scenario.&lt;/p>
&lt;p>The scene would be something along the lines of:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>rrs &lt;span style="color:#ae81ff">6467&lt;/span> 0.0 0.0 &lt;span style="color:#ae81ff">23088&lt;/span> &lt;span style="color:#ae81ff">15852&lt;/span> pts/1 Ss 12:53 0:00 | | &lt;span style="color:#ae81ff">\_&lt;/span> /bin/bash
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rrs &lt;span style="color:#ae81ff">11512&lt;/span> 0.0 0.0 &lt;span style="color:#ae81ff">14876&lt;/span> &lt;span style="color:#ae81ff">4608&lt;/span> pts/1 S+ 13:18 0:00 | | | &lt;span style="color:#ae81ff">\_&lt;/span> systemctl restart snapper-timeline.timer
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rrs &lt;span style="color:#ae81ff">11513&lt;/span> 0.0 0.0 &lt;span style="color:#ae81ff">14984&lt;/span> &lt;span style="color:#ae81ff">3076&lt;/span> pts/1 S+ 13:18 0:00 | | | &lt;span style="color:#ae81ff">\_&lt;/span> /bin/systemd-tty-ask-password-agent --watch
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rrs &lt;span style="color:#ae81ff">11514&lt;/span> 0.0 0.0 &lt;span style="color:#ae81ff">234756&lt;/span> &lt;span style="color:#ae81ff">6752&lt;/span> pts/1 Sl+ 13:18 0:00 | | | &lt;span style="color:#ae81ff">\_&lt;/span> /usr/bin/pkttyagent --notify-fd &lt;span style="color:#ae81ff">5&lt;/span> --fallback
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>snapper-timeline&lt;/code> service is important to me and it not running for months is a complete failure. Disappointingly, commands like &lt;code>systemctl --failed&lt;/code> do not report of this oddity. The overall system status is reported to be fine, which is completely incorrect.&lt;/p>
&lt;p>Thankfully, a kind soul&amp;rsquo;s &lt;a href="https://github.com/NixOS/nixpkgs/issues/2584#issuecomment-42616675">comment&lt;/a> gave the hint. The problem is that you could be having certain services in &lt;code>Activating&lt;/code> status, which thus blocks all other services; quietly. So much for the unnecessary fun.&lt;/p>
&lt;p>Looking further, in my case, it was:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>rrs@priyasi:~$ systemctl list-jobs
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>JOB UNIT TYPE STATE
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">81&lt;/span> timers.target start waiting
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">85&lt;/span> man-db.timer start waiting
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">88&lt;/span> fstrim.timer start waiting
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">3832&lt;/span> snapper-timeline.service start waiting
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">83&lt;/span> snapper-timeline.timer start waiting
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">39&lt;/span> systemd-time-wait-sync.service start running
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">87&lt;/span> logrotate.timer start waiting
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">84&lt;/span> debspawn-clear-caches.timer start waiting
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">89&lt;/span> plocate-updatedb.timer start waiting
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">91&lt;/span> dpkg-db-backup.timer start waiting
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">93&lt;/span> e2scrub_all.timer start waiting
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">40&lt;/span> time-sync.target start waiting
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">86&lt;/span> apt-listbugs.timer start waiting
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">13&lt;/span> jobs listed.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>13:12 ♒ ॐ ♅ ♄ ⛢ ☺ 😄
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>That was it. I knew the &lt;code>systemd-timesyncd&lt;/code> service, in the past, had given me enough headaches. And so was it this time, just quietly doing it all again.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>rrs@priyasi:~$ systemctl status systemd-time-wait-sync.service
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>● systemd-time-wait-sync.service - Wait Until Kernel Time Synchronized
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Loaded: loaded &lt;span style="color:#f92672">(&lt;/span>/lib/systemd/system/systemd-time-wait-sync.service; enabled; vendor preset&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Active: activating &lt;span style="color:#f92672">(&lt;/span>start&lt;span style="color:#f92672">)&lt;/span> since Fri 2022-04-22 13:14:25 IST; 1min 38s ago
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Docs: man:systemd-time-wait-sync.service&lt;span style="color:#f92672">(&lt;/span>8&lt;span style="color:#f92672">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Main PID: &lt;span style="color:#ae81ff">11090&lt;/span> &lt;span style="color:#f92672">(&lt;/span>systemd-time-wa&lt;span style="color:#f92672">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Tasks: &lt;span style="color:#ae81ff">1&lt;/span> &lt;span style="color:#f92672">(&lt;/span>limit: 37051&lt;span style="color:#f92672">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Memory: 836.0K
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> CPU: 7ms
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> CGroup: /system.slice/systemd-time-wait-sync.service
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> └─11090 /lib/systemd/systemd-time-wait-sync
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Apr &lt;span style="color:#ae81ff">22&lt;/span> 13:14:25 priyasi systemd&lt;span style="color:#f92672">[&lt;/span>1&lt;span style="color:#f92672">]&lt;/span>: Starting Wait Until Kernel Time Synchronized...
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Apr &lt;span style="color:#ae81ff">22&lt;/span> 13:14:25 priyasi systemd-time-wait-sync&lt;span style="color:#f92672">[&lt;/span>11090&lt;span style="color:#f92672">]&lt;/span>: adjtime state &lt;span style="color:#ae81ff">5&lt;/span> status &lt;span style="color:#ae81ff">40&lt;/span> time Fri 2022-&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>13:16 ♒ ॐ ♅ ♄ ⛢ ☹ 😟&lt;span style="color:#f92672">=&lt;/span>&amp;gt; &lt;span style="color:#ae81ff">3&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Dear LazyWeb, anybody knows of why the &lt;code>systemd-time-wait-sync&lt;/code> service would hang indefinitely? I&amp;rsquo;ve had identical setups on many machines, in the same network, where others don&amp;rsquo;t exhibit this problem.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>rrs@priyasi:~$ systemctl cat systemd-time-wait-sync.service
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>...snipped...
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">[&lt;/span>Service&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Type&lt;span style="color:#f92672">=&lt;/span>oneshot
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ExecStart&lt;span style="color:#f92672">=&lt;/span>/lib/systemd/systemd-time-wait-sync
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>TimeoutStartSec&lt;span style="color:#f92672">=&lt;/span>infinity
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>RemainAfterExit&lt;span style="color:#f92672">=&lt;/span>yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">[&lt;/span>Install&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>WantedBy&lt;span style="color:#f92672">=&lt;/span>sysinit.target
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>TimeoutStartSec=infinity&lt;/code> is definitely an attribute that shouldn&amp;rsquo;t be shipped in any system services. There are use cases for it but that should be left for local admins to explicitly decide. Hanging for &lt;code>infinity&lt;/code> is not a desired behavior for a system service.&lt;/p>
&lt;p>In figuring all this out, today I learnt the handy &lt;code>systemctl list-jobs&lt;/code> command, which will give the list of active &lt;code>running/blocked/waiting&lt;/code> jobs.&lt;/p>
&lt;h2 id="update-2024-08-15">Update: 2024-08-15&lt;/h2>
&lt;p>This week I finally found the cause of the issue. I have a bunch of bridge interfaces defined on my machine. And all of them, most of their time, would be &lt;code>DOWN&lt;/code>&lt;/p>
&lt;pre tabindex="0">&lt;code>
@ ip a
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: withnet: &amp;lt;NO-CARRIER,BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether XXXXXXXXXXXXXXXXX brd ff:ff:ff:ff:ff:ff
3: nonet: &amp;lt;NO-CARRIER,BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether XXXXXXXXXXXXXXXXX brd ff:ff:ff:ff:ff:ff
4: tap0: &amp;lt;NO-CARRIER,BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
link/ether XXXXXXXXXXXXXXXXX brd ff:ff:ff:ff:ff:ff
6: wlan0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether XXXXXXXXXXXXXXXXX brd ff:ff:ff:ff:ff:ff
inet 10.42.1.66/24 brd 10.42.1.255 scope global dynamic noprefixroute wlan0
valid_lft 5325sec preferred_lft 5325sec
inet6 fe80::9bc0:e362:7c9d:be7c/64 scope link noprefixroute
valid_lft forever preferred_lft forever
7: email-laptop: &amp;lt;POINTOPOINT,NOARP,UP,LOWER_UP&amp;gt; mtu 1280 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet XXXXXXXXXXXXXXXXX scope global noprefixroute email-laptop
valid_lft forever preferred_lft forever
inet6 XXXXXXXXXXXXXXXXX scope global noprefixroute
valid_lft forever preferred_lft forever
inet6 XXXXXXXXXXXXXXXXXXXXXXXX/64 scope link noprefixroute
valid_lft forever preferred_lft forever
⛢ 13:55:21 rrs@priyasi ~/pu/researchut-hugo researchut|+1…2
&lt;/code>&lt;/pre>&lt;p>And as it stands, that is the cause of the problem.&lt;/p>
&lt;p>&lt;code>systemd-timesyncd&lt;/code> would invoke an attempt to sync time for all the interfaces defined under &lt;code>systemd-networkd&lt;/code>. And given the setup, that is bound to &lt;del>fail&lt;/del> timeout; which is why I had added the override against:&lt;/p>
&lt;pre tabindex="0">&lt;code>TimeoutStartSec=infinity
&lt;/code>&lt;/pre>&lt;p>So, apparently, for every interface in &lt;code>networkd&lt;/code>, it&amp;rsquo;d attempt the ntp sync. It reports along the lines of:&lt;/p>
&lt;pre tabindex="0">&lt;code>Aug 15 13:24:06 priyasi systemd-timesyncd[1987]: Network configuration changed, trying to establish connection.
&lt;/code>&lt;/pre>&lt;p>So I learnt this week, of the attribute to handle this:&lt;/p>
&lt;pre tabindex="0">&lt;code>@ cat sysbr0.network
[Match]
Name=withnet
[Network]
DHCPServer=yes
IPv4Forwarding=yes
IPv6Forwarding=yes
IPMasquerade=both
Address=192.168.1.1/24
LLMNR=yes
[Link]
RequiredForOnline=no
#[DHCPServer]
#DNS=192.168.1.1
&lt;/code>&lt;/pre>&lt;p>With that, NTP time synchronization is back to what it should be. Precision synchronization of the system time.&lt;/p>
&lt;pre tabindex="0">&lt;code>ॐ 14:11:35 rrs@priyasi /etc/systemd/network
@ timedatectl show
LocalRTC=no
CanNTP=yes
NTP=yes
NTPSynchronized=yes
TimeUSec=Thu 2024-08-15 14:12:45 IST
RTCTimeUSec=Thu 2024-08-15 14:12:45 IST
&lt;/code>&lt;/pre></description></item><item><title>Btrfs Subvol Fix</title><link>https://researchut.com/blog/BTRFS_Subvol_Fix/</link><pubDate>Wed, 20 Apr 2022 22:41:53 +0530</pubDate><author>rrs@researchut.com (Ritesh Raj Sarraf)</author><guid>https://researchut.com/blog/BTRFS_Subvol_Fix/</guid><description>&lt;p>There surely is need for better tooling on the BTRFS File System side.&lt;/p>
&lt;p>While &lt;a href="https://researchut.com/blog/Thinkpad_AMD_Debian/">migrating&lt;/a> my setup from one machine to another, this is one issue I came to be aware of, only today, when my backup tool (&lt;code>btrbk&lt;/code>) complained about it. Following the pointers, I see the below snippet in &lt;code>btrfs-subvolume&lt;/code> manual page.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span> A snapshot that was created by send/receive will be read-only, with different last change generation, read-only and with set received_uuid which identifies the subvolume on the
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> filesystem that produced the stream. The usecase relies on matching data on both sides. Changing the subvolume to read-write after it has been received requires to reset the
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> received_uuid. As this is a notable change and could potentially break the incremental send use &lt;span style="color:#66d9ef">case&lt;/span>, performing it by btrfs property set requires force &lt;span style="color:#66d9ef">if&lt;/span> that is really desired by
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> user.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Note
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> The safety checks have been implemented in 5.14.2, any subvolumes previously received &lt;span style="color:#f92672">(&lt;/span>with a valid received_uuid&lt;span style="color:#f92672">)&lt;/span> and read-write status may exist and could still lead to
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> problems with send/receive. You can use btrfs subvolume show to identify them. Flipping the flags to read-only and back to read-write will reset the received_uuid manually. There
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> may exist a convenience tool in the future.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Fixing the &lt;code>Received UUID: &lt;/code> flag meant running the below:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>rrs@priyasi:.../spool$ sudo btrfs sub show /
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>WARNING: the subvolume is read-write and has received_uuid set,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> don&amp;#39;t use it for incremental send. Please see section
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;#39;SUBVOLUME FLAGS&amp;#39; in manual page btrfs-subvolume for
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> further information.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ROOTVOL
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Name: ROOTVOL
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> UUID: 122b0de1-e6f2-6845-aba0-6bf766c16526
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Parent UUID: -
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Received UUID: 34772967-c709-5146-bf20-898f7dbc2c1f
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Creation time: 2021-12-02 19:59:29 +0530
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Subvolume ID: 256
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Generation: 138473
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Gen at creation: 7
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Parent ID: 5
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Top level ID: 5
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Flags: -
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Send transid: 35245
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Send time: 2021-12-02 19:59:29 +0530
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Receive transid: 34
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Receive time: 2021-12-02 20:13:11 +0530
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Snapshot(s):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ROOTVOL/.snapshots/1/snapshot
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ROOTVOL/.snapshots/2/snapshot
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>22:40 ♒ ॐ ♅ ♄ ⛢ ☺ 😄
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rrs@priyasi:.../spool$ sudo btrfs property set / ro true
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>WARNING: read-write subvolume with received_uuid, this is bad
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>22:40 ♒ ॐ ♅ ♄ ⛢ ☺ 😄
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rrs@priyasi:.../spool$ sudo btrfs property set -f / ro false
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>22:40 ♒ ॐ ♅ ♄ ⛢ ☺ 😄
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rrs@priyasi:.../spool$ sudo btrfs sub show /
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ROOTVOL
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Name: ROOTVOL
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> UUID: 122b0de1-e6f2-6845-aba0-6bf766c16526
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Parent UUID: -
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Received UUID: -
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Creation time: 2021-12-02 19:59:29 +0530
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Subvolume ID: 256
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Generation: 138473
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Gen at creation: 7
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Parent ID: 5
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Top level ID: 5
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Flags: -
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Send transid: 0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Send time: 2021-12-02 19:59:29 +0530
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Receive transid: 138480
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Receive time: 2022-04-20 22:40:43 +0530
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Snapshot(s):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ROOTVOL/.snapshots/1/snapshot
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ROOTVOL/.snapshots/2/snapshot
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>22:40 ♒ ॐ ♅ ♄ ⛢ ☺ 😄
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Hoping there won&amp;rsquo;t be surprises in the coming months. 🤞&lt;/p></description></item><item><title>apt-offline 1.8.4</title><link>https://researchut.com/blog/apt_offline_184/</link><pubDate>Sat, 12 Feb 2022 20:47:04 +0530</pubDate><author>rrs@researchut.com (Ritesh Raj Sarraf)</author><guid>https://researchut.com/blog/apt_offline_184/</guid><description>&lt;h2 id="apt-offline-184">apt-offline 1.8.4&lt;/h2>
&lt;p>&lt;em>&lt;strong>apt-offline&lt;/strong>&lt;/em> version 1.8.4 has been released.&lt;/p>
&lt;p>This release includes many bug fixes but the important ones are:&lt;/p>
&lt;ul>
&lt;li>Better GPG signature handling&lt;/li>
&lt;li>Support for verifying InRelease files&lt;/li>
&lt;/ul>
&lt;h3 id="changelog">Changelog&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>apt-offline (1.8.4-1) unstable; urgency=medium
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [ Debian Janitor ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Update standards version to 4.5.0, no changes needed.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [ Paul Wise ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Clarify file type in unknown file message
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Fix typos
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Remove trailing whitespace
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Update LICENSE file to match official GNU version
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Complain when there are no valid keyrings instead of missing keyrings
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Make all syncrhronised files world readable
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Fix usage of indefinite articles
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Only show the APT Offline GUI once in the menu
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Update out of date URLs
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Fix date and whitespace issues in the manual page
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Replace stereotyping with an appropriate word
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Switch more Python shebangs to Python 3
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Correct usage of the /tmp/ directory
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Fix YAML files
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Fix usage of the log API
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Make the copying of changelog lines less brittle
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Do not split keyring paths on whitespace
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [ Ritesh Raj Sarraf ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Drop the redundant import of the apt module.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Thanks to github/dandelionred
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Fix deprecation of get_bugs() in debianbts
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Drop the unused IgnoredBugTypes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Set encoding for files when opening
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Better error logging when apt fails
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Don&amp;#39;t mandate a default option
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Demote metadata errors to verbose
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Also log an error message for every failed .deb url
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Check hard for the url type
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Check for ascii armored signature files.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Thanks to David Klnischkies
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Add MIME type for InRelease files
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Drop patch 0001-Drop-the-redundant-import-of-the-apt-module.patch.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Now part of the 1.8.4 release
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Prepare release 1.8.3
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * Prepare release 1.8.4
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * debian packaging
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> + Bump debhelper compatibility to 13
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> + Update install files
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [ Dean Anderson ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * [#143] Added support for verifying InRelease files
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> -- Ritesh Raj Sarraf &amp;lt;rrs@debian.org&amp;gt; Sat, 12 Feb 2022 18:52:58 +0530
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="resources">Resources&lt;/h3>
&lt;ul>
&lt;li>Tarball and Zip archive for &lt;em>&lt;strong>apt-offline&lt;/strong>&lt;/em> are available &lt;a href="https://github.com/rickysarraf/apt-offline/releases/tag/v1.8.4">here&lt;/a>&lt;/li>
&lt;li>Packages should be &lt;a href="https://packages.debian.org/apt-offline">available&lt;/a> in Debian.&lt;/li>
&lt;li>Development for &lt;em>&lt;strong>apt-offline&lt;/strong>&lt;/em> is currently hosted &lt;a href="https://github.com/rickysarraf/apt-offline">here&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>ThinkPad AMD Debian</title><link>https://researchut.com/blog/Thinkpad_AMD_Debian/</link><pubDate>Tue, 11 Jan 2022 19:37:24 +0530</pubDate><author>rrs@researchut.com (Ritesh Raj Sarraf)</author><guid>https://researchut.com/blog/Thinkpad_AMD_Debian/</guid><description>&lt;p>After a hiatus of 6 years, it was nice to be back with the ThinkPad. This blog post briefly touches upon my impressions with the current generation ThinkPad T14 Gen2 AMD variant.&lt;/p>
&lt;link rel="stylesheet" href="https://researchut.com/css/hugo-easy-gallery.css" />
&lt;div class="box" >
&lt;figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">
&lt;div class="img">
&lt;img itemprop="thumbnail" src="https://researchut.com/images/ThinkPad_T14_Gen2_AMD.jpg" alt="ThinkPad T14 Gen2 AMD"/>
&lt;/div>
&lt;a href="https://researchut.com/images/ThinkPad_T14_Gen2_AMD.jpg" itemprop="contentUrl">&lt;/a>
&lt;figcaption>&lt;h4>ThinkPad T14 Gen2 AMD&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;/div>
&lt;h3 id="lenovo">Lenovo&lt;/h3>
&lt;p>It took 8 weeks to get my hands on the machine. Given the pandemic, restrictions and uncertainities, not sure if I should call it an ontime delivery. This was a CTO - Customise-to-order; so was nice to get rid of things I really didn&amp;rsquo;t care/use much. On the other side, it also meant I could save on some power. It also came comparatively cheaper overall.&lt;/p>
&lt;ul>
&lt;li>No fingerprint reader&lt;/li>
&lt;li>No Touch screen&lt;/li>
&lt;/ul>
&lt;p>There&amp;rsquo;s still parts where Lenovo could improve. Or less frustate a customer. I don&amp;rsquo;t understand why a company would provide a full customization option on their portal, while at the same time, not provide an explicit option to choose the make/model of the hardware one wants. Lenovo deliberately chooses to not show/specify which WiFi adapter one could choose. So, as I suspected, I ended up with a &lt;code>MEDIATEK Corp. Device 7961&lt;/code> wifi adapter.&lt;/p>
&lt;h3 id="amd">AMD&lt;/h3>
&lt;p>For the first time in my computing life, I&amp;rsquo;m now using AMD at the core. I was pretty frustrated with annoying Intel Graphics bugs, so decided to take the plunge and give AMD/ATI a shot, knowing that the &lt;code>radeon&lt;/code> driver does have decent support. So far, on the graphics side of things, I&amp;rsquo;m glad that things look bright. The stock in-kernel radeon driver has been working perfect for my needs and I haven&amp;rsquo;t had to tinker even once so far, in my 30 days of use.&lt;/p>
&lt;p>On the overall system performance, I have not done any benchmarks nor do I want to do. But wholly, the system performance is smooth.&lt;/p>
&lt;h3 id="powerthermal">Power/Thermal&lt;/h3>
&lt;p>This is where things need more improvement on the AMD side. This AMD laptop terribly draws a lot of power in suspend mode. And it isn&amp;rsquo;t just this machine, but also the previous T14 Gen1 which has similar problems. I&amp;rsquo;m not sure if this is a generic ThinkPad problem, or an AMD specific problem. But coming from the Dell XPS 13 9370 Intel, this does draw a lot lot more power. So much, that I chose to use hibernation instead.&lt;/p>
&lt;p>Similarly, on the thermal side, this machine doesn&amp;rsquo;t cool down well as compared the the Dell XPS Intel one. On an idle machine, its temperature are comparatively higher. Looking at &lt;code>powertop&lt;/code> reports, it does show to consume an average of 10 watts power even while idle.&lt;/p>
&lt;p>I&amp;rsquo;m hoping these are Linux ingeration issues and that Lenovo/AMD will improve things in the coming months. But given the user feedback on the ThinkPad T14 Gen1 thread, it may just be wishful thinking.&lt;/p>
&lt;h3 id="linux">Linux&lt;/h3>
&lt;p>The overall hardware support has been surprisingly decent. The MediaTek WiFi driver had some glitches but with Linux 5.15+, things have considerably improved. And I hope the trend will continue with forthcoming Linux releases. My previous device driver experience with MediaTek wasn&amp;rsquo;t good but I took the plunge, considering that in the worst scenario I&amp;rsquo;d have the option to swap the card.&lt;/p>
&lt;p>There&amp;rsquo;s a lot of marketing about Linux + Intel. But I took a jibe with Linux + AMD. There are glitches but nothing so far that has been a dealbreaker. If anything, I wish Lenovo/AMD would seriously work on the power/thermal issues.&lt;/p>
&lt;h3 id="migration">Migration&lt;/h3>
&lt;p>Other than what&amp;rsquo;s mentioned above, I haven&amp;rsquo;t had any serious issues. I may have had some rare occassional hangs but they&amp;rsquo;ve been so infrequent that I haven&amp;rsquo;t spent time to investigate those.&lt;/p>
&lt;p>Upon receiving the machine, my biggest requirement was how to switch my current workstation from Dell XPS to Lenovo ThinkPad. I&amp;rsquo;ve been using btrfs for some time now. And over the years, built my own practise on how to structure it. Things like, provisioning [sub]volumes, based on use cases is one thing I see. Like keeping separate subvols for: cache/temporary data, copy-on-write data , swap etc. I wish these things could be simplified; either on the btrfs tooling side or some different tool on top of it.&lt;/p>
&lt;p>Below is filtered list of subvols created over years, that were worthy of moving to the new machine.&lt;/p>
&lt;pre tabindex="0">&lt;code>rrs@priyasi:~$ cat btrfs-volume-layout
ID 550 gen 19166 top level 5 path home/foo/.cache
ID 552 gen 1522688 top level 5 path home/rrs
ID 553 gen 1522688 top level 552 path home/rrs/.cache
ID 555 gen 1426323 top level 552 path home/rrs/rrs-home/Libvirt-Images
ID 618 gen 1522672 top level 5 path var/spool/news
ID 634 gen 1522670 top level 5 path var/tmp
ID 635 gen 1522688 top level 5 path var/log
ID 639 gen 1522226 top level 5 path var/cache
ID 992 gen 1522670 top level 5 path disk-tmp
ID 1018 gen 1522688 top level 552 path home/rrs/NoBackup
ID 1196 gen 1522671 top level 5 path etc
ID 23721 gen 775692 top level 5 path swap
18:54 ♒ ॐ ♅ ♄ ⛢ ☺ 😄
&lt;/code>&lt;/pre>&lt;h4 id="btrfs-sendreceive">btrfs send/receive&lt;/h4>
&lt;p>This did come in handy but I sorely missed some feature. Maybe they aren&amp;rsquo;t there, or are there and I didn&amp;rsquo;t look close enough. Over the years, different attributes were set to different subvols. Over time I forget what feature was added where. But from a migration point of view, it&amp;rsquo;d be nice to say, &amp;ldquo;Take this volume and take it with all its attributes&amp;rdquo;. I didn&amp;rsquo;t find that functionality in &lt;code>send/receive&lt;/code>.&lt;/p>
&lt;p>There&amp;rsquo;s &lt;code>get/set-property&lt;/code> which I noticed later but by then it was late. So some sort of tooling, ideally something like &lt;code>btrfs migrate&lt;/code> or somesuch would be nicer.&lt;/p>
&lt;p>In the file system world, we already have nice tools to take care of similar scenarios. Like with &lt;code>rsync&lt;/code>, I can request it to carry all file attributes.&lt;/p>
&lt;p>Also, iirc, &lt;code>send/receive&lt;/code> works only on &lt;code>ro&lt;/code> volumes. So there&amp;rsquo;s more work one needs to do in:&lt;/p>
&lt;ol>
&lt;li>create ro vol&lt;/li>
&lt;li>send&lt;/li>
&lt;li>receive&lt;/li>
&lt;li>don&amp;rsquo;t forget to set rw property&lt;/li>
&lt;li>And then somehow find out other properties set on each individual subvols and [re]apply the same on the destination&lt;/li>
&lt;/ol>
&lt;p>I wish this all be condensed into a sub-command.&lt;/p>
&lt;p>For my own sake, for this migration, the steps used were:&lt;/p>
&lt;pre tabindex="0">&lt;code>user@debian:~$ for volume in `sudo btrfs sub list /media/user/TOSHIBA/Migrate/ | cut -d &amp;#39; &amp;#39; -f9 | grep -v ROOTVOL | grep -v etc | grep -v btrbk`; do echo $volume; sud
o btrfs send /media/user/TOSHIBA/$volume | sudo btrfs receive /media/user/BTRFSROOT/ ; done
Migrate/snapshot_disk-tmp
At subvol /media/user/TOSHIBA/Migrate/snapshot_disk-tmp
At subvol snapshot_disk-tmp
Migrate/snapshot-home_foo_.cache
At subvol /media/user/TOSHIBA/Migrate/snapshot-home_foo_.cache
At subvol snapshot-home_foo_.cache
Migrate/snapshot-home_rrs
At subvol /media/user/TOSHIBA/Migrate/snapshot-home_rrs
At subvol snapshot-home_rrs
Migrate/snapshot-home_rrs_.cache
At subvol /media/user/TOSHIBA/Migrate/snapshot-home_rrs_.cache
At subvol snapshot-home_rrs_.cache
ERROR: crc32 mismatch in command
Migrate/snapshot-home_rrs_rrs-home_Libvirt-Images
At subvol /media/user/TOSHIBA/Migrate/snapshot-home_rrs_rrs-home_Libvirt-Images
At subvol snapshot-home_rrs_rrs-home_Libvirt-Images
ERROR: crc32 mismatch in command
Migrate/snapshot-var_spool_news
At subvol /media/user/TOSHIBA/Migrate/snapshot-var_spool_news
At subvol snapshot-var_spool_news
Migrate/snapshot-var_lib_machines
At subvol /media/user/TOSHIBA/Migrate/snapshot-var_lib_machines
At subvol snapshot-var_lib_machines
Migrate/snapshot-var_lib_machines_DebianSidTemplate
..... snipped .....
&lt;/code>&lt;/pre>&lt;p>And then, follow-up with:&lt;/p>
&lt;pre tabindex="0">&lt;code>user@debian:~$ for volume in `sudo btrfs sub list /media/user/BTRFSROOT/ | cut -d &amp;#39; &amp;#39; -f9`; do echo $volume; sudo btrfs property set -ts /media/user/BTRFSROOT/$volume ro false; done
ROOTVOL
ERROR: Could not open: No such file or directory
etc
snapshot_disk-tmp
snapshot-home_foo_.cache
snapshot-home_rrs
snapshot-var_spool_news
snapshot-var_lib_machines
snapshot-var_lib_machines_DebianSidTemplate
snapshot-var_lib_machines_DebSidArmhf
snapshot-var_lib_machines_DebianJessieTemplate
snapshot-var_tmp
snapshot-var_log
snapshot-var_cache
snapshot-disk-tmp
&lt;/code>&lt;/pre>&lt;p>And then finally, renaming everything to match proper:&lt;/p>
&lt;pre tabindex="0">&lt;code>user@debian:/media/user/BTRFSROOT$ for x in snapshot*; do vol=$(echo $x | cut -d &amp;#39;-&amp;#39; -f2 | sed -e &amp;#34;s|_|/|g&amp;#34;); echo $x $vol; sudo mv $x $vol; done
snapshot-var_lib_machines var/lib/machines
snapshot-var_lib_machines_Apertisv2020ospackTargetARMHF var/lib/machines/Apertisv2020ospackTargetARMHF
snapshot-var_lib_machines_Apertisv2021ospackTargetARM64 var/lib/machines/Apertisv2021ospackTargetARM64
snapshot-var_lib_machines_Apertisv2022dev3ospackTargetARMHF var/lib/machines/Apertisv2022dev3ospackTargetARMHF
snapshot-var_lib_machines_BusterArm64 var/lib/machines/BusterArm64
snapshot-var_lib_machines_DebianBusterTemplate var/lib/machines/DebianBusterTemplate
snapshot-var_lib_machines_DebianJessieTemplate var/lib/machines/DebianJessieTemplate
snapshot-var_lib_machines_DebianSidTemplate var/lib/machines/DebianSidTemplate
snapshot-var_lib_machines_DebianSidTemplate_var_lib_portables var/lib/machines/DebianSidTemplate/var/lib/portables
snapshot-var_lib_machines_DebSidArm64 var/lib/machines/DebSidArm64
snapshot-var_lib_machines_DebSidArmhf var/lib/machines/DebSidArmhf
snapshot-var_lib_machines_DebSidMips var/lib/machines/DebSidMips
snapshot-var_lib_machines_JenkinsApertis var/lib/machines/JenkinsApertis
snapshot-var_lib_machines_v2019 var/lib/machines/v2019
snapshot-var_lib_machines_v2019LinuxSupport var/lib/machines/v2019LinuxSupport
snapshot-var_lib_machines_v2020 var/lib/machines/v2020
snapshot-var_lib_machines_v2021dev3Slim var/lib/machines/v2021dev3Slim
snapshot-var_lib_machines_v2021dev3SlimTarget var/lib/machines/v2021dev3SlimTarget
snapshot-var_lib_machines_v2022dev2OspackMinimal var/lib/machines/v2022dev2OspackMinimal
snapshot-var_lib_portables var/lib/portables
snapshot-var_log var/log
snapshot-var_spool_news var/spool/news
snapshot-var_tmp var/tmp
&lt;/code>&lt;/pre>&lt;h4 id="snapper">snapper&lt;/h4>
&lt;p>Entirely independent of this, but indirectly related. I use &lt;code>snapper&lt;/code> as my snapshotting tool. It worked perfect on my previous machine. While everything got migrated, the only thing that fell apart was &lt;code>snapper&lt;/code>. It just wouldn&amp;rsquo;t start/run proper. Funny thing is that I just removed the snapper configs and reinitialized with the exact same config again, and voila snapper was happy.&lt;/p>
&lt;h3 id="conclusion">Conclusion&lt;/h3>
&lt;p>That was pretty much it. With the above and then also migrating &lt;code>/boot&lt;/code> and then just chroot to install the boot loader. At some time, I&amp;rsquo;d like to explore other boot options but given that that is such a non-essential task, it is low on the list.&lt;/p>
&lt;p>The good part was that I booted into my new machine with my exact workstation setup as it was. All the way to the user cache and the desktop session. So it was nice on that part.&lt;/p>
&lt;p>But I surely think there&amp;rsquo;s room for a better migration experience here. If not directly as &lt;code>btrfs migrate&lt;/code>, then maybe as an independent tool. The problem is that such a tool is going to be used once in years, so I didn&amp;rsquo;t find the motivation to write one. But this surely would be a good use case for the distribution vendors.&lt;/p></description></item><item><title>Setting Up a Secure Webapp</title><link>https://researchut.com/blog/Setting_Up_a_Secure_Webapp/</link><pubDate>Sat, 22 May 2021 15:44:48 +0530</pubDate><author>rrs@researchut.com (Ritesh Raj Sarraf)</author><guid>https://researchut.com/blog/Setting_Up_a_Secure_Webapp/</guid><description>&lt;p>As a person who prefers full access to data in the simplest format, while at the same time having it useful with latest technologies, my quest for trying things out is an ongoing activity.&lt;/p>
&lt;p>Earlier, I &lt;a href="https://researchut.com/blog/Catching_Up_Your_Sources/">blogged&lt;/a> about my needs of collating news feeds in a simple format, readily accessible offline, while still being useful and aligned with the modern paradigm.&lt;/p>
&lt;p>In today&amp;rsquo;s age, the other common aspect of our life, is digitization of moments. With the advent of great technology and affordable economics, the world now has access to great devices to capture moments in digital form. Most people, these days, are equipped with smart devices, like mobile phones, that come with pretty good image capturing devices. Our lives, our societies, how we interact; a lot of it is now built around the assumption of smart devices and digital services.&lt;/p>
&lt;p>A lot of good things have happened of it. We are now able to send messages to people, securely, in a matter of seconds. We are now able to capture moments, which otherwise we&amp;rsquo;d often miss; all thanks to devices like smart mobile phones that most of all carry almost all along with us.&lt;/p>
&lt;p>In this regard, we are quite indebted to the technology revolution that has improved life styles all over. Of course, like every coin has a flip side, thus too, too much of obsession with digital life, also has its drawbacks. A simple reminder to self should always be about what a human life is designed for and try to live by its rules.&lt;/p>
&lt;h3 id="moments">Moments&lt;/h3>
&lt;p>Given the tools general availability, we are all more used to capturing moments. Once upon a time, taking a photo meant going to a photo studio.&lt;/p>
&lt;p>Then came a generation where we&amp;rsquo;d have personal devices with roll films, to which we captured the moments. And then get it processed from a photo developing service provider. And that is when we&amp;rsquo;d know which all moments came out correct and which ones were spoilt. In such cases, there&amp;rsquo;s always the &lt;em>wish I could have that moment again&lt;/em>.&lt;/p>
&lt;p>Thankfully, now, in our current generation, we have the liberty to take pictures and validate them almost immediately. We also have the flexibility to take multiple shots of the moment and do the filtering later. There&amp;rsquo;s also many intelligent and invasive services, all mostly provided free, to help you organize these moments; at a small cost of keeping an eye on your life activity.&lt;/p>
&lt;p>In a summary, mankind, now, generates lots and lots of data. So much lot that now even mammoths like Google are forced to make a call whether it is more profitable to sniff user activity while providing them a service for free, or ask people to pay otherwise too.&lt;/p>
&lt;h3 id="privacy">Privacy&lt;/h3>
&lt;p>Many of us are wary of the amount of personal data we generate, which is our asset; and how the big tech giants want a piece of it in the name of free services. And in such quest, free aside, there&amp;rsquo;s always a lookout for privacy savvy tools that can help us draw a bold line in between &lt;em>Public&lt;/em> and &lt;em>Private&lt;/em>&lt;/p>
&lt;h3 id="google-photos">Google Photos&lt;/h3>
&lt;p>Google Photos has been a great tool. The way it organizes, siphons and present your data is simply amazing. No good would have been the photos taken, if they weren&amp;rsquo;t easily searchable, organized, annotated, and presented.&lt;/p>
&lt;p>But Google Photos is proprietary and invasive. The amount of information they have access to should be a concern to all people. For services that invade so much, the world needs &lt;strong>Free Services&lt;/strong>.&lt;/p>
&lt;h3 id="photoprism">PhotoPrism&lt;/h3>
&lt;p>I only came across this project around a month ago, while the project has been around since 2019. So far, in my exploration, this is one of the best Free Software tools to manage and organize my digital photos. The other favorite tool that I regularly depend on is &lt;strong>Digikam&lt;/strong> and it still is a gem.&lt;/p>
&lt;p>In a gist, PhotoPrism aims to be the equivalent of Google Photos, for the privacy savvy people.&lt;/p>
&lt;p>As of date, it has a decent list of features available. And for some of the missing ones, I&amp;rsquo;ve come up with a fairly okay workflow with other tools, which is one of the reasons of this blog post.&lt;/p>
&lt;p>PhotoPrism is a web app, written in the Go Programming Language. Its layout and workflow as a Photo Management application is similar to Google Photos. It is very performant compared to other applications. Since it is a Progressive Web App, access through a Laptop, Tablet or Mobile is almost the same. It uses &lt;em>Google TensorFlow&lt;/em> for some of its features and thus you feel like using Google Photos in some regard.&lt;/p>
&lt;p>Some shortcomings and workarounds&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Facial Recognition: To date, facial recognition is a planned feature. But this was easy to tackle given that Digikam has pretty solid facial recognition. So I use Digikam to detect, recognize and annotate faces. And then PhotoPrism is happy enough to use those annotations and present relevant data.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>HTTP Web App: The upstream project has done a good job of making use of Docker container technology in presenting this web app solution. A software solution, the equivalent of a Google Photos, does need a heavyweight config. In free software, it is all about reusing available tools. PhotoPrism makes use of tools like &lt;em>MySQL, Vue.js, TensorFlow, GoLang, GoLibs&lt;/em> and strives to provide a single package solution, all thanks to Docker containers.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>In its current offering, PhotoPrism is run as a HTTP Web App. I wanted to have an added layer of security on top of it. And thus run an nginx reverse proxy on top of it. Along with it, I run the proxy service on HTTPS, thus making all traffic from clients to the proxy encrypted. I also wanted an added layer of HTTP AUTH on top, so I explored some options and finally settled down with &lt;a href="https://github.com/atomx/nginx-http-auth-digest">http-auth-digest&lt;/a>&lt;/p>
&lt;p>Also, in the current implementation, PhotoPrism doesn&amp;rsquo;t have a strong notion of normal and private photos in its data organization. I wanted normal photos available under a standard auth realm and private photos under a different realm. And along with a different realm, I also wanted some added security directives for it. So far, it looks like I&amp;rsquo;ve put together a decent solution with the help of &lt;em>nginx&lt;/em>.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>First of all, since the port from the host is forwarded to the docker instance, that needed to be controlled. Instead of the default of listening on all interfaces, I changed it to loopback only. Because my primary and only interface is going to be the &lt;em>nginx reverse proxy&lt;/em>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Setup nginx with a self-signed certificate to have all communication encrypted.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Setup nginx as a reverse proxy to talk to PhotoPrism.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>server &lt;span style="color:#f92672">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> listen 80;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> listen &lt;span style="color:#f92672">[&lt;/span>::&lt;span style="color:#f92672">]&lt;/span>:80;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> server_name lenovo;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">302&lt;/span> https://$host$request_uri;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> rewrite ^ https://$http_host$request_uri? permanent; &lt;span style="color:#75715e"># force redirect http to https&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> server_tokens off;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>server &lt;span style="color:#f92672">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>listen &lt;span style="color:#ae81ff">443&lt;/span> ssl http2 default_server;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>listen &lt;span style="color:#f92672">[&lt;/span>::&lt;span style="color:#f92672">]&lt;/span>:443 ssl http2 default_server;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>server_tokens off;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>server_name lenovo;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>client_max_body_size 500M;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> auth_digest_expires 900s;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> auth_digest_evasion_time 5s;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> auth_digest_replays 500;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>location /private &lt;span style="color:#f92672">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> auth_digest &lt;span style="color:#e6db74">&amp;#39;abc&amp;#39;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> auth_digest_user_file /etc/nginx/htdigest;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> auth_digest_expires 900s;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> auth_digest_evasion_time 5s;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> auth_digest_replays 500;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> proxy_pass http://localhost:2342/private;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>location /discover &lt;span style="color:#f92672">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> auth_digest &lt;span style="color:#e6db74">&amp;#39;abc&amp;#39;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> auth_digest_user_file /etc/nginx/htdigest;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> auth_digest_expires 900s;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> auth_digest_evasion_time 5s;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> auth_digest_replays 500;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> proxy_pass http://localhost:2342/discover;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>location / &lt;span style="color:#f92672">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> proxy_set_header Host $host;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> proxy_buffering off;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> proxy_http_version 1.1;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> proxy_set_header Upgrade $http_upgrade;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> proxy_set_header Connection &lt;span style="color:#e6db74">&amp;#34;upgrade&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> proxy_pass http://localhost:2342;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> auth_basic &lt;span style="color:#e6db74">&amp;#34;Priv&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> auth_basic_user_file /etc/nginx/htpasswd;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>nginx packaging: I was so happy to see the simplicity of the nginx packaging in Debian. Becuase &lt;code>http-auth-digest&lt;/code> is not upstream, it needs to be pulled in separately and compiled. I was happy to see how simple the packaging structure of nginx in Debian is. It was just a matter of putting in the module in the right modules location, which as structured such in the packaging falls under the debian/ packaging sub-folder, that any future upgrades will be quite easy to manage.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>http-auth-digest: I&amp;rsquo;d love to see &lt;code>http-auth-digest&lt;/code> module be part of the upstream package. While I&amp;rsquo;m a web n00b, I felt this module perfect for my use case. From what I&amp;rsquo;ve understood, set up and tested so far, this module fills in all my requirements; which is more of like a session management.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>With the combined setup in place, &lt;code>https://host&lt;/code> is authenticated with a different set of credentials. On the other hand, &lt;code>https://host/discover and /private&lt;/code> get covered with a different set of credentials and policies. While, this will continue to be an ongoing effort and audit of the services that I build, so far now, I feel this is in decent shape that I can use it as my daily driver.&lt;/p>
&lt;p>The end result is:
&lt;link rel="stylesheet" href="https://researchut.com/css/hugo-easy-gallery.css" />
&lt;div class="box" >
&lt;figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">
&lt;div class="img">
&lt;img itemprop="thumbnail" src="https://researchut.com/images/PhotoPrism_auth.jpg" alt="nginx auth prompt"/>
&lt;/div>
&lt;a href="https://researchut.com/images/PhotoPrism_auth.jpg" itemprop="contentUrl">&lt;/a>
&lt;figcaption>&lt;h4>nginx auth prompt&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;/div>
&lt;div class="box" >
&lt;figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">
&lt;div class="img">
&lt;img itemprop="thumbnail" src="https://researchut.com/images/PhotoPrism_list.jpg" alt="PhotoPrism Photo List"/>
&lt;/div>
&lt;a href="https://researchut.com/images/PhotoPrism_list.jpg" itemprop="contentUrl">&lt;/a>
&lt;figcaption>&lt;h4>PhotoPrism Photo List&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;/div>
&lt;div class="box" >
&lt;figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">
&lt;div class="img">
&lt;img itemprop="thumbnail" src="https://researchut.com/images/PhotoPrism_Menu.jpg" alt="PhotoPrism Menu"/>
&lt;/div>
&lt;a href="https://researchut.com/images/PhotoPrism_Menu.jpg" itemprop="contentUrl">&lt;/a>
&lt;figcaption>&lt;h4>PhotoPrism Menu&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;/div>
&lt;/p>
&lt;h2 id="updates">Updates&lt;/h2>
&lt;ul>
&lt;li>Things can really get frustrating at times. These days, it is Google that contributes to it. &lt;a href="https://bugs.chromium.org/p/chromium/issues/detail?id=544244">https://bugs.chromium.org/p/chromium/issues/detail?id=544244&lt;/a>
&lt;ul>
&lt;li>It is is now fair to say that Google is big enough to rewrite all the standards. Or at least break them. Or best, their arrogance of it. This bug report is a fine example of what other ways it could have been dealt.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul></description></item><item><title>Wayland KDE X11</title><link>https://researchut.com/blog/Wayland_KDE_X11/</link><pubDate>Fri, 26 Feb 2021 17:08:26 +0530</pubDate><author>rrs@researchut.com (Ritesh Raj Sarraf)</author><guid>https://researchut.com/blog/Wayland_KDE_X11/</guid><description>&lt;h2 id="kde-impressions">KDE Impressions&lt;/h2>
&lt;p>These days, I often hear a lot about Wayland. And how much of effort is being put into it; not just by the Embedded world but also the usual Desktop systems, namely KDE and GNOME.&lt;/p>
&lt;p>In recent past, I switched back to KDE and have been (very) happy about the switch. Even though the KDE 4 (and initial KDE 5) debacle had burnt many, coming back to a usable KDE desktop is always a delight. It makes me feel home with the elegance, while at the same time the flexibility, it provides. It feels so nice to draft this blog article from Kwrite + VI Input Mode&lt;/p>
&lt;p>Thanks to the great work of the &lt;em>Debian KDE Team&lt;/em>, but &lt;a href="https://www.preining.info/">Norbert Preining&lt;/a> in particular, who has helped bring very up-to-date KDE packages into Debian. Right now, I&amp;rsquo;m on a &lt;strong>Plamsa 5.21.1&lt;/strong> desktop, which is recent by all standards.&lt;/p>
&lt;h2 id="wayland">Wayland&lt;/h2>
&lt;p>Almost all the places in the Linux world these days are busy with integrating Wayland as the primary display service. Not sure what the current status on the GNOME side is but I definitely keep trying &lt;strong>KDE + Wayland&lt;/strong> with every release.&lt;/p>
&lt;p>I keep &lt;em>trying&lt;/em> with &lt;em>every release&lt;/em> because it still is not prime for daily use. And it makes me get back to X11, no matter how dated some may call. Fact is, X11 still shines to me as an end-user.&lt;/p>
&lt;p>Glitches with Wayland still are (Based on this week&amp;rsquo;s test on Plasma 5.21.1):&lt;/p>
&lt;ul>
&lt;li>Horrible performance compared to X11&lt;/li>
&lt;li>Very crashy, especially when hotplugging secondary display. Plasma would just crash. X11 is very resilient to such things, part of the reason I can think is the age of the codebase.&lt;/li>
&lt;li>Many many applications still need to be fixed for Wayland. Or Wayland needs to accomodate them in some way. XWayland does not really feel like the answer.&lt;/li>
&lt;/ul>
&lt;p>And while KDE keeps insisting users to switch to &lt;strong>Wayland&lt;/strong>, as that&amp;rsquo;s where all the &lt;a href="https://bugs.kde.org/show_bug.cgi?id=422552">new enhancements and fixes&lt;/a> are put in, someone like me still needs to stick to X11 for the time being. So to get my shiny new &lt;code>LG 27&amp;quot; 4K Monitor (3840x2160 60.00*+)&lt;/code> to work without too much glitch, I had to live with an alias:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ alias | grep xrandr
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>alias rrs_xrandr_lg&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;xrandr --output DP-1 --mode 3840x2160 --scale .75x.75&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>18:31 ♒ ॐ ♅ ♄ ⛢ ☺ 😄
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="plasma-521">Plasma 5.21&lt;/h2>
&lt;p>On the brighter side, the Plasma 5.21.1 release brings some nice enhancements in other areas.&lt;/p>
&lt;ul>
&lt;li>I&amp;rsquo;m now able to make use of &lt;a href="https://blog.davidedmundson.co.uk/blog/plasma-and-the-systemd-startup/">tighter integration with systemd/cgroups&lt;/a>, with better organization and management of processes overall.&lt;/li>
&lt;li>The new Plasma theme, &lt;strong>Breeze Twilight&lt;/strong>, is a good blend of Light + Dark.&lt;/li>
&lt;/ul>
&lt;p>I also appreciate the work put in by &lt;a href="https://github.com/psifidotos/">Michail Vourlakos&lt;/a>. The KDE project is lucky to have a developer/designer like him. His vision and work into the KDE desktop is well beyond a writing by me.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ usystemctl status plasma-plasmashell.service
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>● plasma-plasmashell.service - KDE Plasma Workspace
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Loaded: loaded &lt;span style="color:#f92672">(&lt;/span>/usr/lib/systemd/user/plasma-plasmashell.service; enabled; vendor preset: enabled&lt;span style="color:#f92672">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Active: active &lt;span style="color:#f92672">(&lt;/span>running&lt;span style="color:#f92672">)&lt;/span> since Fri 2021-02-26 18:34:23 IST; 13s ago
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Main PID: &lt;span style="color:#ae81ff">501806&lt;/span> &lt;span style="color:#f92672">(&lt;/span>plasmashell&lt;span style="color:#f92672">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Tasks: &lt;span style="color:#ae81ff">21&lt;/span> &lt;span style="color:#f92672">(&lt;/span>limit: 18821&lt;span style="color:#f92672">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Memory: 759.8M
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> CPU: 13.706s
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> CGroup: /user.slice/user-1000.slice/user@1000.service/session.slice/plasma-plasmashell.service
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> └─501806 /usr/bin/plasmashell --no-respawn
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Feb &lt;span style="color:#ae81ff">26&lt;/span> 18:35:00 priyasi plasmashell&lt;span style="color:#f92672">[&lt;/span>501806&lt;span style="color:#f92672">]&lt;/span>: qml: recreating buttons
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Feb &lt;span style="color:#ae81ff">26&lt;/span> 18:35:21 priyasi plasmashell&lt;span style="color:#f92672">[&lt;/span>501806&lt;span style="color:#f92672">]&lt;/span>: qml: recreating buttons
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Feb &lt;span style="color:#ae81ff">26&lt;/span> 18:35:49 priyasi plasmashell&lt;span style="color:#f92672">[&lt;/span>501806&lt;span style="color:#f92672">]&lt;/span>: qml: recreating buttons
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Feb &lt;span style="color:#ae81ff">26&lt;/span> 18:35:57 priyasi plasmashell&lt;span style="color:#f92672">[&lt;/span>501806&lt;span style="color:#f92672">]&lt;/span>: qml: recreating buttons
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>18:36 ♒ ॐ ♅ ♄ ⛢ ☺ 😄
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="obs---open-build-service">OBS - Open Build Service&lt;/h2>
&lt;p>I should also thank the OpenSUSE folks for the &lt;a href="https://github.com/openSUSE/open-build-service">OBS work&lt;/a>. It has enabled the close equivalent (or better, in my experience) of &lt;em>PPAs for Debian&lt;/em>. And that is what has enabled developers like Norbert to easily and quickly be able to deliver the entire KDE suite.&lt;/p>
&lt;h3 id="obs---some-detail">OBS - Some detail&lt;/h3>
&lt;p>Christian asked for some more details on the OBS side of things, of my view. I&amp;rsquo;m updating this article with it because the comment system may not always be reliable and I hate losing content.&lt;/p>
&lt;p>Having been using OBS myself, and also others in the Debian community who are making use of it, I surely think we as project should consider making use of OBS.&lt;/p>
&lt;p>Given that OBS is &lt;strong>Free Software&lt;/strong>, it is a perfect fit for Debian. Gitlab is another example of what we&amp;rsquo;ve made available in Debian.&lt;/p>
&lt;p>OBS is divided into multiple parts&lt;/p>
&lt;ul>
&lt;li>OBS Server&lt;/li>
&lt;li>OBS DoD service&lt;/li>
&lt;li>OBS Publisher&lt;/li>
&lt;li>OBS Workers&lt;/li>
&lt;li>OBS Warden&lt;/li>
&lt;li>OBS Rep Server&lt;/li>
&lt;/ul>
&lt;p>For every Debian release I care about, I add an OBS project per release. So I have OBS projects for: Sid, Bullseye, Buster, Jessie.&lt;/p>
&lt;p>Now, say you have a package, &lt;code>foo&lt;/code> . You prep your package and enable all the releases that you want to build the package for. So the same package gets built, in separate clean environments, for every release I mentioned as an example above. You don&amp;rsquo;t have to manually trigger the build for every release/every architcture. You should add the release (as projects) in OBS, set their supported architectures, and then add those &lt;em>enabled release projets&lt;/em> as bits to your package.&lt;/p>
&lt;p>Every build involves:&lt;/p>
&lt;ul>
&lt;li>Creating a new chroot for each build&lt;/li>
&lt;li>Building the package&lt;/li>
&lt;/ul>
&lt;p>Builds can be scattered across multiple hosts, known as &lt;strong>workers&lt;/strong> in OBS terminology. Your workers are independent machine entities, supporting different architectures. The machines can be Bare-Metal ones, VMs, even containers. So this allows for very nice scale-in and scale-out. There may be auto-scaling too but that is something worth investigating.&lt;/p>
&lt;p>Think of things like cross architecture builds. Let&amp;rsquo;s assume the cloud vendors decide to donate resources to the Debian project. We could enable OBS worker instances on the respective clouds (different architectures) and plug them into the master OBS instance that Debian hosts. Fully distributed. Similarly, big hardware vendors willing to donate compute resources could house them in their premises and Debian could just easily establish a connection to them. All of this just a TCP connection away.&lt;/p>
&lt;p>So when I look at the features of OBS, from the point of view of Debian, I like it more. Extensibility won&amp;rsquo;t be an issue. Supporting a new Debian release would just be a matter of bootstrapping the Debian release as a project in OBS, and then all done. The single effort of setting of the target release project is a one time job, and then all can leverage it.&lt;/p>
&lt;p>The PPA was a long craved feature missing in Debian, in my opinion. OBS allows to not just fulfil that gap but also extend it in a very easy way.&lt;/p>
&lt;p>Andrew Lee had put in a &lt;a href="https://debconf20.debconf.org/talks/62-open-build-service-and-debian-packaging/">nice video presentation&lt;/a> about the same @ Debconf 20&lt;/p>
&lt;video width=100% controls>
&lt;source src="https://meetings-archive.debian.net/pub/debian-meetings/2020/DebConf20/62-open-build-service-and-debian-packaging.webm" type="video/webm">
Your browser does not support the video tag.
&lt;/video></description></item><item><title>LUKS Headless Laptop</title><link>https://researchut.com/blog/Luks_Headless_Laptop/</link><pubDate>Thu, 20 Aug 2020 19:29:14 +0530</pubDate><author>rrs@researchut.com (Ritesh Raj Sarraf)</author><guid>https://researchut.com/blog/Luks_Headless_Laptop/</guid><description>&lt;p>As we grow old, so do our computing machines. And just like we don&amp;rsquo;t decommission ourselves, so should be the case of the machines. They should be semi-retired, delegating major tasks to newer machines while they can still serve some less demaning work: &lt;em>File Servers, UPNP Servers&lt;/em> et cetera.&lt;/p>
&lt;p>It is common on a Debian installer based derivative, and otherwise too, to use block encryption on Linux. With machines from this decade, I think we&amp;rsquo;ve always had CPU extension for encryption.&lt;/p>
&lt;p>So, as would be the usual case, all my laptops are block encrypted. But as they reach the phase of their life to retire and serving as a headless boss, it becomes cumbersome to keep feeding it a password and all the logistics involved to feed it. As such, I wanted to get rid of feeding it the password.&lt;/p>
&lt;p>Then, there&amp;rsquo;s also the case of bad/faulty hardware, many of which mostly can temporarily fix their functionality when reset, which usually is to reboot the machine. I still recollect words of my Linux Guru - &lt;strong>Dhiren Raj Bhandari&lt;/strong> - that many of the unexplainable errors can be resolved by just rebooting the machine. This was more than 20 years ago in the prime era of &lt;em>Microsoft Windows OS&lt;/em> and the context back then was quite different, but yes, some bits of that saying still apply today.&lt;/p>
&lt;p>So I wanted my laptop, which had LUKS set up for 2 disks, to go password-less now. I stumbled across a &lt;a href="http://atterer.org/linux-remove-disable-luks-encryption-password-on-disk-partition-crypttab-initrd">slightly dated article&lt;/a> where the author achieved similar results with &lt;em>keyscript&lt;/em>. So the thing was doable.&lt;/p>
&lt;p>To my delight, Debian cryptsetup has the best setup and documentation in place to do it with just adding &lt;em>keyfiles&lt;/em>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>rrs@lenovo:~$ dd &lt;span style="color:#66d9ef">if&lt;/span>&lt;span style="color:#f92672">=&lt;/span>/dev/random of&lt;span style="color:#f92672">=&lt;/span>sda7.key bs&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span> count&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">512&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>512+0 records in
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>512+0 records out
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">512&lt;/span> bytes copied, 0.00540209 s, 94.8 kB/s
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>19:19 ♒♒♒ ☺ 😄
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rrs@lenovo:~$ dd &lt;span style="color:#66d9ef">if&lt;/span>&lt;span style="color:#f92672">=&lt;/span>/dev/random of&lt;span style="color:#f92672">=&lt;/span>sdb1.key bs&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span> count&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">512&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>512+0 records in
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>512+0 records out
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">512&lt;/span> bytes copied, 0.00536747 s, 95.4 kB/s
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>19:20 ♒♒♒ ☺ 😄
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rrs@lenovo:~$ sudo cryptsetup luksAddKey /dev/sda7 sda7.key
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">[&lt;/span>sudo&lt;span style="color:#f92672">]&lt;/span> password &lt;span style="color:#66d9ef">for&lt;/span> rrs:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Enter any existing passphrase:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>No key available with this passphrase.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>19:20 ♒♒♒ ☹ 😟&lt;span style="color:#f92672">=&lt;/span>&amp;gt; &lt;span style="color:#ae81ff">2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rrs@lenovo:~$ sudo cryptsetup luksAddKey /dev/sda7 sda7.key
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Enter any existing passphrase:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>19:20 ♒♒♒ ☺ 😄
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rrs@lenovo:~$ sudo cryptsetup luksAddKey /dev/sdb1 sdb1.key
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Enter any existing passphrase:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>19:21 ♒♒♒ ☺ 😄 &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>and the nice integration in &lt;em>crypttab&lt;/em> to ensure your keys propagate to &lt;em>initramfs&lt;/em>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>rrs@lenovo:~$ cat /etc/cryptsetup-initramfs/conf-hook
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Configuration file for the cryptroot initramfs hook.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># KEYFILE_PATTERN: ...&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># The value of this variable is interpreted as a shell pattern.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Matching key files from the crypttab(5) are included in the initramfs&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># image. The associated devices can then be unlocked without manual&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># intervention. (For instance if /etc/crypttab lists two key files&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># /etc/keys/{root,swap}.key, you can set KEYFILE_PATTERN=&amp;#34;/etc/keys/*.key&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># to add them to the initrd.)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># If KEYFILE_PATTERN if null or unset (default) then no key file is&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># copied to the initramfs image.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Note that the glob(7) is not expanded for crypttab(5) entries with a&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># &amp;#39;keyscript=&amp;#39; option. In that case, the field is not treated as a file&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># name but given as argument to the keyscript.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># WARNING: If the initramfs image is to include private key material,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># you&amp;#39;ll want to create it with a restrictive umask in order to keep&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># non-privileged users at bay. For instance, set UMASK=0077 in&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># /etc/initramfs-tools/initramfs.conf&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>KEYFILE_PATTERN&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;/etc/luks/sd*.key&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>19:44 ♒♒♒ ☺ 😄 &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>The whole thing took me around 20-25 minutes, including drafting this post. From &lt;em>&lt;strong>Retired Head and Password Prompt&lt;/strong>&lt;/em> to &lt;em>&lt;strong>Headless and Password-less&lt;/strong>&lt;/em>. The beauty of Debian and FOSS&lt;/p></description></item><item><title>Laptop Mode Tools 1.74</title><link>https://researchut.com/post/Laptop_Mode_Tools_1-74/</link><pubDate>Sat, 18 Jul 2020 21:15:04 +0530</pubDate><author>rrs@researchut.com (Ritesh Raj Sarraf)</author><guid>https://researchut.com/post/Laptop_Mode_Tools_1-74/</guid><description>&lt;h2 id="laptop-mode-tools-174">Laptop Mode Tools 1.74&lt;/h2>
&lt;p>&lt;strong>Laptop Mode Tools&lt;/strong> version &lt;code>1.74&lt;/code> has been released. This release includes &lt;code>important bug fixes&lt;/code>, some &lt;code>defaults settings&lt;/code> updated to current driver support in Linux and support for devices with &lt;code>nouveau&lt;/code> based nVIDIA cards.&lt;/p>
&lt;p>A filtered list of changes is mentioned below. For the full log, please refer to the &lt;a href="https://github.com/rickysarraf/laptop-mode-tools">git repository&lt;/a>&lt;/p>
&lt;h3 id="174---sat-jul-18-191040-ist-2020">1.74 - Sat Jul 18 19:10:40 IST 2020&lt;/h3>
&lt;pre>&lt;code>* With 4.15+ kernels, Linux Intel SATA has a better link power
saving policy, med_power_with_dipm, which should be the recommended
one to use
* Disable defaults for syslog logging
* Initialize LM_VERBOSE with default to disabled
* Merge pull request #157 from rickysarraf/nouveau
* Add power saving module for nouveau cards
* Disable ethernet module by default
* Add board-specific folder and documentation
* Add execute bit on module radeon-dpm
* Drop unlock because there is no lock acquired
&lt;/code>&lt;/pre>
&lt;h2 id="resources">Resources&lt;/h2>
&lt;ul>
&lt;li>Source tarball, Feodra/SUSE RPM Packages available at project&amp;rsquo;s &lt;a href="https://github.com/rickysarraf/laptop-mode-tools/releases">release page&lt;/a>&lt;/li>
&lt;li>Debian packages will be available soon in &lt;a href="https://packages.debian.org/sid/laptop-mode-tools">Unstable&lt;/a>.&lt;/li>
&lt;li>Homepage: &lt;a href="https://github.com/rickysarraf/laptop-mode-tools/wiki">https://github.com/rickysarraf/laptop-mode-tools/wiki&lt;/a>&lt;/li>
&lt;li>Mailing List: &lt;a href="https://groups.google.com/d/forum/laptop-mode-tools">https://groups.google.com/d/forum/laptop-mode-tools&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="what-is-laptop-mode-tools">What is Laptop Mode Tools&lt;/h2>
&lt;pre tabindex="0">&lt;code>Description: Tools for Power Savings based on battery/AC status
Laptop mode is a Linux kernel feature that allows your laptop to save
considerable power, by allowing the hard drive to spin down for longer
periods of time. This package contains the userland scripts that are
needed to enable laptop mode.
.
It includes support for automatically enabling laptop mode when the
computer is working on batteries. It also supports various other power
management features, such as starting and stopping daemons depending on
power mode, automatically hibernating if battery levels are too low, and
adjusting terminal blanking and X11 screen blanking
.
laptop-mode-tools uses the Linux kernel&amp;#39;s Laptop Mode feature and thus
is also used on Desktops and Servers to conserve power
&lt;/code>&lt;/pre></description></item><item><title>Kodi PS3 BD Remote</title><link>https://researchut.com/blog/Kodi_PS3_BD_Remote/</link><pubDate>Tue, 16 Jun 2020 11:08:13 +0530</pubDate><author>rrs@researchut.com (Ritesh Raj Sarraf)</author><guid>https://researchut.com/blog/Kodi_PS3_BD_Remote/</guid><description>&lt;h2 id="setting-up-a-sony-ps3-blu-ray-disc-remote-controller-with-kodi">Setting up a Sony PS3 Blu-Ray Disc Remote Controller with Kodi&lt;/h2>
&lt;p>TLDR; Since most of the articles on the internet were either obsolete or broken, I&amp;rsquo;ve chosen to write these notes down in the form of a blog post so that it helps me now and in future, and hopefully others too.&lt;/p>
&lt;h3 id="raspberry-pi">Raspberry Pi&lt;/h3>
&lt;p>All this time, I have been using the &lt;em>Raspberry Pi&lt;/em> for my HTPC needs. The first RPi I acquired was in 2014 and I have been very very happy with the amount of support in the community and quality of the HTPC offering it has. I also appreciate the RPi&amp;rsquo;s form factor and the power consumption limits. And then, to add more sugar to it, it uses a derivative of Debian, &lt;strong>Raspbian&lt;/strong>, which was very familiar and feel good to me.&lt;/p>
&lt;h4 id="raspberry-pi-issues">Raspberry Pi Issues&lt;/h4>
&lt;p>So primarily, I use my RPi with Kodi. There are a bunch of other (daemon) services but the primary use case is &lt;em>HTPC&lt;/em> only. &lt;em>RPi + Kodi&lt;/em> has a very very annoying issue wherein it loses its audio pitch during video playback. The loss is so bad that the audio is barely audible. The workaround is to seek the video playback either way and then it comes back to its actual audio level, just to fade again in a while.&lt;/p>
&lt;p>My suspicion was that it may be a problem with Kodi. Or at least, Kodi would have a workaround in software. But unfortunately, I wasted a lot of time in dealing with my suspicion with no fruitful result.&lt;/p>
&lt;p>This started becoming a PITA over time.
And it seems the issue is with the hardware itself because after I moved my setup to a regular laptop, the audio loss is gone.&lt;/p>
&lt;h3 id="laptop-with-kodi">Laptop with Kodi&lt;/h3>
&lt;p>Since I had my old &lt;em>Lenovo Yoga 2 13&lt;/em> lying on all the time, it made sense to make some more use of it, using as the &lt;em>HTPC&lt;/em>. This machine comes with a &lt;em>Micro-HDMI Out&lt;/em> port, so it felt ideal for my High Definition video rendering needs.&lt;/p>
&lt;p>It comes stock with just Intel HD Video with good driver support in Linux, so it was quite quick and easy getting Kodi charged up and running on it. And as I mentioned above, the sound issues are not seen on this setup.&lt;/p>
&lt;p>Some added benefits are that I get to run stock Debian on this machine. And I must say a big &lt;strong>THANK YOU&lt;/strong> to the &lt;em>Debian Multimedia Maintainers&lt;/em>, who&amp;rsquo;ve done a pretty good job maintaining Kodi under Debian.&lt;/p>
&lt;h3 id="hdmi-cec">HDMI CEC&lt;/h3>
&lt;p>Only after I decommissioned my RPi, I came to notice how convenient the &lt;em>&lt;strong>HDMI CEC&lt;/strong>&lt;/em> functionality is. Turns out no standard laptops ship CEC functionality onto them. Even the case of my laptop, which has a Micro HDMI Out port, but still no CEC capabilities. As far as I know, the RPi came with the Pulse-Eight CEC module, so obvious first thought was to opt for a compatible &lt;a href="https://www.pulse-eight.com/p/104/usb-hdmi-cec-adapter">external module&lt;/a> of the same; but it comes with a nice price tag, me not willing to spend.&lt;/p>
&lt;h3 id="wifi-remotes">WiFi Remotes&lt;/h3>
&lt;p>Kodi has very well implemented network interface for almost all its features. One could take the &lt;a href="https://yatse.tv/">Yatse&lt;/a> or &lt;a href="http://kodiremote.berard.ch/">Music Pump Kodi Remote&lt;/a> Android applications that work very very well with Kodi.&lt;/p>
&lt;p>But wifi can be flaky some times. Especially, my experience with the &lt;em>Realtek&lt;/em> network devices hasn&amp;rsquo;t been very good. The driver support in Linux is okay but there are many firmware bugs to deal with. In my case, the machine will lose wifi signal/network every once in a while. And it turns out, for this machine, with this network device type, I&amp;rsquo;m not the only one running into such problems.&lt;/p>
&lt;p>And to add to that, this is an &lt;em>UltraBook&lt;/em>, which means it doesn&amp;rsquo;t have an Ethernet port. So I&amp;rsquo;ve had not much choice other than to live and &lt;del>suffer&lt;/del> deal with it.&lt;/p>
&lt;p>The WiFi chip also provides the Bluetooth module, which so far I had not used much. From my &lt;code>/etc/modprobe.d/blacklist-memstick.conf&lt;/code>, all relevant BT modules were added to the blacklist, all this time.&lt;/p>
&lt;pre tabindex="0">&lt;code>rrs@lenovo:~$ cat /etc/modprobe.d/blacklist-memstick.conf
blacklist memstick
blacklist rtsx_usb_ms
# And bluetooth too
#blacklist btusb
#blacklist btrtl
#blacklist btbcm
#blacklist btintel
#blacklist bluetooth
21:21 ♒♒♒ ☺ 😄
&lt;/code>&lt;/pre>&lt;p>Also to keep in mind is that the driver for my card gives a very misleading kernel message, which is one of the many reasons for this blog post, so that I don&amp;rsquo;t forget it a couple of months later. The missing firmware error message is okay to ignore, as per &lt;a href="https://github.com/lwfinger/rtl8723bu/issues/68">this&lt;/a> upstream comment.&lt;/p>
&lt;pre tabindex="0">&lt;code>Jun 14 17:17:08 lenovo kernel: usbcore: registered new interface driver btusb
Jun 14 17:17:08 lenovo systemd[1]: Mounted /boot/efi.
Jun 14 17:17:08 lenovo kernel: Bluetooth: hci0: RTL: examining hci_ver=06 hci_rev=000b lmp_ver=06 lmp_subver=8723
Jun 14 17:17:08 lenovo kernel: Bluetooth: hci0: RTL: rom_version status=0 version=1
Jun 14 17:17:08 lenovo kernel: Bluetooth: hci0: RTL: loading rtl_bt/rtl8723b_fw.bin
Jun 14 17:17:08 lenovo kernel: bluetooth hci0: firmware: direct-loading firmware rtl_bt/rtl8723b_fw.bin
Jun 14 17:17:08 lenovo kernel: Bluetooth: hci0: RTL: loading rtl_bt/rtl8723b_config.bin
Jun 14 17:17:08 lenovo kernel: bluetooth hci0: firmware: failed to load rtl_bt/rtl8723b_config.bin (-2)
Jun 14 17:17:08 lenovo kernel: firmware_class: See https://wiki.debian.org/Firmware for information about missing firmware
Jun 14 17:17:08 lenovo kernel: bluetooth hci0: Direct firmware load for rtl_bt/rtl8723b_config.bin failed with error -2
Jun 14 17:17:08 lenovo kernel: Bluetooth: hci0: RTL: cfg_sz -2, total sz 22496
&lt;/code>&lt;/pre>&lt;p>This device&amp;rsquo;s &lt;em>network + bt&lt;/em> are on the same chip.&lt;/p>
&lt;pre tabindex="0">&lt;code>01:00.0 Network controller: Realtek Semiconductor Co., Ltd. RTL8723BE PCIe Wireless Network Adapter
&lt;/code>&lt;/pre>&lt;p>And then, when the &lt;code>btusb&lt;/code> module is initialed (along with the misleading driver message), you&amp;rsquo;ll get the following in your USB device listing&lt;/p>
&lt;pre tabindex="0">&lt;code>Bus 002 Device 005: ID 0bda:b728 Realtek Semiconductor Corp. Bluetooth Radio
&lt;/code>&lt;/pre>&lt;h3 id="sony-playstation-3-bd-remote">Sony PlayStation 3 BD Remote&lt;/h3>
&lt;p>Almost 10 years ago, I bought the PS3 and many of its accessories. The remote has just been rotting in the shelf. It had rusted so bad that it is better described with these pics.&lt;/p>
&lt;p>
&lt;link rel="stylesheet" href="https://researchut.com/css/hugo-easy-gallery.css" />
&lt;div class="box" >
&lt;figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">
&lt;div class="img">
&lt;img itemprop="thumbnail" src="https://researchut.com/images/ps3-remote-rust.jpg" alt="Rusted inside"/>
&lt;/div>
&lt;a href="https://researchut.com/images/ps3-remote-rust.jpg" itemprop="contentUrl">&lt;/a>
&lt;figcaption>&lt;h4>Rusted inside&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;/div>
&lt;div class="box" >
&lt;figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">
&lt;div class="img">
&lt;img itemprop="thumbnail" src="https://researchut.com/images/ps3-remote-rust-full.jpg" alt="Rusted inside and cover"/>
&lt;/div>
&lt;a href="https://researchut.com/images/ps3-remote-rust-full.jpg" itemprop="contentUrl">&lt;/a>
&lt;figcaption>&lt;h4>Rusted inside and cover&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;/div>
&lt;div class="box" >
&lt;figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">
&lt;div class="img">
&lt;img itemprop="thumbnail" src="https://researchut.com/images/ps3-rusted-spring.jpg" alt="Rusted spring"/>
&lt;/div>
&lt;a href="https://researchut.com/images/ps3-rusted-spring.jpg" itemprop="contentUrl">&lt;/a>
&lt;figcaption>&lt;h4>Rusted spring&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;/div>
&lt;/p>
&lt;p>The rust was so much that the battery holding spring gave up.&lt;/p>
&lt;p>A little bit scrubbing and cleaning has gotten it working. I hope it lasts for some time before I find time to open it up and give it a full clean-up.&lt;/p>
&lt;h3 id="pairing-the-bd-remote-to-laptop">Pairing the BD Remote to laptop&lt;/h3>
&lt;p>Honestly, with the condition of the hardware and software on both ends, I did not have much hopes of getting this to work. And in all the years on my computer usage, I hardly recollect much days when I&amp;rsquo;ve made use of BT. Probably, because the full BT stack wasn&amp;rsquo;t that well integrated in Linux, earlier. And I mostly used to disable them in hardware and software to save on battery.&lt;/p>
&lt;p>All yielded results from the internet talked about tools/scripts that were either not working, pointing to broken links etc.&lt;/p>
&lt;p>These days, &lt;em>bluez&lt;/em> comes with a nice utility, &lt;em>bluetoothctl&lt;/em>. It was a nice experience using it.&lt;/p>
&lt;p>First, start your bluetooth service and ensure that the device talks well with the kernel&lt;/p>
&lt;pre tabindex="0">&lt;code>rrs@lenovo:~$ systemctl status bluetooth
● bluetooth.service - Bluetooth service
Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2020-06-15 12:54:58 IST; 3s ago
Docs: man:bluetoothd(8)
Main PID: 310197 (bluetoothd)
Status: &amp;#34;Running&amp;#34;
Tasks: 1 (limit: 9424)
Memory: 1.3M
CGroup: /system.slice/bluetooth.service
└─310197 /usr/lib/bluetooth/bluetoothd
Jun 15 12:54:58 lenovo systemd[1]: Starting Bluetooth service...
Jun 15 12:54:58 lenovo bluetoothd[310197]: Bluetooth daemon 5.50
Jun 15 12:54:58 lenovo systemd[1]: Started Bluetooth service.
Jun 15 12:54:58 lenovo bluetoothd[310197]: Starting SDP server
Jun 15 12:54:58 lenovo bluetoothd[310197]: Bluetooth management interface 1.15 initialized
Jun 15 12:54:58 lenovo bluetoothd[310197]: Sap driver initialization failed.
Jun 15 12:54:58 lenovo bluetoothd[310197]: sap-server: Operation not permitted (1)
12:55 ♒♒♒ ☺ 😄
&lt;/code>&lt;/pre>&lt;p>Next, then is to discover and connect to your device&lt;/p>
&lt;pre tabindex="0">&lt;code>rrs@lenovo:~$ bluetoothctl
Agent registered
[bluetooth]# devices
Device E6:3A:32:A4:31:8F MI Band 2
Device D4:B8:FF:43:AB:47 MI RC
Device 00:1E:3D:10:29:0F BD Remote Control
[CHG] Device 00:1E:3D:10:29:0F Connected: yes
[BD Remote Control]# info 00:1E:3D:10:29:0F
Device 00:1E:3D:10:29:0F (public)
Name: BD Remote Control
Alias: BD Remote Control
Class: 0x0000250c
Paired: no
Trusted: yes
Blocked: no
Connected: yes
LegacyPairing: no
UUID: Human Interface Device... (00001124-0000-1000-8000-00805f9b34fb)
UUID: PnP Information (00001200-0000-1000-8000-00805f9b34fb)
Modalias: usb:v054Cp0306d0100
[bluetooth]#
&lt;/code>&lt;/pre>&lt;p>In case of the &lt;em>Sony BD Remote&lt;/em>, there&amp;rsquo;s no need to pair. In fact, trying to pair fails. It prompts for the PIN code, but neither &lt;code>0000&lt;/code> or &lt;code>1234&lt;/code> are accepted.&lt;/p>
&lt;p>So, the working steps so far are to &lt;strong>Trust&lt;/strong> the device and then &lt;strong>Connect&lt;/strong> the device.&lt;/p>
&lt;p>For the sake of future use, I also populated &lt;code>/etc/bluetooth/input.conf&lt;/code> based on suggestions on the internet.
Note: The advertised keymappings in this config file do not work.
Note: I&amp;rsquo;m only using it for the power saving measures in instructing the BT connection to sleep after 3 minutes.&lt;/p>
&lt;pre tabindex="0">&lt;code>rrs@priyasi:/tmp$ cat input.conf
# Configuration file for the input service
# This section contains options which are not specific to any
# particular interface
[General]
# Set idle timeout (in minutes) before the connection will
# be disconnect (defaults to 0 for no timeout)
IdleTimeout=3
# Enable HID protocol handling in userspace input profile
# Defaults to false (HIDP handled in HIDP kernel module)
#UserspaceHID=true
# Limit HID connections to bonded devices
# The HID Profile does not specify that devices must be bonded, however some
# platforms may want to make sure that input connections only come from bonded
# device connections. Several older mice have been known for not supporting
# pairing/encryption.
# Defaults to false to maximize device compatibility.
#ClassicBondedOnly=true
# LE upgrade security
# Enables upgrades of security automatically if required.
# Defaults to true to maximize device compatibility.
#LEAutoSecurity=true
#
#[00:1E:3D:10:29:0F]
[2c:33:7a:8e:d6:30]
[PS3 Remote Map]
# When the &amp;#39;OverlayBuiltin&amp;#39; option is TRUE (the default), the keymap uses
# the built-in keymap as a starting point. When FALSE, an empty keymap is
# the starting point.
#OverlayBuiltin = TRUE
#buttoncode = keypress # Button label = action with default key mappings
#OverlayBuiltin = FALSE
0x16 = KEY_ESC # EJECT = exit
0x64 = KEY_MINUS # AUDIO = cycle audio tracks
0x65 = KEY_W # ANGLE = cycle zoom mode
0x63 = KEY_T # SUBTITLE = toggle subtitles
0x0f = KEY_DELETE # CLEAR = delete key
0x28 = KEY_F8 # /TIME = toggle through sleep
0x00 = KEY_1 # NUM-1
0x01 = KEY_2 # NUM-2
0x02 = KEY_3 # NUM-3
0x03 = KEY_4 # NUM-4
0x04 = KEY_5 # NUM-5
0x05 = KEY_6 # NUM-6
0x06 = KEY_7 # NUM-7
0x07 = KEY_8 # NUM-8
0x08 = KEY_9 # NUM-9
0x09 = KEY_0 # NUM-0
0x81 = KEY_F2 # RED = red
0x82 = KEY_F3 # GREEN = green
0x80 = KEY_F4 # BLUE = blue
0x83 = KEY_F5 # YELLOW = yellow
0x70 = KEY_I # DISPLAY = show information
0x1a = KEY_S # TOP MENU = show guide
0x40 = KEY_M # POP UP/MENU = menu
0x0e = KEY_ESC # RETURN = back/escape/cancel
0x5c = KEY_R # TRIANGLE/OPTIONS = cycle through recording options
0x5d = KEY_ESC # CIRCLE/BACK = back/escape/cancel
0x5f = KEY_A # SQUARE/VIEW = Adjust Playback timestretch
0x5e = KEY_ENTER # CROSS = select
0x54 = KEY_UP # UP = Up/Skip forward 10 minutes
0x56 = KEY_DOWN # DOWN = Down/Skip back 10 minutes
0x57 = KEY_LEFT # LEFT = Left/Skip back 5 seconds
0x55 = KEY_RIGHT # RIGHT = Right/Skip forward 30 seconds
0x0b = KEY_ENTER # ENTER = select
0x5a = KEY_F10 # L1 = volume down
0x58 = KEY_J # L2 = decrease the play speed
0x51 = KEY_HOME # L3 = commercial skip previous
0x5b = KEY_F11 # R1 = volume up
0x59 = KEY_U # R2 = increase the play speed
0x52 = KEY_END # R3 = commercial skip next
0x43 = KEY_F9 # PS button = mute
0x50 = KEY_M # SELECT = menu (as per PS convention)
0x53 = KEY_ENTER # START = select / Enter (matches terminology in mythwelcome)
0x30 = KEY_PAGEUP # PREV = jump back (default 10 minutes)
0x76 = KEY_J # INSTANT BACK (newer RCs only) = decrease the play speed
0x75 = KEY_U # INSTANT FORWARD (newer RCs only) = increase the play speed
0x31 = KEY_PAGEDOWN # NEXT = jump forward (default 10 minutes)
0x33 = KEY_COMMA # SCAN BACK = decrease scan forward speed / play
0x32 = KEY_P # PLAY = play/pause
0x34 = KEY_DOT # SCAN FORWARD decrease scan backard speed / increase playback speed; 3x, 5, 10, 20, 30, 60, 120, 180
0x60 = KEY_LEFT # FRAMEBACK = Left/Skip back 5 seconds/rewind one frame
0x39 = KEY_P # PAUSE = play/pause
0x38 = KEY_P # STOP = play/pause
0x61 = KEY_RIGHT # FRAMEFORWARD = Right/Skip forward 30 seconds/advance one frame
0xff = KEY_MAX
21:48 ♒ ॐ ♅ ⛢ ☺ 😄
&lt;/code>&lt;/pre>&lt;p>I have not spent much time finding out why not all the key presses work. Especially, given that most places on the internet mention these mappings. For me, some of the key scan codes aren&amp;rsquo;t even reported. For keys like &lt;em>L1, L2, L3, R1, R2, R3, Next_Item, Prev_Item&lt;/em>, they generate no codes in the kernel.&lt;/p>
&lt;p>If anyone has suggestions, ideas or fixes, I&amp;rsquo;d appreciate if you can drop a comment or email me privately.&lt;/p>
&lt;p>But given my limited use to get a simple remote ready, to be usable with Kodi, I was apt with only some of the keys working.&lt;/p>
&lt;h3 id="mapping-the-keys-in-kodi">Mapping the keys in Kodi&lt;/h3>
&lt;p>With the limited number of keys detected, mapping those keys to what Kodi could use was the next step. Kodi has a very nice and easy to use module, &lt;a href="https://kodi.wiki/view/Add-on:Keymap_Editor">Keymap Editor&lt;/a>. It is very simple to use and map detected keys to functionalities you want. With it, I was able to get a functioning remote to use with my Kodi HTPC setup.&lt;/p>
&lt;h3 id="update-wed-jun-17-113820-2020">Update: Wed Jun 17 11:38:20 2020&lt;/h3>
&lt;p>One annoying problem that breaks the overall experience is the following bug on the driver side, that results in connections not being established instantly.&lt;/p>
&lt;p>Once the device goes into sleep mode, in random attempts, waking up and re-establishing a BT connection can be multi-poll affair. This can last from a couple of seconds to well over minute.&lt;/p>
&lt;p>Random suggestions on the internet mention disabling the &lt;em>autosuspend&lt;/em> functionality for the device in the driver with &lt;code>btusb.enable_autosuspend=n&lt;/code>, but that did not help in this case.&lt;/p>
&lt;p>Given that this device is enumberated over the USB Bus, it probably needs this feature applied to the whole USB tree of the device&amp;rsquo;s chain. Something to investigate over the weekend.&lt;/p>
&lt;pre tabindex="0">&lt;code>Jun 16 20:41:23 lenovo kernel: Bluetooth: hci0: ACL packet for unknown connection handle 7
Jun 16 20:41:43 lenovo kernel: Bluetooth: hci0: ACL packet for unknown connection handle 8
Jun 16 20:41:59 lenovo kernel: Bluetooth: hci0: ACL packet for unknown connection handle 9
Jun 16 20:42:18 lenovo kernel: input: BD Remote Control as /devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/bluetooth/hci0/hci0:10/0005:054C:030&amp;gt;
Jun 16 20:42:18 lenovo kernel: sony 0005:054C:0306.0006: input,hidraw1: BLUETOOTH HID v1.00 Gamepad [BD Remote Control] on 2c:33:7a:8e:d6:30
Jun 16 20:51:59 lenovo kernel: input: BD Remote Control as /devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/bluetooth/hci0/hci0:11/0005:054C:030&amp;gt;
Jun 16 20:51:59 lenovo kernel: sony 0005:054C:0306.0007: input,hidraw1: BLUETOOTH HID v1.00 Gamepad [BD Remote Control] on 2c:33:7a:8e:d6:30
Jun 16 21:05:55 lenovo rtkit-daemon[1723]: Supervising 3 threads of 1 processes of 1 users.
Jun 16 21:05:55 lenovo rtkit-daemon[1723]: Successfully made thread 32747 of process 1646 owned by &amp;#39;1000&amp;#39; RT at priority 5.
Jun 16 21:05:55 lenovo rtkit-daemon[1723]: Supervising 4 threads of 1 processes of 1 users.
Jun 16 21:05:56 lenovo kernel: Bluetooth: hci0: ACL packet for unknown connection handle 12
Jun 16 21:06:12 lenovo kernel: Bluetooth: hci0: ACL packet for unknown connection handle 1
Jun 16 21:06:34 lenovo kernel: Bluetooth: hci0: ACL packet for unknown connection handle 2
Jun 16 21:06:59 lenovo kernel: input: BD Remote Control as /devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/bluetooth/hci0/hci0:3/0005:054C:0306&amp;gt;
Jun 16 21:06:59 lenovo kernel: sony 0005:054C:0306.0008: input,hidraw1: BLUETOOTH HID v1.00 Gamepad [BD Remote Control] on 2c:33:7a:8e:d6:30
&lt;/code>&lt;/pre>&lt;h3 id="others">Others&lt;/h3>
&lt;p>There&amp;rsquo;s a package, &lt;a href="https://packages.debian.org/unstable/kodi-eventclients-ps3">kodi-eventclients-ps3&lt;/a>, which can be used to talk to the &lt;em>BD Remote&lt;/em>. Unfortunately, it isn&amp;rsquo;t up-to-date. When trying to make use of it, I ran into a couple of problems.&lt;/p>
&lt;p>First, the easy one is:&lt;/p>
&lt;pre tabindex="0">&lt;code>rrs@lenovo:~/ps3pair$ kodi-ps3remote localhost 9777
usr/share/pixmaps/kodi//bluetooth.png
Traceback (most recent call last):
File &amp;#34;/usr/bin/kodi-ps3remote&amp;#34;, line 220, in &amp;lt;module&amp;gt;
File &amp;#34;/usr/bin/kodi-ps3remote&amp;#34;, line 208, in main
xbmc.connect(host, port)
packet = PacketHELO(self.name, self.icon_type, self.icon_file)
File &amp;#34;/usr/lib/python3/dist-packages/kodi/xbmcclient.py&amp;#34;, line 285, in __init__
with open(icon_file, &amp;#39;rb&amp;#39;) as f:
11:16 ♒♒♒ ☹ 😟=&amp;gt; 1
&lt;/code>&lt;/pre>&lt;p>This one was simple as it was just a broken path.&lt;/p>
&lt;p>The second issue with the tool is a leftover from python2 to python3 conversion.&lt;/p>
&lt;pre tabindex="0">&lt;code>rrs@lenovo:/etc/bluetooth$ kodi-ps3remote localhost
/usr/share/pixmaps/kodi//bluetooth.png
Searching for BD Remote Control
(Hold Start + Enter on remote to make it discoverable)
Redmi (E8:5A:8B:73:57:44) in range
Living Room TV (E4:DB:6D:24:23:E9) in range
Could not find BD Remote Control. Trying again...
Searching for BD Remote Control
(Hold Start + Enter on remote to make it discoverable)
Living Room TV (E4:DB:6D:24:23:E9) in range
Redmi (E8:5A:8B:73:57:44) in range
Could not find BD Remote Control. Trying again...
Searching for BD Remote Control
(Hold Start + Enter on remote to make it discoverable)
BD Remote Control (00:1E:3D:10:29:0F) in range
Found BD Remote Control with address 00:1E:3D:10:29:0F
Attempting to pair with remote
Remote Paired.
Traceback (most recent call last):
File &amp;#34;/usr/bin/kodi-ps3remote&amp;#34;, line 221, in &amp;lt;module&amp;gt;
main()
File &amp;#34;/usr/bin/kodi-ps3remote&amp;#34;, line 212, in main
if process_keys(remote, xbmc):
File &amp;#34;/usr/bin/kodi-ps3remote&amp;#34;, line 164, in process_keys
keycode = data.encode(&amp;#34;hex&amp;#34;)[10:12]
AttributeError: &amp;#39;bytes&amp;#39; object has no attribute &amp;#39;encode&amp;#39;
11:24 ♒♒♒ ☹ 😟=&amp;gt; 1
&lt;/code>&lt;/pre>&lt;p>Fixing that too did not give me the desired result on using the &lt;em>BD Remote&lt;/em> in the way I want. So eventually, I gave up and used Kodi&amp;rsquo;s &lt;em>Keymap Editor&lt;/em> instead.&lt;/p>
&lt;h3 id="next">Next&lt;/h3>
&lt;p>Next in line, when I can manage to get some free time, is to improve the &lt;strong>Kodi Video Scraper&lt;/strong> to have a fallback mode. Currently, for files where it cannot determine the content, it reject the file resulting in those files not showing up in your collection at all. A better approach would have been to have a fallback mode, that when the scraper cannot determine the content, it should fallback to using the &lt;a href="https://github.com/chaosgrid/kodi-filenameScraper">filename scraper&lt;/a>&lt;/p></description></item><item><title>Apt Offline 1.8.2</title><link>https://researchut.com/blog/apt-offline-1_8_2/</link><pubDate>Sun, 09 Feb 2020 19:52:51 +0530</pubDate><author>rrs@researchut.com (Ritesh Raj Sarraf)</author><guid>https://researchut.com/blog/apt-offline-1_8_2/</guid><description>&lt;h2 id="apt-offline-182">apt-offline 1.8.2&lt;/h2>
&lt;p>I am pleased to announce the release of &lt;em>&lt;strong>apt-offline&lt;/strong>&lt;/em> version 1.8.2&lt;/p>
&lt;p>This release has many bug fixes along with a long standing issue of &lt;a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=871656">signature validation&lt;/a>&lt;/p>
&lt;h3 id="2017---the-year-of-realization-and-change">2017 - The year of realization and change&lt;/h3>
&lt;p>Back in 2017, the bug was reported that &lt;em>&lt;strong>apt-offline&lt;/strong>&lt;/em> did not validate apt meta &lt;em>Packages&lt;/em> files. &lt;em>&lt;strong>apt-offline&lt;/strong>&lt;/em> was only doing a signature validation for the &lt;em>Release&lt;/em> files but did no validation of the apt meta &lt;em>Packages&lt;/em> files, which had their checksums listed in the &lt;em>Release&lt;/em> files. This validation was completely missing in &lt;em>&lt;strong>apt-offline&lt;/strong>&lt;/em> and gave the user the wrong impression that validation was in place.&lt;/p>
&lt;p>I had hoped to fix this issue soon when it was reported, to have it part of the next Debian Stable release. But that never happened. On the contrary, I think 2 stable releases happened in between. And now it is 2020.&lt;/p>
&lt;p>2017 was a year to spend a large chunk of my time on real life issues, for good. I realized that it is important to always give precedence to personal life, fix issues, set realistic priorities, spend time on realizing the happenings around, get life rolling smooth and then come back to work. This helps sustain in the longer run. Otherwise, with no self, everything can fall apart catastrophically.&lt;/p>
&lt;p>From that phase, I learned many things. I now have much more respect for people who really have been successful at committing a large amount of their time on a volunteer project like Debian. Having myself gone through the time crunch phase, I can only imagine how many of the fellow DDs manage their time, sustainably, over the years. There are many folks I have seen active for more than a decade and they still rock.&lt;/p>
&lt;h3 id="182-release">1.8.2 release&lt;/h3>
&lt;p>Because the apt meta validation was a major issue, I have decided to run through the workflow and explain how &lt;em>&lt;strong>apt-offline&lt;/strong>&lt;/em> reacts to invalid tampered data. Below are konsole captures, with snipped output, where not very relevant.&lt;/p>
&lt;!-- raw HTML omitted -->
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-plain" data-lang="plain">&lt;span style="display:flex;">&lt;span>rrs@priyasi:/var/tmp/Debian-Build/Result$ sudo apt-offline set /tmp/set.uris
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Gathering details needed for &amp;#39;update&amp;#39; operation
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Gathering details needed for &amp;#39;upgrade&amp;#39; operation
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>16:33 ♒ ॐ ☺ 😄 &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;!-- raw HTML omitted -->
&lt;p>One item to pay attention to, in this step, is some of the errors that are reported. Not all repository admins enable all the apt meta data available on their mirrors. This is commonly seen for localization related files. Similarly, not all compression types are available on all the repository servers. Some may only have &lt;code>.xz&lt;/code> based meta files hosted while others may have &lt;code>.gz&lt;/code> ones. So, for &lt;em>&lt;strong>apt-offline&lt;/strong>&lt;/em>, which has to bridge the gap of the offline &amp;lt;=&amp;gt; online setup, there is more work.&lt;/p>
&lt;p>For compression types, &lt;em>&lt;strong>apt-offline&lt;/strong>&lt;/em> cycles through the known list of types. Only if, after cycling through all the known compression types, if the return is still a 404, then we error out.&lt;/p>
&lt;p>Similarly, for localization related meta, we do the same cycling. But in addition to that, there is the possibility that the repository admin may not have enabled the localization data to be served at all. In that case, &lt;em>&lt;strong>apt-offline&lt;/strong>&lt;/em> ultimately will report and error.&lt;/p>
&lt;p>And that is what is shown below. Because I see them not breaking the functionality, I treat them as non-fatal errors.&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">25
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">26
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">27
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">28
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">29
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">30
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">31
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">32
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">33
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">34
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">35
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">36
&lt;/span>&lt;span style="background-color:#3c3d38">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">37
&lt;/span>&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">38
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">39
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">40
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">41
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">42
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">43
&lt;/span>&lt;span style="background-color:#3c3d38">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">44
&lt;/span>&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">45
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">46
&lt;/span>&lt;span style="background-color:#3c3d38">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">47
&lt;/span>&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">48
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">49
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">50
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">51
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">52
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">53
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">54
&lt;/span>&lt;span style="background-color:#3c3d38">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">55
&lt;/span>&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">56
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">57
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">58
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">59
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">60
&lt;/span>&lt;span style="background-color:#3c3d38">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">61
&lt;/span>&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">62
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">63
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">64
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">65
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">66
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">67
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">68
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">69
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">70
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">71
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">72
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">73
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">74
&lt;/span>&lt;span style="background-color:#3c3d38">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">75
&lt;/span>&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">76
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">77
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">78
&lt;/span>&lt;span style="background-color:#3c3d38">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">79
&lt;/span>&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">80
&lt;/span>&lt;span style="background-color:#3c3d38">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">81
&lt;/span>&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">82
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">83
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">84
&lt;/span>&lt;span style="background-color:#3c3d38">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">85
&lt;/span>&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">86
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">87
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">88
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">89
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">90
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">91
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">92
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">93
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">94
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;">&lt;code class="language-plain" data-lang="plain">&lt;span style="display:flex;">&lt;span>rrs@priyasi:/var/tmp/Debian-Build/Result$ apt-offline get /tmp/set-trimmed.uris --bundle /tmp/set.zip --threads 5
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Fetching APT Data
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>WARNING: If you are on a slow connection, it is good to
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>WARNING: limit the number of threads to a low number like 2.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>WARNING: Else higher number of threads executed could cause
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>WARNING: network congestion and timeouts.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/Release.gpg
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/Release
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/InRelease
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/unstable/Release.gpg
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/unstable/Release
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/unstable/Release.gpg done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/unstable/InRelease
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/testing/Release.gpg done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/experimental/Release.gpg
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/unstable/Release done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/experimental/Release
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/testing/InRelease done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/experimental/InRelease
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/testing/Release done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/main/source/Sources.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/unstable/InRelease done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/non-free/source/Sources.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/experimental/Release.gpg done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/contrib/source/Sources.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/experimental/InRelease done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/main/binary-amd64/Packages.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/experimental/Release done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/main/binary-i386/Packages.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/testing/contrib/source/Sources.xz done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/main/binary-all/Packages.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/testing/non-free/source/Sources.xz done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/main/i18n/Translation-en_IN.xz
&lt;/span>&lt;/span>&lt;span style="display:flex; background-color:#3c3d38">&lt;span>ERROR: Giving up on URL http://deb.debian.org/debian/dists/testing/main/i18n/Translation-en_IN.lzma
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/main/i18n/Translation-en.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/testing/main/binary-all/Packages.xz done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/main/i18n/Translation-en_US.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/testing/main/source/Sources.xz done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/main/Contents-amd64.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/testing/main/i18n/Translation-en.bz2 done
&lt;/span>&lt;/span>&lt;span style="display:flex; background-color:#3c3d38">&lt;span>ERROR: Giving up on URL http://deb.debian.org/debian/dists/testing/main/i18n/Translation-en_US.lzma
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/main/Contents-i386.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/main/Contents-all.xz
&lt;/span>&lt;/span>&lt;span style="display:flex; background-color:#3c3d38">&lt;span>ERROR: Giving up on URL http://deb.debian.org/debian/dists/testing/main/Contents-all.lzma
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/non-free/binary-amd64/Packages.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/testing/non-free/binary-amd64/Packages.xz done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/non-free/binary-i386/Packages.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/testing/non-free/binary-i386/Packages.xz done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/non-free/binary-all/Packages.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/testing/non-free/binary-all/Packages.xz done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/non-free/i18n/Translation-en_IN.xz
&lt;/span>&lt;/span>&lt;span style="display:flex; background-color:#3c3d38">&lt;span>ERROR: Giving up on URL http://deb.debian.org/debian/dists/testing/non-free/i18n/Translation-en_IN.lzma
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/non-free/i18n/Translation-en.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/testing/non-free/i18n/Translation-en.bz2 done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/non-free/i18n/Translation-en_US.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/testing/main/binary-i386/Packages.xz done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/non-free/Contents-amd64.xz
&lt;/span>&lt;/span>&lt;span style="display:flex; background-color:#3c3d38">&lt;span>ERROR: Giving up on URL http://deb.debian.org/debian/dists/testing/non-free/i18n/Translation-en_US.lzma
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/non-free/Contents-i386.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/testing/non-free/Contents-i386.gz done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/non-free/Contents-all.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/testing/non-free/Contents-amd64.gz done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/testing/main/binary-amd64/Packages.xz done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/contrib/binary-amd64/Packages.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/contrib/binary-i386/Packages.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/testing/contrib/binary-amd64/Packages.xz done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/contrib/binary-all/Packages.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/testing/contrib/binary-i386/Packages.xz done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/testing/contrib/binary-all/Packages.xz done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/contrib/i18n/Translation-en_IN.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/contrib/i18n/Translation-en.xz
&lt;/span>&lt;/span>&lt;span style="display:flex; background-color:#3c3d38">&lt;span>ERROR: Giving up on URL http://deb.debian.org/debian/dists/testing/non-free/Contents-all.lzma
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/contrib/i18n/Translation-en_US.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/testing/contrib/i18n/Translation-en.bz2 done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/contrib/Contents-amd64.xz
&lt;/span>&lt;/span>&lt;span style="display:flex; background-color:#3c3d38">&lt;span>ERROR: Giving up on URL http://deb.debian.org/debian/dists/testing/contrib/i18n/Translation-en_IN.lzma
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/contrib/Contents-i386.xz
&lt;/span>&lt;/span>&lt;span style="display:flex; background-color:#3c3d38">&lt;span>ERROR: Giving up on URL http://deb.debian.org/debian/dists/testing/contrib/i18n/Translation-en_US.lzma
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading http://deb.debian.org/debian/dists/testing/contrib/Contents-all.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/testing/contrib/Contents-amd64.gz done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/testing/contrib/Contents-i386.gz done
&lt;/span>&lt;/span>&lt;span style="display:flex; background-color:#3c3d38">&lt;span>ERROR: Giving up on URL http://deb.debian.org/debian/dists/testing/contrib/Contents-all.lzma
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/testing/main/Contents-i386.gz done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://deb.debian.org/debian/dists/testing/main/Contents-amd64.gz done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 81 / 81 items: [##############################] 100.0% of 101 MiB
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloaded data to /tmp/set.zip
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ERROR: Some items failed to download. Downloaded data may be incomplete
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ERROR: Please run in verbose mode to see details about failed items
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>16:38 ♒ ॐ ☹ 😟=&amp;gt; 100 &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;!-- raw HTML omitted -->
&lt;p>First, lets unpack the archive file.&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">25
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">26
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">27
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">28
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">29
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">30
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">31
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">32
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">33
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">34
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">35
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">36
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">37
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">38
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">39
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">40
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">41
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">42
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">43
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">44
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">45
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">46
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">47
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">48
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">49
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">50
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">51
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">52
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">53
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">54
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">55
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">56
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-plain" data-lang="plain">&lt;span style="display:flex;">&lt;span>rrs@priyasi:/var/tmp/Debian-Build/Result$ cd /tmp/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>16:39 ♒ ॐ ☺ 😄
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rrs@priyasi:/tmp$ mkdir set-folder
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>16:39 ♒ ॐ ☺ 😄
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rrs@priyasi:/tmp$ cd set-folder/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>16:39 ♒ ॐ ☺ 😄
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rrs@priyasi:/tmp/set-folder$ unzip ../set.zip
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Archive: ../set.zip
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_unstable_Release.gpg
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_testing_Release.gpg
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_unstable_Release
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_testing_InRelease
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_testing_Release
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_unstable_InRelease
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_experimental_Release.gpg
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_experimental_InRelease
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_experimental_Release
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_testing_contrib_source_Sources.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_testing_non-free_source_Sources.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_testing_main_binary-all_Packages.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_testing_main_source_Sources.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_testing_main_i18n_Translation-en.bz2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_testing_non-free_binary-amd64_Packages.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_testing_non-free_binary-i386_Packages.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_testing_non-free_binary-all_Packages.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_testing_non-free_i18n_Translation-en.bz2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_testing_main_binary-i386_Packages.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_testing_non-free_Contents-i386.gz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_testing_non-free_Contents-amd64.gz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_testing_main_binary-amd64_Packages.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_testing_contrib_binary-amd64_Packages.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_testing_contrib_binary-i386_Packages.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_testing_contrib_binary-all_Packages.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_testing_contrib_i18n_Translation-en.bz2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_testing_contrib_Contents-amd64.gz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_testing_contrib_Contents-i386.gz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_testing_main_Contents-i386.gz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> inflating: deb.debian.org_debian_dists_testing_main_Contents-amd64.gz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>16:39 ♒ ॐ ☺ 😄
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rrs@priyasi:/tmp/set-folder$ ls
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_experimental_InRelease deb.debian.org_debian_dists_testing_main_Contents-i386.gz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_experimental_Release deb.debian.org_debian_dists_testing_main_i18n_Translation-en.bz2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_experimental_Release.gpg deb.debian.org_debian_dists_testing_main_source_Sources.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_contrib_binary-all_Packages.xz deb.debian.org_debian_dists_testing_non-free_binary-all_Packages.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_contrib_binary-amd64_Packages.xz deb.debian.org_debian_dists_testing_non-free_binary-amd64_Packages.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_contrib_binary-i386_Packages.xz deb.debian.org_debian_dists_testing_non-free_binary-i386_Packages.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_contrib_Contents-amd64.gz deb.debian.org_debian_dists_testing_non-free_Contents-amd64.gz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_contrib_Contents-i386.gz deb.debian.org_debian_dists_testing_non-free_Contents-i386.gz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_contrib_i18n_Translation-en.bz2 deb.debian.org_debian_dists_testing_non-free_i18n_Translation-en.bz2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_contrib_source_Sources.xz deb.debian.org_debian_dists_testing_non-free_source_Sources.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_InRelease deb.debian.org_debian_dists_testing_Release
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_main_binary-all_Packages.xz deb.debian.org_debian_dists_testing_Release.gpg
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_main_binary-amd64_Packages.xz deb.debian.org_debian_dists_unstable_InRelease
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_main_binary-i386_Packages.xz deb.debian.org_debian_dists_unstable_Release
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_main_Contents-amd64.gz deb.debian.org_debian_dists_unstable_Release.gpg
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>16:39 ♒ ॐ ☺ 😄 &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;!-- raw HTML omitted -->
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-plain" data-lang="plain">&lt;span style="display:flex;">&lt;span>rrs@priyasi:/tmp/set-folder$ echo 112312312321 &amp;gt;&amp;gt; deb.debian.org_debian_dists_testing_non-free_source_Sources.xz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>16:40 ♒ ॐ ☺ 😄 &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;!-- raw HTML omitted -->
&lt;p>So in this step, we tell &lt;em>&lt;strong>apt-offline&lt;/strong>&lt;/em> to install the downloaded files. This will also include the tampered file.
The output you see below is standard and reports everything to have succeeded.&lt;/p>
&lt;p>But note that the tampered file is not in the list of synced files. That file is just simply missing from the list.&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">25
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">26
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">27
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">28
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">29
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">30
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">31
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">32
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">33
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">34
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">35
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">36
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">37
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">38
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">39
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">40
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">41
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-plain" data-lang="plain">&lt;span style="display:flex;">&lt;span>rrs@priyasi:/tmp/set-folder$ sudo apt-offline install .
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Proceeding with installation
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gpgv: Signature made Friday 07 February 2020 01:55:24 PM IST
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gpgv: using RSA key 16E90B3FDF65EDE3AA7F323C04EE7237B7D453EC
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gpgv: Good signature from &amp;#34;Debian Archive Automatic Signing Key (9/stretch) &amp;lt;ftpmaster@debian.org&amp;gt;&amp;#34;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gpgv: Signature made Friday 07 February 2020 01:55:43 PM IST
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gpgv: using RSA key 0146DC6D4A0B2914BDED34DB648ACFD622F3D138
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gpgv: Good signature from &amp;#34;Debian Archive Automatic Signing Key (10/buster) &amp;lt;ftpmaster@debian.org&amp;gt;&amp;#34;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gpgv: Signature made Friday 07 February 2020 01:56:44 PM IST
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gpgv: using RSA key 16E90B3FDF65EDE3AA7F323C04EE7237B7D453EC
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gpgv: Good signature from &amp;#34;Debian Archive Automatic Signing Key (9/stretch) &amp;lt;ftpmaster@debian.org&amp;gt;&amp;#34;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gpgv: Signature made Friday 07 February 2020 01:56:45 PM IST
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gpgv: using RSA key 0146DC6D4A0B2914BDED34DB648ACFD622F3D138
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gpgv: Good signature from &amp;#34;Debian Archive Automatic Signing Key (10/buster) &amp;lt;ftpmaster@debian.org&amp;gt;&amp;#34;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gpgv: Signature made Friday 07 February 2020 01:56:58 PM IST
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gpgv: using RSA key 16E90B3FDF65EDE3AA7F323C04EE7237B7D453EC
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gpgv: Good signature from &amp;#34;Debian Archive Automatic Signing Key (9/stretch) &amp;lt;ftpmaster@debian.org&amp;gt;&amp;#34;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gpgv: Signature made Friday 07 February 2020 01:56:58 PM IST
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gpgv: using RSA key 0146DC6D4A0B2914BDED34DB648ACFD622F3D138
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gpgv: Good signature from &amp;#34;Debian Archive Automatic Signing Key (10/buster) &amp;lt;ftpmaster@debian.org&amp;gt;&amp;#34;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_contrib_Contents-amd64.gz synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_contrib_Contents-i386.gz synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_contrib_binary-all_Packages.xz synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_contrib_binary-amd64_Packages.xz synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_contrib_binary-i386_Packages.xz synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_contrib_i18n_Translation-en.bz2 synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_contrib_source_Sources.xz synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_main_Contents-amd64.gz synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_main_Contents-i386.gz synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_main_binary-all_Packages.xz synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_main_binary-amd64_Packages.xz synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_main_binary-i386_Packages.xz synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_main_i18n_Translation-en.bz2 synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_main_source_Sources.xz synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_non-free_Contents-amd64.gz synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_non-free_Contents-i386.gz synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_non-free_binary-all_Packages.xz synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_non-free_binary-amd64_Packages.xz synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_non-free_binary-i386_Packages.xz synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_non-free_i18n_Translation-en.bz2 synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>16:41 ♒ ॐ ☺ 😄 &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;!-- raw HTML omitted -->
&lt;p>So, in the above example, &lt;em>&lt;strong>apt-offline&lt;/strong>&lt;/em> discarded the tampered file and the final exit of the command was a success.
Now, let&amp;rsquo;s run the same command with the &amp;lsquo;&amp;ndash;verbose&amp;rsquo; switch. Below is the output.&lt;/p>
&lt;p>Notice the highlighted line below, where it reports that the file is tampered and does not match the checksum&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">25
&lt;/span>&lt;span style="background-color:#3c3d38">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">26
&lt;/span>&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">27
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">28
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">29
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">30
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">31
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">32
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">33
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">34
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">35
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">36
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">37
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">38
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">39
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">40
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">41
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">42
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">43
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">44
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">45
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;">&lt;code class="language-plain" data-lang="plain">&lt;span style="display:flex;">&lt;span>rrs@priyasi:/tmp/set-folder$ sudo apt-offline install . --verbose
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: Namespace(allow_unauthenticated=False, func=&amp;lt;function installer at 0x7f6a6c7c54d0&amp;gt;, install=&amp;#39;.&amp;#39;, install_simulate=False, install_src_path=None, skip_bug_reports=False, skip_changelog=False, strict_deb_check=False, verbose=True)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: No changelog available
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Proceeding with installation
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: {}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: Great!!! No bugs found for all the packages that were downloaded.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: APT Signature verification path is: [&amp;#39;/etc/apt/trusted.gpg.d/&amp;#39;, &amp;#39;/etc/apt/trusted.gpg&amp;#39;]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: Adding /etc/apt/trusted.gpg.d/debian-archive-jessie-automatic.gpg to the apt-offline keyring
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: Adding /etc/apt/trusted.gpg.d/debian-archive-jessie-security-automatic.gpg to the apt-offline keyring
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: Adding /etc/apt/trusted.gpg.d/debian-archive-jessie-stable.gpg to the apt-offline keyring
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: Adding /etc/apt/trusted.gpg.d/debian-archive-stretch-automatic.gpg to the apt-offline keyring
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: Adding /etc/apt/trusted.gpg.d/debian-archive-stretch-security-automatic.gpg to the apt-offline keyring
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: Adding /etc/apt/trusted.gpg.d/debian-archive-stretch-stable.gpg to the apt-offline keyring
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: Adding /etc/apt/trusted.gpg.d/debian-archive-buster-automatic.gpg to the apt-offline keyring
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: Adding /etc/apt/trusted.gpg.d/debian-archive-buster-security-automatic.gpg to the apt-offline keyring
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.....snipped.....
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: localFile ./deb.debian.org_debian_dists_testing_non-free_Contents-amd64.gz Integrity with checksum 024957d30be2acbb9e66c9802f825115d32437420300a2b28ab60ae4ecb76fcf matches
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: localFile ./deb.debian.org_debian_dists_testing_non-free_Contents-i386.gz Integrity with checksum 5266d2f3ea41c4e988e71b4bbe58dd1178a23ce1ed50908c73a0cb39201136e3 matches
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: localFile ./deb.debian.org_debian_dists_testing_non-free_binary-all_Packages.xz Integrity with checksum 9f0f3aa5560452d45f82c5121ea844c68e641c8fbb56ef69d570c641b6cce662 matches
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: localFile ./deb.debian.org_debian_dists_testing_non-free_binary-amd64_Packages.xz Integrity with checksum 811f7752a13dfcbd748478dda267fb810c52fc14769d2d5c7871c75e35350d66 matches
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: localFile ./deb.debian.org_debian_dists_testing_non-free_binary-i386_Packages.xz Integrity with checksum 7df3512b5da7258613774921023d68c71858d89fddafd694e2dfd19cef54314b matches
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: localFile ./deb.debian.org_debian_dists_testing_non-free_i18n_Translation-en.bz2 Integrity with checksum 1bf3cd0cff6fadf1a74280912c3229374344cd6c347d2f533b001843d84b236d matches
&lt;/span>&lt;/span>&lt;span style="display:flex; background-color:#3c3d38">&lt;span>VERBOSE: localFile ./deb.debian.org_debian_dists_testing_non-free_source_Sources.xz integrity doesn&amp;#39;t match to checksum a94589ab3c204bb4d710d72ea21abac8007b14e5c5dacbe43be07c51ba5f0a0a
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: Synchronized file to /var/lib/apt/lists/deb.debian.org_debian_dists_testing_contrib_Contents-amd64
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: /var/lib/apt/lists/deb.debian.org_debian_dists_testing_contrib_Contents-amd64 file synced to APT.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_contrib_Contents-amd64.gz synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: Synchronized file to /var/lib/apt/lists/deb.debian.org_debian_dists_testing_contrib_Contents-i386
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: /var/lib/apt/lists/deb.debian.org_debian_dists_testing_contrib_Contents-i386 file synced to APT.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_contrib_Contents-i386.gz synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: Synchronized file to /var/lib/apt/lists/deb.debian.org_debian_dists_testing_contrib_binary-all_Packages
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: /var/lib/apt/lists/deb.debian.org_debian_dists_testing_contrib_binary-all_Packages file synced to APT.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_contrib_binary-all_Packages.xz synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: Synchronized file to /var/lib/apt/lists/deb.debian.org_debian_dists_testing_contrib_binary-amd64_Packages
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: /var/lib/apt/lists/deb.debian.org_debian_dists_testing_contrib_binary-amd64_Packages file synced to APT.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_contrib_binary-amd64_Packages.xz synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: Synchronized file to /var/lib/apt/lists/deb.debian.org_debian_dists_testing_contrib_binary-i386_Packages
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>VERBOSE: /var/lib/apt/lists/deb.debian.org_debian_dists_testing_contrib_binary-i386_Packages file synced to APT.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>deb.debian.org_debian_dists_testing_contrib_binary-i386_Packages.xz synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.....snipped.....
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>16:42 ♒ ॐ ☺ 😄&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>This is pretty much the validation required and done by &lt;em>&lt;strong>apt-offline&lt;/strong>&lt;/em> for apt meta &lt;em>Packages&lt;/em> files.&lt;/p>
&lt;p>Please do file bug reports if you think the overall exit status of &lt;em>&lt;strong>apt-offline&lt;/strong>&lt;/em> under such scenarios should be different than what it is currently.&lt;/p>
&lt;p>For the tampered meta &lt;em>Packages&lt;/em> files:&lt;/p>
&lt;ul>
&lt;li>should the visual representation be different ?&lt;/li>
&lt;li>Should an error be printed ?&lt;/li>
&lt;li>What about the exit status ?&lt;/li>
&lt;/ul>
&lt;p>Similarly, for the &amp;lsquo;get&amp;rsquo; operation:&lt;/p>
&lt;ul>
&lt;li>Should we do something different for non-existing localization files on the repository server ?&lt;/li>
&lt;li>Is there any different way to go through the supported list of compression types for meta files ?&lt;/li>
&lt;/ul>
&lt;!-- raw HTML omitted -->
&lt;p>&lt;em>&lt;strong>apt-offline&lt;/strong>&lt;/em> allows a user to install a new package and all its dependencies easily on the offline machine. The below workflow will demonstrate the same and will also go through the tampering of the .deb files and see how &lt;em>&lt;strong>apt-offline/apt&lt;/strong>&lt;/em> deals with it.&lt;/p>
&lt;p>In below example, a user wants to install the &lt;code>gnome-todo&lt;/code> package on the offline machine, which has a couple of dependencies.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-plain" data-lang="plain">&lt;span style="display:flex;">&lt;span>rrs@priyasi:/tmp/set-folder$ sudo apt install gnome-todo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Reading package lists... Done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Building dependency tree
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Reading state information... Done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>The following additional packages will be installed:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> gnome-todo-common libgnome-todo libpeas-1.0-0 libpeas-common
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>The following NEW packages will be installed:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> gnome-todo gnome-todo-common libgnome-todo libpeas-1.0-0 libpeas-common
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>0 upgraded, 5 newly installed, 0 to remove and 1 not upgraded.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Need to get 784 kB of archives.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>After this operation, 2,337 kB of additional disk space will be used.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Do you want to continue? [Y/n] n
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Abort.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>16:47 ♒ ॐ ☹ 😟=&amp;gt; 1 &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;!-- raw HTML omitted -->
&lt;p>The below command generates a (signature) file, which will include all details about requested package and its dependencies.&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-plain" data-lang="plain">&lt;span style="display:flex;">&lt;span>rrs@priyasi:/tmp/set-folder$ sudo apt-offline set /tmp/gnome-todo.uris --install-packages gnome-todo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Gathering installation details for package [&amp;#39;gnome-todo&amp;#39;]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>16:48 ♒ ॐ ☺ 😄 &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;!-- raw HTML omitted -->
&lt;p>Below is the usual step to be performed on the online machine with the generated &lt;code>gnome-todo.uris&lt;/code> signature file.&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">25
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">26
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">27
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">28
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">29
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">30
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">31
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">32
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-plain" data-lang="plain">&lt;span style="display:flex;">&lt;span>rrs@priyasi:/tmp/set-folder$ apt-offline get /tmp/gnome-todo.uris --download-dir /tmp/gnome-todo --bug-reports --threads 3
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Fetching APT Data
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>WARNING: If you are on a slow connection, it is good to
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>WARNING: limit the number of threads to a low number like 2.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>WARNING: Else higher number of threads executed could cause
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>WARNING: network congestion and timeouts.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading libpeas-common - 187 KiB
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading libpeas-1.0-0 - 196 KiB
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading gnome-todo-common - 228 KiB
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>libpeas-common done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Fetching bug report for libpeas-common
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>libpeas-1.0-0 done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Fetching bug report for libpeas-1.0-0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gnome-todo-common done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Fetching bug report for gnome-todo-common
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Fetched bug report for libpeas-common
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading libgnome-todo - 6 KiB
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>libgnome-todo done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Fetching bug report for libgnome-todo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Fetched bug report for gnome-todo-common
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloading gnome-todo - 146 KiB
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gnome-todo done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Fetching bug report for gnome-todo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Fetched bug report for libpeas-1.0-0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Fetched bug report for libgnome-todo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Fetched bug report for gnome-todo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 5 / 5 items: [##############################] 100.0% of 765 KiB
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Downloaded data to /tmp/gnome-todo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>16:49 ♒ ॐ ☺ 😄 &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;!-- raw HTML omitted -->
&lt;p>Note: The fact is that &lt;em>&lt;strong>apt-offline&lt;/strong>&lt;/em> will not do any checksum validation for the .deb files. The validation is completely delegated to &lt;code>apt&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-plain" data-lang="plain">&lt;span style="display:flex;">&lt;span>rrs@priyasi:/tmp/gnome-todo$ sudo apt-offline install -h
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>usage: apt-offline install [-h] [--verbose] [--simulate]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [--install-src-path INSTALL_SRC_PATH]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [--skip-bug-reports] [--skip-changelog]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [--allow-unauthenticated] [--strict-deb-check]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> apt-offline-download.zip | apt-offline-download/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>positional arguments:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> apt-offline-download.zip | apt-offline-download/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Install apt-offline data, a bundle file or a directory
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>optional arguments:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> -h, --help show this help message and exit
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --verbose Enable verbose messages
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --simulate Just simulate. Very helpful when debugging
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --install-src-path INSTALL_SRC_PATH
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Install src packages to specified path.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --skip-bug-reports Skip the bug report check
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --skip-changelog Skip display of changelog
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --allow-unauthenticated
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Ignore apt gpg signatures mismatch
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --strict-deb-check Perform strict checksum validaton for downloaded .deb
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> files
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>16:50 ♒ ॐ ☺ 😄 &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>and from the manpage:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-markdown" data-lang="markdown">&lt;span style="display:flex;">&lt;span> --strict-deb-check
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> With this option enabled, apt-offline delegate&amp;#39;s .deb package checksum validation to apt. While the .debs are already avail‐
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> able, they are stored in the temporary apt cache, where apt validates its checksum, before considering it for further pro‐
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cessing. Note: This does have the caveat that apt may need network availability even though it doesn&amp;#39;t download anything
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> over the network. But it does invoke the download routines and realizes that the payload is already available. It then fur‐
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ther proceeds with checksum validation
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> The default behavior is to not do strict checksum validation for .deb files. Instead, apt-offline copies the .deb files to
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> apt&amp;#39;s download location. apt still does size validation of the available .deb files and discards them in case there is a mis‐
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match.&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;!-- raw HTML omitted -->
&lt;p>Before we proceed with the example of checksum verification for .deb files, lets do a pristine run of the downloaded files, without any tampering to them.&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">25
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">26
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">27
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">28
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">29
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">30
&lt;/span>&lt;span style="background-color:#3c3d38">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">31
&lt;/span>&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">32
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">33
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">34
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">35
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;">&lt;code class="language-plain" data-lang="plain">&lt;span style="display:flex;">&lt;span>rrs@priyasi:/tmp/gnome-todo$ sudo apt-offline install .
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Proceeding with installation
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Following are the list of bugs present.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>822525 gnome-todo : gnome-todo: Memory leak while loading local and remote lists
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>853114 gnome-todo : no longer loads caldav lists
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>883961 libgnome-todo : libgnome-todo: Not actually a library
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>829470 libpeas-1.0-0 : libpeas: Python Plugin Broken
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(Y) Yes. Proceed with installation
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(N) No, Abort.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(R) Redisplay the list of bugs.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(Bug Number) Display the bug report from the Offline Bug Reports.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(?) Display this help message.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>What would you like to do next: (y, N, ?)y
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gnome-todo_3.28.1-5_amd64.deb file synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>libgnome-todo_3.28.1-5_amd64.deb file synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gnome-todo-common_3.28.1-5_all.deb file synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>libpeas-1.0-0_1.22.0-5_amd64.deb file synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>libpeas-common_1.22.0-5_all.deb file synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>16:51 ♒ ॐ ☺ 😄
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rrs@priyasi:/tmp/gnome-todo$ sudo apt install gnome-todo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Reading package lists... Done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Building dependency tree
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Reading state information... Done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>The following additional packages will be installed:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> gnome-todo-common libgnome-todo libpeas-1.0-0 libpeas-common
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>The following NEW packages will be installed:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> gnome-todo gnome-todo-common libgnome-todo libpeas-1.0-0 libpeas-common
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>0 upgraded, 5 newly installed, 0 to remove and 1 not upgraded.
&lt;/span>&lt;/span>&lt;span style="display:flex; background-color:#3c3d38">&lt;span>Need to get 0 B/784 kB of archives.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>After this operation, 2,337 kB of additional disk space will be used.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Do you want to continue? [Y/n] n
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Abort.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>16:51 ♒ ॐ ☹ 😟=&amp;gt; 1 &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>In the above example, everything is clean and all requirements to apt are satisfied.&lt;/p>
&lt;!-- raw HTML omitted -->
&lt;p>Here&amp;rsquo;s one more exaple, where we invoke the non-default &lt;code>--strict-deb-check&lt;/code> option.&lt;/p>
&lt;p>Everything remains the same, but apt gives a prompt saying that it needs to download the payload from the web. The reality is that if you just proceed with yes, nothing gets downloaded.&lt;/p>
&lt;p>Note: It is not possible to explain that with a still presentation and I&amp;rsquo;m lazy to make a motion object of it.&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">25
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">26
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">27
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">28
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">29
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">30
&lt;/span>&lt;span style="background-color:#3c3d38">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">31
&lt;/span>&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">32
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">33
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">34
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">35
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">36
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">37
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">38
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">39
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">40
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">41
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">42
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;">&lt;code class="language-plain" data-lang="plain">&lt;span style="display:flex;">&lt;span>rrs@priyasi:/tmp/gnome-todo$ sudo apt-offline install . --strict-deb-check
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Proceeding with installation
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Following are the list of bugs present.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>822525 gnome-todo : gnome-todo: Memory leak while loading local and remote lists
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>853114 gnome-todo : no longer loads caldav lists
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>883961 libgnome-todo : libgnome-todo: Not actually a library
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>829470 libpeas-1.0-0 : libpeas: Python Plugin Broken
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(Y) Yes. Proceed with installation
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(N) No, Abort.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(R) Redisplay the list of bugs.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(Bug Number) Display the bug report from the Offline Bug Reports.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(?) Display this help message.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>What would you like to do next: (y, N, ?)y
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gnome-todo_3.28.1-5_amd64.deb file synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>libgnome-todo_3.28.1-5_amd64.deb file synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gnome-todo-common_3.28.1-5_all.deb file synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>libpeas-1.0-0_1.22.0-5_amd64.deb file synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>libpeas-common_1.22.0-5_all.deb file synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>16:52 ♒ ॐ ☺ 😄
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rrs@priyasi:/tmp/gnome-todo$ sudo apt install gnome-todo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Reading package lists... Done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Building dependency tree
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Reading state information... Done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>The following additional packages will be installed:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> gnome-todo-common libgnome-todo libpeas-1.0-0 libpeas-common
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>The following NEW packages will be installed:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> gnome-todo gnome-todo-common libgnome-todo libpeas-1.0-0 libpeas-common
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>0 upgraded, 5 newly installed, 0 to remove and 1 not upgraded.
&lt;/span>&lt;/span>&lt;span style="display:flex; background-color:#3c3d38">&lt;span>Need to get 784 kB of archives.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>After this operation, 2,337 kB of additional disk space will be used.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Do you want to continue? [Y/n]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Get:1 http://deb.debian.org/debian testing/main amd64 libpeas-common all 1.22.0-5 [192 kB]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Get:2 http://deb.debian.org/debian testing/main amd64 libpeas-1.0-0 amd64 1.22.0-5 [201 kB]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Get:3 http://deb.debian.org/debian testing/main amd64 gnome-todo-common all 3.28.1-5 [234 kB]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Get:4 http://deb.debian.org/debian testing/main amd64 libgnome-todo amd64 3.28.1-5 [6,260 B]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Get:5 http://deb.debian.org/debian testing/main amd64 gnome-todo amd64 3.28.1-5 [150 kB]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Retrieving bug reports... Done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Parsing Found/Fixed information... Done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.....snipped.....
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>16:53 ♒ ॐ ☺ 😄 &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>To sum it up, this one is an odd case because though nothing for the debs is downloaded, BUT, the network needs to be active for this co-routine to run. If, say, the network is unavailable, apt complains. I haven&amp;rsquo;t checked, but apt does invoke some network code.&lt;/p>
&lt;p>But no payload is downloaded. apt just validates and realizes that all the to-be-downloaded data, is intact and available.&lt;/p>
&lt;!-- raw HTML omitted -->
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-plain" data-lang="plain">&lt;span style="display:flex;">&lt;span>rrs@priyasi:/tmp/gnome-todo$ echo fasdfadsfasdfasdfasd &amp;gt;&amp;gt; gnome-todo_3.28.1-5_amd64.deb
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>16:54 ♒ ॐ ☺ 😄
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rrs@priyasi:/tmp/gnome-todo$ sudo apt clean
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>16:54 ♒ ॐ ☺ 😄 &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;!-- raw HTML omitted -->
&lt;p>So we tampered one of the .deb files, &lt;code>gnome-todo_3.28.1-5_amd64.deb&lt;/code>. And ask &lt;em>&lt;strong>apt-offline&lt;/strong>&lt;/em> to run its &amp;lsquo;install&amp;rsquo; operation along with the new &lt;code>--strict-deb-check&lt;/code> option.&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">25
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">26
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">27
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">28
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">29
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">30
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">31
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">32
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">33
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">34
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">35
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">36
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">37
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">38
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">39
&lt;/span>&lt;span style="background-color:#3c3d38">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">40
&lt;/span>&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">41
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">42
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">43
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">44
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;">&lt;code class="language-plain" data-lang="plain">&lt;span style="display:flex;">&lt;span>rrs@priyasi:/tmp/gnome-todo$ sudo apt-offline install . --strict-deb-check
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Proceeding with installation
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Following are the list of bugs present.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>822525 gnome-todo : gnome-todo: Memory leak while loading local and remote lists
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>853114 gnome-todo : no longer loads caldav lists
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>883961 libgnome-todo : libgnome-todo: Not actually a library
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>829470 libpeas-1.0-0 : libpeas: Python Plugin Broken
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(Y) Yes. Proceed with installation
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(N) No, Abort.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(R) Redisplay the list of bugs.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(Bug Number) Display the bug report from the Offline Bug Reports.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(?) Display this help message.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>What would you like to do next: (y, N, ?)y
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gnome-todo_3.28.1-5_amd64.deb file synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>libgnome-todo_3.28.1-5_amd64.deb file synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gnome-todo-common_3.28.1-5_all.deb file synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>libpeas-1.0-0_1.22.0-5_amd64.deb file synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>libpeas-common_1.22.0-5_all.deb file synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>16:54 ♒ ॐ ☺ 😄
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rrs@priyasi:/tmp/gnome-todo$ sudo apt install gnome-todo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Reading package lists... Done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Building dependency tree
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Reading state information... Done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>The following additional packages will be installed:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> gnome-todo-common libgnome-todo libpeas-1.0-0 libpeas-common
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>The following NEW packages will be installed:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> gnome-todo gnome-todo-common libgnome-todo libpeas-1.0-0 libpeas-common
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>0 upgraded, 5 newly installed, 0 to remove and 1 not upgraded.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Need to get 784 kB of archives.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>After this operation, 2,337 kB of additional disk space will be used.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Do you want to continue? [Y/n]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Get:1 http://deb.debian.org/debian testing/main amd64 libpeas-common all 1.22.0-5 [192 kB]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Get:2 http://deb.debian.org/debian testing/main amd64 libpeas-1.0-0 amd64 1.22.0-5 [201 kB]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Get:3 http://deb.debian.org/debian testing/main amd64 gnome-todo-common all 3.28.1-5 [234 kB]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Get:4 http://deb.debian.org/debian testing/main amd64 libgnome-todo amd64 3.28.1-5 [6,260 B]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Get:5 http://deb.debian.org/debian testing/main amd64 gnome-todo amd64 3.28.1-5 [150 kB]
&lt;/span>&lt;/span>&lt;span style="display:flex; background-color:#3c3d38">&lt;span>Fetched 150 kB in 1s (141 kB/s)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Retrieving bug reports... Done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Parsing Found/Fixed information... Done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>16:55 ♒ ॐ ☹ 😟=&amp;gt; 100 &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>Pay attention to the downloaded data which is only 150 KiB, for the &lt;code>gnome-todo&lt;/code> package, which was tampered.
Even though &lt;code>apt&lt;/code> stated that it needs to download 784 KiB of data, it actually downloaded 150 KiB only. All data was already downloaded by &lt;code>apt-offline&lt;/code> but we had tampered one of the files, which resulted in it being re-downloaded.&lt;/p>
&lt;!-- raw HTML omitted -->
&lt;p>Now, lets do one more run with the default behavior of &lt;em>&lt;strong>apt-offline&lt;/strong>&lt;/em>, i.e. without the &lt;code>--strict-deb-check&lt;/code> option.
This will result in apt (internally) detecting the tampering and prompting the user that the (tampered) file needs to be downloaded&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">25
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">26
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">27
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">28
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">29
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">30
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">31
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">32
&lt;/span>&lt;span style="background-color:#3c3d38">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">33
&lt;/span>&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">34
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">35
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">36
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">37
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">38
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">39
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">40
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">41
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;display:grid;">&lt;code class="language-plain" data-lang="plain">&lt;span style="display:flex;">&lt;span>rrs@priyasi:/tmp/gnome-todo$ sudo apt-offline install .
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Proceeding with installation
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Following are the list of bugs present.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>822525 gnome-todo : gnome-todo: Memory leak while loading local and remote lists
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>853114 gnome-todo : no longer loads caldav lists
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>883961 libgnome-todo : libgnome-todo: Not actually a library
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>829470 libpeas-1.0-0 : libpeas: Python Plugin Broken
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(Y) Yes. Proceed with installation
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(N) No, Abort.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(R) Redisplay the list of bugs.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(Bug Number) Display the bug report from the Offline Bug Reports.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>(?) Display this help message.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>What would you like to do next: (y, N, ?)y
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gnome-todo_3.28.1-5_amd64.deb file synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>libgnome-todo_3.28.1-5_amd64.deb file synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gnome-todo-common_3.28.1-5_all.deb file synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>libpeas-1.0-0_1.22.0-5_amd64.deb file synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>libpeas-common_1.22.0-5_all.deb file synced.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>16:56 ♒ ॐ ☺ 😄
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rrs@priyasi:/tmp/gnome-todo$ sudo apt^C
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>16:56 ♒ ॐ ☹ 😟=&amp;gt; 130
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rrs@priyasi:/tmp/gnome-todo$ sudo apt install gnome-todo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Reading package lists... Done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Building dependency tree
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Reading state information... Done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>The following additional packages will be installed:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> gnome-todo-common libgnome-todo libpeas-1.0-0 libpeas-common
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>The following NEW packages will be installed:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> gnome-todo gnome-todo-common libgnome-todo libpeas-1.0-0 libpeas-common
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>0 upgraded, 5 newly installed, 0 to remove and 1 not upgraded.
&lt;/span>&lt;/span>&lt;span style="display:flex; background-color:#3c3d38">&lt;span>Need to get 150 kB/784 kB of archives.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>After this operation, 2,337 kB of additional disk space will be used.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Do you want to continue? [Y/n]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Get:1 http://deb.debian.org/debian testing/main amd64 gnome-todo amd64 3.28.1-5 [150 kB]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Fetched 150 kB in 0s (448 kB/s)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Retrieving bug reports... Done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Parsing Found/Fixed information... Done
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.....snipped......
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>16:57 ♒ ॐ ☺ 😄 &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>Notice the highlighted line, which gives a less confusing, realistic summary of what needs to be done. In this case, apt is prompting the user that 150 KiB of data needs to be downloaded, which indeed is the case.&lt;/p>
&lt;!-- raw HTML omitted --></description></item><item><title>Laptop Mode Tools 1.73</title><link>https://researchut.com/post/laptop-mode-tools-1_73/</link><pubDate>Sat, 11 Jan 2020 15:14:22 +0530</pubDate><author>rrs@researchut.com (Ritesh Raj Sarraf)</author><guid>https://researchut.com/post/laptop-mode-tools-1_73/</guid><description>&lt;h2 id="laptop-mode-tools-173">Laptop Mode Tools 1.73&lt;/h2>
&lt;p>I am pleased to announce the release of &lt;strong>Laptop Mode Tools&lt;/strong> version &lt;em>&lt;strong>1.73&lt;/strong>&lt;/em>&lt;/p>
&lt;p>This release includes many bug fixes. For user convenience, 2 command options
have been added.&lt;/p>
&lt;pre tabindex="0">&lt;code class="language-linux" data-lang="linux">rrs@priyasi:~$ laptop_mode -h
****************************
Following user commands are understood
status : Display a Laptop Mode Tools power savings status
power-stats : Display the power statistics on the machine
power-events : Trap power related events on the machine
help : Display this help message (--help, -h)
version : Display program version (--version, -v)
****************************
15:22 ♒ ॐ ☺ 😄
rrs@priyasi:~$ sudo laptop_mode status
[sudo] password for rrs:
Mounts:
/dev/mapper/nvme0n1p4_crypt on / type btrfs (rw,noatime,compress=zstd:3,ssd,space_cache,autodefrag,subvolid=5,subvol=/)
/dev/nvme0n1p3 on /boot type ext4 (rw,relatime)
/dev/nvme0n1p1 on /boot/efi type vfat (rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro)
/dev/fuse on /run/user/1000/doc type fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
Drive power status:
Cannot read /dev/[hs]d[abcdefgh], permission denied - /usr/sbin/laptop_mode needs to be run as root
(NOTE: drive settings affected by Laptop Mode cannot be retrieved.)
Readahead states:
/dev/mapper/nvme0n1p4_crypt: 128 kB
/dev/nvme0n1p3: 128 kB
/dev/nvme0n1p1: 128 kB
Laptop Mode Tools is allowed to run: /var/run/laptop-mode-tools/enabled exists.
/proc/sys/vm/laptop_mode:
0
/proc/sys/vm/dirty_ratio:
40
/proc/sys/fs/xfs/xfssyncd_centisecs:
3000
/proc/sys/vm/dirty_background_ratio:
10
/proc/sys/vm/dirty_expire_centisecs:
3000
/proc/sys/vm/dirty_writeback_centisecs:
500
......SNIPPED......
/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq:
400000
/sys/devices/system/cpu/cpu5/cpufreq/cpuinfo_max_freq:
2001000
/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor:
schedutil
/sys/devices/system/cpu/cpu7/cpufreq/scaling_governor:
schedutil
/proc/acpi/button/lid/LID0/state:
state: open
/sys/class/power_supply/AC/online:
1
/sys/class/power_supply/BAT0/status:
Charging
15:22 ♒ ॐ ☺ 😄
rrs@priyasi:~$ laptop_mode power-stats
Power Supply details for /sys/class/power_supply/AC
P: /devices/LNXSYSTM:00/LNXSYBUS:00/ACPI0003:00/power_supply/AC
L: 0
E: DEVPATH=/devices/LNXSYSTM:00/LNXSYBUS:00/ACPI0003:00/power_supply/AC
E: POWER_SUPPLY_NAME=AC
E: POWER_SUPPLY_ONLINE=1
E: SUBSYSTEM=power_supply
Power Supply details for /sys/class/power_supply/BAT0
P: /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0A:00/power_supply/BAT0
L: 0
E: DEVPATH=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0A:00/power_supply/BAT0
E: POWER_SUPPLY_NAME=BAT0
E: POWER_SUPPLY_STATUS=Charging
E: POWER_SUPPLY_PRESENT=1
E: POWER_SUPPLY_TECHNOLOGY=Li-poly
E: POWER_SUPPLY_CYCLE_COUNT=0
E: POWER_SUPPLY_VOLTAGE_MIN_DESIGN=7600000
E: POWER_SUPPLY_VOLTAGE_NOW=8760000
E: POWER_SUPPLY_CURRENT_NOW=545000
E: POWER_SUPPLY_CHARGE_FULL_DESIGN=6842000
E: POWER_SUPPLY_CHARGE_FULL=6592000
E: POWER_SUPPLY_CHARGE_NOW=6526000
E: POWER_SUPPLY_CAPACITY=98
E: POWER_SUPPLY_CAPACITY_LEVEL=Normal
E: POWER_SUPPLY_MODEL_NAME=DELL G8VCF6C
E: POWER_SUPPLY_MANUFACTURER=SMP
E: POWER_SUPPLY_SERIAL_NUMBER=1549
E: SUBSYSTEM=power_supply
15:23 ♒ ॐ ☺ 😄
rrs@priyasi:~$ laptop_mode power-events
Running Laptop Mode Tools in event tracing mode. Press ^C to interrupt
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent
KERNEL[140321.536870] change /devices/LNXSYSTM:00/LNXSYBUS:00/ACPI0003:00/power_supply/AC (power_supply)
ACTION=change
DEVPATH=/devices/LNXSYSTM:00/LNXSYBUS:00/ACPI0003:00/power_supply/AC
SUBSYSTEM=power_supply
POWER_SUPPLY_NAME=AC
POWER_SUPPLY_ONLINE=0
SEQNUM=5908
KERNEL[140321.569526] change /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
ACTION=change
DEVPATH=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0A:00/power_supply/BAT0
SUBSYSTEM=power_supply
POWER_SUPPLY_NAME=BAT0
POWER_SUPPLY_STATUS=Discharging
POWER_SUPPLY_PRESENT=1
POWER_SUPPLY_TECHNOLOGY=Li-poly
POWER_SUPPLY_CYCLE_COUNT=0
POWER_SUPPLY_VOLTAGE_MIN_DESIGN=7600000
POWER_SUPPLY_VOLTAGE_NOW=8761000
POWER_SUPPLY_CHARGE_FULL_DESIGN=6842000
POWER_SUPPLY_CHARGE_FULL=6592000
POWER_SUPPLY_CHARGE_NOW=6526000
POWER_SUPPLY_CAPACITY=98
POWER_SUPPLY_CAPACITY_LEVEL=Normal
POWER_SUPPLY_MODEL_NAME=DELL G8VCF6C
POWER_SUPPLY_MANUFACTURER=SMP
POWER_SUPPLY_SERIAL_NUMBER=1549
SEQNUM=5909
UDEV [140321.577770] change /devices/LNXSYSTM:00/LNXSYBUS:00/ACPI0003:00/power_supply/AC (power_supply)
ACTION=change
DEVPATH=/devices/LNXSYSTM:00/LNXSYBUS:00/ACPI0003:00/power_supply/AC
SUBSYSTEM=power_supply
POWER_SUPPLY_NAME=AC
POWER_SUPPLY_ONLINE=0
SEQNUM=5908
USEC_INITIALIZED=140321550931
UDEV [140321.582123] change /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
ACTION=change
DEVPATH=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0A:00/power_supply/BAT0
SUBSYSTEM=power_supply
POWER_SUPPLY_NAME=BAT0
POWER_SUPPLY_STATUS=Discharging
POWER_SUPPLY_PRESENT=1
POWER_SUPPLY_TECHNOLOGY=Li-poly
POWER_SUPPLY_CYCLE_COUNT=0
POWER_SUPPLY_VOLTAGE_MIN_DESIGN=7600000
POWER_SUPPLY_VOLTAGE_NOW=8761000
POWER_SUPPLY_CHARGE_FULL_DESIGN=6842000
POWER_SUPPLY_CHARGE_FULL=6592000
POWER_SUPPLY_CHARGE_NOW=6526000
POWER_SUPPLY_CAPACITY=98
POWER_SUPPLY_CAPACITY_LEVEL=Normal
POWER_SUPPLY_MODEL_NAME=DELL G8VCF6C
POWER_SUPPLY_MANUFACTURER=SMP
POWER_SUPPLY_SERIAL_NUMBER=1549
SEQNUM=5909
USEC_INITIALIZED=140321580812
KERNEL[140324.857185] change /devices/LNXSYSTM:00/LNXSYBUS:00/ACPI0003:00/power_supply/AC (power_supply)
ACTION=change
DEVPATH=/devices/LNXSYSTM:00/LNXSYBUS:00/ACPI0003:00/power_supply/AC
SUBSYSTEM=power_supply
POWER_SUPPLY_NAME=AC
POWER_SUPPLY_ONLINE=1
SEQNUM=5912
UDEV [140324.916156] change /devices/LNXSYSTM:00/LNXSYBUS:00/ACPI0003:00/power_supply/AC (power_supply)
ACTION=change
DEVPATH=/devices/LNXSYSTM:00/LNXSYBUS:00/ACPI0003:00/power_supply/AC
SUBSYSTEM=power_supply
POWER_SUPPLY_NAME=AC
POWER_SUPPLY_ONLINE=1
SEQNUM=5912
USEC_INITIALIZED=140324887055
KERNEL[140324.917955] change /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
ACTION=change
DEVPATH=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0A:00/power_supply/BAT0
SUBSYSTEM=power_supply
POWER_SUPPLY_NAME=BAT0
POWER_SUPPLY_STATUS=Unknown
POWER_SUPPLY_PRESENT=1
POWER_SUPPLY_TECHNOLOGY=Li-poly
POWER_SUPPLY_CYCLE_COUNT=0
POWER_SUPPLY_VOLTAGE_MIN_DESIGN=7600000
POWER_SUPPLY_VOLTAGE_NOW=8622000
POWER_SUPPLY_CHARGE_FULL_DESIGN=6842000
POWER_SUPPLY_CHARGE_FULL=6592000
POWER_SUPPLY_CHARGE_NOW=6526000
POWER_SUPPLY_CAPACITY=98
POWER_SUPPLY_CAPACITY_LEVEL=Normal
POWER_SUPPLY_MODEL_NAME=DELL G8VCF6C
POWER_SUPPLY_MANUFACTURER=SMP
POWER_SUPPLY_SERIAL_NUMBER=1549
SEQNUM=5913
UDEV [140324.922916] change /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
ACTION=change
DEVPATH=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0A:00/power_supply/BAT0
SUBSYSTEM=power_supply
POWER_SUPPLY_NAME=BAT0
POWER_SUPPLY_STATUS=Unknown
POWER_SUPPLY_PRESENT=1
POWER_SUPPLY_TECHNOLOGY=Li-poly
POWER_SUPPLY_CYCLE_COUNT=0
POWER_SUPPLY_VOLTAGE_MIN_DESIGN=7600000
POWER_SUPPLY_VOLTAGE_NOW=8622000
POWER_SUPPLY_CHARGE_FULL_DESIGN=6842000
POWER_SUPPLY_CHARGE_FULL=6592000
POWER_SUPPLY_CHARGE_NOW=6526000
POWER_SUPPLY_CAPACITY=98
POWER_SUPPLY_CAPACITY_LEVEL=Normal
POWER_SUPPLY_MODEL_NAME=DELL G8VCF6C
POWER_SUPPLY_MANUFACTURER=SMP
POWER_SUPPLY_SERIAL_NUMBER=1549
SEQNUM=5913
USEC_INITIALIZED=140324922572
^C
15:24 ♒ ॐ ☹ 😟=&amp;gt; 130 &lt;/code>&lt;/pre>
&lt;p>A filtered list of changes is mentioned below. For the full log, please refer to the git repository.&lt;/p>
&lt;h3 id="173---sat-jan-11-145211-ist-2020">1.73 - Sat Jan 11 14:52:11 IST 2020&lt;/h3>
&lt;pre>&lt;code>* Respect black/white lists when disabling autosuspend
* Add newer power supply names
* Fix crash due external battery of mouse
* Honor configuration setting for battery level polling
* cpufreq: intel_pstate should use performance governors
* runtime-pm: Speed up by avoiding fork in echo_to_file
* runtime-pm: Inline echo_to_file_do
* runtime-pm: Fix echo_to_file* indentation
* runtime-pm: Speed up by avoiding fork in listed_by_{id,type}
* runtime-pm: Simplify vendor/product match
* add help and verison user commands
* Add a power-stats status command
* Separate power sysfs attributes and add sysfs status attribute
* Add device type 'sd' to default blacklist
* Fix rpm spec file for new installable files
&lt;/code>&lt;/pre>
&lt;p>Source tarball, Feodra/SUSE RPM Packages available at:
&lt;a href="https://github.com/rickysarraf/laptop-mode-tools/releases">https://github.com/rickysarraf/laptop-mode-tools/releases&lt;/a>&lt;/p>
&lt;p>Debian packages will be available soon in Unstable.&lt;/p>
&lt;p>Homepage: &lt;a href="https://github.com/rickysarraf/laptop-mode-tools/wiki">https://github.com/rickysarraf/laptop-mode-tools/wiki&lt;/a>&lt;/p>
&lt;p>Mailing List: &lt;a href="https://groups.google.com/d/forum/laptop-mode-tools">https://groups.google.com/d/forum/laptop-mode-tools&lt;/a>&lt;/p>
&lt;h2 id="what-is-laptop-mode-tools">What is Laptop Mode Tools&lt;/h2>
&lt;pre tabindex="0">&lt;code>Description: Tools for Power Savings based on battery/AC status
Laptop mode is a Linux kernel feature that allows your laptop to save
considerable power, by allowing the hard drive to spin down for longer
periods of time. This package contains the userland scripts that are
needed to enable laptop mode.
.
It includes support for automatically enabling laptop mode when the
computer is working on batteries. It also supports various other power
management features, such as starting and stopping daemons depending on
power mode, automatically hibernating if battery levels are too low, and
adjusting terminal blanking and X11 screen blanking
.
laptop-mode-tools uses the Linux kernel&amp;#39;s Laptop Mode feature and thus
is also used on Desktops and Servers to conserve power
&lt;/code>&lt;/pre></description></item><item><title>User Mode Linux 5.2</title><link>https://researchut.com/blog/user-mode-linux-52/</link><pubDate>Thu, 17 Oct 2019 19:34:00 +0530</pubDate><author>rrs@researchut.com (Ritesh Raj Sarraf)</author><guid>https://researchut.com/blog/user-mode-linux-52/</guid><description>&lt;h2 id="user-mode-linux-52">User Mode Linux 5.2&lt;/h2>
&lt;p>User Mode Linux version 5.2 has been uploaded to Debian Unstable and will soon be available on the supported architectures. This upload took more time than usual as I ran into a build time failure caused by newer &lt;em>PCAP&lt;/em> library.&lt;/p>
&lt;p>Thanks to active upstream developers, this got &lt;a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=938962#84">sorted out quick&lt;/a>. In the longer run, we may have a much better fix for it.&lt;/p>
&lt;h3 id="what-is-user-mode-linux-aka-uml">What is User Mode Linux a.k.a uml&lt;/h3>
&lt;p>It is one of the initial virtualization technologies that Linux provided, which still works and is supported/maintained. It is about running a Linux kernel as a single unprivileged &lt;strong>user process&lt;/strong>.&lt;/p>
&lt;p>There was a similar project, &lt;strong>coLinux&lt;/strong>, that had a port of &lt;em>Linux kernel&lt;/em> to Microsoft Windows, that I used to recommend to people, that were more familiar to Microsoft Windows environment. Conceptually, it was very similar to &lt;em>UML&lt;/em>. With &lt;strong>coLinux, XMing and PulseAudio&lt;/strong>, it was a delight to see &lt;em>GNU/Linux&lt;/em> based applications to run efficiently on Microsoft Windows.&lt;/p>
&lt;p>That was years ago. Unfortunately, the last time I checked on &lt;em>coLinux&lt;/em>, it did not seem to be maintained any more. &lt;em>User Mode Linux&lt;/em> too hasn&amp;rsquo;t had a very large user/developer base but, despite, it being part of the &lt;em>Linux&lt;/em> kernel has kept it fairly well maintained.&lt;/p>
&lt;p>The good news is that for the last 2 years or so, &lt;em>uml&lt;/em> has had active maintainers/developers for this project. So I expect to see some parity in terms of features and performance numbers eventually. Things like &lt;strong>virtio&lt;/strong> could definitely bring in a lot of performance improvements to &lt;em>UML&lt;/em>. And much wider user acceptance ultimately.&lt;/p>
&lt;p>To quote the Debian package description:&lt;/p>
&lt;pre tabindex="0">&lt;code>Package: user-mode-linux
Version: 5.2-1um-1
Built-Using: linux (= 5.2.17-1)
Status: install ok installed
Priority: extra
Section: kernel
Maintainer: User Mode Linux Maintainers &amp;lt;team+uml@tracker.debian.org&amp;gt;
Installed-Size: 43.7 MB
Depends: libc6 (&amp;gt;= 2.28)
Recommends: uml-utilities (&amp;gt;= 20040406-1)
Suggests: x-terminal-emulator, rootstrap, user-mode-linux-doc, slirp, vde2
Homepage: http://user-mode-linux.sourceforge.net/
Download-Size: unknown
APT-Manual-Installed: yes
APT-Sources: /var/lib/dpkg/status
Description: User-mode Linux (kernel)
User-mode Linux (UML) is a port of the Linux kernel to its own system
call interface. It provides a kind of virtual machine, which runs
Linux as a user process under another Linux kernel. This is useful
for kernel development, sandboxes, jails, experimentation, and many
other things.
.
This package contains the kernel itself, as an executable program,
and the associated kernel modules.
&lt;/code>&lt;/pre>&lt;h3 id="user-mode-linux-networking">User Mode Linux networking&lt;/h3>
&lt;p>I have been maintaining &lt;em>User Mode Linux for Debian&lt;/em> for a couple of years now but one area where I still waste a lot of time at times, is networking.&lt;/p>
&lt;p>Today, we have these major virt technologies: &lt;strong>Virtualizaiton, Containers and UML&lt;/strong>. For simplicity, I am keeping &lt;em>UML&lt;/em> as a separate type.&lt;/p>
&lt;p>For my needs, I prefer keeping a single bridge on my laptop, to which all different types of technologies can talk through, to access the network. By keeping everything through the bridge, I get to focus on just one entry/exit point for &lt;em>firewall, monitoring, trouble shooting etc&lt;/em>.&lt;/p>
&lt;p>As of today, easily:&lt;/p>
&lt;ul>
&lt;li>VirtualBox can talk to my local bridge&lt;/li>
&lt;li>Libvirt/Qemu can talk to my local bridge&lt;/li>
&lt;li>Docker can too&lt;/li>
&lt;li>systemd-nspawn can also&lt;/li>
&lt;/ul>
&lt;p>The only challenge comes in with &lt;em>UML&lt;/em> where in I have had to setup a separate &lt;em>tun&lt;/em> interface and make &lt;em>UML&lt;/em> talk through it using &lt;strong>Tuntap Daemon Mode&lt;/strong>. And on the host, I do &lt;em>NAT&lt;/em> to get it talk to the internet.&lt;/p>
&lt;p>Ideally, I would like to simply tell &lt;em>UML&lt;/em> that this is my bridge device and that it should associate itself to it for networking. I looked at &lt;code>vde&lt;/code> and found a wrapper &lt;code>vdeq&lt;/code>. Something like this for &lt;em>UML&lt;/em> could simplify things a lot.&lt;/p>
&lt;p>&lt;em>UML&lt;/em> also has an &lt;code>=vde&lt;/code> mode wherein it can attach itself to. But from the looks of it, it is similar to what we already provide through &lt;em>uml-utilities&lt;/em> in &lt;em>tuntap daemon&lt;/em> mode&lt;/p>
&lt;p>I am curious if other &lt;em>User Mode Linux&lt;/em> users have simplified ways to get networking set up. And ideally, if it can be setup through Debian&amp;rsquo;s &lt;code>networking ifup scripts&lt;/code> or through &lt;code>systemd-networkd&lt;/code>. If so, I would really appreciate if you could drop me a note over email &lt;strong>until I find a simple and clean way to get comments setup ready for my blog&lt;/strong>&lt;/p></description></item><item><title>Bpfcc New Release</title><link>https://researchut.com/blog/Bpfcc_New_Release/</link><pubDate>Mon, 14 Oct 2019 14:54:33 +0530</pubDate><author>rrs@researchut.com (Ritesh Raj Sarraf)</author><guid>https://researchut.com/blog/Bpfcc_New_Release/</guid><description>&lt;h2 id="bpf-compiler-collection-0110">BPF Compiler Collection 0.11.0&lt;/h2>
&lt;p>&lt;a href="https://github.com/iovisor/bcc">bpfcc&lt;/a> version 0.11.0 has been uploaded to Debian Unstable and should be accessible in the repositories by now. After the &lt;code>0.8.0&lt;/code> release, this has been the next one uploaded to Debian.&lt;/p>
&lt;h3 id="multiple-source-respositories">Multiple source respositories&lt;/h3>
&lt;p>This release brought in dependencies to another set of sources from the &lt;a href="https://github.com/libbpf/libbpf">libbpf&lt;/a> project. In the upstream repo, this is still a &lt;a href="https://github.com/iovisor/bcc/issues/2261">topic of discussion&lt;/a> on how to release tools where one depends on another, in unison. Right now, &lt;em>libbpf&lt;/em> is configured as a &lt;em>git submodule&lt;/em> in the &lt;em>bcc&lt;/em> repository. So anyone using the upstream git repoistory should be able to build it.&lt;/p>
&lt;h3 id="multiple-source-archive-for-a-debian-package">Multiple source archive for a Debian package&lt;/h3>
&lt;p>So I had read in the past about &lt;strong>Multiple source tarballs for a single package&lt;/strong> in Debian but never tried it because I wasn&amp;rsquo;t maintaining anything in Debian which was such. With &lt;em>bpfcc&lt;/em> it was now a good opportunity to try it out. First, I came across &lt;a href="https://raphaelhertzog.com/2010/09/07/how-to-use-multiple-upstream-tarballs-in-debian-source-packages/">this&lt;/a> post from &lt;strong>Raphaël Hertzog&lt;/strong> which gives a good explanation of what all has been done. This article was very clear and concise on the topic&lt;/p>
&lt;h3 id="git-buildpackage">Git Buildpackage&lt;/h3>
&lt;p>&lt;em>gbp&lt;/em> is my tool of choice for packaging in Debian. So I did a quick look to check how &lt;em>gbp&lt;/em> would take care of it. And everything was in place and &lt;strong>Just Worked&lt;/strong>&lt;/p>
&lt;pre tabindex="0">&lt;code>rrs@priyasi:~/rrs-home/Community/Packaging/bpfcc (master)$ gbp buildpackage --git-component=libbpf
gbp:info: Creating /home/rrs/NoBackup/Community/Packaging/bpfcc_0.11.0.orig.tar.gz
gbp:info: Creating /home/rrs/NoBackup/Community/Packaging/bpfcc_0.11.0.orig-libbpf.tar.gz
gbp:info: Performing the build
dpkg-checkbuilddeps: error: Unmet build dependencies: arping clang-format cmake iperf libclang-dev libedit-dev libelf-dev libzip-dev llvm-dev libluajit-5.1-dev luajit python3-pyroute2
W: Unmet build-dependency in source
dpkg-source: info: using patch list from debian/patches/series
dpkg-source: info: applying fix-install-path.patch
dh clean --buildsystem=cmake --with python3 --no-parallel
dh_auto_clean -O--buildsystem=cmake -O--no-parallel
dh_autoreconf_clean -O--buildsystem=cmake -O--no-parallel
dh_clean -O--buildsystem=cmake -O--no-parallel
dpkg-source: info: using source format &amp;#39;3.0 (quilt)&amp;#39;
dpkg-source: info: building bpfcc using existing ./bpfcc_0.11.0.orig-libbpf.tar.gz
dpkg-source: info: building bpfcc using existing ./bpfcc_0.11.0.orig.tar.gz
dpkg-source: info: using patch list from debian/patches/series
dpkg-source: warning: ignoring deletion of directory src/cc/libbpf
dpkg-source: info: building bpfcc in bpfcc_0.11.0-1.debian.tar.xz
dpkg-source: info: building bpfcc in bpfcc_0.11.0-1.dsc
I: Generating source changes file for original dsc
dpkg-genchanges: info: including full source code in upload
dpkg-source: info: unapplying fix-install-path.patch
ERROR: ld.so: object &amp;#39;libeatmydata.so&amp;#39; from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
W: cgroups are not available on the host, not using them.
I: pbuilder: network access will be disabled during build
I: Current time: Sun Oct 13 19:53:57 IST 2019
I: pbuilder-time-stamp: 1570976637
I: Building the build Environment
I: extracting base tarball [/var/cache/pbuilder/sid-amd64-base.tgz]
I: copying local configuration
I: mounting /proc filesystem
I: mounting /sys filesystem
I: creating /{dev,run}/shm
I: mounting /dev/pts filesystem
I: redirecting /dev/ptmx to /dev/pts/ptmx
I: Mounting /var/cache/apt/archives/
I: policy-rc.d already exists
W: Could not create compatibility symlink because /tmp/buildd exists and it is not a directory
I: using eatmydata during job
I: Using pkgname logfile
I: Current time: Sun Oct 13 19:54:04 IST 2019
I: pbuilder-time-stamp: 1570976644
I: Setting up ccache
I: Copying source file
I: copying [../bpfcc_0.11.0-1.dsc]
I: copying [../bpfcc_0.11.0.orig-libbpf.tar.gz]
I: copying [../bpfcc_0.11.0.orig.tar.gz]
I: copying [../bpfcc_0.11.0-1.debian.tar.xz]
I: Extracting source
dpkg-source: warning: extracting unsigned source package (bpfcc_0.11.0-1.dsc)
dpkg-source: info: extracting bpfcc in bpfcc-0.11.0
dpkg-source: info: unpacking bpfcc_0.11.0.orig.tar.gz
dpkg-source: info: unpacking bpfcc_0.11.0.orig-libbpf.tar.gz
dpkg-source: info: unpacking bpfcc_0.11.0-1.debian.tar.xz
dpkg-source: info: using patch list from debian/patches/series
dpkg-source: info: applying fix-install-path.patch
I: Not using root during the build.
&lt;/code>&lt;/pre></description></item><item><title>Cross Architecture Linux Containers</title><link>https://researchut.com/blog/Cross_Architecture_Linux_Containers/</link><pubDate>Fri, 19 Jul 2019 21:34:02 +0530</pubDate><author>rrs@researchut.com (Ritesh Raj Sarraf)</author><guid>https://researchut.com/blog/Cross_Architecture_Linux_Containers/</guid><description>&lt;h2 id="linux-and-arm">Linux and ARM&lt;/h2>
&lt;p>With more ARM based devices in the market, and with them getting more powerful every day,
it is more common to see more of ARM images for your favorite Linux distribution. Of them,
&lt;strong>Debian&lt;/strong> has become the default choice for individuals and companies to base their work on.
It must have to do with Debian&amp;rsquo;s long history of trying to support many more architectures than
the rest of the distributions. Debian also tends to have a much wider user/developer mindshare
even though it does not have a direct backing from any of the big Linux distribution companies.&lt;/p>
&lt;p>Some of my work involves doing packaging and integration work which reflects on all architectures
and image types; ARM included. So having the respective environment readily available is really
important to get work done quicker.&lt;/p>
&lt;p>I still recollect back in 2004, when I was much newer to &lt;em>Linux Enterprise&lt;/em> while working at a big Computer Hardware Company, I had heard about the &lt;em>Itanium 64&lt;/em> architecture. Back then, trying out anything other than &lt;em>x86&lt;/em> would mean you need access to physical
hardware. Or be a DD and have shell access the Debian Machines.&lt;/p>
&lt;p>With Linux Virtualization, a lot seems to have improved over time.&lt;/p>
&lt;h2 id="linux-virtualization">Linux Virtualization&lt;/h2>
&lt;p>With a decently powered processor with virtualization support, you can emulate a lot of architectures that Linux supports.&lt;/p>
&lt;p>Linux has many virtualization options but the main dominant ones are &lt;strong>KVM/Qemu, Xen and VirtualBox&lt;/strong>.
&lt;em>Qemu&lt;/em> is the most feature-rich virtualization choice on Linux with a wide range of architectures that
it can emulate.&lt;/p>
&lt;p>In case of ARM, things are still a bit tricky as hardware definition is tightly coupled. Emulating device type
on a virtualized Qemu is not straightforward as x86 architecture. Thankfully, in &lt;code>libvirt&lt;/code>, you can be provided
with a generic machine type called &lt;strong>virt&lt;/strong>. For basic cross architecture tasks, this should be enough.&lt;/p>
&lt;link rel="stylesheet" href="https://researchut.com/css/hugo-easy-gallery.css" />
&lt;div class="box" >
&lt;figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">
&lt;div class="img">
&lt;img itemprop="thumbnail" src="https://researchut.com/images/virt-profile-libvirt.png" alt="virt board profile under libvirt"/>
&lt;/div>
&lt;a href="https://researchut.com/images/virt-profile-libvirt.png" itemprop="contentUrl">&lt;/a>
&lt;figcaption>&lt;h4>virt board profile under libvirt&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;/div>
&lt;p>But, while, virtualization is a nice progression, it is not always an optimal one. For one, it needs good device virtualization
support, which can be tricky in the ARM context. Second, it can be (very) slow at times.&lt;/p>
&lt;p>And unless you are doing low-level hardware specific work, you can look for an alternative in &lt;strong>Linux Containers&lt;/strong>&lt;/p>
&lt;h2 id="linux-containers">Linux Containers&lt;/h2>
&lt;p>So this is nothing new now. Lots and lots of buzz around containers already. There&amp;rsquo;s many different implementations
across platforms supporting similar concept. From good old &lt;em>chroot (with limited functionality), jails (on BSD)&lt;/em>, to
well marketed products like: &lt;em>Docker, LXC, systemd-nspawn&lt;/em>. There&amp;rsquo;s also some like &lt;em>firejail&lt;/em> targeting specific use cases.&lt;/p>
&lt;p>As long as you do not have tight dependency on the hardware &lt;strong>or&lt;/strong> a dependency on the specific parts of the Linux kernel (like once I
explored the possibility of running &lt;em>open-iscsi&lt;/em> in a containerized environment instead), &lt;em>containers&lt;/em> are a quick way to get
an equal environment. Especially, things like &lt;strong>Process, Namespace and Network separation&lt;/strong> are awesome helping me concentrate on the work
rather than putting the focus on &lt;strong>Host &amp;lt;=&amp;gt; Guest&lt;/strong> issues.&lt;/p>
&lt;p>Given how fast work can be accomplished with containers, I have been wanting to explore the possibility of building container images
for ARM and other architectures that I care about.&lt;/p>
&lt;p>The good thing is that architecture virtualization is offered through &lt;strong>Qemu&lt;/strong> and the same tool also provides similar architecture
emulation. So features and fixes have a higher chance of parity as they are being served from the same tool.&lt;/p>
&lt;h2 id="systemd-nspawn">systemd-nspawn&lt;/h2>
&lt;p>I haven&amp;rsquo;t explored all the container implementations that Linux has to offer. Initially, I used &lt;strong>LXC&lt;/strong> for a while. But these days,
for my work it is &lt;strong>docker&lt;/strong>, while my personal preference lies with &lt;strong>systemd-nspawn&lt;/strong>.&lt;/p>
&lt;p>Part of the reason is simply because I have grown
more familiar with &lt;strong>systemd&lt;/strong> given it is the house keeper for my operating system now. And also, so far, I like most of what &lt;em>systemd&lt;/em> offers.&lt;/p>
&lt;h2 id="getting-cross-architecture-containers-under-debian-gnulinux">Getting Cross Architecture Containers under Debian GNU/Linux&lt;/h2>
&lt;ul>
&lt;li>Use &lt;code>qemu-user-static&lt;/code> for emulation&lt;/li>
&lt;li>Generate cross architecture chroot images with &lt;code>qemu-debootstrap&lt;/code>&lt;/li>
&lt;li>Import those as sub-volumes under &lt;code>systemd-nspawn&lt;/code>&lt;/li>
&lt;li>Set a template for your containers and other misc stuff&lt;/li>
&lt;/ul>
&lt;h3 id="glitches">Glitches&lt;/h3>
&lt;p>Not everything works perfect but most of it does work.&lt;/p>
&lt;p>Here&amp;rsquo;s my container list. Subvolumed containers do help de-duplicate and save some space. They are also very very quick when creating a clone for the container&lt;/p>
&lt;pre tabindex="0">&lt;code class="language-linux" data-lang="linux">rrs@priyasi:~$ machinectl list-images
NAME TYPE RO USAGE CREATED MODIFIED
2019 subvolume no n/a Mon 2019-06-10 09:18:26 IST n/a
SDK1812 subvolume no n/a Mon 2018-10-15 12:45:39 IST n/a
BusterArm64 subvolume no n/a Mon 2019-06-03 14:49:40 IST n/a
DebSidArm64 subvolume no n/a Mon 2019-06-03 14:56:42 IST n/a
DebSidArmhf subvolume no n/a Mon 2018-07-23 21:18:42 IST n/a
DebSidMips subvolume no n/a Sat 2019-06-01 08:31:34 IST n/a
DebianJessieTemplate subvolume no n/a Mon 2018-07-23 21:18:54 IST n/a
DebianSidTemplate subvolume no n/a Mon 2018-07-23 21:18:05 IST n/a
aptVerifySigsDebSid subvolume no n/a Mon 2018-07-23 21:19:04 IST n/a
jenkins-builder subvolume no n/a Tue 2018-11-27 20:11:42 IST n/a
jenkins-builder-new subvolume no n/a Tue 2019-04-16 10:13:43 IST n/a
opensuse subvolume no n/a Mon 2018-07-23 21:18:34 IST n/a
12 images listed.
21:08 ♒♒♒ ☺ 😄 &lt;/code>&lt;/pre>
&lt;h3 id="problems-with-networking-on-foreign-architectures">Problems with networking on foreign architectures&lt;/h3>
&lt;p>So this must mostly have to do with Qemu&amp;rsquo;s emulation. When making networking work, I did see many reports and fixes upstream about networking and other subsystems having issues with emulation. Luckily for the architectures listed above, I have been able to make use of them with some workarounds.&lt;/p>
&lt;p>Here&amp;rsquo;s a running &lt;strong>Debian Sid ARM64&lt;/strong> container image under &lt;code>systemd-nsapwn&lt;/code> with &lt;code>qemu emulation&lt;/code>&lt;/p>
&lt;pre tabindex="0">&lt;code class="language-linux" data-lang="linux">DebSidArm64(fba63648a4c4451ebf56eb758463b37d)
Since: Fri 2019-07-19 21:13:51 IST; 1min 16s ago
Leader: 12061 (systemd)
Service: systemd-nspawn; class container
Root: /var/lib/machines/DebSidArm64
Iface: sysbr0
OS: Debian GNU/Linux 10 (buster)
UID Shift: 445841408
Unit: systemd-nspawn@DebSidArm64.service
├─payload
│ ├─init.scope
│ │ └─12061 /usr/bin/qemu-aarch64-static /usr/lib/systemd/systemd
│ └─system.slice
│ ├─console-getty.service
│ │ └─12245 /usr/bin/qemu-aarch64-static /sbin/agetty -o -p -- \u --noclear --keep-baud console 115200,38400,9600 vt220
│ ├─cron.service
│ │ └─12200 /usr/bin/qemu-aarch64-static /usr/sbin/cron -f
│ ├─dbus.service
│ │ └─12197 /usr/bin/qemu-aarch64-static /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
│ ├─rsyslog.service
│ │ └─12202 /usr/bin/qemu-aarch64-static /usr/sbin/rsyslogd -n -iNONE
│ ├─systemd-journald.service
│ │ └─12123 /usr/bin/qemu-aarch64-static /lib/systemd/systemd-journald
│ └─systemd-logind.service
│ └─12203 /usr/bin/qemu-aarch64-static /lib/systemd/systemd-logind
└─supervisor
└─12059 /usr/bin/systemd-nspawn --quiet --keep-unit --boot --link-journal=try-guest --network-bridge=sysbr0 --bind /var/tmp/Debian-Build/containers/ --bind-ro /var/tmp/:/var/tmp/vartmp -U --settings=override --machine=DebSidArm64
Jul 19 21:13:53 priyasi systemd-nspawn[12059]: [ OK ] Reached target Multi-User System.
Jul 19 21:13:53 priyasi systemd-nspawn[12059]: [ OK ] Reached target Graphical Interface.
Jul 19 21:13:53 priyasi systemd-nspawn[12059]: Starting Update UTMP about System Runlevel Changes...
Jul 19 21:13:53 priyasi systemd-nspawn[12059]: [ OK ] Started Update UTMP about System Runlevel Changes.
Jul 19 21:13:53 priyasi systemd-nspawn[12059]: [ OK ] Started Rotate log files.
Jul 19 21:13:57 priyasi systemd-nspawn[12059]: [ OK ] Started Daily apt download activities.
Jul 19 21:13:57 priyasi systemd-nspawn[12059]: Starting Daily apt upgrade and clean activities...
Jul 19 21:13:59 priyasi systemd-nspawn[12059]: [2B blob data]
Jul 19 21:13:59 priyasi systemd-nspawn[12059]: Debian GNU/Linux 10 SidArm64 console
Jul 19 21:13:59 priyasi systemd-nspawn[12059]: [1B blob data]
21:15 ♒♒♒ ☺ 😄 &lt;/code>&lt;/pre>
&lt;p>And the login&lt;/p>
&lt;pre tabindex="0">&lt;code class="language-linux" data-lang="linux">rrs@priyasi:~$ machinectl login DebSidArm64
Connected to machine DebSidArm64. Press ^] three times within 1s to exit session.
Debian GNU/Linux 10 SidArm64 pts/0
SidArm64 login: root
Password:
Last login: Thu Jun 20 10:57:30 IST 2019 on pts/0
Linux SidArm64 4.19.0-5-amd64 #1 SMP Debian 4.19.37-5 (2019-06-19) aarch64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
root@SidArm64:~#
root@SidArm64:~#
root@SidArm64:~# uname -a
Linux SidArm64 4.19.0-5-amd64 #1 SMP Debian 4.19.37-5 (2019-06-19) aarch64 GNU/Linux
root@SidArm64:~# &lt;/code>&lt;/pre>
&lt;p>The problematic networking part. Notice the &lt;code>qemu&lt;/code> emulation error messages. Basically, at this stage networking is dead.&lt;/p>
&lt;pre tabindex="0">&lt;code class="language-linux" data-lang="linux">root@SidArm64:~# ip a
Unsupported setsockopt level=270 optname=11
Unknown host QEMU_IFLA type: 50
Unknown host QEMU_IFLA type: 51
Unknown host QEMU_IFLA type: 50
Unknown host QEMU_IFLA type: 51
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: host0@if10: &amp;lt;BROADCAST,MULTICAST&amp;gt; mtu 1500 qdisc noop state DOWN group default qlen 1000
request send failed: Operation not supported
link/ether f6:9d:cc:d6:ad:32 brd ff:ff:ff:ff:ff:ffroot@SidArm64:~#
root@SidArm64:~#
root@SidArm64:~# ping www.google.com
ping: www.google.com: Temporary failure in name resolution
root@SidArm64:~#
root@SidArm64:~# cat /etc/resolv.conf
nameserver 172.16.20.1&lt;/code>&lt;/pre>
&lt;p>Because I prefer &lt;code>systemd&lt;/code> for containers, I chose to make use of systemd&amp;rsquo;s network management tools too. Maybe that is causing the problem but in my opinion, is highly unlikely to be the cause.&lt;/p>
&lt;p>Anyways&amp;hellip;.simply invoking &lt;code>dhclient&lt;/code> at this stage does assign the container an ip address. But more than that the core networking stack gets back in action, even though the reporting tools still report errors.&lt;/p>
&lt;pre tabindex="0">&lt;code class="language-linux" data-lang="linux">root@SidArm64:~# dhclient host0
Unknown host QEMU_IFLA type: 50
Unknown host QEMU_IFLA type: 51
Unknown host QEMU_IFLA type: 50
Unknown host QEMU_IFLA type: 51
Unsupported setsockopt level=270 optname=11
Unknown host QEMU_IFLA type: 50
Unknown host QEMU_IFLA type: 51
Unknown host QEMU_IFLA type: 50
Unknown host QEMU_IFLA type: 51
Unsupported setsockopt level=263 optname=8
Unsupported setsockopt level=270 optname=11
Unknown target IFA type: 4
Unknown target IFA type: 3
Unknown target IFA type: 6
root@SidArm64:~#
root@SidArm64:~# ip a
Unsupported setsockopt level=270 optname=11
Unknown host QEMU_IFLA type: 50
Unknown host QEMU_IFLA type: 51
Unknown host QEMU_IFLA type: 50
Unknown host QEMU_IFLA type: 51
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: host0@if10: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc noqueue state UP group default qlen 1000
request send failed: Operation not supported
link/ether f6:9d:cc:d6:ad:32 brd ff:ff:ff:ff:ff:ffroot@SidArm64:~#
root@SidArm64:~#
root@SidArm64:~# ping 172.16.20.1
PING 172.16.20.1 (172.16.20.1) 56(84) bytes of data.
64 bytes from 172.16.20.1: icmp_seq=1 ttl=64 time=0.091 ms
64 bytes from 172.16.20.1: icmp_seq=2 ttl=64 time=0.061 ms
64 bytes from 172.16.20.1: icmp_seq=3 ttl=64 time=0.138 ms
64 bytes from 172.16.20.1: icmp_seq=4 ttl=64 time=0.136 ms
64 bytes from 172.16.20.1: icmp_seq=5 ttl=64 time=0.152 ms
64 bytes from 172.16.20.1: icmp_seq=6 ttl=64 time=0.143 ms
64 bytes from 172.16.20.1: icmp_seq=7 ttl=64 time=0.137 ms
64 bytes from 172.16.20.1: icmp_seq=8 ttl=64 time=0.144 ms
^C
--- 172.16.20.1 ping statistics ---
8 packets transmitted, 8 received, 0% packet loss, time 158ms
rtt min/avg/max/mdev = 0.061/0.125/0.152/0.030 ms
root@SidArm64:~# ping www.google.com
PING www.google.com (216.58.197.68) 56(84) bytes of data.
64 bytes from maa03s21-in-f4.1e100.net (216.58.197.68): icmp_seq=1 ttl=50 time=45.2 ms
64 bytes from maa03s21-in-f4.1e100.net (216.58.197.68): icmp_seq=2 ttl=50 time=63.7 ms
64 bytes from maa03s21-in-f4.1e100.net (216.58.197.68): icmp_seq=3 ttl=50 time=63.2 ms
64 bytes from maa03s21-in-f4.1e100.net (216.58.197.68): icmp_seq=4 ttl=50 time=80.7 ms
64 bytes from maa03s21-in-f4.1e100.net (216.58.197.68): icmp_seq=5 ttl=50 time=65.4 ms
64 bytes from maa03s21-in-f4.1e100.net (216.58.197.68): icmp_seq=6 ttl=50 time=70.4 ms
^C
--- www.google.com ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 12ms
rtt min/avg/max/mdev = 45.190/64.758/80.717/10.597 ms&lt;/code>&lt;/pre>
&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;p>With some minor annoyances but otherwise this has been my fastest way to get work done, especially cross architecture stuff. When I compare it back to how I&amp;rsquo;d have thought such a use case back in the early days, I can&amp;rsquo;t imagine the speed and simplicity I have at hand today. &lt;strong>Free and Opensource Software&lt;/strong> has been a great choice, while it started just as a curiosity of young boy.&lt;/p></description></item><item><title>Linux Desktop Usage 2019</title><link>https://researchut.com/blog/Linux_Desktop_Usage_2019/</link><pubDate>Fri, 15 Mar 2019 20:05:06 +0530</pubDate><author>rrs@researchut.com (Ritesh Raj Sarraf)</author><guid>https://researchut.com/blog/Linux_Desktop_Usage_2019/</guid><description>&lt;p>If I look back now, it must be more than 20 years since I got fascinated with &lt;em>&lt;strong>GNU/Linux&lt;/strong>&lt;/em> ecosystem and started using it.&lt;/p>
&lt;p>Back then, it was more curiosity of a young teenager and the excitement to learn something. There&amp;rsquo;s one thing that I have always admired/respected about Free Software&amp;rsquo;s values, is: &lt;!-- raw HTML omitted -->Access for everyone to learn&lt;!-- raw HTML omitted -->. This is something I never forget and still try to do my bit.&lt;/p>
&lt;p>It was perfect timing and I was lucky to be part of it. Free Software was (and still is) a great platform to learn upon, if you have the willingness and desire for it.&lt;/p>
&lt;p>Over the years, a lot lot lot has changed, evolved and improved. From the days of writing down the &lt;!-- raw HTML omitted -->XF86Config&lt;!-- raw HTML omitted --> configuration file to get the &lt;strong>X&lt;/strong> server running, to a new world where now everything is almost &lt;em>&lt;strong>dynamic&lt;/strong>&lt;/em>, is a great milestone that we have achieved.&lt;/p>
&lt;p>All through these years, I always used &lt;em>&lt;strong>GNU/Linux&lt;/strong>&lt;/em> platform as my primary computing platform. The &lt;strong>CLI, Shell and Tools&lt;/strong>, have all been a great source of learning. Most of the stuff was (and to an extent, still is) standardized and focus was usually on a single project.&lt;/p>
&lt;p>There was less competition on that front, rather there was more &lt;strong>collaboration&lt;/strong>. For example, standard tools like: &lt;em>&lt;strong>sed, awk, grep&lt;/strong>&lt;/em> etc were single tools. Like you didn&amp;rsquo;t have 2 variants of it. So, enhancements to these tools was timely and consistent and learning these tools was an incremental task.&lt;/p>
&lt;p>On the other hand, on the Desktop side of things, it started and stood for a very long time, to do things their own ways. But eventually, quite a lot of those things have standardized, thankfully.&lt;/p>
&lt;p>For the larger part of my desktop usage, I have mostly been a KDE user. I have used other environments like &lt;em>&lt;strong>IceWM, Enlightenment&lt;/strong>&lt;/em> briefly but always felt the need to fallback to KDE, as it provided a full and uniform solution. For quite some time, I was more of a user preferring to only use the &lt;strong>K*&lt;/strong> tools, as in if it wasn&amp;rsquo;t written with &lt;em>&lt;strong>kdelibs&lt;/strong>&lt;/em>, I&amp;rsquo;d try to avoid it. But, In the last 5 years, I took at detour and tried to unlearn and re-learn the other major desktop environment, GNOME.&lt;/p>
&lt;p>GNOME is an equally beautiful and elegant desktop environment with a minimalistic user interface (but which at many times ends up plaguing its application&amp;rsquo;s feature set too, making it &amp;ldquo;minimalistic feature set applications&amp;rdquo;). I realized that quite a lot of time and money is invested into the GNOME project, especially by the leading Linux Distribution Vendors.&lt;/p>
&lt;p>But the fact is that &lt;strong>GNU/Linux&lt;/strong> is still not a major player on the Desktop market. Some believe that the Desktop Market itself has faded and been replaced by the Mobile market. I think Desktop Computing still has a critical place in the near foreseeable future and the Mobile Platform is more of an extension shell to it. For example, for quickies, the Mobile platform is perfect. But for a substantial amount of work to be done, we still fallback to using our workstations. Mobile platform is good for a quick chat or email, but if you need to &lt;em>&lt;strong>write a review report&lt;/strong>&lt;/em> or &lt;em>&lt;strong>a blog post&lt;/strong>&lt;/em> or &lt;em>&lt;strong>prepare a presentation&lt;/strong>&lt;/em> or &lt;em>&lt;strong>update an excel sheet&lt;/strong>&lt;/em>, you&amp;rsquo;d still prefer to use your workstation.&lt;/p>
&lt;p>So&amp;hellip;. After using GNOME platform for a couple of years, I realized that there&amp;rsquo;s a lot of work and thought put into this platform too, just like the KDE platform. &lt;em>&lt;strong>BUT&lt;/strong>&lt;/em> To really be able to dream about the &lt;strong>&amp;ldquo;Year of the dominance of the GNU/Linux desktop platform&amp;rdquo;&lt;/strong>, all these projects need to work together and synergise their efforts.&lt;/p>
&lt;p>Pain points:&lt;/p>
&lt;ul>
&lt;li>Multiple tools, multiple efforts wasted. Could be synergised.&lt;/li>
&lt;li>Data accessiblity&lt;/li>
&lt;li>Integration and uniformity&lt;/li>
&lt;/ul>
&lt;h2 id="multiple-tools">Multiple tools&lt;/h2>
&lt;p>&lt;strong>Kmail&lt;/strong> used to be an awesome email client. &lt;strong>Evoltuion&lt;/strong> today is an awesome email client. &lt;strong>Thunderbird&lt;/strong> was an awesome email client, which from what I last remember, &lt;strong>Mozilla&lt;/strong> had lack of funds to continue maintaining it. And then there&amp;rsquo;s the never ending stream of new/old projects that come and go. Thankfully, email is pretty standardized in its &lt;strong>data format&lt;/strong>. Otherwise, it would be a nightmare to switch between these client. But still, GNU/Linux platforms have the potential to provide a strong and viable offering if they could synergise their work together. Today, a lot of resource is just wasted and nobody wins. Definitely not the GNU/Linux platform. Who wins are: GMail, Hotmail etc.&lt;/p>
&lt;p>If you even look at the browser side of things, &lt;strong>Google&lt;/strong> realized the potential of the Web platform for its business. So they do have a &lt;strong>Web client&lt;/strong> for GNU/Linux. But you&amp;rsquo;ll never see an equivalent for Email/PIM. Not because it is obsolete. But more because it would hurt their business instead.&lt;/p>
&lt;h2 id="data-accessibility">Data accessibility&lt;/h2>
&lt;p>My biggest gripe is data accessiblity. Thankfully, for most of the stuff that we rely upon (email, documents etc), things are standardized. But there still are annoyances. For example, when KDE 4.x debacle occured, &lt;strong>kwallet&lt;/strong> could not export its password database to the newer one. When I moved to GNOME, I had another very very very hard time extracting passwords from &lt;strong>kwallet&lt;/strong> and feeding them to &lt;strong>SeaHorse&lt;/strong>. Then, when recently, I switched back to KDE, I had to similarly struggle exporting back my data from &lt;strong>SeaHorse&lt;/strong> (no, not back to &lt;strong>KWallet&lt;/strong>). Over the years, I realized that critical data should be kept in its simplest format. And let the front-ends do all the bling they want to. I realized this more with Emails. &lt;strong>Maildir&lt;/strong> is a good clean format to store my email in, irrespective of how I access my email. Whether it is &lt;strong>dovecot, Evolution, Akonadi, Kmail&lt;/strong> etc, I still have my bare data intact.&lt;/p>
&lt;p>I had burnt myself on the password front quite a bit, so on this migration back to KDE, I wanted an email like solution. So there&amp;rsquo;s &lt;code>pass&lt;/code>, a password store, which fits the bill just like the Email use case. It would make a lot more sense for all &lt;strong>Desktop Password Managers&lt;/strong> to instead just be a frontend interface to &lt;code>pass&lt;/code> and let it keep the crucial data in bare minimal format, and accessbile at all times, irrespective of the overhauling that the Desktop projects tend to do every couple of years or so.&lt;/p>
&lt;p>Data is &lt;strong>critical&lt;/strong>. Without retaining its compatibility (both &lt;strong>backwards and forward&lt;/strong>), no battle can you win.&lt;/p>
&lt;p>I honestly feel the Linux Desktop Architects from the different projects should sit together and agree on a set of interfaces/tools (yes yes there is fd.o) and &lt;strong>stick to it&lt;/strong>. Too much time and energy is wasted otherwise.&lt;/p>
&lt;h2 id="integration-and-uniformity">Integration and Uniformity&lt;/h2>
&lt;p>This is something I have always desired and I was quite impressed (and delighted) to see some progress on the KDE desktop in the UI department. On GNOME, I developed a liking for the &lt;strong>Evolution&lt;/strong> email client. Infact, it is my client currently, for Email, NNTP and other PIM. And I still get to use it nicely in a KDE environment. Thank you.
&lt;img src="https://researchut.com/images/linux-desktop-2019-evolution.png" alt="Evolution KDE/GNOME Integration">&lt;/p></description></item><item><title>Laptop Mode Tools 1.72</title><link>https://researchut.com/blog/laptop-mode-tools-1_72/</link><pubDate>Thu, 01 Feb 2018 12:45:06 -0500</pubDate><author>rrs@researchut.com (Ritesh Raj Sarraf)</author><guid>https://researchut.com/blog/laptop-mode-tools-1_72/</guid><description>&lt;p>What a way to make a gift!&lt;/p>
&lt;p>I&amp;rsquo;m pleased to announce the 1.72 release of Laptop Mode Tools. Major changes
include the port of the GUI configuration utility to Python 3 and PyQt5.
&lt;img src="https://researchut.com/images/LMT-172.png" alt="">Some tweaks, fixes and enhancements in
current modules. Extending {black,white}list of devices to types other than
USB. Listing of devices by their devtype attribute.&lt;/p>
&lt;p>A filtered list of changes is mentioned below. For the full log, please refer
to the git repository.&lt;/p>
&lt;p>Source tarball, Feodra/SUSE RPM Packages available at:&lt;br>
&lt;a href="https://github.com/rickysarraf/laptop-mode-tools/releases">https://github.com/rickysarraf/laptop-mode-tools/releases&lt;/a>&lt;/p>
&lt;p>Debian packages will be available soon in Unstable.&lt;/p>
&lt;p>Homepage: &lt;a href="https://github.com/rickysarraf/laptop-mode-tools/wiki">https://github.com/rickysarraf/laptop-mode-tools/wiki&lt;/a>&lt;br>
Mailing List: &lt;a href="https://groups.google.com/d/forum/laptop-mode-tools">https://groups.google.com/d/forum/laptop-mode-tools&lt;/a>&lt;/p>
&lt;pre>&lt;code>1.72 - Thu Feb 1 21:59:24 IST 2018
* Switch to PyQt5 and Python3
* Add btrfs to list of filesystems for which we can set commit interval
* Add pkexec invocation script
* Add desktop file to upstream repo and invoke script
* Update installer to includes gui wrappers
* Install new SVG pixmap
* Control all available cards in radeon-dpm
* Prefer to use the new runtime pm autosuspend_delay_ms interface
* tolerate broken device interfaces quietly
* runtime-pm: Make {black,white}lists work with non-USB devices
* send echo errors to verbose log
* Extend blacklist by device types of devtype
&lt;/code>&lt;/pre>
&lt;h3 id="what-is-laptop-mode-tools">&lt;strong>What is Laptop Mode Tools&lt;/strong>&lt;/h3>
&lt;pre>&lt;code>Description: Tools for Power Savings based on battery/AC status
Laptop mode is a Linux kernel feature that allows your laptop to save
considerable power, by allowing the hard drive to spin down for longer
periods of time. This package contains the userland scripts that are
needed to enable laptop mode.
.
It includes support for automatically enabling laptop mode when the
computer is working on batteries. It also supports various other power
management features, such as starting and stopping daemons depending on
power mode, automatically hibernating if battery levels are too low, and
adjusting terminal blanking and X11 screen blanking
.
laptop-mode-tools uses the Linux kernel's Laptop Mode feature and thus
is also used on Desktops and Servers to conserve power
&lt;/code>&lt;/pre>
&lt;p>PS: This release took around 13 months. A lot of things changed, for me,
personally. Some life lessons learnt. Some idiots uncovered. But the best of
2017, I got married. I am hopeful to keep work-life balanced, including time
for FOSS.&lt;/p></description></item><item><title>Freezing of tasks failed</title><link>https://researchut.com/blog/freezing-task-failure/</link><pubDate>Thu, 28 Dec 2017 01:33:59 -0500</pubDate><author>rrs@researchut.com (Ritesh Raj Sarraf)</author><guid>https://researchut.com/blog/freezing-task-failure/</guid><description>&lt;p>It is interesting how a user-space task could lead to hinder a Linux kernel
software suspend operation.&lt;/p>
&lt;pre>&lt;code>[11735.155443] PM: suspend entry (deep)
[11735.155445] PM: Syncing filesystems ... done.
[11735.215091] [drm:wait_panel_status [i915]] *ERROR* PPS state mismatch
[11735.215172] [drm:wait_panel_status [i915]] *ERROR* PPS state mismatch
[11735.558676] rfkill: input handler enabled
[11735.608859] (NULL device *): firmware: direct-loading firmware rtlwifi/rtl8723befw_36.bin
[11735.609910] (NULL device *): firmware: direct-loading firmware rtl_bt/rtl8723b_fw.bin
[11735.611871] Freezing user space processes ...
[11755.615603] Freezing of tasks failed after 20.003 seconds (1 tasks refusing to freeze, wq_busy=0):
[11755.615854] digikam D 0 13262 13245 0x00000004
[11755.615859] Call Trace:
[11755.615873] __schedule+0x28e/0x880
[11755.615878] schedule+0x2c/0x80
[11755.615889] request_wait_answer+0xa3/0x220 [fuse]
[11755.615895] ? finish_wait+0x80/0x80
[11755.615902] __fuse_request_send+0x86/0x90 [fuse]
[11755.615907] fuse_request_send+0x27/0x30 [fuse]
[11755.615914] fuse_send_readpages.isra.30+0xd1/0x120 [fuse]
[11755.615920] fuse_readpages+0xfd/0x110 [fuse]
[11755.615928] __do_page_cache_readahead+0x200/0x2d0
[11755.615936] filemap_fault+0x37b/0x640
[11755.615940] ? filemap_fault+0x37b/0x640
[11755.615944] ? filemap_map_pages+0x179/0x320
[11755.615950] __do_fault+0x1e/0xb0
[11755.615953] __handle_mm_fault+0xc8a/0x1160
[11755.615958] handle_mm_fault+0xb1/0x200
[11755.615964] __do_page_fault+0x257/0x4d0
[11755.615968] do_page_fault+0x2e/0xd0
[11755.615973] page_fault+0x22/0x30
[11755.615976] RIP: 0033:0x7f32d3c7ff90
[11755.615978] RSP: 002b:00007ffd887c9d18 EFLAGS: 00010246
[11755.615981] RAX: 00007f32d3fc9c50 RBX: 000000000275e440 RCX: 0000000000000003
[11755.615982] RDX: 0000000000000002 RSI: 00007ffd887c9f10 RDI: 000000000275e440
[11755.615984] RBP: 00007ffd887c9f10 R08: 000000000275e820 R09: 00000000018d2f40
[11755.615986] R10: 0000000000000002 R11: 0000000000000000 R12: 000000000189cbc0
[11755.615987] R13: 0000000001839dc0 R14: 000000000275e440 R15: 0000000000000000
[11755.616014] OOM killer enabled.
[11755.616015] Restarting tasks ... done.
[11755.817640] PM: suspend exit
[11755.817698] PM: suspend entry (s2idle)
[11755.817700] PM: Syncing filesystems ... done.
[11755.983156] rfkill: input handler disabled
[11756.030209] rfkill: input handler enabled
[11756.073529] Freezing user space processes ...
[11776.084309] Freezing of tasks failed after 20.010 seconds (2 tasks refusing to freeze, wq_busy=0):
[11776.084630] digikam D 0 13262 13245 0x00000004
[11776.084636] Call Trace:
[11776.084653] __schedule+0x28e/0x880
[11776.084659] schedule+0x2c/0x80
[11776.084672] request_wait_answer+0xa3/0x220 [fuse]
[11776.084680] ? finish_wait+0x80/0x80
[11776.084688] __fuse_request_send+0x86/0x90 [fuse]
[11776.084695] fuse_request_send+0x27/0x30 [fuse]
[11776.084703] fuse_send_readpages.isra.30+0xd1/0x120 [fuse]
[11776.084711] fuse_readpages+0xfd/0x110 [fuse]
[11776.084721] __do_page_cache_readahead+0x200/0x2d0
[11776.084730] filemap_fault+0x37b/0x640
[11776.084735] ? filemap_fault+0x37b/0x640
[11776.084743] ? __update_load_avg_blocked_se.isra.33+0xa1/0xf0
[11776.084749] ? filemap_map_pages+0x179/0x320
[11776.084755] __do_fault+0x1e/0xb0
[11776.084759] __handle_mm_fault+0xc8a/0x1160
[11776.084765] handle_mm_fault+0xb1/0x200
[11776.084772] __do_page_fault+0x257/0x4d0
[11776.084777] do_page_fault+0x2e/0xd0
[11776.084783] page_fault+0x22/0x30
[11776.084787] RIP: 0033:0x7f31ddf315e0
[11776.084789] RSP: 002b:00007ffd887ca068 EFLAGS: 00010202
[11776.084793] RAX: 00007f31de13c350 RBX: 00000000040be3f0 RCX: 000000000283da60
[11776.084795] RDX: 0000000000000001 RSI: 00000000040be3f0 RDI: 00000000040be3f0
[11776.084797] RBP: 00007f32d3fca1e0 R08: 0000000005679250 R09: 0000000000000020
[11776.084799] R10: 00000000058fc1b0 R11: 0000000004b9ac50 R12: 0000000000000000
[11776.084801] R13: 0000000000000001 R14: 0000000000000000 R15: 0000000000000000
[11776.084806] QXcbEventReader D 0 13268 13245 0x00000004
[11776.084810] Call Trace:
[11776.084817] __schedule+0x28e/0x880
[11776.084823] schedule+0x2c/0x80
[11776.084827] rwsem_down_write_failed_killable+0x25a/0x490
[11776.084832] call_rwsem_down_write_failed_killable+0x17/0x30
[11776.084836] ? call_rwsem_down_write_failed_killable+0x17/0x30
[11776.084842] down_write_killable+0x2d/0x50
[11776.084848] do_mprotect_pkey+0xa9/0x2f0
[11776.084854] SyS_mprotect+0x13/0x20
[11776.084859] system_call_fast_compare_end+0xc/0x97
[11776.084861] RIP: 0033:0x7f32d1f7c057
[11776.084863] RSP: 002b:00007f32cbb8c8d8 EFLAGS: 00000206 ORIG_RAX: 000000000000000a
[11776.084867] RAX: ffffffffffffffda RBX: 00007f32c4000020 RCX: 00007f32d1f7c057
[11776.084869] RDX: 0000000000000003 RSI: 0000000000001000 RDI: 00007f32c4024000
[11776.084871] RBP: 00000000000000c5 R08: 00007f32c4000000 R09: 0000000000024000
[11776.084872] R10: 00007f32c4024000 R11: 0000000000000206 R12: 00000000000000a0
[11776.084874] R13: 00007f32c4022f60 R14: 0000000000001000 R15: 00000000000000e0
[11776.084906] OOM killer enabled.
[11776.084907] Restarting tasks ... done.
[11776.289655] PM: suspend exit
[11776.459624] IPv6: ADDRCONF(NETDEV_UP): wlp1s0: link is not ready
[11776.469521] rfkill: input handler disabled
[11776.978733] IPv6: ADDRCONF(NETDEV_UP): wlp1s0: link is not ready
[11777.038879] IPv6: ADDRCONF(NETDEV_UP): wlp1s0: link is not ready
[11778.022062] wlp1s0: authenticate with 50:8f:4c:82:4d:dd
[11778.033155] wlp1s0: send auth to 50:8f:4c:82:4d:dd (try 1/3)
[11778.038522] wlp1s0: authenticated
[11778.041511] wlp1s0: associate with 50:8f:4c:82:4d:dd (try 1/3)
[11778.059860] wlp1s0: RX AssocResp from 50:8f:4c:82:4d:dd (capab=0x431 status=0 aid=5)
[11778.060253] wlp1s0: associated
[11778.060308] IPv6: ADDRCONF(NETDEV_CHANGE): wlp1s0: link becomes ready
[11778.987669] [drm:wait_panel_status [i915]] *ERROR* PPS state mismatch
[11779.117608] [drm:wait_panel_status [i915]] *ERROR* PPS state mismatch
[11779.160930] [drm:wait_panel_status [i915]] *ERROR* PPS state mismatch
[11779.784045] [drm:wait_panel_status [i915]] *ERROR* PPS state mismatch
[11779.913668] [drm:wait_panel_status [i915]] *ERROR* PPS state mismatch
[11779.961517] [drm:wait_panel_status [i915]] *ERROR* PPS state mismatch
11:58 ♒♒♒ ☺
&lt;/code>&lt;/pre></description></item><item><title>Fixing Hardware Bugs</title><link>https://researchut.com/blog/fixing-realtek-sdcard/</link><pubDate>Tue, 04 Apr 2017 07:02:35 -0400</pubDate><author>rrs@researchut.com (Ritesh Raj Sarraf)</author><guid>https://researchut.com/blog/fixing-realtek-sdcard/</guid><description>&lt;p>Bugs can be annoying. Especially the ones that crash or hang and do not have a
root cause. A good example of such annoyance can be kernel bugs, where a
faulty hardware/device driver hinders the kernel&amp;rsquo;s suspend/resume process.
Because, as a user, while in the middle of your work, you suspend your machine
hoping to resume your work, back when at your destination. But, during
suspend, or during resume, randomly the bug triggers leaving you with no
choice but a hardware reset. Ultimately, resulting in you losing the entire
work state you were in.&lt;/p>
&lt;p>Such is a situation I encountered with my 2 year old, &lt;strong>Lenovo Yoga 2 13&lt;/strong>.
For 2 years, I had been living with this bug with all the side-effects
mentioned.&lt;/p>
&lt;pre>&lt;code>Mar 01 18:43:28 learner kernel: usb 2-4: new high-speed USB device number 38 using xhci_hcd
Mar 01 18:43:54 learner kernel: usb 2-4: new high-speed USB device number 123 using xhci_hcd
Mar 01 18:44:00 learner kernel: usb 2-4: new high-speed USB device number 125 using xhci_hcd
Mar 01 18:44:11 learner kernel: usb 2-4: new high-speed USB device number 25 using xhci_hcd
Mar 01 18:44:16 learner kernel: usb 2-4: new high-speed USB device number 26 using xhci_hcd
Mar 01 18:44:22 learner kernel: usb 2-4: new high-speed USB device number 27 using xhci_hcd
Mar 01 18:44:22 learner kernel: usb 2-4: device descriptor read/64, error -71
Mar 01 18:44:22 learner kernel: usb 2-4: device descriptor read/64, error -71
Mar 01 18:44:22 learner kernel: usb 2-4: new high-speed USB device number 28 using xhci_hcd
Mar 01 18:44:23 learner kernel: usb 2-4: device descriptor read/64, error -71
Mar 01 18:44:23 learner kernel: usb 2-4: device descriptor read/64, error -71
Mar 01 18:44:23 learner kernel: usb 2-4: new high-speed USB device number 29 using xhci_hcd
Mar 01 18:44:23 learner kernel: usb 2-4: Device not responding to setup address.
Mar 01 18:44:23 learner kernel: usb 2-4: Device not responding to setup address.
Mar 01 18:44:23 learner kernel: usb 2-4: device not accepting address 29, error -71
Mar 01 18:44:24 learner kernel: usb 2-4: new high-speed USB device number 30 using xhci_hcd
Mar 01 18:44:24 learner kernel: usb 2-4: Device not responding to setup address.
Mar 01 18:44:24 learner kernel: usb 2-4: Device not responding to setup address.
Mar 01 18:44:24 learner kernel: usb 2-4: device not accepting address 30, error -71
Mar 01 18:44:24 learner kernel: usb usb2-port4: unable to enumerate USB device
Mar 01 18:44:24 learner kernel: usb 2-4: new high-speed USB device number 31 using xhci_hcd
Mar 01 18:44:24 learner kernel: usb 2-4: device descriptor read/64, error -71
Mar 01 18:44:25 learner kernel: usb 2-4: new high-speed USB device number 32 using xhci_hcd
Mar 01 18:44:30 learner kernel: usb 2-4: new high-speed USB device number 33 using xhci_hcd
Mar 01 18:44:30 learner kernel: usb 2-4: device descriptor read/64, error -71
Mar 01 18:44:31 learner kernel: usb 2-4: device descriptor read/64, error -71
Mar 01 18:44:31 learner kernel: usb 2-4: new high-speed USB device number 34 using xhci_hcd
Mar 01 18:44:36 learner kernel: usb 2-4: new high-speed USB device number 35 using xhci_hcd
Mar 01 18:44:36 learner kernel: usb 2-4: device descriptor read/64, error -71
Mar 01 18:44:36 learner kernel: usb 2-4: device descriptor read/64, error -71
Mar 01 18:44:37 learner kernel: usb 2-4: new high-speed USB device number 36 using xhci_hcd
Mar 01 18:44:37 learner kernel: usb 2-4: device descriptor read/64, error -71
Mar 01 18:44:37 learner kernel: usb 2-4: device descriptor read/64, error -71
Mar 01 18:44:37 learner kernel: usb 2-4: new high-speed USB device number 37 using xhci_hcd
Mar 01 18:44:37 learner kernel: usb 2-4: Device not responding to setup address.
Mar 01 18:44:37 learner kernel: usb 2-4: Device not responding to setup address.
Mar 01 18:44:38 learner kernel: usb 2-4: device not accepting address 37, error -71
Mar 01 18:44:38 learner kernel: usb 2-4: new high-speed USB device number 38 using xhci_hcd
Mar 01 18:44:38 learner kernel: usb 2-4: Device not responding to setup address.
Mar 02 13:34:05 learner kernel: usb 2-4: new high-speed USB device number 45 using xhci_hcd
Mar 02 13:34:05 learner kernel: usb 2-4: new high-speed USB device number 46 using xhci_hcd
Mar 02 13:34:05 learner kernel: usb 2-4: New USB device found, idVendor=0bda, idProduct=0129
Mar 02 13:34:05 learner kernel: usb 2-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Mar 02 13:34:05 learner kernel: usb 2-4: Product: USB2.0-CRW
Mar 02 13:34:05 learner kernel: usb 2-4: Manufacturer: Generic
Mar 02 13:34:05 learner kernel: usb 2-4: SerialNumber: 20100201396000000
Mar 02 13:34:06 learner kernel: usb 2-4: USB disconnect, device number 46
Mar 02 13:34:16 learner kernel: usb 2-4: new high-speed USB device number 47 using xhci_hcd
Mar 02 13:34:21 learner kernel: usb 2-4: new high-speed USB device number 48 using xhci_hcd
Mar 02 13:34:26 learner kernel: usb 2-4: new high-speed USB device number 49 using xhci_hcd
Mar 02 13:34:32 learner kernel: usb 2-4: new high-speed USB device number 51 using xhci_hcd
Mar 02 13:34:37 learner kernel: usb 2-4: new high-speed USB device number 52 using xhci_hcd
Mar 02 13:34:43 learner kernel: usb 2-4: new high-speed USB device number 54 using xhci_hcd
Mar 02 13:34:43 learner kernel: usb 2-4: new high-speed USB device number 55 using xhci_hcd
Mar 02 13:34:49 learner kernel: usb 2-4: new high-speed USB device number 57 using xhci_hcd
Mar 02 13:34:55 learner kernel: usb 2-4: new high-speed USB device number 58 using xhci_hcd
Mar 02 13:35:00 learner kernel: usb 2-4: new high-speed USB device number 60 using xhci_hcd
Mar 02 13:35:06 learner kernel: usb 2-4: new high-speed USB device number 61 using xhci_hcd
Mar 02 13:35:11 learner kernel: usb 2-4: new high-speed USB device number 63 using xhci_hcd
Mar 02 13:35:17 learner kernel: usb 2-4: new high-speed USB device number 64 using xhci_hcd
Mar 02 13:35:22 learner kernel: usb 2-4: new high-speed USB device number 65 using xhci_hcd
Mar 02 13:35:28 learner kernel: usb 2-4: new high-speed USB device number 66 using xhci_hcd
Mar 02 13:35:33 learner kernel: usb 2-4: new high-speed USB device number 68 using xhci_hcd
Mar 02 13:35:39 learner kernel: usb 2-4: new high-speed USB device number 69 using xhci_hcd
Mar 02 13:35:44 learner kernel: usb 2-4: new high-speed USB device number 70 using xhci_hcd
Mar 02 13:35:50 learner kernel: usb 2-4: new high-speed USB device number 71 using xhci_hcd
Mar 02 13:35:50 learner kernel: usb 2-4: Device not responding to setup address.
Mar 02 13:35:50 learner kernel: usb 2-4: Device not responding to setup address.
Mar 02 13:35:50 learner kernel: usb 2-4: device not accepting address 71, error -71
Mar 02 13:35:50 learner kernel: usb 2-4: new high-speed USB device number 73 using xhci_hcd
Mar 02 13:35:51 learner kernel: usb 2-4: new high-speed USB device number 74 using xhci_hcd
Mar 02 13:35:56 learner kernel: usb 2-4: new high-speed USB device number 75 using xhci_hcd
Mar 02 13:35:57 learner kernel: usb 2-4: new high-speed USB device number 77 using xhci_hcd
Mar 02 13:36:03 learner kernel: usb 2-4: new high-speed USB device number 78 using xhci_hcd
Mar 02 13:36:08 learner kernel: usb 2-4: new high-speed USB device number 79 using xhci_hcd
Mar 02 13:36:14 learner kernel: usb 2-4: new high-speed USB device number 80 using xhci_hcd
Mar 02 13:36:20 learner kernel: usb 2-4: new high-speed USB device number 83 using xhci_hcd
Mar 02 13:36:26 learner kernel: usb 2-4: new high-speed USB device number 86 using xhci_hcd
&lt;/code>&lt;/pre>
&lt;p>Thanks to the Linux USB maintainers, we tried
&lt;a href="https://www.spinics.net/lists/linux-usb/msg146092.html">investigating&lt;/a> the
issue, which resulted in uncovering other bugs. Unfortunately, this bug was
concluded as a &lt;strong>possible hardware bug&lt;/strong>. The only odd bit is that this
machine has a Windows 8.1 copy still lying on the spare partition, where the
issue was not seen at all. It could very well be that it was not a hardware
bug at all, or a hardware bug which had a workaround in the Windows driver.&lt;/p>
&lt;p>But, the results of the exercise weren&amp;rsquo;t much useful to me because I use the
machine under the Linux kernel most of the time.&lt;/p>
&lt;p>So, this March 2017, with 2 years completion on me purchasing the device, I
was annoyed enough by the bugs. That led me trying out finding other ways to
taming this issue.&lt;/p>
&lt;p>Lenovo has some variations of this device. I know that it comes with multiple
options for the storgae and the wifi component. I&amp;rsquo;m not sure if there are more
differences.&lt;/p>
&lt;p>The majority of the devices are connected over the xHCI bus on this machine.
If a single device is faulty, or has faulty hardware; it could screw up the
entire user experience for that machine. Such is my case. Hardware
manufacturers could do a better job if they could provide a means to disable
hardware, for example in the BIOS. HP shipped machines have such an option in
the BIOS where you can disable devices that do not have an important use case
for the user. Good example of such devices are Fingerprint Readers, SD Card
Readers, LOMs and mabye Bluetooth too. At least the latter should apply for
Linux users, as majority of us have an unpleasant time getting Bluetooth to
work out of the box.&lt;/p>
&lt;p>But on my Lenovo Yoga, it came with a ridiculous BIOS/UEFI, with very very
limited options for change. Thankfully, they did have an option to set the
booting mode for the device, giving the choices of &lt;strong>Legacy Boot&lt;/strong> and
&lt;strong>UEFI.&lt;/strong>&lt;/p>
&lt;p>Back to the topic, with 2 years of living with the bug, and no clarity on if
and whether it was a hardware bug or a driver bug, it left me with no choice
but to open up the machine.&lt;/p>
&lt;p>&lt;img src="https://researchut.com/images/IMG_20170320_135207_HDR.jpg" alt="">Next to the mSATA HDD
sits the additional board, which houses the &lt;strong>Power, USB, Audio In&lt;/strong> , and the
&lt;strong>SD Card&lt;/strong> reader.&lt;/p>
&lt;p>Opening that up, I got the small board. I barely use the SD Card reader, and
given the annoyances I had to suffer because of it, there was no more mercy in
killing that device.&lt;/p>
&lt;p>So, next was to unsolder the SD Card reader completely.&lt;/p>
&lt;p>&lt;img src="https://researchut.com/images/IMG_20170320_144554_HDR.jpg" alt="">&lt;/p>
&lt;p>Once done, and fitted back into the machine, everything has been working
awesomely great in the last 2 weeks. This entire fix costed me र् 0. So
sometimes, fixing a bug is all that matters.&lt;/p>
&lt;p>In the Hindi language, a nice phrase for such a scenario remnids me of the
great &lt;a href="https://en.wikipedia.org/wiki/Chanakya">Chanakya&lt;/a>, &lt;strong>&amp;ldquo;साम, दाम, दंड और
भेद&amp;rdquo;&lt;/strong>.&lt;/p></description></item><item><title>Linux IO + Memory + CPU Contention</title><link>https://researchut.com/blog/linux-large-io-bug/</link><pubDate>Fri, 26 Feb 2016 12:23:33 -0500</pubDate><author>rrs@researchut.com (Ritesh Raj Sarraf)</author><guid>https://researchut.com/blog/linux-large-io-bug/</guid><description>&lt;p>I very recently met someone, and we had a good productive discussion on the
features and (long standing) bugs of the Linux kernel. No doubt, Linux is the
most featureful kernel in the market. Is also a lot appealing given its
breadth of platform support.&lt;/p>
&lt;p>Of that discussion we had, it led about Linux&amp;rsquo;s behavior in tighter stressed
scenarios where there is a lot of contention among the core subsystems. From
the conversation, I got the feedback that perhaps the
&lt;a href="https://bugzilla.kernel.org/show_bug.cgi?id=12309">issue&lt;/a> is no more valid.
My conclusion was I must have missed out on the fix because I haven&amp;rsquo;t really
spent any Engineering Lab time in recent past.&lt;/p>
&lt;p>But a picture says a thousand words. And no, the issue is NOT fixed. And it is
still simple to reproduce the bug. And it is just that we have faster
advancements in underlying hardware, that we may eventually find it much
harder to reproduce these bugs.&lt;/p>
&lt;p>&lt;img src="https://researchut.com/images/IMG_20160226_223108.jpg" alt="">&lt;/p>
&lt;p>The kernel spitting the screen is Linux 4.4 Stock Debian.&lt;/p></description></item><item><title>Linux Desktop in 2014</title><link>https://researchut.com/blog/linux-desktop-2014/</link><pubDate>Fri, 26 Dec 2014 11:32:01 -0500</pubDate><author>rrs@researchut.com (Ritesh Raj Sarraf)</author><guid>https://researchut.com/blog/linux-desktop-2014/</guid><description>&lt;p>We are almost at the end of 2014. While 2014 has been a year with many mixed
experiences, I think it does warrant one blog entry ;-)&lt;/p>
&lt;p>Recently, I&amp;rsquo;ve again started spending more time on Linux products / solutions,
than spending time focused on a specfic subsystem. This change has been good.
It has allowed me to re-cap all the advancements that have happened in the
Linux world, umm&amp;hellip; in the last 5 years.&lt;/p>
&lt;p>Once upon a time, the Linux kernel
&lt;a href="https://bugzilla.kernel.org/show_bug.cgi?id=12309">sucked&lt;/a> on the Desktop. It
led to many desktop improvement related initiatives. Many accepted in kernel,
while others stood as it is (out-of-tree) still as of today. Over the years,
there are many people that advocate for such out-of-tree features, for example
the -ck patchset, claiming it has better performance. Most of the times, these
are patches not carried by your distribution vendor, which leads you to
alternate sources, if you want to try. Having some spare time, I tried the
&lt;a href="http://www.alternativekernel.ml/">Alternative Kernel&lt;/a> project. It is nothing
but a bunch of patchsets, on top of the stock kernel.&lt;/p>
&lt;p>After trying it out, I must say that these patchsets are out-of-tree, for
good. I hardly could make out any performance gain. But I did notice a
considerable increase in the power consumption. On my stock Debian kernel, the
power consumption lies around 15-18 W. That increased to 20+ W on the
alternate kernels. I guess most advocates for the out-of-tree patchsets, only
measure the 1-2% performance gain, where as completely neglect the fact that
that kernel sleeps less often.&lt;/p>
&lt;p>But back to the generic Linux kernel performance problem&amp;hellip;&amp;hellip;&lt;/p>
&lt;p>Recently, in the last 2 years, the performance suckiness of the Linux kernel
is hardly noticed. So what changed ?&lt;/p>
&lt;p>The last couple of years have seen a rise in high capacity RAM, at affordable
consumer price. &lt;em>8 - 16&lt;/em> GiB of RAM is common on laptops these days.&lt;/p>
&lt;p>If you go and look at the sucky bug report linked above, it is marked as
closed, justified Working as Designed. The core problem with the bug reported,
has to do with slow media. The Linux scheduler is (in?)efficient. It works
hard to give you the best throughput and performance (for server workloads).
I/O threads are a high priority task in the Linux kernel. Now map this scene
to the typical Linux desktop. If you end up with doing too much buffered I/O,
thus exhausting all your available cache, and trigger paging, you are in for
some sweet experience.&lt;/p>
&lt;p>Given that the kernel highly priotizes I/O tasks, and if your underneath
persistent storage device is slow (which is common if you have an external USB
disk, or even an internal rotating magnetic disk), you end up blocking all
your &lt;strong>CPU cycles&lt;/strong> against the slow media. Which further leads to no
available CPU cycles for your other desktop tasks. Hence, when you do I/O at
such level, you find your desktop go terribly sluggish.&lt;/p>
&lt;p>It is not that your CPU is slow or in-capable. It is just that all your CPU
slices are &lt;strong>blocked&lt;/strong>. Blocked waiting for your &lt;em>write()&lt;/em> to report a
completion.&lt;/p>
&lt;p>&lt;strong>So what exactly changed that we don &amp;rsquo;t notice that problem any more ????&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>_ &lt;em>RAM&lt;/em>_ - Increase in RAM has led to more I/O be accommodated in cache. The best way to see this in action is to do a copy of a large file, something almost equivalent to the amount of RAM you have. But make sure it is less than the overall amount. For example, if you have 4 GiB of RAM, try copying a file of size 3.5 GiB in your graphical file manager. And at the same time, on the terminal, keep triggering the &lt;code>**sync**&lt;/code> command. Check how long does it take for the &lt;code>sync&lt;/code> to complete. By being able to cache large amount of data, the Linux kernel has been better at improving the overall performance &lt;strong>in the eyes of the user&lt;/strong>.&lt;/li>
&lt;li>_ &lt;em>File System&lt;/em>_ - But RAM is not alone. The file system has played a very important role too. Earlier, with ext3 file system, we had a commit interval of (5?) 30 seconds. That led to the above mentioned &lt;code>**sync**&lt;/code> equivalent to get triggered every 30 secs. It was a safety measure to ensure, that at worst, you lose 30 secs worth of data. But it did hinder performance. With ext4, came delayed allocation. Delayed Allocation allowed the write() to return immediate while the data was in cache, and deferred the task of actual write() to the file system. This allowed for the allocator to find the best contiguous slot for the data to be written. Thus it improved the file system. It also brough corruption for some of the apps. :-)&lt;/li>
&lt;li>_ &lt;em>Solid State Drives&lt;/em>_ - The file system and RAM alone aren &amp;rsquo;t the sole factors that led to the drastic improvement in the overall experience of the Linux desktop. If you read through the bug report linked in this article, you&amp;rsquo;ll find the core root cause to be &lt;strong>slow persistent storage devices&lt;/strong>. Could the allocator have been improved (like Windows) to not be so pressing of the Linux desktop ? Maybe, yes. But that was a decision for the kernel devs and they believed (and believe) to keep those numbers to minimum. Thus for I/O, as for today, you have 3 schedulers and for CPU, just 1. What dramatically improved the overall Linux Desktop performance was the general availability of solid state devices. These device are real fast, which in effect made the &lt;em>write()&lt;/em> calls return immediate, and did not block the CPU.&lt;/li>
&lt;/ol>
&lt;p>So, it was the advancement in both hardware and software that led to better
overall desktop performance. Does the above mentioned bug still exist ? Yes.
Its just that it is much harder to trigger it now. You&amp;rsquo;ll have to ensure that
you max out your cache and trigger paging. And then try to do ask for some CPU
cycles.&lt;/p>
&lt;p>But it wasn&amp;rsquo;t that back then we didn&amp;rsquo;t use Linux on the desktop / laptop. It
sure did suck more than, say, Windows. But hey, sometimes we have to eat our
own dog food. Even then, there sure were some efforts to overcome the then
limitations. The first and obvious one is the out-of-tree patchset. But ther
were also some other efforts to improve the situation.&lt;/p>
&lt;p>The first such effort, that I can recollect, was ulatency. With Linux adding
support for Control Groups, there were multiple avenues open on how to tackle
and tame the resource starvation problem. The crux of the problem was that
Linux gave way too much priority to the I/O tasks. I still wish Linux has a
profile mechanism, where in on the kernel command line, we could specify what
profile should Linux boot into. Anyways, with ulatency, we saw improvements in
the Linux Desktop experience. ulatency had in-built policies to whitelist /
blacklist a set of profiles. For example, KDE was a profile. Thus, ulatency
would club all KDE processes into a group and give that group a higher
precedence to ensure that it had its fair share of CPU cycles.&lt;/p>
&lt;p>Today, at almost the end of 2014, there are many more consumer of Linux&amp;rsquo;s
control groups. Prominent names would be: LXC and systemd.&lt;/p>
&lt;p>ulatency has hardly seen much development in the last year. Probably it is
time for systemd to take over.&lt;/p>
&lt;p>systemd is expected to bring lots of features to the Linux world, thus
bridging the (many) gap Linux has had on the desktop. It makes extensive use
of Control Groups for a variety of (good) reasons, which has led it to be a
linux-only product. I think it should have never marketed itself as the
&lt;strong>init&lt;/strong> daemon. It rather fits better when called as the &lt;strong>System Management
Daemon.&lt;/strong>&lt;/p>
&lt;p>The path to Linux Desktop looks much brighter in 2015 and beyond thanks to all
the advancements that have happened so far. The other important players, who
should be thanked are Mobile and Low Latency products (Android, ChromeBook),
whose engagement to productize Linux has led to better features overall.&lt;/p></description></item><item><title>Power consumption on Linux 3.10</title><link>https://researchut.com/blog/linux-3-10-power-consumption/</link><pubDate>Tue, 23 Jul 2013 16:08:19 -0400</pubDate><author>rrs@researchut.com (Ritesh Raj Sarraf)</author><guid>https://researchut.com/blog/linux-3-10-power-consumption/</guid><description>&lt;p>The power consumption on the Linux kernel 3.10 is pretty bad.&lt;/p>
&lt;p>On kernel 3.10, with the follwing config, the PowerTop results are:&lt;/p>
&lt;p>&lt;em>#&lt;/em>&lt;/p>
&lt;p>&lt;em># Timers subsystem&lt;/em>&lt;/p>
&lt;p>&lt;em>#&lt;/em>&lt;/p>
&lt;p>&lt;em>CONFIG_TICK_ONESHOT=y&lt;/em>&lt;/p>
&lt;p>&lt;em>CONFIG_NO_HZ_COMMON=y&lt;/em>&lt;/p>
&lt;p>&lt;em># CONFIG_HZ_PERIODIC is not set&lt;/em>&lt;/p>
&lt;p>&lt;em>CONFIG_NO_HZ_IDLE=y&lt;/em>&lt;/p>
&lt;p>&lt;em># CONFIG_NO_HZ_FULL is not set&lt;/em>&lt;/p>
&lt;p>&lt;em>CONFIG_NO_HZ=y&lt;/em>&lt;/p>
&lt;p>&lt;em>CONFIG_HIGH_RES_TIMERS=y&lt;/em>&lt;/p>
&lt;p>PowerTOP v2.0 Overview Idle stats Frequency stats Device stats
Tunables&lt;/p>
&lt;p>The battery reports a discharge rate of &lt;em>&lt;strong>28.0 W&lt;/strong>&lt;/em>&lt;/p>
&lt;p>The estimated remaining time is 23 minutes&lt;/p>
&lt;p>Summary: 1785.5 wakeups/second, 0.0 GPU ops/second, 0.0 VFS ops/sec and 22.1%
CPU use&lt;/p>
&lt;p>Power est. Usage Events/s Category Description&lt;/p>
&lt;p>16.3 W 2915 rpm Device Laptop fan&lt;/p>
&lt;p>5.11 W 100.0% Device USB device: WALTON
Primo-X1 Primo-X1&lt;/p>
&lt;p>1.70 W 33.3% Device Display backlight&lt;/p>
&lt;p>849 mW 33.3% Device Display backlight&lt;/p>
&lt;p>425 mW 86.0 ms/s 330.7 Process /usr/bin/konsole&lt;/p>
&lt;p>316 mW 63.9 ms/s 66.1 Process /usr/bin/plasma-desktop&lt;/p>
&lt;p>142 mW 28.6 ms/s 396.8 Process /usr/bin/X :0 -auth
/var/run/lightdm/root/:0 -nolisten tcp vt7&lt;/p>
&lt;p>64.1 mW 13.0 ms/s 198.4 Process kwin -session
101261418fe3000136103713100000053880000_13746081&lt;/p>
&lt;p>53.6 mW 10.8 ms/s 0.00 Process powertop&lt;/p>
&lt;p>35.9 mW 7.3 ms/s 66.1 Process
/usr/lib/chromium/chromium &amp;ndash;type=plugin &amp;ndash;plugin-path=/usr/li&lt;/p>
&lt;p>24.3 mW 4.9 ms/s 396.8 Interrupt PS/2 Touchpad /
Keyboard / Mouse&lt;/p>
&lt;p>6.92 mW 1.4 ms/s 0.00 Interrupt [48] i915&lt;/p>
&lt;p>5.94 mW 1.2 ms/s 66.1 Interrupt [9] RCU(softirq)&lt;/p>
&lt;p>3.98 mW 0.8 ms/s 0.00 kWork flush_to_ldisc&lt;/p>
&lt;p>3.78 mW 0.8 ms/s 66.1 Process [ksoftirqd/2]&lt;/p>
&lt;p>3.33 mW 673.3 us/s 66.1 Process [rcu_sched]&lt;/p>
&lt;p>1.80 mW 363.1 us/s 66.1 Interrupt [1] timer(softirq)&lt;/p>
&lt;p>1.79 mW 363.0 us/s 0.00 Process [ksoftirqd/4]&lt;/p>
&lt;p>Where as on the 3.9 kernel:&lt;/p>
&lt;p>The battery reports a discharge rate of &lt;em>&lt;strong>13.2 W&lt;/strong>&lt;/em>&lt;/p>
&lt;p>The estimated remaining time is 43 minutes&lt;/p>
&lt;p>Summary: 611.5 wakeups/second, 0.0 GPU ops/second, 0.0 VFS ops/sec and 14.2%
CPU use&lt;/p>
&lt;p>Power est. Usage Events/s Category Description&lt;/p>
&lt;p>14.0 W 2722 rpm Device Laptop fan&lt;/p>
&lt;p>1.72 W 33.3% Device Display backlight&lt;/p>
&lt;p>862 mW 33.3% Device Display backlight&lt;/p>
&lt;p>255 mW 65.7 ms/s 58.0 Process /usr/bin/plasma-desktop&lt;/p>
&lt;p>91.9 mW 23.7 ms/s 27.5 Process
/usr/lib/chromium/chromium &amp;ndash;type=renderer &amp;ndash;lang=en-US &amp;ndash;forc&lt;/p>
&lt;p>60.1 mW 15.5 ms/s 96.1 Process
/usr/lib/chromium/chromium &amp;ndash;type=plugin &amp;ndash;plugin-path=/usr/li&lt;/p>
&lt;p>25.0 mW 6.4 ms/s 25.1 Process kwin -session
101261418fe3000136103713100000053880000_13746094&lt;/p>
&lt;p>21.5 mW 5.6 ms/s 34.2 Process /usr/bin/X :0 -auth
/var/run/lightdm/root/:0 -nolisten tcp vt7&lt;/p>
&lt;p>13.1 mW 3.4 ms/s 5.6 Process /usr/bin/konsole&lt;/p>
&lt;p>9.82 mW 2.5 ms/s 53.7 Process [irq/48-iwlwifi]&lt;/p>
&lt;p>9.11 mW 2.4 ms/s 2.2 Process /usr/bin/knemo&lt;/p>
&lt;p>8.62 mW 2.2 ms/s 12.3 Process
/usr/lib/chromium/chromium &amp;ndash;password-store=detect&lt;/p>
&lt;p>8.32 mW 2.1 ms/s 45.5 Interrupt [48] iwlwifi&lt;/p>
&lt;p>6.96 mW 1.8 ms/s 35.3 Interrupt [7] sched(softirq)&lt;/p>
&lt;p>5.13 mW 1.3 ms/s 57.1 Interrupt [47] i915&lt;/p>
&lt;p>4.24 mW 1.1 ms/s 0.4 Process powertop&lt;/p>
&lt;p>3.38 mW 0.9 ms/s 1.5 Timer tcp_keepalive_timer&lt;/p>
&lt;p>2.85 mW 0.7 ms/s 11.9 Process /usr/sbin/mysqld
&amp;ndash;basedir=/usr &amp;ndash;datadir=/var/lib/mysql &amp;ndash;plu&lt;/p></description></item></channel></rss>