世纪大坑之 systemd & symlink & ProtectHome
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了世纪大坑之 systemd & symlink & ProtectHome相关的知识,希望对你有一定的参考价值。
参考技术A 本来在愉快的部署 ceph 测试环境, 但是启动 osd 是发现如下错误:脚本执行异常, 随打开 ceph-osd-prestart.sh 脚本查看第55行:
结合报错信息, 判断 owner 没有正常获取到 $data 目录的所有者. 然后开始 debug 该脚本, 添加了几个 echo , 查看 stat 命令是否正常, $data 变量是否正常. 期间补充了一点关于 "@", 关于 unit 文件中 "%" 的知识.
调试期间, 上述命令执行了一百遍~~, 百遍~~, 遍~~, 遍~~....
然后, 半天过去了.
结论是, $data 获取正常, stat 命令正常, 手动执行该 stat 命令正常, 基本可以排除脚本本身的问题. 但是, 发现 ceph-osd-prestart.sh 中凡是涉及到 $data 的命令全部失败, 随后开始排查 $data 目录.
发现 $data 指向的目录是一个软连接. 因为手动执行相关命令是正常的, 开始怀疑 systemd 对 symlink(软连接) 的支持是不是有问题.
google 中搜索 "systemd symlink", 基本都是 systemctl enable 相关的信息, 没有找到与 ExecStartPre 相关的信息.
Lennart Poettering 是 systemd 的作者, 上述回复的大概意思是: "systemctl enable" 命令只是用来在 /etc 或者 /run 目录下创建/删除 unit 文件的软连接, 仅此而已. 出于管理及安全方面的考虑, 被链接的 unit 文件必须是真实文件, 而不能是软连接. 此外, 为了使 systemctl enable 更加灵活, 应该支持绝对路径作为 "systemctl enable" 参数, 从而支持默认搜索路径之外的 unit 文件.
然并卵, 虽然是关于软连接的, 但这和我遇到的问题其实没什么关系. 就在我要放弃的时候, 我注意到 ceph-osd@.service 中的两个配置:
凭借我有限的英文知识, 我的直觉告诉我, 马上就要破案了. 我立刻查了官方文档, 文档如下:
ProtectHome 可以设置为 true/false/read-only. 设置为 true 的时候, /home, /root, /run/user 对应用不可见. 设置为 read-only, 上述三个目录对应用只读. 设置为 false, 则应用可以正常访问这三个目录. 默认值是 false. 为了保证应用不能访问用户私有数据, 建议所有长时间运行的服务开启该选项.
ProtectSystem 可以设置为 true/false/full. 设置为 true, /usr, /boot 被设置为只读. 设置为 full, /usr, /boot, /etc 被设置为只读. 设置为 false, 则应用可以正常访问上述目录. 这个选项可以保护系统目录不会被应用修改, 建议所有长时间运行的服务开启该选项.
到此, 可以结案了. 由于 ceph-osd@.service 中开启了 ProtectHome 选项, ceph 无法访问 /home/ceph/osd0 目录, /var/lib/ceph/osd/ceph-0 软链失效, 致使 ceph 无法启动.
解决办法有两个:
为了遵循官方的建议, 这里我选择第二种办法.
教训:
systemd之Centos服务管理
systemd 架构图
Systemd | |
http://www.jinbuguo.com/systemd/systemd.html | 中文手册 |
https://www.ibm.com/developerworks/cn/linux/1407_liuming_init3/ | 浅析systemd |
http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html | systemd 命令详解 (赞) |
简明介绍 systemd | |
systemd提供更优秀的框架以表示系统服务间的依赖关系
实现系统初始化时服务的并行启动,同时达到降低Shell的系统开销的效果
systemd的目标是:尽可能启动更少进程;尽可能将更多进程并行启动。
systemd尽可能减少对shell脚本的依赖。
systemd
is a suite of basic building blocks for a Linux system. It provides a system and service manager that runs as PID 1 and starts the rest of the system. systemd
provides aggressive parallelization capabilities, uses socket and D-Bus activation for starting services, offers on-demand starting of daemons, keeps track of processes using Linux control groups, maintains mount and automount points, and implements an elaborate transactional dependency-based service control logic. systemd
supports SysV and LSB init scripts and works as a replacement for sysvinit. Other parts include a logging daemon, utilities to control basic system configuration like the hostname, date, locale, maintain a list of logged-in users and running containers and virtual machines, system accounts, runtime directories and settings, and daemons to manage simple network configuration, network time synchronization, log forwarding, and name resolution. See Lennart‘s blog story for a longer introduction, and the three status updates since then. Also see the Wikipedia article. If you are wondering whether systemd is for you, please have a look at this comparison of init systems by one of the creators of systemd.
Systemd 的简介和特点
Systemd 是 Linux 系统中最新的初始化系统(init),它主要的设计目标是克服 sysvinit 固有的缺点,提高系统的启动速度。systemd 和 ubuntu 的 upstart 是竞争对手,预计会取代 UpStart,实际上在作者写作本文时,已经有消息称 Ubuntu 也将采用 systemd 作为其标准的系统初始化系统。
Systemd 的很多概念来源于苹果 Mac OS 操作系统上的 launchd,不过 launchd 专用于苹果系统,因此长期未能获得应有的广泛关注。Systemd 借鉴了很多 launchd 的思想,它的重要特性如下:
同 SysVinit 和 LSB init scripts 兼容
Systemd 是一个"新来的",Linux 上的很多应用程序并没有来得及为它做相应的改变。和 UpStart 一样,systemd 引入了新的配置方式,对应用程序的开发也有一些新的要求。如果 systemd 想替代目前正在运行的初始化系统,就必须和现有程序兼容。任何一个 Linux 发行版都很难为了采用 systemd 而在短时间内将所有的服务代码都修改一遍。
Systemd 提供了和 Sysvinit 以及 LSB initscripts 兼容的特性。系统中已经存在的服务和进程无需修改。这降低了系统向 systemd 迁移的成本,使得 systemd 替换现有初始化系统成为可能。
更快的启动速度
Systemd 提供了比 UpStart 更激进的并行启动能力,采用了 socket / D-Bus activation 等技术启动服务。一个显而易见的结果就是:更快的启动速度。
为了减少系统启动时间,systemd 的目标是:
尽可能启动更少的进程
尽可能将更多进程并行启动
https://blog.linuxeye.cn/400.html
CentOS 7 巨大变动之 systemd 取代 SysV的Init
http://blog.csdn.net/smstong/article/details/39317491
常用命令
开机不启动unit
systemctl disable httpd.service
删除/etc/systemd/system/multi-user.target.wants下的软链接
查看开机是否启动
systemctl is-enabled xx.service #查询服务是否开机启动
systemd查看开机自启动的程序
相当于chkconfig --list
ls /etc/systemd/system/multi-user.target.wants/
查看systemd单元加载及活动情况
systemctl
显示启动失败的单元
systemctl --failed
查看systemd管理的所有单元
systemctl list-unit-files
http://www.linuxidc.com/Linux/2016-04/130413.htm
http://www.linuxidc.com/Linux/2015-04/116648.htm
初次体验CentOS 7的systemd
http://carllai.blog.51cto.com/1664997/1439562/
本文出自 “运维自动化” 博客,请务必保留此出处http://shower.blog.51cto.com/4926872/1972717
以上是关于世纪大坑之 systemd & symlink & ProtectHome的主要内容,如果未能解决你的问题,请参考以下文章