<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Linux on davepedu.com</title><link>https://davepedu.com/tags/linux/</link><description>Recent content in Linux on davepedu.com</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><managingEditor>dave@davepedu.com (dave)</managingEditor><webMaster>dave@davepedu.com (dave)</webMaster><lastBuildDate>Thu, 05 Mar 2020 00:00:00 +0000</lastBuildDate><atom:link href="https://davepedu.com/tags/linux/index.xml" rel="self" type="application/rss+xml"/><item><title>highly available redis with redis-sentinel-proxy</title><link>https://davepedu.com/projects/2020/03/05/redis-sentinel-proxy/</link><pubDate>Thu, 05 Mar 2020 00:00:00 +0000</pubDate><author>dave@davepedu.com (dave)</author><guid>https://davepedu.com/projects/2020/03/05/redis-sentinel-proxy/</guid><description>&lt;p&gt;Redis is a widely used and extremely fast cache server. Redis supports high availability out-of-the-box, but requires a
cluster-aware client library to accomplish it. In this project, I explore making cluster-unaware clients compatible with
highly available Redis.&lt;/p&gt;
&lt;h1 id="high-availability"&gt;High availability&lt;/h1&gt;
&lt;p&gt;What is high availability? First, let&amp;rsquo;s cover a few basic concepts.&lt;/p&gt;
&lt;p&gt;Computer hardware and software are not perfect. Software can crash due to bugs or other problems. Hardware can fail due
to physical problems that prevent it from operating, like a short circuit.&lt;/p&gt;</description><content>&lt;p&gt;Redis is a widely used and extremely fast cache server. Redis supports high availability out-of-the-box, but requires a
cluster-aware client library to accomplish it. In this project, I explore making cluster-unaware clients compatible with
highly available Redis.&lt;/p&gt;
&lt;h1 id="high-availability"&gt;High availability&lt;/h1&gt;
&lt;p&gt;What is high availability? First, let&amp;rsquo;s cover a few basic concepts.&lt;/p&gt;
&lt;p&gt;Computer hardware and software are not perfect. Software can crash due to bugs or other problems. Hardware can fail due
to physical problems that prevent it from operating, like a short circuit.&lt;/p&gt;
&lt;p&gt;But in today&amp;rsquo;s world, software services that break sometimes just aren&amp;rsquo;t good enough. We could talk about the flight
computers on an aircraft - these absolutely cannot fail, or the consequences for those on board could be deadly. Your
car has a computer-controlled airbag that will save your life in the event of a crash.&lt;/p&gt;
&lt;p&gt;Less serious scenarios exist too. Retail giants like Amazon.com are almost always online.&lt;/p&gt;
&lt;p&gt;First, let&amp;rsquo;s define availability. Availability describes how reachable and usable a piece of software or service is, in
that all incoming requests receive a response. If you&amp;rsquo;re able to open Amazon.com in your web browser and buy something,
then Amazon.com is said to be &amp;ldquo;available&amp;rdquo;: it is online and able to fulfill the purpose for which it was created.&lt;/p&gt;
&lt;p&gt;High availability, as the name suggests, describes a higher level of availability. That is, a system that is designed to
continue operating despite certain supporting component failures. Generally speaking, this means running the software -
and supporting components - across many separate computer servers and often in different geographical locations.&lt;/p&gt;
&lt;p&gt;High availability represents a challenge in the software industry. Creating a program that runs across many computers
has challenges and caveats that are completely different from those of programs that run in one place.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://en.wikipedia.org/wiki/CAP_theorem"&gt;CAP theorem&lt;/a&gt; is a brief description of the type of challenge faced. It
was written to describe distributed data stores, but the idea applies to highly available systems in general:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The CAP theorem &amp;hellip; states that any distributed data store can provide at most two of the following three guarantees:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Consistency&lt;/strong&gt; - every read receives the most recent write or an error. Consistency means that all clients see the
same data at the same time, no matter which node they connect to.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Availability&lt;/strong&gt; - every request received by a non-failing node in the system must result in a response, without the
guarantee that it contains the most recent version of the data.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Partition tolerance&lt;/strong&gt; - the system continues to operate despite an arbitrary number of messages being dropped
(or delayed) by the network between nodes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;- &lt;a href="https://en.wikipedia.org/wiki/CAP_theorem"&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In practice, network partitions are unavoidable, and systems must choose between consistency and availability.&lt;/p&gt;
&lt;p&gt;But why does this matter? I&amp;rsquo;ll illustrate using an example:&lt;/p&gt;
&lt;p&gt;Credit cards are a staple of modern society. In America, almost a third of all transactions are made using a credit
card, according to the Federal Reserve. Thus, any disruption to the ability of consumers to use a credit card creates
massive disruptions in everyday life, perhaps even to the point of being life-threatening. When issues like this happen,
it makes headline news.&lt;/p&gt;
&lt;p&gt;That makes it clear why &lt;strong&gt;availability&lt;/strong&gt; is important: people have things to do, and they need your systems to do it.&lt;/p&gt;
&lt;p&gt;But what about consistency?&lt;/p&gt;
&lt;p&gt;Credit cards have a limit. When you make a transaction, the amount transacted counts towards your limit and the credit
card provider may refuse the transaction if it would put you over the limit. This exists to protect you from
accidentally spending too much money, and protects the credit card companies from lending you more money than they want
to.&lt;/p&gt;
&lt;p&gt;But what if you make two credit card transactions at the exact same time? Your credit card provider needs to be able to
handle this situation. One transaction needs to be processed before the next, and the subsequent transaction needs to be
processed using up-to-date data. For example, if your credit limit is $100 and you make two $75 transactions at once,
one of them must not go through as it would leave you over your limit.&lt;/p&gt;
&lt;p&gt;That all sounds rather obvious. But what about partition tolerance?&lt;/p&gt;
&lt;p&gt;As mentioned above, highly available software is often run in different geographic locations. This is to protect
against environmental threats to availability, such as natural disasters knocking down power lines or communications
equipment. This stuff happens, and even if some servers are knocked offline, others exist elsewhere to handle
the workload.&lt;/p&gt;
&lt;p&gt;But, machines being located in separate locations create a risk for partitions: that is, when the two sets of machines
cannot communicate with each other, but can still reach the outside world. To use the credit card transaction example
again - for this example to work correctly, the entire fleet of transaction-handling servers needs a consistent view on
how much money is in your account. This is impossible if they cannot communicate.&lt;/p&gt;
&lt;h1 id="redis"&gt;Redis&lt;/h1&gt;
&lt;p&gt;While high availability can be used to describe entire services, it can also describe subcomponents of a system.&lt;/p&gt;
&lt;p&gt;Redis was described as a cache server above, but technically, it is a database server. And, as software systems are
often backed by a database, it is often very important within a system. A system that needs Redis to function can only
be as reliable as the Redis instances it communicates with.&lt;/p&gt;
&lt;p&gt;As such, Redis has built-in support for high availability. The exact details can be read in
&lt;a href="https://redis.io/docs/latest/operate/oss_and_stack/management/sentinel/"&gt;Redis&amp;rsquo;s documentation&lt;/a&gt;, but the gist is as
follows: a program called Sentinel monitors multiple distinct Redis instances, and orchestrates the instances so that if
one fails, another instantly takes over.&lt;/p&gt;
&lt;p&gt;This works great in practice, but using such a cluster requires some additional work. Specifically, Redis provides
mechanisms and client libraries that are cluster-aware that integrates with Sentinel, so that from your application&amp;rsquo;s
perspective, any turmoil in the Redis cluster is hidden away.&lt;/p&gt;
&lt;p&gt;But not all software requiring Redis is written using this special library.&lt;/p&gt;
&lt;p&gt;And that&amp;rsquo;s where redis-sentinel-proxy comes in.&lt;/p&gt;
&lt;h1 id="redis-sentinel-proxy"&gt;Redis-sentinel-proxy&lt;/h1&gt;
&lt;p&gt;Redis-sentinel-proxy is a reverse proxy that exposes a standard - that is, non-cluster/Sentinel-aware - Redis
connection, that standard Redis clients can use. My project is a fork of
&lt;a href="https://github.com/enriclluelles/redis-sentinel-proxy"&gt;@enriclluelles&amp;rsquo;s original&lt;/a&gt;, and makes some
reliability and usability improvements.&lt;/p&gt;
&lt;p&gt;It works as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Continuously query Sentinel for the Redis cluster&amp;rsquo;s status.&lt;/li&gt;
&lt;li&gt;When a Redis client connects, connect the client to the active Redis instance.&lt;/li&gt;
&lt;li&gt;When the Redis instance fails, close connections to clients and allow them to connect anew.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&amp;rsquo;s it! Now, cluster-unaware Redis clients can take advantage of highly available Redis.&lt;/p&gt;
&lt;p&gt;This was a fun project. If you find some use in it, &lt;a href="https://davepedu.com/contact/"&gt;let me know&lt;/a&gt;!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Source code: &lt;a href="https://git.davepedu.com/dave/redisproxy"&gt;https://git.davepedu.com/dave/redisproxy&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</content></item><item><title>ubuntu kickstart / preseed builder</title><link>https://davepedu.com/projects/2019/04/07/ubuntu-kickstart-builder/</link><pubDate>Sun, 07 Apr 2019 00:00:00 +0000</pubDate><author>dave@davepedu.com (dave)</author><guid>https://davepedu.com/projects/2019/04/07/ubuntu-kickstart-builder/</guid><description>&lt;p&gt;Kickstart and Preseed are tools for automatically installing Linux distributions such as Ubuntu. Installing new copies
of Linux can be time-consuming, especially if you must do so from a ISO image. These tools automate the install process.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://help.ubuntu.com/community/KickstartCompatibility"&gt;From the Ubuntu documentation:&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Many system administrators would prefer to use an automated installation method to install Ubuntu on their machines.
The preseeding feature of debian-installer answers this need.&lt;/p&gt;
&lt;p&gt;Using Kickstart, a system administrator can create a single file containing the answers to all the questions that
would normally be asked during a typical Ubuntu installation.&lt;/p&gt;</description><content>&lt;p&gt;Kickstart and Preseed are tools for automatically installing Linux distributions such as Ubuntu. Installing new copies
of Linux can be time-consuming, especially if you must do so from a ISO image. These tools automate the install process.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://help.ubuntu.com/community/KickstartCompatibility"&gt;From the Ubuntu documentation:&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Many system administrators would prefer to use an automated installation method to install Ubuntu on their machines.
The preseeding feature of debian-installer answers this need.&lt;/p&gt;
&lt;p&gt;Using Kickstart, a system administrator can create a single file containing the answers to all the questions that
would normally be asked during a typical Ubuntu installation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;After creating a few ISO images with embedded Kickstart/Preseed configurations, I decided I needed faster iteration, and
so I created a tool for generating Ubuntu Linux .iso files with embedded automated installers: &lt;strong&gt;Ubuntu Kickstart
Builder.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://davepedu.com/projects/2019/04/07/ubuntu-kickstart-builder/img/kickstart-full_hu_db886f949d2e1b95.png" alt="Kickstart Builder main UI screenshot"/&gt;&lt;/p&gt;
&lt;p&gt;The tool works in a fairly straightforward way:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Unpack Ubuntu ISO images in the tool&amp;rsquo;s data directory.&lt;/li&gt;
&lt;li&gt;Open the web UI and edit the Kickstart and Preseed configuration files.&lt;/li&gt;
&lt;li&gt;Optionally, upload additional files to be included in the ISO image.&lt;/li&gt;
&lt;li&gt;Click Build, and your customized CD image will be downloaded.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The ISO image can then be written to physical media or booted in a VM.&lt;/p&gt;
&lt;p&gt;While Kickstart and Preseed configurations can also be served over the network, embedding them directly in an
installation image has some advantages. A self-contained ISO is easy to distribute, works in environments without
network infrastructure, and guarantees that the installer always uses the intended configuration. This can be especially
convenient for testing in virtual machines, provisioning isolated lab machines, or sharing reproducible install media.&lt;/p&gt;</content></item><item><title>single system image linux clustering</title><link>https://davepedu.com/blog/2017/08/10/single-system-image-linux-clustering/</link><pubDate>Thu, 10 Aug 2017 00:00:00 +0000</pubDate><author>dave@davepedu.com (dave)</author><guid>https://davepedu.com/blog/2017/08/10/single-system-image-linux-clustering/</guid><description>&lt;p&gt;Recently, I came across the concept of SSI - &amp;ldquo;Single System Image&amp;rdquo; - Linux clustering. In short, Single System Image is
an approach to clustering where many generic Linux computers, running a modified kernel, present themselves as one
larger computer with access to the combined sum of all the underlying systems&amp;rsquo; RAM, CPU cores, and other resources.&lt;/p&gt;
&lt;p&gt;It was a useful technique because it decoupled your workloads from your hardware, which is the same goal as today&amp;rsquo;s
cloud computing platforms. Your hardware can be generic, you just need enough total silicon for whatever your workload
is, and this technology makes it all work together.&lt;/p&gt;</description><content>&lt;p&gt;Recently, I came across the concept of SSI - &amp;ldquo;Single System Image&amp;rdquo; - Linux clustering. In short, Single System Image is
an approach to clustering where many generic Linux computers, running a modified kernel, present themselves as one
larger computer with access to the combined sum of all the underlying systems&amp;rsquo; RAM, CPU cores, and other resources.&lt;/p&gt;
&lt;p&gt;It was a useful technique because it decoupled your workloads from your hardware, which is the same goal as today&amp;rsquo;s
cloud computing platforms. Your hardware can be generic, you just need enough total silicon for whatever your workload
is, and this technology makes it all work together.&lt;/p&gt;
&lt;p&gt;This approach, along with some other nifty Linux boot tricks, allows for some interesting ways to scale. These ideas are
mostly superseded today by modern cloud computing or solutions like Kubernetes, but I think they are interesting enough
to be worth discussing.&lt;/p&gt;
&lt;p&gt;What I will attempt to describe in this article is a relatively unknown but easy to scale Linux clustering solution,
some interesting ways to run it, and use cases for the technology. Understanding past job scheduling technologies like
these make it easier to understand why modern cloud computing is designed how it is.&lt;/p&gt;
&lt;h1 id="kerrighed"&gt;Kerrighed&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://web.archive.org/web/20170610085431/http://kerrighed.org/wiki/index.php/Main_Page"&gt;Kerrighed&lt;/a&gt; is one notable
open-source example of an SSI implementation. In order to discuss Kerrighed, we need to discuss SMP - Symmetric
Multiprocessing - first.&lt;/p&gt;
&lt;p&gt;In the context of Linux, SMP - Symmetric Multiprocessing - is the technology through which Linux gains its ability to
run on systems with multiple CPU cores or discrete processors, treating them as equals to share workload, memory, and
I/O devices. In other words: when writing a program to run on Linux, you generally need not worry about how many or what
kind of CPU cores the system running your program will have and how you will distribute your program&amp;rsquo;s workload across
them. This is because Linux is in charge of scheduling processes or threads - that is, assigning them - to CPUs, and
moving them to another CPU later if need be. Additionally, the word &amp;ldquo;symmetric&amp;rdquo; in SMP comes from the fact that no one
CPU is the &amp;ldquo;leader&amp;rdquo;; rather they all work together in a cooperative way. This is SMP.&lt;/p&gt;
&lt;p&gt;While Linux&amp;rsquo;s included SMP implementation runs on just a single system, Kerrighed ships as modifications to the Linux
kernel that, when applied, implements SMP across many systems instead of one. Kerrighed is integrated in such a way that
Linux tools previously meant to inspect just your local system - such as &lt;code&gt;ps&lt;/code&gt; to list processes - now operate across the
entire cluster. That is, &lt;code&gt;ps&lt;/code&gt; would show you all processes running across all nodes in the Kerrighed cluster.&lt;/p&gt;
&lt;p&gt;It goes deeper than that, too. A feature of SMP is that it will move processes to different cores depending on where
resources are available. Kerrighed does this too, but the moves can be to a completely different physical system.&lt;/p&gt;
&lt;p&gt;Because Kerrighed is implemented at the kernel level, this is completely transparent to the process being scheduled or
moved. This is how Kerrighed achieves binary compatibility with existing Linux programs. This is Kerrighed&amp;rsquo;s killer
feature - existing programs need no modification to take advantage of a Kerrighed cluster.&lt;/p&gt;
&lt;h1 id="diskless-boot"&gt;Diskless boot&lt;/h1&gt;
&lt;p&gt;Having a cluster of computers is great, but the challenge becomes managing the cluster. This section will discuss a
different kind of &amp;ldquo;single image&amp;rdquo; - booting a fleet of diskless systems from a single operating system image, with the
disk image being accessed as-needed over the network.&lt;/p&gt;
&lt;p&gt;While diskless booting is not inherently related to SSI clustering, it complements the model nicely by making it easy to
provision large numbers of identical nodes.&lt;/p&gt;
&lt;p&gt;I first heard about this technique in the following tutorial articles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://web.archive.org/web/20180326020313/http://shitwefoundout.com/wiki/Diskless_ubuntu"&gt;https://web.archive.org/web/20180326020313/http://shitwefoundout.com/wiki/Diskless_ubuntu&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://adminotes.blogspot.com/2012/05/how-to-setup-diskless-ubuntu-1204-with.html"&gt;https://adminotes.blogspot.com/2012/05/how-to-setup-diskless-ubuntu-1204-with.html&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A quick explanation of what these articles describe: all of the operating system&amp;rsquo;s root filesystem is shared via an NFS
server. The network that these machines run on is configured with TFTP, a technology for booting over the network. When
a host boots, it contacts the TFTP server and downloads initial configuration and a Linux kernel. These configs instruct
the host to mount the NFS share, and to boot the operating system from the NFS share.&lt;/p&gt;
&lt;p&gt;What is notable about the above approaches is how they handle writes to the filesystem. We can&amp;rsquo;t write to the NFS share
under this setup because it is shared across however many servers are in the cluster. Instead, a special filesystem
called &lt;a href="https://en.wikipedia.org/wiki/Aufs"&gt;AUFS&lt;/a&gt; comes into play. AUFS is a &amp;ldquo;layered&amp;rdquo; filesystem, in that it allows you
to combine multiple &amp;ldquo;layers&amp;rdquo; into one coherent filesystem.&lt;/p&gt;
&lt;p&gt;It is worth noting that AUFS inspired the more modern &lt;a href="https://docs.kernel.org/filesystems/overlayfs.html"&gt;OverlayFS&lt;/a&gt;,
which is probably a better choice today.&lt;/p&gt;
&lt;p&gt;In this case, the bottom-most, immutable layer is our NFS share. On top of that, is an in-memory tmpfs filesystem. AUFS
is instructed that writes should go to the tmpfs, and reads come from the NFS share. Of course, we want to be able to
read back things that we wrote, and that is exactly how AUFS works: since the tmpfs is the &amp;ldquo;top&amp;rdquo; layer, a file present
on it will be read instead of a file with an identical path on the &amp;ldquo;bottom&amp;rdquo; layer. This allows our network-booted
operating system to write whatever it needs without modifying the NFS share and affecting other hosts.&lt;/p&gt;
&lt;p&gt;Of course, memory is a sparse and valuable system resource, and consuming it for filesystem storage is a bit of a waste.
AUFS does not &lt;em&gt;need&lt;/em&gt; to use tmpfs; formatting an actual disk to a typical format like ext4 or xfs and using it as the
&amp;ldquo;top&amp;rdquo; layer is an option too.&lt;/p&gt;
&lt;h1 id="combining-it-all"&gt;Combining it all&lt;/h1&gt;
&lt;p&gt;Now that we understand our components, it should be clear how we will create our SSI cluster:&lt;/p&gt;
&lt;p&gt;Servers can be added to the cluster simply by plugging them into the network, enabling TFTP netboot, and turning them
on. Each system will boot into our pre-configured system image and join the Kerrighed cluster. Kerrighed, by doing its
task of emulating SMP, will balance processes onto newly joined servers and make their resources available to the
workload running on the cluster.&lt;/p&gt;
&lt;p&gt;The cluster is simple to manage: add machines simply by plugging them in and turning them on. Remove machines by
shutting them down and doing the opposite. Update machines by configuring TFTP to point to a different NFS share with an
updated system image and reboot each host.&lt;/p&gt;
&lt;p&gt;Additional components may be needed for the cluster to be useful - such as mounting a read/write NFS share for workload
data - but this covers the basics.&lt;/p&gt;
&lt;h1 id="use-cases"&gt;Use cases&lt;/h1&gt;
&lt;p&gt;Single System Image clustering is most useful for workloads that benefit from large amounts of parallel compute or
memory but are not designed to run across multiple machines. Because SSI systems aggregate memory across nodes, the
cluster can appear to applications as a system with a much larger pool of RAM. This can be useful for simulations, data
processing tasks, or other applications that need large datasets in memory. This overlaps with High Performance
Computing (HPC), which are generally scientific and engineering workloads. These are a natural fit for SSI systems as
many of these programs are already written to take advantage of multiple CPU cores, but not necessarily multiple
machines. An SSI cluster can allow these programs to scale beyond the limits of a single system by providing access to
additional CPU cores across the cluster without requiring the software to be rewritten.&lt;/p&gt;
&lt;p&gt;SSI clusters can also provide a degree of resilience. If a node becomes overloaded or unavailable, processes may be
migrated to other machines in the cluster, allowing workloads to continue running. While this does not replace dedicated
high-availability systems, it can help improve utilization and reduce the impact of individual node failures.&lt;/p&gt;
&lt;h1 id="modern-comparable-software"&gt;Modern comparable software&lt;/h1&gt;
&lt;p&gt;It was mentioned earlier on that Single System Image clustering is comparable to modern cloud computing. However, I
refer only to Kerrighed in this comparison; the diskless boot design described above is orthogonal to SSI clustering.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://popcornlinux.org/"&gt;Popcorn Linux&lt;/a&gt; seems to be the only open source, single-image clustering Linux distribution
that is reasonably up to date. However, Popcorn is not binary-compatible with existing Linux programs like Kerrighed is.
Instead, Popcorn uses a special LLVM-based compiler to compile programs in a specific way so that they may run on a
Popcorn cluster. However, Popcorn also offers support for mixing different Instruction Set Architectures within a
cluster and even supports migrating running processes to hosts with different instruction sets! Popcorn&amp;rsquo;s special
compiler is what makes this possible.&lt;/p&gt;
&lt;p&gt;Kubernetes is another modern comparable. Unlike Single System Image clustering, Kubernetes requires software to be
packaged in a specific way - Open Container Initiative Images aka Docker Images - and &amp;ldquo;migrates&amp;rdquo; workloads by
terminating them, moving required resources such as storage disks, and starting them anew on a new host. While
Kubernetes has nothing to do with Single System Image clustering, it is similar in that its primary role is to schedule
work on clustered hosts.&lt;/p&gt;
&lt;p&gt;And that is what all of these tools do - Kerrighed, Popcorn Linux, Kubernetes - you give it your hardware and your
desired workloads, and it figures out where to run it, and how to keep it online to the best of its ability. Single
system image computing has its roots all the way back in the 1980s, whereas Kubernetes is relatively new, but both serve
the same purpose, then and now.&lt;/p&gt;
&lt;p&gt;If this interest you, other systems that explored similar ideas from over the years, include
&lt;a href="https://en.wikipedia.org/wiki/MOSIX"&gt;MOSIX&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Sprite_%28operating_system%29"&gt;Sprite&lt;/a&gt;,
both of which experimented with process migration and distributed operating system design.&lt;/p&gt;</content></item><item><title>pfSense and ESXi setup on OVH's network</title><link>https://davepedu.com/blog/2017/06/13/pfsense-and-esxi-on-ovh-network/</link><pubDate>Mon, 12 Jun 2017 00:00:00 +0000</pubDate><author>dave@davepedu.com (dave)</author><guid>https://davepedu.com/blog/2017/06/13/pfsense-and-esxi-on-ovh-network/</guid><description>&lt;p&gt;I host my projects on a dedicated server rented from &lt;a href="http://ovh.com/"&gt;OVH&lt;/a&gt;, I&amp;rsquo;m a huge VMware fan, so I&amp;rsquo;ve used their
free product, the &lt;a href="http://www.vmware.com/products/vsphere-hypervisor"&gt;ESXi Hypervisor&lt;/a&gt;, to cram lots of virtual machines
inside my one server. Since not all my virtual machines need internet-facing IPs and ESXi has only basic NAT capability,
an easy solution here is running a &lt;a href="https://www.pfsense.org/"&gt;pfSense&lt;/a&gt; install as a NAT router, as a virtual machine.
OVH&amp;rsquo;s network has some unique setup required for this specific situation. Unfortunately, this is best documented in
various blog posts across the internet.&lt;/p&gt;</description><content>&lt;p&gt;I host my projects on a dedicated server rented from &lt;a href="http://ovh.com/"&gt;OVH&lt;/a&gt;, I&amp;rsquo;m a huge VMware fan, so I&amp;rsquo;ve used their
free product, the &lt;a href="http://www.vmware.com/products/vsphere-hypervisor"&gt;ESXi Hypervisor&lt;/a&gt;, to cram lots of virtual machines
inside my one server. Since not all my virtual machines need internet-facing IPs and ESXi has only basic NAT capability,
an easy solution here is running a &lt;a href="https://www.pfsense.org/"&gt;pfSense&lt;/a&gt; install as a NAT router, as a virtual machine.
OVH&amp;rsquo;s network has some unique setup required for this specific situation. Unfortunately, this is best documented in
various blog posts across the internet.&lt;/p&gt;
&lt;h1 id="installation"&gt;Installation&lt;/h1&gt;
&lt;p&gt;You can grab the latest pfSense from here: &lt;a href="https://www.pfsense.org/download/index.html"&gt;https://www.pfsense.org/download/index.html&lt;/a&gt;. At the time of writing, the
latest and pfSense version I&amp;rsquo;m using is 2.3.4, though any version later than 2.1 should work nicely. Thorough IPv6
support was introduced in 2.1, but if you don&amp;rsquo;t need that I suppose an earlier version would be fine as well. So grab an
ISO and upload it to your ESXi machine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Virtual machine creation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I used the 64-bit version of pfSense, so the &amp;ldquo;type&amp;rdquo; of virtual machine I used was &lt;strong&gt;Linux - Other Linux
(64-bit)&lt;/strong&gt;. pfSense is based on BSD, so any similiar configuration should be fine. 512mb of ram allocated will be more
than enough, but 256mb is doable. 4GB disk space allocated is fine as well. Next, other than adding a second network
adapter, the default options that ESXi presents will work fine. One specialty for OVH - in your control panel, you must
generate a MAC address for the address this host will be using - assign it to the public-facing network adapter. Also,
create a virtual switch and attach it to the &amp;ldquo;private&amp;rdquo; network adapter. This switch is where your private network and
virtual machines will live.&lt;/p&gt;
&lt;p&gt;Installing pfSense to the virtual machine is pretty straightforward, but [check out this guide]
(&lt;a href="https://doc.pfsense.org/index.php/Installing_pfSense"&gt;https://doc.pfsense.org/index.php/Installing_pfSense&lt;/a&gt;) if you need help.&lt;/p&gt;
&lt;h1 id="ovh-customization"&gt;OVH customization&lt;/h1&gt;
&lt;p&gt;After you finish pfSense&amp;rsquo;s command-line setup wizard, you won&amp;rsquo;t have internet connectivity. You need to add some routes
specific to your server&amp;rsquo;s in the OVH network. If your server&amp;rsquo;s primary IP is A.B.C.D and the IP 1.2.3.4 will be
assigned to this new host, run these commands in the shell:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;route add -net A.B.C.254 1.2.3.4&lt;/p&gt;
&lt;p&gt;route add default A.B.C.254&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;These commands will add routes needed to access your host&amp;rsquo;s gateway. You&amp;rsquo;ll have connectivity now, but need to make this
fix permanent. Log into the UI, and in pfSense&amp;rsquo;s package repo the package Shellcmd is a convenient way to do this.
Install it and add the two commands above as startup commands.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://davepedu.com/blog/2017/06/13/pfsense-and-esxi-on-ovh-network/img/pfsense_hu_ca9405783f3fe3ef.png" alt="Pfsense running in the VMware console" title="Pfsense running in the
VMware console" /&gt;&lt;/p&gt;
&lt;h1 id="wrap-up"&gt;Wrap up&lt;/h1&gt;
&lt;p&gt;If you&amp;rsquo;ve enabled the DHCP server on your pfSense install you can now create privately-networked virtual machines with
internet access via NAT, but with no exposure to the internet. Ports can be forwarded to public services and everything
else is hidden behind a layer of NAT.&lt;/p&gt;
&lt;p&gt;Next time: setting up IPv6 with &lt;a href="https://tunnelbroker.net/"&gt;TunnelBroker.net&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Editor&amp;rsquo;s Note: originally composed in &lt;strong&gt;2014&lt;/strong&gt;, but rotted in the drafts bin&amp;hellip;&lt;/p&gt;</content></item><item><title>1Password on Linux</title><link>https://davepedu.com/blog/2017/02/28/1password-on-linux/</link><pubDate>Tue, 28 Feb 2017 00:00:00 +0000</pubDate><author>dave@davepedu.com (dave)</author><guid>https://davepedu.com/blog/2017/02/28/1password-on-linux/</guid><description>&lt;p&gt;I&amp;rsquo;ve been a long time user of &lt;a href="https://1password.com/"&gt;1Password&lt;/a&gt;, a password vault by AgileBits. However, it only
supports OS X and Windows; which is a problem for Linux desktop converts like myself. Their desktop application - a very
nice app and also required for the browser extension - is only for Windows and OS X. AgileBits also offers 1Password
Families which does support Linux, but you lose control over where your password data is stored.&lt;/p&gt;</description><content>&lt;p&gt;I&amp;rsquo;ve been a long time user of &lt;a href="https://1password.com/"&gt;1Password&lt;/a&gt;, a password vault by AgileBits. However, it only
supports OS X and Windows; which is a problem for Linux desktop converts like myself. Their desktop application - a very
nice app and also required for the browser extension - is only for Windows and OS X. AgileBits also offers 1Password
Families which does support Linux, but you lose control over where your password data is stored.&lt;/p&gt;
&lt;p&gt;In the past, 1Password had a browser-based user interface that could be served out of Dropbox or by opening the local
file from your browser (called 1PasswordAnywhere, a single HTML file). However, browser security has &amp;ldquo;improved&amp;rdquo; and now
block XHR requests to local filesystems and Dropbox discontinued the feature that allowed you to serve up this HTML file
privately. So
&lt;a href="https://discussions.agilebits.com/discussion/63045/moving-beyond-1passwordanywhere"&gt;AgileBits was forced to sunset&lt;/a&gt;
this feature.&lt;/p&gt;
&lt;p&gt;Despite this announcement, 1PasswordAnywhere still seems to work! And as long as you can browse the file tree of
1Password&amp;rsquo;s data, this method should work for you.&lt;/p&gt;
&lt;p&gt;I use Dropbox to sync my 1Password data, so I&amp;rsquo;ve opened a terminal and browsed to where the &lt;code&gt;1Password.agilekeychain&lt;/code&gt;
directory is kept. For me, that&amp;rsquo;s &lt;code&gt;~/Dropbox/Apps/1Password/1Password.agilekeychain/&lt;/code&gt;. Within this directory is where
&lt;code&gt;1PasswordAnywhere.html&lt;/code&gt; should be placed. I renamed mine to &lt;code&gt;index.html&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Next, set up an web server to serve up this directory. If you&amp;rsquo;re running Mac or Linux you probably already have Python,
and you can use its built-in minimal server:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-text"&gt;$ pwd
/home/dave/Dropbox/Apps/1Password/1Password.agilekeychain
$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Next, browse to &lt;a href="http://127.0.0.1:8000/"&gt;http://127.0.0.1:8000/&lt;/a&gt; and you&amp;rsquo;ll be presented with a working - but visually outdated -
1PasswordAnywhere instance! Of course, this isn&amp;rsquo;t the most secure - anyone on your network can access the web interface
too! To be fair - your password is needed to decrypt the data - though it would be better to serve only on localhost.
But I&amp;rsquo;ll leave this as homework for the reader.&lt;/p&gt;
&lt;p&gt;Also, first post of 2017!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Update: I also stumbled across &lt;a href="https://github.com/jbreams/gonepass"&gt;gonepass&lt;/a&gt;, a native Linux desktop app intended to
replace the 1Password app. I&amp;rsquo;ve not tried it yet, so expect a follow-up article!&lt;/p&gt;
&lt;p&gt;Update 2: I downloaded and compiled gonepass on my system. It was pretty easy and works great! Definitely a safer idea
than the web-based version above.&lt;/p&gt;</content></item><item><title>upgrading my NAS, part 2: high availability</title><link>https://davepedu.com/blog/2016/07/21/upgrading-my-nas-part-2/</link><pubDate>Thu, 21 Jul 2016 00:00:00 +0000</pubDate><author>dave@davepedu.com (dave)</author><guid>https://davepedu.com/blog/2016/07/21/upgrading-my-nas-part-2/</guid><description>&lt;p&gt;In a &lt;a href="https://davepedu.com/blog/2015/11/23/building-a-distributed-redundant-data-storage-backbone-part-1-of-2/"&gt;previous post&lt;/a&gt;,
I described some of my early approaches to building a NAS for my home. In summary, I decided to use &lt;a href="https://en.wikipedia.org/wiki/Mdadm"&gt;Linux software raid&lt;/a&gt;
formatted with Linux&amp;rsquo;s built-in &lt;a href="https://en.wikipedia.org/wiki/Ext3"&gt;ext3&lt;/a&gt; format. This setup worked, but left me with
three main problems:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Volume size limitations: ext3 is capable of handling a maximum volume size of 16TB, when formatted with a 4kb block
size. It is theoretically possible to use a larger block size and thus a larger maximum volume size. However,
changing the block size requires reformatting the volume, which I could not do. Additionally, most hard drives
natively use a 4kb block size. Matching filesystem block size to hard drive block size generally achieves best
performance, for reasons such as avoiding a single write operation becoming multiple operations - read-modify-write.&lt;/p&gt;</description><content>&lt;p&gt;In a &lt;a href="https://davepedu.com/blog/2015/11/23/building-a-distributed-redundant-data-storage-backbone-part-1-of-2/"&gt;previous post&lt;/a&gt;,
I described some of my early approaches to building a NAS for my home. In summary, I decided to use &lt;a href="https://en.wikipedia.org/wiki/Mdadm"&gt;Linux software raid&lt;/a&gt;
formatted with Linux&amp;rsquo;s built-in &lt;a href="https://en.wikipedia.org/wiki/Ext3"&gt;ext3&lt;/a&gt; format. This setup worked, but left me with
three main problems:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Volume size limitations: ext3 is capable of handling a maximum volume size of 16TB, when formatted with a 4kb block
size. It is theoretically possible to use a larger block size and thus a larger maximum volume size. However,
changing the block size requires reformatting the volume, which I could not do. Additionally, most hard drives
natively use a 4kb block size. Matching filesystem block size to hard drive block size generally achieves best
performance, for reasons such as avoiding a single write operation becoming multiple operations - read-modify-write.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;High Availability: I enjoyed having a NAS so much, that I quickly began running additional servers that would mount
the NAS&amp;rsquo;s storage volume and use it for whatever large storage was needed. I can&amp;rsquo;t recall which network filesystem
I was using at the time, but it was one that required a re-mount after the server rebooted. NFS would make this less
of a problem. Anyway - reboots aside - I wanted a NAS that would remain available even after one of the computers
backing it failed, or needed to be rebooted for updates, for example.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Space limitations: physical space becomes a limiting factor for NAS side as well. Not many server chassis had
physical space for many hard drives, outside of rackable enterprise-grade systems that I couldn&amp;rsquo;t afford. Networks
allow multiple computers to communicate, so why would my filesystem be limited to one machine? I wanted a NAS that
could be &amp;ldquo;scaled up&amp;rdquo; by adding more computer servers and hard drives to it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="glusterfs"&gt;GlusterFS&lt;/h1&gt;
&lt;p&gt;Enter GlusterFS - GlusterFS is a distributed network filesystem. GlusterFS provides data safety features similar to
RAID, but offered in a manner that spans multiple computers instead of multiple hard drives.&lt;/p&gt;
&lt;p&gt;The general way in which GlusterFS functions is simple: you format your hard drives with whatever filesystem you prefer
- I used ZFS - and GlusterFS creates a virtual filesystem on top of them. GlusterFS calls each sub-volume a &amp;ldquo;brick&amp;rdquo;,
and while each brick only spans one server, the virtual GlusterFS filesystem can incorporate multiple bricks from
multiple servers.&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s great about GlusterFS&amp;rsquo;s approach to storage is that it single-handedly solves each of the 3 issues above:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Volume size limitations: GlusterFS uses its own type of filesystem with astronomically high volume size limitations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;High Availability: with a &amp;ldquo;replicated&amp;rdquo; GlusterFS volume, multiple copies of each file are stored on separate bricks.
Since separate bricks are on separate servers, the file remains accessible even if one server or hard drive fails.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Space limitations: since GlusterFS volumes can span across multiple servers, space becomes nearly limitless. You can
always plug more servers into the cluster.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="design"&gt;Design&lt;/h1&gt;
&lt;p&gt;I started with two servers, but later moved to four. Each could hold up to 8 hard drives. A common build at the time was
a mini-NAS, with a case by U-NAS, the NSC-800. For a motherboard/cpu combo, I chose AsRock Rack. I started with their
Mini-ITX form factor server motherboard, the &lt;a href="https://www.asrockrack.com/general/productdetail.asp?Model=C2750D4I"&gt;C2750D4I&lt;/a&gt;,
and later upgraded to the &lt;a href="https://www.asrockrack.com/general/productdetail.asp?Model=C3758D4I-4L"&gt;C3758D4I&lt;/a&gt;. Both
feature 8 cores, low power consumption, and small physical size.&lt;/p&gt;
&lt;p&gt;As mentioned above, I used ZFS to manage my server&amp;rsquo;s hard drives. Initially, I had 16 drives spread across two servers.
I divided these into 4 ZFS mirrors - like RAID 1 - of 2 drives each per server. Then, each ZFS mirror was replicated
with GlusterFS to a corresponding ZFS mirror on the other server. This worked well, but I later moved to two ZFS RAIDZ
pools per server, made from 4 drives each. This reduced the number of bricks which made GlusterFS simpler to manage.&lt;/p&gt;
&lt;h1 id="results"&gt;Results&lt;/h1&gt;
&lt;p&gt;Overall, this was a fairly reliable and reasonably performant NAS. Generally speaking, I was bottlenecked by drive speed
as I used &amp;ldquo;green&amp;rdquo; hard drives that put out less noise and heat and consumed less power at the expense of some
performance. Sequential access was great but one area the NAS really suffered in was random access. Listing large
directories was noticeably slow as well. Despite these issues, this NAS went on to serve me for many years!&lt;/p&gt;
&lt;p&gt;If you run a similar setup, &lt;a href="https://davepedu.com/contact/"&gt;let me know&lt;/a&gt;!&lt;/p&gt;</content></item><item><title>building a distributed / redundant data storage backbone - part 1 of x</title><link>https://davepedu.com/blog/2015/11/23/building-a-distributed-redundant-data-storage-backbone-part-1-of-2/</link><pubDate>Mon, 23 Nov 2015 00:00:00 +0000</pubDate><author>dave@davepedu.com (dave)</author><guid>https://davepedu.com/blog/2015/11/23/building-a-distributed-redundant-data-storage-backbone-part-1-of-2/</guid><description>&lt;p&gt;I&amp;rsquo;m not a fan of losing data, so I always have some sort of redundant storage at my disposal. At present I possess over
10TB of irreplaceable data, code, photographs, etc, (and much more replaceable data - though at an inconvenience) and
housing that data is no easy task. Be it for backups, media storage, or even temp space, having a huge pool of &amp;ldquo;safe&amp;rdquo;
storage is always a useful tool.&lt;/p&gt;</description><content>&lt;p&gt;I&amp;rsquo;m not a fan of losing data, so I always have some sort of redundant storage at my disposal. At present I possess over
10TB of irreplaceable data, code, photographs, etc, (and much more replaceable data - though at an inconvenience) and
housing that data is no easy task. Be it for backups, media storage, or even temp space, having a huge pool of &amp;ldquo;safe&amp;rdquo;
storage is always a useful tool.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A bit of history first - we&amp;rsquo;ll get into the cutting edge stuff, with more technical detail, in part 2.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;My first adventure into this involved a number of SATA hard drives attached to a Mac Mini via USB 3.0. A Linux VM
assembled these drives into a RAID 5 array and served their contents over SMB (&amp;lsquo;server message block&amp;rsquo; - windows
sharing). Unfortunately this was in the early days of USB 3.0 so the pass-through adapter to the Linux virtual machine
only supported USB 2.0 speeds. So this array maxed out around 15MB/s constant write. Not great, but at least it&amp;rsquo;s safe.&lt;/p&gt;
&lt;h1 id="raid"&gt;RAID&lt;/h1&gt;
&lt;p&gt;Anyway, why RAID? &lt;a href="https://en.wikipedia.org/wiki/RAID"&gt;RAID&lt;/a&gt; is a immensely valuable idea that allows the use of many
independent hard or solid state drives for a single logical task. RAID can be used for speed gains beyond what an
individual drive can handle or failure proof storage where even the death of one or more drives causes no data loss -
and in the best case, no interruption to services using the data. There are many different kinds of traditional RAID,
with the most commonly used being:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RAID 0 - performance gains by spreading load across multiple drives&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RAID 1 - stability gains by mirroring data on two or more drives&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RAID 5 - stability gains by smart use of striping &amp;amp; parity&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These (and other) levels of RAID can also be combined for a mix of the effects a single RAID level brings. For example,
RAID 10 (1+0, striped set of mirrors) or is fairly common.&lt;/p&gt;
&lt;p&gt;Traditional RAID - or &amp;ldquo;hardware&amp;rdquo; RAID - typically involves a hardware expansion card for the dedicated purpose of
handling RAID computations and drives. The RAID card would have a builtin processor, memory, and SATA ports to which the
involved disks would be attached to. Up until recently, this sort of configuration was necessary for top performance -
software RAID has been around for awhile, but historically there was a performance gap. A risk of hardware RAID has
always been the RAID card itself. RAID cards typically have an onboard memory module a battery to keep the memory
&amp;ldquo;alive&amp;rdquo;. If any of these parts cease to function - or any other part of the card - it&amp;rsquo;s possible that all data on the
RAID array can be lost! In my opinion, this isn&amp;rsquo;t a viable option. If you have your data on a single drive or a RAID
array controlled by one RAID card, either there is a single piece of hardware that can die and cause data loss.
Not good.&lt;/p&gt;
&lt;p&gt;Software RAID addresses this issue. It may have originally been created as a cheaper (and slower) alternative to
hardware RAID, but I believe nowadays software options are just as valid and performant has hardware RAID is. Software
RAID, in a nutshell, is, technically speaking, the same as hardware RAID, but with the computation and memory required
for operation handled by a system&amp;rsquo;s main CPU and memory as opposed to a dedicated piece of hardware. Done right, these
components can die or be swapped out with no fear of data loss.&lt;/p&gt;
&lt;p&gt;In my opinion the most notable advances in software RAID tech are as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Mdadm - often referred to as &amp;lsquo;Linux software RAID&amp;rsquo; - was introduced in 2001 and quickly became the de facto software
RAID tool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ZFS - introduced in 2005 (and from my perspective, catching on in the early 2010s) was an entirely new beast.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While ZFS is impressively (and I&amp;rsquo;m using it today!), let&amp;rsquo;s examine mdadm first so we can see how ZFS differs. Mdadm
offers block-level RAID. In other words, it doesn&amp;rsquo;t care which (and you have to use) filesystem is &amp;ldquo;on top&amp;rdquo; of it. On
Linux, mdadm consumes block devices and provides a virtual block device. So if the physical drives on your system are
&lt;code&gt;/dev/sda&lt;/code&gt; and &lt;code&gt;/dev/sdb&lt;/code&gt;, mdadm can consume these and provide &lt;code&gt;/dev/md0&lt;/code&gt;. From there, md0 can be treated just like a
plain block device - create partition(s) and format them with a filesystem of choice.&lt;/p&gt;
&lt;p&gt;My first and second storage arrays used Mdadm. It was an easy choice as tools that work with native block devices work
with mdadm virtual block devices. I could partition the virtual device with common disk management tools like fdisk and
use common filesystems like ext.&lt;/p&gt;
&lt;p&gt;And I did exactly that - my first array comprised of ext4 on top of mdadm. And it worked! &amp;hellip;until I needed an array
bigger than 16TB. Because of how ext4 was programmed and integrated into Linux operating systems it is incapable of
handling filesystems greater in size than 16TB when using 4k blocks. Considering it originated in the early 90s and
focused on backwards compatibility, there wasn&amp;rsquo;t a workaround. Back to the drawing board.&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s nice about Linux is that filesystems are ubiquitous - if the system can mount a filesystem, all programs on the
system that depend on file access and use it and all features it expects a filesystem to support. A beauty of modern
system design. An up-and-coming filesystem around the time I needed to expand was btrfs. With a maximum supported
filesystem size of 16EB (exabytes!), or a million times larger than ext4&amp;rsquo;s limits, I was sure I&amp;rsquo;d never outgrow it. So I
live-converted my array to btrfs and it was full steam ahead from there!&lt;/p&gt;
&lt;p&gt;Great! So in early 2011 I had a storage backbone capable of supporting an astronomical amount of data, the flexibility
to expand over time, and safety of software RAID. What more could be desired? Well, the world of computing constantly
improves itself so I wasn&amp;rsquo;t happy sticking with a single methodology. But more on that, and ZFS especially, in part 2!&lt;/p&gt;</content></item></channel></rss>