mount和umount命令最全使用指南

mount和umount命令最全使用指南

mount/umount 是 Linux 存储管理的基石:一切皆文件,而一切设备、镜像、网络共享都通过"挂载"接入这棵文件树。本文基于 util-linux 2.39.3,覆盖 mount/umount 的全部用法、挂载选项速查、fstab 完全指南与真实应用场景,所有示例输出均采集自真实环境。

目录

挂载是什么:VFS 与挂载原理

安装、版本与帮助

mount 命令语法总览

mount 全部选项详解

-o 通用挂载选项完全手册

各文件系统专属选项(ext4/xfs/btrfs/vfat/ntfs/nfs/cifs/tmpfs/overlay/iso9660)

查看挂载状态:mount / findmnt / lsblk / df / /proc/mounts

umount 命令与选项详解

/etc/fstab 完全指南

十二大实战应用场景

安全加固:nosuid / nodev / noexec

常见问题与排错

一页速查表(Cheat Sheet)

1. 挂载是什么:VFS 与挂载原理

1.1 核心概念

Linux 用一棵单一的目录树组织所有文件。磁盘分区、U 盘、ISO 镜像、NFS 共享、内存文件系统……都必须挂载(mount)到目录树上的某个目录(称为挂载点),才能被访问。

挂载前:挂载点目录里原有的内容依然存在,只是被"遮住"了。

挂载后:访问该目录 = 访问新设备的文件系统。

卸载后:原目录内容重新可见。

这一层抽象由内核的 VFS(Virtual File System,虚拟文件系统) 提供,对上统一接口(open/read/write),对下分发到 ext4、xfs、nfs、tmpfs 等具体驱动。

1.2 一次挂载的生命周期

设备/镜像/共享 ──► mount ──► 挂载点(目录树分支)──► 读写 ──► umount ──► 断开

│ │

└─ /dev/sdb1 └─ 必须已存在(空目录最佳)

1.3 三条铁律

挂载点目录必须已存在(mkdir -p 先行),且强烈建议为空目录——非空目录挂载后原内容被遮蔽,容易造成"文件消失"的错觉。

卸载前确保无人使用:任何进程打开的文件、占用的 cwd 都会让 umount 报 target is busy。

关机前 sync:异步写默认开启,数据可能在缓存里,直接拔盘 = 数据丢失。

2. 安装、版本与帮助

mount/umount 属于 util-linux 包,所有发行版预装:

$ mount --version

mount,来自 util-linux 2.39.3(libmount 2.39.3: selinux, smack, btrfs, verity, namespaces, idmapping, statx, assert, debug)

内核支持的文件系统:cat /proc/filesystems(带 nodev 前缀的是虚拟文件系统,无需块设备)。

用户态工具:mkfs.*、mount.* 助手(如 mount.nfs、mount.cifs 由 nfs-common / cifs-utils 提供),缺什么装什么:

apt install nfs-common cifs-utils ntfs-3g sshfs exfatprogs # Debian/Ubuntu

yum install nfs-utils cifs-utils ntfs-3g sshfs # RHEL 系

3. mount 命令语法总览

mount [选项] <设备> <挂载点> # 经典形式

mount <挂载点> # 配合 /etc/fstab 简写

mount <设备>

mount -a # 挂载 fstab 中所有 auto 项

设备可以有多种写法,mount 会自动识别:

mount /dev/sdb1 /mnt/data # 设备路径

mount UUID=7EED-02AD /mnt/efi # 按 UUID

mount LABEL=backup /mnt/backup # 按卷标

mount -t nfs 192.168.1.10:/share /mnt/nfs # 网络文件系统

mount -o loop disk.iso /mnt/iso # 文件镜像

推荐用 UUID:设备名 /dev/sdb1 会随插拔顺序漂移(重启后可能变 sdc1),UUID 绑定的是文件系统本身,永远稳定。查 UUID:blkid 或 lsblk -f。

4. mount 全部选项详解

4.1 常用选项速查

选项

长选项

作用

-t

--types

指定文件系统类型(ext4/xfs/nfs/vfat/ntfs/tmpfs…)。通常可省略,mount 自动探测;探测失败时才需要

-o

--options

挂载选项列表,逗号分隔(下一章详解,本文核心)

-a

--all

挂载 /etc/fstab 中所有未挂载的 auto 项。改完 fstab 先 mount -a 验证再重启

-r

--read-only

只读挂载,等价 -o ro

-w

--rw

读写挂载(默认),等价 -o rw

-n

--no-mtab

挂载但不写入 /etc/mtab(救援环境 mtab 不可写时用)

-B

--bind

绑定挂载:把一个目录挂到另一个位置

-R

--rbind

递归绑定挂载(含子挂载)

-M

--move

移动挂载点到新位置(不停业务搬家)

-L

--label

按卷标挂载

-U

--uuid

按 UUID 挂载

-T

--fstab

指定替代的 fstab 文件

-f

--fake

演练:走完流程但不真正调用 mount(2)(配合 -n 调试用)

-v

--verbose

啰嗦模式,显示执行细节

-F

--fork

配合 -a 并行挂载(NFS 多时加速开机)

-s

容忍 sloppy 选项(忽略不识别的挂载选项而不是报错)

-i

不调用 /sbin/mount.* 助手程序

-l

--show-labels

输出中显示卷标

-c

--no-canonicalize

不规范化路径(某些自动化场景)

--mkdir

挂载点不存在时自动创建(util-linux 2.39+,免去手动 mkdir)

--target-prefix

给 fstab 中所有相对挂载点加前缀(chroot 友好)

--options-source

挂载选项来源:fstab / mtab / disable

--options-mode

选项合并模式:ignore / append / prepend / replace

-N

--namespace

在指定的挂载命名空间中执行 mount

-X

--list-propagated

列出传播类型(shared/slave/private)

4.2 三种"组织型"挂载

这三个是现代运维高频操作,单独强调:

mount --bind /data/www /var/www # 目录"分身":同一内容两个入口

mount --rbind /data/www /var/www # 连子挂载一起分身(chroot/容器必备)

mount --move /mnt/old /mnt/new # 搬家:把已挂载的内容平移到新挂载点,业务无感知

5. -o 通用挂载选项完全手册

-o 后接逗号分隔的选项,是所有文件系统通用的部分(专属选项见第 6 章)。

5.1 读写与数据一致性

选项

作用

场景

rw

读写(默认)

常规

ro

只读

取证、救援、防止误改、ISO/备份盘

sync

所有写操作同步落盘

U 盘防丢数据(速度慢);与 async 互斥

async

异步写(默认)

性能优先

dirsync

目录操作同步

高可靠元数据

flush(vfat 系)

更积极刷缓存

FAT U 盘常用

5.2 安全三兄弟(生产环境重点)

选项

作用

nosuid

忽略 suid/sgid 位——挂载盘上的 setuid 程序无法提权

nodev

不解析设备文件——挂载盘上的 /dev/sda 式文件失效

noexec

禁止执行任何程序/脚本——数据盘、上传目录标配

mount -o nosuid,nodev,noexec /dev/sdc1 /mnt/usb

/tmp、/var/tmp、/home、可移动介质都应考虑这组选项(详见第 11 章)。

5.3 访问时间(性能优化)

每次读文件都更新 atime(访问时间)会产生大量额外写操作,SSD 和数据库服务器上很浪费:

选项

行为

relatime

默认。仅当 atime 早于 mtime/ctime 或超过 24 小时才更新——兼顾兼容与性能

noatime

完全不更新 atime(含目录),性能最佳

nodiratime

只免目录 atime

strictatime

每次都更新(老 POSIX 行为)

# 数据库/高负载盘推荐

mount -o noatime /dev/nvme0n2p1 /var/lib/mysql

5.4 权限与属主

选项

作用

user

允许普通用户挂载该设备(需配合 fstab)

nouser

仅 root 可挂载(默认)

users

任何用户可挂载,且任何用户可卸载

owner

设备的属主用户可挂载

group

属组用户可挂载

uid= gid=

挂载后文件属主(vfat/ntfs/iso9660 等无权限概念的 FS 必用)

umask= fmask= dmask=

挂载后文件权限掩码(vfat/ntfs/exfat)

mode=

tmpfs/ramfs/devpts 的目录权限

# NTFS 移动硬盘挂给普通用户(uid 1000),权限 755/644

mount -t ntfs-3g -o uid=1000,gid=1000,umask=022 /dev/sdb1 /mnt/ntfs

5.5 行为控制

选项

作用

auto / noauto

是否被 mount -a 与开机自动挂载

defaults

= rw,suid,dev,exec,auto,nouser,async,fstab 里的万金油

remount

在线修改已挂载文件系统的选项,无需卸载(见场景八)

loop

通过 loop 设备挂载文件镜像(ISO/img)

_netdev

标记为网络设备:系统等网络就绪后才挂载(NFS/CIFS/iSCSI 的 fstab 必加)

nofail

挂载失败不阻断开机流程(外挂盘、U 盘的 fstab 强烈建议加)

x-systemd.automount

systemd 按需自动挂载(首次访问才触发)

x-systemd.idle-timeout=60

自动卸载空闲超时

x-systemd.device-timeout=10s

设备等待超时(配合 nofail 防开机卡死)

x-systemd.requires=...

挂载依赖的 systemd unit

comment= / x-*

注释性选项,systemd/工具可读,内核忽略

5.6 传播与命名空间(容器/高级)

选项

作用

shared

挂载事件双向传播到对等组

slave

只接收主方向的传播

private

不传播(默认,容器隔离靠它)

unbindable

禁止被 bind

mount --make-rprivate / # Docker 启动时做的隔离动作

mount --make-rshared /mnt/shared # 多容器共享挂载事件的场景

6. 各文件系统专属选项

6.1 ext4 / ext3 / ext2

选项

作用

data=ordered(默认)/ data=writeback / data=journal

日志模式:均衡 / 最快 / 最强一致性

commit=5

元数据落盘间隔(秒)

errors=remount-ro(默认)/ continue / panic

出错时的行为

barrier=1/0

写屏障(断电保护,关它提速但掉电风险)

discard / nodiscard

在线 TRIM(SSD)。多数场景建议用定期 fstrim 而非在线 discard

inode_readahead_blks=

预读调优

6.2 XFS

选项

作用

inode64

允许 inode 跨 >1TB 位置(大盘必加)

largeio / nolargeio

大 IO 优化

allocsize=

预分配大小

logbufs= logbsize=

日志缓冲

noquota / uquota / gquota / pquota

配额

nouuid

挂载克隆盘(UUID 冲突时,如 LVM 快照/XFS 复制)

6.3 Btrfs

选项

作用

subvol=@home

挂载指定子卷

compress=zstd:3 / compress=lzo

透明压缩(zstd 是当下的最优解)

ssd / nossd

SSD 优化开关

autodefrag

在线碎片整理(随机写重的数据库不建议)

space_cache=v2

空间缓存版本

degraded

降级挂载缺失盘的 RAID 阵列(救数据用)

6.4 vfat / exfat / NTFS(U 盘、移动硬盘、双系统)

选项

作用

uid= gid= umask= fmask= dmask=

模拟权限(这些 FS 本身没有 Linux 权限位)

iocharset=utf8

文件名编码

shortname=mixed

短文件名处理

flush

积极刷盘(vfat)

windows_names(ntfs-3g)

拒绝 Windows 非法文件名

big_writes(ntfs-3g)

大块写提速

remove_hiberfile(ntfs-3g)

允许挂载休眠状态的 Windows 分区(有数据风险,优先正常关机或 powercfg /h off)

知识点:Windows 快速启动/休眠会锁住 NTFS,Linux 挂载时报 "hibernated" / "unclean shutdown"。解法:Windows 里 powercfg /h off 或完整重启,Linux 侧只读挂载救数据。

6.5 NFS

mount -t nfs -o vers=4.2,hard,intr,rsize=1048576,wsize=1048576 192.168.1.10:/data /mnt/nfs

选项

作用

vers=3/4/4.1/4.2

协议版本(4.x 推荐,穿越防火墙只需 2049)

hard / soft

服务器无响应时无限重试 / 报错返回。hard+intr 是生产常用组合,soft 可能造成静默数据损坏

intr / nointr

允许信号中断挂起的调用

rsize= wsize=

读写块大小,现代网络给 1048576(1M)

timeo= retrans=

超时与重传次数

bg

挂载失败转后台重试(fstab 防卡开机)

nolock

关闭锁(老服务器兼容)

sec=sys/krb5

认证方式

noacl

关 ACL 支持(兼容性)

6.6 CIFS/SMB(Windows 共享、NAS)

mount -t cifs //192.168.1.20/share /mnt/smb \

-o username=guest,password=,vers=3.0,iocharset=utf8,uid=1000,gid=1000,file_mode=0644,dir_mode=0755,nofail,_netdev

选项

作用

username= password= / credentials=/root/.smbcred

认证。密码别写命令行(会进 history 和 /proc),用 credentials 文件并 chmod 600

vers=2.0/2.1/3.0/3.1.1

SMB 协议版本(现代 NAS 用 3.1.1;老设备可能要 2.0)

uid/gid/file_mode/dir_mode

映射到 Linux 的属主与权限

iocharset=utf8

中文文件名不乱码

noperm

客户端不检查权限

mfsymlinks

支持符号链接

cache=strict/none/loose

缓存模式

seal

强制加密(SMB3)

6.7 tmpfs / ramfs(内存文件系统)

mount -t tmpfs -o size=2G,mode=1777,nosuid,nodev,noexec tmpfs /dev/shm-work

选项

作用

size=

容量上限(默认物理内存一半),支持 K/M/G 与百分比

nr_inodes=

inode 上限

mode= uid= gid=

根目录权限与属主

mpol=

NUMA 内存策略

tmpfs vs ramfs:tmpfs 可换出到 swap、有容量上限;ramfs 不可换出、无上限(写爆会 OOM)。生产几乎只用 tmpfs。

6.8 overlayfs(Docker 同款联合文件系统)

mount -t overlay overlay \

-o lowerdir=/lower1:/lower2,upperdir=/upper,workdir=/work /merged

四层含义:lowerdir 只读层(可多个,冒号分隔,左新右旧);upperdir 可写层;workdir 工作目录(需空且与 upper 同盘);merged 呈现层。手动挂载 overlay 是理解容器镜像分层的最佳实践,也是现场改容器文件不动镜像的救急手段。

6.9 iso9660 / udf(光盘镜像)

mount -o loop,ro -t iso9660 ubuntu.iso /mnt/iso # 标准 ISO

mount -o loop -t udf bluray.iso /mnt/iso # 大文件蓝光盘镜像

6.10 sshfs(FUSE,免服务端配置的网络盘)

sshfs user@192.168.1.30:/home/user /mnt/remote -o reconnect,ServerAliveInterval=15

umount /mnt/remote # FUSE 也可用 fusermount -u /mnt/remote

7. 查看挂载状态

7.1 mount 无参数:原始全量列表

$ mount | head -5

sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)

proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)

udev on /dev type devtmpfs (rw,nosuid,relatime,size=14722688k,nr_inodes=3680672,mode=755,inode64)

/dev/nvme0n1p6 on / type ext4 (rw,relatime)

tmpfs on /run type tmpfs (rw,nosuid,nodev,noexec,relatime,size=3258752k,mode=755,inode64)

格式:源 on 挂载点 type 类型 (选项)。配合 grep 过滤:mount | grep /dev/sd。

7.2 findmnt:树状视图(推荐首选)

$ findmnt

TARGET SOURCE FSTYPE OPTIONS

/ /dev/nvme0n1p6 ext4 rw,relatime

├─/sys sysfs sysfs rw,nosuid,nodev,noexec,relatime

│ ├─/sys/fs/cgroup cgroup2 cgroup2 rw,nosuid,nodev,noexec,relatime,...

│ └─/sys/kernel/debug debugfs debugfs rw,nosuid,nodev,noexec,relatime

├─/proc proc proc rw,nosuid,nodev,noexec,relatime

├─/dev udev devtmpfs rw,nosuid,relatime,...

│ ├─/dev/pts devpts devpts rw,nosuid,noexec,relatime,gid=5,...

│ └─/dev/shm tmpfs tmpfs rw,nosuid,nodev,inode64

└─/boot/efi /dev/nvme0n1p1 vfat rw,relatime,...

findmnt 的杀手锏用法:

findmnt /mnt/data # 查单个挂载点详情

findmnt -S /dev/sdb1 # 反查:这个设备挂哪了

findmnt -T /some/file # 某文件实际落在哪个挂载点(穿透多层嵌套)

findmnt -t nfs,cifs # 只看网络挂载

findmnt -o TARGET,SOURCE,FSTYPE,OPTIONS,AVAIL,USE% # 自选列

findmnt --fstab --verify # 校验 fstab 配置是否正确(强烈建议)

findmnt -R /mnt # 递归列出子挂载

7.3 lsblk:块设备视角

$ lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,UUID

NAME SIZE TYPE FSTYPE MOUNTPOINT UUID

loop0 4K loop squashfs /snap/bare/5

loop6 257.7M loop squashfs /snap/firefox/8736

nvme0n1 476.9G disk

├─nvme0n1p1 1.4G part vfat /boot/efi 7EED-02AD

└─nvme0n1p6 492G part ext4 / e0bbf986-...

lsblk 回答"盘在哪、多大、挂没挂";findmnt 回答"挂载关系什么样"。两者互补。

7.4 df:容量视角

$ df -hT

文件系统 类型 大小 已用 可用 已用% 挂载点

/dev/nvme0n1p6 ext4 492G 63G 404G 14% /

tmpfs tmpfs 16G 0 16G 0% /dev/shm

/dev/nvme0n1p1 vfat 1.4G 36M 1.4G 3% /boot/efi

overlay overlay 492G 63G 404G 14% /var/lib/docker/overlay2/.../merged

7.5 /proc/mounts 与 /etc/mtab

/proc/mounts:内核视角的权威挂载表。

/etc/mtab:现代系统是指向 /proc/mounts 的符号链接(个别老系统是普通文件,可能滞后)。

/proc/self/mountinfo:带挂载 ID、父子关系、传播类型,脚本解析用它。

8. umount 命令与选项详解

8.1 语法

umount <挂载点> # 最常用:按挂载点卸载

umount <设备> # 也可按设备卸载

umount -a # 卸载所有(/proc /sys /dev 等关键 FS 会自动跳过)

8.2 选项速查

选项

长选项

作用

-l

--lazy

惰性卸载:立即从目录树摘除,等没人用时再真正清理。NFS 服务器挂了、删不掉的挂载点救星

-f

--force

强制卸载(主要对 NFS 不可达有意义;对本地文件系统基本无效)

-R

--recursive

连同子挂载一起卸载

-a

--all

卸载所有

-t

--types

只卸载指定类型,如 umount -at nfs

-O

--test-opts

按挂载选项过滤卸载(fstab 里的选项)

-d

--detach-loop

同时释放关联的 loop 设备(umount -d /mnt/iso)

-n

--no-mtab

不写 mtab

-i

不调用 /sbin/umount.* 助手

-q

--quiet

安静模式

-v

--verbose

啰嗦模式

-N

--namespace

在指定挂载命名空间卸载

-A

--all-targets

卸载同一设备在当前命名空间的所有挂载点

-c

--no-canonicalize

不规范化路径

--fake

演练

8.3 卸载顺序与注意事项

# 嵌套挂载要从里往外卸(或 -R 一把梭)

umount /mnt/data/sub

umount /mnt/data

# 等价于

umount -R /mnt/data

卸载前 sync 一下是好习惯(尤其对 sync 选项的 U 盘)。

卸载 U 盘后再物理拔出;udisksctl unmount -b /dev/sdb1 + udisksctl power-off -b /dev/sdb 是桌面发行版的更安全姿势。

9. /etc/fstab 完全指南

fstab(File System Table)定义开机自动挂载与固定挂载配置,每行六字段:

# <设备> <挂载点> <类型> <选项>

UUID=e0bbf986-... / ext4 defaults 0 1

UUID=7EED-02AD /boot/efi vfat defaults 0 1

/swap.img none swap sw 0 0

9.1 六字段详解

#

字段

说明

1

设备

推荐 UUID=xxx(blkid 查),也可用 /dev/sdXN、LABEL=、NFS/CIFS 地址

2

挂载点

目录必须存在

3

文件系统类型

ext4/xfs/vfat/ntfs/nfs/cifs/swap/tmpfs…

4

挂载选项

同 -o,逗号分隔无空格

5

dump

老 dump 备份工具用,现代一律 0

6

pass

fsck 检查顺序:/ 为 1,其他本地盘 2,网络盘/U盘 0(不检查)

9.2 常见 fstab 配方

# 数据盘(本地 ext4,出错不阻断开机)

UUID=xxxx /data ext4 defaults,noatime,nofail 0 2

# NFS(等网络、失败不卡机、按需自动挂载)

192.168.1.10:/share /mnt/nfs nfs vers=4.2,hard,intr,_netdev,nofail,x-systemd.automount,x-systemd.idle-timeout=300 0 0

# Windows 共享(密码用 credentials 文件)

//192.168.1.20/media /mnt/media cifs credentials=/root/.smbcred,vers=3.0,iocharset=utf8,uid=1000,gid=1000,_netdev,nofail 0 0

# NTFS 移动硬盘(热插拔场景:不自动挂、允许普通用户挂)

UUID=AAAA /mnt/ntfs ntfs-3g noauto,user,uid=1000,gid=1000,umask=022,nofail,x-systemd.device-timeout=5s 0 0

# tmpfs 内存盘

tmpfs /mnt/ramdisk tmpfs size=4G,mode=1777,nosuid,nodev 0 0

9.3 改完 fstab 的验证三部曲(救命习惯)

findmnt --verify --fstab # 1. 静态校验语法与可达性

mount -a # 2. 立即生效未挂载项(验证能挂上)

systemctl daemon-reload # 3. 有 systemd 扩展选项时重载

经典事故:fstab 写错 → 重启进 emergency mode。有了 nofail + 上面三部曲,此类事故可杜绝。

10. 十二大实战应用场景

场景一:新硬盘从零到可用(完整流程)

lsblk # 1. 认出是新盘 /dev/sdb

fdisk /dev/sdb # 2. 分区(或 parted/gdisk,>2T 用 GPT)

/sbin/mkfs.ext4 /dev/sdb1 # 3. 格式化

blkid /dev/sdb1 # 4. 拿 UUID

mkdir -p /data # 5. 建挂载点

echo 'UUID=xxxx /data ext4 defaults,noatime,nofail 0 2' >> /etc/fstab

findmnt --verify --fstab && mount -a # 6. 校验 + 生效

df -hT /data # 7. 确认

场景二:挂载 U 盘 / NTFS 移动硬盘

lsblk -f # 认出 /dev/sdb1,FSTYPE 是 ntfs 还是 exfat

mkdir -p /mnt/usb

# NTFS:

mount -t ntfs-3g -o uid=1000,gid=1000,umask=022 /dev/sdb1 /mnt/usb

# exFAT:

mount -t exfat -o uid=1000,gid=1000 /dev/sdb1 /mnt/usb

# 用完:

sync && umount /mnt/usb

场景三:挂载 ISO 镜像(loop 设备)

mkdir -p /mnt/iso

mount -o loop,ro ubuntu-24.04.iso /mnt/iso

ls /mnt/iso

umount /mnt/iso # 或 umount -d 顺带释放 loop 设备

loop 不仅挂 ISO,还能挂磁盘镜像文件——自建虚拟盘的真实输出:

$ dd if=/dev/zero of=disk.img bs=1M count=32

$ /sbin/mkfs.ext4 -q disk.img

$ mount -o loop disk.img /tmp/mtdemo/loop

$ df -hT /tmp/mtdemo/loop

文件系统 类型 大小 已用 可用 已用% 挂载点

/dev/loop19 ext4 26M 24K 24M 1% /tmp/mtdemo/loop

$ echo demo-data > /tmp/mtdemo/loop/test.txt

$ ls /tmp/mtdemo/loop

lost+found test.txt

应用场景:测试文件系统行为、制作烧录镜像、取证分析 dd 出来的磁盘镜像。

场景四:tmpfs 内存盘加速(编译/临时文件/压测)

真实输出:

$ mkdir -p /tmp/mtdemo/tmpfs

$ mount -t tmpfs -o size=64M tmpfs /tmp/mtdemo/tmpfs

$ df -hT /tmp/mtdemo/tmpfs

文件系统 类型 大小 已用 可用 已用% 挂载点

tmpfs tmpfs 64M 0 64M 0% /tmp/mtdemo/tmpfs

应用:把编译目录(make -j 的中间 .o)、数据库临时表空间、压测数据集放内存盘,速度数倍于 SSD。注意:重启即失、容量受内存约束。

场景五:bind 挂载——目录分身术

真实输出:

$ echo hello > /tmp/mtdemo/bind_src/file.txt

$ mkdir -p /tmp/mtdemo/bind_dst

$ mount --bind /tmp/mtdemo/bind_src /tmp/mtdemo/bind_dst

$ ls /tmp/mtdemo/bind_dst

file.txt

两边看到的是同一份内容,改任何一边都实时同步。三大经典用途:

扩容不动配置:/var/lib/mysql 满了?新盘挂 /data,mount --bind /data/mysql /var/lib/mysql,应用配置零改动。

chroot / 容器补环境(见场景十一)。

给服务开一个"只读窗口":mount --bind /data /srv/readonly && mount -o remount,ro,bind /srv/readonly(注意:bind 挂载改选项必须 remount 一次)。

场景六:挂载 NFS 网络共享

apt install nfs-common # 客户端工具

showmount -e 192.168.1.10 # 看看服务器导出了啥

mkdir -p /mnt/nfs

mount -t nfs -o vers=4.2,hard,intr 192.168.1.10:/share /mnt/nfs

df -hT /mnt/nfs

排障口诀:不通先看 showmount -e,挂载卡住加 -v 看细节,fstab 记得 _netdev,nofail。

场景七:挂载 Windows 共享 / NAS(CIFS)

apt install cifs-utils

printf 'username=guanjia\npassword=xxx\ndomain=WORKGROUP\n' > /root/.smbcred

chmod 600 /root/.smbcred

mkdir -p /mnt/nas

mount -t cifs //192.168.1.20/public /mnt/nas \

-o credentials=/root/.smbcred,vers=3.0,iocharset=utf8,uid=1000,gid=1000,_netdev

场景八:remount 在线改挂载选项(根分区救急)

真实输出:

$ mount -o remount,ro /tmp/mtdemo/loop

$ findmnt /tmp/mtdemo/loop -o TARGET,SOURCE,FSTYPE,OPTIONS

TARGET SOURCE FSTYPE OPTIONS

/tmp/mtdemo/loop /dev/loop19 ext4 ro,relatime

$ touch /tmp/mtdemo/loop/x

touch: 无法 touch '/tmp/mtdemo/loop/x': 只读文件系统

$ mount -o remount,rw /tmp/mtdemo/loop # 改回读写

救命场景:系统日志狂报 ext4 错误、根分区被内核自动 remount 成只读。排查修复后不用重启:

mount -o remount,rw /

同样适合在线加 noexec、改 atime 策略、临时把 /tmp 锁成只读做安全响应。

场景九:"target is busy" 卸载不掉怎么办

$ umount /mnt/data

umount: /mnt/data: target is busy.

排查三板斧:

# 1. 谁在用(进程级)

fuser -mv /mnt/data

# 输出会列出 PID 与进程名;fuser -km /mnt/data 直接全杀掉(谨慎!)

# 2. 哪些文件被打开

lsof +D /mnt/data

# 或 lsof /mnt/data

# 3. 别忘了:自己 shell 的 cwd 就在里面也算占用!

cd / && umount /mnt/data

处理策略:

# 温柔:让占用者退出后再卸

kill ; umount /mnt/data

# 无解(NFS 服务器挂了、进程杀不干净):惰性卸载

umount -l /mnt/data

# 挂载点立即消失,内核等引用归零后自动清理——事后务必核实,别当万能药

# 连带子挂载一起卸

umount -R /mnt/data

场景十:mount --move 不停机搬家

把 /mnt/old 上挂着的盘平移到 /mnt/new,打开的文件描述符、运行中的服务全部无感知:

mkdir -p /mnt/new

mount --move /mnt/old /mnt/new

findmnt /mnt/new

场景十一:chroot / 系统救援挂载(换 root 前的标准四连)

装系统失败要进 live USB 修、或手工 chroot 排障:

mount /dev/nvme0n1p6 /mnt # 1. 根分区

mount /dev/nvme0n1p1 /mnt/boot/efi # 2. EFI 分区(如需要)

mount --rbind /dev /mnt/dev # 3. 设备树(rbind 带子挂载)

mount --rbind /sys /mnt/sys # 4. 内核接口

mount -t proc proc /mnt/proc

mount --rbind /run /mnt/run # 5. 解析 DNS 等运行时

chroot /mnt /bin/bash

# 修复 grub、改密码、重装内核……完事后

exit

umount -R /mnt # 一把全卸

场景十二:看透 Docker——overlay 挂载

df -hT 里那一排 overlay 就是容器的联合挂载:

overlay overlay 492G 63G 404G 14% /var/lib/docker/overlay2/91d0.../merged

进容器卡死或容器起不来时,可以直接在宿主机看/改容器文件:

findmnt -t overlay | head # 列出所有容器挂载

docker inspect <容器> | grep -i mergeddir # 找到对应 merged 目录

ls # 宿主机直接浏览容器文件系统

11. 安全加固:nosuid / nodev / noexec

最小权限原则在挂载层的落地:

挂载点

建议选项

理由

/tmp、/var/tmp

nosuid,nodev,noexec

公开可写目录是提权与恶意程序落点重灾区

/dev/shm

nosuid,nodev,noexec

同上(注意:个别程序如某些 JVM/浏览器需要 exec,评估后决定)

/home

nosuid,nodev

防用户自放 setuid 提权程序(noexec 会影响编译型工作流,按需)

数据盘 / 上传目录

nosuid,nodev,noexec

纯数据用途,没有任何执行理由

可移动介质

nosuid,nodev,noexec

外来盘默认不信任

根文件系统 df 输出印证:本机 tmpfs 全部默认带 nosuid,nodev,noexec:

tmpfs on /run type tmpfs (rw,nosuid,nodev,noexec,relatime,size=3258752k,mode=755,inode64)

12. 常见问题与排错

Q1:mount: /mnt/xxx: must be superuser to use mount?

挂载是特权操作,加 sudo。想放开给普通用户:fstab 里写 user 选项,之后 mount /mnt/xxx(不带 sudo)即可。

Q2:wrong fs type, bad option, bad superblock...?

按序排查:① -t 类型写错或不识别(vfat 写成 fat);② 对应工具没装(ntfs 要 ntfs-3g、exfat 要 exfatprogs);③ 文件系统损坏 → fsck /dev/sdb1;④ 盘根本不是你想的那个 → lsblk -f、blkid 核对。

Q3:挂载后发现"目录里的文件不见了"?

文件没丢,被新挂载遮蔽了。umount 后就回来。教训:永远挂空目录。

Q4:为什么重启后挂载没了?

mount 是运行时操作,不持久。要开机自动挂必须写 /etc/fstab(或 systemd .mount unit)。

Q5:fstab 里写 /dev/sdb1 靠谱吗?

不靠谱。多块盘时内核枚举顺序可能变。用 blkid 拿 UUID 写 UUID=xxxx。

Q6:NFS 挂载点整个卡死,ls 都 hang 住?

服务器不可达 + hard 挂载的典型症状。处理:umount -l /mnt/nfs 先摘下来,恢复服务器,之后 fstab 用 soft,timeo=,retrans= 或 x-systemd.automount 降低影响面。

Q7:mount: unknown filesystem type 'ntfs'?

装 ntfs-3g,并且挂载类型写 ntfs-3g(或新版 ntfs3 内核驱动,用 -t ntfs3)。

Q8:umount 报 busy 但 fuser/lsof 啥都查不到?

隐藏占用源:① 某个进程的 cwd 在里面(lsof +D 能查);② 上面有子挂载(findmnt -R /mnt/data 检查,先卸子挂载或 umount -R);③ NFS/内核线程引用;④ swapfile 在该挂载上(swapoff)。实在没招:umount -l。

Q9:想挂载 Windows 休眠分区报错?

见 6.4:Windows 快速启动把 NTFS 标记为休眠态。Windows 侧关快速启动/完整重启,或 Linux 侧只读挂载。

Q10:容器里 mount 报 Operation not permitted?

容器默认无 CAP_SYS_ADMIN。要么 --privileged(重权限,慎用),要么 --cap-add SYS_ADMIN + 适当 seccomp/apparmor 放行,或用 volume/bind 在宿主机侧完成挂载。

13. 一页速查表(Cheat Sheet)

# ---------- 查看 ----------

findmnt # 树状挂载全景(首选)

findmnt /mnt/data # 单点详情;findmnt -T <文件> 穿透查归属

lsblk -f # 块设备 + 文件系统 + UUID

df -hT # 容量视角

mount | grep sdb # 原始列表过滤

blkid # 查 UUID/LABEL

cat /proc/filesystems # 内核支持的 FS 类型

# ---------- 挂载 ----------

mount /dev/sdb1 /mnt/data # 基本

mount UUID=xxxx /mnt/data # 按 UUID

mount -t ext4 -o noatime /dev/sdb1 /mnt/data # 指定类型+选项

mount -o loop,ro image.iso /mnt/iso # ISO/镜像

mount -t tmpfs -o size=2G tmpfs /mnt/ram # 内存盘

mount --bind /src /dst # 目录分身

mount --rbind /src /dst # 递归分身(chroot/容器)

mount --move /old /new # 挂载点搬家

mount -o remount,ro /data # 在线改只读

mount -o remount,rw / # 根分区只读救急

mount -a # fstab 全量生效

mount -t nfs -o vers=4.2,hard,intr S:/share /mnt/nfs # NFS

mount -t cifs //S/share /mnt/smb -o credentials=/root/.smbcred,vers=3.0 # SMB

sshfs u@host:/dir /mnt/remote # sshfs

# ---------- 卸载 ----------

umount /mnt/data # 按挂载点

umount /dev/sdb1 # 按设备

umount -l /mnt/data # 惰性卸载(busy 无解时)

umount -R /mnt/data # 连子挂载一起卸

umount -at nfs # 卸载全部 NFS

fuser -mv /mnt/data # 谁在用

lsof +D /mnt/data # 打开的文件

sync # 落盘后拔盘

# ---------- fstab 维护 ----------

findmnt --verify --fstab # 校验配置

mount -a && df -hT # 生效并确认

systemctl daemon-reload # 含 x-systemd.* 选项时

# ---------- 安全加固 ----------

mount -o remount,nosuid,nodev,noexec /tmp

参考资料

man 8 mount、man 8 umount、man 5 fstab、man 8 findmnt、man 8 lsblk

内核文档:Documentation/filesystems/(overlayfs、btrfs、tmpfs 等)

util-linux 源码:https://github.com/util-linux/util-linux

本文示例输出采集自真实 Ubuntu 24.04(内核 6.x,util-linux 2.39.3)环境。

相关推荐

湖南常德旅游

湖南常德旅游

09-28 💫 3987
汉字 “睫”:细微之处的深刻意涵,目不交睫” 这个成语中,“睫” 字的含义如何体现其成语的整体意思?
山东科协每日科普

山东科协每日科普

08-11 💫 4251
[讨论]准备装win10,听听大家的看法,哪个版本的稳定好用

本文标签