我的网络中有一些共享文件夹,我希望在 Raspberry Pi 2 启动后将其安装到其中。我已经编辑了我的/etc/fstab
,如果我手动运行mount -a
,我可以访问它们。我在互联网上找到了不同的“解决方案”,但似乎没有一个对我有用。
作为一个快速解决方案,我创建了一个脚本来安装这些卷(使用mount -a
)并将其添加到我的.bashrc
;因此,当我通过该用户连接时ssh
,我可以访问他们。
我尝试添加此脚本,/etc/network/if-up.d/
但它似乎不起作用。为什么这不起作用?哪种方法更好?
PS:我正在使用osmc
Raspbian 的一个版本(我不确定这是否只是带有“osmc”服务的 Raspbian 还是不同的发行版)。因此,当我运行 时uname -a
,我得到:
Linux osmc 4.2.1-1-osmc #1 SMP PREEMPT Wed Sep 23 17:57:49 UTC 2015 armv7l GNU/Linux
答案1
有时,弄清楚为什么应该起作用的机制不起作用比仅仅做你需要做的其他事情更多的工作防弹方式。
您希望在启动时挂载共享文件夹,但显然您必须等到网络启动(请注意,“网络”和“网络启动”往往是 WRT 启动服务中截然不同的两件事)。执行此操作的规范方法显然是通过ifup
或启动服务,该服务依赖于应该建立网络连接的服务(同样,与“网络”不同)。但我们已经确定,无论出于何种原因,这些机制在这种情况下都不可靠。
为了想出一个更加“防弹”的方法,我们需要将这个任务简化为最基本的元素,并诉诸于使用 shell 工具以基本的、根本的方式来处理这些元素。首先可以进行某种测试来确定网络是否正常,然后等待测试成功。
或者我们可以跳过该测试并只测试其本身的结果mount
,如果网络共享不可用,该测试将会失败。
#!/bin/bash
exec &> /var/log/mountshare.log
gap=3
attempts=40
while [ $attempts -gt 0 ]; do
mount -v /foo /bar
if [ $? -eq 0 ]; then break; fi
attempts=$(($attempts - 1))
sleep $gap
done
解释:
exec &> /var/log/mountshare.log
将此脚本的所有输出重定向到文件,覆盖任何以前的版本。这是一种 bashism,这就是为什么 shebang 线不简单#!/bin/sh
。然而,在普通的 Linux 系统上使用 bash 通常是一个安全的选择。gap
和的值attempts
意味着每三秒就会尝试一次,持续两分钟——足够的时间。如果您愿意,可以将间隙设置为 1。这是一项令人难以置信的小任务,实际上可以以一秒的间隔永远运行,而不会损害系统。该
mount
行是特定的(显然您需要自定义它)。由于您确切地知道自己想做什么,因此最好mount -a
并确保我们的测试更准确防弹。 如果您在 fstab 中有一个列表,您应该能够使用一个参数(设备路径或其他标识符),但同样,使用完整的、特定的命令很容易并且可以更好地满足这一要求防弹标准。该测试
if [ $? -eq 0 ]
检查 的退出状态mount
。成功时返回0;当失败时,它会返回一些其他值。请注意,在这种情况下, mount 将发出错误,并且此输出将最终出现在日志文件中。由于我们使用了-v
,当调用成功时它也会产生一条消息。接下来的两行减少计数器 (
attempts
) 并添加睡眠。 睡眠非常非常重要。不要在没有睡觉的情况下执行此操作。 如果没有这个,这就会从“一个实际上可以永远运行的令人难以置信的小任务”变成一个会占用大量处理器时间的任务。
要使用它,请将其放入,例如/usr/local/bin
。确保它拥有 root.root ( sudo chown root:root mountmyshare.sh
) 和可执行文件 ( chmod 755 mountmyshare.sh
)。如果您不希望将其放入,则可以将其放在任何地方,$PATH
因为无论如何我们都将使用绝对的、无懈可击的路径来调用它。
然后在顶部/etc/rc.local
:
/usr/local/bin/mountmyshare.sh &
这&
是至关重要的;它将其分叉到后台。我说过“把它放在顶部”,以防你那里有其他东西可能会搞砸。这不会搞砸任何其他事情。
虽然/etc/rc.local
这是一种遗留机制,但据我所知,它仍然在所有相当正常的 Linux 系统上的引导序列结束时运行。