¿Cómo configuro Raspberry Pi para arrancar con una raíz NFS?

25

¿Cómo puedo hacer que mi Raspberry Pi use un servidor NFS para el sistema de archivos raíz, en lugar de la tarjeta SD?

Me gustaría poder configurar mi Raspberry Pi para que tenga su sistema de archivos raíz en una máquina remota a través de NFS para fines de rendimiento / respaldo / desarrollo. ¿Cómo puedo hacer esto?

Flexografía
fuente
Muchas gracias por el consejo de comentar #iface eth0 inet dhcp desde (/ mnt / rpi-root / etc / network / interfaces). Sin ese cambio, no he podido obtener mi primer arranque NFS en funcionamiento durante casi una semana de intentarlo. No había leído ese dato en ningún otro lado. Muchas gracias

Respuestas:

24

La versión corta

  1. Debe preparar una raíz y exportarla desde la máquina NFS
  2. Debe configurar el arranque en la etapa inicial para usar ese

Aún necesitará una tarjeta SD para el arranque en la etapa inicial, pero después de eso, excepto / boot, necesitará la tarjeta SD.

Detalles

Solo he hecho esto en una máquina Linux. En teoría, es posible en cualquier máquina que pueda exportar sistemas de archivos NFS.

  1. La forma más fácil de preparar un sistema de archivos raíz es copiar el que proporcionan las imágenes existentes. He utilizado la imagen oficial de Debian 6 como punto de partida:

    1. Descargue la imagen, extraiga el archivo .zip. Ahora debería tener debian6-19-04-2012.img en alguna parte
    2. Monte la partición raíz de esa imagen usando un dispositivo de bucle invertido. Necesitará el desplazamiento en la imagen para el inicio de la partición raíz, en este caso es la segunda partición de la imagen:

      fdisk -l debian6-19-04-2012.img
      
      Disco debian6-19-04-2012.img: 1949 MB, 1949999616 bytes
      4 cabezas, 32 sectores / vía, 29754 cilindros, total 3808593 sectores
      Unidades = sectores de 1 * 512 = 512 bytes
      Tamaño del sector (lógico / físico): 512 bytes / 512 bytes
      Tamaño de E / S (mínimo / óptimo): 512 bytes / 512 bytes
      Identificador del disco: 0x000ee283
      
      
      Dispositivo Arranque Inicio Fin Bloques Id Sistema
      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 intercambio de Linux / Solaris
      root @ rapunzel: / tmp / debian6-19-04-2012 # 
      

      La segunda partición comienza en el bloque (o sector) 157696, por lo que el desplazamiento es (512 * 157696) = 80740352:

      root @ rapunzel: / tmp / debian6-19-04-2012 # mkdir / mnt / pi-root-loop
      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- lazo
      root @ rapunzel: / tmp / debian6-19-04-2012 # ls / mnt / pi-root-loop
      bin Escritorio, etc. lib mnt proc sbin selinux sys usr
      boot dev home media opt root sd srv tmp var
      root @ rapunzel: / tmp / debian6-19-04-2012 #
      
    3. Con la imagen montada, probablemente desee copiar esto en un lugar más permanente para evitar usar el dispositivo de bucle invertido para siempre. Hice un volumen LVM2 y lo monté en / mnt / rpi-root, así que hice:

      cp -rav / mnt / pi-root-loop / * / mnt / rpi-root /
      
    4. Necesitamos exportar el sistema de archivos ahora, por lo que debemos agregar una línea como:

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

      en / etc / exports en el servidor NFS, donde 192.168.1.2 es la dirección de Raspberry Pi. Después de agregar esa ejecución exportfs -rvpara volver a leer la lista de exportaciones. (Ver exportaciones (5) para opciones más avanzadas, incluidos comodines / subredes en lugar de hosts individuales)

    Alternativamente, puede omitir este paso y construir un sistema de archivos raíz desde cero utilizando algo como multistrap.

  2. Ahora necesitamos construir una tarjeta SD que inicie y arranque desde la etapa inicial utilizando este recurso compartido NFS. Hice esto al tomar la primera partición de la imagen oficial y copiarla en una tarjeta SD, donde la tarjeta SD es / dev / sdx:

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

    y luego ya que esto solo copió la primera partición editando la tabla de particiones con fdisk para eliminar las dos particiones que no copiamos.

    Después de eso, monté la partición desde la tarjeta SD y edité el archivo cmdline.txt para leer:

    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
    

    donde 192.168.1.1 es la dirección del servidor NFS. Si no desea utilizar DHCP, puede configurar la dirección IP de formas alternativas, consulte este documento para obtener más detalles.

    Una vez hecho esto, puede desmontar la tarjeta SD y arrancar su Rapsberry Pi con una raíz NFS. También puede manipular el sistema de archivos desde el lado del servidor u otros clientes NFS como mejor le parezca (por ejemplo, QEMU + binfmt_misc , instantáneas LVM, sistemas de respaldo, etc.)

Cosas opcionales

  • Establecer RAMRUN y RAMLOCK en yes en / etc / default / rcS hace que / var / run y / var / lock respectivamente se monten como tmpfs (es decir, ramdisk); esto probablemente valga la pena, incluso si solo tiene un dispositivo arrancando desde Sistema de archivos NFS.
  • Si está usando ip = dhcp, probablemente necesite comentar la línea:

    #iface eth0 inet dhcp
    

    en / etc / network / interfaces (/ mnt / rpi-root / etc / network / interfaces) para evitar una situación en la que el intercambio entre el inicio temprano de DHCP y el posterior habitual provoque un mensaje como:

    nfs: el servidor 192.168.1.1 no responde, sigue intentando

  • Si desea arrancar muchos dispositivos desde la misma raíz, deberá asegurarse de proporcionar un "local" / tmp (probablemente tmpfs) y otras sutilezas para evitar problemas con varias máquinas que intentan escribir en los mismos archivos.

Flexografía
fuente
Gracias por este detallado tutorial. Estaba trabajando perfectamente con la última imagen. Ahora, cuando intenté seguir exactamente los mismos pasos para la nueva imagen lanzada hace dos días, me encontré con el error. La comprobación del sistema de archivos raíz falla con el siguiente error: fsck.ext4: No existe tal dispositivo o dirección al intentar abrir / ejecutar / rootdev ¿Posiblemente no existe o intercambia el dispositivo? fsck murió con estado de salida 8 ¿Alguna sugerencia? Klaus
No tengo acceso a un dispositivo para verificar en este momento. Parece que el núcleo podría construirse sin soporte de raíz nfs.
Flexo
1
Parece que he encontrado la solución. He modificado fstab: proc / proc proc predeterminados 0 0 / dev / mmcblk0p1 / boot vfat predeterminados 0 2 # / dev / mmcblk0p2 / ext4 predeterminados, noatime 0 1 La pregunta es por qué solía funcionar con la imagen anterior. Simplemente no se pudo ejecutar: S05checkroot.sh. Por cierto: ¿Tienes alguna idea de cómo administrar la partición de intercambio? ¿Lo necesitamos?
¿Es posible medio asno y solo NFS todo? es decir. las exportaciones de host /home/user/Documents/raspisRootFoldery el cliente fstabsolo montan todo en /?
puk
Gran respuesta, me sacó de una tarjeta SD defectuosa; moví todo a mi servidor NAS. También comenté /dev/mmcblk0p2 / ext4 defaults,noatime 0 1desde /etc/fstab, aunque creo que fallaría sin causar ningún problema si lo dejas.
TomG