如何配置Raspberry Pi以NFS根启动?


25

如何使我的Raspberry Pi使用NFS服务器而不是SD卡作为根文件系统?

我希望能够通过NFS将Raspberry Pi设置为在远程计算机上拥有其根文件系统,以实现性能/备份/开发目的。我怎样才能做到这一点?


非常感谢您从(/ mnt / rpi-root / etc / network / interfaces)中注释掉#iface eth0 inet dhcp的技巧。没有该更改,将近一个星期的时间我无法获得我的第一个正常运行的NFS引导。在其他任何地方都没有读过这个花絮。非常感谢

Answers:


24

短版

  1. 您需要准备一个根并将其从NFS机器中导出
  2. 您需要配置早期启动才能使用

您仍然需要SD卡才能进行早期引导,但是之后,除了/ boot以外,什么都不需要SD卡。

细节

我仅在Linux机器上完成了此操作。从理论上讲,虽然可以在任何可以导出NFS文件系统的计算机上使用。

  1. 准备根文件系统的最简单方法是复制现有映像提供的文件系统。我以Debian 6官方图片作为起点:

    1. 下载图像,解压缩.zip文件。您现在应该在某处有debian6-19-04-2012.img
    2. 使用回送设备从该映像挂载根分区。您需要在映像中添加偏移量以作为根分区的开始,在这种情况下,它是映像中的第二个分区:

      fdisk -l debian6-19-04-2012.img
      
      磁盘debian6-19-04-2012.img:1949 MB,1949999616字节
      4个喷头,32个扇区/磁道,29754个气缸,总计3808593个扇区
      单位= 1 * 512的扇区= 512字节
      扇区大小(逻辑/物理):512字节/ 512字节
      I / O大小(最小/最佳):512字节/ 512字节
      磁盘标识符:0x000ee283
      
      
      设备启动开始端块ID系统
      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# 
      

      第二个分区从块(或扇区)157696开始,因此偏移量为(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-环
      root @ rapunzel:/ tmp / debian6-19-04-2012#ls / mnt / pi-root-loop
      bin桌面等lib mnt proc sbin selinux sys usr
      引导开发者家庭媒体选择root sd srv tmp var
      root @ rapunzel:/ tmp / debian6-19-04-2012#
      
    3. 挂载映像后,您可能希望将其复制到更永久的位置,以避免永远使用环回设备。我制作了一个LVM2卷并将其安装在/ mnt / rpi-root,所以我这样做了:

      cp -rav / mnt / pi-root-loop / * / mnt / rpi-root /
      
    4. 我们现在需要导出文件系统,因此我们需要添加以下行:

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

      到NFS服务器上的/ etc / exports中,其中192.168.1.2是Raspberry Pi的地址。添加完后,exportfs -rv重新读取导出列表。(有关更多高级选项,包括通配符/子网而不是单个主机,请参阅exports(5)

    您也可以跳过此步骤,并使用像这样从头开始构建根文件系统multistrap

  2. 现在,我们需要构建一个SD卡,以使用此NFS共享进行早期启动和引导。我通过将官方映像的第一个分区复制到SD卡(其中SD卡为/ dev / sdx)来实现此目的:

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

    然后,因为这仅复制了第一个分区,所以使用fdisk编辑分区表以删除两个我们没有复制的分区。

    之后,我从SD卡上安装了分区,并从中编辑了cmdline.txt文件以读取:

    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
    

    其中192.168.1.1是NFS服务器的地址。如果您不想使用DHCP,则可以设置IP地址的其他方式,请参阅本文档以获取更多详细信息。

    完成此操作后,您可以卸载SD卡并使用NFS根目录引导Rapsberry Pi。您还可以从服务器端或其他合适的NFS客户端操作文件系统(例如QEMU + binfmt_misc,LVM快照,备份系统等)。

可选的东西

  • 在/ etc / default / rcS中将RAMRUN和RAMLOCK设置为yes会使/ var / run和/ var / lock分别作为tmpfs(即ramdisk)挂载-这可能是值得的,即使您只有一个设备从NFS文件系统。
  • 如果您使用的是ip = dhcp,则可能需要注释掉该行:

    #iface eth0 inet dhcp
    

    在/ etc / network / interfaces(/ mnt / rpi-root / etc / network / interfaces)中,以避免在早期启动DHCP和通常的较晚启动DHCP之间进行交换导致出现如下消息的情况:

    nfs:服务器192.168.1.1没有响应,仍在尝试

  • 如果要从同一根目录引导许多设备,则需要注意提供“本地” / tmp(可能是tmpfs)和其他一些细微之处,以避免多台计算机尝试写入相同文件的问题。


感谢您的详细教程。我在最后一张图像上工作得很好。现在,当我尝试遵循两天前发布的新映像的完全相同的步骤时,遇到了错误。检查根文件系统失败,并显示以下错误:fsck.ext4:尝试打开/ run / rootdev时没有此类设备或地址可能不存在或交换设备?fsck死于退出状态8有什么建议吗?克劳斯

我现在无法使用任何设备进行检查。听起来好像没有nfs根支持就可以构建内核。
Flexo 2012年

1
似乎我已经找到了解决方案。我已经更改了fstab:proc / proc proc默认值0 0 / dev / mmcblk0p1 / boot vfat默认值0 2#/ dev / mmcblk0p2 / ext4默认值,noatime 0 1问题是为什么它以前用于以前的图像。它只是执行失败:S05checkroot.sh。顺便说一句:您是否知道如何管理交换分区。我们需要吗?

是否有可能半屁股而整个事情只是NFS?即。主机出口/home/user/Documents/raspisRootFolder和客户fstab只是将整个安装在/
2013年

很好的答案,使我摆脱了故障的SD卡;将整个内容移到我的NAS服务器上。我也注释掉/dev/mmcblk0p2 / ext4 defaults,noatime 0 1/etc/fstab,但我认为,如果你离开它,它会失败,而不会造成任何问题。
TomG
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.