Subject: Re: bug#22588: root: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY

From: Mark H Weaver <[email-masked]>
Date: Mon, 08 Feb 2016 08:49:24 -0500

[email-masked] (Ludovic Courtès) writes:

> Mark H Weaver <[email-masked]> skribis:
>
>> I've been bitten by this once before, and a user on #guix did as well.
>> When there are problems in the root filesystem that fsck doesn't want to
>> fix automatically, the user is dumped into a guile prompt where PATH is
>> not set, and it's very inconvenient to run fsck manually.
>
> AFAICS, ‘PATH’ is set in ‘base-initrd’ in (gnu system linux-initrd), and
> ‘check-file-system’ in (gnu build file-systems) indeed expects it to be
> set.

Ah, good!

>> This is what I just suggested that the user type, with apologies:
>>
>>   (use-modules (ice-9 ftw) (srfi srfi-26))
>>   (define dirs (scandir "/gnu/store" (cut string-suffix? "e2fsprogs-1.42.13" <>)))
>>   (define e2fsck (string-append "/gnu/store/" (car dirs) "/sbin/e2fsck"))
>>   (system* e2fsck "/dev/XXX")
>>
>> Is there a better way?
>
> I think one can run:
>
>   (system* "fsck.ext4" "/foo/bar")

Okay, this is much better than I expected.  I asked the user to try
running "e2fsck", and when it wasn't found in PATH, I incorrectly
assumed that PATH wasn't set.

> What about changing the message to explicitly mention this command?

Sure, that would be helpful.

>> Speaking from personal experience, it's very painful to do anything
>> non-trivial in that REPL.  Even just adding readline would help a lot.
>
> The statically-linked Guile in the initrd lacks Readline support.  We
> could maybe work around that, but the initrd would become much larger.

Okay, nevermind then.

>> We should probably also handle errors from fsck specially.
>
> Currently there’s no Bash in the initrd.  Should we add one?  Our
> ‘bash-static’ package takes 1.4 MiB (I don’t think we can make it
> smaller.)

I'm not sure it would help much without also adding 'coreutils'.
Adding busybox might be worth considering, though.

> Another idea that comes to mind: what about providing a “shell” language
> in Guile?  It would automatically tokenize what the user types in and
> convert it to (system* …), plus it would have a few built-in commands
> like ‘cd’ and ‘ls’.

I like the idea of having something like this in Guile, but I'm not sure
we should rush to implement a half-baked solution.  When we have
something decent along the lines of Scsh, then definitely!

IMO, anyway, but I don't feel strongly about it.

More thoughts?

    Thanks!
      Mark