核心 · Key Idea
一句话:Linux 不分盘符 —— 所有存储都挂载到根 / 之下的某个目录。一块硬盘要先分区 → 创建文件系统 → 挂载才能用。
是什么#
磁盘 → 分区 → 文件系统 → 挂载点
/dev/nvme0n1
└ /dev/nvme0n1p1 (EFI)
└ /dev/nvme0n1p2 (ext4 → /)
└ /dev/nvme0n1p3 (ext4 → /var)
新加一块盘 /dev/sdb:
parted /dev/sdb mklabel gpt mkpart primary 0% 100%
mkfs.ext4 /dev/sdb1
mount /dev/sdb1 /mnt/data
打个比方#
打个比方 · Analogy
磁盘像仓库:先把仓库用墙隔成几个房间(分区),每个房间装上书架体系(文件系统),最后给房间钉上路牌(挂载到 /var/data)。
关键概念#
块设备Block Device
/dev/sda /dev/nvme0n1 等。lsblk 可视化。
分区表MBR / GPT
GPT 是现代标准,支持 >2T 和无限分区。
文件系统FS
ext4(默认稳定)、xfs(大容量)、btrfs / zfs(快照),tmpfs(内存)。
Inode索引节点
存文件元数据 + 指向数据块。inode 用尽即使空间没满也不能新建。
挂载点Mount Point
目录,挂上之后访问该目录就是访问设备。
fstab/etc/fstab
开机自动挂载表。
LVM逻辑卷管理
在分区之上再抽象一层,方便扩容 / 快照。
常用命令#
# 看
lsblk -f # 树状看磁盘 + 文件系统 + 挂载
df -hT # 已挂载分区的剩余空间和类型
du -sh /var/log/* # 看某目录占用
ncdu / # 交互式磁盘占用
# 操作
mount /dev/sdb1 /mnt/data
umount /mnt/data
mount -o remount,ro / # 改成只读挂载
# 新盘从零开始
sudo mkfs.ext4 -L data /dev/sdb1
sudo mkdir /data
echo 'LABEL=data /data ext4 defaults,noatime 0 2' | sudo tee -a /etc/fstab
sudo mount -a怎么工作#
VFS 让应用看到统一接口;底层换什么文件系统都不感知。
实操要点#
-
fstab用UUID=或LABEL=,不要写/dev/sdb1—— 设备名重启可能变。 -
noatime选项:禁用最后访问时间,省一次写,对 SSD 友好。 -
磁盘满了别只看 df:
df -i看 inode 是不是也满了。 -
swap:内存不够时换页到磁盘。云主机一般默认无 swap,可以用 swapfile 加:
fallocate -l 4G /swapfile && chmod 600 /swapfile mkswap /swapfile && swapon /swapfile -
du -sh dir/* | sort -h找占空间的目录。 -
磁盘满应急:先清
/var/log/*.log旧日志和/var/cache,然后看journalctl --vacuum-size=200M。 -
大文件被删但磁盘没释放:进程还持有该文件 fd。
lsof | grep deleted找出来重启进程。
易混点#
df
从**文件系统层**看可用空间。
瞬时、近实时。
瞬时、近实时。
du
递归累加**文件大小**。
慢,但精确知道**谁占的**。
慢,但精确知道**谁占的**。