步骤一:修改 /ETC/DEFAULT/GRUB 配置文件
# vim /etc/default/grub
在这一行里:
GRUB_CMDLINE_LINUX="......"
添加:
GRUB_CMDLINE_LINUX="...... systemd.default_timeout_start_sec=500s"
步骤二:使刚刚的修改生效
# grub2-mkconfig -o /boot/grub2/grub.cfg
# vim /etc/default/grub
在这一行里:
GRUB_CMDLINE_LINUX="......"
添加:
GRUB_CMDLINE_LINUX="...... systemd.default_timeout_start_sec=500s"
# grub2-mkconfig -o /boot/grub2/grub.cfg
# dmesg | grep page_owner
[ 1.149165] page_owner is disabled
(补充:当显示此类信息时则 page_owner 没有开启)
# ls -l /sys/kernel/debug/page_owner
ls: cannot access /sys/kernel/debug/page_owner: No such file or directory.
(补充:当 /sys/kernel/debug/page_owner 文件不存在时则 page_owner 没有开启)
# grubby --args="page_owner=on" --update-kernel=0
(注意:开启 page_owner 会额外占用一定量的内存)
# reboot
# dmesg | grep page_owner
[ 0.000000] Command line: BOOT_IMAGE=(hd0,gpt2)/vmlinuz-4.18.0-425.19.2.el8_7.x86_64 root=/dev/mapper/rootvg-rootlv ro ipv6.disable=1 audit=1 audit_backlog_limit=8192 crashkernel=auto resume=/dev/mapper/rootvg-swaplv rd.lvm.lv=rootvg/rootlv rd.lvm.lv=rootvg/swaplv rhgb quiet rd.shell=0 page_owner=on
[ 0.000000] Kernel command line: BOOT_IMAGE=(hd0,gpt2)/vmlinuz-4.18.0-425.19.2.el8_7.x86_64 root=/dev/mapper/rootvg-rootlv ro ipv6.disable=1 audit=1 audit_backlog_limit=8192 crashkernel=auto resume=/dev/mapper/rootvg-swaplv rd.lvm.lv=rootvg/rootlv rd.lvm.lv=rootvg/swaplv rhgb quiet rd.shell=0 page_owner=o
(补充:当显示此类信息时则 page_owner 已经开启)
# ls -l /sys/kernel/debug/page_owner
-r--------. 1 root root 0 Apr 13 14:36 /sys/kernel/debug/page_owner
(补充:当 /sys/kernel/debug/page_owner 文件存在时则 page_owner 已经开启)
# cat /sys/kernel/debug/page_owner > page_owner_full.txt
(补充:这里以将 page_owner 产生的记录导出到名为 page_owner_full.txt 文件为例)
(
注意:
1) 此命令会产生体积很巨大的文件
2) 此命令会持续执行直到手动取消
3) 可以通过同时按下 “ctrl” 键和 “C” 键或者使用 kill 命令取消
4) 如果内存变化较快则可以让此命令多执行一会,反之则可以少执行一会
)
# page_owner_sort page_owner_full.txt sorted_page_owner.txt
loaded 42903
sorting ....
culling
(补充:这里以分析名为 page_owner_full.txt 的文件并将分析结果导入到 sorted_page_owner.txt 文件为例)
# less sorted_page_owner.txt
1 times:
Page allocated via order 0, mask 0x0(), pid 1, tgid 1 (swapper/0), ts 48952109 ns, free_ts 0 ns
PFN 4096 type Unmovable Block 8 type Unmovable Flags 0xfffffc0000100(slab|node=0|zone=1|lastcpupid=0x1fffff)
register_early_stack+0x28/0x60
init_page_owner+0x30/0x2d0
kernel_init_freeable+0x13c/0x232
kernel_init+0xa/0x108
1 times:
Page allocated via order 0, mask 0x0(), pid 1, tgid 1 (swapper/0), ts 48952566 ns, free_ts 0 ns
PFN 4097 type Unmovable Block 8 type Unmovable Flags 0xfffffc0000100(slab|node=0|zone=1|lastcpupid=0x1fffff)
register_early_stack+0x28/0x60
init_page_owner+0x30/0x2d0
kernel_init_freeable+0x13c/0x232
kernel_init+0xa/0x108
......
(补充:这里以查看名为 sorted_page_owner.txt 文件里的分析结果为例)
# grubby --remove-args="page_owner=on" --update-kernel=0
(注意:关闭 page_owner 会额外释放一定量的内存)
# reboot
# dmesg | grep page_owner
[ 2.022585] page_owner is disabled
(补充:当显示此类信息时则 page_owner 没有开启)
# ls -l /sys/kernel/debug/page_owner
ls: cannot access '/sys/kernel/debug/page_owner': No such file or directory
(补充:当 /sys/kernel/debug/page_owner 文件不存在时则 page_owner 没有开启)
https://access.redhat.com/solutions/5609521
# vim /etc/sysconfig/sshd
确保部分内容如下:
......
# CRYPTO_POLICY=
......
# cp /etc/crypto-policies/back-ends/opensshserver.config /etc/crypto-policies/back-ends/opensshserver.config.backup
# vim /etc/crypto-policies/back-ends/opensshserver.config
添加需要使用的 SSH 算法 (algorithms) 和加密方式 (ciphers):
(内容略)
(注意:如果需要使用的 SSH 加密方式 (cipher) 、信息验证代码 (message authentication code) 和算法 (algorithm) ,已包含在其中了则可以不用添加)
# printf "%s\n" $(source /etc/crypto-policies/back-ends/opensshserver.config; echo $CRYPTO_POLICY) | cut -c3-
Ciphers=aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes256-cbc,aes128-gcm@openssh.com,aes128-ctr,aes128-cbc
MACs=hmac-sha2-256-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha2-256,hmac-sha1,umac-128@openssh.com,hmac-sha2-512
GSSAPIKexAlgorithms=gss-curve25519-sha256-,gss-nistp256-sha256-,gss-group14-sha256-,gss-group16-sha512-,gss-gex-sha1-,gss-group14-sha1-
KexAlgorithms=curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1
HostKeyAlgorithms=ecdsa-sha2-nistp256,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,rsa-sha2-256,rsa-sha2-256-cert-v01@openssh.com,rsa-sha2-512,rsa-sha2-512-cert-v01@openssh.com,ssh-rsa,ssh-rsa-cert-v01@openssh.com
PubkeyAcceptedKeyTypes=ecdsa-sha2-nistp256,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,rsa-sha2-256,rsa-sha2-256-cert-v01@openssh.com,rsa-sha2-512,rsa-sha2-512-cert-v01@openssh.com,ssh-rsa,ssh-rsa-cert-v01@openssh.com
CASignatureAlgorithms=ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,rsa-sha2-256,rsa-sha2-512,ssh-rsa
(补充:这里以显示 RHEL 8 默认使用的 SSH 加密方式 (cipher)、信息验证代码 (message authentication code) 和算法 (algorithm) 为例)
# systemctl restart sshd
# ssh -vv -oCiphers=3des-cbc -oPort=22 192.168.0.1
(补充:这里以测试 IP 地址是 192.168.0.1,端口号是 22,有没有启用 3des-cbc SSH 加密方式 (cipher) 为例)
# ssh -vv -oCiphers=3des-cbc,aes128-cbc,aes192-cbc,aes256-cbc -oPort=22 192.168.0.1
(补充:这里以测试 IP 地址是 192.168.0.1,端口号是 22,有没有启用 3des-cbc、aes128-cbc、aes192-cbc 和 aes256-cbc SSH 加密方式 (cipher) 为例)
# ssh -vv -oMACs=hmac-md5 -oPort=22 192.168.0.1
(补充:这里以测试 IP 地址是 192.168.0.1,端口号是 22,有没有启用 hmac-md5 SSH 信息验证代码 (message authentication code) 为例)
# ssh -vv -oMACs=hmac-md5,hmac-md5-96,hmac-sha1,hmac-sha1-96,hmac-md5-etm@openssh.com,hmac-md5-96-etm@openssh.com -oPort=22 192.168.0.1
(补充:这里以测试 IP 地址是 192.168.0.1,端口号是 22,有没有启用 hmac-md5、hmac-md5-96、hmac-sha1、hmac-sha1-96、hmac-md5-etm@openssh.com 和 hmac-md5-96-etm@openssh.com SSH 信息验证代码 (message authentication code) 为例)
# sshd -T | egrep -i "ciphers|macs|kexalgorithms"
# nmap --script ssh2-enum-algos -sV -p 22 127.0.0.1
(补充:这里以测试本地的 22 端口为例)
# ssh -vvv 127.0.0.1
(补充:这里以测试本地的 22 端口为例)
https://access.redhat.com/solutions/4410591
https://access.redhat.com/solutions/4278651
(步骤略)
(步骤略)
(步骤略)
rescue login:root
(步骤略)
(
补充:
1) 物理分区可以使用 lsblk 命令、fdisk -l 或 cat /proc/partitions 命令辅助确定
2) 逻辑分区还可以可以使用 pvs 命令、lvs 命令或 lvdisplay 命令辅助确定
)
tty1:rescue:~ # mount <root spartition> /mnt
(
补充:
1) 如果是物理分区,系统的根 “/” 分区就在救援模式的 /dev/ 目录里,例如救援模式的 /dev/sda1
2) 如果是逻辑分区,Rocky Linux & RHEL 的系统根 “/” 分区就是救援模式里的 /dev// 例如救援模式里的 /dev/vg/lv,openSUSE & SLES 的系统根 “/” 分区就是救援模式里的 /dev/mapper/- 例如救援模式里的 /dev/mapper/vg-lv
)
tty1:rescue:~ # mount --rbind /dev /mnt/dev
(
补充:
1) 此时所有对救援模式的 /mnt/dev 目录的访问都会变成对救援模式的 /dev 目录的访问
2) 步骤 4.2、步骤 4.3 和步骤 4.5 也可以用以下命令代替:
tty1:rescue:~ # for i in proc sys dev run; do mount --rbind /$i /mnt/$i ; done
)
tty1:rescue:~ # mount --rbind /proc /mnt/proc
(
补充:
1) 此时所有对救援模式的 /mnt/proc 目录的访问都会变成对救援模式的 /proc 目录的访问
2) 步骤 4.2、步骤 4.3 和步骤 4.5 也可以用以下命令代替:
tty1:rescue:~ # for i in proc sys dev run; do mount --rbind /$i /mnt/$i ; done
)
tty1:rescue:~ # mount --rbind /sys /mnt/sys
(
补充:
1) 此时所有对救援模式的 /mnt/sys 目录的访问都会变成对救援模式的 /sys 目录的访问
2) 步骤 4.2、步骤 4.3 和步骤 4.5 也可以用以下命令代替:
tty1:rescue:~ # for i in proc sys dev run; do mount --rbind /$i /mnt/$i ; done
)
tty1:rescue:~ # mount --rbind /run /mnt/run
(
补充:
1) 此时所有对救援模式的 /mnt/run 目录的访问都会变成对救援模式的 /run 目录的访问
2) 步骤 4.2、步骤 4.3 和步骤 4.5 也可以用以下命令代替:
tty1:rescue:~ # for i in proc sys dev run; do mount --rbind /$i /mnt/$i ; done
)
tty1:rescue:~ # chroot /mnt
(补充:这里以 /mnt 作为系统根 “/” 目录为例)
bash-4.3# mount -a
bash-4.3# ls
bin boot dev home lib lib64 mnt opt proc root run sbin selinux srv sys tmp usr var
(补充:这里显示的是常见的 Linux 根 “/” 目录 下的目录)
tty1:rescue:~ # mkdir /mnt/bin
tty1:rescue:~ # mkdir /media
tty1:rescue:~ # mount /dev/dvd /media
tty1:rescue:~ # cp /media/suse/x86_64/kernel-default-3.10.0-693.el7.x86_64.rpm .
(补充:这里以拷贝 /media/suse/x86_64/kernel-default-3.10.0-693.el7.x86_64.rpm 为例)
tty1:rescue:~ # rpm -ivh kernel-default-3.10.0-693.el7.x86_64.rpm
(补充:这里以安装 /media/suse/x86_64/kernel-default-3.10.0-693.el7.x86_64.rpm 为例)
(步骤略)
(
补充:
1) 物理分区可以使用 lsblk 命令、fdisk -l 或 cat /proc/partitions 命令辅助确定
2) 逻辑分区还可以可以使用 pvs 命令、lvs 命令或 lvdisplay 命令辅助确定
)
bash-4.3# grub2-install <disk which GRUB2 in>
bash-4.3# grub2-mkconfig -o /boot/grub2/grub.cfg
bash-4.3# exit
tty1:rescue:~ # reboot
如果以上步骤都不起作用,且 /boot 是单独分区的话,则可能是 boot 分区的文件系统损坏,可以尝试以下补充:
1) 重复本文步骤五和之前步骤的内容
2) 将 /boot 目录里的内容全部拷贝出来
3) 取消挂载 /boot 目录的分区
4) 将挂载 /boot 目录的分区重新格式化成 ext4 格式
5) 格式化后分区的 UUID 会改变,所以需要更新 /etc/fstab 文件中挂载 /boot 目录分区的 UUID
6) 将格式化后的分区重新挂载 /boot 目录
7) 将刚刚从 /boot 目录拷贝出来的内容拷贝回 /boot 目录
8) 重复此文的步骤六
(注意:不建议使用 Btrfs 文件系统给 /boot 目录分区)
https://www.suse.com/support/kb/doc/?id=000018770
# vim /etc/audit/auditd.conf
确保部分内容如下:
......
local_events = yes
......
write_logs = yes
......
log_file = /var/log/audit/audit.log
......
max_log_file = 8
......
num_logs =5
......
max_log_file_action = ROTATE
......
(
补充:这里以
1) 开启 auditd 日志 (local_events = yes) (write_logs = yes)
2) 将 auditd 日志写入 /var/log/audit/audit.log 文件 (log_file = /var/log/audit/audit.log)
3) auditd 日志每达到 8M 大小就将旧的 auditd 日志进行备份并创建新的 auditd 日志 (max_log_file = 8) (max_log_file_action = ROTATE),也可以修改成: max_log_file_action = keep_logs
4) 旧的 auditd 日志保存 5 份 (num_logs =5)
为例
)
# service auditd restart
# vim /etc/logrotate.d/auditd
创建以下内容:
/var/log/audit/*
{
rotate 30
daily
missingok
compress
delaycompress
postrotate
touch /var/log/audit/audit.log ||:
chmod 0600 /var/log/audit/audit.log ||:
service auditd restart
endscript
}
(
补充:这里以:
1) 备份的日志文件保留 30 份 (rotate 30)
2) 每天将现在的日志文件进行备份并生成新的日志文件 (dayly)
)
# systemctl restart logrotate.service