第七章、Linux 磁盘与文件系统管理 7.1 认识 Linux 文件系统 文件系统的特性 什么是文件系统
文件系统是操作系统用于管理磁盘上的文件的方法和数据结构。它定义了文件的存储方式、命名规则、访问权限等。
Linux 支持的文件系统类型:
文件系统
特点
适用场景
ext2
传统 Linux 文件系统,无日志
简单嵌入式系统
ext3
ext2 + 日志功能
过渡使用
ext4
现代标准,高性能,大容量支持
通用场景,推荐
xfs
高性能,大文件支持,并行 I/O
大数据,数据库
btrfs
现代特性:快照、压缩、多设备
高级用户
swap
交换分区/文件
虚拟内存
vfat/fat32
Windows 兼容
UEFI、移动设备
ntfs
Windows 文件系统
双系统数据共享
nfs
网络文件系统
文件共享
cifs/smb
Windows 网络共享
Samba 共享
ext4 文件系统详解 ext4 的主要特性:
更大的文件系统和文件
最大文件系统:1EB (Exabyte)
最大文件大小:16TB
Extents 存储方式
日志校验和 (Journal Checksums)
向后兼容
延迟分配 (Delayed Allocation)
ext4 关键参数:
1 2 3 4 5 6 7 8 9 10 11 dumpe2fs /dev/sda1 tune2fs -l /dev/sda1 tune2fs -m 1 /dev/sda1
XFS 文件系统详解 XFS 的主要特性:
高性能
可扩展性
日志结构
分配组 (Allocation Groups)
XFS 管理命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 mkfs.xfs /dev/sdb1 mkfs.xfs -L "Data" /dev/sdb1 xfs_info /dev/sdb1 xfs_growfs /mnt/data xfs_repair /dev/sdb1 xfs_repair -n /dev/sdb1
XFS vs ext4 选择建议:
场景
推荐文件系统
通用桌面系统
ext4
小型服务器
ext4
大型数据库
XFS
大数据处理
XFS
视频/多媒体存储
XFS
虚拟化存储
XFS
容器镜像存储
XFS
7.2 文件系统的简单操作 磁盘与目录的容量 df 命令 - 查看文件系统磁盘空间:
1 2 3 4 5 6 7 8 9 10 11 12 13 df df -h df -H df -T df -i df -l df -x tmpfs df /home df -hT df -h | grep -E '(Filesystem|/dev/)'
du 命令 - 查看目录/文件大小:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 du du -h du -s du -sh /path du -a du --max-depth=1 /path du --max-depth=2 /path du -sh /* 2>/dev/null | sort -h du -sh /home/* 2>/dev/null | sort -hr | head -10 du -ah /path | sort -hr | head -20 du -h --max-depth=1 /var | sort -h du -sh --exclude='*.log' /var/logdu -sh --exclude='node_modules' /project
ln 命令 - 创建链接文件:
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 ln original.txt hardlink.txt ln /path/to/file /another/path/linkln -s original.txt symlink.txt ln -s /path/to/file /path/to/linkln -s /path/to/directory /path/to/linkname-f -i -v -n -s ln -s /usr/local/bin/myapp /usr/bin/myapp ln -s /mnt/data/docs ~/Documents ln -s ~/dotfiles/.bashrc ~/.bashrc ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ls -l readlink symlink.txt readlink -f symlink.txt
硬链接 vs 软链接:
特性
硬链接
软链接(符号链接)
本质
同一文件的不同名字
指向另一个文件/目录的快捷方式
inode
相同
不同
跨文件系统
不支持
支持
链接目录
不支持
支持
原文件删除
数据仍然存在
链接失效(悬空链接)
大小
与源文件相同
很小(路径长度)
用途
文件备份、防止误删
快捷方式、版本管理、系统配置
7.3 磁盘的分区、格式化、检验与挂载 分区操作 lsblk - 列出块设备:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 lsblk lsblk -a lsblk -f lsblk -m lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT,MODEL lsblk -p lsblk -t lsblk -b lsblk --tree lsblk -d lsblk -fpm watch -n 1 lsblk
blkid - 查看块设备属性:
1 2 3 4 5 6 7 8 9 10 11 blkid blkid /dev/sda1 blkid -U UUID blkid -L LABEL blkid -t TYPE=ext4 blkid -o device -t UUID=xxx blkid -o export /dev/sda1 blkid | grep ext4 blkid -o export | grep UUID
格式化(创建文件系统) mkfs 系列命令:
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 mkfs -t type device mkfs.type device mkfs.ext4 /dev/sdb1 mkfs -t ext4 /dev/sdb1 mke2fs -t ext4 /dev/sdb1 mkfs.ext4 -L "Data" /dev/sdb1 mkfs.ext4 -N 1000000 /dev/sdb1 mkfs.ext4 -m 1 /dev/sdb1 mkfs.ext4 -E stride=128 /dev/sdb1 mkfs.ext4 -O ^metadata_csum /dev/sdb1 mkfs.xfs /dev/sdb1 mkfs -t xfs /dev/sdb1 mkfs.xfs -L "Data" /dev/sdb1 mkfs.xfs -f /dev/sdb1 mkfs.xfs -d agcount=4 /dev/sdb1 mkfs.xfs -l size=128m /dev/sdb1 mkfs.xfs -n size=64k /dev/sdb1 mkfs.vfat -F 32 /dev/sda1 mkfs.fat -F 32 -n "EFI" /dev/sda1 mkfs.btrfs /dev/sdb1 mkfs.jfs /dev/sdb1 mkfs.reiserfs /dev/sdb1 mkswap /dev/sda3 mkswap -L "Swap" /dev/sda3 swapon /dev/sda3 swapoff /dev/sda3
检验文件系统 fsck - 文件系统检查:
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 27 28 29 30 31 32 33 34 35 36 37 38 fsck.ext4 /dev/sda1 e2fsck /dev/sda1 xfs_repair /dev/sdb1 fsck -t ext4 /dev/sda1 fsck -A fsck -a fsck -r fsck -n fsck -f fsck -v fsck -y umount /dev/sda1 fsck -f /dev/sda1 shutdown -rF now e2fsck -c /dev/sda1 e2fsck -cc /dev/sda1 xfs_repair /dev/sdb1 xfs_repair -n /dev/sdb1 xfs_repair -L /dev/sdb1 xfs_repair -o force_geometry /dev/sdb1 xfs_logprint /dev/sdb1
坏块检测与处理:
1 2 3 4 5 6 7 8 9 10 11 12 badblocks -s -v /dev/sda1 badblocks -s -w -v /dev/sda1 badblocks -s -v -o badblocks.list /dev/sda1 mkfs.ext4 -l badblocks.list /dev/sda1 e2fsck -l badblocks.list /dev/sda1
挂载文件系统 基本挂载:
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 27 28 29 30 31 32 33 34 35 36 37 mount /dev/sdb1 /mnt/data mount -t ext4 /dev/sdb1 /mnt/data mount -t ntfs /dev/sdb2 /mnt/windows mount -t vfat /dev/sdc1 /mnt/usb -o ro -o rw -o noatime -o nodiratime -o sync -o async -o auto -o noauto -o user -o nouser -o exec -o noexec -o suid -o nosuid -o remount -o bind mount -o ro,remount / mount -o noatime /dev/sdb1 /mnt/data mount -o uid=1000,gid=1000 /dev/sdc1 /mnt/usb mount --bind /var/log /mnt/logs mount --rbind /home /chroot/home mount --move /mnt/old /mnt/new
卸载文件系统:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 umount /mnt/data umount /dev/sdb1 umount -f /mnt/data umount -l /mnt/data umount -r /mnt/data umount -a umount -a -t ext4 lsof /mnt/data fuser -mv /mnt/data fuser -km /mnt/data umount /mnt/data
自动挂载配置(/etc/fstab):
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / ext4 defaults,noatime 0 1 UUID=yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy /boot ext4 defaults,noatime 0 2 UUID=zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz /home ext4 defaults,noatime 0 2 UUID=aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa /data ext4 defaults,noatime,noexec 0 2 UUID=bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb none swap sw 0 0 tmpfs /tmp tmpfs defaults,nosuid,nodev,noexec 0 0 /home/user/data /var/www/data none bind 0 0 server:/export/share /mnt/share nfs defaults,_netdev 0 0 //windows/share /mnt/winshare cifs credentials=/root/.smbcred,iocharset=utf8 0 0
获取 UUID 和标签:
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 blkid blkid /dev/sda1 blkid -U xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx blkid -L Data e2label /dev/sda1 "System" tune2fs -L "System" /dev/sda1 xfs_admin -L "Data" /dev/sdb1 fatlabel /dev/sdc1 "USB_DRIVE" e2label /dev/sda1 xfs_admin -l /dev/sdb1
fstab 管理工具:
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 mount -fav findmnt --verify mount -a mount -a -t ext4 mount -a -t nfs mount -a -t noext4 mount | column -t findmnt findmnt -D findmnt -f findmnt /mnt/data findmnt /dev/sdb1
7.4 设置开机挂载 使用 /etc/fstab 如前所述,/etc/fstab 是 Linux 系统中最常用的开机挂载配置方式。
使用 systemd mount 单元 对于使用 systemd 的系统,可以使用 mount 单元来管理挂载:
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 sudo nano /etc/systemd/system/mnt-data.mount[Unit] Description=Data partition After=local-fs.target [Mount] What=/dev/disk/by-uuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Where=/mnt/data Type=ext4 Options=defaults,noatime [Install] WantedBy=multi-user.target sudo nano /etc/systemd/system/mnt-data.automount[Unit] Description=Automount Data partition [Automount] Where=/mnt/data [Install] WantedBy=multi-user.target sudo systemctl daemon-reloadsudo systemctl enable mnt-data.mountsudo systemctl start mnt-data.mountsudo systemctl status mnt-data.mountsudo systemctl enable mnt-data.automountsudo systemctl start mnt-data.automount
7.5 内存交换空间(swap)的管理 什么是 swap Swap(交换空间)是当物理内存不足时,系统用来临时存放数据的空间。可以是:
交换分区 :专用的磁盘分区
交换文件 :普通文件作为交换空间
查看 swap 状态 1 2 3 4 5 6 7 8 9 10 11 12 13 14 free -h free -m swapon -s swapon --show swapon --show=NAME,TYPE,SIZE,USED,PRIO cat /proc/swapsvmstat 1 10 watch -n 1 free -h
创建交换分区 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 sudo fdisk /dev/sdbsudo mkswap /dev/sdb1sudo mkswap -L "Swap" /dev/sdb1 sudo swapon /dev/sdb1sudo blkid /dev/sdb1UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx none swap sw 0 0 /dev/sdb1 none swap sw 0 0 sudo swapon -asudo swapon -p 10 /dev/sdb1 UUID=xxx none swap sw,pri=10 0 0
创建交换文件 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 27 sudo dd if =/dev/zero of=/swapfile bs=1M count=8192 status=progresssudo fallocate -l 8G /swapfilesudo chmod 600 /swapfilesudo mkswap /swapfilesudo swapon /swapfilesudo swapon --showfree -h sudo nano /etc/fstab/swapfile none swap sw 0 0 sudo swapoff -asudo swapon -a
调整 swappiness vm.swappiness 参数控制系统使用 swap 的倾向:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 cat /proc/sys/vm/swappinesssysctl vm.swappiness sudo sysctl vm.swappiness=10sudo nano /etc/sysctl.confvm.swappiness=10 sudo sysctl -p
删除 swap 1 2 3 4 5 6 7 8 9 sudo swapoff /dev/sdb1sudo fdisk /dev/sdb sudo swapoff /swapfilesudo rm /swapfile
7.6 文件系统的特殊查看与操作 磁盘配额(Quota) 用于限制用户或组对磁盘空间的使用。
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 27 28 29 30 31 32 33 34 35 36 37 sudo yum install quotaUUID=xxx /home ext4 defaults,usrquota,grpquota 0 0 sudo mount -o remount /homesudo quotacheck -cug /homesudo quotaon /homequota -v username repquota /home repquota -a sudo edquota usernamesetquota -u username 0 0 0 0 /home sudo quotaoff /homequotacheck -avugm repquota -aug warnquota
磁盘阵列(RAID) 使用 mdadm 创建软件 RAID:
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 sudo yum install mdadmcat /proc/mdstatmdadm --detail /dev/md0 mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb1 /dev/sdc1 mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1 mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1 mdadm --create /dev/md0 --level=6 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 mkfs.ext4 /dev/md0 mkdir /mnt/raidmount /dev/md0 /mnt/raid echo '/dev/md0 /mnt/raid ext4 defaults 0 0' >> /etc/fstabmdadm --detail --scan >> /etc/mdadm.conf mdadm --detail --scan | sudo tee -a /etc/mdadm.conf mdadm --detail /dev/md0 mdadm --stop /dev/md0 cat /proc/mdstat mdadm --manage /dev/md0 --add /dev/sde1 mdadm --manage /dev/md0 --remove /dev/sdb1 --fail /dev/sdb1
逻辑卷管理(LVM) LVM 提供灵活的磁盘空间管理:
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 sudo yum install lvm2pvs vgs lvs pvdisplay vgdisplay lvdisplay pvcreate /dev/sdb1 pvcreate /dev/sdc1 vgcreate vg_data /dev/sdb1 /dev/sdc1 vgextend vg_data /dev/sdd1 lvcreate -L 50G -n lv_www vg_data lvcreate -l 100%FREE -n lv_backup vg_data lvcreate -l 50%VG -n lv_data vg_data lvcreate -s -n lv_snap -L 10G /dev/vg_data/lv_www mkfs.ext4 /dev/vg_data/lv_www mkdir -p /var/wwwmount /dev/vg_data/lv_www /var/www echo '/dev/mapper/vg_data-lv_www /var/www ext4 defaults,noatime 0 0' >> /etc/fstablvextend -L +50G /dev/vg_data/lv_www lvextend -L 100G /dev/vg_data/lv_www lvextend -l +100%FREE /dev/vg_data/lv_www resize2fs /dev/vg_data/lv_www xfs_growfs /var/www umount /var/www e2fsck -f /dev/vg_data/lv_www resize2fs /dev/vg_data/lv_www 50G lvreduce -L 50G /dev/vg_data/lv_www mount /dev/vg_data/lv_www /var/www umount /var/www lvremove /dev/vg_data/lv_www vgchange -an vg_data vgremove vg_data pvremove /dev/sdb1 pvremove /dev/sdc1 lvcreate -s -n lv_snap -L 50G /dev/vg_data/lv_www mkdir /mnt/snapmount /dev/vg_data/lv_snap /mnt/snap tar czf backup.tar.gz -C /mnt/snap . umount /mnt/snap lvremove /dev/vg_data/lv_snap
7.7 重点回顾
文件系统 :ext4(通用)、xfs(大容量)、swap(交换分区)
分区工具 :fdisk(MBR)、gdisk(GPT)、parted(两者)
格式化 :mkfs.ext4、mkfs.xfs、mkswap
文件系统检查 :fsck、e2fsck、xfs_repair
挂载 :mount、umount、/etc/fstab
磁盘配额 :quota 限制用户/组的磁盘使用
RAID :mdadm 创建软件磁盘阵列
LVM :灵活的磁盘空间管理,支持在线扩容
swap :交换分区或交换文件,用于虚拟内存
性能优化 :noatime、日志模式、RAID、LVM 等
7.8 本章习题
解释 ext4 和 xfs 文件系统的主要特点,什么情况下应该选择 xfs?
如何查看当前系统的磁盘分区和使用情况?
新添加了一块硬盘 /dev/sdb,请描述创建分区、格式化、挂载和配置开机自动挂载的完整步骤。
什么是 LVM?使用 LVM 有什么好处?
创建 RAID 1 阵列并配置为自动挂载的详细步骤是什么?
如何检查和修复 ext4 文件系统的错误?
系统内存不足,如何添加 swap 空间?描述创建 swap 文件的方法。
解释磁盘配额的作用,如何为用户设置磁盘配额限制?
7.9 参考资料与延伸阅读