优化Linux操作系统,做到这16件事,你就进了数据中心
服务中心使用的Linux操作系统主要是基于CentOS6/7进行精简优化。往复杂表示,我们有两个系统,一个是为商业用途量身定制的Linux系统,另一个是用于数据中心的优化的Linux系统。
在公司,我们使用定制化的Linux系统。目的是为了更安全、更高效、更贴近企业的需求,并方便全国各地引入闪电。不过这个系统并不通用,所以今天我们先不讲。今天我主要分享数据中心常用的Linux的优化版本,因为这个比较常见,适合大家使用。我从以下几个方面来讲述。
主机名设置及永久生效
CentOS或RHEL定义了三种主机名:
- 静态(static):“静态” 主机名也称为内核主机名,是系统启动时自动初始化的主机名文件 /etc/hostname.
- 瞬态:“标准”主机名是在系统运行时临时分配的主机名,例如通过 DHCP 或 mDNS 服务器。
- Nice:“灵活”主机名允许向最终用户显示自由格式(包括特殊/标点符号)主机名(如 Gemini 的计算机)。
有了一个好的主机名,机房内的非操作维护人员一眼就能了解并定位到机器。例如:用途名称+省份+机房名称+机柜号+编号,示例如下:
HOST="DBS-ZJ-FUD-009"
hostnamectl set-hostname --static $HOST
hostnamectl set-hostname --pretty $HOST
hostnamectl set-hostname --transient $HOST
echo "$HOST" > /proc/sys/kernel/hostname
自定义远程登录界面
登录Linux的欢迎界面可以通过文件/etc/控制问题和 /etc/motd.如下图,无需登录系统即可一目了然地了解系统版本、CPU和内存型号容量、运行模式、应用程序版本号以及网络连接情况。
![]()
字符集设置
良好的字符集可以避免终端上出现杂乱的字符。建议使用 en_US.utf8 字符集。
# 查看操作系统支持的所有字符集
# locale -a
cat > /etc/locale.conf <<EOF
LANG=en_US.utf8
LC_CTYPE=en_US.utf8
EOF
localectl set-locale LANG=en_US.UTF8
常用基础软件安装
由于我们采用基于CentOS的极简安装,所以安装后会缺少一些常用基础软件,所以我们会适当添加基础软件,以帮助快速排查和定位问题。
yum install -y tree ntpdate bc nc net-tools wget lsof rsync nmon bash-completion iptables-services firewalld sysstat mtr htop bind-utils yum-utils epel-release smartmontools supervisor python-setuptools python-pip pkgconfig
时区和时间同步设置
在实际生产环境中,保证服务器时区和时间的一致性非常重要。尤其是在分布式系统、多机集群环境、数据库主从备份、定时任务等依赖时间同步的场景下,时区和时间同步非常有用。当两者发生冲突时,很容易引发各种问题。
timedatectl set-timezone Asia/Shanghai
timedatectl set-ntp 1
timedatectl set-local-rtc 0
#timedatectl set-time "2018-08-08 18:08:08"
ntpdate -u cn.pool.ntp.org
强烈建议把时间同步功能同时写在crontab中,双重保险。
# crontab -l
0 * * * * root(ntpdate -o3 192.168.1.10 211.115.194.21 )
禁用SELinux
SELinux 是一个主要由美国国家安全局开发的安全增强Linux。它概念严密,结构和装配复杂,操作严格。因此,您在使用时可以根据情况决定是否启用。它可以在特殊情况下使用,例如机密和信息敏感的组织。
sed -r -i '/^SELINUX=/s^=.*^=disabled^g' /etc/selinux/config
set enforce 0
添加普通用户和sudo
sudo是Linux系统管理命令。它是一个允许系统管理员允许普通用户执行部分或全部主要命令的工具,例如stop、restart、su等,这不仅减少了主用户的登录和管理时间,还提高了安全性。
值得注意的是,在生产环境中,不要直接使用root。建议先新建一个普通用户,然后再添加权限。
[root@OPS-FDI-020 ~]# useradd shaohy
[root@OPS-FDI-020 ~]# usermod -G wheel shaohy
[root@OPS-FDI-020 ~]# sed -i '/pam_wheel/s/^#//g' /etc/pam.d/su
将sudo添加到用户shaohy中,并执行除关机之外的所有其他操作:
[root@OPS-FDI-020 ~]# visudo
Cmnd_Alias SHUTDOWN = /sbin/halt, /sbin/shutdown, /sbin/poweroff, /sbin/reboot, /sbin/init
shaohy ALL=(ALL) ALL,!SHUTDOWN
%wheel ALL=(ALL) ALL,!SHUTDOWN #修改wheel组的权限,禁止关机
Defaults logfile=/var/log/sudo.log
配置防火墙规则和iptables
从CentOS7开始,默认使用防火墙来管理netfilter子系统。需要注意的是,底层命令仍然叫Used iptables。两者的区别如下:
- 防火墙可以动态修改单个规则,动态管理规则集,并允许在不破坏现有会话和连接的情况下更新规则。对于iptables来说,规则一旦改变就需要更新才能生效。
- 防火墙使用区域和服务而不是链规则。
- 防火墙默认处于禁用状态,必须先进行设置才能允许。默认情况下,iptables 允许它,并且仅在需要拒绝时才限制它。
选择时可以考虑拒绝防火墙并尝试接受。
#!/bin/sh
IPS="192.168.0.0/16"
firewall-cmd --zone=public --remove-service=ssh
firewall-cmd --new-zone=openssh --permanent
firewall-cmd --zone=openssh --add-port=22222/tcp --permanent
firewall-cmd --permanent --zone=public --set-target=default
for ip in $IPS;do
firewall-cmd --zone=openssh --add-source=$ip --permanent
done
firewall-cmd --reload
firewall-cmd --runtime-to-permanent
GPT分区及分区挂载
优派云的每台CDN服务器都有大量的硬盘,更不用说比较小的4T、6T磁盘了。即使是10T型号也有12个之多,因此格式化和分区这些硬盘的使用和维护必须自动化。
早期主引导记录(MBR),也称为主引导扇区,是计算机打开时必须读取的第一个扇区,以便访问硬盘驱动器。不支持大于2T控制器的硬盘。虽然修复后的MBR也可以支持大于2T的分区,但GPT已经成为新的趋势。与 MBR 相比,GPT 分区方案具有以下特点:
- GPT 是 UEFI 标准的一部分(UEFI 是一种个人计算机系统规范,用于定义操作系统和系统固件之间的软件接口,作为 BIOS 的替代品)方案)。
- GPT 分区目录最大支持 128PB(1PB=1024TB)。可以指定
- 128 个部分。
- 没有主分区、扩展分区、逻辑分区的概念,所有分区都可以格式化。
#!/bin/sh
DEV=`lsscsi | awk '/HGST/{print $NF}'` # 筛选所有的sata硬盘
i=1
for dev in $DEV;do
label="/disk/sata0$i"
echo $dev $label
parted -m -s $dev rm 1
parted -m -s $dev mklabel gpt
parted -m -s $dev mkpart primary ext4 2048s 100%
partx -a $dev
((i++))
nohup mkfs.ext4 -L $label ${dev}1 >/dev/null &
done
ulimit配额设置
由于CentOS7/RHEL7中使用Systemd来替代之前的SysV,因此/etc/security/limits.conf中的设置仅适用于登录用户的资源限制。 PAM 身份验证。 Systemd 服务资源限制不生效。
由于Systemd服务的资源限制,我们在/etc/systemd/system.conf和/etc/systemd/user.conf中进行常规设置。其中system.conf文件用于系统实例,user.conf文件用于用户实例。
sed -r -i -e '/DefaultLimitCORE/s^.*^DefaultLimitCORE=infinity^g' -e '/DefaultLimitNOFILE/s^.*^DefaultLimitNOFILE=100000^g' -e '/DefaultLimitNPROC/s^.*^DefaultLimitNPROC=100000^g' /etc/systemd/system.conf
增加打开文件数,设置最大非root进程数默认为4096
cat > /etc/security/limits.d/20-nproc.conf <<EOF
* soft nproc 10240
root soft nproc unlimited
EOF
sysctl.conf配置生效
sysctl.conf配置参数较多且复杂,讲解作用详细了解每个参数需要很长时间。以下是一些常见的调整参数,以对其有所了解。重点主要是优化网络和 TCP 参数、阻止交换操作以及加强文件处理。
net.ipv4.ip_forward=1
net.ipv4.ip_local_port_range=1000 65535
net.ipv4.tcp_slow_start_after_idle=0
net.ipv4.tcp_no_metrics_save=1
net.ipv4.tcp_rfc1337=1
net.ipv4.tcp_timestamps=1
net.ipv4.tcp_sack=1
net.ipv4.tcp_dsack=1
net.ipv4.tcp_window_scaling=1
net.ipv4.tcp_rmem=4096 102400 16777216
net.ipv4.tcp_wmem=4096 102400 16777216
net.ipv4.tcp_mem=786432 1048576 1572864
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_syn_retries=3
net.ipv4.tcp_synack_retries=5
net.ipv4.tcp_retries1=3
net.ipv4.tcp_retries2=15
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_max_syn_backlog=262144
net.ipv4.tcp_max_orphans=262144
net.ipv4.tcp_tw_recycle=0
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_keepalive_time=30
net.ipv4.tcp_keepalive_intvl=10
net.ipv4.tcp_keepalive_probes=3
net.ipv4.tcp_max_tw_buckets=600000
net.ipv4.tcp_congestion_control=bbr
net.core.somaxconn=8192
net.core.rmem_default=131072
net.core.wmem_default=131072
net.core.rmem_max=33554432
net.core.wmem_max=33554432
net.core.dev_weight=512
net.core.optmem_max=262144
net.core.netdev_budget=1024
net.core.netdev_max_backlog=262144
vm.swappiness=0
vm.dirty_writeback_centisecs=9000
vm.dirty_expire_centisecs=18000
vm.dirty_background_ratio=5
vm.dirty_ratio=10
vm.overcommit_memory=1
vm.overcommit_ratio=50
vm.max_map_count=200000
fs.file-max=524288
fs.aio-max-nr=1048576
/etc/passwd 安全检查
用户shell访问权限检查,通常考虑安全问题,非root用户不应该有shell权限。
# 过滤出有uid==0, gid==0的潜伏用户,判断有没有bash
awk -F: '($3==0||$4==0) {print $0}' /etc/passwd|grep -i bash
# 除root外的用户shell全部为nologin
sed -r -i '/^[^root]/s:/bin/bash:/sbin/nologin:g' /etc/passwd
sshd服务配置
由于几乎所有的Linux服务器都是通过SSH远程管理的,所以很容易吸引很多不速之客试图通过SSH访问你的服务器。所以SSH的安全性不容忽视!强烈建议在修改之前禁用密码登录并使用公钥通过 SSH 登录管理服务器。
sed -r -i '/#Port 22/s^.*^Port 22222^g;/^PasswordAuthentication/s^yes^no^g' /etc/ssh/sshd_config
禁用不必要的服务
Linux服务(Linux services)对于每个使用Linux的用户来说都非常重要。禁用不必要的服务可以使Linux运行更加高效,但并不是所有的Linux服务都可以关闭。这个你得自己权衡一下。
systemctl disable network postfix irqbalance tuned rpcbind.target
如果有ntpd、dns等基于UDP的服务,要注意UDP反射攻击。由于UDP反射攻击破坏性很大,所以最好关闭不必要的相关服务或者选择安全性高的机房部署此类服务。
logrotate 减少轮转日志包
当服务器进程较多且日志文件大小快速增长时,仍然会消耗磁盘空间并触发警报。目前,人们必须定期对不同尺寸的树木进行人工清理。如果不及时清理,很容易成为运维事故。
通常可以使用logrotate日志滚动机制将日志文件根据时间或大小拆分为多个部分并删除旧的日志文件,这样可以节省空间并让组织更容易。
sed -r -i 's@weekly@daily@g;s@^rotate.*@rotate 7@g;s@^#compress.*@compress@g' /etc/logrotate.conf
systemctl daemon-reload; systemctl restart rsyslog
journalctl调整日志日志
在Systemd诞生之前,Linux系统和各个应用程序的日志是分开管理的,而Systemd则统一管理所有单元的启动日志。这样做的好处是您只需使用一个journalctl命令即可查看所有内核和应用程序的日志。
正确的配置可以使日志文件夹大小可调并防止容量爆炸。
sed -r -i -e '/Compress=/s@.*@Compress=yes@g; /SystemMaxUse=/s@.*@SystemMaxUse=4G@g; ' -e '/SystemMaxFileSize=/s@.*@SystemMaxFileSize=256M@g;' -e '/MaxRetentionSec=/s@.*@MaxRetentionSec=2week@g' /etc/systemd/journald.conf
综上所述,完成上述优化后,就可以正式上线一个安全可靠的操作系统来提供服务了。祝大家Linux之旅愉快!
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网