目 录CONTENT

文章目录

服务器系统配置初始化

简中仙
2020-11-25 / 0 评论 / 0 点赞 / 91 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文最后更新于2023-10-09,若内容或图片失效,请留言反馈。 本文如有错误或者侵权的地方,欢迎您批评指正!

1、设置时区并同步时间
2、禁用selinx
3、清空防火墙默认策略
4、历史命令显示操作时间
5、禁止root远程登录
6、禁止定时任务发送邮件
7、设置最大打开文件数
8、减少Swap使用
9、系统内核参数优化
10、安装系统性能分析工具及其他工具

#!/bin/bash
# 设置时区并同步时间
timedatectl set-timezone Asia/Shanghai
if ! crontab -l | grep ntpdate &</dev/null ; then
	(echo "* 1 * * * ntpdate time.windows.com >/dev/null 2>&1";crontab -l) | crontab
fi

# 禁用selinux
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
systemctl disable --now NetworkManager

# 关闭防火墙
if egrep "7.[0-9]" /etc/redhat-release &>/dev/null;then
	systemctl stop firewalld
	systemctl disable firewalld
elif egrep "6.[0-9]" /etc/redhat-release &>/dev/null;then
	service iptables stop
	chkconfig iptables off
fi

# 历史命令显示操作时间
if ! grep HISTTIMEFORMAT /etc/bashrc; then
	echo 'export HISTTIMEFORMAT="%F %T `whoami` "' >>/etc/bashrc
fi

# SSH超时时间
if ! grep "TMOUT=600" /etc/profile &>/dev/null; then
	echo "export TMOUT=600" >> /etc/profile
fi
	
# 关闭ssh解析,禁止root远程登录
#sed -i.bak 's@#UseDNS yes@UseDNS no@g;s@^GSSAPIAuthentication yes@GSSAPIAuthentication no@g'  /etc/ssh/sshd_config

# 禁止定时任务发送邮件
sed -i 's/^MAILTO=root/MAILTO=""/' /etc/crontab

#关闭邮件服务
systemctl stop postfix && systemctl disable postfix

# 设置最大打开文件数
if ! grep "* soft nofile 65535" /etc/security/limits.conf &>/dev/null; then
    cat >> /etc/security/limits.conf <<EOF
    * soft nofile 65536   #可打开的文件描述符的最大数
    * hard nofile 131072   #可打开的文件描述符的最大数
    * soft nproc 65535   #单个用户可用的最大进程数量
    * hard nproc 655350   #单个用户可用的最大进程数量
    * soft memlock unlimited   #系统硬限制无上限
    * hard memlock unlimited   #系统软限制无上限
EOF
fi

# 系统内核优化
cat >> /etc/sysctl.conf <<EOF
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_tw_buckets = 20480
net.ipv4.tcp_max_syc_backlog = 20480
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_fin_timeout = 20
EOF

# 减少SWAP使用
swapoff -a && sysctl -w vm.swappiness=0
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab

# 安装阿里yum源
yum -y install wget
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum repolist && yum makecache fast

# 安装系统性能分析工具及其他
yum -y install gcc make autoconf vim net-tools ntpdate sysstat iftop iotop lrzsz glances htop

一、cgroups是什么?

对于容器技术而言,它实现资源层面上的限制和隔离,依赖于 Linux 内核所提供的 cgroup 和 namespace 技术。简单来说 Namespace 可以让每个进程有独立的 PID, IPC 和网络空间。cgroup 可以控制进程的资源占用,比如 CPU ,内存和允许的最大进程数等等。cgroup 是在 2008 年进入的Linux内核,到目前为止有两个大版本:cgroup v1 和 cgroup v2 。

cgroups子系统

cgroups 的全称是control groups,cgroups为每种可以控制的资源定义了一个子系统。典型的子系统介绍如下:

  • cpu 子系统,主要限制进程的 cpu 使用率。
  • cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告。
  • cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。
  • memory 子系统,可以限制进程的 memory 使用量。
  • blkio 子系统,可以限制进程的块设备 io。
  • devices 子系统,可以控制进程能够访问某些设备。
  • net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
  • freezer 子系统,可以挂起或者恢复 cgroups 中的进程。
  • ns 子系统,可以使不同 cgroups 下面的进程使用不同的 namespace。

二、cgroups版本

目前 cgroups 有 cgroupv1 和 cgroupv2 两种文件系统,目前内核中两种文件系统的功能都支持,用户可以根据自己的需求选择使用其中的一种或者选择兼容的模式。

1、cgroupv1 与 cgroupv2 的差异

如下表所示:

cgroupv1cgroupv2
进程可以存在于任一节点中进程只能存在与根节点和叶子节点中,中间节点用来对资源进行控制,实现了 cgroups 代表进程分组,子系统应用于资源控制
各个子系统单独工作,很难实现协同合作(writeback 功能)所有子系统挂在统一层级,可以实现多系统协同工作
memcg 资源限制手段简单,仅有 limit_in_bytes 的限制,实际业务无法很好平衡采用分级管理的调节手段,可以提高性能,解决临时内存峰值的情况,缓解不同业务之间的性能影响
不支持 rootless支持 rootless
不支持 PSI 功能支持 PSI 功能

注:

rootless——Rootless containers,普通用户(不具备管理员权限、也不应该具备更多权限)可以创建、运行和管理的容器。

PSI——Pressure Stall Information,能够去统计由于资源短缺引起的系统停滞的这些信息,准确反映资源(cpu,memory,io)压力,并根据压力情况采取措施,比如不再调度,kill低优先级任务等等,减轻整个系统的压力。

cgroups v2自Linux内核4.5版本加入支持,但并未作为默认使用,系统默认仍然使用cgroups v1版本;RHEL/Alma Linux 8默认内核4.18支持cgoups v2,但默认仍然为v1版本;RHEL/Alma Linux 9默认内核5.14支持cgroups v2,并且默认为v2版本。

Linux各发行版将cgroups v2作为默认的情况如下:

  • Container-Optimized OS(从 M97 开始)
  • Ubuntu(从 21.10 开始,推荐 22.04+)
  • Debian GNU/Linux(从 Debian 11 Bullseye 开始)
  • Fedora(从 31 开始)
  • Arch Linux(从 2021 年 4 月开始)
  • RHEL 和类似 RHEL 的发行版(从 9 开始)

2、查看Linux内核、cgroups版本及默认版本

RHEL/CentOS 7 内核3.10

# uname -a
Linux chefserver 3.10.0-693.11.6.el7.x86_64 #1 SMP Thu Jan 4 01:06:37 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
# RHEL/CentOS 7 内核3.10仅支持cgroups v1,默认那必然是cgroups v1。
# grep cgroup /proc/filesystems
nodev   cgroup
# stat -fc %T /sys/fs/cgroup/
tmpfs       # tmpfs,说明默认为 cgroups v1

RHEL/Alma Linux 8 内核4.18

# uname -a
Linux pxe 4.18.0-372.9.1.el8.x86_64 #1 SMP Tue May 10 08:57:35 EDT 2022 x86_64 x86_64 x86_64 GNU/Linux
# RHEL/Alma Linux 8 内核4.18支持cgroups v1 v2,默认为cgroups v1。
# grep cgroup /proc/filesystems
nodev   cgroup
nodev   cgroup2
# mount|grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma)
# stat -fc %T /sys/fs/cgroup/
tmpfs       # tmpfs,说明默认为 cgroups v1

RHEL/Alma Linux 9 内核5.14

# stat -fc %T /sys/fs/cgroup/
cgroup2fs      # cgroup2fs,说明默认为 cgroups v2

三、升级cgroup v2

1、升级内核

由于 centos 7 系统的 systemd-219 版本过于老旧,并不支持 cgroup v2。因此我尝试通过yum安装的方式将 systemd 升级到 234,再通过配置系统引导参数的方式将 systemd 默认 cgroup 版本切换到 v2。

# yum update -y --exclude=kernel*
# yum install libcap-devel libmount-devel xz-devel gperf wget -y
# wget https://copr.fedorainfracloud.org/coprs/jsynacek/systemd-backports-for-centos-7/repo/epel-7/jsynacek-systemd-backports-for-centos-7-epel-7.repo -O /etc/yum.repos.d/jsynacek-systemd-centos-7.repo
# yum -y update systemd

需要注意:升级
systemd 后如果重启服务器会导致网卡设备名称会发生变化,用户需要重新配置网卡信息。

wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpm
wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm
yum localinstall -y kernel-ml*
grub2-set-default  0 && grub2-mkconfig -o /etc/grub2.cfg
grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
# grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=1"
# reboot
# uname -a				# 确认内核
Linux jenkins 4.19.12-1.el7.elrepo.x86_64 #1 SMP Fri Dec 21 11:06:36 EST 2018 x86_64 x86_64 x86_64 GNU/Linux
# grep cgroup /proc/filesystems			# 确认内核是否支持
nodev   cgroup
nodev   cgroup2
# systemctl --version					# 确认systemd版本
systemd 234
+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN

2、切换cgroup版本

验证系统的cgroup版本:

[root@localhost ~]# stat -fc %T /sys/fs/cgroup/
cgroup2fs					# 对于 cgroup v2,输出为 cgroup2fs;对于 cgroup v1,输出为 tmpfs。
# docker info | grep -i cgroup
 Cgroup Driver: systemd
 Cgroup Version: 2
  cgroupns

说明: 在版本 1.22 中,如果用户没有在 KubeletConfiguration 中设置 cgroupDriver 字段, kubeadm init 会将它设置为默认值 systemd

在k8s初始化中出现这个错误时

# kubeadm init --config /root/new.yaml  --upload-certs
[init] Using Kubernetes version: v1.27.3
[preflight] Running pre-flight checks
[preflight] The system verification failed. Printing the output from the verification:
KERNEL_VERSION: 4.19.12-1.el7.elrepo.x86_64
CONFIG_NAMESPACES: enabled
CONFIG_NET_NS: enabled
CONFIG_PID_NS: enabled
CONFIG_IPC_NS: enabled
CONFIG_UTS_NS: enabled
CONFIG_CGROUPS: enabled
CONFIG_CGROUP_CPUACCT: enabled
CONFIG_CGROUP_DEVICE: enabled
CONFIG_CGROUP_FREEZER: enabled
CONFIG_CGROUP_PIDS: enabled
CONFIG_CGROUP_SCHED: enabled
CONFIG_CPUSETS: enabled
CONFIG_MEMCG: enabled
CONFIG_INET: enabled
CONFIG_EXT4_FS: enabled (as module)
CONFIG_PROC_FS: enabled
CONFIG_NETFILTER_XT_TARGET_REDIRECT: enabled (as module)
CONFIG_NETFILTER_XT_MATCH_COMMENT: enabled (as module)
CONFIG_FAIR_GROUP_SCHED: enabled
CONFIG_OVERLAY_FS: enabled (as module)
CONFIG_AUFS_FS: not set - Required for aufs.
CONFIG_BLK_DEV_DM: enabled (as module)
CONFIG_CFS_BANDWIDTH: enabled
CONFIG_CGROUP_HUGETLB: enabled
CONFIG_SECCOMP: enabled
CONFIG_SECCOMP_FILTER: enabled
OS: Linux
CGROUPS_CPU: enabled
CGROUPS_CPUSET: missing
CGROUPS_DEVICES: enabled
CGROUPS_FREEZER: enabled
CGROUPS_MEMORY: enabled
CGROUPS_PIDS: enabled
CGROUPS_HUGETLB: missing
CGROUPS_IO: enabled
        [WARNING SystemVerification]: missing optional cgroups: hugetlb
error execution phase preflight: [preflight] Some fatal errors occurred:
        [ERROR SystemVerification]: missing required cgroups: cpuset
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher

需要进行以下操作

# vim /etc/default/grub
GRUB_CMDLINE_LINUX="cgroup_enable=cpu"
grub2-mkconfig -o /boot/grub2/grub.cfg
cat <<EOF | sudo tee /boot/cmdline.txt
cgroup_enable=cpu cgroup_cpu=1
EOF
# reboot
0

评论区