<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sohrab Behdani</title>
    <description>The latest articles on DEV Community by Sohrab Behdani (@behdanisohrab).</description>
    <link>https://dev.to/behdanisohrab</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F953131%2Fd5ed0964-1595-42a0-8814-2fbb3ddc30d2.png</url>
      <title>DEV Community: Sohrab Behdani</title>
      <link>https://dev.to/behdanisohrab</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/behdanisohrab"/>
    <language>en</language>
    <item>
      <title>How i used MergerFS to connect a NFS to my local disk</title>
      <dc:creator>Sohrab Behdani</dc:creator>
      <pubDate>Sun, 02 Aug 2026 12:09:29 +0000</pubDate>
      <link>https://dev.to/behdanisohrab/how-i-used-mergerfs-to-connect-a-nfs-to-my-local-disk-4m01</link>
      <guid>https://dev.to/behdanisohrab/how-i-used-mergerfs-to-connect-a-nfs-to-my-local-disk-4m01</guid>
      <description>&lt;p&gt;Sooner or later, every self-hosted setup runs into the same wall: you need more storage, but you don't need a distributed storage cluster. Maybe you have a media server whose library keeps growing, or a backup target that's slowly filling up, or a homelab with three or four machines that each have some spare disk sitting idle. The obvious answers, Ceph, GlusterFS, or a full-blown SAN, are overkill for this kind of problem. They bring their own operational burden: multiple daemons, quorum requirements, network overhead, and a learning curve that doesn't pay for itself unless you're running dozens of terabytes across a real cluster with redundancy requirements.&lt;/p&gt;

&lt;p&gt;This is the gap that MergerFS fills. It's a union filesystem, meaning it takes several separate storage locations and presents them to applications as a single, unified mount point. It doesn't stripe data, it doesn't replicate it, and it doesn't do anything clever with erasure coding. It just merges directory trees. Combined with NFS to bring in storage from a second machine, you can build a pool that behaves like one big disk without touching a single line of cluster configuration.&lt;/p&gt;

&lt;p&gt;This article walks through building exactly that: an NFS server exporting a chunk of storage, a client machine mounting it locally, and MergerFS combining that NFS mount with local disk into a single pooled filesystem. Along the way we'll cover the NFS version choice, placement policies, permissions, failure behavior, and backup strategy, because a union filesystem is not, and never will be, a backup.&lt;/p&gt;

&lt;p&gt;Before going further, it's worth being honest about when this approach doesn't make sense. If you need strong consistency guarantees, POSIX locking across multiple concurrent writers, or high availability where a node failure shouldn't interrupt service, MergerFS and NFS are the wrong tool. This setup is best suited for single-writer or mostly-read workloads: media libraries, backup targets, file archives, and general-purpose homelab storage where simplicity and low operational overhead matter more than clustering guarantees.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Overview
&lt;/h2&gt;

&lt;p&gt;The setup involves two machines. One exports storage over NFS, the other mounts that export and merges it with its own local disk using MergerFS. Applications on the client only ever see the final merged mount point; they have no idea whether a given file physically lives on local disk or on the remote NFS share.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                        STORAGE SERVER (192.0.2.10)
                        ┌─────────────────────────┐
                        │   /srv/storage           │
                        │   (physical disk)        │
                        └──────────────┬───────────┘
                                       │
                                  NFS Export
                                       │
                                       ▼
┌──────────────────────────────────────────────────────────────┐
│                  APPLICATION SERVER (198.51.100.20)           │
│                                                                 │
│   /srv/local-storage        /mnt/storage (NFS mount)          │
│   (local disk)              from 192.0.2.10:/srv/storage      │
│         │                              │                       │
│         └──────────────┬───────────────┘                      │
│                         ▼                                      │
│                 ┌───────────────┐                              │
│                 │   MergerFS    │                              │
│                 └───────┬───────┘                              │
│                         ▼                                      │
│                  /srv/storage                                  │
│              (final merged mount point)                        │
│                         │                                       │
│                    Applications                                 │
└──────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Data flows in one direction conceptually: applications write to &lt;code&gt;/srv/storage&lt;/code&gt; (the merged mount), MergerFS decides which underlying branch actually receives the write based on the placement policy you configure, and that branch is either local disk or the NFS mount pointing back at the storage server. Reads work the same way in reverse; MergerFS looks across all branches and presents whichever file matches, regardless of where it physically lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;p&gt;You'll need two Linux machines for this setup. The first is the storage server, whose only job is to export a directory over NFS. The second is the application or client server, which mounts that export and merges it locally with MergerFS. Both machines can run any mainstream distribution; the commands below cover Debian and Ubuntu (using &lt;code&gt;apt&lt;/code&gt;), and Arch Linux (using &lt;code&gt;pacman&lt;/code&gt;), with notes for Fedora and Rocky Linux where the package names differ.&lt;/p&gt;

&lt;p&gt;In terms of hardware, there's nothing exotic here. A gigabit or better network link between the two machines is recommended if you're moving anything beyond small files, since NFS performance is heavily influenced by network latency and throughput. For the examples in this article, the storage server sits at &lt;code&gt;192.0.2.10&lt;/code&gt; and the application server sits at &lt;code&gt;198.51.100.20&lt;/code&gt;. These addresses come from RFC 5737 and are reserved for documentation, so don't expect to reach them on the internet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing and Configuring the NFS Server
&lt;/h2&gt;

&lt;p&gt;Start on the storage server. On Debian or Ubuntu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nfs-kernel-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Arch Linux:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; nfs-utils
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Fedora or Rocky Linux, the package is &lt;code&gt;nfs-utils&lt;/code&gt; as well, installed with &lt;code&gt;dnf install nfs-utils&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Next, create the directory you intend to export and lock down its ownership. This directory will hold the actual data, so treat its permissions carefully from the start:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /srv/storage
&lt;span class="nb"&gt;sudo chown &lt;/span&gt;nobody:nogroup /srv/storage
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;0770 /srv/storage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Arch and Fedora-based systems, the anonymous group is usually called &lt;code&gt;nobody&lt;/code&gt; rather than &lt;code&gt;nogroup&lt;/code&gt;; check with &lt;code&gt;getent group nobody&lt;/code&gt; if the chown command complains.&lt;/p&gt;

&lt;p&gt;Now define the export in &lt;code&gt;/etc/exports&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;/&lt;span class="n"&gt;srv&lt;/span&gt;/&lt;span class="n"&gt;storage&lt;/span&gt; &lt;span class="m"&gt;198&lt;/span&gt;.&lt;span class="m"&gt;51&lt;/span&gt;.&lt;span class="m"&gt;100&lt;/span&gt;.&lt;span class="m"&gt;20&lt;/span&gt;(&lt;span class="n"&gt;rw&lt;/span&gt;,&lt;span class="n"&gt;sync&lt;/span&gt;,&lt;span class="n"&gt;no_subtree_check&lt;/span&gt;,&lt;span class="n"&gt;no_root_squash&lt;/span&gt;)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each field here matters. &lt;code&gt;rw&lt;/code&gt; allows both reads and writes from the client. &lt;code&gt;sync&lt;/code&gt; tells the NFS server to write changes to disk before acknowledging them back to the client, which is slower than &lt;code&gt;async&lt;/code&gt; but much safer, since &lt;code&gt;async&lt;/code&gt; can lose recently written data if the server crashes before flushing to disk. &lt;code&gt;no_subtree_check&lt;/code&gt; disables a consistency check that verifies a requested file is actually within the exported tree; it's mostly a legacy option at this point and disabling it improves reliability when files are renamed or moved within the export. We'll come back to &lt;code&gt;no_root_squash&lt;/code&gt; in the permissions section, since it interacts directly with how MergerFS on the client will see file ownership.&lt;/p&gt;

&lt;p&gt;Apply the export and start the services:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;exportfs &lt;span class="nt"&gt;-ra&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; nfs-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;exportfs -ra&lt;/code&gt; re-reads &lt;code&gt;/etc/exports&lt;/code&gt; and reloads the export table without needing a full service restart, which is convenient once you're iterating on the configuration. Verify the export is live with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;exportfs &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see the export listed along with the options you configured. From the client side, once networking is in place, you can also confirm visibility with &lt;code&gt;showmount -e 192.0.2.10&lt;/code&gt;, which lists everything the server is currently exporting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing the NFS Client
&lt;/h2&gt;

&lt;p&gt;On the application server, install the client tools. Debian and Ubuntu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nfs-common
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Arch Linux:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; nfs-utils
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a mount point and test the connection manually before committing to a permanent configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /mnt/storage
&lt;span class="nb"&gt;sudo &lt;/span&gt;mount &lt;span class="nt"&gt;-t&lt;/span&gt; nfs &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;vers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3 192.0.2.10:/srv/storage /mnt/storage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;vers=3&lt;/code&gt; flag pins the mount to NFSv3, which we'll justify in detail in the next section. If the mount succeeds, &lt;code&gt;df -h /mnt/storage&lt;/code&gt; should show the remote filesystem, and you should be able to create and read files there as a basic sanity check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch&lt;/span&gt; /mnt/storage/testfile
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /mnt/storage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Common mount options worth knowing at this stage include &lt;code&gt;rsize&lt;/code&gt; and &lt;code&gt;wsize&lt;/code&gt;, which control the maximum read and write block sizes negotiated with the server (larger values generally help throughput on fast networks), and &lt;code&gt;timeo&lt;/code&gt;, which sets how long the client waits before retransmitting a request. We'll cover the full set of options when we build the permanent fstab entry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Choose NFSv3?
&lt;/h2&gt;

&lt;p&gt;This is a question that trips up a lot of people setting up NFS for the first time, because the assumption is usually "newer is better." NFSv4 is indeed the more modern protocol, with integrated security (Kerberos support), a single well-defined TCP port instead of the sprawling portmapper dance NFSv3 relies on, and built-in state management for things like file locking. So why would anyone deliberately choose the older version for a pooled storage setup?&lt;/p&gt;

&lt;p&gt;The core difference comes down to statefulness. NFSv3 is stateless: the server keeps no record of which clients have which files open. Every request is self-contained and includes everything needed to process it. NFSv4 is stateful: the server tracks open files, locks, and client sessions as ongoing state. Statelessness sounds primitive, but it has a very practical benefit for a setup like this one. When an NFSv3 server reboots or the network briefly drops, there's no session state to recover; the client simply resumes sending requests once the server is reachable again, and the server has no confusion about what it "should" remember. NFSv4, by contrast, needs to go through a grace period after a restart where it reclaims locks and rebuilds session state, and if that recovery is interrupted or misconfigured, clients can end up stuck.&lt;/p&gt;

&lt;p&gt;Locking behavior follows from this. NFSv3 relies on a separate protocol, NLM (Network Lock Manager), running alongside the main NFS service, which is part of why NFSv3 needs the portmapper and multiple ports. NFSv4 has locking built directly into the protocol, which is architecturally cleaner but ties lock state to the stateful session model described above. For a MergerFS pool that's primarily serving media files, backups, or archival data with a single writer at a time, the sophistication of NFSv4 locking rarely gets used, and the operational simplicity of NFSv3's stateless model tends to matter more.&lt;/p&gt;

&lt;p&gt;Recovery after outages is where this really shows up in practice. If your storage server reboots for a kernel update while the application server has files open through the mount, an NFSv3 client will simply retry its pending requests until the server comes back, especially when mounted with &lt;code&gt;hard&lt;/code&gt; (more on that shortly). An NFSv4 client going through the same event has to renegotiate its lease and session, which is usually fine, but introduces more moving parts that can fail in ways that are harder to diagnose over a flaky home network link.&lt;/p&gt;

&lt;p&gt;Performance-wise, there isn't a dramatic winner. NFSv4.1 and later introduced session trunking and better caching semantics that can outperform NFSv3 on high-concurrency, high-latency wide-area links, but on a local network between two machines in the same rack or the same room, the difference is usually within noise. Security is the one area where NFSv4 is unambiguously ahead, since it supports Kerberos-based authentication and encryption in transit, whereas NFSv3 relies on IP-based trust (the client's address is essentially its credential) and has no native encryption. If your storage server and application server sit behind a firewall on a trusted internal network, this gap matters less; if you're exporting over anything resembling an untrusted network, you should either use NFSv4 with Kerberos or tunnel NFSv3 over something like WireGuard.&lt;/p&gt;

&lt;p&gt;Given all this, NFSv3 tends to be the pragmatic choice for a simple two-machine MergerFS pool: fewer moving parts, more forgiving recovery behavior, and a locking model that's simple enough not to fight with MergerFS's own file placement logic. If your environment has multiple concurrent writers, requires encryption in transit without a VPN layer, or spans untrusted networks, NFSv4 with Kerberos is worth the added complexity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing MergerFS
&lt;/h2&gt;

&lt;p&gt;MergerFS is a FUSE-based union filesystem. FUSE (Filesystem in Userspace) lets a regular program implement filesystem behavior without needing kernel driver code, which is why MergerFS can be installed and upgraded like any other package rather than requiring a kernel module. The tradeoff, which we'll revisit in the performance section, is that every filesystem operation crosses the user space/kernel space boundary an extra time compared to a native kernel filesystem, adding a small amount of overhead.&lt;/p&gt;

&lt;p&gt;On Debian and Ubuntu, MergerFS ships as a &lt;code&gt;.deb&lt;/code&gt; package on its GitHub releases page, since it's not always in the default repositories on older releases:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget https://github.com/trapexit/mergerfs/releases/latest/download/mergerfs_amd64.deb
&lt;span class="nb"&gt;sudo &lt;/span&gt;dpkg &lt;span class="nt"&gt;-i&lt;/span&gt; mergerfs_amd64.deb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Arch Linux, it's available directly from the official repositories:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; mergerfs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Fedora and Rocky Linux, install via COPR or the packaged RPM from the project's release page, following the same pattern as the Debian package above but with &lt;code&gt;rpm -i&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Verify the install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mergerfs &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see a version string reported. If the binary isn't found, double check that &lt;code&gt;/usr/bin&lt;/code&gt; or &lt;code&gt;/usr/local/bin&lt;/code&gt; (depending on how the package installed it) is on your &lt;code&gt;PATH&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the Union Filesystem
&lt;/h2&gt;

&lt;p&gt;With NFS mounted at &lt;code&gt;/mnt/storage&lt;/code&gt; and some local disk available, we can now merge the two. First, set up the local branch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /srv/local-storage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the actual MergerFS mount:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mergerfs &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; defaults,allow_other,use_ino,category.create&lt;span class="o"&gt;=&lt;/span&gt;mspmfs,minfreespace&lt;span class="o"&gt;=&lt;/span&gt;20G,moveonenospc&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  /srv/local-storage:/mnt/storage &lt;span class="se"&gt;\&lt;/span&gt;
  /srv/storage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's go through this option by option, since each one changes real behavior. &lt;code&gt;defaults&lt;/code&gt; pulls in MergerFS's standard baseline options, mainly to keep the command shorter. &lt;code&gt;allow_other&lt;/code&gt; permits users other than the one who ran the &lt;code&gt;mergerfs&lt;/code&gt; command to access the mount, which is necessary for almost any real deployment where services run as their own dedicated users rather than root. &lt;code&gt;use_ino&lt;/code&gt; tells MergerFS to generate its own inode numbers for files in the merged view rather than passing through the underlying filesystem's inode numbers directly; this avoids inode collisions between the two branches, which matters because a local ext4 filesystem and a remote NFS export can easily hand out overlapping inode numbers on their own.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;category.create=mspmfs&lt;/code&gt; sets the placement policy for new file creation, which we'll cover in detail in the next section, but in short it means "most space percentage, most free space," picking whichever branch has the most free space relative to its total size when creating new files. &lt;code&gt;minfreespace=20G&lt;/code&gt; sets a floor: once a branch has less than 20GB free, MergerFS treats it as ineligible for new writes under space-aware policies, which prevents you from ever filling a branch down to zero and running into strange out-of-space edge cases mid-write. &lt;code&gt;moveonenospc=true&lt;/code&gt; is a safety net: if a write to a branch fails because that branch ran out of space mid-operation, MergerFS will automatically move the partially written file to another branch with room and retry, rather than simply failing the write.&lt;/p&gt;

&lt;p&gt;The two paths after &lt;code&gt;-o&lt;/code&gt; are the branches being merged, separated by a colon: &lt;code&gt;/srv/local-storage&lt;/code&gt; (physical disk on this machine) and &lt;code&gt;/mnt/storage&lt;/code&gt; (the NFS mount from the storage server). The final path, &lt;code&gt;/srv/storage&lt;/code&gt;, is the merged mount point that applications will actually use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Placement Policies
&lt;/h2&gt;

&lt;p&gt;MergerFS decides where new files and directories get created based on a placement policy, and picking the right one matters a lot for how your pool behaves as branches fill up unevenly. &lt;code&gt;epmfs&lt;/code&gt; (existing path, most free space) prefers to create new files in whichever branch already has the parent directory present, and among those, picks the one with the most free space; this is a good default when you want related files kept together on the same branch as much as possible. &lt;code&gt;mfs&lt;/code&gt; (most free space) ignores existing paths entirely and always picks whichever branch has the most free space in absolute terms, which tends to spread data more evenly but can scatter related files across branches.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mspmfs&lt;/code&gt; (most space percentage, most free space), the one used in our example above, chooses the branch with the highest percentage of free space relative to its total capacity, which is useful when your branches are different sizes, since a smaller branch with 30% free might otherwise get starved by &lt;code&gt;mfs&lt;/code&gt; in favor of a much larger branch with 30GB free but only 5% of its total. &lt;code&gt;ff&lt;/code&gt; (first found) simply uses branches in the order they were listed until the first one runs out of eligible space, which is predictable but can leave later branches sitting mostly empty for a long time. &lt;code&gt;lus&lt;/code&gt; (least used space) picks whichever branch currently holds the least amount of data, a reasonable general-purpose choice if you just want things spread out roughly evenly by usage. &lt;code&gt;rand&lt;/code&gt; picks a branch at random among the eligible ones, which is rarely the right choice outside of testing, since it makes reasoning about where any given file lives essentially impossible.&lt;/p&gt;

&lt;p&gt;For a two-branch pool like the one in this article, &lt;code&gt;mspmfs&lt;/code&gt; or &lt;code&gt;mfs&lt;/code&gt; are both reasonable defaults, with &lt;code&gt;mspmfs&lt;/code&gt; being the better choice whenever the local disk and the remote NFS export have meaningfully different total capacities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Persistent Mounts
&lt;/h2&gt;

&lt;p&gt;Running these commands by hand each time isn't sustainable, so both the NFS mount and the MergerFS mount need entries in &lt;code&gt;/etc/fstab&lt;/code&gt;. Here's a complete example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# NFS mount from storage server
192.0.2.10:/srv/storage  /mnt/storage  nfs  vers=3,soft,timeo=30,retrans=3,_netdev,nofail,x-systemd.automount  0  0

# MergerFS pool combining local disk and the NFS mount
/srv/local-storage:/mnt/storage  /srv/storage  fuse.mergerfs  defaults,allow_other,use_ino,category.create=mspmfs,minfreespace=20G,moveonenospc=true,nofail,_netdev  0  0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Walking through each option: &lt;code&gt;_netdev&lt;/code&gt; tells systemd that this mount depends on the network being up before it can succeed, which prevents the boot process from trying to mount it too early and either failing outright or hanging while waiting for a network interface that isn't ready yet. &lt;code&gt;nofail&lt;/code&gt; means that if this mount fails, the boot process continues anyway rather than dropping you into an emergency shell; for a storage pool that isn't strictly required for the system to function, this is almost always what you want. &lt;code&gt;x-systemd.automount&lt;/code&gt; sets up the mount as an automount unit, meaning the actual NFS mount only gets triggered the first time something tries to access &lt;code&gt;/mnt/storage&lt;/code&gt;, rather than blocking the boot sequence waiting for the NFS server to respond.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;soft&lt;/code&gt; versus &lt;code&gt;hard&lt;/code&gt; is one of the more consequential choices here. A &lt;code&gt;hard&lt;/code&gt; mount means that if the NFS server becomes unreachable, any process trying to access the mount will block indefinitely (or until &lt;code&gt;retrans&lt;/code&gt; is exhausted, if combined with certain other options) rather than returning an error; this protects against silent data corruption from a write that never actually completed, but can leave applications hung waiting on I/O that will never return. A &lt;code&gt;soft&lt;/code&gt; mount, used in the example above, will eventually give up and return an I/O error to the calling application after the timeout and retry count are exhausted, which keeps things responsive but risks the application receiving a failure partway through an operation it assumed would either fully succeed or fully fail cleanly. &lt;code&gt;retrans=3&lt;/code&gt; sets how many times the client retries a request before giving up (relevant mainly under &lt;code&gt;soft&lt;/code&gt;), and &lt;code&gt;timeo=30&lt;/code&gt; sets the timeout in deciseconds (so 30 here means 3 seconds) between retries.&lt;/p&gt;

&lt;p&gt;For the MergerFS side, &lt;code&gt;use_ino&lt;/code&gt; and &lt;code&gt;allow_other&lt;/code&gt; mean the same thing they did on the command line earlier; they need to be repeated in fstab since this is effectively just persisting the same command you ran manually.&lt;/p&gt;

&lt;p&gt;Reload systemd's view of fstab and test the mounts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;mount &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;mount -a&lt;/code&gt; attempts to mount everything listed in fstab that isn't already mounted, which is a quick way to verify your fstab syntax is correct without rebooting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Permissions and UID/GID Mapping
&lt;/h2&gt;

&lt;p&gt;Permissions are where most people lose an afternoon on their first attempt at this setup. The core issue is that NFS, in its traditional form, identifies users by numeric UID and GID, not by username, and it trusts the client to report those numbers honestly. If the storage server and the application server don't agree on what UID 1000 means, you'll see files owned by seemingly random users, or everything showing up owned by &lt;code&gt;nobody&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;no_root_squash&lt;/code&gt;, used in our exports file earlier, tells the server to trust the client's root user as actual root on the exported filesystem, rather than mapping root requests down to the unprivileged &lt;code&gt;nobody&lt;/code&gt; account (which is the default behavior, called &lt;code&gt;root_squash&lt;/code&gt;). Squashing root is a security measure: without it, anyone with root on the client machine effectively has root over the exported files too. For a two-machine homelab setup where you control and trust both machines, &lt;code&gt;no_root_squash&lt;/code&gt; is often fine and makes life considerably easier, but on any export reachable by machines you don't fully control, &lt;code&gt;root_squash&lt;/code&gt; (the default) should stay enabled.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;all_squash&lt;/code&gt; goes further and maps every remote user, not just root, down to a single anonymous UID and GID, which is useful when you want the export to behave as if it's owned entirely by one service account regardless of who's writing to it from the client side. When &lt;code&gt;all_squash&lt;/code&gt; is active, &lt;code&gt;anonuid&lt;/code&gt; and &lt;code&gt;anongid&lt;/code&gt; specify exactly which UID and GID that anonymous mapping should use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;/&lt;span class="n"&gt;srv&lt;/span&gt;/&lt;span class="n"&gt;storage&lt;/span&gt; &lt;span class="m"&gt;198&lt;/span&gt;.&lt;span class="m"&gt;51&lt;/span&gt;.&lt;span class="m"&gt;100&lt;/span&gt;.&lt;span class="m"&gt;20&lt;/span&gt;(&lt;span class="n"&gt;rw&lt;/span&gt;,&lt;span class="n"&gt;sync&lt;/span&gt;,&lt;span class="n"&gt;no_subtree_check&lt;/span&gt;,&lt;span class="n"&gt;all_squash&lt;/span&gt;,&lt;span class="n"&gt;anonuid&lt;/span&gt;=&lt;span class="m"&gt;1000&lt;/span&gt;,&lt;span class="n"&gt;anongid&lt;/span&gt;=&lt;span class="m"&gt;1000&lt;/span&gt;)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a common pattern when the application server runs a specific service (say, a media server under a dedicated &lt;code&gt;mediauser&lt;/code&gt; account) and you want every file written through NFS to consistently belong to that same user and group regardless of what process on the client actually wrote it.&lt;/p&gt;

&lt;p&gt;The safest general practice, though, is simply to make sure the UID and GID of your service accounts match across both machines. If &lt;code&gt;mediauser&lt;/code&gt; is UID 1000 on the application server, create a &lt;code&gt;mediauser&lt;/code&gt; account with UID 1000 on the storage server as well, and skip the squashing complexity entirely. This keeps ownership consistent and predictable without relying on the server silently rewriting UIDs behind the scenes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure Testing
&lt;/h2&gt;

&lt;p&gt;Before trusting this pool with real data, it's worth deliberately breaking it to see how it behaves. On the storage server, simulate an outage by stopping the NFS service or physically disconnecting the network:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl stop nfs-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With a &lt;code&gt;hard&lt;/code&gt; mount, any process on the application server trying to read or write through &lt;code&gt;/mnt/storage&lt;/code&gt; will simply hang, waiting for the server to come back, rather than failing. This is often the desired behavior for critical writes, since it prevents an application from believing a write succeeded when it didn't. With a &lt;code&gt;soft&lt;/code&gt; mount, the same operation will eventually return an I/O error once &lt;code&gt;timeo&lt;/code&gt; and &lt;code&gt;retrans&lt;/code&gt; are exhausted, letting the application handle the failure instead of blocking forever.&lt;/p&gt;

&lt;p&gt;MergerFS itself behaves according to whichever branches remain accessible. If the NFS branch goes away entirely, MergerFS will still serve files from the local branch (&lt;code&gt;/srv/local-storage&lt;/code&gt;) normally, but any file that physically lived only on the NFS branch will become unreachable through the merged mount until that branch returns. This is worth internalizing: MergerFS doesn't replicate data between branches, so losing a branch means losing access to whatever data lived exclusively on it, not just a performance hit.&lt;/p&gt;

&lt;p&gt;Bring the server back and confirm recovery:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start nfs-server
&lt;span class="nb"&gt;ls&lt;/span&gt; /mnt/storage
&lt;span class="nb"&gt;ls&lt;/span&gt; /srv/storage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With a properly configured automount and &lt;code&gt;soft&lt;/code&gt; or &lt;code&gt;hard&lt;/code&gt; mount, access should resume without needing to manually remount anything on the client, though a &lt;code&gt;soft&lt;/code&gt; mount that already returned errors to an application may require that application to retry the failed operation itself, since the earlier failure won't automatically retry on its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backup Strategy
&lt;/h2&gt;

&lt;p&gt;It's worth being direct about this: MergerFS pools data, it does not protect it. If a disk backing one of your branches fails, whatever files lived on that branch are gone, exactly as if MergerFS weren't in the picture at all. There's no redundancy, no parity, no replication happening anywhere in this stack. A real backup strategy is not optional here, it's required.&lt;/p&gt;

&lt;p&gt;Three tools come up repeatedly for this kind of setup: BorgBackup, Restic, and Kopia. BorgBackup is mature, has excellent deduplication and compression, and is a strong choice when you're backing up to a single destination you control directly (a remote server over SSH, for instance), though it doesn't natively support cloud object storage backends like S3 without additional tooling. Restic is a close cousin in terms of deduplication and encryption, but has native support for a wide range of backends including S3-compatible object storage, Backblaze B2, and Azure, making it a better fit if your backup target lives in the cloud rather than on hardware you manage. Kopia is the newest of the three, and adds a built-in web UI and more flexible snapshot policies out of the box, at the cost of a somewhat smaller community and fewer years of production hardening compared to Borg or Restic.&lt;/p&gt;

&lt;p&gt;For a MergerFS pool specifically, any of the three works fine, since they all operate against the merged mount point (&lt;code&gt;/srv/storage&lt;/code&gt;) exactly as they would against any other directory tree; none of them need to know or care that the underlying storage is actually split across local disk and an NFS export.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Considerations
&lt;/h2&gt;

&lt;p&gt;Network latency is the first thing to understand, since every read or write that lands on the NFS branch now has to cross the network, unlike a purely local disk. On a local gigabit link this is usually a non-issue for sequential workloads, but random I/O (lots of small reads and writes scattered across a file) suffers more, since each operation pays the round-trip latency cost individually rather than benefiting from read-ahead and write-behind buffering.&lt;/p&gt;

&lt;p&gt;Sequential workloads, like streaming a large media file or writing a backup archive, tend to perform close to the raw network throughput once caching settles in. Small file workloads, like thousands of small configuration files or a Git repository, tend to perform noticeably worse over NFS, since the overhead of each individual filesystem operation (open, stat, close) dominates rather than raw data transfer.&lt;/p&gt;

&lt;p&gt;FUSE overhead, the cost of MergerFS routing every operation through user space instead of staying in the kernel, is generally small next to network latency, though it becomes measurable on very high IOPS workloads. Caching helps considerably here too: the NFS client caches file attributes and, depending on mount options, data as well, so for large file, mostly-read workloads such as media libraries, repeated access after the first read often feels close to local disk speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;p&gt;A handful of issues show up repeatedly with this kind of setup, and it's worth knowing the fix ahead of time rather than debugging from scratch under pressure.&lt;/p&gt;

&lt;p&gt;Files owned by &lt;code&gt;nobody&lt;/code&gt; on the client almost always trace back to a UID/GID mismatch between the two machines, or to &lt;code&gt;all_squash&lt;/code&gt; being active without matching &lt;code&gt;anonuid&lt;/code&gt;/&lt;code&gt;anongid&lt;/code&gt; values. Check &lt;code&gt;id&lt;/code&gt; on both machines for the relevant user and compare.&lt;/p&gt;

&lt;p&gt;"Stale NFS file handle" errors typically happen after the export path changed on the server (for example, the exported directory was recreated rather than reused) while the client still holds a reference to the old handle. Unmounting and remounting on the client usually resolves it: &lt;code&gt;sudo umount -l /mnt/storage &amp;amp;&amp;amp; sudo mount /mnt/storage&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;"Permission denied" when writing to the merged mount is almost always a directory permission issue on one of the underlying branches rather than a MergerFS problem itself; check &lt;code&gt;ls -la&lt;/code&gt; on both &lt;code&gt;/srv/local-storage&lt;/code&gt; and &lt;code&gt;/mnt/storage&lt;/code&gt; directly to see which branch is rejecting the write.&lt;/p&gt;

&lt;p&gt;MergerFS mount failures at boot are frequently caused by the NFS mount not being ready yet when MergerFS tries to start; this is exactly what &lt;code&gt;_netdev&lt;/code&gt; and &lt;code&gt;x-systemd.automount&lt;/code&gt; are meant to solve, so double check both are present in the fstab entries.&lt;/p&gt;

&lt;p&gt;Boot hangs related to storage almost always trace back to a &lt;code&gt;hard&lt;/code&gt; NFS mount without &lt;code&gt;nofail&lt;/code&gt;, where the boot process waits indefinitely for a server that isn't responding. Adding &lt;code&gt;nofail&lt;/code&gt; (and ideally &lt;code&gt;x-systemd.automount&lt;/code&gt;) fixes this by letting the boot continue and deferring the actual mount attempt until something accesses the path.&lt;/p&gt;

&lt;p&gt;Automount not triggering usually means the automount unit wasn't regenerated after an fstab edit; run &lt;code&gt;sudo systemctl daemon-reload&lt;/code&gt; after any change to &lt;code&gt;/etc/fstab&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;UID mismatches surface as files that appear to belong to the wrong user when viewed from one machine versus the other; the fix is either aligning UIDs across both machines or deliberately using &lt;code&gt;all_squash&lt;/code&gt; with explicit &lt;code&gt;anonuid&lt;/code&gt;/&lt;code&gt;anongid&lt;/code&gt; values as described earlier.&lt;/p&gt;

&lt;p&gt;Incorrect fstab syntax is best diagnosed with &lt;code&gt;sudo mount -a&lt;/code&gt;, which will print the specific parsing or mount error rather than silently failing on the next reboot.&lt;/p&gt;

&lt;p&gt;Finally, for genuine network outages, remember that a &lt;code&gt;soft&lt;/code&gt; mount will surface I/O errors to applications once retries are exhausted, while a &lt;code&gt;hard&lt;/code&gt; mount will simply wait; neither is "broken," they're just different tradeoffs, and the failure testing section above is worth revisiting if the behavior you're seeing doesn't match what you configured.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Note on this experiment
&lt;/h2&gt;

&lt;p&gt;A MergerFS and NFS pool is a genuinely good fit when you have a small number of machines, a workload that's mostly sequential reads and writes (media, backups, archives, general file storage), and a strong preference for operational simplicity over clustering features you won't use. It's not a distributed filesystem, it doesn't replicate anything, and it won't survive losing a branch without losing whatever data lived exclusively there, so pairing it with a real backup strategy using Borg, Restic, or Kopia isn't optional.&lt;/p&gt;

&lt;p&gt;Once your requirements grow past this, multiple concurrent writers needing strong consistency, actual fault tolerance where losing a node shouldn't mean losing data, or storage spread across many machines that needs to be managed as a single coherent pool, it's time to look at Ceph, GlusterFS, or Longhorn instead. Those systems solve real problems that MergerFS and NFS deliberately don't try to solve, at the cost of considerably more operational complexity. For everything short of that, though, the setup in this article gets you a flexible, pooled storage volume with a fraction of the moving parts, built entirely out of tools that have been stable and well understood for a very long time.&lt;/p&gt;

</description>
      <category>nfs</category>
      <category>linux</category>
      <category>mergerfs</category>
    </item>
    <item>
      <title>How to install a minimal Debian system on Qemu</title>
      <dc:creator>Sohrab Behdani</dc:creator>
      <pubDate>Sun, 20 Jul 2025 17:06:51 +0000</pubDate>
      <link>https://dev.to/behdanisohrab/how-to-install-a-minimal-debian-system-on-qemu-f4k</link>
      <guid>https://dev.to/behdanisohrab/how-to-install-a-minimal-debian-system-on-qemu-f4k</guid>
      <description>&lt;p&gt;I was working on a project that required a minimal debian installation. i didn't had the iso at the time, so i came up with an idea.&lt;/p&gt;

&lt;h2&gt;
  
  
  Debootstrap
&lt;/h2&gt;

&lt;p&gt;Debian has a tool called debootstrap, which installs Debian base systems in a subdirectory of another, already installed system.&lt;/p&gt;

&lt;p&gt;Debian wiki:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;debootstrap doesn't require an installation CD, just access to a Debian repository. It can also be installed and run from another operating system - for example, you can use debootstrap to install Debian onto an unused partition from a running Gentoo system. It can also be used to create a rootfs for a machine of a different architecture, which is known as "cross-debootstrapping". &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I'm Running Parch Linux which is a distribution based on Arch.&lt;br&gt;
For start, i installed the qemu, debootstrap and other tools using pacman:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; qemu-system-x86 qemu-img qemu-ui-gtk arch-install-scripts debootstrap
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Disk image
&lt;/h2&gt;

&lt;p&gt;now we need to create the disk image that we want to install the debian on, we use the &lt;code&gt;qemu-img&lt;/code&gt; command to create a new 60GB virtual disk for installation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;qemu-img create -f qcow2 debian.qcow2 60G  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;after this, we would load the &lt;code&gt;nbd&lt;/code&gt; module into the kernel for mounting the disk via &lt;code&gt;qemu-nbd&lt;/code&gt; command.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;qemu-nbd: QEMU Disk Network Block Device Server which allows us to expose disk image files such as &lt;code&gt;.qcow2&lt;/code&gt; ,  &lt;code&gt;.vmdk&lt;/code&gt; , &lt;code&gt;.vdi&lt;/code&gt; and etc as a Network Block Device (nbd) on linux.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;for short: It enables a virtual disk image to be treated like a real block device.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Using nbd
&lt;/h3&gt;

&lt;p&gt;for start, we need to load the module. for that we should run this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;modprobe nbd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then after that, we would use the &lt;code&gt;qemu-nbd&lt;/code&gt; command to mount the disk as a network block.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;qemu-nbd &lt;span class="nt"&gt;--connect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/nbd0 debian.qcow2  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;this would mount the virtual disk as /dev/nbd0&lt;/p&gt;

&lt;p&gt;now we should partition the disk, you can use your preferd tool, i would use the &lt;code&gt;parted&lt;/code&gt; itself.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;parted /dev/nbd0 &lt;span class="nt"&gt;--&lt;/span&gt; mklabel msdos
&lt;span class="nb"&gt;sudo &lt;/span&gt;parted /dev/nbd0 &lt;span class="nt"&gt;--&lt;/span&gt; mkpart primary ext4 1MiB 100%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;now we need to format the disk:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;mkfs.ext4 /dev/nbd0p1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Now after partitioning we need to start installing the debian itself.&lt;/p&gt;

&lt;p&gt;we would first mount the disk at /mnt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;mount /dev/nbd0p1 /mnt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we run this command to install the base system at /mnt which is our mounted disk:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;debootstrap &lt;span class="nt"&gt;--arch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;amd64 trixie /mnt http://deb.debian.org/debian
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;notes&lt;/strong&gt;: I'm using Trixie, because it is now stable enough to be used.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can change the mirror and arch to your preferred one.&lt;/p&gt;

&lt;p&gt;the installation would start after running that command.&lt;/p&gt;

&lt;h1&gt;
  
  
  Post installation
&lt;/h1&gt;

&lt;p&gt;now we need to chroot in our newly bootstrapped debian and configure it.&lt;/p&gt;

&lt;p&gt;we have two options&lt;/p&gt;

&lt;h2&gt;
  
  
  For Arch users
&lt;/h2&gt;

&lt;p&gt;if you are running Arch Linux or it forks, there is a handy tool called &lt;code&gt;arch-chroot&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;we need to simply run this command to chroot into it, then you can jump right to the next section.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;arch-chroot /mnt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  For other distros:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;mount &lt;span class="nt"&gt;--bind&lt;/span&gt; /dev /mnt/dev

&lt;span class="nb"&gt;sudo &lt;/span&gt;mount &lt;span class="nt"&gt;--bind&lt;/span&gt; /sys /mnt/sys

&lt;span class="nb"&gt;sudo &lt;/span&gt;mount &lt;span class="nt"&gt;--bind&lt;/span&gt; /proc /mnt/proc

&lt;span class="nb"&gt;sudo chroot&lt;/span&gt; /mnt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  configuration:
&lt;/h2&gt;

&lt;p&gt;We need to set our hostname and hosts file, for that you can run this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo &lt;/span&gt;debian &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /etc/hostname

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"127.0.0.1 localhost"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /etc/hosts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can change the debian with whatever you like.&lt;/p&gt;

&lt;p&gt;Now we need to configure the local time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-sf&lt;/span&gt; /usr/share/zoneinfo/UTC /etc/localtime

/usr/sbin/dpkg-reconfigure tzdata
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we set the root user password:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;passwd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we need to install other system components to make it work properly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt update

apt &lt;span class="nb"&gt;install &lt;/span&gt;linux-image-amd64 grub-pc systemd-sysv &lt;span class="nb"&gt;sudo &lt;/span&gt;nano net-tools network-manager
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;now we install the bootloader:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;grub-install &lt;span class="nt"&gt;--target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;i386-pc &lt;span class="nt"&gt;--recheck&lt;/span&gt; /dev/nbd0

/usr/sbin/grub-mkconfig &lt;span class="nt"&gt;-o&lt;/span&gt; /boot/grub/grub.cfg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;now we need to exit from chroot with &lt;code&gt;exit&lt;/code&gt; command and generate the fstab file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo su

genfstab -U /mnt &amp;gt;&amp;gt; /mnt/etc/fstab
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;note&lt;/strong&gt;: &lt;code&gt;genfstab&lt;/code&gt; is a command from arch install scripts.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Booting into it
&lt;/h2&gt;

&lt;p&gt;after all of this, we need to unmount our disk.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;umount /mnt

&lt;span class="nb"&gt;sudo &lt;/span&gt;qemu-nbd &lt;span class="nt"&gt;--disconnect&lt;/span&gt; /dev/nbd0 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;after that, you need to run this command to boot it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;qemu-system-x86_64 &lt;span class="nt"&gt;-m&lt;/span&gt; 1024 &lt;span class="nt"&gt;-hda&lt;/span&gt; debian.qcow2 &lt;span class="nt"&gt;-enable-kvm&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: You can change the memory if you want or add more cpu cores, for that read the &lt;a href="https://www.qemu.org/docs/master/system/qemu-manpage.html" rel="noopener noreferrer"&gt;qemu docs&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thanks for reading this, i might create a video from this later :)&lt;/p&gt;

</description>
      <category>debian</category>
      <category>linux</category>
      <category>qemu</category>
      <category>emulation</category>
    </item>
    <item>
      <title>Linux on mobile, my experience so far</title>
      <dc:creator>Sohrab Behdani</dc:creator>
      <pubDate>Thu, 22 May 2025 17:06:46 +0000</pubDate>
      <link>https://dev.to/behdanisohrab/linux-on-mobile-my-experience-so-far-nbm</link>
      <guid>https://dev.to/behdanisohrab/linux-on-mobile-my-experience-so-far-nbm</guid>
      <description>&lt;p&gt;I spoke about this subject at MashhadLUG a few weeks ago but regretfully didn't record it. So I figured I would make the essence of what I talked about a blog entry—something useful and permanent and easy to access. Here's a glimpse at my experience with Linux on mobile devices, how it runs, the application base, and whether or not it's actually usable in everyday life.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Hold on a minute. Isn't Android also Linux?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Technically speaking, Android is indeed Linux. Sort of.&lt;br&gt;
Android employs the Linux kernel but otherwise shares little in common. Unlike a standard GNU/Linux distro, Android has a non-identical C standard library—Bionic rather than glibc—which results in binary incompatibility from most standard Linux software. And on top of all this, Android isn't exactly the freest or most open OS in the universe either.&lt;/p&gt;

&lt;p&gt;So when we mention Linux on Mobile, we're talking about installing a true GNU/Linux distribution on your phone—just like on your desktop or notebook, but (ideally) tailored for use on a phone.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How Linux operates on Smartphones: The Two Fundamental Approaches&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Middleware (Halium / libhybris)&lt;/strong&gt;
This is the "compatibility layer" approach. libhybris and Halium cooperate and fill the compatibility gap between Android's kernel/hardware and a Linux distro. The majority of the systems based on Halium (e.g., Sailfish OS, Droidian, and Ubuntu Touch) enjoy good hardware support as they reuse Android drivers.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There's a catch, however: they're based on the Android kernel, usually very outdated and not supported. So although this method "just works" for most devices, you give away freedom and future-proofing.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How it works:&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Halium operates on top of the Android kernel&lt;/li&gt;
&lt;li&gt;libhybris resides on your Linux distribution and translates glibc syscalls to Bionic
So when you flip your flashlight on, for instance, libhybris converts the demand into a form which can be forwarded on to the Android hardware level. It's magical, really.
But also a bit... Frankenstein-esque.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can't bolt the full Linux experience on an Android platform and hope for it to be perfect. It's a hack—and hacks tend to have their limits.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Mainlining the Kernel (a.k.a: Doing it the right way)&lt;/strong&gt;
With this approach, developers port a mainline Linux kernel on a phone's SoC. Rather than leveraging Android's driver stack and reusing it, everything gets rebuilt from the ground (or nearly so) from upstreamed Linux support.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This provides a much "cleaner" and more native Linux experience. Distros such as Mobian, postmarketOS, Koofr, and upcoming Parch make use of this approach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But it's not all sunshine and rootshells:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Relatively few of the SoCs enjoy full mainline support (primarily Snapdragon chips)&lt;/li&gt;
&lt;li&gt;Hardware support remains limited—cameras don't usually function, for example&lt;/li&gt;
&lt;li&gt;Development is less device-friendly and slower compared to Halium setups&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📲 &lt;strong&gt;Mobile Linux App Ecosystems&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;One of the things GNU/Linux distros are well known for is having plenty of choices available. That legacy carries over on the phone as well. You can execute apps designed for GNOME, KDE Plasma, or even alternative desktops—on your phone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GNOME Ecosystem&lt;/strong&gt;&lt;br&gt;
GNOME has a fairly good mobile-optimized ecosystem. It's possible to use GNOME Mobile or Phosh or any of the countless GTK apps which scale well on small screen sizes. Personal favorites of mine are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GNOME Podcasts&lt;/li&gt;
&lt;li&gt;Dino - a great XMPP client&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You won't really notice anything's lacking in this world—most apps work really well on phone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plasma Mobile&lt;/strong&gt;&lt;br&gt;
KDE's Plasma Mobile offers you a neat, contemporary, and familiar experience. In my experience, I've found Plasma Mobile has a noticeably longer battery life compared to GNOME or Phosh and so it seems more optimized.&lt;/p&gt;

&lt;p&gt;Its app catalog is not as large, however. Nevertheless, there are some positives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PlasmaTube – a YouTube client&lt;/li&gt;
&lt;li&gt;Kasts - a Podcast App&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  😬 &lt;strong&gt;Things That Don't Feel Great&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;🧭 Web Browsers&lt;/strong&gt;&lt;br&gt;
This is part of the more frustrating aspects.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GNOME Web (Epiphany) employs WebKitGTK, which has trouble with contemporary websites and will sometimes crash.&lt;/li&gt;
&lt;li&gt;The Angelfish browser from KDE has somewhat improved courtesy of QtWebEngine but remains barebones in features and polish.&lt;/li&gt;
&lt;li&gt;Firefox, as available, takes a huge amount of tweaking through CSS just to look properly. It's far from as fluid or even as mobile-friendly as you might expect.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So yeah—don't look for a browsing experience comparable to Android or iOS yet.&lt;/p&gt;

&lt;p&gt;📵 &lt;strong&gt;Telegram&lt;/strong&gt;&lt;br&gt;
No decent mobile-optimized Telegram client on Linux yet. The desktop version sorta works. You'll have to shrink it way down just so it'll even fit on screen, and even then it's about as useful as a screen door on a submarine without a magnifying glass.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔬 &lt;strong&gt;My Real-World Usage&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I've used Droidian, postmarketOS, Ubuntu Touch, and Parch on my phone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here's the real story:&lt;/strong&gt;&lt;br&gt;
Linux on a cell phone isn't anywhere close to being suitable for ordinary users. It's a playground for tinkerers and trouble shooters even now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Main Issues:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Absence of critical apps&lt;/li&gt;
&lt;li&gt;Limited Hardware Support&lt;/li&gt;
&lt;li&gt;Strange and inconsistent UI/UX in most apps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yes, Android emulators can certainly fill some voids—but now you're missing the point. The true objective is to run Linux apps on a Linux phone, not resort back to Android compatibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  📷 &lt;strong&gt;Some Screenshots&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg4kmr39ederpvibuujqj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg4kmr39ederpvibuujqj.png" alt="Gnome Mobile" width="800" height="1664"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkuavng23tuhxqn23xmtv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkuavng23tuhxqn23xmtv.png" alt="About Page" width="800" height="1664"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4vs0dq2xxzkih2j6ehzj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4vs0dq2xxzkih2j6ehzj.png" alt="System Information" width="800" height="1664"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🗨️ &lt;strong&gt;So....&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This Post has turned out brief—I didn't feel I could elaborate without making it a little book. 😅&lt;/p&gt;

&lt;p&gt;I'll make it up in a subsequent entry, perhaps a bit technical or a how-to-type post.&lt;/p&gt;

</description>
      <category>linuxmobile</category>
      <category>linux</category>
      <category>postmarketos</category>
      <category>mobilelinux</category>
    </item>
    <item>
      <title>Why I Created Parch Linux: Making Arch Accessible for Everyone</title>
      <dc:creator>Sohrab Behdani</dc:creator>
      <pubDate>Sun, 18 May 2025 22:26:00 +0000</pubDate>
      <link>https://dev.to/behdanisohrab/why-i-created-parch-linux-making-arch-accessible-for-everyone-436j</link>
      <guid>https://dev.to/behdanisohrab/why-i-created-parch-linux-making-arch-accessible-for-everyone-436j</guid>
      <description>&lt;p&gt;Arch Linux has always been my go to, it’s fast, powerful, and incredibly flexible. But let’s be honest: it’s not the most welcoming option for newcomers. The installation process alone can scare people off, and setting up a clean, personalized desktop takes a lot of manual work.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What’s Parch Linux?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Parch stands for &lt;strong&gt;Persian Arch&lt;/strong&gt;, a tribute to my roots and a distro built around one idea: Arch can be fast and clean &lt;em&gt;without&lt;/em&gt; being intimidating. It’s built on top of Arch Linux but adds a friendlier interface, easier setup, and smart defaults. I wanted to keep the best parts of Arch, just make it usable right out of the box.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Why Not Stick with Vanilla Arch?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Because not everyone wants to build an entire OS from scratch every time they install it. Arch gives you unmatched control, but that often comes at the cost of time, patience, and a second screen open to the wiki 24/7.&lt;/p&gt;

&lt;p&gt;Parch takes that same power and wraps it in something that’s much easier to live with.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What Sets Parch Apart?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Here’s what I focused on while building it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Simple, Guided Installer&lt;/strong&gt;&lt;br&gt;
Parch has a graphical installer that walks you through the whole process—no command-line acrobatics unless you want them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Preconfigured Desktop Environments&lt;/strong&gt;&lt;br&gt;
Choose from GNOME, KDE, XFCE, and more each one ready to use without hours of tweaking.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Built-in Performance Optimizations&lt;/strong&gt;&lt;br&gt;
Parch is fast by default, even on older hardware. Lightweight and responsive, without losing usability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Access to All the Software You Need&lt;/strong&gt;&lt;br&gt;
You still get the full Arch repos &lt;em&gt;and&lt;/em&gt; the AUR, so the software library is virtually endless.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Parch Store (Coming Soon)&lt;/strong&gt;&lt;br&gt;
I’m working on a sleek native app store for easier package and update management, tailor-made for Parch.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Who’s It For?&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;New users&lt;/strong&gt; who want to explore Arch without diving into the deep end.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Power users&lt;/strong&gt; who want a clean install without wasting hours on setup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developers&lt;/strong&gt; looking for a fast, minimal, and up-to-date dev environment.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Under the Hood&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Parch sticks close to its Arch roots. It runs the Linux kernel, uses &lt;code&gt;systemd&lt;/code&gt;, and manages packages through &lt;code&gt;pacman&lt;/code&gt;. So you're still getting the full Arch experiencejust with a smoother ride.&lt;/p&gt;

&lt;p&gt;Security? It’s baked in. Parch includes good defaults like a firewall, optional disk encryption, and frequent updates.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Install Experience&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The installer is built to be beginner-friendly without holding you back. Choose your desktop, toggle extra packages, and get going fast. Advanced users can customize everything nothing’s locked down.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Real-World Use&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Parch isn’t just a weekend project. It’s built for real use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Daily tasks&lt;/strong&gt;: browsing, streaming, productivity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Development&lt;/strong&gt;: comes with tools, fast startup, and a light footprint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Education&lt;/strong&gt;: ideal for teaching Linux in a stress-free way.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Growing Together&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;There’s already a growing community behind Parch with forums, support channels, and detailed guides. We’re building this together, and if you want to contribute or just be part of it, I’d love to have you onboard.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What’s Next?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Here’s what’s coming down the pipeline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First release of the &lt;strong&gt;Parch Store&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;More desktop flavors, prebuilt and polished&lt;/li&gt;
&lt;li&gt;Broader &lt;strong&gt;hardware support&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;More core apps tailored to the Parch experience&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Final Words&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Parch is my way of making Arch more accessible without stripping away what makes it special. It’s clean, fast, flexible, and actually enjoyable to install and use.&lt;/p&gt;

&lt;p&gt;If that sounds like something you’d be into, give it a try. I’d love to hear your thoughts and have you join the journey :)&lt;/p&gt;

</description>
      <category>parchlinux</category>
      <category>archlinux</category>
      <category>linux</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Parch Linux new releases</title>
      <dc:creator>Sohrab Behdani</dc:creator>
      <pubDate>Sun, 16 Apr 2023 09:29:13 +0000</pubDate>
      <link>https://dev.to/behdanisohrab/parch-linux-new-releases-3f</link>
      <guid>https://dev.to/behdanisohrab/parch-linux-new-releases-3f</guid>
      <description>&lt;p&gt;Hello everyone,&lt;br&gt;
We are proud to offer you the new releases of the Parch Linux.&lt;br&gt;
Important changes of these releases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Removing Kde Falkon and changing the default browser to Firefox (in the version of CuteFish, the default browser is Chromium)&lt;/li&gt;
&lt;li&gt;Fixed slow boot problem&lt;/li&gt;
&lt;li&gt;Added ibus to CuteFish version to solve the problem of changing the keyboard layouts&lt;/li&gt;
&lt;li&gt;Fixed network manager problem in GNOME version&lt;/li&gt;
&lt;li&gt;Fixed the sudden closing of the installer in the xfce version&lt;/li&gt;
&lt;li&gt;Fixed reported problems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Click on The version names to download them:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/parchlinux/parch-iso-xfce/releases/download/2023-04-15.beta.2/Parchlinux.XFCE-2023.04.15-x86_64.iso" rel="noopener noreferrer"&gt;XFCE version&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/parchlinux/Parch-iso-gnome/releases/download/2023-04-10.alpha.3/Parchlinux.Gnome-2023.04.10-x86_64.iso" rel="noopener noreferrer"&gt;Gnome&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/parchlinux/parch-iso-cinnamon/releases/download/2023-04-15.beta.1/Parchlinux.Cinnamon-2023.04.15-x86_64.iso" rel="noopener noreferrer"&gt;Cinnamon&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/parchlinux/parch-iso-cutefish/releases/download/2023-04-15.alpha.2/Parchlinux.Cutefish-2023.04.15-x86_64.iso" rel="noopener noreferrer"&gt;CuteFish&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/parchlinux/parch-iso-plasma/releases/download/2023-04-15.beta.4/Parchlinux.Plasma-2023.04.15-x86_64.iso" rel="noopener noreferrer"&gt;Plasma&lt;/a&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>parchlinux</category>
      <category>bssfoundation</category>
      <category>archlinux</category>
    </item>
  </channel>
</rss>
