存储管理与LVM逻辑卷管理:从入门到实战

发布时间:2026/7/24 20:37:12
存储管理与LVM逻辑卷管理:从入门到实战 硬盘类型与选择机械硬盘HDD和固态硬盘SSD在特性上存在显著差异。HDD采用磁头读写旋转盘片的方式具有容量大、价格低的优势但速度较慢且抗震性差。SSD基于闪存芯片读写速度快、抗震性好但价格较高且有写入寿命限制。生产环境中建议将SSD用于操作系统和数据库等对IO性能要求高的场景HDD则适合冷数据存储和备份。设备命名规范Linux系统对不同接口类型的存储设备采用标准化的命名方式SATA/SCSI/SAS设备/dev/sd[a-z]如/dev/sdaVirtIO虚拟化设备/dev/vd[a-z]如/dev/vdaNVMe设备/dev/nvme[控制器编号]n[命名空间]如/dev/nvme0n1NVMe分区/dev/nvme[控制器编号]n[命名空间]p[分区号]如/dev/nvme0n1p1查看当前系统存储设备lsblk fdisk -l ls -l /dev/sd*分区表对比MBR和GPT是两种主流分区表格式MBR最大支持2TB磁盘最多4个主分区无备份和校验机制GPT支持超大容量8ZB最多128个分区具有分区表备份和CRC校验新部署系统建议使用GPT分区表特别是在使用UEFI固件的环境中。分区管理partedparted工具支持交互式和非交互式操作适用于MBR和GPT分区表。创建GPT分区parted /dev/sdb mklabel gpt parted /dev/sdb mkpart primary xfs 2048s 10GB parted /dev/sdb mkpart primary xfs 10GB 20GB查看分区信息parted /dev/sdb print lsblk blkid文件系统管理常见文件系统特性对比XFSRHEL默认文件系统支持大容量和在线扩容EXT4通用文件系统支持在线缩容exFAT适合跨平台数据交换格式化分区mkfs.xfs /dev/sdb1 mkfs.ext4 /dev/sdb2 xfs_info /dev/sdb1挂载配置临时挂载mkdir /mnt/data mount /dev/sdb1 /mnt/data umount /mnt/data永久挂载/etc/fstabUUID0cc51738-f869-4864-b861-6d5449f6a4bc /mnt/data xfs defaults 0 0 mount -aLVM管理创建物理卷、卷组和逻辑卷pvcreate /dev/sdb1 vgcreate vg_data /dev/sdb1 lvcreate -n lv_data -L 10G vg_data mkfs.xfs /dev/vg_data/lv_data扩展逻辑卷lvextend -L 5G /dev/vg_data/lv_data xfs_growfs /mnt/data存储管理最佳实践生产环境建议使用UUID而非设备名进行挂载关键数据目录应单独分区如/var、/home定期监控存储空间使用情况对于数据库应用考虑使用noatime挂载选项提升性能四、挂载文件系统4.1 临时挂载mount命令# 创建挂载点 mkdir -p /mnt/data /mnt/logs # 临时挂载 mount /dev/sdb1 /mnt/data mount /dev/sdb2 /mnt/logs # 带选项挂载只读 禁止执行 mount -o ro,noexec /dev/sdb1 /mnt/data # 在线重新挂载切换为读写 mount -o remount,rw /mnt/data # 查看挂载情况 df -Th | grep sdb mount | grep sdb # 卸载 umount /mnt/data umount /mnt/logs4.2 永久挂载/etc/fstab/etc/fstab文件的标准格式设备 挂载点 文件系统 选项 dump pass字段详细说明设备建议使用UUID或LABEL标识设备名如/dev/sdb1可能随系统启动顺序变化挂载点必须存在的目录路径文件系统xfs/ext4/swap等实际文件系统类型选项defaultsrw,suid,dev,exec,auto,nouser,async的组合简写dump备份工具dump的标记位0表示忽略passfsck检查顺序根分区应为1其他分区为20表示不检查配置示例# 获取设备UUID和LABEL blkid /dev/sdb1 # 编辑fstab文件 vim /etc/fstab # 添加以下内容使用UUID UUID0cc51738-f869-4864-b861-6d5449f6a4bc /mnt/data xfs defaults 0 0 LABELlogs_disk /mnt/logs ext4 noexec 0 0 # 测试fstab配置 mount -a # 查看结果 df -hT4.3 高级挂载选项常用挂载选项组合defaults等价于rw,suid,dev,exec,auto,nouser,asyncnoatime禁止记录访问时间提升IO性能nodiratime禁止目录访问时间记录nobarrier禁用写入屏障仅用于带电池的RAID控制器_netdev网络设备挂载时等待网络就绪生产环境建议配置UUIDxxx /data xfs rw,noatime,nodiratime,allocsize8m,inode64 0 04.4 处理挂载错误常见问题解决方法# 当出现target is busy错误时 lsof D /mnt/data # 查看占用进程 fuser -vm /mnt/data # 替代方案 # 修复文件系统错误卸载状态下 xfs_repair /dev/sdb1 fsck.ext4 -p /dev/sdb2 # 强制卸载危险操作 umount -l /mnt/data # 延迟卸载 umount -f /mnt/data # 强制卸载存储管理与LVM逻辑卷管理基础LVMLogical Volume Manager是Linux系统中用于管理磁盘存储的高级工具允许动态调整卷大小、快照备份等操作。核心概念物理卷PV物理磁盘或分区通过pvcreate初始化为LVM物理卷。卷组VG由多个物理卷组成的存储池通过vgcreate创建。逻辑卷LV从卷组中划分的逻辑存储单元通过lvcreate创建并挂载使用。LVM实战步骤初始化物理卷pvcreate /dev/sdX # 将磁盘或分区初始化为物理卷创建卷组vgcreate vg_name /dev/sdX # 使用物理卷创建卷组划分逻辑卷lvcreate -L 10G -n lv_name vg_name # 从卷组分配10G空间创建逻辑卷格式化并挂载mkfs.ext4 /dev/vg_name/lv_name # 格式化逻辑卷 mkdir /mnt/lv_mount mount /dev/vg_name/lv_name /mnt/lv_mount # 挂载到目录扩展逻辑卷动态扩容lvextend -L 5G /dev/vg_name/lv_name # 增加5G空间 resize2fs /dev/vg_name/lv_name # 调整文件系统大小ext4文件权限配置要点权限基础用户/组/其他通过chmod设置读r4、写w2、执行x1权限。特殊权限SUID4、SGID2、Sticky Bit1。常用命令chmod 755 /path/to/dir # 设置目录权限为rwxr-xr-x chown user:group /path/file # 修改文件所有者和组ACL高级权限setfacl -m u:user:rwx /path # 为用户添加ACL权限 getfacl /path # 查看ACL规则实战场景示例场景1动态扩展存储新增磁盘/dev/sdb并初始化为物理卷。将其加入现有卷组vg_data。扩展逻辑卷lv_home并在线调整文件系统。场景2批量修改权限find /var/www -type d -exec chmod 755 {} \; # 目录权限批量设置 find /var/www -type f -exec chmod 644 {} \; # 文件权限批量设置通过LVM和权限管理的结合可实现灵活的资源分配与安全控制适应不同业务需求。#!/bin/bash # 项目目录权限配置实战脚本 # 作者Linux权限教程 # 功能创建项目组和用户配置项目目录权限验证权限继承 echo 项目目录权限配置实战 echo 1. 创建组和用户带密码设置 echo 1. 创建项目组和用户... groupadd -f project_team # 创建项目组 useradd -m -s /bin/bash -g project_team dev_user1 # 创建开发用户1 useradd -m -s /bin/bash -g project_team dev_user2 # 创建开发用户2 useradd -m -s /bin/bash test_user # 创建测试用户不在项目组 设置用户密码生产环境应使用更安全的方式 echo dev_user1:Password123 | chpasswd echo dev_user2:Password123 | chpasswd echo test_user:Password123 | chpasswd echo ✓ 组和用户创建完成 echo 2. 创建项目目录并设置权限 echo 2. 创建项目目录并设置权限... PROJECT_DIR/opt/my_project mkdir -p $PROJECT_DIR 设置目录所有者为root所属组为project_team chown root:project_team $PROJECT_DIR 设置目录权限所有者rwx组rwx其他人无权限770 chmod 770 $PROJECT_DIR 设置SGID位使目录下新建文件自动继承组权限 chmod gs $PROJECT_DIR echo 项目目录: $PROJECT_DIR echo 权限设置: $(ls -ld $PROJECT_DIR) echo ✓ 项目目录权限配置完成 echo 3. 创建测试文件验证权限继承 echo 3. 创建测试文件验证权限继承... 切换到dev_user1创建文件 sudo -u dev_user1 touch $PROJECT_DIR/file_by_dev1.txt sudo -u dev_user1 echo 这是dev_user1创建的文件 $PROJECT_DIR/file_by_dev1.txt 切换到dev_user2创建文件 sudo -u dev_user2 touch $PROJECT_DIR/file_by_dev2.txt sudo -u dev_user2 echo 这是dev_user2创建的文件 $PROJECT_DIR/file_by_dev2.txt echo 创建的文件列表 ls -l $PROJECT_DIR/ echo ✓ 测试文件创建完成 echo 4. 权限验证步骤 echo 4. 权限验证测试... echo echo 测试1: dev_user1 读取自己创建的文件 sudo -u dev_user1 cat $PROJECT_DIR/file_by_dev1.txt if [ $? -eq 0 ]; then echo ✓ dev_user1 可以读取自己的文件 else echo ✗ dev_user1 无法读取自己的文件 fi echo echo 测试2: dev_user1 读取 dev_user2 创建的文件 sudo -u dev_user1 cat $PROJECT_DIR/file_by_dev2.txt if [ $? -eq 0 ]; then echo ✓ dev_user1 可以读取组内成员的文件SGID生效 else echo ✗ dev_user1 无法读取组内成员的文件 fi echo echo 测试3: dev_user2 修改 dev_user1 创建的文件 sudo -u dev_user2 echo 追加内容 by dev_user2 $PROJECT_DIR/file_by_dev1.txt if [ $? -eq 0 ]; then echo ✓ dev_user2 可以修改组内成员的文件 else echo ✗ dev_user2 无法修改组内成员的文件 fi echo echo 测试4: test_user非项目组成员尝试读取文件 sudo -u test_user cat $PROJECT_DIR/file_by_dev1.txt 2/dev/null if [ $? -eq 0 ]; then echo ✗ test_user 可以读取文件权限配置有问题 else echo ✓ test_user 无法读取文件权限正确 fi echo echo 测试5: test_user 尝试删除文件 sudo -u test_user rm $PROJECT_DIR/file_by_dev1.txt 2/dev/null if [ $? -eq 0 ]; then echo ✗ test_user 可以删除文件权限配置有问题 else echo ✓ test_user 无法删除文件权限正确 fi echo echo 测试6: 验证SGID位是否生效 NEW_FILE$PROJECT_DIR/test_sgid.txt sudo -u dev_user1 touch $NEW_FILE FILE_GROUP$(ls -l $NEW_FILE | awk {print $4}) if [ $FILE_GROUP project_team ]; then echo ✓ SGID生效新文件自动继承目录所属组(project_team) else echo ✗ SGID未生效新文件所属组为 $FILE_GROUP fi echo 清理可选 echo 5. 清理测试环境... read -p 是否清理测试用户和目录(y/n): -n 1 -r echo if [[ $REPLY ~ ^[Yy]$ ]]; then userdel -r dev_user1 userdel -r dev_user2 userdel -r test_user groupdel project_team rm -rf $PROJECT_DIR echo ✓ 测试环境已清理 else echo 测试环境保留可手动检查 echo 项目目录: $PROJECT_DIR echo 测试用户: dev_user1, dev_user2, test_user echo 项目组: project_team fi echo echo 脚本执行完成 echo 总结通过本脚本可以验证 echo 1. 组内成员可以互相读写文件 echo 2. 非组用户无法访问项目目录 echo 3. SGID确保新文件自动继承组权限 echo 4. 权限继承和边界测试完整脚本使用说明以 root 用户身份运行此脚本sudo bash project_permission_setup.sh脚本会创建项目组project_team和三个测试用户创建项目目录/opt/my_project并设置权限为 770 SGID自动执行6个权限验证测试验证组内协作和外部隔离最后提供清理选项避免留下测试数据关键点说明SGID权限目录设置gs后任何用户在该目录创建的文件都会自动继承目录的所属组权限770所有者(root)和组(project_team)有完全权限其他用户无任何权限权限验证脚本自动用不同用户身份测试读、写、删除操作验证权限配置是否正确生产环境建议实际使用时应使用更安全的密码设置方式并考虑使用 ACL 进行更细粒度的权限控制十、总结Linux 权限模型强大而灵活掌握chmod、chown、特殊权限、umask和 ACL 这些核心工具就能从容应对绝大多数生产环境权限配置需求。建议在虚拟机或容器中多动手实验加深理解。