TLDR: is the amount of time used to switch to these distros worth it? (compared to Debian, Fedora, etc.), or is there a better distro that fits my use case?
I have been using Linux for about 4 years now as my daily driver, distro hopping a lot. I have used PopOS (for a few years), Manjaro, Garuda (for a year or so), KDE Neon, Debian, Linux Mint, Nobara (for some months until I ran into system breaking issues), and lastly EndeavourOS.
Issues I have run into in the past are around the different packaging systems and versioning. The Debian/Fedora based ones seem to be fairly slow to update and so they have out of date packages, which sometimes is ok, but sometimes if they are too out of date I have to compile it from scratch. Also the different packaging systems (like apt, pacman, dnf…) means that depending on what flavor I am currently running there may not be a analogous system or maybe a package will be missing and I end up (once again) having to build it from scratch. On the other side I have Arch Linux based ones, which usually works great (especially having access to the AUR) but I end up spending a lot of time configuring stuff that isn’t built in (which is by design I know), or having stuff randomly be broken after an update. (which I suppose is my own fault I should have probably set up btrfs or something). Also some libraries will build/work great out of the box on some distros and be completely unusable on others for no apparent reason.
I looked into Gentoo, NixOS, and Guix SD as possible solutions for my issues. Gentoo because since it seems like I have to compile a lot of my libraries anyways maybe I should use a system where you have to compile everything. NixOS and Guix since it seems they are designed for package management and versioning built into the system which might be exactly what I am looking for.
I am worried about the learning curve of all of these. I don’t have a lot of time to mess around with configuring stuff all the time. Ideally I’m looking for a distro that works well with my old-ish hardware (with NVIDIA support unfortunately) where I can sit down, program and/or play games on steam+proton; but it seems like I have to choose between “system is stable but packages are old” and "system and libraries are new but is very unstable. Or if I am using snaps or flatpak its “install 5 things and now you are out of memory” (thanks electron).
Also concerned about both NixOS and Guix since they seem to be designed behind “everything goes through the package manager”, which is super cool for making it so the environment is the same, but I am concerned about getting stuff to work if a package doesn’t exist or if the library is designed to use like ‘pip’ or ‘bun.sh’ or some built in package manager.
Any thoughts about this? any non popular distros that might fit my use case? did I give up on some distro too soon? am I just a confused newb?
deleted by creator
Also the servers are unreachable from russia since they’re hosted on a german research network and russophobia has been running rampant
:(
There are mirrors so it’s defitntely possibke to still use, should be rather easy tu set up as well but just anouher wrinkle I wanted to warn about
Doing a reconfigure right after a pull and half the packages don’t have substitutes yet 😭
these packages will be built
… …-linux.6.10^C! ^C! ^C!
Yeah one of the reasons I was looking into Guix was because it has a lisp based configuration. (I use emacs semi regularly so I imagine guix would fit into the emacs config mindset well).
There are asian mirrors, might want to change your substitute server to one of them.
deleted by creator
Ah that sucks
Active GuixSD user.
Our application catalog is much smaller than many other distros simply because we don’t have the userbase large enough to surface the volunteers necessary to support it. So you will have to learn to write your own packages eventually
That said, if you know your way around functional languages (in this case, scheme), it’s probably the easiest time I’ve ever had writing a package. Everything that goes into the script is known at the time the script is written, so weird extrinsic problems don’t really occur after you’ve written the package.
Some stuff that you and the guix maintainers may not have the time to support will also get updated more slowly.
Luckily flatpak exists, and is a godsend for the new wave of read-only (functional/ostree-based) OSs.
Biggest appeal for me was having all my configuration in one place (and documented) so if I forget I did something in 6 months, it’s always staring at me in my home or system config file. You can accomplish the same thing by being diligent with say, script files, but it’s drop-dead easy to just maintain a system and home descriptor file and keep editing that.
Using scheme would be a big benefit for me as I already know it whereas NixOS I would have to learn their config language. I suppose that if it is easy to create packages and submit them it would be like compiling it myself except that more people could have access to it. I shall take this under consideration.
I do have one related question, during install how do you get an already customized config file onto the system during install? How do I create a config file beforehand?
You can start a different TTY than the install automatically starts. Guix has a ‘guix system init‘ command you can point to a system config and mounted filesystem, much like arch’s system init.
If you use the curses-based installer it auto-generates a system config file for you.
Note that the base configuration is entirely libre kernel so some drivers may not work (like wifi)
In order to get these working out of the box you have to make a boot iso with guix with a non-libre kernel.
The system crafters channel has a guide that details using nonguix (a non-libre kernel channel) in the installation out of the box: https://systemcrafters.net/craft-your-system-with-guix/full-system-install/
Ah yeah, that makes sense. I shall try this out in a VM sometime. thanks!
Good luck! Feel free to DM me I’d you have any questions!
Set aside a few weekends and mess around distro hopping. Think of it as a small scientific study. Use what you determine to be the most comfortable.
I suggest being clever in your partitioning keeping /home and any other areas personal to their own partition if not their own disks. If you want to experiment you lose nothing by wiping / and installing something else. Also, you should decide on an effective backup strategy.
I put about 150 hours into NixOS before I was really “done” setting everything up. (Of course, it was completely usable way before that.)
The biggest advantage to me is that that was the last time I will have set anything up. If my laptop or PC or both get thrown into an incinerator tomorrow, I will go buy replacement hardware and will have my exact same setup done in less than 10 minutes.
I used to have serious anxiety about losing my setup with Arch - over the years a lot of config amasses, and sure you can back up your dotfiles, but you better do that after every change, and don’t forget to manually track your changes to /etc, /usr, and so on.
Right now, I am enjoying the most seamless development setup I’ve ever had. That being said, you will have a BAD time unless you embrace nix shells for development (at which point the pip/venv stuff becomes easy, too)
You are right, it’s a steep learning curve and you will have to invest some time initially, but it frees you up in the long run
I went from Arch to NixOS, so I can offer a bit there.
You definitely won’t want to rely on it until you know a good amount and get comfortable. Things can be made to work, but knowing how to get it done is the main thing most of the time.
Regarding package availability, it’s just a matter of a few oddly esoteric incantations and version controlled code, usually. Binaries are another story but still possible, and python is a special case of that.
It has been an annoyance for me, but I’ve also learned a lot by getting things to work. If you use any niche python stuff you’re bound to run into something. A bunch is already packaged and works fine, though. Either way there’s a bit of extra nuance, which is more to learn.
You don’t have to start with NixOS and can feel it out using nix on any distro. It can be hard to tell if someone will vibe with it. All that said, it could be more than you’re looking to get into, but you can ease into it if you’re interested.
I feel like Nix is a good deployment platform, whereas Arch is a good development platform.
Generally I agree. It feels kind of shoehorned in when desktop is your goal, like more of an afterthought or side effect of the overall focus.
The main thing I hang on to is the code-specified configuration. I never got into managing dotfiles with arch, but that could be a better solution for many people. Especially along with btrfs, numerous containerization options, and whatnot.
This does make a lot of sense. From what I could tell a lot of devs talk about nixos in the same way that they talk about docker.
Yeah Ive been using hy-lang about half the time I have to do things in python; so I would assume weirdness is bound to occur :). Yeah I believe someone else mentioned that it could be used as a standalone package manager so I shall look into this.
Question: What are you developing?
With that said, NixOS would probably be fine, if not better than fine. From what I can tell, I don’t think Guix would be a good idea - the packages appear out of date, according to their package manager. They’re still on Python 3.10.
However, I might recommend Debian Testing to you for your purposes. Most of the time, packages are pretty recent, maybe a few months old at the most (sometimes just a few weeks), but you still get most of the stability of regular Debian. The only asterisk is when the freeze happens. I think apt may have gotten some updates as well.
I’ve been using it on my desktop PC for over two-and-a-half years. I will say I have grown a bit weary of it, as it gets so many updates and software changes so fast. On my laptop, I went with stable and plan to switch or stable on my desktop once Trixie gets stable.
In brief, Testing isn’t bad. I’d almost recommend a development VM.
I am a hobbyist programming language developer so I program in a lot of different languages (c, rust, go, js, python, various lisps, forths, esoteric langs). I did read an interesting article about someone daily driving Debian Sid, so maybe I will look closer into that. I also have heard of a distro called rhino linux which is supposed to be a “rolling release ubuntu”. Yeah I always forget that docker dev containers are an option, maybe I should look into that more.
As a Gentoo user:
If setup correctly, absolutely.
Otherwise, it’s a nightmare.
I’d say in most case, you’d want to pick something simple to get you up and running, as well as to set a baseline.
If it’s work related, I wouldn’t go anywhere near anything that isn’t based on Debian, Ubuntu, or Red Hat.
Gentoo is an open book test on compile flags at all times.
All you have to know is all your system variables, compiler flags that exactly two distros use, init, daemons and hardware and it’s great!
On some level I admire the people who know that stuff, but I’ve had my OS compiled for me for a long time. I loved portage once I figured out how to use it though.
I might add some version of Suse (open or enterprise) to that list though. Last I checked there were a bunch of shops kicking the tires as cent os shut off. Didn’t keep up on how that turned out.
Gentoo is surprisingly reliable as personal system. I like how you’d be able to customize stuff compile stuff, making it leaner than most setups.
I’ve heard a lot of good things about SuSE, but it’s mostly from the community and not the enterprise side of things. I’ve never seen enterprise setup with SuSE, whereas the three I mentioned earlier I’ve seen all the time.
Zypper is very solid, and I can’t say anything bad about suse, but it was 15 years ago I was strictly working off of VMs while the company I was working at advertised support. If there wasn’t the Debian social contract I think a lot more projects would have forked it.
They had a better reputation down the company chain than redhat, but the orders always seemed to go to IBM.
ive used gentoo a lot, a big downside is the amount of time spent compiling, if you need to install a lot of softwares frequently it could be difficult. (though you can use --binpkg options to install binaries and some packages have a packagename-bin variant, and flatpaks + appimages are a thing) if your software needs rarely change than it can be fairly painless.
the customization and speed are rivaled by almost nothing except for something like LFS. the package availability is great. you can also use custom patches easily as well as disable or enable specific software features (USE flags) . you can choose what packages stay at stable versions, testing versions, or even bleeding edge (-9999 version tags)
for a more “standard” distro, i would recommend artix. it’s an arch based distro with your choice of init system (as a gentoo fan ill recommend openrc). i used the graphical installer to get it setup and it was a breeze. due to not being source based, and having access to the AUR you can quickly install any package you want.
ive had it in my laptop for years and have been recently using it on my main pc for about a month.
additionally regardless of distro (besides immutable ones), id recommend installing timeshift for backups, it actually doesn’t require btrfs! ive used it with both ext4 and F2FS and doing a quick backup before an update has definitely saved me a few headaches.
feel free to ask me any follow up questions
I use nixos for dev all the time, personally I think it’s great
What I would suggest however is to install the nix package manager on another distro, learn how it works that way and then switch when you’re comfortable only using nix
Flakes are absolutely incredible for development and I think every project beyond scrappy scripts should use them.
You can specify all your dependencies (compiler, libraries, cli tools, environment variables etc) in your nix flake, then run nix develop and it’ll make you an isolated shell with all that stuff
(For example, I don’t have go, rust or dotnet installed but when I cd into one of my projects directors it installs them to a temporary shell and catches them until I clean up)
The flake also generates a lock file which specifies every version of every dependency with a git rev and a hash, meaning if you check flake and lock into git, anyone else who clones that project and uses the flake gets the exact same system you were using
Yeah thats a good idea. I know that guix can be used as standalone package manager but I didn’t know you could do that with nix as well. I shall look more into that, thanks
All of the cool development-related Nix things like pinning a project to known-good library versions (for regression tests or otherwise) don’t really need you to run NixOS. If you like NixOS then it’s a perfectly usable distro for development work, but all of the powers come from Nix itself, and that can be installed anywhere you feel comfortable with.
The only real pro of running full NixOS is that everything you work on will test a relatively uncommon *nix setup by its nature. Things like developer-only scripts with hardcoded
shebangs are more likely to break on NixOS than they would on a conventional Linux distro with Nix installed. That’s something potentially worth fixing as it might also hurt the developer experience on *BSD/Mac systems.
deleted by creator
I use Guix Home on my laptop (on top of Asahi Fedora Remix) and started trying to use Guix System on my server a while ago. Here’s some points I have:
- The declarative configuration system is fucking awesome and makes Debian feel like the stone age. It does have a high learning curve though but it is definitely worth it.
- When deciding between Nix vs Guix, I ended up settling on Guix because Nix seemed more focused on marketing and cutting corners to make a working product faster and Guix seemed more like a community project with better ideological goals behind it. However, I have hardly used Nix so take this with a grain of salt. Also, Nix has a lot more packages and is closer to being production-ready and in a business setting I would probably choose Nix for the project instead because of that, it also is compatible with macOS and Guix isn’t.
- The Guix package manager is source-based and the repos are committed to 100% free software which I really like compared to Nix which just throws binaries in their repos. However, this means that they need to package everything to work within their ecosystem as if they are packaging for an entirely different OS, and this is often very time-consuming, especially for packages with hundreds of dependencies. Combine that with the community being very small and niche, and repo under-maintenance is a very serious problem. Many core packages are outdated, which also seems like a security hazard. If you’re expecting to use a bunch of new Rust-hype programs or something that isn’t mainstream, they probably aren’t there (you may find them in an obscure third party repo however). Some core libraries made significant changes to their build process when they updated that haven’t made their way to Guix so they may be stuck on an old version until someone decides to update it. If there’s a package you need, expect to either package it yourself or download it with a different package manager like Nix or Flatpak.
- Most modern hardware requires proprietary blobs and you’ll need the nonfree Linux kernel from the nonguix repo. SystemCrafters has an installer image that comes with that IIRC.
- You may be interested in an “Erase Your Darlings” system configuration (do not save filesystem state to disk except for files/folders explicitly opted-in, requires even more upfront configuration but helps ensure reproducability). Nix has that built in. Guix doesn’t, but if you fuck around enough with the partitioning you can get it to work. I have a setup with BTRFS and subvolumes that took me a week to figure out and I had to do some hacky setting to make it work correctly with Grub. Also it’s more difficult to do when you don’t know how Guix’s file structure is laid out or are unfamiliar with the tooling and configuration language, there aren’t really any good tutorials on the internet for it either so lmk if you need any help (it doesn’t have disk encryption however since it is on a VM).
- If you want to make sure your system stays pinned to specific software versions, the way I do that is I have a channel.scm which has the channels like normal. Using the
just
command runner, I have a Justfile in the directory where I store my configuration.just update
runsguix time-machine
pointing to the channel.scm which pulls the repo’s updates then after the--
has the command that prints the channels with the specific commit to channel.scm.lock. For every other guix command, such as the reconfigure command, it usesguix time-machine
pointing to channel.scm.lock then the command I want after--
. - Flakes is probably the most hyped feature about Nix, which instead of using a central repo for all software lets each project turn their git repo into a source for the package manager which can point to other repos it depends on. Guix doesn’t really have this feature, but since its main goal is creating an ecosystem of completely free software, I would argue that the centralized approach is better for this project since it helps GNU achieve this goal and provides guarantees about the freedom of the software and the packaging quality. Guix also makes it easy to create your own repo for packages or turn your project into a repo for a package, but it can’t refer to packages outside of the repos that are listed as sources on your local setup so it isn’t really flexible like Flakes.
- It also uses Shepherd for its init system which uses the same configuration language as the rest of the system. Compared to systemd I am not sure which is principally better, however it provides an additional roadblock to packaging software since most stuff is designed around systemd-based distros.
- This project is niche and has very few resources for help aside from the documentation, the source code (there seems to be quite a bit of undocumented stuff so you’ll probably end up browsing it sooner or later), IRC/mailing lists, SystemCrafters, and a few random blogs or git repos. ChatGPT fucking sucks at Guile and it spits out code that is about 80% incorrect so actually learn Guile and don’t use ChatGPT (sometimes it gets the parenthesis wrong too which is kindof hilarious).
- Setting up Emacs, a local SMTP server connected to your email for git, and a CLI password manager will probably be helpful.
- Have a copy of Guix cloned on your computer so you can browse around and see how stuff works (especially packages and services). It’s the same language as the system configuration language which is helpful. The documentation also has a guide to set it up for contributing which you may be interested in at some point.
- The contribution process is weird, it uses a lot of command line tools which I kindof like but it also has a learning curve which doesn’t help with the contributor shortage. Also it seems like a lot of patch requests get ignored and in some cases how to contribute is confusing. I was trying to contribute a Rust program once but it added hundreds of libraries and when I submitted it months ago it got ignored so I don’t know how I am supposed to contribute these sort of programs and the mailing list/IRC didn’t give me much advice either.
- For finding packages, there’s https://toys.whereis.みんな/ which shows stuff from nonguix and other repos you’ll probably want.
- For making your own packages, the
guix import
feature can be helpful and works nicely with Rust, especially if the program you want is in crates.io in which you can put it in your packages repo very quickly. - For using Guix for software projects, there aren’t a ton of libraries packaged so you’ll need to see if your language is supported by
guix import
. The Node.js ecosystem is allergic to FOSS so it might not work very well with Guix (there are barely any Electron programs packaged outside of nonguix also). guix profile
andguix home
are confusingly different. One uses imperative install commands and the other uses a declarative configuration and they install into different directories, so if you remove a program from home but it’s still there it may still be installed in profile.- Most packages should be installed using
guix home
and don’t need to be installed systemwide. It also provides powerful containerization/environment management tools to isolate installs efficiently. - For server stuff, Shepherd has a sandboxing feature I’ve experimented with a tiny bit that isn’t well documented (if at all), I haven’t tested it in a while though but with it you don’t really need to containerize stuff. I haven’t figured out how do manage the networking correctly but there’s probably ways to do that as well.
- For servers, trying to package Node projects that aren’t in a single binary sucks.
- For desktop usage, I would recommend installing Guix Home on your current distro first and experimenting with that before doing a full system install (which is what I’m doing right now since being on a Macbook adds additional complications). You can do the same thing with Nix home-manager also.
- Guix and SELinux don’t really get along, on Fedora you may need to disable it (I don’t know how to use it correctly with Guix) which weakens security (which on Linux security kindof sucks). This is a problem with Nix as well.
To address your points:
The Debian/Fedora based ones seem to be fairly slow to update and so they have out of date packages, which sometimes is ok, but sometimes if they are too out of date I have to compile it from scratch.
Fedora is way more up-to-date than Guix is. Also Guix is source-based so it may end up compiling stuff from source automatically. You can install Nix though if you need it which looks a lot more up-to-date.
I end up spending a lot of time configuring stuff that isn’t built in
You’ll be spending a lot of time configuring stuff with Guix as well. However the declarative style makes it a lot easier to track and maintain.
having stuff randomly be broken after an update
Libcamera broke pretty recently on my Guix install which broke a ton of programs although it might be fixed now. If that happens though you can revert to your previous configuration or pin the repo to an older version until it gets resolved. Normally packages are checked when they are updated though to ensure they don’t break stuff.
I don’t have a lot of time to mess around with configuring stuff all the time.
You’ll need to spend a lot of time learning stuff since there’s very few tutorials on the internet.
Ideally I’m looking for a distro that works well with my old-ish hardware (with NVIDIA support unfortunately)
IDK if nonguix supports NVIDIA or not but it might be a problem.
if the library is designed to use like ‘pip’ or ‘bun.sh’ or some built in package manager
You can still use other package managers, but you can’t use them to package the program specifically for Guix. You may have luck using
guix import
instead however. Also bun.sh is an example of a non-mainstream program that probably isn’t in the Guix repos.Nix seemed more focused on marketing and cutting corners to make a working product faster
Yes, this is a big issue in corporate development. It seems like management is in a constant state of barreling headfirst into a “silver bullet that fixes everything” instead of doing things the hard way (which in the long term is almost always better.
expect to either package it yourself
I have not maintained any packages before but I am very interested in learning how, I shall look into this.
Shepherd for its init system
I vaguely remember this was the originally used in Hurd? if so that is cool.
This is very cool!
guix import
This seems quite useful thanks for that.
Setting up Emacs, a local SMTP server connected to your email for git, and a CLI password manager will probably be helpful.
I have been wanting to set up upasfs this may be the push I need to finally get around to doing that.
It appears Guix may be a good choice in the future but not quite yet, I will try installing it as a package manager and/or try it in a VM to start out with. Thanks for the info!
I have not maintained any packages before but I am very interested in learning how, I shall look into this.
The easiest way to learn this is to download the Guix source code and look in the gnu/packages directory to see how other programs are packaged and look at the official packaging guides/build system options/guix import options/guix refresh (updates package definitions)/contributor guides (if you want to set up the local Guix repo copy more correctly) in the documentation - gnu/packages also has certain files for running guix import in if a program you’re contributing needs dependencies that can be guix-imported. Simple things are easy to package, so are binaries if you’re just doing it for yourself and need something quickly (I think nonguix has a binary build system specifically for that as well), it’s programs that have a ton of libraries (especially with Python and Node.js) that are the problem since there’s no internet during the build process so running the project package manager won’t work.
I vaguely remember this was the originally used in Hurd? if so that is cool.
Yes, Guix System works with Hurd as well although I don’t see any reason to use it since it’s in an incomplete state and there are more interesting OS projects being developed like RedoxOS or Genode.
I have been wanting to set up upasfs this may be the push I need to finally get around to doing that.
Guix Home (and Guix System) has a services section in the documentation that has configuration options for certain things including email so I would suggest looking at that. (The Guix Home services also work on foreign distros.)
I will try installing it as a package manager
That’s the best approach to learning Guix IMO, especially using Guix Home. Once you have it fully set up on your current distro with Guix Home, you can copy your configuration to a Guix System install later on and replicate your current user setup really quickly. You can also return to your distro package manager quickly if you decide you don’t like it.
One other thing I forgot to mention is that Guix works weirdly with non-POSIX shells like fish and nushell so you might need to modify the configuration to automatically add the necessary environment variables or it will end up being stuck on an outdated Guix version randomly which will cause weird issues when you install/search packages or run guix pull.
Gentoo user here. It can be great for dev as you have everything that is required to build the software you’re running assuming you’re trying to produce something using the same base. Ie C++ with Qt for KDE etc.
It’s also a lot easier to build your own repo and packages with than any dev setup I’ve seen, it’s literally just a text file.
It does take a while to compile. However you need opinions to use it… Otherwise you will just have useflags enabled on everything. It does require a bit of understanding of how linux is built but the guide does most of the work for you, and it’s easy to install on an existing system. If you’re using btrfs you can install it on a subvolume and try it out easy.
However I used it during the 00s and 20s… But not the 10s. The difference is that software is moving way too fast for distributions to keep up with, so you will definitely want to build your own ebuilds at some point. Emerge / portage can sometimes cause issues upgrading too. But nothing a btrfs snapshot can’t save you from.
But I think distro hopping is a great idea if you have the machines / time.
Gentoo is its own thing. You can bump packages yourself a lot of the time with a few commands. Or have the package manager install directly from upstream source control, if that’s your bag. Or you can hold on to older package versions for periods ranging from months to years, by stashing ebuilds in a local repository. At the same time, portage has reached the point where it bends over backwards to keep you from breaking stuff by accident. If you’ve done your setup right and use primarily stable keywords, breaking changes are very rare. And you’re free to install things outside the protection of the package manager, or package things yourself if you don’t mind working with bash scripting.
The tradeoff for all of this is that you have to spend a fair amount of time setting up and configuring stuff, and a fair amount of time compiling software if you want a USE flag combination other than what’s on the binhost. It also helps to spend time learning the ins and outs of the portage/ebuild ecosystem if you’re going to do anything unusual.
As for the proprietary nvidia drivers specifically, Gentoo currently has versions 390.157, 470.256.02, 525.147.05, 535.183.01, and four different 550+ available, which should cover most hardware of the past several years.
If you want to see whether certain software has been packaged without installing Gentoo, the best place to check is gpo.zugaina.org. The search function isn’t all that bright, but it’s the only site I know of that indexes all the official overlays and the Gentoo bugzilla along with the main repository.
You answered the most important question when another person asked it.
You aren’t developing anything, so a distribution for development wouldn’t be necessary. If it were, it would be the distribution closest to the target environment.
You’re learning, and anything is fine. Someone said Debian testing, that’s a good choice. You just want stuff to work and spend the barest minimum amount of time fiddling around with your environment so probably not Linux at all.
You’ll find that the overwhelming majority of support materials in every language you listed will use windows or can be effectively used in windows. If you really need the Unix environment, they will probably first have examples in macos.
So maybe consider using windows or macos.
You’re not going to have an easier time learning2code on some esoteric distribution.
Yes you are quite right, unfortunately for me I rolled high in electrochemestry and require copious amounts of proprietary games and CUDA cores so GNU + Linux + Proton is where I will need to be for now.
How about docker/podman container?