Linux远程挂载NFS、硬盘、ISCSI等并设置 开机自启动脚本

一、NFS部署

1)部署和目录设计

NFS挂载目录:/mnt/nfs

seafile程序目录:/opt/seafile

seafile Data目录:/opt/seafile/seafile-data –> /mnt/nfs/seafile-data


服务端支持linux和windows两种操作系统,本文的选择是ubuntu 20.4 x64seafilepro 8.0.15。

2)配合NFS实现文件共享

1、修改NFS配置文件

1
2
[root@nfs res1]# vim /etc/exports
/web/upload 172.16.1.0/20(rw,sync,all_squash,anonuid=666,anongid=666)

2、创建挂载点

1
2
[root@nfs res1]# mkdir /web/upload
[root@nfs res1]# chown www.www /web/upload

3、重启NFS
[root@nfs res1]]# systemctl restart nfs-server rpcbind

4、客户端安装NFS软件

1
2
3
[root@web01 html]# yum install nfs-utils -y
[root@web02 html]# yum install nfs-utils -y
[root@web03 html]# yum install nfs-utils -y

5、挂载

1
2
3
[root@web01 html]# mount -t nfs 172.16.1.31:/web/upload /var/www/html/upload
[root@web02 html]# mount -t nfs 172.16.1.31:/web/upload /var/www/html/upload
[root@web03 html]# mount -t nfs 172.16.1.31:/web/upload /var/www/html/upload

3)安装nfs-common,加入开机自动挂载

安装nfs client,添加开机启动,保证重启后挂载仍然生效,然后挂载NFS

1
2
3
4
apt install nfs-common
mkdir -p /mnt/nfs
echo "192.168.55.120:/seafile /mnt/nfs nfs defaults 0 0" >> /etc/fstab
mount /mnt/nfs

二、ISCIS部署

三、开机自动挂载方案总结:

(一) /etc/rc.d/rc.local 方式

1
2
3
{% note info %}
#### 1、设置 rc.local 的可执行权限
{% endnote %}
1
chmod +x /etc/rc.d/rc.local

2、创建待执行的脚本,如下:

1
2
3
4
# cat /home/test.sh
#!/bin/bash
echo "hello world" >> /home/out.txt
date >> /home/out.txt

3、设置脚本的可执行权限

1
# chmod +x /home/test.sh

4、把脚本放到 /etc/rc.d/rc.local 尾部

1
2
3
# cat /etc/rc.d/rc.local
...
/home/test.sh

5、重启系统使之生效

1
# reboot

6、查看日志文件判断脚本是否执行

1
2
3
# cat /home/out.txt
hello world
Thu Dec 30 20:45:00 CST 2021

有关 /etc/rc.d/rc.local 执行时机如下:

img

(二) /etc/init.d/xxx.sh 方式

1
2
3
4
5
6
7
8
9
10
11
12
13
#! /bin/sh

### BEGIN INIT INFO
# Provides: samba-ad-dc
# Required-Start: $network $local_fs $remote_fs
# Required-Stop: $network $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Samba daemons for the AD DC
# Description: Meta-service to provide AD and SMB/CIFS services to clients
### END INIT INFO
//这下面就是你放命令的地方
mount -t ntfs /dev/sda1 /home/ubuntu -o iocharset=utf8,umask=0

改权限

1
chmod 755 /etc/init.d/usbw.sh

加入开机启动,数字约大,执行优先级约低

1
update-rc.d usbw.sh defaults 90

移除Ubuntu开机脚本

1
pdate-rc.d -f usbw.sh remove

(三)systemd service 服务启动

3.1 rc-local.service

3.1.1 rc-local.service 简介

Linux中的rc-local服务是一个开机自动启动的,调用开发人员或系统管理员编写的可执行脚本或命令的,它的启动顺序是在系统所有服务加载完成之后执行。

ubuntu20.04系统已经默认安装了rc-local.service服务,但是不知什么原因系统把这个服务给“隐蔽”了,所以如果不做一番操作是无法使用的。

3.1.2 配置 rc-local.service

rc-local服务设置为开机自启动(本文操作都在root用户下,或使用sudo)。

首先将rc-local.service文件复制到system目录下

1
cp /usr/lib/systemd/system/rc-local.service /etc/systemd/system/

Systemd 服务是一种以 .service 结尾的单元(unit)配置文件,用于控制由 Systemd 控制或监视的进程。简单说,用于后台以守护进程(daemon)的形式运行程序。systmd service 文件一般放在/etc/systemd/system/文件夹中。

或者采用如下模板:

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
//在/etc/systemd/system/下创建一个服务,如下
# vim ser.service

//[Unit] 区块:启动顺序与依赖关系。
[Unit]
//Description字段给出当前服务的简单描述
Description=Run a Custom Script at Startup
After=default.target

//Service区块定义如何启动当前服务
[Service]
//ExecStart字段:定义启动进程时执行的命令
ExecStart=/home/test.sh

//Install区块,定义如何安装这个配置文件,即怎样做到开机启动
[Install]
//WantedBy字段:表示该服务所在的 Target,Target的含义是服务组,表示一组服务
WantedBy=default.target


//更新服务配置文件,并使能服务
# systemctl daemon-reload
# systemctl enable ser.service

//重启系统
# reboot

新建rc.local文件

大家不用奇怪,ubuntu20.04/etc/目录下是没有rc.local文件的,需要我们手动建立一个。

1
2
3
touch /etc/rc.local
chmod 755 /etc/rc.local
echo '''#!/bin/bash''' >> /etc/rc.local

设置开机启动rc-local

1
2
systemctl start rc-local
systemctl enable rc-local

重启系统后,通过命令systemctl status rc-local查看服务已经正常开启了。

3.在rc.local中添加你开机需要自动执行的脚本

至此,你就可以在rc.local文件中添加你想添加的开机自启动脚本了。

3.1.3 Ubuntu 中启用 rc-local.service

Ubuntu 20.04

编辑 rc-local.service

1
vi /lib/systemd/system/rc-local.service

在最下面添加

1
2
[Install]
WantedBy=multi-user.target

检查 /etc/rc.local 文件是否存在

1
cat /etc/rc.local

不存在时则创建,rc.local 实际为脚本文件,因此需要在顶部添加 #!/bin/bash

1
2
vi /etc/rc.local
chmod 755 /etc/rc.local

启用服务

1
systemctl enable rc-local

Ubuntu 18.04

编辑 rc.local.service

1
vi /lib/systemd/system/rc.local.service

在最下面添加

1
2
3
[Install]
WantedBy=multi-user.target
Alias=rc-local.service

启用服务

1
systemctl enable rc.local.service

创建 rc.local

1
2
touch /etc/rc.local
chmod 755 /etc/rc.local

rc.local 实际为脚本文件,因此需要在顶部添加 #!/bin/bash

将开机要执行的脚本或命令添加到 rc.local 即可

rc.local 文件内容:

1
2
#!/bin/bash
/home/ljh/Public/U_network/shell/test2.sh

test2.sh为开机运行的脚本

3.2 个性化systemd 实例

3.2.1 Example.service

  • 创建希望开机马上执行的脚本,本文举例脚本存放位置为 /home/tqh/Documents/Example/StartupScipt.sh,脚本内容如下:
1
2
3
#!/bin/sh
# 开机时在脚本的同级目录下创建一个名为 StartupTouch.txt 的文件
touch /home/tqh/Documents/Example/StartupTouch.txt
  • 开机执行的脚本需增加可执行权限才能被 systemd 运行,使用如下命令
1
2
chmod u+x /home/tqh/Documents/Example/StartupScipt.sh
chmod g+x /home/tqh/Documents/Example/StartupScipt.sh
  • 进入 systemd 放置 service 的目录,在该目录下可看到大量服务配置文件,命令如下
1
2
3
4
# 进入 systemd 的 service 目录
cd /etc/systemd/system
# 查看文件列表
ls -al
  • 在该目录创建一个新的 .service 文件用于配置开机启动脚本,本例中的文件名为 StartupExample.service,所执行命令和文件中的配置内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
# 创建服务配置文件
sudo touch /etc/systemd/system/StartupExample.service

# 以下为 StartupExample.service 配置文件的内容
[Unit]
Description=Startup Example

[Service]
ExecStart=/home/tqh/Documents/Example/StartupScipt.sh

[Install]
WantedBy=multi-user.target
  • 尝试手动运行新创建的 service,使用如下命令:
1
2
3
4
# 手动运行 StartupExample.service
sudo systemctl start StartupExample.service
# 查看运行日志
systemctl status StartupExample.service

img运行日志显示:服务启动成功

  • 查看服务中创建的文件是否创建成功,使用如下命令:
1
ls -al /home/tqh/Documents/Example/

img文件创建成功,证明服务配置已生效

  • 删除文件后将服务设置为 enable 状态,再重启计算机,看服务是否能正常运行。使用如下命令:
1
2
3
4
5
6
# 删除刚测试服务时创建的文件
rm -f /home/tqh/Documents/Example/StartupTouch.txt
# 设置服务为 enable 状态,使之能开机运行
sudo systemctl enable StartupExample.service
# 重启机器
systemctl reboot
  • 下图中能看到开机运行的脚本中 touch 的文件已经创建成功

img文件创建成功,证明开机运行的脚本已配置完成

3.2.2 启动 NFS 挂载服务

  • 创建启动 NFS 服务的脚本并为之增加可运行权限,操作如下
1
2
3
4
5
6
# 创建开机启动 Nextcloud 的脚本
touch /mnt/AutoMountSH/start_nfs.sh

# 为脚本增加可执行权限
chmod u+x /mnt/AutoMountSH/start_nfs.sh
chmod g+x /mnt/AutoMountSH/start_nfs.sh
  • 编辑脚本内容如下
1
2
#!/bin/sh
mount -t nfs 192.168.199.180:/volume2/NFS/Debian /root/Mount/nasNFS
  • 在 /etc/systemd/system 目录下新建服务描述文件 start-nfs.service,操作及文件内容如下
1
2
3
4
5
6
7
8
9
10
11
12
# 创建 systemd 使用的 service 描述文件
sudo touch /etc/systemd/system/start-nfs.service

# 以下为 Nextcloud.service 的文件内容
[Unit]
Description=AutoMount NFS Service

[Service]
ExecStart=/mnt/AutoMountSH/start_nfs.sh

[Install]
WantedBy=multi-user.target
  • 设置 start-nfs.service 为开机启动并重启计算机,操作如下
1
2
3
4
# 设置 start-nfs.service 为开机启动
sudo systemctl enable start-nfs.service
# 重启机器
sudo systemctl reboot
  • 重启后查看运行日志,所执行命令及其结果如下
1
2
# 查看 systemd 的运行日志
systemctl status start-nfs.service

执行失败:找不到脚本文件

根据日志中的报错信息,发现开机后 systemd 要执行 start-nfs.service 时找不到脚本。结合该文中加密硬盘阵列分区的使用方法,可疑的原因是启动服务时脚本所在的硬盘分区未挂载完成
解决的思路是等待分区挂载完成再执行启动 start-nfs服务的脚本。

  • 先找到挂载 /mnt/data 的服务,使用命令和运行结果如下
1
systemctl list-unit-files

img在 systemd 的 UNIT 列表中找到了 mnt-data.mount 的挂载操作

  • 使用文本工具修改start-nfs.service 文件,增加语句 “ After=mnt-data.mount ”保证硬盘分区的挂载操作先执行,修改后的文件如下
1
2
3
4
5
6
7
8
9
[Unit]
Description=Nextcloud Service
After=mnt-data.mount

[Service]
ExecStart=/mnt/AutoMountSH/start_nfs.sh

[Install]
WantedBy=multi-user.target
  • 重启计算机后查看 systemd 执行日志,使用命令和运行结果如下
1
2
3
4
# 重启机器
sudo systemctl reboot
# 查看 systemd 的运行日志
systemctl status start-nfs.service

至此, 开机启动 NFS自动挂载服务的配置操作已经完成。

附语

有很多特殊原因可能导致使用通用的 systemd 配置开机启动脚本方法时失败,建议使用 systemd 的 status 命令查看日志以定位问题。

1
systemctl status ***.service

(四)使用 crontab 方式

crond 是 linux 下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与 windows 下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动 crond 进程,crond 进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

因此我们可以使用 crondtab 命令创建一个任务,让该任务在重启时进行执行。

1
2
3
4
5
6
7
8
9
# crontab -e
//进入编辑,输入如下行
@reboot /home/test.sh
//重启设备
# reboot
//查看日志
# cat /home/out.txt
hello world
Thu Dec 30 21:09:03 CST 2021