什么是挂载,Linux挂载如何实现详解

article/2025/10/13 8:16:18

挂载

指的就是将设备文件中的顶级目录连接到 Linux 根目录下的某一目录(最好是空目录),访问此目录就等同于访问设备文件

Linux 系统中“一切皆文件”,所有文件都放置在以根目录为树根的树形目录结构中。在 inux 看来,任何硬件设备也都是文件,它们各有自己的一套文件系统(文件目录结构)。

因此产生的问题是,当在 Linux 系统中使用这些硬件设备时,只有将Linux本身的文件目录与硬件设备的文件目录合二为一,硬件设备才能为我们所用。合二为一的过程称为“挂载”。

如果不挂载,通过Linux系统中的图形界面系统可以查看找到硬件设备,但命令行方式无法找到。

并不是根目录下任何一个目录都可以作为挂载点,由于挂载操作会使得原有目录中文件被隐藏,因此根目录以及系统原有目录都不要作为挂载点,会造成系统异常甚至崩溃,挂载点最好是新建的空目录

例如:

我们想通过命令行访问某个 U 盘中的数据,图 1 所示为 U 盘文件目录结构和 Linux 系统中的文件目录结构。

可以看到,目前 U 盘和 Linux 系统文件分属两个文件系统,还无法使用命令行找到 U 盘文件,需要将两个文件系统进行挂载。

如何把U盘文件挂载到系统文件中?

1、我们在文件根目录下新建一个目录 /sdb-u,通过挂载命令将 U 盘文件系统挂载到此目录,挂载效果如图 2 所示。

2、实现命令

3、可以看到,U 盘文件系统已经成为 Linux 文件系统目录的一部分,此时访问 /sdb-u/ 就等同于访问 U 盘

根目录下的 /dev/ 目录文件负责所有的硬件设备文件,事实上,当 U 盘插入 Linux 后,系统也确实会给 U 盘分配一个目录文件(比如 sdb1),就位于 /dev/ 目录下(/dev/sdb1),但无法通过 /dev/sdb1/ 直接访问 U 盘数据,访问此目录只会提供给你此设备的一些基本信息(比如容量)

总之,Linux 系统使用任何硬件设备,都必须将设备文件与已有目录文件进行挂载。


Linux命令扩展

1、df 命令

用于显示 Linux 系统中各文件系统的硬盘使用情况,包括文件系统所在硬盘分区的总容量、已使用的容量、剩余容量等。

df 命令的基本格式为:

[root@localhost ~]# df [选项] [目录或文件名]

df命令常用选项及作用

-a: 显示所有文件系统信息,包括系统特有的 /proc、/sysfs 等文件系统;

-m: 以 MB 为单位显示容量;

-k: 以 KB 为单位显示容量,默认以 KB 为单位;

-h: 使用人们习惯的 KB、MB 或 GB 等单位自行显示容量;

-T: 显示该分区的文件系统名称;

-i: 不用硬盘容量显示,而是以含有 inode 的数量来显示。

【例 1】

[root@localhost ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hdc2 9920624 3823112 5585444 41% /
/dev/hdc3 4956316 141376 4559108 4% /home
/dev/hdc1 101086 11126 84741 12% /boot
tmpfs 371332 0 371332 0% /dev/shm

不使用任何选项的 df 命令,默认会将系统内所有的文件系统信息,以 KB 为单位显示出来。本例中,由 df 命令显示出的各列信息的含义分别是:

  • Filesystem:表示该文件系统位于哪个分区,因此该列显示的是设备名称;

  • 1K-blocks:此列表示文件系统的总大小,默认以 KB 为单位;

  • Used:表示用掉的硬盘空间大小;

  • Available:表示剩余的硬盘空间大小;

  • Use%:硬盘空间使用率。如果使用率高达 90% 以上,就需要额外注意,因为容量不足,会严重影响系统的正常运行;

  • Mounted on:文件系统的挂载点,也就是硬盘挂载的目录位置。

【例 2】

[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hdc2 9.5G 3.7G 5.4G 41% /
/dev/hdc3 4.8G 139M 4.4G 4% /home
/dev/hdc1 99M 11M 83M 12% /boot
tmpfs 363M 0 363M 0% /dev/shm

这里使用了 -h 选项,因此文件系统的各种容量数据,会以人们习惯的单位(通常使用 GB 或 MB)显示出来。

【例 3】

[root@localhost ~]# df -h /etc
Filesystem Size Used Avail Use% Mounted on
/dev/hdc2 9.5G 3.7G 5.4G 41% /

这里在 df 命令后添加了目录名,在这种情况下,df 命令会自动分析该目录所在的分区,并将所在分区的有关信息显示出来。由此,我们就可以知道,该目录下还可以使用多少容量。

【例 4】

[root@localhost ~]# df -aT
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/hdc2 ext3 9920624 3823112 5585444 41% /
proc proc 0 0 0 - /proc
sysfs sysfs 0 0 0 - /sys
devpts devpts 0 0 0 - /dev/pts
/dev/hdc3 ext3 4956316 141376 4559108 4% /home
/dev/hdc1 ext3 101086 11126 84741 12% /boot
tmpfs tmpfs 371332 0 371332 0% /dev/shm
none binfmt_misc 0 0 0 - /proc/sys/fs/binfmt_misc
sunrpc rpc_pipefs 0 0 0 - /var/lib/nfs/rpc_pipefs

使用 -a 选项,会将很多特殊的文件系统显示出来,这些文件系统包含的大多是系统数据,存在于内存中,不会占用硬盘空间,因此你会看到,它们所占据的硬盘总容量为 0。

2、du 命令

是统计目录或文件所占磁盘空间大小的命令。

需要注意的是,使用"ls -r"命令是可以看到文件的大小的。但是大家会发现,在使用"ls -r"命令査看目录大小时,目录的大小多数是 4KB,这是因为目录下的子目录名和子文件名是保存到父目录的 block(默认大小为 4KB)中的,如果父目录下的子目录和子文件并不多,一个 block 就能放下,那么这个父目录就只占用了一个 block 大小。

在统计目录时,不是想看父目录下的子目录名和子文件名到底占用了多少空间,而是想看父目录下的子目录和子文件的总磁盘占用量大小,这时就需要使用 du 命令才能统计目录的真正磁盘占用量大小。

du 命令的格式如下:

[root@localhost ~]# du [选项] [目录或文件名]

选项:

  • -a:显示每个子文件的磁盘占用量。默认只统计子目录的磁盘占用量

  • -h:使用习惯单位显示磁盘占用量,如 KB、MB 或 GB 等;

  • -s:统计总磁盘占用量,而不列出子目录和子文件的磁盘占用量

【例 1】

[root@localhost ~]# du
#统计当前目录的总磁盘占用量大小,同时会统计当前目录下所有子目录的磁盘占用量大小,不统计子文件
#磁盘占用量的大小。默认单位为KB
20 ./.gnupg
#统计每个子目录的大小
24 ./yum.bak
8 ./dtest
28 ./sh
188
#统计当前目录总大小

【例 2】

[root@localhost ~]# du -a
#统计当前目录的总大小,同时会统计当前目录下所有子文件和子目录磁盘占用量的大小。默认单位为 KB
4 ./.bashjogout
36 ./install.log
4 ./.bash_profile
4 ./.cshrc
…省略部分输出…
188

【例 3】

[root@localhost ~]# du -sh
#只统计磁盘占用量总的大小,同时使用习惯单位显示
188K .


du命令和df命令的区别

有时我们会发现,使用 du 命令和 df 命令去统计分区的使用情况时,得到的数据是不一样的。那是因为df命令是从文件系统的角度考虑的,通过文件系统中未分配的空间来确定文件系统中已经分配的空间大小。也就是说,在使用 df 命令统计分区时,不仅要考虑文件占用的空间,还要统计被命令或程序占用的空间(最常见的就是文件已经删除,但是程序并没有释放空间)

而 du 命令是面向文件的,只会计算文件或目录占用的磁盘空间。也就是说,df 命令统计的分区更准确,是真正的空闲空间

mount命令

文件系统挂载

硬件设备必须挂载之后才能使用,只不过,有些硬件设备(比如硬盘分区)在每次系统启动时会自动挂载,而有些(比如 U 盘、光盘)则需要手动进行挂载。

挂载指的是将硬件设备的文件系统和 Linux 系统中的文件系统,通过指定目录(作为挂载点)进行关联。而要将文件系统挂载到 Linux 系统上,就需要使用 mount 挂载命令。

mount 命令的常用格式有以下几种:

[root@localhost ~]# mount [-l]

单纯使用 mount 命令,会显示出系统中已挂载的设备信息,使用 -l 选项,会额外显示出卷标名称(读者可自行运行,查看输出结果);

[root@localhost ~]# mount -a

-a 选项的含义是自动检查 /etc/fstab 文件中有无疏漏被挂载的设备文件,如果有,则进行自动挂载操作。这里简单介绍一下 /etc/fstab 文件,此文件是自动挂载文件,系统开机时会主动读取 /etc/fstab 这个文件中的内容,根据该文件的配置,系统会自动挂载指定设备。

[root@localhost ~]# mount [-t 系统类型] [-L 卷标名] [-o 特殊选项] [-n] 设备文件名 挂载点

各选项的含义分别是:

  • -t 系统类型:指定欲挂载的文件系统类型。Linux 常见的支持类型有 EXT2、EXT3、EXT4、iso9660(光盘格式)、vfat、reiserfs 等。如果不指定具体类型,挂载时 Linux 会自动检测。

  • -L 卷标名:除了使用设备文件名(例如 /dev/hdc6)之外,还可以利用文件系统的卷标名称进行挂载。

  • -n:在默认情况下,系统会将实际挂载的情况实时写入 /etc/mtab 文件中,但在某些场景下(例如单人维护模式),为了避免出现问题,会刻意不写入,此时就需要使用这个选项;

  • -o 特殊选项:可以指定挂载的额外选项,比如读写权限、同步/异步等,如果不指定,则使用默认值(defaults)。具体的特殊选项参见表 1;


mount 命令选项及功能

rw/ro :是否对挂载的文件系统拥有读写权限,rw 为默认值,表示拥有读写权限;ro 表示只读权限。

async/sync : 此文件系统是否使用同步写入(sync)或异步(async)的内存机制,默认为异步 async。

dev/nodev :是否允许从该文件系统的 block 文件中提取数据,为了保证数据安装,默认是 nodev。

auto/noauto :是否允许此文件系统被以 mount -a 的方式进行自动挂载,默认是 auto。

suid/nosuid :设定文件系统是否拥有 SetUID 和 SetGID 权限,默认是拥有。

exec/noexec :设定在文件系统中是否允许执行可执行文件,默认是允许。

user/nouser :设定此文件系统是否允许让普通用户使用 mount 执行实现挂载,默认是不允许(nouser),仅有 root 可以。

defaults :定义默认值,相当于 rw、suid、dev、exec、auto、nouser、async 这 7 个选项。

remount重新挂载已挂载的文件系统,一般用于指定修改特殊权限。

【例 1】

[root@localhost ~]# mount
#查看系统中已经挂载的文件系统,注意有虚拟文件系统
/dev/sda3 on / type ext4 (rw) <--含义是,将 /dev/sda3 分区挂载到了 / 目录上,文件系统是 ext4,具有读写权限
proc on /proc type proc (rw)
sysfe on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw, gid=5, mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fe/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfe/rpc_pipefs type rpc_pipefs (rw)

【例 2】

修改特殊权限。/boot 分区已经被挂载了,而且采用的是 defaults 选项。这里我们重新挂载分区,并采用 noexec 权限禁止执行文件执行,看看会出现什么情况(注意不要用 / 分区做实验,否则系统命令也就不能执行了。

[root@localhost ~]# mount -o remount noexec /boot
#重新挂载 /boot 分区,并使用 noexec 权限
[root@localhost sh]# cd /boot
#写一个 shell 脚本,看是否会运行
[root@localhost boot]#vi hello.sh
#!/bin/bash
echo "hello!!"
[root@localhost boot]# chmod 755 hello.sh
[root@localhost boot]# ./hello.sh
-bash:./hello.sh:权限不够
#虽然赋予了hello.sh执行权限,但是仍然无法执行
[root@localhost boot]# mount -o remount exec /boot
#记得改回来,否则会影响系统启动

【例 3】挂载分区

[root@localhost ~]# mkdir /mnt/disk1
#建立挂载点目录
[root@localhost ~]# mount /dev/sdb1 /mnt/disk1
#挂载分区

硬盘分区(设备)挂载和卸载(使用 umount 命令)的概念源自 UNIX,UNIX 系统一般是作为服务器使用的,系统安全非常重要,特别是在网络上,最简单有效的方法就是“不使用的硬盘分区(设备)不挂载”,因为没有挂载的硬盘分区是无法访问的,这样系统也就更安全了。

另外,这样也可以减少挂载的硬盘分区数量,相应地,也就可以减少系统维护文件的规模,当然也就减少了系统的开销,即提高了系统的效率。

umount 命令

命令的基本格式如下:

[root@localhost ~]# umount 设备文件名或挂载点

注意,卸载命令后面既可以加设备文件名,也可以加挂载点,不过只能二选一,比如:

[root@localhost ~]# umount /mnt/usb
#卸载U盘
[root@localhost ~]# umount /mnt/cdrom
#卸载光盘
[root@localhost ~]# umount /dev/sr0
#命令加设备文件名同样是可以卸载的

如果加了两个(如下所示),从理论上分析,会对光驱卸载两次,当然,卸载第二次的时候就会报错。

[root@localhost ~]# mount /dev/sr0 /mnt/cdrom/

卸载挂载异常的情况

[root@localhost ~]# cd /mnt/cdrom/
#进入光盘挂载点
[root@localhost cdrom]# umount /mnt/cdrom/
umount: /mnt/cdrom: device is busy.
#报错,设备正忙

这种报错是因为我们已经进入了挂载点,因此,如果要卸载某硬件设备,在执行 umount 命令之前,用户须退出挂载目录。

卸载硬件设备成功与否,除了执行 umount 命令不报错之外,还可以使用 df 命令或 mount -l 来查看目标设备是否还挂载在系统中。

记一次微服务耗时毛刺排查

谷歌开源内部代码评审规范

UML (统一建模语言) 各种图总结

真实项目案例实战—【状态设计模式】使用场景

欢迎分享转发,有帮助的话点个“在看”

点我查看原文


http://chatgpt.dhexx.cn/article/cwCe242K.shtml

相关文章

Linux挂载磁盘分区

Linux系统一般都会有未挂载的磁盘&#xff0c;如果我们想使用这些为挂载的磁盘就需要挂载到指定目录才能使用。 一、有多个磁盘&#xff0c;将未分区的磁盘挂载 1、进入root用户 su – 2、查看已挂载磁盘的使用情况&#xff1a; df –h 可以看到系统已经挂载了sda磁盘&…

Linux挂载(永久)硬盘

命令 fdisk-l&#xff0c;查看未挂载硬盘 可以看到 /dev/vdb 没有挂载 使用fdisk 创建分区&#xff0c;fdisk /dev/vdb n表示new&#xff0c; p表示主分区&#xff0c; 1是分区号&#xff0c; 指定开始扇区&#xff0c;回车使用默认&#xff0c;即扇区开始位置&#xff0c;…

linux挂载新磁盘

当一个新盘挂载的 linux 上&#xff0c;可以通过 fdisk -l 指令&#xff0c;查看挂载的磁盘信息&#xff0c;此时虽然已经挂载到主机上&#xff0c;但是主机还不能正常使用。 要想使用新磁盘&#xff0c;需要经过如下几步&#xff1a; 磁盘分区磁盘格式化挂载分区到某个目录 …

Linux:详细介绍如何挂载?及其命令

可以知道Linux中系统挂载目录默认是在mnt 或者 media 目录下&#xff1a;如下 在刚开始装上Linux操作系统时的镜像iOS 是包含了许多的安装包在**/dev/cdrom**。但是这些安装包与Linux系统还没有产生关系,cdrom对应的一个链接是sr0&#xff0c;所以也是 /dev/sr0 安装包在 /de…

Linux的目录挂载详解

挂载的基本概念 前面讲过&#xff0c;Linux 系统中“一切皆文件”&#xff0c;所有文件都放置在以根目录为树根的树形目录结构中。在 Linux 看来&#xff0c;任何硬件设备也都是文件&#xff0c;它们各有自己的一套文件系统&#xff08;文件目录结构&#xff09;。 因此产生的…

Linux系统挂载

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;往期回顾&#xff1a;目标检测系列——开山之作RCNN原理详解    目标检测系列——Fast R-CNN原理详解   目标检测系列——Faster R-CNN原理详解 &#x1f34a;近期目标&a…

Linux——常用命令(挂载)

1、mount&#xff1a;挂载设备或查看已挂载设备  后不加选项或加-l(小写L)选项&#xff1a;查询系统中已经挂载的设备  示例&#xff1a;查看已挂载设备  mount命令的选项&#xff1a;  Tip&#xff1a;   1️⃣mount -a会检查/etc/fstab配置文件&#xff0c;但并不能…

【Linux挂载磁盘】Linux系统挂载磁盘详细操作步骤

近期公司服务运行环境,从Windows服务器切换到了Linux服务器,于是开始了一波操作,整了两天终于整完了,记录一下腾讯云挂载数据盘的过程,因为云磁盘的大小只有600GB,然后就没有进行分区,直接整个挂载到/data的目录下; 先上版本: Linux版本:centos7 [rootVM-16-4-centos src]# ca…

什么是挂载?Linux挂载

首先先说一下在Linux中一切皆文件&#xff08;硬件设备也是文件&#xff09;&#xff0c;所有文件都是存放在以根目录为树形目录结构中&#xff1b;下面来说说一下什么是挂载 挂载&#xff1a;指的就是将设备文件中的顶级目录连接到 Linux 根目录下的某一目录&#xff08;最好是…

Linux常用命令——挂载命令(一)

挂载就是把设备文件名和已经建立的空目录链接起来的过程&#xff0c;就叫做挂载。 1、mount命令基本格式 linux所有存储设备都必须挂载才能使用&#xff0c;包括硬盘。 命令名称&#xff1a;mount命令所在路径&#xff1a;/bin/mount执行权限&#xff1a;所有用户 命令的具…

Linux三种挂载方式

挂载 一、手动挂载 #mount 设备名 挂载点例&#xff1a;将镜像光盘挂载到/mnt #mount /dev/sr0 /mnt二、开机自动挂载(永久挂载) 在/etc/fstab添加挂载信息 可以使用命令 先获取UUID 通过blkid查看UUID #blkid##可使用设备名&#xff0c;或UUID #vim /etc/fstab三、自动挂…

Linux挂载

1、挂载的定义 挂载是一个非常重要的功能&#xff0c;它将一个设备&#xff08;通常是存储设备&#xff0c;可以挂载光盘、硬盘、磁带、光盘镜像文件等&#xff09;挂接到一个已存在的目录上&#xff08;这个目录可以不为空&#xff0c;但挂载后这个目录下以前的内容将不可用。…

【Linux】磁盘分区和挂载

目录 Linux磁盘分区和挂载 linux分区 查看所有设备挂载情况 挂载案例 步骤1&#xff1a;新建一块硬盘 操作步骤2&#xff1a; 虚拟机硬盘分区 步骤3&#xff1a;虚拟机硬盘分区格式化 步骤4&#xff1a;将磁盘挂载到根目录下newdisk目录下 mount挂载 umount取消挂载 步骤…

Java输出双引号

//如果想在Java中打出双引号,则需要使用转义字符\ public class TaskRandom {public static void main(String[] args) {System.out.println("He said \"He is a boy\"");} }

用Java输出等腰三角形

Java输出等腰三角形 import java.util.Scanner;/*** 输出等腰三角形*/ public class hello {public static void main(String[] args){Scanner sc new Scanner(System.in);System.out.print("输入行数&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&…

Java 输出数组的方法

文章目录 数组的输出的三种方式一维数组&#xff1a;1. 传统的for循环方式2. for each循环3. 利用Array类中的toString方法 二维数组&#xff1a;1. 传统的for循环方式2. for each循环3. 利用Array类中的toString方法 数组的输出的三种方式 一维数组&#xff1a; 定义一个数组…

Java输出九九乘法表

Java实现九九乘法表运用了两层循环&#xff0c;外层循环控制行数&#xff0c;内层循环控制列&#xff0c;这样我们就能写出该程序的大体框架。 在外层循环内的输出应该是println换行&#xff0c;不然输出的内容全在同一行&#xff0c;内层循环输出时print不要加 ln &#xff0…

java输出数组的方法

对于初学者来说&#xff0c;数组的输入输出是一个麻烦的问题&#xff0c;下面列举几个数组的输出方法 1.单个数组元素的输入输出 import java.util.Scanner; public class Greedy {SuppressWarnings("null")public static void main(String[] args) {SuppressWarni…

Java输出保留小数

一、推荐方法 System.out.printf("%.2f\n", 1.123);//输出1.12简明扼要&#xff0c;直接用&#xff0c;与c&#xff0c;c中的格式化字符串的输出方式相同。 注意&#xff1a;是printf不是println&#xff01; 二、其他方法&#xff08;了解即可&#xff09; 方法…

用Java输出输出素数

/* 输出两个整数范围内的所有素数并且统计个数和所使用的时间 思路&#xff1a; 从2开始&#xff0c;到一个数-1结束&#xff0c;都不能被这个数本身除尽&#xff0c;则是素数&#xff1b; 可以用 isFlag表示是否被除尽&#xff0c;一旦被除尽&#xff0c;就break终…