AI摘要:实现PVE自动挂载局域网SMB服务,通过shell脚本和systemd服务,先ping检查目标服务器,再挂载SMB共享,并创建systemd服务自动执行。
Powered by AISummary.
一、我的应用场景
我的局域网内有一个ip为192.168.8.27的主机,并且该主机开启了smb服务,用户名为max,密码为123456,但是这个服务器不怎么开机,我还有另一个24小时开机的服务器(pve)。我想实现的是,当这个ip为192.168.8.27的主机开机时,我这个24小时开机的服务器能自动挂载smb服务,我尝试过好多方法,比如使用autofs或者systemctl automount都失败了,最后使用如下方法成功了。此方法适合所有debian系的操作系统。
二、具体想法
通过shell脚本和系统服务的方式来实现。
1.Ping 检查
- 在脚本中,使用
ping
命令循环检查目标服务器(即 IP 为192.168.8.27
的服务器)是否在线。只有当目标服务器响应ping
时,脚本才会继续执行挂载命令。 - 这意味着在目标服务器开机之前,挂载操作不会执行,因此避免了挂载失败的情况。
2.挂载 SMB 共享
- 一旦目标服务器可达,脚本使用
mount
命令挂载 SMB 共享,利用提供的凭据文件进行身份验证。
3.systemd
服务
- 通过创建一个 systemd 服务,使得这个挂载操作在系统启动时自动执行。服务被设置为在网络可用时启动,并在目标服务器可达时挂载共享。
4.动态挂载
- 此脚本的设计使得每次你需要访问 SMB 共享时,都会先检查目标服务器是否在线。这意味着,如果目标服务器未开机,访问挂载点将不会失败,而是会提示挂载未成功。
5.手动挂载
如果你发现挂载未成功(例如,目标服务器刚刚开机,但服务尚未完成初始化),你可以随时手动运行脚本或重新启动服务来尝试重新挂载:
systemctl start mount-smb.service
6.挂载点的状态
- 如果你尝试访问
/mnt/smbshare
时,目标服务器未开机或 SMB 服务未启动,你将看到一个错误,表明无法访问。这个错误是正常的,因为在目标服务器未开机或未提供服务时,挂载点是不可用的。
7.注意事项
延迟:
- 可能会有短暂的延迟,因为目标服务器需要一些时间来完全启动和初始化 SMB 服务。在这种情况下,如果你尝试访问挂载点而目标服务尚未完全可用,你可能会遇到访问错误。
三、实现过程
1. 安装必要的软件
首先,确保你已经安装了 cifs-utils
包,这是用于挂载 SMB/CIFS 共享的工具。
我是root用户登录的,所以不需要sudo命令,其他用户自行加上sudo
。
apt update
apt install cifs-utils
2. 创建挂载点
在你的24小时开机的服务器上创建一个挂载点,例如 /mnt/smbshare
:
mkdir -p /mnt/smbshare
3. 创建凭据文件
为了安全起见,使用一个凭据文件存储 SMB 的用户名和密码。创建一个文件并添加你的凭据:
nano /etc/samba/smb-creds
在文件中添加以下内容:
username=max
password=123456
确保仅限 root 用户读取这个文件:
chmod 600 /etc/samba/smb-creds
4.编写系统挂载脚本
创建一个 systemd
服务文件,来挂载 SMB 共享。首先,创建一个脚本文件:
nano /usr/local/bin/mount-smb.sh
在这个文件中添加以下内容:
#!/bin/bash
while ! ping -c 1 -n 192.168.8.27 &>/dev/null; do
sleep 3
done
mount -t cifs //192.168.8.27/share /mnt/smbshare -o credentials=/etc/samba/smb-creds,iocharset=utf8
其中 //192.168.8.27/share
是你想要挂载的共享名,/mnt/smbshare
是挂载点。
给予脚本可执行权限:
chmod +x /usr/local/bin/mount-smb.sh
5. 创建 systemd 服务
然后,创建一个 systemd
服务文件:
nano /etc/systemd/system/mount-smb.service
在文件中添加以下内容:
[Unit]
Description=Mount SMB Share
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/mount-smb.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
6. 启用服务
运行以下命令启用并启动服务:
systemctl enable mount-smb.service
systemctl start mount-smb.service
7. 验证挂载
你可以手动重启你的不常开机的服务器,看看启动后是否能够成功挂载 SMB 共享
真好呢