linux-boot: Honour fsck.mode & fsck.repair.

* gnu/build/linux-boot.scm (boot-system): Honour ‘fsck.mode=’ and
‘fsck.repair=’ kernel command line options.
* doc/guix.texi (Initial RAM Disk): Document both.
This commit is contained in:
Tobias Geerinckx-Rice 2021-05-23 17:02:29 +02:00
parent 602994847b
commit a75a3d7132
No known key found for this signature in database
GPG key ID: 0DB0FF884F556D79
2 changed files with 63 additions and 28 deletions

View file

@ -33285,6 +33285,25 @@ name like @code{/dev/sda1}, a file system label, or a file system UUID.
When unspecified, the device name from the root file system of the
operating system declaration is used.
@item fsck.mode=@var{mode}
Whether to check the @var{root} file system for errors before mounting
it. @var{mode} is one of @code{skip} (never check), @code{force} (always
check), or @code{auto} to respect the root file-system object's 'check?'
setting (@pxref{File Systems}) and run a full scan only if the file system
was not cleanly shut down.
@code{auto} is the default if this option is not present or if @var{mode}
is not one of the above.
@item fsck.repair=@var{level}
The level of repairs to perform automatically if errors are found in the
@var{root} file system. @var{level} is one of @code{no} (do not write to
@var{root} at all if possible), @code{yes} (repair as much as possible),
or @code{preen} to repair problems considered safe to repair automatically.
@code{preen} is the default if this option is not present or if @var{level}
is not one of the above.
@item --system=@var{system}
Have @file{/run/booted-system} and @file{/run/current-system} point to
@var{system}.

View file

@ -541,21 +541,36 @@ (define (device-string->file-system-device device-string)
(mount-essential-file-systems)
(let* ((args (linux-command-line))
(to-load (find-long-option "--load" args))
(root-fs (find root-mount-point? mounts))
(root-fs-type (or (and=> root-fs file-system-type)
"ext4"))
(root-fs-device (and=> root-fs file-system-device))
(root-fs-flags (mount-flags->bit-mask
(or (and=> root-fs file-system-flags)
'())))
(root-options (if root-fs
(file-system-options root-fs)
#f))
;; --root takes precedence over the 'device' field of the root
;; <file-system> record.
(root-device (or (and=> (find-long-option "--root" args)
device-string->file-system-device)
root-fs-device)))
;; If present, --root on the kernel command line takes precedence
;; over the device field of the root <file-system> record.
(root-device (and=> (find-long-option "--root" args)
device-string->file-system-device))
(root-fs (or (find root-mount-point? mounts)
;; Fall back to fictitious defaults.
(file-system (device (or root-device "/dev/root"))
(mount-point "/")
(type "ext4"))))
(fsck.mode (find-long-option "fsck.mode" args)))
(define (check? fs)
(match fsck.mode
("skip" #f)
("force" #t)
(_ (file-system-check? fs)))) ; assume "auto"
(define (skip-check-if-clean? fs)
(match fsck.mode
("force" #f)
(_ (file-system-skip-check-if-clean? fs))))
(define (repair fs)
(let ((arg (find-long-option "fsck.repair" args)))
(if arg
(match arg
("no" #f)
("yes" #t)
(_ 'preen))
(file-system-repair fs))))
(when (member "--repl" args)
(start-repl))
@ -611,23 +626,24 @@ (define (device-string->file-system-device device-string)
(if root-device
(mount-root-file-system (canonicalize-device-spec root-device)
root-fs-type
(file-system-type root-fs)
#:volatile-root? volatile-root?
#:flags root-fs-flags
#:options root-options
#:check? (if root-fs
(file-system-check? root-fs)
#t)
#:flags (mount-flags->bit-mask
(file-system-flags root-fs))
#:options (file-system-options root-fs)
#:check? (check? root-fs)
#:skip-check-if-clean?
(and=> root-fs
file-system-skip-check-if-clean?)
#:repair (if root-fs
(file-system-repair root-fs)
'preen))
(skip-check-if-clean? root-fs)
#:repair (repair root-fs))
(mount "none" "/root" "tmpfs"))
;; Mount the specified file systems.
(for-each mount-file-system
;; Mount the specified non-root file systems.
(for-each (lambda (fs)
(mount-file-system fs
#:check? (check? fs)
#:skip-check-if-clean?
(skip-check-if-clean? fs)
#:repair (repair fs)))
(remove root-mount-point? mounts))
(setenv "EXT2FS_NO_MTAB_OK" #f)