本篇将介绍一些比较实用的mount用法,包括挂载内核中的虚拟文件系统、loop device和bind mount。

下面的所有例子都在ubuntu-server-x86_64 16.04下执行通过

基本用法

mount命令的标准格式如下

mount -t type -o options device dir

device: 要挂载的设备(必填)。有些文件系统不需要指定具体的设备,这里可以随便填一个字符串

dir: 挂载到哪个目录(必填)

type: 文件系统类型(可选)。大部分情况下都不用指定该参数,系统都会自动检测到设备上的文件系统类型

options: 挂载参数(可选)。

options一般分为两类,一类是Linux VFS所提供的通用参数,就是每个文件系统都可以使用这类参数,详情请参考“FILESYSTEM-INDEPENDENT MOUNT OPTIONS”。另一类是每个文件系统自己支持的特有参数,这个需要参考每个文件系统的文档,如btrfs支持的参数可以在这里找到。

网上关于如何利用mount命令挂载设备的例子很多,这里就不再啰嗦了。

挂载虚拟文件系统

proc、tmpfs、sysfs、devpts等都是Linux内核映射到用户空间的虚拟文件系统,他们不和具体的物理设备关联,但他们具有普通文件系统的特征,应用层程序可以像访问普通文件系统一样来访问他们。

这里只是示例一下怎么挂载他们,不会对他们具体的功能做详细介绍。

#将内核的proc文件系统挂载到/mnt,

#这样就可以在/mnt目录下看到系统当前运行的所有进程的信息,

#由于proc是内核虚拟的一个文件系统,并没有对应的设备,

#所以这里-t参数必须要指定,不然mount就不知道要挂载啥了。

#由于没有对应的源设备,这里none可以是任意字符串,

#取个有意义的名字就可以了,因为用mount命令查看挂载点信息时第一列显示的就是这个字符串。

dev@ubuntu:~$ sudo mount -t proc none /mnt

#在内存中创建一个64M的tmpfs文件系统,并挂载到/mnt下,

#这样所有写到/mnt目录下的文件都存储在内存中,速度非常快,

#不过要注意,由于数据存储在内存中,所以断电后数据会丢失掉

dev@ubuntu:~$ sudo mount -t tmpfs -o size=64m tmpfs /mnt

在Linux中,硬盘、光盘、软盘等都是常见的块设备,他们在Linux下的目录一般是/dev/hda1, /dev/cdrom, /dev/sda1,/dev/fd0这样的。而loop device是虚拟的块设备,主要目的是让用户可以像访问上述块设备那样访问一个文件。 loop device设备的路径一般是/dev/loop0, dev/loop1, ...等,具体的个数跟内核的配置有关,Ubuntu16.04下面默认是8个,如果8个都被占用了,那么就需要修改内核参数来增加loop device的个数。

ISO文件

需要用到loop device的最常见的场景是mount一个ISO文件,示例如下

#利用mkisofs构建一个用于测试的iso文件

dev@ubuntu:~$ mkdir -p iso/subdir01

dev@ubuntu:~$ mkisofs -o ./test.iso ./iso

#mount ISO 到目录 /mnt

dev@ubuntu:~$ sudo mount ./test.iso /mnt

mount: /dev/loop0 is write-protected, mounting read-only

#mount成功,能看到里面的文件夹

dev@ubuntu:~$ ls /mnt

subdir01

#通过losetup命令可以看到占用了loop0设备

dev@ubuntu:~$ losetup -a

/dev/loop0: []: (/home/dev/test.iso)

虚拟硬盘

loop device另一种常用的用法是虚拟一个硬盘,比如我想尝试下btrfs这个文件系统,但系统中目前的所有分区都已经用了,里面都是有用的数据,不想格式化他们,这时虚拟硬盘就有用武之地了,示例如下

#因为btrfs对分区的大小有最小要求,所以利用dd命令创建一个128M的文件

dev@ubuntu:~$ dd if=/dev/zero bs=1M count=128 of=./vdisk.img

#在这个文件里面创建btrfs文件系统

#有些同学可能会想,硬盘一般不都是先分区再创建文件系统的吗?

#是的,分区是为了方便磁盘的管理,

#但对于文件系统来说,他一点都不关心分区的概念,你给他多大的空间,他就用多大的空间,

#当然这里也可以先用fdisk在vdisk.img中创建分区,然后再在分区上创建文件系统,

#只是这里的虚拟硬盘不需要用作其他的用途,为了方便,我就把整个硬盘全部给btrfs文件系统,

dev@ubuntu:~$ mkfs.btrfs ./vdisk.img

#这里会输出一些信息,提示创建成功

#mount虚拟硬盘

dev@ubuntu:~$ sudo mount ./vdisk.img /mnt/

#在虚拟硬盘中创建文件成功

dev@ubuntu:~$ sudo touch /mnt/aaaaaa

dev@ubuntu:~$ ls /mnt/

aaaaaa

#加上刚才上面mount的iso文件,我们已经用了两个loop device了

dev@ubuntu:~$ losetup -a

/dev/loop0: []: (/home/dev/test.iso)

/dev/loop1: []: (/home/dev/vdisk.img)

挂载多个设备到一个文件夹

细心的朋友可能已经发现了,在上面的例子中,将test.iso和vdisk.img都mount到了/mnt目录下,这个在Linux下是支持的,默认会用后面的mount覆盖掉前面的mount,只有当umount后面的device后,原来的device才看的到。 看下面的例子

#先umount上面的iso和vdisk.img

dev@ubuntu:~$ sudo umount ./test.iso

dev@ubuntu:~$ sudo umount ./vdisk.img

#在/mnt目录下先创建一个空的test文件夹

dev@ubuntu:~$ sudo mkdir /mnt/test

dev@ubuntu:~$ ls /mnt/

test

#mount iso文件

dev@ubuntu:~$ sudo mount ./test.iso /mnt

#再看/mnt里面的内容,已经被iso里面的内容给覆盖掉了

dev@ubuntu:~$ ls /mnt/

subdir01

#再mount vdisk.img

dev@ubuntu:~$ sudo mount ./vdisk.img /mnt/

#再看/mnt里面的内容,已经被vdisk.img里面的内容给覆盖掉了

dev@ubuntu:~$ ls /mnt/

aaaaaa

#通过mount命令可以看出,test.iso和vdisk.img都mount在了/mnt

#但我们在/mnt下只能看到最后一个mount的设备里的东西

dev@ubuntu:~$ mount|grep /mnt

/home/dev/test.iso on /mnt type iso9660 (ro,relatime)

/home/dev/vdisk.img on /mnt type btrfs (rw,relatime,space_cache,subvolid=5,subvol=/)

#umount /mnt,这里也可以用命令sudo umount ./vdisk.img,一样的效果

dev@ubuntu:~$ sudo umount /mnt

#test.iso文件里面的东西再次出现了

dev@ubuntu:~$ ls /mnt/

subdir01

#再次umount /mnt,这里也可以用命令sudo umount ./test.iso,一样的效果

dev@ubuntu:~$ sudo umount /mnt

#最开始/mnt目录里面的文件可以看到了

dev@ubuntu:~$ ls /mnt/

test

有了这个功能,平时挂载设备的时候就不用专门去创建空目录了,随便找个暂时不用的目录挂上去就可以了。

挂载一个设备到多个目录

当然我们也可以把一个设备mount到多个文件夹,这样在多个文件夹中都可以访问该设备中的内容。

#新建两目录用于挂载点

dev@ubuntu:~$ sudo mkdir /mnt/disk1 /mnt/disk2

#将vdisk.img依次挂载到disk1和disk2

dev@ubuntu:~$ sudo mount ./vdisk.img /mnt/disk1

dev@ubuntu:~$ sudo mount ./vdisk.img /mnt/disk2

#这样在disk1下和disk2下面都能看到相同的内容

dev@ubuntu:~$ tree /mnt

/mnt

├── disk1

│   └── aaaaaa

└── disk2

└── aaaaaa

#在disk1下创建一个新文件

dev@ubuntu:~$ sudo touch /mnt/disk1/bbbbbb

#这个文件在disk2下面也能看到

dev@ubuntu:~$ tree /mnt

/mnt

├── disk1

│   ├── aaaaaa

│   └── bbbbbb

└── disk2

├── aaaaaa

└── bbbbbb

bind mount

bind mount功能非常强大,可以将任何一个挂载点、普通目录或者文件挂载到其他地方,是玩转Linux的必备技能

基本功能

bind mount会将源目录绑定到目的目录,然后在目的目录下就可以看到源目录里的文件

#准备要用到的目录

dev@ubuntu:~$ mkdir -p bind/bind1/sub1

dev@ubuntu:~$ mkdir -p bind/bind2/sub2

dev@ubuntu:~$ tree bind

bind

├── bind1

│   └── sub1

└── bind2

└── sub2

#bind mount后,bind2里面显示的就是bind1目录的内容

dev@ubuntu:~$ sudo mount --bind ./bind/bind1/ ./bind/bind2

dev@ubuntu:~$ tree bind

bind

├── bind1

│   └── sub1

└── bind2

└── sub1

readonly bind

我们可以在bind的时候指定readonly,这样原来的目录还是能读写,但目的目录为只读

#通过readonly的方式bind mount

dev@ubuntu:~$ sudo mount -o bind,ro ./bind/bind1/ ./bind/bind2

dev@ubuntu:~$ tree bind

bind

├── bind1

│   └── sub1

└── bind2

└── sub1

#bind2目录为只读,没法touch里面的文件

dev@ubuntu:~$ touch ./bind/bind2/sub1/aaa

touch: cannot touch './bind/bind2/sub1/aaa': Read-only file system

#bind1还是能读写

dev@ubuntu:~$ touch ./bind/bind1/sub1/aaa

#我们可以在bind1和bind2目录下看到刚创建的文件

dev@ubuntu:~$ tree bind

bind

├── bind1

│   └── sub1

│   └── aaa

└── bind2

└── sub1

└── aaa

如果我们想让当前目录readonly,那么可以bind自己,并且指定readonly参数:

#bind mount并且指定readonly

dev@ubuntu:~$ sudo mount -o bind,ro ./bind/bind1/ ./bind/bind1

#创建新文件失败

dev@ubuntu:~$ touch ./bind/bind1/sub1/aaa

touch: cannot touch './bind/bind1/sub1/aaa': Read-only file system

#umount之后,文件夹恢复到原来的读写权限

dev@ubuntu:~$ sudo umount ./bind/bind1/

##touch文件成功

dev@ubuntu:~$ touch ./bind/bind1/sub1/aaa

dev@ubuntu:~$

bind mount单个文件

我们也可以bind mount单个文件,这个功能尤其适合需要在不同版本配置文件之间切换的时候

#创建两个用于测试的文件

dev@ubuntu:~$ echo aaaaaa > bind/aa

dev@ubuntu:~$ echo bbbbbb > bind/bb

dev@ubuntu:~$ cat bind/aa

aaaaaa

dev@ubuntu:~$ cat bind/bb

bbbbbb

#bind mount后,bb里面看到的是aa的内容

dev@ubuntu:~$ sudo mount --bind ./bind/aa bind/bb

dev@ubuntu:~$ cat bind/bb

aaaaaa

#即使我们删除aa文件,我们还是能够通过bb看到aa里面的内容

dev@ubuntu:~$ rm bind/aa

dev@ubuntu:~$ cat bind/bb

aaaaaa

#umount bb文件后,bb的内容出现了,不过aa的内容再也找不到了

dev@ubuntu:~$ sudo umount bind/bb

dev@ubuntu:~$ cat bind/bb

bbbbbb

move一个挂载点到另一个地方

move操作可以将一个挂载点移动到别的地方,这里以bind mount为例来演示,当然其他类型的挂载点也可以通过move操作来移动。

#umount上面操作所产生的挂载点

dev@ubuntu:~$ sudo umount /home/dev/bind/bind1

dev@ubuntu:~$ sudo umount /home/dev/bind/bind2

#bind mount

dev@ubuntu:~$ sudo mount --bind ./bind/bind1/ ./bind/bind2/

dev@ubuntu:~$ ls ./bind/bind*

./bind/bind1:

sub1

./bind/bind2:

sub1

#move操作要求mount point的父mount point不能为shared。

#在这里./bind/bind2/的父mount point为'/',所以需要将'/'变成private后才能做move操作

#关于shared、private的含义将会在下一篇介绍

dev@ubuntu:~$ findmnt -o TARGET,PROPAGATION /

TARGET PROPAGATION

/ shared

dev@ubuntu:~$ sudo mount --make-private /

dev@ubuntu:~$ findmnt -o TARGET,PROPAGATION /

TARGET PROPAGATION

/ private

#move成功,在mnt下能看到bind1里面的内容

dev@ubuntu:~$ sudo mount --move ./bind/bind2/ /mnt

dev@ubuntu:~$ ls /mnt/

sub1

#由于bind2上的挂载点已经被移动到了/mnt上,于是能看到bind2目录下原来的文件了

dev@ubuntu:~$ ls ./bind/bind2/

sub2

结束语

在这篇文章中演示了一些比较实用的mount操作,尤其是bind mount,至于在哪些情况下要用哪些功能,需要我们自己去挖掘。下一篇中将介绍mount相关的“Shared subtrees”

参考

linux mount 日志,Linux mount (第一部分)相关推荐

  1. linux dprintk 日志,linux命令备忘

    2012-09-06 07:16 1234人阅读 评论(0) links -dump your.html html2txt lynx --dump your.html html2txt ldconfi ...

  2. linux postfix 日志,linux – 如何计算Postfix的mailq的消息?

    推荐文章 Wish me luck, I'm diving into JavaScript! As much as I want to start using JavaScript right awa ...

  3. linux 高性能日志,linux日志系统

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 常见的日志 常见的日志一般存放在 /var/log 中,我们可以根据服务对象粗略的将日志分为两类系统日志 应用日志日志名 ...

  4. linux 邮件日志,linux下如何建立邮件日志

    先关闭sendmail service sendmail stop chkconfig sendmail off 安装DNS mount /dev/cdrom /mnt yum install bin ...

  5. linux蓝牙日志,linux蓝牙

    linux蓝牙 (2008-12-30 17:20:07) 标签: 杂谈 为了将手机上的图片传送到笔记本电脑上,发现手机和笔记本电脑同时支持蓝牙. linux下蓝牙工具为bluez,包括bluez-u ...

  6. linux蓝牙日志,Linux下使用蓝牙(ZT)

    使用 爱立信T68i.索爱T628 与 Billionton USB Bluetooth Adapter 在Debian Kernel-2.6.0内核下测试通过. (本人购买的台产Billionton ...

  7. linux 僵死日志,linux 僵死进程及处理

    =========================================== defunct 进程只是在process table里还有一个记录,其他的资源没有占用,除非你的系统的proce ...

  8. linux 擦 日志,linux日志清除脚本(擦屁股必备)

    使用方法: $0 options options有: -h 帮助 -i [ip]       查找在所有的日志文件特别IP_ADDRESS和搜索排名前20位的IP在日志文件中记录. -d [ip]   ...

  9. natepad怎么连linux看日志,linux添加用户操作日志

    1.把以下内容放至/etc/profile结尾(部分系统如CentOS 5.5可能需要放至/etc/bashrc结尾)HISTFILESIZE=2000 HISTSIZE=2000 export HI ...

最新文章

  1. Oracle已从2019年1月起收取Java费用
  2. Windows无法自动检测此网络的代理设置
  3. 人脸识别损失函数综述(附开源地址)
  4. 【数理知识】《矩阵论》方保镕老师-第6章-广义逆矩阵及其应用
  5. 第九天2017/04/18(2、类的继承、面试题:继承访问修饰符、组合、static、构造、多态)
  6. 交换网络中的sniffer讨论-基于交换网络的ARP spoofing sniffer
  7. Tomcat处理一个HTTP请求的过程
  8. 【Keras】30 秒上手 Keras+实例对mnist手写数字进行识别准确率达99%以上
  9. 西瓜书——EM算法(一)
  10. Linux cut 实例
  11. 一、SIM800C简介
  12. 电脑风扇转一下停一下开不了机解决方案
  13. 韩昊 20190919-5 代码规范,结对
  14. Spark性能调优-Shuffle相关参数配置
  15. mysql服务账号密码忘记_windows mysql 账号密码忘了怎么办
  16. 刷题 Python: 明码
  17. 多可文档管理软件权限说明(4)——权限累加规则
  18. 安装opensips时创建MySQL表_Centos7.6安装opensips并实现通话成功
  19. oracle rac部署示意图,Oracle 11g RAC部署手册 For Linux PDF
  20. 对话系统论文集(1)-BBQ网络

热门文章

  1. error C2664: 'LONG CTabCtrl::InsertItem(int,TCITEMW *)' : cannot convert parameter 2 from 'char *' t
  2. python 小说 云_小说python何时使用生成器
  3. CTF常见密码编码合集
  4. 解决 VScode 中 MPE 插件无法渲染各种图的问题
  5. c++之模板初阶详解!
  6. jsp和MySQL实现会员卡功能_健身房会员卡管理系统的设计与实现(JSP,MySQL)(含录像)...
  7. java怎么找出数组最小值,Java找出数组的最小值元素
  8. [MFC美化] SkinSharp使用详解2-SkinH.h函数介绍
  9. 对github的中间人攻击
  10. 一项新研究发现,新冠患者脑损伤标志物短期内高于阿尔茨海默症患者