This is a draft of the proposal I'm presenting at Flock, "An Architecture
for a More Agile Fedora" (<http://sched.co/19ugKGM>). It represents a big
change to how we as the Fedora project put together our distribution. I've
gone through several drafts of this and talked to a few people, and I'd
really value all of your feedback to refine it further.
Preliminary slides are available at <http://mattdm.org/fedora/next/>; I will
update them as this discussion progresses. (So, page numbers might change.)
What follows is an annotated text version of the presentation — the
annotations basically being what I might say as each slide displays.
If you have a short attention span, you might want flip through the slides
first and come back for explanation where it's unclear. And the explanation
here might be unclear too — please ask questions.
An Architecture for a More Agile Fedora
presented by Matthew Miller ( ← with input from many people)
===
Problem Statement (What's this all about?)
---
Let's Start with What's Good
---
* Fedora is awesome
* Great tech, great people
* Amazing, high standards
* Best enthusiast distro
* Solid base for RHEL
* Pretty decent cloud image
I've been involved to some small degree with Fedora since the beginning.
This is a project and a Linux distribution which I love, and which I know
everyone reading this also cares about deeply. We don't want to break what
is successful and works.
But...
---
* We need to be more than that
* Not widely used by RHEL users
* Not so great for building on...
* Including Red Hat's own stuff
* We're not seen as relevant...
* Let alone exciting
Whenever I go to a tech meetup or talk to someone from a new startup
company, their developers are inevitably using a different (usually
proprietary) desktop OS, plus a non-Fedora distribution on their code. We're
being left behind and left out. It doesn't matter how theoretically great we
are if we end up with no users.
The Idea
---
Focus core distro as platform, include layers of modular enabling
technologies, and provide room for special interest groups to create
solutions within the Fedora circle.
Starting with Ring One
---
* We draw a line around a small "base design"
* E.g.: Everything in @standard, plus the toolchains to build it
* Line could go elsewhere; that's an implementation detail
* Most strict change management
* Packaging standards as current Fedora
The example line is somewhat arbitrary here — I'll talk a little more about
practicalities at the end of the talk. The idea of using @standard as a
starting place is just that. That's the group that's one step up from a
minimal install; common things usually installed. That collection of
packages is arbitrary and has grown arbitrarily, but it makes a place to
begin. We'll probably end up with a set of packages that isn't exactly tied
to any existing group.
Anyway, this is the core OS. It's bigger than a minimal install, and is a
complete but lightweight Linux distribution. It has a very clear charter:
use the latest in open source platform-level software integrated into a
solid foundation for the higher rings.
The Base OS
---
* Ring One is base functionality and behavior that everyone can expect of any Fedora system
* Making a distinction helps focus engineering resources
* And it makes a foundation that higher levels know they can trust
Ring 1 : A Picture
---
*********
** **
** **
* Ring 1 *
* *
* Fedora Core *
** **
** **
*********
Wait, did you just say Fedora _Core_?
Yes I did.
But, this is not a return to the old Core + Extras, because the line is
drawn based on _what_ and _how_ rather than on who works for what company.
There were two big problems with the long-ago approach.
First, the "core" was developed internally and not as a community open
source project. If a package was in that part of the distribution, there was
no real route for participation. Bad.
Second, the quality standards for Fedora Extras, the collection of packages
built around the core, were much, much higher. Upside-down!
So, we won't repeat those mistakes. The new "Fedora Core" is a community
project just like Fedora today. And we focus the most strict standards on
the inner rings.
Ring Zero: Fedora Minimal
---
* Start from the current @core, and aim to shrink
* Intentional focus on minimalism
* JEOS — Just Enough Operating System
* Even stronger rules than Ring 1
* Not self-hosting
This is pretty self-explanatory. There is a lot of demand and many use cases
for a "Just Enough Fedora" operating system. Ring 0 exists to provide that
in a serious way which Fedora has never really covered before.
Rings 1 + 0: Together
---
(There is a diagram here, but I'm leaving it out of the text. It's
a circle. With another circle.)
Part Two... First, _Why?_
---
* Back to the problem statement: we need to be useful
* People building on Fedora need a reliable base...
* ... but need more flexibility in the areas relevant to their code
* So let's design something that gives that
***DON'T PANIC***
This is a vision for the future. The Fedora Core idea can get started now,
and the ideas beyond that are for development over a longer term. That
doesn't mean never, and there are some specific things at the higher level
to get started on now, but I'm not suggesting to change everything all
crazily. We're not throwing out what have. The idea is to explore several
different approaches which will better position Fedora as the distro of
choice for future development.
So... Rings 2 + 1 + 0
---
(There is another diagram here. It's more circles inside of circles.)
Ring Two: Environments and Stacks
---
* Environments are where you run the code you care about
* Stacks are modular collections of _software which is used by other
software_
In one of the earlier drafts, I had these as individual, separate rings.
That turns out to be kind of distracting, because depending on your point
of view either could easily be seen as inside or outside the other. So, I
put them together in this level.
Environments
---
* Desktop environments, ideally with app containers
* Platform as a Service, decoupled: integrated OpenShift Gears
* Core Image (oVirt node, cloud guest)
Stacks
---
* Languages, databases, libraries
* Maybe X/Wayland
* The kind of things which could be OpenShift Cartridges or Software
Collections
(For Example)
---
And there's another diagram here. In the Ring 2 circle, we have examples
like Perl; Ruby 1.8.x, 1.9.x, 2.0; Python 2 & 3; Java, Wildfly; some
databases, desktop environments, OpenShift, and then something called Fedora
Commons, which I'll talk about in a bit.
What's a Ring?
---
* Rings give SIGs a way to replace the default expectations with their own
* Separate policies may apply to each ring
* But also, also, we need community, policies, and infrastructure to make
them _part of Fedora_
So, there's nothing really magical about the circles. The main idea is that
we need to make room for more exploration within Fedora beyond the
traditional idea of how a Linux distribution is put together, and this is a
model for describing how and where that can work.
We still need global Fedora policies, but they'll apply differently to each
ring. In Ring 2, SIGs will be given a lot of room to develop their own
rules, but in Ring 1, not so much. Different environments and stacks within
Ring 2 may have different individual policies from each other, but there
will also be general policies for Ring 2 which are different from those for
Ring 1, and of course global policies that apply to the whole thing (e.g.,
no proprietary code).
Possible Examples
---
* Possible example: bundled libs okay, but must be documented
* Can override versions of software at lower tier
* Can overlap with software from other stacks
* Not necessarily even RPM
* Different lifecycle (but shared release cadence)
Big stuff here.
Obviously, no-bundled-libs is a crucial part of the packaging guidelines
today. As a sysadmin, I know why it's important. This is not just a noble
goal, but also something that pragmatically makes systems better. But, it's
also keeping us from having software that people really use in Fedora. Chef
and Hadoop are two big examples. This hurts us more than it helps the world.
So, in some areas, we need a different approach.
Overriding other parts of the distribution is crucial, and I'll talk a
little bit more about different approaches and what they mean in a little
bit.
Some approaches may even move beyond RPM packaging. This can mean focusing
on "language native" package formats like Jars, Gems, and Eggs; or it can
mean moving to a Git-based distribution model for some parts of the distro.
And, different lifecycle: a SIG may decide that Ruby 1.9.x support should
continue for some number of years and maintain that stack against different
Fedora Core releases. We do this already in some ways, but having a clear
split makes it feel more natural and will make developers feel more
confident.
SIG-centric
---
* SIGs will form "bubbles" within this ring, possibly varying from packaging
guidelines in order to meet needs.
* Change management will also be SIG-focused.
Fedora already largely works this way. We just need more of it. If we can be
more flexible about what it means to participate in Fedora, we can increase
the intersection with upstream communities.
Fedora Commons
---
* The collection of packages outside Core following traditional policies
and practices
* We're not throwing that away
* Many people continue to be interested in this model
* Shared by other parts of Ring 2 where possible
This is a special bubble within Ring 2. In fact, on Day 0, it still is _all
of_ Ring 2. The name here is mean to evoke Creative Commons; we can discuss
other possibilities too, of course.
Many Ways!
---
* Software Collections
* Stacks 2.0
* OpenShift Cartridges
* Fedora Formulas
* Traditional Packaging
There are many different approaches people are working on right now. I don't
know which will ultimately be best. We want to enable the experimentation,
so we can find what succeeds. Some of these things aren't beautiful, but if
we can invite them in anyway, they can iterate towards perfection.
Exploring Different Approaches
---
* Packaged vs. DVCS
* Builds on Core vs. Overrides Core
* Replaces vs. Coexists
* Appliance vs. Shared
It may be useful as we think about the different approaches to think about
the different philosophies they take. For example, there are two different
ways to "override" something. One is to actually replace it — for example,
your Fedora Formula may replace /usr/bin/python with Python 3. The other is
to install multiple versions in parallel — using multi-versioned RPMs, or
Software Collections for whole stacks. In the future, a namespace approach
could even make /usr/bin/python be Python 3 for some processes but not for
the core OS.
Additionally, there's a natural distinction between things which build on
Fedora Core and may override Fedora Commons and those things which may
override both. As we explore these different approaches, it may be useful to
be intentional about which approach each SIG is using.
Ring Three: Applications
---
* User-level installable
* Shift focus away from RPMs
* Linux Apps... or Git with OpenShift
And, finally, the outside ring. This is end-user software. Exactly how this
will work is kind of further off, but it's important to think about in the
complete picture. We want to make this a nicer experience for Fedora users,
and we want to make it easier for application developers to offer their
stuff to Fedora.
Part Three: Concrete Steps
---
* What do we do to make this happen?
* What can be done now?
* What needs to be developed further?
To make this not just all talk....
Three Next Things
---
* Draw the "base design" for Fedora Core
* Make space for exploring Ring 2 innovation
* Emphasize upstream relationships (example: RubyGems.org)
Much of this I hope to have further developed in the next few weeks before
Flock. I'll talk a little bit about these three now, though.
First, I'm working on creating an example spin which would show a basic
suggestion for Fedora Core, both in a default install and an
everything-installed (including build deps) configuration. Right now, if we
take @standard + @core, that gives 430 packages from 330 SRPMs... but
recursively following the build deps explodes that to 3915 packages from
1800 SRPMs. That's smaller than the 13.7K SRPMs in all of Fedora, but bigger
than would be ideal for the Core. And it's probably not really the package
set we want. So, I'd like to look at that further, and I'll post more about
that here as I do.
Second, we can make some changes to allow Software Collections to be built
for Fedora. There's more we can do with OpenShift. And we can build up the
Fedora Formulas idea. Basically, let's do all that.
And third, by increasing our engagement upstream, we can reduce our own
work. For example, right now RubyGems.org doesn't do any validation of
licenses, basic review for malware, or gem signing. If we knew that this
basic diligence was happening upstream, we could extend our circle of trust.
We've long had the mantra of "upstream! upstream! upstream!" for code and
patches — we can do the same thing for packaging, for the same reasons and
for similar benefits. (But to do that, we need to work with upstream
packaging formats rather than demanding RPM — because experience shows that
that doesn't work.)
Conclusion
---
* Refocus Core to provide a better platform for building on
* Make room for innovation at the "Ring 2" level
* Empower SIGs to create solutions that fit
* Won't break what we have
* And we can start right now
So there we have it. Comments and discussion, please!