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

我希望能够设置Raspberry Pi使其根文件系统处于打开状态通过NFS的远程计算机,用于性能/备份/开发目的。我该怎么办?

评论

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

#1 楼

简短版本


您需要准备一个根并将其从NFS计算机中导出
您需要配置早期启动以使用该根文件

您仍然需要SD卡才能进行早期启动,但是之后/ boot便不需要SD卡。

详细信息

我只做完了在Linux机器上。从理论上讲,虽然可以在任何可以导出NFS文件系统的机器上使用它。



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


下载映像,解压缩.zip文件。现在,您应该在某处有debian6-19-04-2012.img

使用回送设备从该映像安装根分区。您需要在映像中提供偏移量以作为根分区的开始,在这种情况下,它是映像中的第二个分区:

fdisk -l debian6-19-04-2012.img

Disk debian6-19-04-2012.img: 1949 MB, 1949999616 bytes
4 heads, 32 sectors/track, 29754 cylinders, total 3808593 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000ee283


Device Boot      Start         End      Blocks   Id  System
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-loop
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  root  sd    srv      tmp  var
root@rapunzel:/tmp/debian6-19-04-2012#



安装了图像后,您可能希望将其复制到某个位置避免永久使用环回设备。我制作了一个LVM2卷并将其挂载到/ mnt / rpi-root,所以我这样做了:

cp -rav /mnt/pi-root-loop/* /mnt/rpi-root/



我们现在需要导出文件系统,因此我们需要在NFS服务器上的/ etc / exports中添加以下行:

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


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


您也可以跳过此步骤,并使用类似multistrap的内容从头开始构建根文件系统。 br />

现在,我们需要构建一个使用此NFS共享进行早期引导和引导的SD卡。为此,我将官方映像的第一个分区复制到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卡并使用以下命令启动Rapsberry Pi: NFS根目录。您还可以从服务器端或其他您认为合适的NFS客户端(例如QEMU + binfmt_misc,LVM快照,备份系统等)操纵文件系统。


可选内容


在/ etc / default / rcS中将RAMRUN和RAMLOCK设置为yes会使/ var / run和/ var / lock分别作为tmpfs(即ramdisk)挂载-这可能是值得的,即使您只有一个设备从NFS文件系统启动。

如果使用ip = dhcp,则可能需要注释掉以下行:

#iface eth0 inet dhcp

,以避免出现在早期启动DHCP和通常的较晚版本之间进行交换会导致出现以下消息的情况:


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


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


评论


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

–user1557
2012-09-20 17:47

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

–柔印
2012年9月20日18:21

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

–user1557
2012年9月20日18:36

是否有可能半屁股而整个事情只是NFS?即。主机导出/ home / user / Documents / raspisRootFolder,而客户端的fstab仅将整个文件挂载到/?

– puk
13-10-24在19:29

很好的答案,使我摆脱了故障的SD卡;将整个东西移到我的NAS服务器上。我还注释掉了/ dev / mmsblk0p2 / ext4默认值,/ etc / fstab中的noatime 0 1,尽管我认为如果将其保留下来,它将不会引起任何问题而失败。

– TomG
2014年1月19日20:31