Вопрос или проблема
Предположим, у меня есть раздел 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 или обращаться за помощью к сообществу.