我希望能够设置Raspberry Pi使其根文件系统处于打开状态通过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
评论
非常感谢您从(/ mnt / rpi-root / etc / network / interfaces)中注释掉#iface eth0 inet dhcp的技巧。没有该更改,将近一个星期的时间我无法获得我的第一个正常运行的NFS引导。在其他任何地方都没有读过这个花絮。非常感谢