我有一台安装 iSCSI 驱动器的 FreeBSD 10.2 服务器。我希望将这些驱动器自动安装在 fstab 中,以便它们在重新启动后保持不变。
如果我执行命令
mount /dev/da0p1 /mnt
它工作完美。
mount
/dev/ada0p2 on / (ufs, local, journaled soft-updates)
devfs on /dev (devfs, local, multilabel)
/dev/da0p1 on /mnt (ufs, local, soft-updates)
但是,如果我在/etc/fstab
系统中放置一个条目,则会停止其引导进程,并表示该条目/dev/dap1
无效。我假设这是因为网络和 iSCSI 服务尚未启动。
在我的/etc/fstab
文件系统中,我添加了“late”选项,但它没有任何效果。
# cat /etc/fstab
# Device Mountpoint FStype Options Dump Pass#
/dev/ada0p2 / ufs rw 1 1
/dev/ada0p3 none swap sw 0 0
#User Added Entries
#/dev/da0p1 /mnt ufs rw,late 3 3
发生的情况是,引导过程停止说“没有文件或目录 /dev/da0p1。如果我执行ls /dev/da*
该目录,就会显示出来。(见下图)
事实上,经过一些测试,如果我只等待几秒钟,然后在单用户模式下在提示符处键入“exit”,系统将继续启动并且驱动器会正常安装。
有没有办法设置 5 秒的延迟来允许创建 iscsi 设备,这样挂载就不会失败?
答案1
免责声明:我不知道这是否是正确的要做的事情,但这对我有用。
因此,我本质上需要在启动过程中花费一些额外的时间,以便网络服务可以完成加载,并且可以创建 iSCSI 挂载,以便可以挂载某些内容。
我所做的就是添加sleep 5
到/etc/rc.d/mountlate
脚本中。
# PROVIDE: mountlate
# REQUIRE: DAEMON
# BEFORE: LOGIN
# KEYWORD: nojail
. /etc/rc.subr
name="mountlate"
start_cmd="mountlate_start"
stop_cmd=":"
mountlate_start()
{
local err latefs
sleep 5 <-------- Added this line
# Mount "late" filesystems.
#
err=0
5秒对我来说似乎是一个不错的数字;您的里程可能会有所不同,并且您需要测试不同的值。
再次,我不知道这是否是解决这个特定问题的正确方法,如果有人有更好或正确的方法,请发布。
答案2
目前最好的解决方案(需要 FreeBSD 11.0+)似乎是:
- fstab 条目包含:
- “late”选项(不减慢启动过程)
- “failok”选项(在 iSCSI 连接错误的情况下不进入单用户模式)
- 转储/传递值设置为 0
- 将“-w 10”添加到 rc.conf 中的 iscsictl_flags 中,以便 iscsictl 将等待 iscsi 连接(最多 10 秒)
/etc/fstab:
/dev/PARTITION.journal /mnt ufs rw,async,failok,late 0 0
/etc/rc.conf:
iscsictl_enable="YES"
iscsictl_flags="-Aa -w 10"
iscsid_enable="YES"
PS:我不知道为什么,但我无法在 iSCSI 上使用 GPT 标签(它可以在创建时使用,但重新启动时标签位于此处 - 由“gpart show -l”显示 - 但在 /dev 中不可用/gpt/)。
答案3
我发现我不需要将 sleep 添加到 /etc/rc.d/mountlate 中。相反,我在 /etc/fstab 中将转储编号更改为 0,将 fsck 传递编号更改为 0。启动时不会运行 fsck,但已挂载分区:
/dev/da0p1 /opt ufs rw,late 0 0