本篇将介绍一些比较实用的mount用法,包括挂载内核中的虚拟文件系统、loop device和bind mount。php
下面的全部例子都在ubuntu-server-x86_64 16.04下执行经过html
mount命令的标准格式以下linux
mount -t type -o options device dir
device: 要挂载的设备(必填)。有些文件系统不须要指定具体的设备,这里能够随便填一个字符串ubuntu
dir: 挂载到哪一个目录(必填)bash
type: 文件系统类型(可选)。大部分状况下都不用指定该参数,系统都会自动检测到设备上的文件系统类型oop
options: 挂载参数(可选)。
options通常分为两类,一类是Linux VFS所提供的通用参数,就是每一个文件系统均可以使用这类参数,详情请参考“FILESYSTEM-INDEPENDENT MOUNT OPTIONS”。另外一类是每一个文件系统本身支持的特有参数,这个须要参考每一个文件系统的文档,如btrfs支持的参数能够在这里找到。测试
网上关于如何利用mount命令挂载设备的例子不少,这里就再也不啰嗦了。spa
proc、tmpfs、sysfs、devpts等都是Linux内核映射到用户空间的虚拟文件系统,他们不和具体的物理设备关联,但他们具备普通文件系统的特征,应用层程序能够像访问普通文件系统同样来访问他们。code
这里只是示例一下怎么挂载他们,不会对他们具体的功能作详细介绍。server
#将内核的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的个数。
须要用到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功能很是强大,能够将任何一个挂载点、普通目录或者文件挂载到其余地方,是玩转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
咱们能够在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单个文件,这个功能尤为适合须要在不一样版本配置文件之间切换的时候
#建立两个用于测试的文件 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操做能够将一个挂载点移动到别的地方,这里以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”