[步骤] Linux Kdump 的开启 (用于收集内核崩溃时的信息) (RHEL 版)

步骤一:开启 Kdump

1.1 确保 kdump 软件包已安装

如果是 RHEL 8 & RHEL 9:

# yum install kexec-tools

如果是 RHEL 10:

# dnf install kdump-utils makedumpfile 

1.2 设置内核崩溃信息的存放位置

# vim /etc/kdump.conf

修改以下内容:

......
path /var/crash
......


补充:
1) 默认的存放位置是 /var/crash
2) 把这里修改成想要存放内核崩溃信息的目录
3) 为了保险起见存放内核崩溃信息的位置最好有大于内存大小的剩余空间

1.3 重新启动 kdump 服务并设置为开机自启

# systemctl restart kdump ; systemctl enable kdump

1.4 确保 kdump 服务已经开启

# systemctl status kdump

(补充:当显示输出结果里包含 operational 或者 Active: active (exited) 时,则说明 Kdump 已经启用)

步骤二:设置收集内核崩溃信息的触发条件

2.1 当内核崩溃时自动收集内核崩溃信息

2.1.1 当内存不够杀进程时 (OOM-Kill event occurs) 自动触发
# vim /etc/sysctl.conf

添加以下内容:

......
vm.panic_on_oom = 1
2.1.2 当某个任务使用处理器的时间超过允许的阈值时 (默认 20 秒) 自动触发
2.1.1 当某个进程卡住进入 Uninterruptible-Sleep (D-state) 状态超过阈值时 (默认 120 秒) 自动触发 
# vim /etc/sysctl.conf

添加以下内容:

......
kernel.hung_task_panic=1

(补充:设置阈值的参数名是:kernel.hung_task_timeout_secs)

2.1.2 让修改的 /etc/sysctl.conf 文件生效
# sysctl -p /etc/sysctl.conf
2.1.3 当内核崩溃时,系统会自动收集内核崩溃信息并重启

(步骤略)


注意:
1) 只有 task hang 住,或者处理器线程 soft lock 时才会自动产生 dump
2) 此过程系统会自动重启

2.2 当内核崩溃时使用魔术键收集内核崩溃信息

2.2.1 修改 /etc/sysctl.conf 文件
# vim /etc/sysctl.conf

添加以下内容:

......
kernel.sysrq = 1
2.2.2 让修改的 /etc/sysctl.conf 文件生效
# sysctl -p /etc/sysctl.conf
2.2.3 当内核崩溃时,使用魔术键收集内核崩溃信息并让系统自动重启

同时先后按下以下三个按键:

ALT + PRINTSCREEN + C


注意:
1) 此过程会让系统自动重启
2) 只是系统死机并不代表有 kernel panic

2.3 当内核崩溃时使用硬件发送 NMI 收集内核崩溃信息

2.3.1 修改 /etc/sysctl.conf 文件
# vim /etc/sysctl.conf

添加以下内容:

......
kernel.unknown_nmi_panic = 1
kernel.panic_on_unrecovered_nmi = 1
kernel.panic_on_io_nmi = 1
2.3.2 让修改的 /etc/sysctl.conf 文件生效
# sysctl -p /etc/sysctl.conf
2.3.3 当内核崩溃时,联系硬件技术支持使用硬件发送 NMI 收集内核崩溃信息

(步骤略)

步骤三:手动触发内核崩溃测试 Kdmup

# echo c > /proc/sysrq-trigger

(注意:此操作会造成系统重启)

参考文献:

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/system_design_guide/installing-and-configuring-kdump_system-design-guide
https://access.redhat.com/solutions/916043
https://access.redhat.com/solutions/3698411
https://access.redhat.com/solutions/6038
https://access.redhat.com/solutions/23069

[内容] iptables 防火墙数据接收情况和发出情况的查看

# iptables -nvL

Chain INPUT (policy ACCEPT 5 packets, 500 bytes)
......
Chain FORWARD (policy DROP 0 packets, 0 bytes)
......
Chain OUTPUT (policy DROP 1000 packets, 200K bytes)
......


补充:
1) 这里的 policy ACCEPT 5 packets, 500 bytes 是指接收了 5 个数据包和 500 bytes 流量,ACCEPT 是指接收的状态
2) 这里的 policy DROP 1000 packets, 200K bytes 是指发出了 1000 数据包和 200K bytes 流量。DROP 是拒绝的状态

[步骤] Linux 虚拟内存 (交换分区) swap 的设置

步骤一:理解 Linux 虚拟内存 (交换分区) swap

1.1 理解 Linux 使用 Linux 虚拟内存的机制

1) Linux 内核会周期性的把内存中不常调用的匿名页和共享内存交换至 swap
2) 当内存不足时,Linux 系统会把匿名页和共享页交换至 swap

    1.2 理解 Linux 虚拟内存 (交换分区) swap 使用优先级的设置机制

    Linux 的 swappiness 参数用于控制虚拟内存 (交换分区) swap 的使用。
    swappiness 参数的默认值是 60,也就是说当物理内存使用率达到 40 时,开始使用虚拟内存 (交换分区) swap。
    当 swappiness 参数的值是 0 时,则只有当物理机内存耗尽了以后才会使用虚拟内存 (交换分区) swap。
    当 swappiness 参数的值是 100 时,则立刻使用虚拟内存 (交换分区) swap。

    步骤二:Linux 虚拟内存 (交换分区) swap 开关的设置

    2.1 查看虚拟内存 (交换分区) swap

    # swapon -s

    2.2 开启虚拟内存 (交换分区) swap

    # swapon -a

    2.3 关闭虚拟内存 (交换分区) swap

    # swapoff -a

    2.4 重启虚拟内存 (交换分区) swap

    # swapoff -a && swapon -a

    步骤三:Linux 虚拟内存 (交换分区) swap 使用优先级的设置

    3.1 临时设置虚拟内存 (交换分区) swap 使用优先级的设置

    # sysctl -p swappiness=60

    或者:

    # sysctl vm.swappiness=60

    或者:

    # echo 60 > /proc/sys/vm/swappiness

    (补充:这里以把 swappiness 的值设置成 60 为例)


    注意:
    1) 临时设置重启后失效
    2) 临时设置了以后不会马上生效,只有当系统重新调用内存以后才会生效

    3.2 永久设置虚拟内存 (交换分区) swap 使用优先级的设置

    3.2.1 修改 /etc/sysctl.conf 文件
    # vim /etc/sysctl.conf

    添加以下内容:

    ......
    vm.swappiness=60

    (补充:这里以把 swappiness 的值设置成 60 为例)

    3.2.2 让刚刚修改的 /etc/sysctl.conf 文件生效
    # sysctl -p

    3.3 查看虚拟内存 (交换分区) swap 使用优先级的设置

    3.3.1 通过 /proc/sys/vm/swappiness 文件查看
    # cat /proc/sys/vm/swappiness
    3.3.2 通过 sysctl vm.swappiness 命令查看
    # sysctl vm.swappiness

    [步骤] Linux journal 日志的永久存储

    正文:

    步骤一:理解 journal 日志存储机制

    默认情况下,journal 的日志存储在 /run/log/journal,而 /run 目录只是一个临时目录。

    将 Storage 参数设置为 persistent 后,journal 的日志将存储在 /var/log/journal,/var/log 则是一个永久的目录。

    步骤二:将 journal 日志设置为永久存储

    2.1 修改 /etc/systemd/journald.conf 文件

    # vi /etc/systemd/journald.conf

    将部分内容修改如下:

    [Journal]
    ......
    Storage=persistent
    ......

    2.2 重启 systemd-journald 服务

    # systemctl restart systemd-journald.service

    参考文献:

    https://linuxconfig.org/introduction-to-the-systemd-journal