10.10 mount命令详解:挂载Linux系统外的文件
- 所有的硬件设备必须挂载之后才能使用(新硬盘先格式化后创建分区,再对分区进行挂载),只不过,有些硬件设备(比如硬盘分区)在每次系统启动时会自动挂载,而有些(比如 U 盘、光盘)则需要手动进行挂载。通过学习 Linux 文件系统,我们可以对挂载的含义进行引申,挂载指的是将硬件设备的文件系统和 Linux 系统中的文件系统,通过指定目录(作为挂载点)进行关联。而要将文件系统挂载到 Linux 系统上,就需要使用 mount 挂载命令。
- 手动挂载(mount):重启后会失效。用于检测已经格式化的设备,是否可以和预期一样的进行工作。永久挂载:就要将设备添加到/etc/fstab中去了 .
- /dev/ 该目录下存放的是 Linux 的外部设备,一般linux检测到的光盘和U盘的位置在此目录下,同样也是在这个目录中对设备进行分区,这些新建的分区目前和linux系统联系不大,如:/dev/sdb1分区是一个类似指针的数据结构,指向这个分区的原始数据块,还不属于/目录,这时虽然可以在一些图形桌面系统里找到他的位置,浏览管理里面的文件,但系统并不知道这个数据块哪部分数据代表文件,如何对它们操作,在命令行却不知怎么访问它的目录,比如无法使用cd或者ls。也无法在编程时指定一个目录对它操作。需要对其进行挂载才能访问这些外部存储设备,这时访问挂载点就是在访问该存储设备。在 Linux 中访问设备的方式和访问文件的方式是相同的。
Windows系统mount挂载,给磁盘分区提供一个盘符(C,D,E,…)。比如插入移动硬盘后系统自动分配给了它I:这个过程其实就是挂载,退出移动硬盘后的时候进行安全弹出,其实就是卸载unmount。
Linux系统和Windows不同,win可以有C,D…多个目录,Linux只有一个根目录/。在按装Linux系统时,自定义创建的所有分区都在/下的某个位置,比如/run等等。
linux操作系统将所有的设备都看作文件,它将整个计算机的资源都整合成一个大的文件目录。我们要访问存储设备中的文件,必须将文件所在的分区挂载到一个已存在的目录上,然后通过访问这个目录来访问存储设备。挂载就是把设备放在一个目录下,让系统知道怎么管理这个设备里的文件,了解这个存储设备的可读写特性之类的过程。
如:插入CD,系统其实自动执行了 mount /dev/cdrom /media/cdrom。所以可以直接在/media/cdrom中对CD中的内容进行管理。
参考文献:什么是挂载
- mount 命令的常用格式有以下几种:
[root@CncLucZK ~]# mount [-l]
#单纯使用 mount 命令,会显示出系统中已挂载的设备信息,使用 -l 选项,会额外显示出卷标名称
命令测试:
[root@CncLucZK test]# mount -l
/dev/vda1 on / type ext4 (rw,relatime)
...
[root@localhost ~]# mount -a
-a 选项的含义是自动检查 /etc/fstab 文件中有无疏漏被挂载的设备文件,如果有,则进行自动挂载操作。简单介绍一下 /etc/fstab 文件,此文件是自动挂载文件,系统开机时会主动读取 /etc/fstab 这个文件中的内容,根据该文件的配置,系统会自动挂载指定设备。
[root@CncLucZK ~]# mount [-t 系统类型] [-L 卷标名] [-o 特殊选项] [-n] 设备文件名 挂载点
- 各选项的含义分别是:
- -t 系统类型:指定欲挂载的文件系统类型。Linux 常见的支持类型有 EXT2、EXT3、EXT4、iso9660(光盘格式)、vfat、reiserfs 等。如果不指定具体类型,挂载时 Linux 会自动检测。
- -L 卷标名:除了使用设备文件名(例如 /dev/hdc6)之外,还可以利用文件系统的卷标名称进行挂载。
- -n:在默认情况下,系统会将实际挂载的情况实时写入 /etc/mtab 文件中,但在某些场景下(例如单人维护模式),为了避免出现问题,会刻意不写入,此时就需要使用这个选项;
- -o 特殊选项:可以指定挂载的额外选项,比如读写权限、同步/异步等,如果不指定,则使用默认值(defaults)。具体的特殊选项参见下表 ;
选项 | 功能 |
---|---|
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 | 重新挂载已挂载的文件系统,一般用于指定修改特殊权限。 |
[root@CncLucZK test]# mount #查看系统中已经挂载的文件系统,注意有虚拟文件系统
#含义是,将 /dev/sda3 分区挂载到了 / 目录上,文件系统是 ext4,具有读写权限
/dev/sda3 on / type ext4 (rw)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,size=923060k,nr_inodes=230765,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
/dev/sda1 on /boot type ext4 (rw)
- 修改特殊权限。通过上例我们查看到,/boot 分区已经被挂载了,而且采用的是 defaults 选项。这里我们重新挂载分区,并采用 noexec 权限禁止执行文件执行,看看会出现什么情况(注意不要用 / 分区做实验,否则系统命令也就不能执行了。
[root@CncLucZK ~]# mount -o remount noexec /boot
#重新挂载 /boot 分区,并使用 noexec 权限
[root@CncLucZK sh]# cd /boot
#写一个 shell 脚本,看是否会运行
[root@localhost boot]#vim demo1.sh
#!/bin/bash
n=10
str1=HelloWorld${n} str2="linux \"shell\"${n}"
str3='string ${n}'
echo $str1
echo $str2
echo $str3
[root@CncLucZK boot]# chmod 755 demo1.sh
[root@CncLucZK boot]# . demo1.sh
-bash:./demo1.sh:权限不够
#虽然赋予了demo1.sh执行权限,但是仍然无法执行
[root@CncLucZK ~]# mount -o remount exec /boot
#记得改回来,否则会影响系统启动
对于特殊选项的修改,除非特殊场景下需要,否则不建议大家随意修改,非常容易造成系统出现问题,而且还找不到问题的根源。
- 手动挂载分区。/dev/sdb1 分区还没有被划分。我们在这里只看看挂载分区的方式,非常简单,甚至不需要使用 “-ext4” 命令指定文件系统,因为系统可以自动检测。
root@CncLucZK ~]# mkdir /mnt/disk1
#建立挂载点目录
[root@CncLucZK ~]# mount /dev/sdb1 /mnt/disk1
#挂载分区
[root@www ~]# df /mnt #显示mnt目录下的分区信息
Filesystem 1K-blocks Used Available Use% Mounted on
.....中间省略.....
/dev/sdb1 1976312 42072 1833836 3% /mnt/disk1
- 使用 Linux 系统的硬盘分区不能像 Windows 系统那样,硬盘安装上就可以自动检测并投入使用,硬盘分区(设备)挂载和卸载(使用 umount 命令)的概念源自 UNIX,UNIX 系统一般是作为服务器使用的,系统安全非常重要,特别是在网络上,最简单有效的方法就是“不使用的硬盘分区(设备)不挂载”,因为没有挂载的硬盘分区是无法访问的,这样系统也就更安全了。这样也可以减少挂载的硬盘分区数量,相应地,也就可以减少系统维护文件的规模,当然也就减少了系统的开销,即提高了系统的效率。
- 永久挂载:就要将设备添加到/etc/fstab中去 .
[root@CncLucZK ~]# vi /etc/fstab
-
通过命令 : vim /etc/fstab 来查看永久挂载的配置文件 , /dev/mapper/centos-root / 表示的是我们之前在 df 命令下看到的逻辑卷的那个 , UUID=52b169f8-e31e-44e3-ac26-3bc74fe9e3e9 /boot 0 0 这个表示的是启动目录的挂载点 , mpper/centos-swap 这个表示的虚拟内存的挂载 , 默认情况下是挂载了三块硬盘 , 现在我们来把那块 sdb1 硬盘也挂碍上去 .
-
该文件由六个部分组成
1:要使用的设备—可以使用UUID,也可以使用设备文件.可以使用blkid命令查看设备的UUID号
2.可以看到上面的 sdb1的信息 , 使用命令 : vim /etc/fstab 来对永久挂载的配置文件进行编辑 .
vim /etc/fstab
...
/dev/sdb1 /mnt/disk1 ext4 default 0 0
1 2 3 4 5 6
-
第二部分:写挂载点,已经存在直接写,不存在使用mkdir来创建
第三部分:文件系统类型
第四部分:挂载时,应用于设备的自定义选项,defaults是必须的
第五和第六部分:转存标志和fsck顺序
转存标志:用于生成设备内容的备份,
0:表示不需要备份
1:表示需要备份
fsck:当有多个文件系统需要检查时,检查的顺序。
0表示不需要检查,开机直接挂载
1表示检查后第一个挂载
2表示检查后第二个挂载
-
使用mount -a命令 检查书写格式是否有误 , 如果 mount -a 没有什么报错 , 则是表示配置文件书写正确 , 如果报错则书写错误 , 记得写完配置文件后wq(保存退出后一定要使用 mount -a 来检查) , 不然配置文件写错了后 , 再来开机是开不了机的 .
-
然后我们来重启一下这个操作系统 , 使用命令 : reboot
-
然后再来使用命令 df 命令查看 sdb1 是否挂载上去了 。
参考文献:Linux使用fdisk进行分区
10.11 umount命令:卸载文件系统
- 将光盘和 U 盘挂载在系统中,而在使用完成后,需要先将其与挂载点取消关联,然后才能成功卸载。不过,硬盘分区是否需要卸载,取决于你下次是否还需要使用,一般不对硬盘分区执行卸载操作。
- umount 命令用于卸载已经挂载的硬件设备,该命令的基本格式如下:
[root@CncLucZK ~]# umount [-fn] 设备文件名或挂载点
- 选项与参数:
- -f :强制卸除!可用在类似网络文件系统 (NFS) 无法读取到的情况下;
- -n :不升级 /etc/mtab 情况下卸除。
注意,卸载命令后面既可以加设备文件名,也可以加挂载点,不过只能二选一,比如:
[root@CncLucZK ~]# umount /mnt/usb
#卸载U盘挂载点
[root@CncLucZK ~]# umount /mnt/cdrom
#卸载光盘挂载点
[root@CncLucZK ~]# umount /dev/sr0
#命令加设备文件名,同样是可以卸载的
[root@CncLucZK ~]# mount /dev/sr0 /mnt/cdrom/
如果加了两个(如下所示),从理论上分析,会对光驱卸载两次,当然,卸载第二次的时候就会报错。
- 另外,我们在卸载时有可能会出现以下情况:
[root@CncLucZK ~]# cd /mnt/cdrom/
#进入光盘挂载点
[root@CncLucZK cdrom]# umount /mnt/cdrom/
umount: /mnt/cdrom: device is busy.
#报错,设备正忙
这种报错是因为我们已经进入了挂载点,因此,如果要卸载某硬件设备,在执行 umount 命令之前,用户须退出挂载目录。
卸载硬件设备成功与否,除了执行 umount 命令不报错之外,还可以使用 df 命令或
mount -l
来查看目标设备是否还挂载在系统中。
参考文献:
Linux umount命令:卸载文件系统
Linux 磁盘管理