289dd22132
Summary of this change: - Simplify code. - Stop a disk image from being cached in the binary cache. - Make erofs Nix Store image build in an acceptable time outside of testing environments (like `darwin.builder`). - Do not regress on performance for tests that use many store paths in their Nix store image. - Slightly longer startup time for tests where not many store paths are included in the image (these probably shouldn't use `useNixStoreImage` anyways). - Slightly longer startup time when inputs of VM do not change because the Nix store image is not cached anymore. Remove the `storeImage` built with make-disk-image.nix. This produced a separate derivation which is then cached in the binary cache. These types of images should be avoided because they gunk up the cache as they change frequently. Now all Nix store images, whether read-only or writable are based on the erofs image previously only used for read-only images. Additionally, simplify the way the erofs image is built by copying the paths to include to a separate directory and build the erofs image from there. Before this change, the list of Nix store paths to include in the Nix store image was converted to a complex regex that *excludes* all other paths from a potentially large Nix store. This previous approach suffers from two issues: 1. The regex is complex and, as admitted in the source code of the includes-to-excludes.py script, most likely contains at least one error. This means that it's unlikely that anyone will touch this piece of software again. 2. When the Nix store image is built from a large Nix store (like when you build the VM script to run outside of any testing context) this regex becomes painfully slow. There is at least one prominent use-case where this matters: `darwin.builder`. Benchmarking impressions: - Building Nix store via make-disk-image.nix takes ~25s - Building Nix store as an erofs image takes ~4s - Running nixosTests.qemu-vm-writable-store-image takes ~10s when building the erofs image with the regex vs ~14s when building by copying to a temporary directory. - nixosTests.gitlab which had the biggest gains from the initial erofs change takes the same time as before. - On a host with ~140k paths in /nix/store, building the erofs image with the regex takes 410s as opposed to 6s when copying to a temporary directory. |
||
---|---|---|
.. | ||
doc/manual | ||
lib | ||
maintainers | ||
modules | ||
tests | ||
COPYING | ||
default.nix | ||
README.md | ||
release-combined.nix | ||
release-small.nix | ||
release.nix |
NixOS
NixOS is a Linux distribution based on the purely functional package management system Nix. More information can be found at https://nixos.org/nixos and in the manual in doc/manual.
Testing changes
You can add new module to your NixOS configuration file (usually it’s /etc/nixos/configuration.nix
). And do sudo nixos-rebuild test -I nixpkgs=<path to your local nixpkgs folder> --fast
.
Commit conventions
-
Make sure you read about the commit conventions common to Nixpkgs as a whole.
-
Format the commit messages in the following way:
nixos/(module): (init module | add setting | refactor | etc) (Motivation for change. Link to release notes. Additional information.)
Examples:
-
nixos/hydra: add bazBaz option
Dual baz behavior is needed to do foo.
-
nixos/nginx: refactor config generation
The old config generation system used impure shell scripts and could break in specific circumstances (see #1234).
-
Reviewing contributions
When changing the bootloader installation process, extra care must be taken. Grub installations cannot be rolled back, hence changes may break people’s installations forever. For any non-trivial change to the bootloader please file a PR asking for review, especially from @edolstra.
Module updates
Module updates are submissions changing modules in some ways. These often contains changes to the options or introduce new options.
Reviewing process:
- Ensure that the module maintainers are notified.
- CODEOWNERS will make GitHub notify users based on the submitted changes, but it can happen that it misses some of the package maintainers.
- Ensure that the module tests, if any, are succeeding.
- You may invoke OfBorg with
@ofborg test <module>
to buildnixosTests.<module>
- You may invoke OfBorg with
- Ensure that the introduced options are correct.
- Type should be appropriate (string related types differs in their merging capabilities,
loaOf
andstring
types are deprecated). - Description, default and example should be provided.
- Type should be appropriate (string related types differs in their merging capabilities,
- Ensure that option changes are backward compatible.
mkRenamedOptionModuleWith
provides a way to make renamed option backward compatible.- Use
lib.versionAtLeast config.system.stateVersion "24.05"
on backward incompatible changes which may corrupt, change or update the state stored on existing setups.
- Ensure that removed options are declared with
mkRemovedOptionModule
. - Ensure that changes that are not backward compatible are mentioned in release notes.
- Ensure that documentations affected by the change is updated.
Sample template for a module update review is provided below.
##### Reviewed points
- [ ] changes are backward compatible
- [ ] removed options are declared with `mkRemovedOptionModule`
- [ ] changes that are not backward compatible are documented in release notes
- [ ] module tests succeed on ARCHITECTURE
- [ ] options types are appropriate
- [ ] options description is set
- [ ] options example is provided
- [ ] documentation affected by the changes is updated
##### Possible improvements
##### Comments
New modules
New modules submissions introduce a new module to NixOS.
Reviewing process:
- Ensure that all file paths fit the guidelines.
- Ensure that the module tests, if any, are succeeding.
- Ensure that the introduced options are correct.
- Type should be appropriate (string related types differs in their merging capabilities,
loaOf
andstring
types are deprecated). - Description, default and example should be provided.
- Type should be appropriate (string related types differs in their merging capabilities,
- Ensure that module
meta
field is present- Maintainers should be declared in
meta.maintainers
. - Module documentation should be declared with
meta.doc
.
- Maintainers should be declared in
- Ensure that the module respect other modules functionality.
- For example, enabling a module should not open firewall ports by default.
Sample template for a new module review is provided below.
##### Reviewed points
- [ ] module path fits the guidelines
- [ ] module tests succeed on ARCHITECTURE
- [ ] options have appropriate types
- [ ] options have default
- [ ] options have example
- [ ] options have descriptions
- [ ] No unneeded package is added to `environment.systemPackages`
- [ ] `meta.maintainers` is set
- [ ] module documentation is declared in `meta.doc`
##### Possible improvements
##### Comments