在一些大数据平台的搭建过程(如hadoop、mpp数据库),要求/var/lib的挂载必须去掉noatime和nosuid属性,借此机会,补一下技术债,以centOS系统为例,探讨linux系统中/etc/fstab文件的作用。
1./etc/fstab文件的作用
/etc/fstab文件用来告诉系统哪些硬盘分区该挂载、挂载到哪里以及以什么参数挂载。就像是给系统一个地图,让它知道该去哪里找到你的硬盘的各个角落。
下面是一个 /etc/fstab 文件的实例:
#
UUID=123456789 / ext4 defaults 1 1
/dev/sda2 /boot ext4 defaults 1 2
/dev/sda3 none swap sw 0 0
/dev/sdb1 /var/log ext4 nosuid 0 0
/dev/sdb2 /var/lib ext4 defaults 0 0
/etc/fstab 是 Linux 系统中的一个文件,用于指定在系统启动时需要挂载的文件系统。在这个文件中,每条记录描述了一个需要挂载的文件系统以及它的挂载点和其他一些信息。
当系统启动时,系统会读取 /etc/fstab 文件,并根据其中的配置自动挂载指定的文件系统。这样,用户就不需要手动挂载了。
值得注意的是,系统读取该文件的时候,会按照 fstab 文件中每行的顺序进行挂载,后面挂载的文件系统需要先于前面挂载文件系统的挂载点已经存在。
文件系统
注意到上述实例中,文件系统有两种写法,一种是用UUID(通用唯一标识符),另一种是通过绝对路径(如/dev/sda2),两者在使用上是有区别的:
- UUID是独一无二的,无论文件系统在哪个位置、与哪些设备关联,都可以通过UUID找到它。这对于移动硬盘或者在不同系统上使用同一个文件系统非常方便。它是一个长长的字符串,类似于"e5d56f17-3c75-4e6c-8b48-1577ee9c5b52"。使用UUID可以确保在不同的设备或系统上都能准确找到文件系统。
- 绝对路径则是依赖于文件系统的具体位置,因此当你更换设备、修改文件系统或者移动文件时,可能需要更新绝对路径。
挂载点
挂载点,即为一个目录,将文件系统挂载到某个目录下,以/var/log为例,当你重启系统时,该文件系统就会自动挂载到/var/log目录下,方便你直接在该目录下访问分区中的文件。
文件系统类型
- EXT2 (Second Extended File System)是Linux第一个被广泛使用的文件系统,它最大的特点是简单易用,所需的资源较少,但是容错性不够好,无法恢复日志和元数据一致性。
- EXT3(Third Extended File System)是在ext2文件系统上添加了日志功能而成,它支持日志和多种文件属性,可以在安全性和性能方面做到平衡,是大多数Linux发行版默认的文件系统。当系统发生断电等异常情况时,ext3可以恢复日志中的文件状态,保证了数据的一致性。
- EXT4是在EXT3的基础上进行了改进和优化,比如支持更大的文件和分区,更快的高负载性能等。同时,它还支持更高效的文件分配、更高级的日志功能、延迟分配,以及更好的碎片整理能力。是目前 Linux 系统上使用最广泛的文件系统,虽然它已经有了不少年的历史,但是至今仍然表现出极高的性能和稳定性。它的特点是支持最大 1EB 大小的文件和 16TB 的文件系统大小,块大小可以从 1KB 至 64KB 不等。与其他文件系统相比,EXT4 支持更多的日志模式和文件系统属性,比如 ACL 和扩展属性等。
- XFS 是另一款被广泛使用的高性能文件系统,它最初是由 SGI 公司在其 IRIX 操作系统中开发的,然后被移植到了 Linux 系统中。它支持最大 8EB 大小的文件和 500TB 的文件系统大小,块大小从 512B 至 64KB 不等。XFS 的特点是对大文件和高并发 I/O 有很好的优化,支持快速分配空间和释放空间。
- Btrfs是Linux系统上新兴的文件系统,它支持快照、压缩、透明的压缩、多层存储等技术,还拥有良好的容错和恢复能力,它可以按需进行数据的复制、镜像、扩容等操作。
值得注意的是,上面的文件中swap是一个特殊的文件系统类型:
- 对于Linux的swap(也就是交换分区),它是用来暂时存储内存中不常用的数据的地方。当物理内存不足时,系统会将部分内存中的数据移到swap空间中,这样就释放了更多空闲的物理内存,使得系统能够更快速地响应。
关于swap分区,将在之后另写一篇文章介绍。
选项
- defaults:使用默认的挂载选项,包括读写权限和缓存机制等。
- noatime:不更新文件或目录的访问时间,这个选项可以提高文件系统的性能,尤其是在大量读取文件的场景下,避免了不必要的磁盘写入,节省了时间和资源。
- nodev:不允许在文件系统上执行设备文件,这样可以防止恶意程序通过设备文件进行攻击,再次提升了系统的安全性。
- nosuid:不允许在文件系统上执行SUID和SGID程序,也就是"no setuid",是一种文件系统的挂载选项。当文件系统被挂载为nosuid时,用户在该文件系统中执行的程序将不会获得设置有效用户ID(setuid)的权限。简单来说,如果某个文件系统被挂载为nosuid,那么无论用户有没有执行该文件夹中的程序的权限,程序都不会以设置了不同于用户自身的权限运行,这可以进一步提高系统的安全性。
- ro:以只读方式挂载文件系统,不允许修改文件内容。
- rw:以可读写方式挂载文件系统。
- noexec:不允许在文件系统上执行任何二进制文件,包括可执行程序和 shell 脚本等。
dump
定义了文件系统备份的优先级。它的值可以是0、1或2。0表示不备份,1表示参与完整备份,2表示仅参与增量备份。备份软件(如dump命令)会根据这个优先级来确定哪些文件系统需要备份。如果你不需要备份某个文件系统,你可以将其dump字段设为0,以节省空间和时间。
fsck顺序
文件系统检查(修复)的顺序。它的值也可以是0、1或2。0表示不检查,1表示在根文件系统检查之后检查,2表示在根文件系统之后以并行方式检查。因为根文件系统(/)是最重要的,所以一般将其设置为1,其他文件系统根据需求设置。
2.为什么需要关闭noatime和nosuid
回到开始的问题,以hadoop为例(CDH6版本),可以看一下将noatime和nosuid加上会产生什么结果。
现象
加上noatime的限制,节点自检中会提示该配置不满足系统安装的要求,但不会造成服务的异常,从上一节关于noatime的配置说明来看,对于大数据的场景,会有大规模读取文件的情况,去掉该参数主要是为了做性能优化,从结果来看没有影响服务状态。
加上nosuid的限制,节点自检中也会提示该配置不满足系统安装的要求,同时发现nodemanager的状态出现异常,查看角色日志,发现如下报错:
Error starting NodeManager
org.apache.hadoop.yarn.exceptions.YarnRuntimeException: Failed to initialize container executor
at org.apache.hadoop.yarn.server.nodemanager.NodeManager.serviceInit(NodeManager.java:394)
at org.apache.hadoop.service.AbstractService.init(AbstractService.java:164)
at org.apache.hadoop.yarn.server.nodemanager.NodeManager.initAndStartNodeManager(NodeManager.java:936)
at org.apache.hadoop.yarn.server.nodemanager.NodeManager.main(NodeManager.java:1016)
Caused by: java.io.IOException: Linux container executor not configured properly (error=24)
at org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor.init(LinuxContainerExecutor.java:307)
at org.apache.hadoop.yarn.server.nodemanager.NodeManager.serviceInit(NodeManager.java:392)
... 3 more
Caused by: org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.privileged.PrivilegedOperationException: ExitCodeException exitCode=24: Invalid conf file provided, unable to open file : /var/lib/yarn-ce/etc/hadoop/container-executor.cfg
Can't get configured value for yarn.nodemanager.linux-container-executor.group.
at org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.privileged.PrivilegedOperationExecutor.executePrivilegedOperation(PrivilegedOperationExecutor.java:180)
at org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.privileged.PrivilegedOperationExecutor.executePrivilegedOperation(PrivilegedOperationExecutor.java:206)
at org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor.init(LinuxContainerExecutor.java:300)
... 4 more
Caused by: ExitCodeException exitCode=24: Invalid conf file provided, unable to open file : /var/lib/yarn-ce/etc/hadoop/container-executor.cfg
Can't get configured value for yarn.nodemanager.linux-container-executor.group.
at org.apache.hadoop.util.Shell.runCommand(Shell.java:1008)
at org.apache.hadoop.util.Shell.run(Shell.java:901)
at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:1213)
at org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.privileged.PrivilegedOperationExecutor.executePrivilegedOperation(PrivilegedOperationExecutor.java:152)
... 6 more
还有一类报错
Caused by: org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.privileged.PrivilegedOperationException: ExitCodeException exitCode=24: Invalid conf file provided, unable to open file : /var/lib/yarn-ce/etc/hadoop/container-executor.cfg
原因分析
从CDH5.16.1开始,NodeManager在initialize container executor时,会读取文件/var/lib/yarn-ce/etc/hadoop/container-executor.cfg,此文件动态生成。
当配置文件/var/lib/yarn-ce/etc/hadoop/container executor.cfg所处文件系统的挂载参数含有nosuid时,nosuid防止可执行文件的setuid bit生效。从而造成container-executor二进制文件无法访问属主为“root”的container-executor.cfg配置文件,从而导致NodeManager启动失败,在节点挂载/var目录时,设置了nosuid属性,导致该报错。
解决办法
如果在节点初始化时已经配置了nosuid参数,可以采用以下方式解决:
将/etc/fstab中/var目录挂载属性中的nosuid去掉,再重新挂载
mount -o remount /var
若问题还存在,删除动态生成的/var/lib/yarn-ce/etc/hadoop/container-executor.cfg文件
3.文件系统常用命令
除此之外,常用的与linux文件系统相关的命令如下:
将 /dev/sda1 设备挂载到 /mnt 目录:
mount /dev/sda1 /mnt
umount /mnt
df /dev/sda1
du /home
lsblk
blkid /dev/sda1
fdisk -l /dev/sda
parted /dev/sda mkpart primary ext4 0% 100%
fsck /dev/sda1
mkfs.ext4 /dev/sda1