Linux mount命令详解
_mount_命令在我心目中一直是个高大上的命令:首先,经常看见长度很长的_mount_命令;其次,是直接配置硬件的命令,敲命令的时候总是难免担心把机器搞挂了。因此,我一直以来在Mac OS和Ubuntu中都依靠操作系统自动检查插入的磁盘,就像在Windows里面一样,简直弱爆了。今天就抽空把整理一下这方面的知识。
mount命令结构
先举个例子:
1 | mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system |
这个例子里面基本分为四部分,也是我们最常用的四部分:
-o remount,rw
,指定选项-t yaffs2
,指定挂载磁盘上的文件系统的类型,这里的_yaffs2_是_Android_的文件系统类型/dev/block/mtdblock3
,指定磁盘的路径/system
,指定挂载点
也就是这样:
mount -o <选项> -t <文件系统类型> <磁盘路径> <挂载点>
需要注意的是:
-t
一般情况下不用自定,操作系统会自动识别- 磁盘路径查看方法:Linux:
fdisk -l
;Mac:diskutil list
关于_fdisk_和_diskutil_,请参考:What is the equivalent of the Linux command “sudo fdisk -l” in MacOS?
mount命令的-o选项
这个命令相对比较复杂的地方可能就是这里了:首先,选项可以有很多个,用逗号分隔;其次,针对不同的文件系统,可能有一些特殊的选项,可以参考man mount,里面用很长的篇幅说明了_mount options for xx_。
我们记住一下几个常用的就好了:
- 修改已经_mount_的文件系统的属性:remount
- 控制读写权限的:rw_与_ro
- 控制执行权限的:exec_与_noexec
- 控制执行权限的:_suid_与_nosuid_。允许和禁止set-user-identifier 或set-group-identifier位起作用
- 控制挂载和卸载权限的:_user_与_nouser_,_users_与_nousers_。前者是允许或禁止先前挂载该文件系统的用户挂载和卸载,后者是允许所有的用户挂载和卸载
- 控制文件系统的读写方式:sync_与_async
- 防止用户读写某些系统关键数据:_dev_与_nodev_,如果需要深入了解,请阅读:Understanding mount option nodev and its use with USB flash drives
- 如果打开了文件,是否更新文件的访问时间:atime_与_noatime
- 如果文件的访问时间比当前时间还早,是否更新访问时间:relatime_与_norelatime
- defaults_:默认选项,包括:_rw_,_suid_,_dev_,_exec_,_auto_,_nouser_,_async_以及_relatime
关于_set-user-identifier_详见:What is SUID and how to set SUID in Linux/Unix?,这篇文章中有几个例子,想必很容易理解了。
挂载远程文件系统
Linux和Linux之间文件共享,据我目前所知有两种方法:
- 一种是基于NFS,参考:How to Setup NFS (Network File System) on RHEL/CentOS/Fedora and Debian/Ubuntu
- 另一种是基于SSH来挂在远程文件系统,称为sshfs,参考:How to Mount a Remote Folder using SSH on Ubuntu
链接中已经给出了具体的方法,此处不赘述,命令格式完全符合本文中提到的结构和参数,除了sshfs是使用_sshfs_命令,而不是_mount_命令。
mount -t nfs 192.168.0.100:/nfsshare /mnt/nfsshare
sshfs share@192.168.0.100:/sshshare /mnt/sshshare
/etc/fstab
另外,mount_还有一个参数是_mount -a_,这就不得不提一下Linux中的/etc/fstab_文件和_/etc/mtab_文件。前者是系统启动时会自动挂载的文件系统的信息,后者是系统当前已挂载的文件系统信息。你会发现这个文件里面的配置基本和_mount_命令的参数一致。
$ cat /etc/fstab
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc nodev,noexec,nosuid 0 0
...
$ cat /etc/mtab
proc /proc proc rw,noexec,nosuid,nodev 0 0
...
不一样的地方是后面两个字段:
- _<dump>告诉_dump_命令是否需要备份这个文件系统,上面例子中因为_proc_是一个伪文件系统,用于通过内核来访问进程信息,因此不用备份,这个字段是_0
- _<pass>告诉fsck命令是否需要在检查该文件系统,如果需要开机检查该文件系统,可以将这个字段设置为_1
回到_mount -a_,一句话,此命令就是读取_/etc/fstab_,挂载里面的文件系统,一般Linux系统启动的时候会执行这个命令。
Linux挂载Windows共享
一般情况下,可以通过下面这个命令来将Windows的共享挂载到Linux的文件系统中:
mount -t cifs -o username=administrator,password=admin //192.168.0.1/share/ /mnt/windows
_cifs是微软实现的一种在Windows主机之间进行网络共享的协议。如果你需要在开机的时候自动挂载此文件系统,同样可以相应的配置写到/etc/fstab_文件中。
umount
顾名思义,就是卸载文件系统。这个命令更加简单,参数可以是挂载点,也可以是磁盘名称,即下面两种方法均可:
mount /dev/hda1 /mydoc
umount /dev/hda1
umount /mydoc