ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从磁盘到云存储:一次 Openfiler RAID5、iSCSI、NAS 实验完整复盘

从磁盘到云存储:一次 Openfiler RAID5、iSCSI、NAS 实验完整复盘 从磁盘到云存储一次 Openfiler RAID5、iSCSI、NAS 实验完整复盘这不是一篇照着教程做的实验记录而是一次从裸磁盘到网络存储的完整实践复盘——包括踩过的坑、想明白的事以及对云存储底层逻辑的理解。1. 为什么学习存储很多人接触云计算是从虚拟机、容器开始的但真正深入后会发现计算可以弹性伸缩网络可以软件定义唯独存储是最难虚拟化的那一层。OpenStack 的架构其实说得很直白Nova → 计算资源CPU/内存Neutron → 网络资源虚拟交换/路由Cinder →块存储资源云硬盘Cinder 背后是什么是 Ceph、是 LVM、是 iSCSI。这些名词看起来高大上但拆开看底层就是RAID 磁盘阵列 逻辑卷管理 网络存储协议。企业存储的核心链路其实很朴素物理磁盘 → RAID阵列 → LVM逻辑卷 → iSCSI/NAS → 客户端访问这条链路就是这次实验要完整走一遍的东西。我选择 Openfiler 作为实验平台因为它是基于 rPath Linux 的开源 NAS/SAN 系统麻雀虽小五脏俱全——一个 Web 界面就能完成从磁盘分区到 iSCSI Target 映射的全部操作非常适合理解企业存储的全貌。2. 实验环境与架构设计2.1 环境组成组件说明存储服务器Openfiler基于 rPath Linux客户端1Windows ServeriSCSI 发起程序 文件共享访问客户端2Ubuntuopen-iscsi smbclient cifs-utils3. RAID5从单盘到阵列3.1 为什么需要 RAID单块磁盘有三个硬伤容量有限、容易损坏、性能不足。RAIDRedundant Array of Independent Disks通过组合多块磁盘来同时解决这三个问题。RAID5 是最常用的折中方案。它将数据和校验信息分布在所有磁盘上磁盘1磁盘2磁盘3数据1数据2校验数据3校验数据4校验数据5数据6允许同时坏一块盘靠剩余磁盘上的校验信息恢复数据。读写性能也不错因为可以并行。3.2 实践在 Openfiler 中创建 RAID5关机给 Openfiler 虚拟机添加三块 50GB 磁盘开机。登录 Web 管理界面https://10.10.5.221:446进入 Volumes → Block Devices可以看到 sda系统盘和新增的 sdb、sdc、sdd。点击 sdb需要选择分区类型。这里有一个容易踩的坑Openfiler 提供两种分区类型Physical volume属于 LVM 体系RAID array member属于 RAID 体系如果选了 Physical volume后续进入 Software RAID 页面时会看到No available RAID member原因系统已经把这些磁盘标记为 LVM 的物理卷不允许再加入 RAID 阵列。这两个体系是互斥的。所以做 RAID5必须选RAID array member。对 sdb、sdc、sdd 三块盘分别操作。然后进入 Software RAID 页面选中 /dev/sdb1、/dev/sdc1、/dev/sdd1选择 RAID-5点击 Add arrayRAID 阵列创建成功 → /dev/md03.3 具体步骤1登录管理平台。依次点击主菜单Volumes→右侧菜单Block Devices即可看到系统中当前存在4个硬盘其中sda已被安装Openfiler操作系统sdb、sdc、sdd是尚未使用的SCSI硬盘如图所示。2点击其中的sdb进入磁盘分区页面。页面中提供了分区类型选择有两种类型可选Physical volume物理卷用于LVM逻辑卷管理和RAID array memberRAID阵列成员用于创建软RAID。本实验需要创建RAID阵列因此选择RAID array member类型。同时可以指定开始柱面和结束柱面来定义分区大小这里将整个硬盘作为一个分区如图所示。以同样的方式对sdc和sdd进行操作将三块磁盘分别创建为RAID array member类型的分区。操作完成后三块磁盘的分区/dev/sdb1、/dev/sdc1和/dev/sdd1将可用于RAID阵列的创建。3完成三块磁盘的RAID array member分区后点击Software RAID菜单。此时界面上会显示所有类型为RAID array member且尚未创建软RAID的分区。选中要创建RAID的三个分区/dev/sdb1、/dev/sdc1和/dev/sdd1在RAID级别中选择RAID 5块大小Block Size使用默认值即可如图所示。4选好后点击Add array按钮系统将创建RAID 5磁盘阵列。创建完成后阵列设备名为/dev/md0容量约为100GB3块50GB磁盘中2块用于数据存储1块用于校验实际可用容量为(N-1)×单盘容量2×50GB100GB。RAID5阵列创建成功后的界面如图所示。3.3 这一步的意义/dev/md0md multiple devices就是 Linux 内核的软 RAID 设备。对上层来说它就是一块100GB 的虚拟磁盘有冗余能力。后续的 LVM、iSCSI、NAS 都是建立在这块虚拟磁盘之上的。RAID 把多块物理磁盘抽象成一块可靠的虚拟磁盘——这就是存储虚拟化的第一步。4.LVM存储的弹性管理4.1 为什么需要 LVM有了 /dev/md0 这块 100GB 的阵列直接格式化挂载行不行技术上可以但你会面临一个问题空间分了就不好改。LVMLogical Volume Manager解决的是空间弹性分配的问题。它引入了三层抽象物理卷(PV)→ 卷组(VG)→ 逻辑卷(LV)/dev/md0 vol-1 iSCSI-1(10GB)share-1(10GB)PV物理卷就是 /dev/md0 这块 RAID 设备VG卷组把 PV 的空间池化这里是 vol-1100GBLV逻辑卷从 VG 中按需切出比如 iSCSI-1 切 10GBshare-1 切 10GB4.2 实践在 Openfiler 中创建卷组 vol-1选择 /dev/md0 作为物理卷加入。然后从 vol-1 中创建两个逻辑卷逻辑卷大小类型用途iSCSI-110GBiSCSI块存储映射给 WindowsiSCSI-210GBiSCSI块存储映射给 Ubuntushare-110GBXFS文件共享NAS 用LVM 的价值在于剩余的 70GB 还在 vol-1 池里随时可以扩容或新建逻辑卷。如果直接用物理分区改大小就得重新分区风险很大。4.3 具体步骤创建卷组1登录Openfiler配置平台依次点击主菜单Volumes→右侧菜单Volume Groups在Volume group name处输入卷组名vol-1在Select physical volumes to add处勾选/dev/md0即上一步创建的RAID5阵列点击Add volume group按钮创建卷组如图所示。2卷组创建成功后系统将RAID5阵列设备/dev/md0的100GB空间纳入vol-1卷组管理。如图所示卷组信息中显示了卷组名称和可用空间大小。创建iSCSI逻辑卷1依次点击主菜单Volumes→右侧菜单Add Volume在Select Volume Group处选择vol-1卷组进入逻辑卷创建页面如图所示。2在Create a volume in vol-1表中Volume Name处输入卷名称iSCSI-1Required Space (MB)处输入卷大小。本例中划分10GB即10240MB在Filesystem / Volume type处选择iSCSI点击Create按钮创建该逻辑卷如图所示。5. iSCSI把网络变成本地磁盘5.1 iSCSI 到底在做什么先看传统方式本地硬盘 → /dev/sda → 操作系统直接读写iSCSI做的事远程存储 → TCP/IP 网络 → SCSI协议封装 → /dev/sdb → 操作系统当本地硬盘用本质上iSCSI 通过 TCP/IP 传输 SCSI 协议让远程存储在客户端表现为一块本地磁盘。客户端不需要知道这块盘在哪里、怎么连的它只看到 /dev/sdb可以分区、格式化、挂载和本地盘一模一样。这就是块存储的核心思想客户端拿到的是裸磁盘自己决定怎么用。5.2 服务端配置Openfiler在 Openfiler 中完成五步开启服务Services → iSCSI target server → Enable创建 TargetVolumes → iSCSI Targets → 添加新的 Target生成 IQN网络访问配置System→Network Access Configuration→添加要挂载iSCSI卷所在服务器的IP地址段LUN 映射将逻辑卷 iSCSI-1 映射到 Target网络 ACL允许客户端 IP 段访问5.3 Windows 客户端验证在 Windows Server 上打开 iSCSI 发起程序配置填入 Initiator Name发现添加门户 10.10.5.221目标点击连接状态变为已连接磁盘管理发现新的磁盘1 → 右键联机 → 右键初始化 → 新建简单卷NTFS→ 分配盘符 E:读写验证打开 E: 盘 → 新建 test.txt → 输入 “Hello iSCSI” → 保存 → 重新打开确认5.4 Ubuntu 客户端验证Linux 下用 open-iscsi 软件包#安装sudo apt update sudo apt install-yopen-iscsi发现目标扫描 Openfiler 上有哪些可用的 iSCSI Targetsudo iscsiadm-m discovery-t sendtargets-p 10.10.5.221输出10.10.5.221:3260,1 iqn.2006-01.com.openfiler:tsn.6b2a4e2ec86a登录目标sudo iscsiadm-m node-T iqn.2006-01.com.openfiler:tsn.6b2a4e2ec86a-p 10.10.5.221-l输出Login successful登录成功后远程存储就变成了一块本地磁盘lsblksdb 8:16 0 10G 0 disk ← 这就是远程 iSCSI 磁盘格式化、挂载、读写sudo mkfs.ext4/dev/sdb sudo mkdir/datasudomount/dev/sdb/datacd/dataecho123456abcd|sudoteeiscsi-test.txtcatiscsi-test.txt输出 123456abcd读写验证通过。设置开机自动连接否则重启后 iSCSI 磁盘会消失sudo iscsiadm-m node-T iqn.2006-01.com.openfiler:tsn.6b2a4e2ec86a \--op update-n node.startup-v automatic6. NAS文件级共享与协议差异6.1 iSCSI vs NAS一张表说清楚对比维度iSCSI (属于SAN)NAS (网络附加存储)核心本质分享存储设备 (Sharing Storages)分享数据 (Sharing Data)访问对象数据块 (Block)文件 (File)客户端看到一块未格式化的“裸硬盘”如Windows的“磁盘1”Linux的/dev/sdb一个带有文件系统的“网络文件夹”如Windows的\server\share或一个挂载点文件系统管理客户端自己负责格式化、分区如NTFS、EXT4NAS设备自己管理用户直接存取文件传输协议SCSI over TCP/IPNFS (Linux/Unix) 或 SMB/CIFS (Windows)典型性能高读写速度接近本地硬盘相对较低文件级操作有额外开销最佳应用性能敏感型应用大型数据库 (Oracle/MySQL)、虚拟化 (VMware/Hyper-V) 环境文件共享与协作文档存储、企业内部文件服务器、多媒体资料库管理维护较复杂需要管理LUN、映射、多路径等简单通常有图形化界面像管理一台文件服务器成本中等低于传统FC-SAN低廉入门门槛低关键区别iSCSI 给你一块裸盘你自己格式化NAS 给你一个共享目录服务端已经格式化好了你直接读写文件。6.2 服务端配置在 Openfiler 中从 vol-1 创建逻辑卷 share-110GB文件系统选XFS开启CIFS server服务在 share-1 下创建子文件夹 ciscoMake ShareSMB 共享名设为 csc在共享设置页面Edit share /mnt/vol-1/share-1/cisco/中找到Override SMB/Rsync share name选项填入SMB共享名称csc访问模式选Public guest access允许网段 SMB/CIFS 读写权限6.3 Windows 客户端验证运行 → \10.10.5.221 → 发现 csc 文件夹 → 读写正常Windows 这边很顺利因为 Windows 原生支持 SMB 协议。但 Linux 客户端就没这么顺利了——这也引出了本次实验最有价值的部分。7. 踩坑实录SMB 协议不兼容与权限问题这是整篇博客最值得看的部分。 照着教程做人人都会但遇到问题能分析原因、找到解决方案才是真正理解了系统。坑 1Ubuntu 访问 NAS 直接报错现象smbclient-L//10.10.5.221-N报错Protocol negotiation to server 10.10.5.221(fora protocol between SMB2_02 and SMB3)failed: NT_STATUS_CONNECTION_DISCONNECTED分析错误信息已经说得很清楚了——“Protocol negotiation failed”协议协商失败。Ubuntu 新版 smbclient 默认使用SMB2/SMB3出于安全考虑SMB1 有已知漏洞Openfiler 的 CIFS 服务比较老旧只支持SMB1NT1两边协议版本对不上握手就失败了。解决手动指定最低协议版本为 NT1即 SMB1smbclient-L//10.10.5.221-N--optionclient min protocolNT1成功列出共享目录。如果要永久解决编辑 /etc/samba/smb.conf[global]client min protocol NT1延伸思考这个问题的本质是新旧系统协议不兼容。在实际企业环境中迁移旧存储系统时常遇到类似问题。SMB1 虽然能用但存在安全风险WannaCry 勒索病毒就是利用 SMB1 漏洞传播的。生产环境中应该尽量升级服务端而不是降级客户端。坑 2NAS 能访问但无法写入现象用 mount 方式挂载 NAS 后创建文件报权限错误sudomount-t cifs//10.10.5.221/csc/mnt/nas-o guest,vers1.0 cd/mnt/nas touch ubuntu-mount-test.txt报错touch: cannot touchubuntu-mount-test.txt: Permission denied分析guest 选项表示以匿名用户身份登录 OpenfilerOpenfiler 虽然设置了 Public Guest Access但会将访客映射为权限很低的用户如 nobodynobody 在 Linux 文件系统中没有写入权限解决重新挂载时指定当前用户的 uid/gid :sudo umount/mnt/nas sudomount-t cifs//10.10.5.221/csc/mnt/nas \-o guest,rw,uid$(id-u),gid$(id-g),vers1.0uid$(id -u)动态获取当前用户 IDgid$(id -g)动态获取当前用户组 IDvers1.0指定 SMB 协议版本重新挂载后touch ubuntu-mount-test.txt# 成功echohello world ubuntu-mount-test.txtcatubuntu-mount-test.txt# 输出: hello world再到Openfiler服务端验证文件确实存在ls/mnt/vol-1/share-1/cisco# ubuntu-mount-test.txt文件同步可见NAS 双向读写链路完全打通。延伸思考uid/gid 参数的本质是告诉 Linux 内核——“这块远程文件系统上的文件在本地用哪个用户身份操作”。不加这个参数所有操作都以 root 身份执行mount 用了 sudo但 CIFS 协议层映射的远程用户是 nobody两层权限不匹配就报 Permission denied。理解了这个就理解了 CIFS 挂载的权限模型。8. 从 Openfiler 到云存储实验做完了但我不想停留在我会用 Openfiler 了这个层面。所有我们回头看看这次实验走过的完整链路Openfiler 实验链路 物理磁盘 → RAID5(/dev/md0)→ LVM(vol-1)→ iSCSI/NAS → 客户端 OpenStack 存储链路 物理磁盘 → RAID/ceph OSD → Cinder/LVM → iSCSI/RBD → 虚拟机云硬盘两条链路的架构思想完全一致——都是将底层物理存储抽象为上层可调用的资源。我认为这次实验的真正价值不在于学会了 Openfiler 的操作而在于理解了企业存储的分层抽象思想RAID解决的是单节点内的磁盘冗余LVM解决的是存储空间的弹性分配iSCSI/NAS解决的是存储资源的网络化共享云存储Cinder/Ceph解决的是跨节点的存储池化和自动化调度每一层都是对下层的抽象、对上层的简化。理解了这个分层模型再看 Ceph、看 Cinder、看 Kubernetes 的 CSIContainer Storage Interface都会觉得不过是同一套思想的更大规模实现。9. 总结做了什么完整走通了企业传统存储的核心链路磁盘 → RAID5 → LVM → iSCSI/NAS → 客户端访问 → 故障排查。收获了什么理解了存储分层抽象RAID、LVM、iSCSI/NAS 各自解决什么问题为什么需要这么多层理解了块存储和文件存储的区别iSCSI 给你裸盘NAS 给你目录应用场景不同解决了真实问题SMB 协议不兼容、CIFS 挂载权限——这两个坑的排查过程比操作本身更有价值不足与改进Openfiler 基于老旧的 rPath LinuxCIFS 只支持 SMB1生产环境不可接受。可以考虑用 FreeNAS/TrueNAS 或直接用 Linux targetcli Samba 替代RAID5 是单节点冗余如果整个 Openfiler 虚拟机挂了数据就没了。生产环境需要分布式存储如 Ceph实现跨节点冗余没有做性能测试后续可以加 fio 或 dd 测试 iSCSI 和 NAS 的读写吞吐量对比
返回列表