Skip to content

挂载文件系统

Linux 中所有文件系统都必须挂载到文件树上才能够正常访问。

mount and umount

使用 mount 来挂载文件系统。 类 Unix 系统中可访问的所有文件都挂载文件树上,即文件层次结构,以/为根。这些文件可以分布在多个设备上。mount 命令用于将在设备挂载到这个文件层次结构上。相反的 umount 命令用于从层次结构中删除设备。

Bash
# 列出挂载,-t 可以指定仅仅列出对应文件系统的挂载
mount -l [-t filesystem]
# 挂载设备到挂载点
mount [-t filesystem] [-o optlist] device point
# 从/etc/fstab 中寻找对应的设备
mount [options] point
# 自动检查 etc/fstab 文件中有无疏漏被挂载的设备文件,如果有,则进行自动挂载操作
mount -a

$ mount -l -t xfs
/dev/nvme0n1p4 on / type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/nvme0n1p3 on /home type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)

其中比较重要的就是-o来指定选项:

选项 功能
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 重新挂载已挂载的文件系统,一般用于指定修改特殊权限。
uid/gid 设置文件系统中文件的所有者和组(默认都是 0 即 root)
umask 掩码设置权限,例如umask=022表示 755 权限
mode 设置文件系统中文件的权限
nofail 如果挂载失败不影响启动(否则会进入紧急模式)

/etc/fstab

/etc/fstab 文件中保存着基础的静态文件系统配置,mount 会从中读取内容来挂载文件系统,并且 init 也会读取其中的内容来在开机时自动挂载他们:

Bash
# /etc/fstab: static file system information.
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/nvme1n1p2 during installation
UUID=f0b1cbf5-1abd-4b7d-970b-70c9e2844e02 /               ext4    errors=remount-ro 0       1
# /boot/efi was on /dev/nvme1n1p1 during installation
UUID=5C63-A873  /boot/efi       vfat    umask=0077      0       1
# /home was on /dev/nvme1n1p4 during installation
UUID=caceedeb-2189-4e5e-9314-3797420e2be8 /home           ext4    defaults        0       2
# swap was on /dev/nvme1n1p3 during installation
UUID=6b594cdd-563d-4a70-ac3c-cd78daf194e2 none            swap    sw              0       0
//192.168.1.13/nas /home/ygd/nas cifs credentials=/home/ygd@ygd.com/.config/smb/smb.cred 0 0
  • file system: 要挂载的文件系统,上面是网络文件系统需要 cifs-utils 的支持,还可以是设备,通常以UUID=的形式出现,UUID可以使用lsblk -fs查看
  • mount point: 挂载点
  • type: 文件系统类型,例如 ext4 xfs ntfs 等 cifs 是网络文件系统
  • options: 实际上就是mount -o的内容
  • dump: 用来决定是否做备份的。需要安装 dump 工具,安装之后 dump 会检查 entry 并用数字来决定是否对这个文件系统进行备份。允许的数字是 0 和 1。如果是 0,dump 就会忽略这个文件系统,如果是 1,dump 会每天作一个备份。大部分的用户是没有安装 dump 的,所以对他们而言这个 entry 应该写为 0
  • pass: fsck 会检查这个选项下的数字来决定检查文件系统的顺序允许的数字是 0 1 和 2。文件系统的选项是 0 将不会被 fsck 检查。如果是 1 表示仅检查非 root 所在的文件系统,2 表示检查所有类型的文件系统

systemd 管理的发行版使用systemd-fstab-generator.service来管理 fstab

挂载 smb

要挂载 smb 需要安装cifs-utils包。他提供了 mount.cifs 命令(也可以使用mount -t cifs),后续指定了 UNC 名称(//server/sharename):

Bash
# -o 多个可以使用逗号分隔(逗号左右不能有空格)
sudo mount.cifs -o username=<user>,password=<passwd> //server/sharename /point

# nolock 有时候不好用
sudo mount //server/cnopendata /cnopendata -t cifs -o user,auto,nofail,rw,dir_mode=0777,file_mode=0777

除了共用的,cifs 还支持下选项:

选项 功能
username/password 用户名和密码
credentials 用户名和密码保存文件
file_mode/dir_mode 挂载的文件和文件夹权限,如果是公共服务 0777 就好,否则可以配合 uid/gid 来设置权限
nobrl cifs 扩展 ,表示不发送 lock 请求

nobrl 是 cifs-utils 的扩展,当使用 sqlite3 来读取挂载类型是 cifs 分区是会出现 database is locked 的错误,这里就需要在挂载参数中添加 nobrl。

这其中比较特殊的就是 credentials 它允许指定一个文件,其中以下列的方式来保存用户名和密码:

Bash
username=value
password=value
domain=value

由于 /etc/fstab 需要被其他用户读取,如果直接在其中设置用户名和密码会非常不安全,于时就提供了该选项

挂载 NFS

要挂载 NFS 需要nfs-common的支持。需要注意的是 NFS 只支持基于 ip 的访问权限设置,因此需要注意在服务器端开放对应 ip 的访问权限以及可读写性:

Bash
# 显示服务器分析的文件系统,debian 需要 su - 才能够运行
sudo showmount -e servername

# 挂载
mount -t nfs servername:/path /mountpoint

他的挂载方式比较特别服务器地址和路径之间使用冒号分隔。而要在 fstab 中定义:

Bash
servername:/music   /mountpoint/on/client   nfs   defaults,timeo=900,retrans=5,_netdev  0 0