iStoreOS 开机自动执行命令配置 ⚡

🚀 轻松实现系统启动时自动挂载NFS共享,关机时自动卸载


📖 目录导航


🎯 功能特点

本指南将帮助您在iStoreOS(基于OpenWrt)中配置开机自动挂载NFS共享的功能:

  • ✅ 开机自动挂载: 系统启动时自动挂载远程NFS共享
  • ✅ 关机自动卸载: 系统关闭时安全卸载NFS共享,避免数据损坏
  • ✅ 持久化配置: 重启后配置依然有效,无需手动干预
  • ✅ 状态检测: 自动检测NFS服务器可用性,智能处理连接问题
  • ✅ 日志记录: 完整的执行日志,方便排查问题
  • ✅ 灵活配置: 支持多个NFS共享和自定义挂载选项

📁 创建启动脚本

1. 创建启动脚本文件

使用以下命令创建并设置启动脚本:

1
2
3
4
5
6
7
8
# 创建启动脚本文件
touch /etc/init.d/mynfsmount

# 设置执行权限
chmod +x /etc/init.d/mynfsmount

# 验证文件创建成功
ls -la /etc/init.d/mynfsmount

2. 查看现有启动脚本

1
2
3
4
5
# 查看/etc/init.d目录下的所有启动脚本
ls -la /etc/init.d/

# 查看脚本权限确认设置正确
ls -la /etc/init.d/mynfsmount

⚙️ 脚本配置详解

编辑启动脚本内容

1
2
# 使用vi编辑器编辑脚本
vi /etc/init.d/mynfsmount

脚本内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/bin/sh /etc/rc.common
# OpenWrt初始化脚本标准开头

START=99
STOP=15
# 启动优先级:数字越大越晚启动,数字越小越晚停止

USE_PROCD=1
# 使用procd进程管理(OpenWrt推荐方式)

start_service() {
echo "🔄 开始挂载NFS共享..."

# 创建挂载点目录(如果不存在)
mkdir -p /mnt/nfs

# 检查NFS服务器是否可访问
if ping -c 1 -W 2 10.10.10.251 >/dev/null 2>&1; then
echo "✅ NFS服务器可达,开始挂载..."
# 挂载NFS共享(推荐使用NFSv3或v4指定版本)
mount -t nfs -o vers=3,nolock 10.10.10.251:/mnt/sata1-1 /mnt/nfs

# 检查挂载是否成功
if mountpoint -q /mnt/nfs; then
echo "✅ NFS挂载成功: /mnt/nfs"
echo "📁 共享内容预览:"
ls -la /mnt/nfs/ | head -5
else
echo "❌ NFS挂载失败,请检查权限和网络连接"
logger -t mynfsmount "NFS mount failed"
fi
else
echo "❌ NFS服务器不可达: 10.10.10.251"
logger -t mynfsmount "NFS server unreachable"
fi
}

stop_service() {
echo "🔄 开始卸载NFS共享..."

# 检查是否已挂载
if mountpoint -q /mnt/nfs; then
# 尝试正常卸载,失败时使用强制卸载
if ! umount /mnt/nfs 2>/dev/null; then
echo "⚠️ 正常卸载失败,尝试强制卸载..."
umount -f /mnt/nfs
fi
echo "✅ NFS卸载完成"
logger -t mynfsmount "NFS unmounted successfully"
else
echo "ℹ️ NFS未挂载,无需卸载"
fi
}

# 重启命令(可选)
restart() {
stop_service
sleep 2
start_service
}

🔧 脚本参数说明

参数 说明 建议值
START=99 启动优先级 99(最后启动)
STOP=15 停止优先级 15(较早停止)
USE_PROCD=1 使用procd进程管理 1(启用)
mount -t nfs NFS挂载命令 根据实际情况修改
-o vers=3,nolock NFS版本和选项 推荐指定版本

🔧 启用自启动服务

启用开机自启动

1
2
3
4
5
6
7
8
9
# 启用自启动服务
/etc/init.d/mynfsmount enable

# 检查是否启用成功
ls -la /etc/rc.d/ | grep mynfsmount

# 预期输出示例:
# S99mynfsmount -> ../init.d/mynfsmount
# K15mynfsmount -> ../init.d/mynfsmount

服务管理命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 手动启动服务
/etc/init.d/mynfsmount start

# 手动停止服务
/etc/init.d/mynfsmount stop

# 重启服务
/etc/init.d/mynfsmount restart

# 查看服务状态
/etc/init.d/mynfsmount status

# 禁用自启动(需要时)
/etc/init.d/mynfsmount disable

🧪 测试与验证

立即测试脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 首先停止服务(如果已运行)
/etc/init.d/mynfsmount stop

# 启动服务测试
/etc/init.d/mynfsmount start

# 检查挂载结果
df -h | grep nfs
mount | grep nfs

# 查看挂载点内容
ls -la /mnt/nfs/

# 检查系统日志
logread | tail -20

验证自启动功能

1
2
3
4
5
6
7
8
9
10
11
12
13
# 重启系统测试
reboot

# 重启后检查挂载
df -h | grep nfs
cat /proc/mounts | grep nfs

# 检查启动日志
logread | grep mynfsmount
logread | grep nfs

# 查看服务状态
/etc/init.d/mynfsmount status

系统日志监控

1
2
3
4
5
6
7
8
9
10
11
# 实时查看系统日志
logread -f

# 过滤NFS相关日志
logread | grep -i nfs

# 查看脚本执行日志
logread | grep mynfsmount

# 查看详细挂载信息
dmesg | grep nfs

🐛 故障排除

常见问题解决

  1. ❌ NFS服务器不可达

    1
    2
    3
    4
    5
    6
    7
    8
    # 测试网络连通性
    ping -c 3 10.10.10.251

    # 检查NFS服务端口
    nc -zv 10.10.10.251 2049

    # 检查防火墙设置
    iptables -L -n | grep 2049
  2. ❌ 挂载权限错误

    1
    2
    3
    4
    5
    6
    7
    8
    # 检查NFS导出权限
    showmount -e 10.10.10.251

    # 尝试使用不同挂载选项
    mount -t nfs -o vers=3,ro 10.10.10.251:/mnt/sata1-1 /mnt/nfs

    # 检查客户端NFS支持
    cat /proc/filesystems | grep nfs
  3. ❌ 挂载点忙无法卸载

    1
    2
    3
    4
    5
    6
    # 查找使用挂载点的进程
    lsof /mnt/nfs
    fuser -m /mnt/nfs

    # 强制卸载(谨慎使用)
    umount -l /mnt/nfs # 延迟卸载

调试脚本

1
2
3
4
5
6
7
8
# 启用详细调试模式
sh -x /etc/init.d/mynfsmount start

# 检查脚本语法
sh -n /etc/init.d/mynfsmount

# 查看系统启动日志
logread | grep "mynfsmount"

NFS连接测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 检查NFS服务器导出列表
showmount -e 10.10.10.251

# 手动测试挂载
mkdir -p /tmp/test_nfs
mount -t nfs -o vers=3 10.10.10.251:/mnt/sata1-1 /tmp/test_nfs

# 测试读写权限
touch /tmp/test_nfs/test_file
echo "test" > /tmp/test_nfs/test_file
cat /tmp/test_nfs/test_file

# 卸载测试目录
umount /tmp/test_nfs
rmdir /tmp/test_nfs

💡 高级技巧

多个NFS共享挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 在脚本中添加多个挂载点
start_service() {
# 创建多个挂载点
mkdir -p /mnt/nfs/{data,backup,media}

# 挂载多个NFS共享
mount -t nfs -o vers=3 10.10.10.251:/data /mnt/nfs/data
mount -t nfs -o vers=3 10.10.10.251:/backup /mnt/nfs/backup
mount -t nfs -o vers=3 10.10.10.252:/media /mnt/nfs/media
}

stop_service() {
# 卸载所有NFS共享
umount -f /mnt/nfs/data 2>/dev/null
umount -f /mnt/nfs/backup 2>/dev/null
umount -f /mnt/nfs/media 2>/dev/null
}

优化挂载选项

1
2
3
4
5
6
7
8
9
10
11
# 使用优化的挂载选项
mount -t nfs -o \
vers=3,\
rw,\
hard,\
timeo=600,\
retrans=2,\
nolock,\
noacl,\
async \
10.10.10.251:/mnt/sata1-1 /mnt/nfs

常用挂载选项说明:

  • vers=3: 指定NFSv3协议(兼容性更好)
  • rw/ro: 读写/只读模式
  • hard/soft: 硬挂载/软挂载(硬挂载更可靠)
  • timeo=n: 超时时间(十分之一秒)
  • retrans=n: 重试次数
  • nolock: 禁用文件锁(提高性能)
  • noacl: 禁用ACL(访问控制列表)
  • async: 异步写入(性能更好但风险略高)

开机延迟挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 在启动脚本中添加网络检测延迟
start_service() {
# 等待网络接口就绪
while ! ping -c 1 -W 1 8.8.8.8 >/dev/null 2>&1; do
echo "⏳ 等待网络连接..."
sleep 2
done

# 等待NFS服务就绪
local retry_count=0
while ! ping -c 1 -W 1 10.10.10.251 >/dev/null 2>&1; do
retry_count=$((retry_count+1))
if [ $retry_count -ge 10 ]; then
echo "❌ NFS服务器连接超时"
return 1
fi
echo "⏳ 等待NFS服务器响应... ($retry_count/10)"
sleep 3
done

# 执行挂载
mount -t nfs 10.10.10.251:/mnt/sata1-1 /mnt/nfs
}

状态检查与监控

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 创建状态检查脚本
cat > /usr/bin/check_nfs_status << 'EOF'
#!/bin/sh
# 检查NFS挂载状态

if mountpoint -q /mnt/nfs; then
echo "✅ NFS挂载正常"
# 检查读写权限
if touch /mnt/nfs/.test_write 2>/dev/null; then
rm -f /mnt/nfs/.test_write
echo "✅ 读写权限正常"
else
echo "⚠️ 写权限受限"
fi
else
echo "❌ NFS未挂载"
# 尝试重新挂载
/etc/init.d/mynfsmount start
fi
EOF

chmod +x /usr/bin/check_nfs_status

# 添加到定时任务(每小时检查一次)
echo "0 * * * * /usr/bin/check_nfs_status" >> /etc/crontabs/root
/etc/init.d/cron restart

备份与恢复配置

1
2
3
4
5
6
7
8
9
10
11
# 备份启动脚本和配置
BACKUP_DIR="/root/nfs_mount_backup"
mkdir -p $BACKUP_DIR
cp /etc/init.d/mynfsmount $BACKUP_DIR/
cp /etc/rc.d/S*mynfsmount $BACKUP_DIR/ 2>/dev/null || true
ls -la $BACKUP_DIR/

# 恢复配置
cp $BACKUP_DIR/mynfsmount /etc/init.d/
chmod +x /etc/init.d/mynfsmount
/etc/init.d/mynfsmount enable

💡 专业提示:

  • 建议在生产环境使用前充分测试脚本功能
  • 使用 mount -t nfs -o vers=3 指定NFS版本提高兼容性
  • 定期检查系统日志确保挂载正常运作
  • 考虑添加监控脚本定期检查NFS连接状态
  • 重要数据建议使用硬挂载(hard)模式确保数据完整性

通过本指南,您应该能够在iStoreOS中成功配置NFS共享的自动挂载功能。如有问题,请参考故障排除部分或查看系统日志获取详细信息。🎉