简介
mount操作是用来挂载文件系统,需要在特权级(CAP_SYS_ADMIN)下执行;将source指定的文件系统(通常是指向设备的路径名,但也可以是目录或文件的路径名,或者是虚拟字符串)附加到target中路径名指定的位置(目录或文件)。
umount操作是用来卸载文件系统,同样需要在特权级(CAP_SYS_ADMIN)下执行;
mount函数原型:
#include <sys/mount.h>
int mount(const char *source, const char *target, const char *filesystemtype, unsigned long mountflags, const void *_Nullable data);
int unmount(const char *target);
int unmount2(const char *target ,int flags);
filesystemtype参数:
传入需要挂载的文件系统类型,具体内核支持的类型,可以查看文件/proc/filesystems;例如,"btrfs", "ext4", "jfs", "xfs", "vfat", "fuse", "tmpfs", "cgroup", "proc", "mqueue”,"nfs", "cifs", "iso9660"等待。
当加载适当的模块时,其他类型可能变得可用。
mountflags参数:
可以指定 0到多个如下标志:
MS_BIND:建立绑定挂载,如果指定了该标志,那么 mount()会忽略fstype、 data 参数,以及 mountflags 中除 MS_REC 之外的标志。
MS_DIRSYNC:同步更新路径,该标志的效果类似于 open()的 O_SYNC 标志,但只针对路径。
MS_MANDLOCK:允许对该文件系统中的文件强行锁定记录;
MS_MOVE:将由 source 指定的现有挂载点移到由 target 指定的新位置,令整个动作为一原子操作,不可分割;一旦使用了这一标志,那么 mount()将忽略 fstype、 data 参数 以及 mountflags 中的其他标志。
MS_NOATIME:不更新最后访问时间(使用该标志意在消除额外的磁盘访问,避免每次访问时都更新文件i节点,可提高性能)
MS_NODEV:不允许访问此文件系统上的块设备和字符设备。设计这一特性的目的是为了保障系统安全,规避如下情况:假设用户插入了可移动磁盘,而磁盘中又包含了可随意访问系统的设备 专有文件。
MS_NODIRATIME:不更新目录的最后访问时间。
MS_NOEXEC:不允许在此文件系统上执行程序或脚本,该标志用于文件系统包含非 Linux 可执行文件的场景。
MS_NOSUID:禁用set-user-ID和set-group-ID,这属于安全特性,意在防止用户从 可移动磁盘上运行 set-user-ID 和 set-group-ID 程序。
MS_RDONLY:以只读方式挂载文件系统,在此文件系统上不能创建和修改文件;
MS_REC:该标志与其他标志(比如, MS_BIND)结合使用,以递归方式将挂载动作施之于子树下的所有挂载。
MS_RELATIME :只有当文件最后访问时间戳的当前值(上次更新时间)小于或等于最后一次修改或状态更新的时间戳时,才对其进行更新;
MS_REMOUNT :针对已经挂载的文件系统,改变其mountflag和data使用该标志时, source 和 target 参数应该与最初用于 mount()系统调用的参数相同,而对 fstype 参数则予以忽略。使用该标志可以避免对磁盘进行卸载和重新挂载,在某些场合中,这是不可能做到的。
MS_STRICTATIME:只要访问文件,就总是更新文件的最后访问时间戳;
MS_SYNCHRONOUS:对文件系统上的所有文件和目录保持同步更新;
data参数:
指向信息缓冲区的指针,对其信息的解释则取决于文件系统,不同的文件系统类型,含义解释不同,通常是由逗号分隔的选项组成的字符串。如果没有选项,这个参数可以指定为NULL。
mount命令
格式:mount [-参数] [设备名称] [挂载点]
mount [-lhV]
mount -a [-fFnrsvw] [-t vfstype] [-O optlist]
mount [-fnrsvw] [-o options [,...]] device | dir
mount [-fnrsvw] [-t vfstype] [-o options] device dir
命令参数:
-o <选项> 指定挂载文件系统时的选项,有些也可写到在/etc/fstab中。常用的有:
defaults 使用所有选项的默认值(rw, suid, dev, exec, auto, nouser, and async)
auto/noauto 允许/不允许以 –a选项进行安装,打开/关闭自动挂上模式
dev/nodev 对/不对文件系统上的特殊设备进行解释
exec/noexec 允许/不允许执行二进制代码
suid/nosuid 确认/不确认suid和sgid位
user /nouser 允许/不允许一般用户挂载
codepage=XXX 代码页
iocharset=XXX 字符集
ro 以只读方式挂载
rw 以读写方式挂载
remount 重新安装已经安装了的文件系统,将一个已经挂下的档案系统重新用不同的方式挂上。例如原先是唯读的系统,现在用可读写的模式重新挂上。
loop 挂载回旋设备,使用 loop 模式用来将一个档案当成硬盘分割挂上系统
username/password : 用来设置有访问权限的用户名和密码
async:打开非同步模式,所有的档案读写动作都会用非同步模式执行。
sync:在同步模式下执行。
atime/noatime:当 atime 打开时,系统会在每次读取档案时更新档案的(上一次调用时间)。当我们使用 flash 档案系统时可能会选项把这个选项关闭以减少写入的次数。
-t <文件系统类型> 指定设备的文件系统类型,常见的有:
ext4 linux目前常用的文件系统
msdos MS-DOS的fat,就是fat16
vfat windows98常用的fat32
nfs 网络文件系统
iso9660 CD-ROM光盘标准文件系统
ntfs windows NT/2000/XP的文件系统
cifs windows网络共享文件 (cifs是smbfs的升级版,首先推荐)
auto 自动检测文件系统
-a :安装在/etc/fstab文件中类出的所有文件系统。
-f :伪装mount,作出检查设备和目录的样子,但并不真正挂载文件系统。通常用在除错的用途。它会使 mount 并不执行实际挂上的动作,而是模拟整个挂上的过程。通常会和 -v 一起使用。
-n :不把安装记录在/etc/mtab 文件中。
-r 讲文件系统安装为只读,等于 -o ro
-v 详细显示安装信息,通常和 -f 用来除错。
-w 将文件系统安装为可写,为命令默认情况,等于 -o rw
-V:显示程序版本
-h:显示辅助讯息
-F:这个命令通常和 -a 一起使用,它会为每一个 mount 的动作产生一个行程负责执行。在系统需要挂上大量 NFS 档案系统时可以加快挂上的动作。
-L:将含有特定标签的硬盘分割挂上。
-U:将档案分割序号为 的档案系统挂下。-L 和 -U 必须在/proc/partition 这种档案存在时才有意义。
mount操作相关的核心文件
/proc/mounts:记录系统已经挂载的文件系统详情;
/etc/mtab:执行mount操作时,会更新此文件;此文件记录当前系统已挂载的分区。每次挂载/卸载分区时会更新此文件中的信息;其中记录内容和/proc/mounts差不多,只是细节上有些不一样;特别是/etc/mtab包含了挂载操作的专有选项;
/etc/fstab:在在开机时,读取此配置文件,根据配置,自动检查分区(fsck命令)以及自动挂载文件系统。
/proc/self/mountinfo:记录当前进程内已挂载的文件系统详情,此文件仅仅对进程内可见,且只记录进程挂载文件系统的信息;与/proc/[pid]/mountinfo文件一样;此文件的格式为:
36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11)
(1) mount ID,挂载点的唯一标识
(2) parent ID,当前挂载点的父挂载点的ID,或者这个挂载名称空间的挂载树的根的self的ID
(3) major:minor, files的st_dev的值
(4) root: 文件系统的根挂载点
(5) mount point: 相对于进程根目录的挂载点
(6) mount options: 预挂载选项
(7) options fields: tag:[value] 类型的字段
(8) sparator: options fields结束标志(-)
(9) file systemtype: 文件系统的名称,以type[.subtype]的方式命名
(10) mount source: 文件特定信息
(11) super options: 超级块选项
如果在路径名P处将新挂载堆叠在先前现有挂载之上(以便隐藏现有挂载),则新挂载的父挂载是该位置上的先前挂载。因此,当查看堆叠在特定位置的所有挂载时,最顶部的挂载不是同一位置上任何其他挂载的父挂载。(但是,请注意,只有当P的最长路径子前缀(即挂载点)本身没有被堆叠挂载隐藏时,才可以访问这个最顶层挂载。)
如果父挂载位于进程的根目录之外(参见chroot(2)),则此处显示的ID在mountinfo中将没有相应的记录,其挂载ID(字段1)与此父挂载ID匹配(因为位于进程根目录之外的挂载不会显示在mountinfo中)。作为一种特殊情况,进程的根挂载可能有一个位于进程根目录之外的父挂载(对于initramfs文件系统),并且该挂载的条目不会出现在mountinfo中。
/proc/pid/mountstas:该文件包含了进程所挂载的文件系统的统计信息。此文件的格式为:
device /dev/sda7 mounted on /home with fstype ext3 [statistics]
( 1 ) ( 2 ) ( 3 ) ( 4 )
( 1 ) 挂载载的设备名
( 2 ) 挂载点
( 3 ) 文件系统类型
( 4 ) 可选的统计和配置信息.在2.6.26之后,仅NFS文件系统可以到处此字段信息
/proc/filesystems:列出内核支持的文件系统类型信息;它们通常是编入内核的文件系统类型, 但该文件还可以包含可加载的内核模块加入的其它文件系统类型。
/proc/partitions:记录系统的硬盘和硬盘分区情况
mount操作列举:
由于mount函数操作和命令操作,其本质都一样,故只以命令操作列举;
列出被挂载的文件系统
列出所有被挂载的指定类型的文件系统
mount -l
列出指定类型的已挂载的文件系统
mount -l -t type
绑定挂载
绑定挂载是把一个现有的目录树复制到另外一个挂载点下。通过绑定挂载得到的目录和文件与原始的目录和文件是一样的,无论从挂载目录还是原始目录执行的变更操作都会立即反映在另外一端。
简单的说就是可以将任何一个挂载点、普通目录或者文件挂载到其它的地方。
绑定挂载是一项非常有用的技术,它可以实现跨文件系统的数据共享,这是容器技术实现自身文件系统的基础。
mount --bind olddir newdir
mount -o bind olddir newdir
(--bind:等同于 -o bind)
以上只能够挂一种文件系统,即不能挂载submount.
把整个的文件系统(包括submount)挂载,则需要以下命令:
mount --rbind olddir newdir
断开绑定:
umount newdir
修改或者转移挂载点
mount --move mountpoint newdir
(--move:等同于 -o move)
第一个参数必须是一个挂载点,该选项表示将挂载点转移,先释放原挂载点,然后挂载到新挂载点newdir。
挂载回环设备
回环设备( loopback device)是指一个大的镜像文件,如xxx.iso或xxx.img等,在此文件内建立一个文件系统,此文件就像一个新的磁盘或光盘设备一样使用,在已有设备上建立文件来模拟物理块设备。允许用户以一个普通磁盘文件虚拟成一个块设备,是使用文件来模拟块设备的一种技术。
在使用之前,一个 loop 设备必须要和一个文件进行连接;
回环设备以 /dev/loop0、/dev/loop1 等命名。(注意:只有超级用户才有权限设置回环设备)
每个设备可虚拟一个块设备。
loop最大值调整:在 /etc/modules.conf中,添加“options loop max_loop=64”;在 /etc/modprobe.conf中,增加“options loop max_loop=127 #最大会有127个loop接口”,重启生效;
losetup命令
用于设置loop设备;
losetup [-d][-e <加密方式>][-o <平移数目>][循环设备代号][文件]
参数说明:
-d 卸除设备。
-e <加密方式> 启动加密编码。
-o <平移数目> 设置数据平移的数目。
-a 显示所有循环设备的状态。
-f 寻找第一个未使用的循环设备
将磁盘镜像文件虚拟成块设备:
losetup /dev/loop1 disk.img
挂载块设备:
mount /dev/loop1 /tmp
经过以上操作,就可以通过/tmp目录,像访问真实块设备一样来访问磁盘镜像文件disk.img。
卸载loop设备:
losetup -d /dev/loop1
挂载光盘镜像
从光盘制作光盘镜像文件:
cp /dev/cdrom /home/xxx/image.iso
or
dd if=/dev/cdrom of=/home/xxx/image.iso
把文件夹里的内容制作成光盘镜像文件:
kisofs -r -J -V cd_disk -o /home/xxx/image.iso /home/xxx/cd-disk
光盘镜像文件的挂载:
mkdir /mnt/cd-disk
mount -o loop -t iso9660 /home/xxx/image.iso /mnt/cd-disk
挂载普通文件为ext虚拟磁盘
dd if=/dev/zero of=ext4.img bs=512M count=2
mkfs.ext4 ext4.img #将ext4.img文件格式化为ext4格式
mkdir /mnt/loopback
mount -o loop ext4.img /mnt/loopback
以上操作实际等价于下面两条命令:
losetup /dev/loop0 ext4.img
mount /dev/loop0 /mnt/loopback
挂载移动硬盘
先用fdisk –l或more /proc/partitions查看系统的硬盘和硬盘分区情况
假设系统新增移动硬盘设备为:/dev/sdb,此移动硬盘存在两个分区:/dev/sdb1(文件系统类型为:ntfs)和/dev/sdb2(文件系统类型为:vfat)
mkdir -p /mnt/disk_part1
mkdir -p /mnt/disk_part2
mount -t ntfs /dev/sdb1 /mnt/disk_part1
mount -t vfat /dev/sdb2 /mnt/disk_part2
若汉字文件名显示为乱码或不显示,可以在mount时增加选项-o iocharset=cp936。
假设系统新增的移动硬盘是新的,没有分区过,则可以使用fdisk分区命令和mkfs文件系统创建命令,进行分区操作;
挂接Windows文件共享(samba)
cifs与smbfs区别:smbfs在kernel2.6.29之后就被弃用了,取而代之的为cifs;
mount -t cifs -o codepage=cp936,username=用户名,password=密码 //ip地址/共享文件夹名 挂载点
mount -t cifs -o codepage=cp936,username=用户名,password=密码 //计算机名/共享文件夹名 挂载点
若没有设置用户名和密码,则可以简化为:
mount -t cifs -o codepage=cp936 //ip地址或计算机名/共享文件夹名 挂载点
注意:参数codepage=cp936,指定服务器端文件系统的编码,cp936 就是简体中文;
假设win服务端的samba账号为:user_xxx,密码为:mima_yyy,ip地址为:192.168.1.6,共享文件夹名为:share
mkdir –p /mnt/samba
mount -t cifs -o codepage=cp936,username=user_xxx,password=mima_yyy //192.168.1.6/share /mnt/samba
挂载UNIX系统NFS文件共享
类似于windows的网络共享,UNIX(Linux)系统也有自己的网络共享,那就是NFS(网络文件系统)
假设服务端共享文件路径为:/home/user_xxx,ip地址为:192.168.1.6
mkdir –p /mnt/nfs
mount -t nfs -o rw 192.168.1.6:/home/user_xxx /mnt/nfs
挂载tmpfs
tmpfs是一种基于内存的文件系统,不像其他的文件系统需要格式化后才可以挂载,而是直接使用,由于是在内存中存储数据,那么在断电后会导致数据丢失。在使用到tmpfs文件系统存储数据效率会得到一定的提升。
mkdir -p /mnt/tmp
mount -t tmpfs -o size=100m tmpfs /mnt/tmp #tmpfs大小限制在100M,如果不限制则可以去掉-o size=100m参数
mount -o remount,size=60m /mnt/tmp #通过remount参数,可以动态调整tmpfs大小
在进行大规模软件编译时,缓存已编译的对象有时会加速整个过程。为缓存对象,可以使用以下命令:
mkdir -p /mnt/tmp/gcc-cache
chmod 777 /mnt/tmp/gcc-cache
export CCACHE_DIR=/mnt/tmp/gcc-cache
挂载OverlayFS
OverlayFS就是将既有的FS叠加而成的一种抽象的复合FS,它并不负责底层实际的分区布局和数据存储格式,它只负责将那些已经存在的FS组合起来。
OverlayFS是一种堆叠文件系统,它依赖并建立在其它的文件系统之上,并不直接涉及磁盘空间结构,看起来像是将多个目录的文件按照规则合并到同一个目录。且对多个源目录具体使用文件系统类型没有要求,即使各个源目录的文件系统类型不同也不影响使用。
OverlayFS可以解决以下问题:
1. 我把data1这个分区mount到了/mnt,后来我又把data2分区mount到了/mnt,请问如何在不卸载data2(服务在运行,无法卸载)的情况下访问data1里的数据。
2. 两个隔离的容器需要共享相同的几个目录。
OverlayFS层级说明:
lower层:随便的一个目录,在OverlayFS中它是只读的。如果对它进行写入,则会执行Copy-on-Write将其拷贝到upper层之后再写入。
upper层:随便的一个目录,在OverlayFS它是可读写的。
merge层:随便的一个空目录,在OverlayFS中它完成了lower层和upper层的并集,提供一个统一的操作视图。
worker空间:充当工作中的操作数据的空间。
lowerdir是OverlayFS中只读的层,不能被修改,OverlayFS支持多个lowerdir
upperdir是可读写的,OverlayFS中对文件的创建、修改、删除操作都在这一层体现。
mergeddir是挂载点(mount point)目录,也是用户最终看到的目录
workdir用来存放临时文件,用来存放文件修改中间过程的临时文件
当我们挂载完成overlayfs以后,对文件系统的任何操作都只能在merge dir中进行,用户不允许再直接或间接的到底层文件系统的原始lower dir或upper dir目录下修改文件或目录,否则可能会出现一些无法预料的后果
挂载一个overlay文件系统,可以通过mount -t overlay -o <options> overlay <mount point>来实现。
<options> :
- lowerdir=<dir>:指定用户需要挂载的lower层目录,lower层支持多个目录,用“:”间隔,优先级依次降低。最多支持500层。
- upperdir=<dir>:指定用户需要挂载的upper层目录,upper层优先级高于所有的lower层目录。
- workdir=<dir>:指定文件系统挂载后用于存放临时和间接文件的工作基础目录。
- default_permissions:
- redirect_dir=on/off:开启或关闭redirect directory特性,开启后可支持merged目录和纯lower层目录的rename/renameat系统调用。
- index=on/off:开启或关闭index特性,开启后可避免hardlink copyup broken问题。
<mount point>:最终overlay的挂载点。
在使用如上mount进行OverlayFS合并之后,遵循如下规则:
- lowerdir和upperdir两个目录存在同名文件时,lowerdir的文件将会被隐藏,用户只能看到upperdir的文件。
- lowerdir低优先级的同目录同名文件将会被隐藏。
- 如果存在同名目录,那么lowerdir和upperdir目录中的内容将会合并。
- 当用户修改mergedir中来自upperdir的数据时,数据将直接写入upperdir中原来目录中,删除文件也同理。
- 当用户修改mergedir中来自lowerdir的数据时,lowerdir中内容均不会发生任何改变。因为lowerdir是只读的,用户想修改来自lowerdir数据时,overlayfs会首先拷贝一份lowerdir中文件副本到upperdir中。后续修改或删除将会在upperdir下的副本中进行,lowerdir中原文件将会被隐藏。
- 如果某一个目录单纯来自lowerdir或者lowerdir和upperdir合并,默认无法进行rename系统调用。但是可以通过mv重命名。如果要支持rename,需要CONFIG_OVERLAY_FS_REDIRECT_DIR。
下面命令将lower和upper进行overlay,挂载到merge目录,临时workdir为work目录。
mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=work overlay merge
将lower和upper进行overlay到merge,但是merge为只读属性。
mount -t overlay -o lowerdir=upper:lower overlay merge