Linux实战|NFS网络文件共享 + iSCSI块存储 + MariaDB数据库完整实操笔记
引言
本篇适合CentOS7运维入门同学。读完本篇博客你将掌握:
- NFS网络文件系统:理解NFS的C/S架构、RPC调用机制;部署NFS服务端、客户端挂载,掌握rw、no_root_squash等核心导出选项;
- iSCSI IP‑SAN块存储:分清文件存储与块存储;target服务端配置、initiator客户端发现登录磁盘,fstab持久挂载注意事项;
- MariaDB数据库基础:MariaDB部署加固、配置文件分层结构;SQL基础CRUD增删改查;数据库用户、权限管理;mysqldump逻辑备份、物理备份恢复;
NFS是文件级共享,iSCSI是块级裸磁盘;MariaDB是互联网主流关系型数据库。全部来自课堂实操,多台虚拟机就可以完成整套实验。
前置说明
✅环境:CentOS7虚拟机,root权限;建议准备2‑3台虚拟机,区分服务端、客户端、数据库主从节点; ✅前置知识:熟悉firewalld防火墙、vim编辑器、systemd服务管理;掌握基础Linux磁盘挂载知识; ✅新手友好:零基础可以跟着实操;晦涩概念搭配通俗比喻讲解。
💡代码块中
#后面是注释,不要复制输入终端。 ⚠️存储、数据库属于高危操作,实验只用测试虚拟机,不要在业务服务器随意做删除、覆盖操作!
一、NFS网络文件系统
比喻:NFS就像局域网里面的网络共享文件夹。服务端把本地目录共享出去,客户端把共享目录挂载到自己本地,读写起来和本地目录几乎一模一样。 NFS依赖RPC(远程过程调用):客户端通过RPC告诉服务端执行文件读写操作。
1.1 NFS简单优缺点
✅优点
- 对Linux/Unix生态兼容性极好,配置简单;
- 透明访问,挂载完成后普通命令直接操作,不需要特殊客户端工具;
- 支持权限UID/GID映射。
❌缺点
- NFSv3安全能力弱,没有原生加密;适合内网,不建议公网直接暴露;
- 强依赖网络,网络抖动会直接影响业务读写性能。
重要区分:NFS属于文件存储,客户端看到的是文件夹;iSCSI是块存储,客户端拿到的是一块裸硬盘。
1.2 NFS服务端部署
# 安装nfs服务软件包yuminstall-ynfs-utils# 创建共享目录,示例用于web业务,apache用户uid=48mkdir-p/shares/webappchown48/shares/webapp# 启动开机自启nfs‑serversystemctlenablenfs-server--now# 防火墙放行nfs相关服务firewall-cmd--permanent--add-service=nfs --add-service=rpc-bind --add-service=mountd firewall-cmd--reload核心配置文件/etc/exports
语法:
共享目录 客户端(选项),括号和IP之间不能有空格! 也可以在/etc/exports.d/*.exports写配置,方便管理多套共享。
编辑exports:
vim/etc/exports# 允许10.1.8.0/24网段读写访问/shares/webapp10.1.8.0/24(rw)常用导出选项说明:
| 选项 | 作用 |
|---|---|
rw | 读写权限;默认是ro只读 |
ro | 只读访问 |
no_root_squash | 客户端root用户不压缩为nobody,生产谨慎使用,有安全风险 |
root_squash | 客户端root映射为nobody普通用户,默认安全行为 |
配置变更之后生效:
exportfs-r# 重新加载exports配置exportfs-v# 查看当前已经导出的共享以及全部选项1.3 NFS客户端挂载
# 客户端同样需要nfs‑utils工具yuminstall-ynfs-utils# showmount查看服务端有哪些共享资源showmount-estorage# 创建本地挂载点mkdir/var/www/html# 临时挂载nfs共享目录mount-tnfs storage:/shares/webapp /var/www/html现象:客户端root去写文件会提示权限拒绝。 原因:默认
root_squash,客户端root被映射为nobody;业务程序apache(uid48)可以正常写入。
1.4 /etc/fstab持久挂载NFS
storage:/shares/webapp /var/www/html nfs defaults 0 0NFS依赖网络,如果服务器开机网络还没就绪就尝试挂载,会开机卡住。可以增加
_netdev挂载选项,标记这是网络存储。
storage:/shares/webapp /var/www/html nfs defaults,_netdev00二、iSCSI IP‑SAN块存储
比喻:iSCSI通过TCP/IP网络,把服务端的一块硬盘“远程递交给客户端”。客户端识别为一块裸的磁盘块设备,就跟本地新加一块硬盘一样,需要自己分区、格式化文件系统再挂载。
术语速记:
- Target:iSCSI服务端,提供存储资源;
- Initiator:iSCSI客户端,来使用远程磁盘;
- IQN:全局唯一名字,用来标识target和initiator;
- LUN:target向外提供的逻辑磁盘单元。
⚠️重要提醒:多个客户端千万不要同时挂载同一个iSCSI设备使用普通ext4/xfs!普通本地文件系统不支持多机并发读写,会直接损坏数据。多机同时访问要使用集群文件系统如GFS2。
2.1 iSCSI Target服务端配置
# 安装服务端工具 targetd + targetcliyuminstall-ytargetd targetcli systemctlenabletarget--now# 防火墙放行iscsi‑target服务firewall-cmd--permanent--add-service=iscsi-target firewall-cmd--reloadtargetcli交互式配置流程:
targetcli#1.创建后端存储backstore,使用物理磁盘/dev/sdb作为存储载体/>/backstores/block create myblock1 /dev/sdb#2.创建target目标,填写IQN名称/>/iscsi create iqn.2026-09.cloud.user.storage:disk1#3.把backstore映射为LUN/>/iscsi/iqn.2026-09.cloud.user.storage:disk1/tpg1/luns create /backstores/block/myblock1#4.配置ACL,只允许指定客户端IQN访问这个target/>/iscsi/iqn.2026-09.cloud.user.storage:disk1/tpg1/acls create iqn.2026-09.cloud.user.client#5.修改监听IP,不要监听0.0.0.0全部地址/>/iscsi/iqn.2026-09.cloud.user.storage:disk1/tpg1/portals delete0.0.0.03260/>/iscsi/iqn.2026-09.cloud.user.storage:disk1/tpg1/portals create10.1.8.103260/>exit# 退出自动保存配置到 /etc/target/saveconfig.json非交互脚本模式,每一步命令直接在shell执行,必须手动执行saveconfig保存。
2.2 iSCSI Initiator 客户端
# 安装客户端软件包yuminstall-yiscsi-initiator-utils# 客户端IQN配置文件vim/etc/iscsi/initiatorname.iscsiInitiatorName=iqn.2026-09.cloud.user.client发现target、登录远程存储:
# discovery发现服务端targetiscsiadm-mdiscovery-tst-p10.1.8.10:3260# 登录targetiscsiadm-mnode-Tiqn.2026-09.cloud.user.storage:disk1-l# 查看会话,确认识别到新的磁盘设备iscsiadm-msession-P3lsblk2.3 格式化 + fstab持久挂载iSCSI磁盘
⚠️iSCSI不要写/dev/sdb这种设备名!重启后磁盘名字顺序会变,必须用UUID;并且加上
_netdev网络设备标记。
mkfs.xfs /dev/sdb blkid# 获取UUID/etc/fstab示例:
UUID="3d49d1dd-8209-43a1-a106-4de328762e00"/data xfs defaults,_netdev002.4 注销断开iSCSI磁盘
# 先卸载挂载目录umount/data# 登出targetiscsiadm-mnode-Tiqn.2026-09.cloud.user.storage:disk1-u# 删除本地记录,开机不会自动登录iscsiadm-mnode-Tiqn.2026-09.cloud.user.storage:disk1-odelete两个服务区别小结
- NFS:文件存储,服务端做好文件系统,客户端直接读写目录;多台Linux可以同时正常访问;
- iSCSI:块存储,给客户端裸磁盘,客户端自己做文件系统,普通文件系统禁止多机同时挂载。
三、MariaDB数据库基础
MariaDB是MySQL的开源分支,完全兼容MySQL语法。属于关系型数据库,数据以二维表格形式存放,类似Excel表格。
3.1 MariaDB安装、安全加固
# 安装服务端、客户端工具yuminstall-ymariadb-server mariadb systemctlenable--nowmariadb# 防火墙放行mysql 3306端口firewall-cmd--permanent--add-service=mysql firewall-cmd--reload安全初始化,设置root密码、删除匿名账号、删除test库:
mysql_secure_installation进程说明:
mysqld_safe是守护监控进程,负责崩溃重启;mysqld真正数据库核心工作进程。
3.2 MariaDB配置分层结构
/etc/my.cnf:主配置,会加载/etc/my.cnf.d/*.cnf;/etc/my.cnf.d/server.cnf:服务端mysqld参数,端口、监听地址、数据目录;/etc/my.cnf.d/client.cnf:mysql客户端工具默认参数。
参数小知识点:
skip‑networking=1关闭TCP网络,只能本地socket连接;bind‑address控制数据库监听哪个IP。
3.3 登录数据库
# socket本地登录,不需要网络mysql-uroot-p# TCP远程登录,‑h指定数据库服务器IPmysql-uuseer-p123-h10.1.8.11# 非交互执行SQL,适合脚本mysql-uroot-p-e'show databases;'3.4 SQL基础语法CRUD
SQL语句分类:
- DDL数据定义:
CREATE/DROP创建删除库、表; - DML数据操作:
INSERT/UPDATE/DELETE增改删; - DQL数据查询:
SELECT查询; - DCL权限控制:
GRANT / REVOKE授权回收权限。
库操作
SHOW DATABASES;CREATE DATABASE inventory;USE inventory;-- 切换使用某个数据库 DROP DATABASE inventory;表操作
SHOW TABLES;DESCRIBE product;-- 查看表结构查询示例
SELECT * FROM product;SELECT name,price FROM product WHERE price>100;SELECT * FROM product WHEREidBETWEEN1AND3;SELECT * FROM product WHERE name LIKE'%Server%';-- order by排序 SELECT * FROM product ORDER BY price DESC;-- 聚合函数 avg max minsumcount SELECT avg(price)FROM product;SELECT count(*)FROM product;插入、更新、删除
INSERT INTO staff(id,name,age)VALUES(1,'zhangsan',22);-- ⚠️不加where会更新全表所有记录! UPDATE staff SETage=25WHEREid=1;-- ⚠️不加where会清空整张表! DELETE FROM staff WHEREid=1;3.5 用户与权限管理
MariaDB数据库账号独立于Linux系统账号;账号格式
用户名@访问来源主机。
创建用户:
CREATEUSERuser@'%'IDENTIFIED BY'123456';授权语法:
GRANT 权限列表 ON 库名.表名 TO'user'@'%';FLUSH PRIVILEGES;-- 刷新权限生效授权粒度:
*.*全局所有库;inventory.*指定数据库全部表;inventory.product指定单张表;- 还可以做到列级权限,只允许访问表中部分字段。
查看权限、回收权限、删除用户
SHOW GRANTS FOR user@'%';REVOKE SELECT ON inventory.* FROM user@'%';DROPUSERuser@'%';✅生产原则:最小权限原则,账号只给业务刚好需要的权限;不要随便用
@'%'允许任意IP访问。
3.6 数据库备份恢复
逻辑备份 mysqldump(导出SQL文本)
# 备份单个库,不包含create database语句mysqldump-uroot-pinventory>inventory.sql# ‑‑databases,导出包含建库语句,恢复直接导入即可mysqldump-uroot-p--databasesinventory>inventory‑full.sql# 备份全部数据库mysqldump-uroot-p--all‑databases>all.sql逻辑恢复:
mysql-uroot-p<inventory‑full.sql物理备份(直接复制数据目录)
必须停止mariadb服务,复制
/var/lib/mysql整个目录。
systemctl stop mariadbcp-a/var/lib/mysql /backup/mysql#恢复的时候,停止服务,拷贝回去,修改属主mysql:mysqlchown-Rmysql:mysql /var/lib/mysql systemctl start mariadb物理备份速度快,但兼容性差;逻辑备份可移植性好,适合迁移不同版本数据库。
🚨新手常见坑合集
❌NFS挂载,客户端root写入文件报permission denied
✅默认
root_squash安全机制,客户端root映射为nobody;业务使用普通uid/gid匹配;需要root写才打开no_root_squash,评估安全风险。❌/etc/fstab写iSCSI设备名/dev/sdc,重启系统挂载错乱
✅iSCSI设备名字不稳定,必须使用UUID,加上_netdev选项标记网络存储。
❌多台机器同时挂载同一个iSCSI磁盘使用普通xfs/ext4文件系统
✅普通本地文件系统不支持多机并发读写,直接损坏数据;多机共享需要集群文件系统GFS2。
❌MariaDB授权
user@'%',本地登录可以,远程连不上数据库✅检查两点:防火墙放行mysql服务;检查
bind‑address配置,不要只监听127.0.0.1。❌执行UPDATE / DELETE忘记写WHERE条件,全表数据被修改/清空
✅生产操作前先SELECT确认条件;重要环境可以开启事务,确认无误再commit。
总结
- NFS网络文件存储:RPC协议;exports配置共享目录;理解root_squash、rw选项;客户端挂载,fstab增加
_netdev网络标记;适合内网多Linux同时访问同一个文件目录。 - iSCSI块存储:给客户端裸磁盘块设备;target服务端,initiator客户端;使用UUID写fstab,禁止多机普通文件系统同时挂载同一LUN。分清文件存储(NFS)与块存储(iSCSI)。
- MariaDB数据库:安装安全加固;分层配置文件;SQL的DDL/DML/DQL/DCL;最小权限原则管理账号;mysqldump逻辑备份、物理目录备份两种方式。
思考题&互动
- NFS与iSCSI核心区别?什么场景选择NFS,什么场景选择iSCSI?
- iSCSI写入/etc/fstab,为什么推荐UUID,并且加上
_netdev参数? - MySQL主从复制中IO线程、SQL线程分别负责干什么?
Slave_IO_Running:No一般排查哪些点?
欢迎评论区分享你的踩坑经历,建议虚拟机完整复现NFS、iSCSI、MariaDB主从整套实验,加深理解!