
Linux存储与数据库实战NFS iSCSI MariaDB 文档说明基于课堂笔记0929.md重构优化面向运维新手、RHCE备考可直接发布博客/语雀知识库完整保留全部实验逻辑增加命令注释、模拟输出、通俗类比、踩坑点、思考习题。 适用人群Linux运维初学者、RHCE学员、课后复习 ️ 实验环境CentOS 7RHEL7storage服务端10.1.8.10提供NFS、iSCSI存储client/webapp客户端10.1.8.11httpd网页服务、挂载存储mariadb数据库CentOS7 默认 mariadb‑server‑5.5 ⚠️ 约定#root管理员执行$普通用户执行未标注普通用户的命令均需要root普通用户执行会报权限错误。课程总览NFS网络文件系统文件级共享多客户端可同时挂载读写iSCSIIP‑SAN块存储把远程磁盘当本地裸盘使用MariaDB关系型数据库部署、配置、SQL基础增删改查核心区分记忆NFS文件共享服务器管理文件系统多个机器可同时挂载iSCSI块共享给到客户端裸磁盘本地自己格式化文件系统原生XFS/EXT4不允许多机同时挂载。 第一章 NFS 网络文件系统1.1 NFS介绍类比NFS就像网盘文件夹服务器共享文件夹多台电脑可以同时打开、读写里面的文件。NFSNetwork File System网络文件系统Sun公司开发实现跨主机文件级共享客户端挂载后访问远程目录如同本地目录。NFSv3广泛使用依赖RPC远程过程调用NFSv4增强安全支持Kerberos不再强依赖外部rpcbindNFS RPC工作流程服务端NFS启动向rpcbind注册自己的端口号客户端先查询rpcbind获取NFS服务端口客户端发起挂载请求服务端校验IP权限挂载成功读写文件全部转换成RPC远程调用发给服务端权限校验依靠UID/GID数字匹配不看用户名✅优点透明访问配置简单支持Linux/macOS多平台适合集群多节点共享同一套文件。❌缺点NFSv3安全性弱无内置加密高度依赖网络多客户端并发文件锁逻辑复杂。典型场景集群web网页目录共享、企业内部文档共享。1.2 NFS服务端部署 storage(10.1.8.10)步骤1安装软件包# rootstorage【安装nfs服务端与客户端工具nfs‑utils同时包含服务端、showmount客户端工具】 yum install -y nfs-utils步骤2准备共享目录webapp网页进程apache uid48把共享目录属主设置为48方便apache读写。# rootstorage【创建共享目录】 mkdir -p /shares/webapp # rootstorage【修改目录属主为uid48对应apache用户】 chown 48 /shares/webapp步骤3启动服务⚠️依赖rpcbind安装nfs‑utils会自动安装rpcbind。# rootstorage【开机自启并立刻启动nfs‑server与rpcbind】 systemctl enable --now rpcbind nfs-server # rootstorage【查看服务运行状态确认 active(running)】 systemctl status nfs-server步骤4防火墙放行NFS相关服务# rootstorage【永久放行nfs、rpc‑bind、mountd】 firewall-cmd --permanent --add-servicenfs --add-servicerpc-bind --add-servicemountd # rootstorage【重载防火墙规则使配置生效】 firewall-cmd --reload❗报错FirewallD is not running代表firewalld没启动先执行systemctl enable firewalld --now。步骤5配置共享导出 /etc/exports语法共享目录 客户端(选项)括号前面不能有空格补充/etc/exports.d/*.exports文件同样生效适合拆分多个共享配置。# rootstorage【编辑NFS共享配置】 vim /etc/exports写入内容/shares/webapp 10.1.8.0/24(rw,sync)参数解释rw读写权限默认只读rosync数据同步写入磁盘写完才返回数据更安全root_squash默认开启客户端root访问映射为nfsnobody匿名用户安全保护。no_root_squash关闭root压制生产环境禁止仅实验测试。步骤6重载共享配置 校验导出修改exports后必须重载配置才生效。# rootstorage【重载exports配置】 exportfs -r # rootstorage【查看当前生效的NFS共享不带选项】 exportfs模拟输出/shares/webapp 10.1.8.0/24 # rootstorage【‑v查看完整共享选项看rw、root_squash等】 exportfs -v1.3 NFS客户端部署 webapp(10.1.8.11)步骤1安装工具包# rootwebapp【客户端安装nfs工具提供showmount、mount.nfs命令】 yum install -y nfs-utils httpd # rootwebapp【查看apache用户uid确认是48】 id apache模拟输出uid48(apache) gid48(apache) 组48(apache)步骤2查看服务端可用共享# rootwebapp【查询storage服务端导出的共享目录】 showmount -e 10.1.8.10模拟输出Export list for 10.1.8.10: /shares/webapp 10.1.8.0/24步骤3临时挂载# rootwebapp【创建挂载点目录】 mkdir -p /var/www/html # rootwebapp【挂载NFS共享到网页根目录】 mount -t nfs 10.1.8.10:/shares/webapp /var/www/html # rootwebapp【查看挂载结果】 df -h /var/www/html✅成功输出10.1.8.10:/shares/webapp挂载到/var/www/html。权限现象考试高频现象默认开启root_squash客户端root被映射nfsnobody而目录属主是48(apache)。# rootwebapp【root尝试创建文件会权限拒绝】 touch /var/www/html/root-f1❌报错touch: cannot touch ‘/var/www/html/root‑f1’: Permission denied# rootwebapp【切换apache用户测试写入apache默认shell是/sbin/nologin需要‑s指定bash】 su -l apache -s /bin/bash # $ apache用户【写入网页文件】 echo apache website /var/www/html/web1.html # $ apache用户【退出回到root】 exit网页访问验证# rootwebapp【启动httpd网页服务】 systemctl enable --now httpd在storage端测试访问网页# rootstorage【curl访问webapp网页】 curl [http://10.1.8.11/web1.html](http://10.1.8.11/web1.html)✅预期输出apache website持久化挂载 /etc/fstab⚠️NFS属于网络文件系统建议加上_netdev等网络就绪再挂载防止开机报错进入急救模式。# rootwebapp【编辑fstab实现开机自动挂载】 vim /etc/fstab增加一行10.1.8.10:/shares/webapp /var/www/html nfs defaults,_netdev 0 0 # rootwebapp【⚠️重要测试fstab语法不要直接重启机器】 mount -a无输出代表语法正确有报错必须修正否则重启进emergency急救模式。1.4 第一章小节小结NFS是文件级共享基于RPC服务端软件包nfs‑utils。/etc/exports配置共享修改后执行exportfs -r重载。root_squash默认开启客户端root映射nfsnobody所以root写共享目录权限不足。fstab写NFS挂载建议加_netdev使用mount‑a校验配置。本章新手易错点❌exports配置括号前打空格共享选项失效例/shares/webapp 10.1.8.0/24 (rw)错误。❌修改exports忘记exportfs -r配置不生效。❌不理解root_squash疑惑root为什么权限不够直接上no_root_squash带来安全风险。❌fstab不写_netdev开机网络没起来就尝试挂载系统启动失败。❌showmount命令需要nfs‑utils客户端不装就提示命令不存在。思考问题NFS的root_squash作用是什么为什么默认开启客户端root对本地目录拥有完整rwx但是NFS共享目录中root无法写入原因是什么 第二章 iSCSI IP‑SAN块存储类比iSCSI相当于网络上接过来一块裸硬盘拿到手需要自己格式化、创建文件系统。普通XFS/EXT4不允许多台机器同时挂载这块盘会文件损坏。iSCSIInternet Small Computer System Interface基于TCP/IP把SCSI块指令封装在网络传输实现IP‑SAN存储。 端口3260/tcp2.1 iSCSI核心术语面试高频名词说明TargetiSCSI服务端对外提供存储资源InitiatoriSCSI客户端使用远程块存储IQN全局唯一名称格式iqn.YYYY‑MM.反向域名:自定义名字Portal服务端监听IP端口示例10.1.8.10:3260LUN逻辑单元后端存储对象映射出来给客户端使用的块设备ACL访问控制通过客户端IQN限制哪些initiator可以登录targetTPGTarget Portal Group包含portal、lun、acl配置集合⚠️重要警告同一个iSCSI LUN普通文件系统XFS/EXT4不能多客户端同时挂载读写会数据损坏多机同时访问必须使用集群文件系统GFS2。2.2 iSCSI Target服务端部署 storage(10.1.8.10)步骤1安装软件包# rootstorage【安装targetd后台服务、targetcli交互式配置工具】 yum install -y targetd targetcli步骤2启动服务、放行防火墙# rootstorage【启动target服务开机自启】 systemctl enable --now target # rootstorage【防火墙放行iscsi‑target服务3260端口】 firewall-cmd --permanent --add-serviceiscsi-target firewall-cmd --reload步骤3 targetcli交互式配置进入交互shell输入targetcliexit退出回到系统shell。 交互shell内cd ..返回上一级cd /回到根ls查看目录树。# rootstorage【进入targetcli交互模式】 targetcli① 创建后端存储backstoreblock类型使用本地磁盘/dev/sdb/ cd /backstores/block /backstores/block create webapp‑disk /dev/sdbblock类型使用物理磁盘、分区、LVM卷作为后端存储。② 创建Target(IQN)/ cd /iscsi /iscsi create iqn.2026‑09.cloud.cz.server:webapp‑data⚠️重复执行create同一个iqn会报错This Target already exists in configFS说明target已经存在直接cd进去使用即可不要重复创建。③ 进入tpg1绑定LUN把backstore映射给target/ cd /iscsi/iqn.2026‑09.cloud.cz.server:webapp‑data/tpg1/luns /iscsi/iqn.20...ata/tpg1/luns create /backstores/block/webapp‑disk④ 创建ACL允许客户端IQN访问客户端initiator的IQN在客户端/etc/iscsi/initiatorname.iscsi查看。/ cd /iscsi/iqn.2026‑09.cloud.cz.server:webapp‑data/tpg1/acls /iscsi/iqn.20...ata/tpg1/acls create iqn.2026‑09.cloud.cz.client:webapp⑤ 修改Portal监听IP只监听服务器业务网卡10.1.8.10不要监听0.0.0.0/ cd /iscsi/iqn.2026‑09.cloud.cz.server:webapp‑data/tpg1/portals # 删除默认全部IP监听0.0.0.0:3260 /iscsi/iqn.20.../tpg1/portals delete 0.0.0.0 3260 # 创建指定IP的portal /iscsi/iqn.20.../tpg1/portals create 10.1.8.10 3260⑥保存配置并退出交互模式exit自动保存非交互式命令行执行targetcli必须手动执行saveconfig/ exit非交互式一键配置示例写脚本用不需要进入交互shelltargetcli /backstores/block create webapp‑disk /dev/sdb targetcli /iscsi create iqn.2026‑09.cloud.cz.server:webapp‑data targetcli /iscsi/iqn.2026‑09.cloud.cz.server:webapp‑data/tpg1/luns create /backstores/block/webapp‑disk targetcli /iscsi/iqn.2026‑09.cloud.cz.server:webapp‑data/tpg1/acls create iqn.2026‑09.cloud.cz.client:webapp targetcli /iscsi/iqn.2026‑09.cloud.cz.server:webapp‑data/tpg1/portals delete 0.0.0.0 3260 targetcli /iscsi/iqn.2026‑09.cloud.cz.server:webapp‑data/tpg1/portals create 10.1.8.10 3260 targetcli saveconfig2.3 iSCSI Initiator客户端部署 webapp(10.1.8.11)步骤1安装客户端软件包# rootwebapp【安装iscsi客户端工具】 yum install -y iscsi-initiator-utils步骤2确认/修改客户端IQN# rootwebapp【查看客户端initiator IQN】 cat /etc/iscsi/initiatorname.iscsi修改InitiatorName值必须和服务端ACL里面写的IQN完全一致修改完成重启systemctl restart iscsid。步骤3服务发现 登录target# rootwebapp【发现存储服务器上的iSCSI target资源】 iscsiadm -m discovery -t st -p 10.1.8.10:3260模拟输出10.1.8.10:3260,1 iqn.2026‑09.cloud.cz.server:webapp‑data # rootwebapp【登录iSCSI target】 iscsiadm -m node -T iqn.2026‑09.cloud.cz.server:webapp‑data -l✅成功提示Login to [...] successful.登录成功内核识别出新的块设备如/dev/sdb设备名顺序会随环境变化不建议fstab直接写/dev/sdb。# rootwebapp【查看iSCSI会话详细信息确认识别的磁盘设备】 iscsiadm -m session -P 3步骤4格式化磁盘仅第一次全新磁盘执行⚠️重复格式化会清空全部数据# rootwebapp【格式化iSCSI磁盘为xfs文件系统示例设备/dev/sdb】 mkfs.xfs /dev/sdb步骤5临时挂载# rootwebapp【挂载到网页目录】 mount /dev/sdb /var/www/html # rootwebapp【确认挂载】 df -h /var/www/html步骤6持久化开机自动挂载考试高频两个强制要点①使用UUID不要写/dev/sdb设备名开机可能变②挂载选项必须加_netdev网络存储。# rootwebapp【获取iSCSI磁盘UUID】 blkid /dev/sdb输出示例/dev/sdb: UUIDxxxx‑xxxx‑xxxx‑xxxx TYPExfs # rootwebapp【编辑/etc/fstab】 vim /etc/fstab填写替换为你自己的UUIDUUIDxxxx‑xxxx‑xxxx‑xxxx /var/www/html xfs defaults,_netdev 0 0 # rootwebapp【⚠️校验fstab千万不要跳过】 mount -a # rootwebapp【开启iscsi、iscsid开机自启保证开机自动登录target】 systemctl enable --now iscsid iscsi # rootwebapp【设置target开机自动登录】 iscsiadm -m node --op update -n node.startup -v automatic客户端断开iSCSI完整流程实验重做# rootwebapp【第一步先卸载挂载点不能在挂载目录内部执行umount】 cd ~ umount /var/www/html # rootwebapp【登出target】 iscsiadm -m node -T iqn.2026‑09.cloud.cz.server:webapp‑data -u # rootwebapp【删除本地node记录不再开机自动登录】 iscsiadm -m node -T iqn.2026‑09.cloud.cz.server:webapp‑data -o delete2.4 iscsi与iscsid服务区别面试考点iscsid.service会话守护进程维护TCP会话、心跳、IO处理必须运行维持iSCSI磁盘IO。iscsi.service开机一次性执行读取本地node数据库自动登录标记automatic的target执行完任务就退出状态显示success不是running。生产标准两个服务全部enable。2.5 第二章小节小结iSCSI提供块存储给到客户端裸磁盘客户端自己格式化文件系统普通XFS/EXT4禁止多机同时挂载。核心对象IQN、Target、Initiator、LUN、ACL、Portal端口3260。客户端持久挂载必须UUID _netdev不能直接写/dev/sdX设备名。iscsid维持会话iscsi开机执行自动登录target。本章新手易错点❌同一个LUN多台客户端同时挂载XFS直接文件系统损坏。❌fstab写/dev/sdb不写UUID开机磁盘识别顺序改变挂载错乱。❌fstab不写_netdev系统网络未就绪就尝试挂载开机急救模式。❌ACL内IQN写错客户端发现成功但是login登录失败。❌非交互式targetcli忘记执行saveconfig重启配置全部丢失。思考问题NFS与iSCSI最大区别是什么分别适合什么场景iSCSI fstab为什么推荐UUID而不是/dev/sdb_netdev参数作用是什么️ 第三章 MariaDB关系型数据库类比关系数据库就是很多张Excel二维表格数据库工作簿表工作表行记录列字段。 MariaDB是MySQL社区分支完全兼容MySQL语法CentOS7版本5.5。3.1 数据库分类关系型数据库二维表MariaDB、MySQL、PostgreSQL、OracleNoSQL非关系型Redis、MongoDB作为关系数据库补充不是替代。3.2 MariaDB部署步骤1安装软件包# rootserver【安装数据库服务端、客户端工具】 yum install -y mariadb-server mariadb步骤2启动服务⚠️服务名mariadb包名叫mariadb‑serversystemctl服务名不带‑server很多同学踩坑# rootserver【启动并开机自启mariadb】 systemctl enable --now mariadb # rootserver【查看状态确认active(running)】 systemctl status mariadb进程说明mysqld_safe守护监控进程负责环境检查mysqld崩溃自动重启。mysqld数据库核心工作进程处理SQL、读写数据。步骤3防火墙放行需要外部客户端访问才需要# rootserver【放行mysql 3306端口】 firewall-cmd --permanent --add-servicemysql firewall-cmd --reload步骤4数据库安全加固实验必做删除匿名用户、删除test库、设置root密码、禁止root远程登录。# rootserver【执行安全初始化脚本交互式向导】 mysql_secure_installation交互向导执行要点回车初始root无密码设置root新密码Remove anonymous users?yDisallow root login remotely?yRemove test database and access to it?yReload privilege tables now?y3.3 MariaDB配置文件体系CentOS7 mariadb配置分层读取/etc/my.cnf主配置会include目录/etc/my.cnf.d/*.cnf/etc/my.cnf.d/server.cnf[mysqld]段数据库服务端参数datadir数据目录默认/var/lib/mysql⚠️该目录权限必须mysql:mysql如果挂载NFS/iSCSI网络存储容易启动失败。bind‑address监听IP默认0.0.0.0监听所有地址skip‑networking1关闭TCP网络只允许本地socket连接。/etc/my.cnf.d/client.cnf**[client]段mysql客户端工具默认参数**⚠️踩坑如果/var/lib/mysql挂载NFS存储root_squash会导致无法修改目录属主mysql:mysqlmariadb初始化直接报错启动失败。数据库数据目录不建议放在NFS共享上。3.4 连接数据库本地socket连接不经过网络端口3306# rootserver【本地登录socket方式输入密码】 mysql -u root -pTCP远程网络连接需要数据库创建远程账号防火墙放行3306bind‑address允许访问。-- 在数据库内部创建远程测试用户 CREATE USER cz% IDENTIFIED BY 123; GRANT ALL PRIVILEGES ON *.* TO cz%; FLUSH PRIVILEGES; # 客户端远程连接 mysql -u cz -p123 -h 10.1.8.10非交互执行SQL脚本shell直接执行不进入交互提示符# rootserver【‑e参数直接执行sql语句】 mysql -u root -p -e SHOW DATABASES;3.5 SQL语句五大分类分类英文全称代表关键字DQL 查询Data Query LanguageSELECTDML 数据操纵Data Manipulation LanguageINSERTUPDATEDELETEDDL 数据定义Data Definition LanguageCREATEDROPDCL 权限控制Data Control LanguageGRANTREVOKETPL 事务处理Transaction Process LanguageBEGIN TRANSACTIONCOMMITROLLBACK约定习惯SQL关键字大写库名表名字小写SQL语句以分号;结尾。3.6 数据库基础操作数据库操作-- 查看所有数据库 SHOW DATABASES; -- 切换使用某个数据库 USE webapp; -- 创建数据库 CREATE DATABASE webapp; -- 删除数据库 ⚠️危险操作数据全部丢失 DROP DATABASE webapp;系统库说明mysql保存账号、权限信息information_schema元数据performance_schema性能统计。数据表操作导入练习测试数据# rootserver【下载测试数据集】 curl -o inventory.dump -s [http://192.168.49.200/class/course](http://192.168.49.200/class/course)‑materials/softwares/stage01/inventory.middle.sql # rootserver【创建库导入备份数据】 mysql -uroot -p -e CREATE DATABASE inventory; mysql -uroot -p inventory inventory.dump表查询USE inventory; -- 查看库下面所有表 SHOW TABLES; -- 查看表结构 DESCRIBE product; -- 查询整张表全部记录 SELECT * FROM product; -- 查询指定字段 SELECT name,price,stock FROM product;WHERE条件筛选-- 价格大于100 SELECT * FROM product WHERE price 100; -- between 区间 SELECT * FROM product WHERE id BETWEEN 1 AND 3; -- in集合匹配 SELECT * FROM product WHERE id IN (1,3); -- like模糊匹配 %任意字符 _单个字符 SELECT * FROM product WHERE name LIKE %Server%; -- AND 并且OR或者 SELECT * FROM product WHERE name LIKE %RD% AND price1000; -- ORDER BY排序desc降序 SELECT * FROM product ORDER BY price DESC;聚合函数avg()平均值、max()最大值、min()最小值、sum()求和、count()计数、GROUP BY分组。SELECT avg(price) FROM product; SELECT sum(stock) FROM product; SELECT count(name) FROM product; SELECT id_category,sum(stock) FROM product GROUP BY id_category;多表简单关联查询-- 查询分类名字为Servers的产品名称价格 SELECT product.name,product.price FROM product,category WHERE product.id_category category.id AND category.nameServers;DML增删改-- 创建测试表 CREATE TABLE staff( id INT(11) NOT NULL, name VARCHAR(100) NOT NULL, age INT(11) DEFAULT 10, id_department INT(11) ); -- 插入记录 INSERT INTO staff(id,name,age) VALUES(1,cz1,28); -- 更新记录 ⚠️不加WHERE更新全表 UPDATE staff SET age30 WHERE id1; -- 删除记录 ⚠️不加WHERE删除整张表全部数据 DELETE FROM staff WHERE id1; -- 删除表 DROP TABLE staff;⚠️高危提醒UPDATE、DELETE不带WHERE条件会操作全部行生产执行前优先SELECT核对条件。3.7 第三章小节小结mariadb服务名是mariadb包名mariadb‑server容易混淆。mysql_secure_installation必须做安全初始化配置文件分层my.cnf/etc/my.cnf.d/*.cnfdatadir/var/lib/mysql权限mysql:mysql。SQLDDL建库建表DML增删改DQL查询UPDATE/DELETE切记WHERE条件防止全表修改。本章新手易错点❌systemctl写mariadb‑server启动服务报No such file or directory。❌把datadir/var/lib/mysql挂载NFS共享root_squash导致权限报错数据库无法初始化。❌执行UPDATE / DELETE忘记WHERE条件全表数据被修改/删除。❌远程连接数据库忘记防火墙放行3306账号host写成localhost外部无法登录。思考问题mariadb包名和systemctl服务名分别是什么UPDATE语句不加WHERE会发生什么全书总复习速记NFS文件级共享多客户端可同时挂载依赖RPC包nfs‑utils。/etc/exports配置共享exportfs‑r重载默认root_squash。fstab写_netdevmount‑a校验。iSCSI块存储给到裸磁盘端口3260IQN全局唯一ACL控制登录权限。客户端iscsi‑initiator‑utilsdiscovery发现login登录。fstabUUID _netdev禁止直接写/dev/sdb普通XFS不能多机同时挂载LUN。MariaDB包mariadb‑serversystemctl服务名mariadbmysql_secure_installation加固。datadir/var/lib/mysql属主mysql:mysql不建议放NFS。SQLUPDATE / DELETE必须带上WHERE条件。对比记忆表格项目NFSiSCSI存储类型文件级共享块裸磁盘客户端是否格式化不需要服务器已经做好文件系统✅客户端自己格式化文件系统多机同时读写✅支持❌普通XFS/EXT4不支持需要集群文件系统GFS2fstab参数_netdev_netdev优先UUID