Como faço para configurar o Raspberry Pi para inicializar com uma raiz NFS?

25

Como posso fazer meu Raspberry Pi usar um servidor NFS para o sistema de arquivos raiz, em vez do cartão SD?

Eu gostaria de poder configurar meu Raspberry Pi para ter seu sistema de arquivos raiz em uma máquina remota via NFS para fins de desempenho / backup / desenvolvimento. Como posso fazer isso?

Flexo
fonte
Muito obrigado pela dica para comentar #iface eth0 inet dhcp em (/ mnt / rpi-root / etc / network / interfaces). Sem essa alteração, não consegui minha primeira inicialização NFS em funcionamento por quase uma semana de tentativas. Não tinha lido esse boato em nenhum outro lugar. Muito obrigado

Respostas:

24

A versão curta

  1. Você precisa preparar uma raiz e exportá-la da máquina NFS
  2. Você precisa configurar a inicialização inicial para usar esse

Você ainda precisará de um cartão SD para a inicialização inicial, mas depois disso nada, exceto / boot, precisará do cartão SD.

Detalhes

Eu só fiz isso em uma máquina Linux. Em teoria, é possível em qualquer máquina que possa exportar sistemas de arquivos NFS.

  1. A maneira mais fácil de preparar um sistema de arquivos raiz é copiar o fornecido pelas imagens existentes. Eu usei a imagem oficial do Debian 6 como meu ponto de partida:

    1. Baixe a imagem, extraia o arquivo .zip. Agora você deve ter o debian6-19-04-2012.img em algum lugar
    2. Monte a partição raiz a partir dessa imagem usando um dispositivo de loopback. Você precisará do deslocamento na imagem para o início da partição raiz; nesse caso, é a segunda partição na imagem:

      fdisk -l debian6-19-04-2012.img
      
      Disco debian6-19-04-2012.img: 1949 MB, 1949999616 bytes
      4 cabeças, 32 setores / pista, 29754 cilindros, total de 3808593 setores
      Unidades = setores de 1 * 512 = 512 bytes
      Tamanho do setor (lógico / físico): 512 bytes / 512 bytes
      Tamanho de E / S (mínimo / ideal): 512 bytes / 512 bytes
      Identificador de disco: 0x000ee283
      
      
      Sistema de identificação de blocos finais de inicialização do dispositivo
      debian6-19-04-2012.img1 2048 155647 76800 c W95 FAT32 (LBA)
      debian6-19-04-2012.img2 157696 3414015 1628160 83 Linux
      debian6-19-04-2012.img3 3416064 3807231 195584 82 Linux swap / Solaris
      root @ rapunzel: / tmp / debian6-19-04-2012 # 
      

      A segunda partição inicia no bloco (ou setor) 157696, portanto, o deslocamento é (512 * 157696) = 80740352:

      Você pode usar o seguinte comando: root / rapunzel: / tmp / debian6-19-04-2012 # mkdir / mnt / pi-root-loop
      Você pode usar o seguinte comando: root-rapunzel: / tmp / debian6-19-04-2012 # mount -o loop, offset = 80740352 /tmp/debian6-19-04-2012/debian6-19-04-2012.img / mnt / pi-root- laço
      Você pode usar o seguinte comando: root / rapunzel: / tmp / debian6-19-04-2012 # ls / mnt / pi-root-loop
      bin Desktop etc lib mnt proc sbin selinux sys usr
      boot dev home media opt raiz sd srv tmp var
      root @ rapunzel: / tmp / debian6-19-04-2012 #
      
    3. Com a imagem montada, você provavelmente deseja copiar isso em algum lugar mais permanente para evitar o uso permanente do dispositivo de loopback. Criei um volume LVM2 e montei-o em / mnt / rpi-root, então fiz:

      cp -rav / mnt / loop-raiz-pi / * / mnt / raiz-rpi /
      
    4. Precisamos exportar o sistema de arquivos agora, portanto, precisamos adicionar uma linha como:

      / mnt / rpi-root 192.168.1.2 (rw, no_root_squash)
      

      para / etc / exportações no servidor NFS, onde 192.168.1.2 é o endereço do Raspberry Pi. Depois de adicionar essa execução exportfs -rv, leia novamente a lista de exportações. (Consulte exportações (5) para opções mais avançadas, incluindo curingas / sub-redes em vez de hosts individuais)

    Como alternativa, você pode pular esta etapa e criar um sistema de arquivos raiz do zero usando algo parecido multistrap.

  2. Agora precisamos construir um cartão SD que faça a inicialização inicial e inicialize usando esse compartilhamento NFS. Eu fiz isso pegando a primeira partição da imagem oficial e copiando-a para um cartão SD, onde o cartão SD é / dev / sdx:

    dd if = / tmp / debian6-19-04-2012 / debian6-19-04-2012.img de = / dev / sdx bs = 512 count = 155647
    

    e, como isso só copiou a primeira partição, editando a tabela de partições com o fdisk para excluir as duas partições que não copiamos.

    Depois montei a partição do cartão SD e editei o arquivo cmdline.txt para ler:

    dwc_otg.lpm_enable = 0 console = ttyAMA0,115200 kgdboc = ttyAMA0,115200 console = tty1 root = / dev / nfs nfsroot = 192.168.1.1: / mnt / rpi-root ip = dhcp rootfstype = nfs
    

    onde 192.168.1.1 é o endereço do servidor NFS. Se você não quiser usar o DHCP, poderá definir formas alternativas de endereço IP, consulte este documento para obter mais detalhes.

    Feito isso, desmonte o cartão SD e inicie o Rapsberry Pi com uma raiz NFS. Você também pode manipular o sistema de arquivos do lado do servidor ou outros clientes NFS como desejar (por exemplo, QEMU + binfmt_misc , instantâneos LVM, sistemas de backup etc.)

Coisas opcionais

  • Definir RAMRUN e RAMLOCK como yes em / etc / default / rcS faz com que / var / run e / var / lock sejam montados respectivamente como tmpfs (por exemplo, ramdisk) - isso provavelmente vale a pena, mesmo que você tenha apenas um dispositivo inicializando no Sistema de arquivos NFS.
  • Se você estiver usando ip = dhcp, provavelmente precisará comentar a linha:

    #iface eth0 inet dhcp
    

    em / etc / network / interfaces (/ mnt / rpi-root / etc / network / interfaces) para evitar uma situação em que a troca entre o DHCP de inicialização antecipada e a habitual posterior cause uma mensagem como:

    nfs: o servidor 192.168.1.1 não está respondendo, ainda está tentando

  • Se você deseja inicializar muitos dispositivos da mesma raiz, precisará fornecer um "local" / tmp (provavelmente tmpfs) e outras sutilezas para evitar problemas com várias máquinas tentando gravar nos mesmos arquivos.

Flexo
fonte
obrigado por este tutorial detalhado. Eu estava trabalhando perfeitamente com a última imagem. Agora, quando tentei seguir exatamente os mesmos passos para a nova imagem lançada há dois dias, me deparei com o erro. A verificação do sistema de arquivos raiz falha com o seguinte erro: fsck.ext4: Não existe esse dispositivo ou endereço ao tentar abrir / executar / rootdev Possivelmente dispositivo inexistente ou de troca? fsck morreu com status de saída 8 Alguma sugestão? Klaus
Não tenho acesso a um dispositivo para verificar agora. Parece que o kernel pode ser construído sem o suporte root nfs.
Flexo
11
Parece que encontrei a solução. Alterei o padrão fstab: proc / proc proc 0 0 / dev / mmcblk0p1 / boot vfat default 0 2 # / dev / mmcblk0p2 / ext4 default, noatime 0 1 A questão é por que costumava trabalhar com a imagem anterior. Apenas falhou na execução: S05checkroot.sh. BTW: Você tem alguma idéia de como gerenciar a partição de troca? Nós precisamos disso?
É possível meia-bunda e apenas NFS a coisa toda? ie exportações de host /home/user/Documents/raspisRootFoldere cliente fstabapenas monta a coisa toda /?
puk 24/10
Ótima resposta, me livrou de um cartão SD com falha; mudou tudo para o meu servidor NAS. Eu também comentada /dev/mmcblk0p2 / ext4 defaults,noatime 0 1a partir /etc/fstab, embora eu acho que seria um fracasso, sem causar problemas se você deixá-lo em.
TomG