Как сделать файл SquashFS корневой файловой системой при загрузке iPXE?

4876
Emre Sevinç

У меня есть система, которая прекрасно работает как загрузочный сервер iPXE. Сейчас я пытаюсь заставить его использовать файл SquashFS в качестве корневой файловой системы вместо файловой системы NFS.

Текущая система использует конфигурацию iPXE следующим образом (показаны соответствующие строки), и она работает нормально:

:retry kernel http://$/installdcos/ubuntu_os/vmlinuz root=/dev/nfs nfsroot=$:/installdcos/ubuntu_os/nfsroot ro ip=dhcp BOOTIF=%(mac)s console=ttyS0,38400n8 console=ttyS1,9600n8 console=tty0 || goto retry initrd http://$/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://$/installdcos/ubuntu_os/vmlinuz root=/dev/nfs nfsroot=$:/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, что не совсем так, как в моем случае).

3

1 ответ на вопрос

2
Pat

For understanding what's going on you need to understand how Linux PXE boots.

  1. The kernel vmlinuz is transferred
  2. The initrd initrd.gz is transferred
  3. The kernel mounts initrd and starts its init script

initrd is an ultra-minimal Linux system containing the minimal functionality for connecting to (NFS) or retrieving (HTTP/CIFS) the "real" OS (in your case contained within ubuntu_os.squashfs), mounting it and finally "chrooting" into it.

A PXE ready init script is in charge of parsing the kernel variables, starting the net services, handling NFS, HTTP, CIFS, etc. In most of the cases a particular initrd.gz is not able to deal with all the protocols mentioned above then you need to "customize" your initrd.gz or to create a "complementary" initrd providing the missing features when needed.

In your case your init script still think it has to mount an NFS directory and not a file; then if you want to use NFS you should mount the directory where your ubuntu_os.squashfs is located and next mounting the ubuntu_os.squashfs file. THis of course means patching init (and/or its associated components)

If you do not mind offering ubuntu_os.squashfs on a CIFS share you can see what Serva does for PXE booting Ubuntu live distros; you will see there all the parameters for CIFS booting (I'm related to Serva development)

i.e. 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 
Я думаю, мне придется сделать что-то похожее на то, что описано на http://adam.younglogic.com/2012/03/shared-nothing-diskless-boot/ (я вообще не хочу NFS, я просто хочу получить файл squashfs во время загрузки PXE, смонтировать его в загруженной системе и заставить эту систему использовать его в качестве корневой файловой системы) Emre Sevinç 8 лет назад 0
забудьте об этой ссылке; если вы загружаете Ubuntu, просто посмотрите страницу Serva. взгляните на параметры, основанные на различных вариантах Ubuntu. Лучше всего использовать настройку Live-дистрибутива, создавая собственный `ubuntu_os.squashfs`, тогда вы сможете повторно использовать возможности дистрибутива PXE Pat 8 лет назад 0