1. https://www.jianshu.com/p/af49a5d0553f

对于工作中使用服务器的公司来讲,每到节假日来临时,总免不了对服务器进行下电。而收假回来的早上,则会有一个早上的时间会花费在服务区的开机和修复工作上。是的,修复无法开启或开机失败的服务器。

几乎每次节假日售价回来,恢复服务器的正常工作状态都是一件不得不做的事情。或者开机进入紧急模式,或者因为服务启动失败等等原因,总有一些服务器无法正常启动。而通常,启动时看到的都是如 Welcome to mergency mode

 
emergency_mode.png

紧急模式下,网络等服务均没有开启,SSH无法连接到终端,大部分的工作都不可用。但是紧急模式下,可以通过 journalctl -xe 来查看系统启动过程中的日志。

  1. #journalctl -xe
  2. ...
  3. May 6 09:46:13 server systemd[1]: data.mount mount process exited, code=exited status=32
  4. May 6 09:46:13 server systemd[1]: Failed to mount /data.
  5. Subject: Unit data.mount has failed
  6. Defined-By: sustend
  7. Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
  8. Unit data. mount has failed.
  9. The result is failed.
  10. May 6 09:46:13 server systemd11: Dependency failed for Local File Systems.
  11. Subject: Unit local-fs.target has failed
  12. Defined-By: sustend
  13. Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
  14. Unit local-fs.target has failed.
  15. The result is dependencu.
  16. May 6 09:46:13 server systemd[1]: Dependency failed for Migrate local SELinux policy changes from the old store structure to tr
  17. Subject: Unit selinux-policy-migrate-local-changes@targeted.service has failed
  18. Defined-By: sustend
  19. Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
  20. Unit selinux-policy-migrate-local-changes@targeted.service has failed.
  21. The result is dependency.
  22. May 6 09:46:13 server systemd[1]: Job selinux-policy-migrate-local-changes@targeted.service/start

根据日志中的报错信息,很容易可以得出系统在启动时需要挂载 /data 目录,但是失败了。从而导致操作系统进入紧急模式。

而对于大多数人的使用习惯来说,需要使用到开机挂载的文件系统目录都是写入 /etc/fstab 中的。

/etc/fstab 的使用

众所周知,/etc/fstab 文件用来保存操作系统中的挂载目录信息,是一个静态文件。并且操作系统开机时默认也会加载 /etc/fstab 中的文件系统目录。

默认的 /etc/fstab 分区表中写入了 boot 和 root 分区的信息,以便于操作系统开机后可以挂载相应的两个文件系统目录。

  1. #cat /etc/fstab
  2. #
  3. # /etc/fstab
  4. # Created by anaconda on Thu May 5 09:54:17 2022
  5. #
  6. # Accessible filesystems, by reference, are maintained under '/dev/disk'
  7. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
  8. #
  9. /dev/mapper/rhel-root / xfs defaults 0 0
  10. UUID=6bd8018f-79db-421a-a0a4-29693822ea8c /boot xfs defaults 0 0

但是一旦尝试向分区表中写入其他的一些文件系统目录后,操作系统进行了重启,则极有可能会导致系统开机进入紧急模式。

正如上面的事件,就是一次因为开机加载 /etc/fstab 分区表中的文件系统目录失败而导致操作系统进入紧急模式的。那么,如何正确的使用 /etc/fstab 就成为一个值得考虑的问题了。

在考虑这个问题前,还是先回到我们最初的目的上。目的是什么?

我们需要的是一个可以在操作系统开机后自动挂载我们所需要使用到的目录,而不需要每次开机后手动挂载。如果需要每次操作系统开机后手动 mount 一次或多次,费时费力不说,更有可能影响应用的使用,所以,手动 mount 并不是一个解决方案。

既然是开机后进行自动挂载,那么通过Linux操作系统的 开机启动任务 + mount 自然也是可以实现相同的目的。

仅仅需要将在操作系统上已经挂载的文件系统目录,以命令的形式写入到 /etc/rc.d/rc.local 文件中。

  1. #cat /etc/rc.d/rc.local
  2. #!/bin/sh
  3. #
  4. # This script will be executed *after* all the other init scripts.
  5. # You can put your own initialization stuff in here if you don't
  6. # want to do the full Sys V style init stuff.
  7. touch /var/lock/subsys/local
  8. # auto mount /data dir
  9. mount -t xfs -o rw,noatime /dev/vdb /data

/etc/fstab开机挂载失败的原因探索

在很多情况下,通过向 /etc/fstab 分区表中写入文件系统目录的愿景是美好的,我们期望可以通过fstab能够将操作系统上的文件系统分区信息进行管理,以满足生产与应用的需要。

但经过多次的实践证明,随意向分区表中写入文件系统分区信息并不总是好的。因为,一旦分区表中的目录在开机过程中没有被成功加载,系统则必定会进入紧急模式。

那么,造成分区表加载分区信息失败的原因会是什么?

操作系统在开机前会进行硬件扫描,主要扫描的设备包含CPU、内存、启动(引导)盘等,而操作系统的主分区(\、boot、root)通常都是建立在启动盘之上。经过了硬件开机自检,启动盘确认正常后,也即是说,建立在启动盘上的文件系统目录(例如, root、boot)都是可以被正常挂载的。

倘若你在系统启动盘下新建了 /opt/usr/tmp 等目录,开机时也是可以成功加载文件系统目录。而我们所说的失败,则更多的原来于非操作系统启动盘以外的硬件磁盘(块设备)。

简单点说,操作系统的启动盘在操作系统上的展现形式可能是 /dev/vda - /、而当你在操作系统的分区表中写入 /dev/vdb - /data 的分区信息,并期望开机后能够自动加载 /data 目录,那么可能会导致加载分区表失败。

以下三个原因仅为个人推想,可能与实际原因相悖

  • 这或许是因为操作系统启动时仅仅加载了部分设备,而当需要加载分区表中的 /dev/vdb 设备时,该设备尚且没有被操作系统所识别到,这种情况下会导致失败。

  • 系统启动时加载分区表中的分区信息时,需要依赖对应的服务(或依赖),而依赖尚未加载完成。

  • 对于手动挂载文件系统目录后,挂载目录时使用了/dev/vdb格式的分区,因为某些原因(异常掉电、拔插硬盘)导致的系统识别到的分区名称发生变化(例如,从/dev/vdb变为/dev/vdd),而写入到分区表中的配置没有发生变化,重新加载分区表信息的时候会导致失败。

总而言之,向 /etc/fstab 中写入除系统启动盘之外的硬件设备可能并不是一个好的主意。如果你需要在开机后自动挂载某个文件系统目录,那么我更推荐你使用 /etc/rc.d/rc.local + mount 来实现自动挂载目录。

[转帖]为什么不推荐使用/etc/fstab的更多相关文章

  1. arcengine 开发经典帖 【强烈推荐仔细研读】

    转自原文 arcengine 开发经典帖 使用ArcGIS Engine 开发自定义GIS应用: 第一部分:使用ArcGIS Engine 发布自定义GIS应用软件-全面了解ArcGIS Engine ...

  2. 【HDOJ】1073 Online Judge

    这道题TLE了N多次,完全不明白为什么,稍微改了一下,居然过了.使用gets过的,看讨论帖有人还推荐用hash. #include <stdio.h> #include <strin ...

  3. 轻量级文本编辑器,Notepad最佳替代品:Notepad++

    目录 正文之前 1. 目的 2. 原帖 3. 为何推荐Notepad++ 3.1. Notepad++的一些基本特点 3.2. notepad,notepad2,notepad++,ultraEdit ...

  4. TensorFlow练习2: 对评论进行分类

    本帖是前一贴的补充: 使用大数据,了解怎么处理数据不能一次全部加载到内存的情况.如果你内存充足,当我没说 训练好的模型的保存和使用 使用的模型没变,还是简单的feedforward神经网络(updat ...

  5. 制造业期刊-ZT

    小虫一名英国博后,前阵发书,认识了很多机械制造领域的伙伴.得知我录用了多篇顶刊后,很多人私聊我求经验. 哎,哪里那么容易.回想过去5年,制造领域的期刊基本都被拒过一圈.当年自己投稿时就发现,制造顶刊的 ...

  6. Maven 项目打包需要注意到的那点事儿

    1. 关于 Maven 打 war 包<使用 Eclipse 的 Maven 2 插件开发一个 JEE 项目>详细介绍了如何在 Eclipse 使用 Maven 新建一个 JEE 项目并对 ...

  7. 【转】基于 Kylin 的推荐系统效果评价系统

    OLAP(联机分析处理)是数据仓库的主要应用之一,通过设计维度.度量,我们可以构建星型模型或雪花模型,生成数据多维立方体Cube,基于Cube可以做钻取.切片.旋转等多维分析操作.早在十年前,SQL ...

  8. Linux lvm 分区知识笔记

    盘面上可以细分出扇区(Sector)与柱面(Cylinder)两种单位,其中扇区每个为512bytes那么大. 通常所说的"硬盘分区"就是指修改磁盘分区表,它定义了"第n ...

  9. 【有奖征资源,分享有内涵】贡献你的CSDN博文和下载资源,不断更新中

    我们收集了CSDN热心博主的博文 和相关下载资源.这些可爱博主上传了免积分的CSDN资源,并贡献了相关的用法,改进策略,进行了翔实的分析.感谢博主的贡献.并期待有很多其它这种好人! 我们特推出活动&q ...

  10. 转帖:Android 官方推荐 : DialogFragment 创建对话框

    转: Android 官方推荐 : DialogFragment 创建对话框 复制内容,留作备份 1. 概述 DialogFragment在android 3.0时被引入.是一种特殊的Fragment ...

随机推荐

  1. zookeeper源码(05)数据存储

    本文详细分析一下zookeeper的数据存储. ZKDatabase 维护zookeeper服务器内存数据库,包括session.dataTree和committedlog数据,从磁盘读取日志和快照后 ...

  2. GaussDB(for MySQL)如何在存储架构设计上做到高可靠、高可用

    摘要: GaussDB(for MySQL)通过ND算子下推解决存储节点和计算节点之间的传输速度,减少网络开销这个难题. 数据库作为高效稳定处理海量数据交易/分析的坚强数据底座,底层架构设计的重要性不 ...

  3. 当线下门店遇上AI:华为云ModelBox携手佳华科技客流分析实践

    摘要:在赋能传统门店客流经营数字化转型方面,华为云ModelBox与伙伴佳华科技合作推出的"华为云客流统计项目",算是一次成功的探索. 本文分享自华为云社区<当线下门店遇上A ...

  4. 毕昇 JDK:为啥是ARM 上超好用的 JDK

    摘要:毕昇 JDK 是华为基于 OpenJDK 定制的开源版本,是一款高性能.可用于生产环境的 OpenJDK 发行版. 本文分享自华为云社区<[云驻共创]毕昇 JDK:"传奇再现&q ...

  5. What?构造的查询语句会导致堆栈溢出

    摘要:本文归纳了Neo4j和Nebula两个开源图数据库的两个pull request修复的堆栈溢出问题,并试着写写通过阅读pr中的问题而得到的一些启发 本文分享自华为云社区<巧妙构造的查询语句 ...

  6. NDPQ(NDP+PQ),定义分布式数据库新方向

    摘要:云服务提供商构建新的云原生关系数据库系统,专门为云基础架构设计,通常采用将计算和存储分离到独立扩展的分布式层的设计. 本文分享自华为云社区<性能提升100倍!GaussDB(for MyS ...

  7. vue-grid-layout数据可视化图表面板优化过程所遇问题汇总

    对于drag事件不熟悉的,请先阅读:<drag事件详解:html5鼠标拖动排序及resize实现方案分析及实践> 之前老项目grafana面板,如下图所示(GEM添加图表是直接到图表编辑, ...

  8. 火山引擎 DataTester 为企业降本增效:1 个人也能成为一支 A/B 实验团队

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 今年天猫电商.京东均表示交易规模与 2021 年持平,跟往年急剧增长的销售额相比,今年的双十一显得略微" ...

  9. C# .NET Socket SocketHelper 高性能 5000客户端 异步接收数据

    网上有很多Socket框架,但是我想,C#既然有Socket类,难道不是给人用的吗? 写了一个SocketServerHelper和SocketClientHelper,分别只有5.6百行代码,比不上 ...

  10. 复旦大学2020考研机试题-编程能力摸底试题(A-E)

    A.斗牛 给定五个0~9范围内的整数a1,a2,a3,a4,a5.如果能从五个整数中选出三个并且这三个整数的和为10的倍数(包括0),那么这五个整数的权值即为剩下两个没被选出来的整数的和对10取余的结 ...