unofficial mirror of guix-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Sage Gerard <sage@sagegerard.com>
To: Maxime Devos <maximedevos@telenet.be>, guix-devel@gnu.org
Subject: Re: How did you handle making a GNU/Linux distribution?
Date: Tue, 24 Aug 2021 17:17:08 +0000	[thread overview]
Message-ID: <adfa1d2d-23c6-5831-4ecc-349046703e6d@sagegerard.com> (raw)
In-Reply-To: <e8e6e0d6283673828b3c458b177dc78663c7d141.camel@telenet.be>

I'll answer your questions in a different thread to limit the noise in
this one. Look for the "Xiden/Guix design comparison" subject line
within the next 24h.

On 8/24/21 12:42 PM, Maxime Devos wrote:
> Sage Gerard schreef op ma 23-08-2021 om 18:24 [+0000]:
>> Thank you for the links!
>>
>>> I miss which problem Xiden is solving and how it does.
>> You are not the first to say so, and I'm happy to learn more about why.
>>
>> I'll try to explain in a different way here, so forgive the text wall.
>> I'll incorporate any feedback here to improve the white paper. I'd also like
>> to hear more about Guix's philosophy on what I'm going to talk about, because
>> I had reasons to end up with a different model.
> Maybe the publications at <https://guix.gnu.org/en/publications/> are informative.
>
>> --
>>
>> If we each use a program to distribute software, then those programs are probably
>> incompatible in some way (e.g. Cargo vs. Nexus' Vortex). Xiden addresses this by
>> decoupling the subjective elements of software distribution from the objective ones.
>>    That means modeling software distribution as (partly) a semantics problem. Racket didn't
>>   do this with its own package managers. Which is ironic, because it's hard to guarantee
>>   that that an arbitrary Racket program will get the dependencies they mean to use.
>>
>>   I've written about this at length [1][2][3],
> About polyglot: packages in Guix can specify which version of a package they use.
> E.g., Guix has multiple versions of 'mozjs', and 'mozjs@78.10.1' uses a specific
> version of 'autoconf' (2.13) and 'rust' (1.41)
>
>      (native-inputs
>       `(("autoconf" ,autoconf-2.13)
>         ("automake" ,automake)
>         ("llvm" ,llvm)                   ;for llvm-objdump
>         ("perl" ,perl)
>         ("pkg-config" ,pkg-config)
>         ("python" ,python-3)
>         ("rust" ,rust-1.41)
>         ("cargo" ,rust-1.41 "cargo")))
>
> Is something missing from Guix here?  About [3]: this doesn't seem a problem in Guix,
> if you're referring to the ability to define multiple versions of a package at the same
> time (it's an ‘official policy’ to usually try to only keep the latest version of a
> package though, but channels can ignore this completely).
>
>>   and spoke about it last year [4]. Xiden has changed a bit since the speech to be more flexible, and it is no longer limited for use in Racket projects. Apologies if you see something that looks contradictory.
>> What does that mean? Let's say Alice and Bob each write a Xiden launcher.
>>
>> Alice
>>
>> trusts SHA-384, but only if its implementation uses Keccak.
> SHA-384 and Keccak are separate things? SHA-384: a version of SHA-2,
> SHA-3: a version of Keccak.  By definition, implementations of SHA-384
> have no reason to use Keccak.
>
>> defines "sha384" as the canonical name of the CHF, and treat variants like "SHA-384" as aliases.
>> delegates trust in artifact signatures to GPG subprocesses.
> Guix allows changing the hash algorithm used, search for ‘content-hash’ in the guix manual.
> Changing the hash algorithm globally unavoidably requires modifying every package definition
> though, but that could be automated.
>
>> downloads content from her employer's S3 buckets.
> The ‘official’ substitute servers can be replaced:
> "guix build --substitute-urls=http://s3.bucket.employer"
> (after authorising that substitute server).
>
>> unconditionally prefers cached installations, such that every defined artifact
>> has exactly one stored copy on disk.
> Coming from Guix, I don't know what this means.  Does this mean only one version
> of a package can be in the store at the same time, and building a newer version
> deletes the older version?  How does this compare with ‘content deduplication’?
>
>> All dependents access the stored artifact
>> using symbolic links or Windows junctions.
>
>> prefers declaring versions with edition and revision names.
>> Bob trusts SHA-1,
> See ‘content-hash’ above.  Also, why should Xiden let Bob trust SHA-1 in the first place?
> (See <https://en.wikipedia.org/wiki/SHA-1#SHAttered_%E2%80%93_first_public_collision>.)
>
>>   but only for artifacts from services authenticated by his operating system's certificates
> This is rather vague to me, unless you're referring to substitutes.
> What does this mean for origin specifications?
>
>      (source (origin
>                (method url-fetch)
>                (uri (string-append "mirror://gnu/hello/hello-" version
>                                    ".tar.gz"))
>                (sha256 ; imagine this was SHA-1 instead.
>                 (base32
>                  "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i"))))
>
> Bob got the origin specification from Xiden (or something like a Guix channel
> but for Xiden).  How would this ‘artifact’ authenticated by ‘operating system
> certificates’?  I mean, when you let your operating system build that origin
> (via guix (or Xiden?), which you could consider part of the OS), it will check
> that hash, and it will be considered valid (‘authenticated?’) if the hash matches.
> There are no certificates at play here.
>
> I suppose the OS (guix or Xiden?) could then ‘sign’ it, but what value does that
> provide to Bob?  (Unless Bob runs a substitute server on their computer.)
>
>> .
>> trusts digest creation and signature verification as implemented by his host's dynamically--linked `libcrypto` library for use in the same process.
>> downloads content from GitHub packages
> AFAIK there is no such thing a ‘GitHub packages’.  What is a ‘GitHub package’,
> precisely?  When I hear ‘X package’, I think of "X = python, haskell, ...’ which
> have a standardised build sytem (represented by python-build-system
> and haskell-build-system in Guix), a standardised location to download them from
> (pypi.org and hackage.haskell.org, represented by the 'pypi' and 'hackage' importers
> an refreshers in Guix) and are separate languages.
>
> The only thing things on GitHub have in common are:
>
>   * they have git repositories on GitHub
>   * some repositories on GitHub have ‘releases’, which can automatically be discovered
>
> Notice dependency information and build system information are absent.
>
>> unconditionally prefers SxS installations,
> I searched for ‘SxS’, and found this: <https://en.wikipedia.org/wiki/SxS>.
> I don't think you meant that.  What is ‘SxS’?
>
>>   such that packages cannot conflict in a shared namespace
> ‘packages cannot conflict in a shared namespace’ is a bit vague.
> Are you referring to ‘profile collisions’?  About having multiple versions
> of the same package on the same system?  Guix (and nix) can handle the latter.
> When the ‘propagated-inputs’ are limited, installing multiple packages each using
> a different version of a package is possible.
>
> Is something missing from Guix here (please be very concrete)?
>
>>   at the cost of defeating an internal cache.
> I'm not sure what you mean here, can you illustrate this very concretely?
> And is something missing in Guix here?
>
>> prefers Semantic Versions
> If upstream doesn't do ‘semver’, and instead uses a versioning system like
> used by TeX (3.14, 3.141, 3.1415, 3.14159, ...), then Xiden cannot somehow
> let the package use ‘semver’ instead.  Unless you want to teach Xiden to
> convince upstream to change their versioning system?
>
>> These preferences are valid in Xiden's DSL for writing launchers.
> What is a launcher (compared to packages in Guix), and why would I want one?
> Why shouldn't I just install packages and run them ("guix package -i texmacs",
> start texmacs from some application chooser menu of the desktop environment).
>
>>   The invariants for each launcher can differ as much as Cargo and Vortex differ.
>>   What I wanted to do was allow users to declare their own invariants explicitly,
>>   but only when those invariants are wanted for subjective reasons.
> What are these invariants you're speaking of?  I don't think you're referring
> to, say, translation invariance (‘the laws of physics remain the same under a
> translation of the coordinate system’).
>
> Or do you mean something like ‘Invariant (computer science), an expression whose
> value doesn't change during program execution’ (<https://en.wikipedia.org/wiki/Invariant>)?
> But what are the ‘expressions’ in this case?
>
>>   I can't just write an overly-opinionated tool in this space because opinions
>>   have shelf-lives, and they can't interrupt our ability to get the content we
>>   need on demand, with our own safety guarentees.
> Is Guix too opinionated about something in particular?
>
>> Xiden launchers have advantages over shell scripts in that we can both still download
>> and install dependencies from the same servers, and create reproducible builds in terms
>> of the same (bit-identical) state on disk. We just differ on details that shouldn't impact
>> how we work. It also helps us patch holes faster, since if (say) a catalog maintainer tells
> What is a ‘catalog maintainer’ (maybe it's like someone with commit access to a ‘guix channel’?)
> Also, what ‘shell scripts’ are you referring to?  I've been doing well without writing any shell
> scripts.
>
>> us that a CHF was compromised, we can immediately revoke trust in the CHF independently
> Maybe guix could gain a command "guix style transition-hash OLD NEW" to automagically
> rewrite package definitions to use the new hash algorithm instead of the old.  It will
> need to download plenty of source code however, and it will entail a world-rebuild.
>
> Note that, in practice, signs of the brokenness of hashes appear well in advance of
> actual exploits.
>
>> in our own clients.
> What are these ‘clients’ you're speaking of?  I haven't been needing any ‘clients’ lately.
>
>>   The package definitions are all expressed in terms of what the launchers allow.
> If 'package definition' = (package definition as in Guix), then this is false,
> Guix doesn't have a notion of ‘launchers’ and doesn't depend on ‘Xiden’.
> What are you meaning, exactly?  Also, I haven't found any package definitions in Xiden,
> could you point me to any?
>
>> So what problem does this solve? I'm trying to preserve an element of walk-away power
>> in any tech community. Maybe your community goes in a questionable direction. Maybe your
>> desired software is in a different ecosystem.
> Guix channels can function independently of the main ‘guix’, augmenting ‘guix’ with
> additional packages, even if they contravene official Guix policies (e.g. non-free,
> bad quality ...), or simply if putting it in ‘guix proper’ takes to much time.
> There exist a few relatively well-known channels like that.
>
>>   Maybe the maintainers are abusive jerks.
> Technically, Guix has ‘maintainers’, but I wouldn't know where I could find the list.
> Guix (the package manager) doesn't have its own infrastructure.
> It does have official substitute servers, but you can ignore them.
> So I don't see ‘maintainers are abusive jerks’ as a plausible threat to Guix.
> If they become existent, they can easily be replaced.
>
>> Maybe you have a `leftpad`/`event-stream` incident and the developer is unable/unwilling
>> to patch the problem.
> In Guix, if someone pushed malware (*) to, say, a package on pypi.org, then we (Guix)
> would simply stop using new versions of that package from pypi.org.  If there's a healthy
> fork somewhere, we could switch over to that for new versions.
>
> (*) I could have confused the ‘`leftpad`/`event-stream` incident’ for another incident.
>
>> You'd probably want a way to escape to a new community or distribution model
>>   without
> ‘Escape to a new community’ --> only if the community as a whole are ‘abusive jerks’.
> If it's merely some maintainers, they can be removed or replaced.  If it's all the
> maintainers, I'm sure a few well-regarded members of the community could come together
> for a ‘coup’.  If it's the community as a whole, I don't see how Xiden could help,
> unless you mean I would move from Guix to Xiden?
>
> Why would I want to ‘escape to a new distribution model’?  Writing something like Guix
> from scratch seems a lot of work to me, I would rather fork Guix (with a few
> likewise-minded collaborators) than to start over again.  Or move to Debian maybe.
> I don't see what ‘Xiden’ could offer here.
>
>>   giving up content or doing complex integration work. If Xiden can do that, users
>>   don't have to depend on the same middlemen to share work.
> Is ‘middlemen’ = guix committers here?  Do you have concrete scenario to illustrate this,
>
>>   This is also better for
>>   developers because it doesn't oblige them to do everything their users want,
> Are we talking about upstream developers here, or guix(/Xiden) committers?
> How does this ‘obligation’ exist in the first place?
>
>>   while knowing users will adapt to inevitable distribution problems.
> I would rather not have to ‘adapt to problems’, I would rather that upstream has something
> that works (though I can understand if occasionally mistakes are made).
>
>>   Everyone's consent
>>   becomes explicit, such that Xiden's "real" invariant is that consent between any
>>   two parties be mutually compatible.
> Consent about what?
>
>> I hope to improve user freedom from this angle,
>>   and my approach is biased by my experience with Racket's limitations in this space.
> Why are you comparing it with ‘racket’ instead of, say, Debian or Guix?
> ‘racket’ is a Scheme implementation, not a package manager.
>
>> The subjective parts I talk about go further into details like what name canons,
>> versioning schemes, trusted certificate chains, and even specific approaches to an exact
>> diamond dependency. The objective parts include integrity checking, signature verification,
>> safety limits, automatic dependency resolution, patches, protocols, and other concerns that
>> a decent package manager normally cares about. By keeping these separate, all of the below
>> features become cheap to write, without sacrificing trust & safety in the abstract.
>>
>> Download archived GitHub repositories (source on Racket Discord atm)
> It can download GitHub repositories.  Why are you writing ‘archived’ here?
> Guix supports git repositories (see 'git-reference' in the guix manual), so
> I don't see what additional value Xiden brings here.  Can it also automagically build
> the software?  Also, why ‘GitHub repositories’ specifically?  Why not, say,
> the git repositories at <https://git.ngyro.com/>?
>
>> Manage Racket installations like how `nvm` manages Node.js installations [5]
> It would seem that your ‘racket-installation-manager’ [5] cannot resist a compromise
> of https://downloads.racket-lang.org/releases/.  Also, I don't see how it would be
> possibe to use ‘racket-installation-manager’ offline.  And how does it compile the
> racket packages?  If we're talking about ‘trust’ and ‘escaping to a new community’,
> maybe provide an option to override 'host-url-prefix'?  Currently, it's hardcoding
> the ‘official’ racket community.
>
>> Produce a self-hosted Xiden installations, with implicit trust for the running Xiden instance [6]
>> Control which exact artifacts mnust be produced deterministically [7]
> Can I reproduce the ‘artifact’ (= store item?) on a separate machine?
>
>> Force generated bindings to be `eq?` (This one haunts Racket's package managers today) [8]
> That seems like a Scheme thing to me, not a package manager thing.
>
>> Source package definitions from Pastebin to download content, digests,
>> and signatures from a public S3 bucket (This does not exist today. I'm spitballing because I know
>>   it would work)
> How can this be secure?
>
>> I hypothesize that Xiden can "abstract over" package managers in the same way that Racket can
>> abstract over languages. I think people are used to package managers deciding things for them.
> Please provide some sane defaults.  I would rather not have to decide everything myself,
> and be able to trust Guix(/Xiden?) to do something reasonable.
>
> Also, if you ‘abstract over package managers’, wouldn't you just end up with one ‘super
> package manager’?  Why not ‘manage’ everything with a single package manager,
> like e.g. guix?
>
>> So what is Xiden for? Well, it's not for deciding an SOP for you.
> Searching for SOP, I find <https://en.wikipedia.org/wiki/Same-origin_policy>.
> What were you referring to here?
>
>>   It's for giving everyone the option to change the SOP for themselves with minimal politics.
> What are these changes you're referring to?
>
>>> what you would like to bootstrap?
>> All binaries related to creating a GNU/Linux distribution, such that I can reproduce an exact
>> OS, Racket installation, and Xiden instance. I want a trusted initial state on GNU/Linux.
>>
>> To be clear, I don't need to do this for functional reasons. Xiden's already operational. I
>> just can't claim that you can trust a given Xiden instance with the same confidence as a
>>   Guix instance right now.
> If you want to get package definitions from guix, take a look at (guix inferior).
> Maybe you could port the relevant code of (guix inferior) to Racket, to let Xiden
> talk to Guix?   In particular, 'inferior-eval' sends an S-exp to the inferior Guix,
> which is evaluated there, and the result is sent back.
>
> Greetings,
> Maxime.



      reply	other threads:[~2021-08-24 17:17 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-21 16:43 How did you handle making a GNU/Linux distribution? Sage Gerard
2021-08-21 21:18 ` Leo Famulari
2021-08-22 21:53   ` Sage Gerard
2021-08-22 22:54     ` Philip McGrath
2021-09-13  3:09       ` Christine Lemmer-Webber
2021-10-02  3:32         ` Philip McGrath
2021-10-02 12:59           ` Christine Lemmer-Webber
2021-08-23 10:43 ` Maxime Devos
2021-08-23 12:48   ` Sage Gerard
2021-08-23 15:38 ` zimoun
2021-08-23 17:30   ` Philip McGrath
2021-08-24 10:24     ` zimoun
2021-08-23 18:24   ` Sage Gerard
2021-08-23 19:23     ` Ryan Prior
2021-08-23 20:00       ` Sage Gerard
2021-08-24 16:42     ` Maxime Devos
2021-08-24 17:17       ` Sage Gerard [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://guix.gnu.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=adfa1d2d-23c6-5831-4ecc-349046703e6d@sagegerard.com \
    --to=sage@sagegerard.com \
    --cc=guix-devel@gnu.org \
    --cc=maximedevos@telenet.be \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).