Как сделать файл SquashFS корневой файловой системой при загрузке iPXE?
У меня есть система, которая отлично работает как загрузочный сервер iPXE. Теперь я пытаюсь заставить его использовать файл SquashFS в качестве корневой файловой системы вместо файловой системы NFS.
Текущая система использует конфигурацию iPXE следующим образом (показаны соответствующие строки), и она работает нормально:
:retry
kernel http://${next-server}/installdcos/ubuntu_os/vmlinuz root=/dev/nfs nfsroot=${next-server}:/installdcos/ubuntu_os/nfsroot ro ip=dhcp BOOTIF=%(mac)s console=ttyS0,38400n8 console=ttyS1,9600n8 console=tty0 || goto retry
initrd http://${next-server}/installdcos/ubuntu_os/initrd.gz || goto retry
boot || goto retry
Теперь вместо загруженной системы используйте /installdcos/ubuntu_os/nfsroot
как корневая файловая система, я хочу, чтобы она использовала одну SquashFS в качестве корневой файловой системы (я имею в виду, что система должна смонтировать ее, а затем использовать в качестве корневой файловой системы).
Для этого сначала я создал файл ubuntu_os.squashfs
который содержит содержимое nfsroot
использование каталога mksquashfs
, Тогда я разместил это ubuntu_os.squashfs
файл в /installdcos/ubuntu_os/nfsroot
каталог.
Теперь, в моей конфигурации iPXE, я хочу сказать: пожалуйста, получите ubuntu_os.squashfs
по сети подключите его как файловую систему SquashFS и используйте в качестве корневой файловой системы (чтобы вам больше не приходилось переходить через NFS для вызова команд, находящихся в корневой файловой системе).
Но когда я пытаюсь сделать следующее изменение для строки ядра в конфигурации:
kernel http://${next-server}/installdcos/ubuntu_os/vmlinuz root=/dev/nfs nfsroot=${next-server}:/installdcos/ubuntu_os/nfsroot/ubuntu_os.squashfs ro rootfstype=squashfs ip=dhcp BOOTIF=%(mac)s console=ttyS0,38400n8 console=ttyS1,9600n8 console=tty0 || goto retry
И выполнить загрузку iPXE с компьютера, он запускает процесс загрузки iPXE и после печати некоторых строк застревает при следующей ошибке:
Begin: Retrying nfs mount ... Begin: Running /scripts/nfs-premount ... done.
mount: Not a directory
done
Begin: Retrying nfs mount ... Begin: Running /scripts/nfs-premount ... done.
mount: Not a directory
done
Begin: Retrying nfs mount ... Begin: Running /scripts/nfs-premount ... done.
mount: Not a directory
done
Сообщение об ошибке имеет смысл, undeeed, /installdcos/ubuntu_os/nfsroot/ubuntu_os.squashfs
это не каталог.
Итак, какую комбинацию параметров и значений я должен написать для этой строки конфигурации ядра?
Я проверил документацию, такую как http://www.tldp.org/HOWTO/BootPrompt-HOWTO-3.html и https://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt, но не мог понять, какое магическое заклинание я должен передать ядру (и остальные учебники по загрузке SquashFS, которые я обнаружил, рассматривают операцию загрузки с диска, а не с PXE или с LiveCD, что не совсем так, как в моем случае).
2 ответа
Чтобы понять, что происходит, вам нужно понять, как загружается Linux PXE.
- Ядро
vmlinuz
переводится - Initrd
initrd.gz
переводится - Ядро монтирует initrd и запускает его
init
скрипт
initrd - это ультра-минимальная система Linux, содержащая минимальные функциональные возможности для подключения к (NFS) или извлечения (HTTP/CIFS) "настоящей" ОС (в вашем случае она содержится в ubuntu_os.squashfs
), монтируя его и, наконец, "закрепляя" в нем.
PXE готов init
скрипт отвечает за анализ переменных ядра, запуск сетевых служб, обработку NFS, HTTP, CIFS и т. д. В большинстве случаев конкретный initrd.gz
не в состоянии справиться со всеми протоколами, упомянутыми выше, тогда вам нужно "настроить" свой initrd.gz
или создать "дополнительный" initrd, предоставляющий недостающие функции при необходимости.
В вашем случае ваш init
скрипт все еще думает, что он должен монтировать каталог NFS, а не файл; тогда, если вы хотите использовать NFS, вы должны смонтировать каталог, где ваш ubuntu_os.squashfs
расположен и следующий монтаж ubuntu_os.squashfs
файл. Это конечно означает исправление init
(и / или связанные с ним компоненты)
Если вы не против предложить ubuntu_os.squashfs
на общем ресурсе CIFS вы можете увидеть, что Serva делает для загрузки PXE дистрибутивов Ubuntu Live; там вы увидите все параметры для загрузки CIFS (я связан с разработкой Serva)
т.е. Ubuntu LTS 14.04 Desktop Live
[PXESERVA_MENU_ENTRY]
asset = Ubuntu LTS 14.04 Desktop Live
platform = amd64
kernel = /NWA_PXE/$HEAD_DIR$/casper/vmlinuz
append = showmounts toram root=/dev/cifs initrd=/NWA_PXE/$HEAD_DIR$/casper/initrd.lz,/NWA_PXE/$HEAD_DIR$/casper/INITRD_N11.GZ boot=casper netboot=cifs nfsroot=//$IP_BSRV$/NWA_PXE_SHARE/$HEAD_DIR$ NFSOPTS=-ouser=serva,pass=avres,ro ip=dhcp ro
Если сценарии инициализации способны искать squshfs без дополнительных монтирований, должна быть возможность включить sqashfs в/как initrd.
в режиме pcbios это можно сделать, добавив его в качестве дополнительной строки initrd. Трудность состоит в том, чтобы знать, где его разместить, чтобы его могли найти сценарии инициализации.В документации iPXE в качестве примера показан модуль .ko.
в режиме EFI это становится немного сложнее, но последний iPXE также поддерживает перенос любого файла в заголовки cpio, но это немного другое.