Como posso fazer um arquivo SquashFS no sistema de arquivos raiz ao fazer uma inicialização do iPXE?

3

Eu tenho um sistema que funciona perfeitamente como servidor de inicialização do iPXE. Agora estou tentando fazer com que ele use um arquivo SquashFS como um sistema de arquivos raiz, em vez de um sistema de arquivos NFS.

O sistema atual usa a configuração do iPXE como segue (linhas relevantes mostradas), e está funcionando bem:

: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

Agora, em vez do sistema inicializado use /installdcos/ubuntu_os/nfsroot como o sistema de arquivos raiz, eu quero que ele use um único SquashFS como sistema de arquivos raiz (quero dizer, o sistema deve montá-lo e usá-lo como sistema de arquivos raiz) .

Para isso, primeiro criei um arquivo ubuntu_os.squashfs que contém o conteúdo do diretório nfsroot usando mksquashfs . Então coloquei esse arquivo ubuntu_os.squashfs no diretório /installdcos/ubuntu_os/nfsroot .

Agora, na minha configuração iPXE, quero dizer: por favor, obtenha a rede ubuntu_os.squashfs via, monte-a como um sistema de arquivos SquashFS e use-a como seu sistema de arquivos raiz (para que você não tenha acesso ao NFS novamente para chamar comandos que residem no sistema de arquivos raiz).

Mas quando eu tento a seguinte alteração para a linha kernel na configuração:

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

E faça uma inicialização do iPXE a partir de uma máquina, ele inicia o processo de inicialização do iPXE e, depois de imprimir algumas linhas, fica preso no seguinte erro:

  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

A mensagem de erro faz sentido, indeeed, /installdcos/ubuntu_os/nfsroot/ubuntu_os.squashfs não é um diretório.

Então, que tipo de parâmetro e combinação de valores devo escrever para essa linha de configuração do kernel?

Eu verifiquei a documentação como link e link , mas não consegui descobrir qual encantamento mágico eu deveria passar para o kernel (e o resto dos tutoriais de inicialização do SquashFS que encontrei considere a operação de inicialização a partir do disco, e não do PXE, ou fazendo-o LiveCD, que não é exatamente como no meu caso).

    
por Emre Sevinç 08.07.2015 / 14:09

1 resposta

2

Para entender o que está acontecendo, você precisa entender como o Linux PXE é inicializado.

  1. O kernel vmlinuz é transferido
  2. O initrd initrd.gz é transferido
  3. O kernel monta initrd e inicia seu init script

initrd é um sistema Linux ultramimal que contém a funcionalidade mínima para conectar (NFS) ou recuperar (HTTP / CIFS) o SO "real" (no seu caso, contido em ubuntu_os.squashfs ), montá-lo e finalmente "chrooting" "para dentro.

Um script init pronto para PXE é responsável por analisar as variáveis do kernel, iniciar os serviços de rede, manipular NFS, HTTP, CIFS, etc. Na maioria dos casos, um initrd.gz em particular não é capaz de lidar com todos os protocolos mencionados acima, então você precisa "personalizar" seu initrd.gz ou criar um initrd "complementar" fornecendo os recursos que faltam quando necessário.

No seu caso, seu script init ainda acha que tem que montar um diretório NFS e não um arquivo; então, se você quiser usar o NFS, deverá montar o diretório no qual o ubuntu_os.squashfs está localizado e, em seguida, montar o arquivo ubuntu_os.squashfs . Isso, é claro, significa remendar init (e / ou seus componentes associados)

Se você não se importar em oferecer ubuntu_os.squashfs em um compartilhamento CIFS, poderá ver o que Serva faz para o PXE inicializando distribuições ao vivo do Ubuntu; você verá todos os parâmetros para inicialização do CIFS (estou relacionado ao desenvolvimento do Serva)

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
    
por 08.07.2015 / 15:59