3

У меня есть система, которая прекрасно работает как загрузочный сервер 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, что не совсем так, как в моем случае).

1 ответ1

2

Чтобы понять, что происходит, вам нужно понять, как загружается Linux PXE.

  1. Ядро vmlinuz перенесено
  2. 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 в режиме реального времени; там вы увидите все параметры для загрузки 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .