Guix: Как установить одну (файловую систему) в качестве зависимости от другой? Или смонтировать одно устройство перед корневым?

Вопрос или проблема

Предположим, у меня есть раздел LUKS, который шифрует файловую систему корня и чий ключ находится в другой файловой системе.

(mapped-devices (list
    (mapped-device
        (type (luks-device-mapping-with-options #:key-file "/early-mount/luks-key"))
        (source "/dev/sda1")
        (target "operating-system")
    )
))

Как я могу указать Guix через файл config.scm смонтировать вторую файловую систему до шага расшифровки LUKS?

Попытка №1

Я пытался установить (needed-for-boot? #t) для второй файловой системы, но при проверке сгенерированного скрипта initrd он все еще пытается расшифровать до монтирования.

(file-system
    (mount-point "/early-mount")
    (device (file-system-label "early-mount"))
    (type "ext4")
    (needed-for-boot? #t) ; Это не перемещает его к #:pre-mount
)

Попытка №2

Также пытался установить зависимость файловой системы корня через (filter) и (file-system-mount-point-predicate), но я получаю ошибку:

ошибка: файловые системы: необъявленная переменная

что имеет смысл, так как это находится в процессе определения (file-systems)

(file-systems (cons*
    ; ...
    (file-system
        (mount-point "/")
        (device "/dev/mapper/operating-system")
        (type "ext4")
        (dependencies (cons*
            (filter
                (file-system-mount-point-predicate "/early-mount")
                file-systems ; Это в данный момент определяется, поэтому еще недоступно
            )
            mapped-devices
        ))
    )
))

Попытка №3

Пробовал создать локальную переменную через (let) для второй файловой системы с намерением вставить её как под (file-systems), так и под (dependencies), но я получаю ошибку:

лишние инициализаторы полей (let)

(let (
    (early-mount
        (file-system
            (mount-point "/early-mount")
            (device (file-system-label "early-mount"))
            (type "ext4")
            (needed-for-boot? #t)
        )
    )
))

Ответ или решение

Как установить одну файловую систему в качестве зависимости другой в Guix

Ваша задача заключается в том, чтобы убедиться, что второй файловой системе (которая содержит ключ для расшифровки основного корневого раздела, защищенного с помощью LUKS) был предоставлен доступ до процесса расшифровки. На практике это требует правильной настройки конфигурационного файла config.scm в системе Guix.

1. Основные понятия

Для начала стоит отметить, что корректная настройка зависимости требует понимания структуры и функциональности файловых систем в Guix. Каждый элемент, такой как файловая система или задание, может иметь свои зависимости, и нам нужно правильно указать порядок их монтирования.

Таким образом, для вашей ситуации мы хотим:

  • Смонтировать файловую систему, содержащую ключ LUKS, раньше чем будет попытка расшифровки основного раздела.

2. Разделение конфигурации

Разберем шаги, которые вам стоит предпринять для достижения этого:

Определение файловой системы и зависимостей

В вашем файле конфигурации config.scm, вам нужно будет сделать следующее:

(use-modules (file-systems))

(define early-mount 
  (file-system
    (mount-point "/early-mount")
    (device (file-system-label "early-mount")) 
    (type "ext4")
    (needed-for-boot? #t)))

(define mapped-devices 
  (list 
    (mapped-device
      (type (luks-device-mapping-with-options #:key-file "/early-mount/luks-key"))
      (source "/dev/sda1")
      (target "operating-system"))))

; Определяем файловые системы
(file-systems
 (list
   early-mount ; Монтируем сначала
   (file-system
     (mount-point "/")
     (device "/dev/mapper/operating-system")
     (type "ext4")
     (dependencies (list early-mount mapped-devices)) ; Указываем зависимости
   )
 ))

3. Устранение ошибок

Если вы получали ошибки типа "unbound variable" или "extraneous field initializers", это может произойти из-за неправильного использования переменных или из-за того, что переменные определяются в разное время. Поэтому ключевым моментом является сначала определить все необходимые элементы, а затем использовать их в основном блоке.

  • Используйте переменные, такие как early-mount, в явном порядке, чтобы избежать неопределенных ссылок.
  • Убедитесь, что переменные объявлены в нужном контексте и доступны для других частей вашего кода.

4. Автоматизация и проверка

После внесения этих изменений, вам стоит собрать образ системы, выполнив команду:

guix system reconfigure /path/to/your/config.scm

Затем проверьте, что все файловые системы монтируются в нужном порядке. Это можно сделать, взглянув на логи загрузки или воспользовавшись утилитами для просмотра текущих точек монтирования.

Заключение

Установка зависимостей между файловыми системами в Guix требует аккуратности и понимания порядка выполнения. Верное определение зависимостей и этапов монтирования позволит вам избежать проблем с доступом к ключам при загрузке системы. Если вы столкнулись с трудностями, не стесняйтесь исследовать документацию Guix или обращаться за помощью к сообществу.

Оцените материал
Добавить комментарий

Капча загружается...