Как сделать файл 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.

  1. Ядро vmlinuz переводится
  2. Initrd initrd.gz переводится
  3. Ядро монтирует 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, но это немного другое.

Другие вопросы по тегам