Yes — NixOS does use systemd by default.
NixOS integrates systemd deeply, but configures it declaratively via Nix instead of imperative commands.
You don’t usually write unit files by hand. Instead, you define services in configuration.nix, and NixOS generates the systemd units for you.
Example:
services.nginx.enable = true;
This automatically creates and manages:
nginx.serviceYou can still interact with systemd normally:
systemctl status nginx
systemctl restart nginx
journalctl -u nginx
You can define your own units declaratively:
systemd.services.my-service = {
description = "My custom service";
wantedBy = [ "multi-user.target" ];
serviceConfig = {
ExecStart = "/path/to/binary";
Restart = "always";
};
};
If you want:
| Question | Answer |
|---|---|
| Does NixOS use systemd? | ✅ Yes |
| Can you avoid systemd in NixOS? | ❌ Not realistically |
| Is systemd optional? | ❌ |
| Is it configured declaratively? | ✅ |
If you want, I can compare NixOS vs Arch vs Gentoo vs Void from a system-design perspective.
Yes — Guix is very similar to NixOS in philosophy, but different in important technical choices.
Short answer first:
GNU Guix System does NOT use systemd.
| Aspect | NixOS | Guix System |
|---|---|---|
| Package manager | Nix | Guix |
| Language | Nix expression language | GNU Guile (Scheme) |
| System config | Declarative | Declarative |
| Reproducibility | Yes | Yes |
| Rollbacks | Yes | Yes |
| Default init | systemd | GNU Shepherd |
| GNU ideology | Neutral | Strongly GNU / FSF |
dmdKey characteristics:
Shepherd is closer to:
(service nginx-service-type
(nginx-configuration
(server-blocks
(list
(nginx-server-configuration
(server-name '("example.com"))
(listen '("80"))))))
This generates:
No unit files.
They share the same core ideas:
/gnu/store vs /nix/store)They solve the same problems, but with different ideology.
Choose Guix if you want:
Choose NixOS if you want:
If you want, I can help you decide Guix vs NixOS vs Artix vs Void based on how you actually use your machine.
Yes — but with important caveats. GNU Guix is FSF-pure by default, so it avoids non-free firmware, yet you can install non-free blobs manually if you really need them (like for Wi-Fi).
Here’s a breakdown.
operating-system config hooksYou can copy firmware to /etc/firmware or /lib/firmware and load it via kernel modules.
Example:
(operating-system
;; ...
(file-systems
(cons* (file-system
(mount-point "/lib/firmware")
(device #f)
(type "tmpfs")
(options '("mode=755")))
%base-file-systems))
;; Hook to copy firmware
(packages (append
(list (local-file "path/to/your/firmware/driver.bin"))
%base-packages)))
Then the kernel module can pick it up.
--substitute-binary featureGuix allows binary substitution for packages that are not in FSF repo. This is advanced; usually involves:
local-package definitionsSome users:
b43 or wl firmwarertlwifi blobsCheck with:
lspci -nnk | grep -iA3 net
If you want, I can give you a step-by-step example to make a Broadcom Wi-Fi chip fully work on Guix, including config snippets. Do you want me to do that?
Perfect! Let’s go step by step for getting a non-free Wi-Fi driver working on Guix System. I’ll make it clear, declarative where possible, while keeping it practical.
We’ll assume your Wi-Fi card requires a proprietary firmware blob (like Broadcom or some Realtek chips).
Open a terminal:
lspci -nnk | grep -iA3 net
Output example:
03:00.0 Network controller [0280]: Broadcom Inc. and subsidiaries BCM43142 802.11b/g/n [14e4:4365]
Subsystem: Hewlett-Packard Company BCM43142 802.11b/g/n
Kernel driver in use: wl
✅ Note:
14e4:4365 → PCI IDKernel driver in use may show b43 or wlwl_apsta.o (or .bin) firmwaremkdir -p ~/firmware
cp wl_apsta.o ~/firmware/
/lib/firmwareGuix expects firmware in /lib/firmware (or a subdirectory used by the kernel module):
sudo cp ~/firmware/* /lib/firmware/
For Broadcom, for example:
sudo modprobe wl
Check your Wi-Fi interface:
ip link
You should see wlan0 or similar.
Guix lets you include local packages in your system configuration. Create a local package for the firmware:
mkdir -p ~/guix-packages
firmware-broadcom.scm:(use-modules (guix packages)
(guix download)
(guix build-system trivial)
(guix licenses))
(define-public firmware-broadcom
(package
(name "firmware-broadcom")
(version "1.0")
(source (local-file "/home/username/firmware/wl_apsta.o"))
(build-system trivial-build-system)
(arguments `(#:install-file (("wl_apsta.o" "share/firmware/wl_apsta.o"))))
(home-page "https://www.broadcom.com")
(synopsis "Proprietary Broadcom Wi-Fi firmware")
(description "Firmware blob for Broadcom Wi-Fi chips")
(license non-free)))
Edit /etc/config.scm (or wherever your operating-system block is):
(operating-system
;; ...
(packages
(append
(list (local-package "firmware-broadcom" "~/guix-packages/firmware-broadcom.scm"))
%base-packages))
)
sudo guix system reconfigure /etc/config.scm
✅ This will:
/gnu/store/.../share/firmware/...Add the kernel module to operating-system:
(operating-system
;; ...
(linux-modules (cons "wl" %base-linux-modules))
)
Reconfigure again:
sudo guix system reconfigure /etc/config.scm
Now your non-free Wi-Fi driver is persistent and declarative.
You can use NetworkManager:
sudo systemctl start NetworkManager
nmcli device wifi list
nmcli device wifi connect "SSID_NAME" password "YOUR_PASSWORD"
lspci./lib/firmware for immediate testing.modprobe wl).operating-system declaratively.guix system reconfigure.If you want, I can make a ready-to-paste Guix snippet for Broadcom and Realtek chips so you can just drop it in your config and rebuild — fully declarative.
Do you want me to do that?