CentOS 7 配置记录

几个 vps 逐步的升级到 CentOS 7,老是忘记一些配置,于是动手纪录下。首先当然是更新到最新的包

# yum update

hostname

# hostname yourdomain
# hostnamectl set-hostname yourdomain

Timezone

# timedatectl set-timezone Asia/Shanghai

查看时区

# timedatectl

adduser

不喜 root ssh,于是添加一个用户,因为用得到 sudo,故添加到 wheel 组

# useradd -m -G users,wheel test
# passwd test

firewall

# systemctl start firewalld
# systemctl enable firewalld

具体的方法可以阅读:CentOS 7 下使用 Firewall,这里只添加基本的对外服务

# firewall-cmd --permanent --zone=public --add-service=http
# firewall-cmd --permanent --zone=public --add-service=https
# firewall-cmd --reload

确认下

# firewall-cmd --permanent --zone=public --list-services

iptables

或者,你可能仍然习惯使用 iptables,则

# yum install iptables-services iptables

规则文件 /etc/sysconfig/iptables,写入内容

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p icmp -m icmp --icmp-type echo-request -j ACCEPT
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 28480 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 2377 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 4789 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 7946 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 7946 -j ACCEPT
-A INPUT -p esp -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -m conntrack --ctstate INVALID -j DROP
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

随后导入规则,再启用服务

# iptables-restore < /etc/sysconfig/iptables
# systemctl enable iptables && systemctl start iptables

ssh

调整 sshd 服务,采用 key 登陆,编辑 /etc/ssh/sshd_config

......
AcceptEnv LANG LC_*

Subsystem	sftp	/usr/lib/openssh/sftp-server

Protocol 2
UsePAM yes
UseDNS no
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
AddressFamily inet
PermitRootLogin no
PasswordAuthentication no
SyslogFacility AUTHPRIV
PubkeyAuthentication yes
ChallengeResponseAuthentication no
ClientAliveInterval 60
Port port-num
Match User user-name
    X11Forwarding no
    PermitTTY yes

/home/test

# mkdir .ssh
# chown test:test -R .ssh
# chmod 700 .ssh

上传你的 pub key/home/test/.ssh 目录,改名为 authorized_keys 并修改权限

# chown test:test /home/test/authorized_keys
# chmod 600 /home/test/authorized_keys

因为更改了默认的 22 端口,安装一个 selinux 工具

# yum install policycoreutils-python
# semanage port -a -t ssh_port_t -p tcp yourport
# firewall-cmd --zone=public --permanent --add-port=yourport/tcp
# firewall-cmd --zone=public --permanent --remove-service=ssh
# firewall-cmd --reload

然后重启下 sshd 服务

# systemctl restart sshd

确认下 sshd 服务

# ss -alnptu | grep sshd

tmpfs

内存足够的话,直接将 tmpfs 挂载至 /tmp,先检查下

# systemctl is-enabled tmp.mount

如果没有,需要手动操作下

# systemctl enable tmp.mount && systemctl start tmp.mount

个别主机上采用的模版镜像,可能默认 mask 了服务,你可能需要先 unmask

# systemctl unmask tmp.mount && systemctl enable tmp.mount && systemctl start tmp.mount

当然,我们也可以使用传统的方式来挂载,譬如在 /etc/fstab 中指定

tmpfs   /tmpfs  tmpfs   size=512m   0 0

如果想要调整当前 tmpfs 的大小,可以如此操作

# mount -o remount,size=N /tmp

swap

小内存,是需要 swap 的,而我习惯不论 8G 以内的内存,创建 swapfile

# fallocate -l 64M /swap
or
# dd if=/dev/zero of=/swap bs=1 coun=0 seek=64M         # seek 方式来创建稀疏文件
# chmod 600 /swap
# mkswap /swap
# swapon /swap

临时卸载 swap

# swapoff /swap
or
# swapoff -a

最后,写入 fstab

/swap	none	swap	sw	0 0

性能优化方面,其实我们还是希望系统尽量使用物理内存,而不要有限使用 swap 交换文件,swappiness 参数代表内核对于交换空间的喜好,值越小代表越减少内存的交换,从而提升一些响应速度。编辑 /etc/sysctl.conf

vm.swappiness=1
vm.vfs_cache_pressure=50

zram

swap 频繁交换会极大的影响主机性能,现在一般对小内存主机,使用 zram,不过 CentOS 7 并没有提供管理脚本,自己创建一个

# touch /etc/init.d/zramswap
# chmod +x /etc/init.d/zramswap

写入如下内容

#!/bin/bash

NUM_CPUS=$(nproc)
[ "$NUM_CPUS" != 0 ] || NUM_CPUS=1
NUM_DEVS=$NUM_CPUS
FACTOR=50 # percentage
TOTALRAM=$(grep MemTotal /proc/meminfo | awk ' { print $2 } ')
DISK_SIZE=$(($TOTALRAM/$NUM_CPUS*$FACTOR/100*1024))

# show supported compression algorithms: `cat /sys/block/zram*/comp_algorithm`
# select your compression algorithm, lzo is the default
# speed: lz4 > zstd > lzo
# compression: zstd > lzo > lz4
COMP_ALGORITHMS=lzo

#Defaults for vm.overcommit_memory, vm.page-cluster, vm.swappiness
OVERCOMMIT_MEMORY=0
PAGE_CLUSTER=3
SWAPPINESS=100


start() {
  [ ! -e /sys/module/zram ] && modprobe zram num_devices=$NUM_DEVS || modprobe -r zram && modprobe zram num_devices=$NUM_DEVS
  for i in /sys/block/zram*; do
    /usr/bin/echo $COMP_ALGORITHMS > ${i}/comp_algorithm;
    /usr/bin/echo $DISK_SIZE > ${i}/disksize;
  done

  for i in /dev/zram*; do
    /usr/sbin/mkswap ${i};
    /usr/sbin/swapon -d -p100 ${i};
  done

  echo 1 > /proc/sys/vm/overcommit_memory
  echo 0 > /proc/sys/vm/page-cluster
  echo 100 > /proc/sys/vm/swappiness
}

stop() {
  [ ! -e /sys/module/zram ] && exit 0

  echo $OVERCOMMIT_MEMORY > /proc/sys/vm/overcommit_memory
  echo $PAGE_CLUSTER > /proc/sys/vm/page-cluster
  echo $SWAPPINESS > /proc/sys/vm/swappiness

  for i in /dev/zram*; do
    /usr/sbin/swapoff ${i};
  done

  for i in /sys/block/zram*; do
    /usr/bin/echo 1 > ${i}/reset;
  done
  [ -e /sys/module/zram ] && modprobe -r zram
}

case $1 in
  (start|stop) "$1" ;;
esac

最后

# systemctl enable zramswap
# systemctl start zramswap
# free -h

journal

是个好东西,接管日志,统一的格式,但是呢,时间长了,几个 GB 的日志还是挺占用空间的,需要配置下

手动清理日志

# journalctl --vacuum-time=1d
# journalctl --vacuum-size=100M

写入配置 /etc/systemd/journald.conf

SystemMaxUse=100M

ulimits on systemd

编辑 /etc/systemd/system.conf 或 /etc/systemd/user.conf,依据 unit 文件在哪个目录。

DefaultLimitNOFILE=51200
DefaultLimitNPROC=51200

升级 kernel ≥ 4.9

Linux Tovalds 于 2016 年 12 月 11 日发布了 Kernel 4.9 正式版本,带来了一些令人激动的特性以及一些驱动的更新。Linux 稳定内核维护者 Greg Kroah-Hartman 也早已宣布下一个长期支持版(LTS)内核将是 Linux 4.9。来自 Google 的 BBR (Bottleneck Bandwidth and RTT) TCP 拥塞控制 (congestion control) 算法也在这个版本并入了主线。为了体验 BBR TCP,迫不及待的需要将 CentOS 7 的内核升级至该版本。具体的更新可以查阅:Linux Kernel 4.9 release notes

安装

现在升级内核,没有那么复杂,也无需安装第三方源,在 CentOS-7.3.1611 之后用自带 repo 的即可,只需一行命令

# yum --enablerepo=centos-kernel update

或者编辑文件 /etc/yum.repos.d/CentOS-x86_64-kernel.repo ,在 [centos-kernel]

enabled=1

再更新系统

# yum update

更新完成后重启,通过 uname -a 查看内核版本,譬如我的

$ uname -a
Linux CentOS 4.9.13-203.el7.x86_64 #1 SMP Wed Mar 08 13:39:54 EST 2017 x86_64 x86_64 x86_64 GNU/Linux

一些 grub 操作内核的相关命令,可能用得到

awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg     # 查看 grub 中内核版本以及顺序
grub2-editenv list      # 当前默认的启动项
grub2-set-default N     # 设置你需要的内核版本为默认启动内核
开启 BBR TCP
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf

重启后,首先 uname -a 看下内核是否切换到 4.9,然后执行下面明亮查看内核是否开启 TCP BBR:

sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_control

查看 tcp_bbr 模块是否加载:

lsmod | grep tcp_bbr
重新生成 rescue 镜像

这一步不是必须的。

确认下 /usr/lib/dracut/dracut.conf.d/02-rescue.conf 中的 dracut_rescue_image 是否为 yes,然后:

rm -f /boot/vmlinuz-0-rescue-* /boot/initramfs-0-rescue-*.img
/etc/kernel/postinst.d/51-dracut-rescue-postinst.sh $(uname -r) /boot/vmlinuz-$(uname -r)