Linux /etc/fstab 磁盘分区自动挂载

发布时间: 更新时间: 总字数:2353 阅读时间:5m 作者: IP上海 分享 网址

Linux 通过在 /etc/fstab 中配置磁盘分区的 UUID 实现自动挂载(mount)分区

fstab 介绍

通常情况,Linux 的 /etc/fstab 文件可能有如下内容:

#
# /etc/fstab
# Created by anaconda on Fri Aug 18 03:51:14 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=59d9ca7b-4f39-4c0c-9334-c56c182076b5 /                       ext4    defaults        1 1

目前不少 Linux 系统(红帽系列的 Fedora,Cent OS,或 Debian 系列的 Ubuntu,LinuxMint,等等)都采用 UUID 方式挂载分区。

UUID 全称是 Universally Unique Identifier,也就是说,每个分区有一个唯一的 UUID 值,这样就不会发生分区识别混乱的问题了。

从上面的fstab文件片段可以看出,一般分区的挂载:

UUID=59d9ca7b-4f39-4c0c-9334-c56c182076b5 /                       ext4    defaults        1 1

fstab 格式说明

挂载分区的格式:

<file system> <mount point>   <type>  <options>       <dump>  <pass>

/etc/fstab 文件详解:

  • fie sysytem:这里用来指定你要挂载的文件系统的设备名称或块信息,也可以是远程的文件系统。

    • 如果想把本机上的某个设备(device)挂载上来,写法如:/dev/sda1、/dev/hda2 或/dev/cdrom,其中,/dev/sda1 表示第一个串口硬盘的第一个分区,也可以是第一个 SCSI 硬盘的第一个分区,/dev/hda1 表示第一个 IDE 硬盘的第一个分区,/dev/cdrom 表示光驱。

    • 此外,还可以 label(卷标)或 UUID(Universally Unique Identifier 全局唯一标识符)来表示。用 label 表示之前,先要 e2label 创建卷标,如:e2label /dir_1 /dir_2,其意思是说用/dir_2 来表示/dir_1 的名称。然后,再在/etc/fstab 下按如下形式添加:LABEL=/dir_2 /dir_2 。重启后,系统就会将/dir_1 挂载到/dir_2 目录上。对于 UUID,可以用 vol_id -u /dev/sdax 来获取。比如我想挂载第一块硬盘的第十一个分区,先用命令 vol_id -u /dev/sda11 来取得 UUID,比如是:5dc08a62-3472-471b-9ef5-0a91e5e2c126,然后在这个域上填写: UUID=5dc08a62-3472-471b-9ef5-0a91e5e2c126,即可表示/dev/sda11。Red Hat linux 一般会使用 label,而 Ubuntu linux 一般会用 UUID。

  • mount point:挂载点,也就是自己找一个或创建一个 dir(目录),然后把文件系统挂到这个目录上,然后就可以从这个目录中访问要挂载文件系统。对于 swap 分区,这个域应该填写:none,表示没有挂载点。

  • type:这里用来指定文件系统的类型。下面的文件系统都是目前 Linux 所能支持的:adfs、befs、cifs、ext3、 ext2、ext、iso9660、kafs、minix、msdos、vfat、umsdos、proc、reiserfs、swap、 squashfs、nfs、hpfs、ncpfs、ntfs、affs、ufs。

  • options:这里用来填写设置选项,各个选项用逗号隔开。由于选项非常多,而这里篇幅有限,所以不再作详细介绍,如需了解,请用 命令 man mount 来查看。但在这里有个非常重要的关键字需要了解一下:defaults,它代表包含了选项 rw,suid,dev,exec,auto,nouser 和 async。

  • dump:此处为 1 的话,表示要将整个里的内容备份;为 0 的话,表示不备份。现在很少用到 dump 这个工具,在这里一般选 0。

  • pass:这里用来指定如何使用 fsck 来检查硬盘。如果这里填 0,则不检查;挂载点为 / 的(即根分区),必须在这里填写 1,其他的都不能填写 1。如果有分区填写大于 1 的话,则在检查完根分区后,接着按填写的数字从小到大依次检查下去。同数字 的同时检查。比如第一和第二个分区填写 2,第三和第四个分区填写 3,则系统在检查完根分区后,接着同时检查第一和第二个分区,然后再同时检查第三和第四个 分区。

需要注意一点,如果挂载的是非/根分区,dumppass选项最好都应该是0,即不备份,不检查。

获取 UUID 方式

一般我们可以通过两种方式获知每个已经存在分区 UUID:

by-uuid 方式

通过查看 /dev/disk/by-uuid/ 下的设备文件信息:

[root@xiexianbin_cn ~]# ls -l /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 10 Oct 31  2017 59d9ca7b-4f39-4c0c-9334-c56c182076b5 -> ../../vda1

可以看出每个分区的 UUID 映射关系了。但是有个缺点,也许大家已经发现了,没有分区类型,当然,如果你自己明确知道分区类型,那就没有问题了,如果不知道,最好还是用下面将要介绍的 blkid 命令。

blkid 命令

blkid命令如下:

[root@xiexianbin_cn ~]# blkid
/dev/vda1: UUID="59d9ca7b-4f39-4c0c-9334-c56c182076b5" TYPE="ext4"
...
[root@xiexianbin_cn ~]# blkid /dev/sda
/dev/vda1: UUID="59d9ca7b-4f39-4c0c-9334-c56c182076b5" TYPE="ext4"

有了 UUID 后,我们就可以编辑 fstab 文件来挂载分区,编辑保存后,重启,如果在启动的时候,没有出现挂载失败信息,那么恭喜你!

能查看到 UUID,也可以作为盘是否有分区的判断标识,对于有分区的盘,可以使用如下命令删除分区:

[root@xiexianbin_cn ~]# wipefs -a /dev/sdb
/dev/sdb: 2 bytes were erased at offset 0x00000438 (ext4): 53 ef

磁盘挂载

下面通过 UUID 挂载 Linux 分区

查看硬盘信息命令:

fdisk -l
df -lh

创建分区

# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xadac99ed.

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-1048575999, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-1048575999, default 1048575999):
Using default value 1048575999
Partition 1 of type Linux and of size 500 GiB is set

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

格式化

mkfs.xfs /dev/sdb1 -f
mkfs.xfs -n ftype=1 /dev/sdb1
mkfs.xfs -f -n ftype=1 /dev/sdb

mount

通过blkid查找所有硬盘的 uuid:

[root@xiexianbin_cn ~]# blkid
/dev/sdb: UUID="e965e17a-b1f8-4eeb-a23d-7b369df66f45" TYPE="xfs"

编辑/etc/fstab

vim /etc/fstab
# 新增
UUID=e965e17a-b1f8-4eeb-a23d-7b369df66f45 /data                    xfs     defaults  0 0

执行挂载:

mount -a

然后可以通过df -h查看挂载情况。

也可以使用如下临时挂载方式:

mount /dev/sdb /data
mount -t auto /dev/sdb /data

umount

umount /dev/sdb1
umount /data -f

若果有进程操作该挂载文件,会导致umount失败,可以采用lsof /data找到对应的进程,然后kill掉。

问题

docker xfs 删除文件失败

Centos7默认xfs文件系统与docker默认overlay2存储驱动不匹配,会导致容器内文件无法删除等,如docker build的时候发现rm -rf 报错,说文件夹非空。

解决方案,备份,加参数重新格式化:

mkfs.xfs -n ftype=1 /path/to/your/device

查看ftype的情况:

# xfs_info /
meta-data=/dev/sda2              isize=512    agcount=42, agsize=1245120 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=52166395, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

如何判断磁盘是 SSD 还是 HDD

$ cat /sys/block/sda/queue/rotational
1
  • 0: SSD
  • 1: HDD

mount.cifs: permission denied: no match for /xxx found in /etc/fstab

  • 普通用户直接使用 mount 命令报错,需要在运行时添加 sudo mount
  • 若普通用户要分配 mount 权限,可以配置 /etc/sudoers 文件
<username>      ALL=(ALL)    NOPASSWD: /usr/bin/mount, /usr/bin/umount, /usr/sbin/mount.cifs
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数