[toc]
ECS运维指南之Linux系统诊断
目录
Linux启动与登陆问题
-
超详细系统启动与登陆异常排查点
-
grub.conf 文件内容被清空了怎么办
-
巧妙利用 strace 查找丢失的文件
-
小心 PAM 不让你登录
-
CentOS 登录卡住的原因被我找到了
Linux 性能问题
-
找到 Linux 虚机 Load 高的"元凶"
-
OOM killer 是被谁触发的
-
我的服务器内存去哪儿了
-
CPU 占用不高但网络性能很差的一个原因
-
一次 IO 异常捕获过程
Linux 主机网络问题
-
ifdown ifup 命令丢失处理
-
网络不通? strace 二度出手
-
TIME_WAIT & CLOSE_WAIT 的讨论总结
-
一次网络抖动经典案例分析
Linux 系统服务与参数问题
-
4 个 limits 生效的问题
-
6 步排查 ss& netstat 统计结果不一样的原因
-
为什么明明内存很充足但是 java 程序仍申请不到内存
-
请不要忽略 min_free_kbytes 的设置
最后的彩蛋
- 某地区口罩项目架构演进及优化经验
1.Linux启动与登陆问题
说明
Linux 启动与登录问题是 ECS 的高频问题,而往往处理不及时会直接影响到用户业务的正常可持续运行,因此也变成了我们处理问题优先级的重中之重。 在云环境上影响 ECS 启动与登录的因素非常多,镜像、管控、虚拟化、底层硬件、系统与文件异常等等,本文仅从系统与文件本身角度,在大量处理经验的基础上,归纳总结了一些可能会引起系统启动与登录问题的排查点,并给出几个比较常见的典型案例来具体展示和说明。
1.1 超详细系统启动与登陆异常排查点
1.1.1 系统启动异常
-
部分 CentOS 系统启动黑屏,无异常报错的场景,可以 fsck 一下系统盘。
-
根分区空间满,以及 inode 数量耗尽。
-
升级内核或者从老的共享实例迁移到独享规格导致的启动异常。
- 手动注入驱动 (mkinitrd virtio 相关驱动 )。
- 修改 grub 的启动顺序,优先尝试使用老内核启动。
- /boot 目录下面内核的关联文件是否全(下面仅为 demo,不同系统内核版 本文件不一致,部分内核版本 boot 下的 i386 目录也是有用的)。
config-4.9.0-7-amd64
initrd.img-4.9.0-7-amd64
System.map-4.9.0-7-amd64
vmlinuz-4.9.0-7-amd64
-
/boot/grub/device.map
里面的 hda 改成 vda。 -
fstab/grub
中的 uuid 不对,可以直接修改为/dev/vda1
这种形式尝试。 数据盘分区异常加载起不来的场景,可以去注释 fstab 所有的行,添加类似下面的启动项尝试, 也适用于系统盘快照创建云盘挂载后,uuid 一致导致的启动异 常,改成非 UUID 的挂载即可。
/dev/vda1 / ext4 defaults 1 1
- 根目录权限 777(部分目录 777)也会导致启动异常,或者 ssh 登陆异常。
- 常见的关键目录缺失,有的是软链,也可以看看对应目录下面的文件数量(文件数量要跟同内核版本或者相差不大的版本对比),简单判断。
/bin /sbin /lib /lib32 /lib64 /etc /boot /usr/bin /usr/sbin /usr/lib / usr/lib64 等目录或文件缺失
for i in /bin /sbin /lib /lib32 /lib64 /etc /boot /usr/bin /usr/sbin / usr/lib /usr/lib64 ;do ls -l $i |wc -l ;done
- 影响启动的参数。 如果参数设置不当,是会导致启动异常的,如
/etc/sysctl.conf
以及检查rc.local
的配置,profile
的检查。
vm.nr_hugepages
vm.min_free_kbytes
- CentOS 的 selinux 需要关闭。
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
1.1.2 root 登陆异常
-
/etc/passwd
、/etc/shadow
( 用户名 root polikt dbus 等关键用户存在与否,文 件为空,格式乱(dos2unix)。 -
/etc/pam.d
目录下是否有为空的文件及参数设置是否正常, 如常见的system-auth passwd
。 -
/etc/pam.d
下面所有文件里面涉及的 so 文件,看看文件是否存在,是否为空/ usr/lib64/security
。 -
查
/etc /lib64
、/bin
、/sbin
、/usr/bin
、/usr/sbin
等目录有没有 size 为 0 的文件。 -
/etc/profile
、/etc/profile.d
( 打 印 列 表 )、/etc/bashrc
、/root/.bash_profile
、/root/.bashrc
等涉及登陆环境设置的文件是否异常。 -
注意内核版本,是否存在新老内核,多更换几个内核试下。
-
系统日志也是一个比较重要的检查项(后面会介绍无法登陆怎么检查)。
-
Ubuntu 12.04 登陆异常在
/etc/login.defs
里面配置了错误的ERASECHAR
导致,恢复默认 0177 即可。
configuration error - cannot parse erasechar value
- 输入 root 后直接 login 失败三连,日志如下。
Feb 12 18:18:03 iZbp1cabe6lyx26ikmjie2Z login: FAILED LOGIN 1 FROM tty1 FOR root, Authentication failure
Feb 12 18:18:03 iZbp1cabe6lyx26ikmjie2Z login: FAILED LOGIN 2 FROM tty1 FOR (unknown), Authentication failure
Feb 12 18:18:03 iZbp1cabe6lyx26ikmjieZZ login: FAILED LOGIN SESSION FROM tty1 FOR (unknown), Authentication failure
找个同内核版本的机器对比发现没有 /etc/pam.d/login
。
rpm 包校验一下,确认 login 文件没了,手动创建一个,内容拷贝过来,好了。
[root@iZbp1cabe6lyx26ikmjie2Z pam.d]# rpm -V util-linux
missing c /etc/pam.d/login
[root@iZbp1cabe6lyx26ikmjie2Z pam.d]# rpm -ql util-linux|egrep -vi "gz|mo|share"
/etc/mtab
/etc/pam.d/chfn
/etc/pam.d/chsh
/etc/pam.d/login
/etc/pam.d/runuser
/etc/pam.d/runuser-l
/etc/pam.d/su
/etc/pam.d/su-l
-
/etc/ssh/sshd_config
相关参数如LoginGraceTime/Allowusers/PermitRootLogin
。 -
问题不好确认的时候, 可以将 shadow 密码字段清空, 看看登陆是否正常, 可以判断是否到密码验证阶段了。 之前有过一篇关于 ssh 问题排查的文档,可参考:ssh问题排查指南
1.1.3 系统登陆不进去了,不挂盘的情况下怎么操作?
上面的检查点很多是需要切换到另外的系统环境下去做检查,比如挂载 LiveCD 或者 chroot 切换;但对于使用 ECS 的用户来说,阿里云暂还未提供实例挂载 ISO 镜像的功能,那么如何进行上面的操作呢?可以借助阿里云新推出的卸载系统盘功能,可以把系统盘卸载掉,作为数据盘挂载到一个新的机器,这样就可以执行上面的检查了。