CentOS7 对比 CentOS6
字符集
-
CentOS 6
-
⽅法:/etc/sysconfig/i18n中的LANG=
-
CentOS 7
-
⽅法1:localectl set-locale LANG=
-
⽅法2:/etc/locale.conf中的LANG=
主机名
-
CentOS 6
-
在线⽣效:hostname
-
重启⽣效:/etc/sysconfig/network中的HOSTNAME=
-
CentOS 7
-
在线+重启⽣效:hostnamectl set-hostname
时区
-
CentOS 6
-
⽅法:ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
-
CentOS 7
-
⽅法1:同CentOS 6
-
⽅法2:timedatectl set-timezone Asia/Shanghai
时间同步(⼀)
-
CentOS 6
-
缓慢:ntpd或ntpdate
-
直接:ntpdate -b(通常加到crontab)
-
CentOS 7
-
⽅法1:systemctl start chronyd
-
⽅法2:timedatectl set-ntp yes
时间同步(⼆)
-
可以通过timedatectl | grep “NTP synchronized”判断当前时间是否已同步
-
不建议⽤ntpd和ntpdate,redhat强烈推荐chrony,可⽤于⽹络不稳定的环境
-
ntpd和chronyd区别详⻅红帽官⽹⽂档
-
chrony.conf关键参数makestep 1.0 -1
⼿动更改时间
-
CentOS 6
-
⽅法:date -s “2018-07-08 11:11:11”
-
CentOS 7
-
⽅法1:同CentOS 6
-
⽅法2:timedatectl set-time “2018-07-08 11:11:11”(前提是timedatectl set-ntp false)
单⽤户修改密码
-
CentOS 6
-
grub界⾯键⼊e,在kernel⾏最后加1,键⼊b进⼊单⽤户模式,通
-
过passwd命令修改密码
-
CentOS 7
-
grub界⾯键⼊e,在linux16⾏上将ro改为rw,并在当前⾏最后加
-
init=/bin/sh,组合键ctrl-x进⼊单⽤户模式,通过passwd命令修改密码,如果有开启selinux,则需要在重启前touch /.autorelabel
grub添加参数
-
CentOS 6
-
/boot/grub/grub.conf的kernel中加⼊需要添加的参数
-
CentOS 7
-
步骤1:/etc/default/grub的GRUB_CMDLINE_LINUX中加⼊需要添
-
加的参数
-
步骤2:grub2-mkconfig -o /boot/grub2/grub.cfg
查看开机记录
-
CentOS 6
-
⽅法:last
-
CentOS 7
-
⽅法1:同CentOS 6
-
⽅法2:journalctl –list-boots
rc.local(1.执⾏顺序)
-
CentOS 6
-
串⾏的最后⼀个执⾏
-
CentOS 7
-
和其他服务并⾏执⾏
rc.local(2.可执⾏权限)
-
CentOS 6
-
默认有可执⾏权限
-
CentOS 7
-
默认没有可执⾏权限(官⽅不推荐使⽤rc.local),需要⾃⾏增加(chmod +x /etc/rc.d/rc.local)
rc.local(3.注意事项)
-
CentOS 7
-
rc.local由rc-local.service执⾏,并⾏执⾏,仅能保证在network之后
-
启动,因此建议rc.local⾥增加sleep 10来尽可能在最后执⾏
-
需要在rc.local的最后⼀⾏增加exit 0,否则可能导致已启动的进程被关闭(echo 'exit 0' » /etc/rc.d/rc.local)
-
建议尽量使⽤systemd来配置服务,不要使⽤rc.local
limit配置
-
CentOS 6
-
全局设置:没有全局设置的⽅法
-
/etc/security/limits.conf仅针对使⽤pam的进程,且有加载pam_limits.so(因为limits.conf实际是pam_limits.so的配置⽂件)
-
服务设置:只能在服务启动前设置ulimit,才能在启动后看到效果
-
CentOS 7
-
全局设置:/etc/systemd/system.conf⾥(如DefaultLimitNOFILE=65535)
-
服务设置:[Service]⾥增加LimitNOFILE=65535
yum仅使⽤ipv4
-
CentOS 6
-
yum没有⾃带⽅法
-
CentOS 7
-
yum.conf⾥增加ip_resolve=4
彻底禁⽤IPv6
-
CentOS 6和CentOS 7相同
-
在grub上增加ipv6.disable=1
-
查看是否彻底关闭
-
sysctl -a | grep -i ipv6如果没有任何输出,则表示彻底关闭
-
⽹卡名(⼀)
-
CentOS 6
-
系统安装完,默认是em1开始,这其实装机完成时在udev做的绑定
-
把/etc/udev/rules.d/70-persistent-net.rules内容清空,则恢复成eth0开始编号
-
CentOS 7
-
不再通过udev绑定⽹卡名,默认是em1开始,有的是eno、enp、ens等名字
-
如果想恢复eth0,则/etc/default/grub⾥增加net.ifnames=0 biosdevname=0
⽹卡名(⼆)
-
如果想让CentOS 6的⽹卡名不受udev影响,达到CentOS 7的效果,则删除3个⽂件即可
-
rm -f /etc/udev/rules.d/70-persistent-net.rules
-
rm -f /lib/udev/write_net_rules
-
rm -f /lib/udev/rules.d/75-persistent-net-generator.rules
-
⽹卡名含义
-
eno:主板板载⽹卡
-
enp:独⽴⽹卡(PCI⽹卡)
-
ens:热插拔⽹卡(usb之类)
CPU频率(⼆)
-
CentOS 7
-
若要和6⼀样保持频率,则在grub⾥增加intel_pstate=disable
-
不建议上述做法(详⻅最后章节的性能对⽐)
-
第⼆部分:服务管理 sysvinit、upstart、systemd简介
CentOS 5 | CentOS 6 | CentOS 7 | 备注 | |
sysvinit | ✅ | ✅ | ✅ | 第⼀代,传统,兼容最多/etc/init.d/、/etc/rc.X |
upstart | ❌ | ✅ | ❌ | 第⼆代,形似systemd雏形/etc/init/ |
systemd | ❌ | ❌ | ✅ | 第三代,配合cgroup,systemd完全接管整个系统/usr/lib/systemd/ |
sysvinit、upstart、systemd常⽤命令
动作 | sysvinit | upstart | systemd |
查看 | service mytest status | initctl status mytest | systemctl status mytest.service |
启动 | service mytest start | initctl start mytest | systemctl start mytest.service |
关闭 | service mytest stop | initctl stop mytest | systemctl stop mytest.service |
强杀进程 | kill -9 PID | kill -9 PID | systemctl kill mytest.service –signal=9 |
重启 | service mytest restart | initctl restart mytest | systemctl restart mytest.service |
重载 | service mytest reload | initctl reload mytest | systemctl reload mytest.service |
开机启动 | chkconfig mytest on | /etc/init/mytest.conf⾥配置start on runlevel [3] | systemctl enable mytest.service |
runlevel运⾏级别
运⾏级别 | CentOS 6 | CentOS 7 |
---|---|---|
0 | halt | runlevel0.target → poweroff.target |
1 | Single user mode | runlevel1.target → rescue.target |
2 | Multiuser, without NFS | runlevel2.target → multi-user.target |
3 | Full multiuser mode | runlevel3.target → multi-user.target |
4 | unused | runlevel4.target → multi-user.target |
5 | X11 | runlevel5.target → graphical.target |
6 | reboot | runlevel6.target → reboot.target |
查看 | cat /etc/inittab | systemctl get-default |
更改 | 编辑/etc/inittab | systemctl set-default multi-user.target |
立即切换 | init 5 | systemctl isolate graphical.target |
⽇志查询(⼀)
-
CentOS 6
-
⼿⼯在/var/log/messages、/var/log/dmesg、/var/log/secure,麻烦且效率低
-
CentOS 7
-
统⼀使⽤journalctl,可以使⽤多个条件匹配,⽐如时间段、服务名、⽇志级别等等
⽇志查询(⼆)
journalctl常⽤命令 | 作⽤ | CentOS 6上的操作 |
---|---|---|
journalctl | 所有⽇志,包含系统、内核等等 | ⼿动在对应⽇志⽂件中grep |
journalctl –dmesg | 查看当前开机后的内核⽇志 | dmesg |
journalctl –boot | 查看当前开机后的⽇志 | 先查当前开机启动时间,然后cat /var/log/… |
journalctl –boot=-1 | 查看上⼀次启动的⽇志 | 查询上次开机到当前开机之间时间,然后cat |
journalctl –since=“2018-08-01 12:00:00” | 查看从指定时间开始到当前的⽇志 | ⼿动在⽇志⾥grep |
journalctl –since=yesterday –until=today | 查看昨天0-24点的⽇志 | ⼿动在⽇志⾥grep |
journalctl -n 20 | 查看最后20⾏ | tail -n 20 |
journalctl -f | 实时滚动显示最新⽇志 | tail -f |
journalctl -e | 直接翻到最后 | tail |
journalctl -u mytest.service | 查看指定服务⽇志 | 先查询⽇志保存路径,然后再cat查看 |
journalctl -p 0 | 查看指定⽇志级别的⽇志,⽇志级别从0到7 | 通过syslog将不同级别的⽇志放到不同⽂件中 |
journalctl -u mytest.service -o json-pretty | 查看每条⽇志详细信息(包含元信息) | ⽆ |
journalctl –disk-usage | 查看⽇志占⽤的磁盘空间 | du -shx /var/log/messages等 |
实现守护进程
-
CentOS 6
-
sysvinit需要⾃⾏实现
-
upstart和systemd类似,将程序运⾏在前台即可
-
CentOS 7
-
由systemd启动,将程序运⾏在前台即可
-
服务脚本
-
sysvinit
-
⾃⾏实现start、stop、restart、reload、status等⽅法,没有统⼀规范
-
upstart
-
根据规范编写conf⽂件(形似systemd简化版)
-
systemd
-
根据规范编写unit⽂件即可
sysvinit例⼦ cat > /etc/init.d/mytest «EOF . /etc/rc.d/init.d/functions start() { … } stop() { … } restart() { … } reload() { … } status() { … } case “$1” in start) start ;; stop) stop ;; … esac exit $RETVAL EOF chmod +x /etc/init.d/mytest service mytest start
upstart例⼦ cat > /etc/init/mytest.conf «EOF start on runlevel [3] description “mytest” exec /root/mytest.sh EOF initctl start mytest
systemd例⼦ cat > /usr/lib/systemd/system/mytest.service «EOF [Unit] Description=mytest [Service] Type=simple ExecStart=/root/mytest.sh [Install] WantedBy=multi-user.target EOF systemctl start mytest
PID管理
-
sysvinit
-
需要⽣成PID⽂件,⽤于后期关闭、重启等使⽤
-
upstart
-
⽆需PID⽂件,upstart会记录主进程ID,⼦进程ID没有记录
-
systemd
-
⽆需PID⽂件,所有进程ID由cgroup统⼀接管
内置的资源限制(cpu/mem)
-
CentOS 6
-
除了limit,没有其他限制进程资源的简便⽅法
-
CentOS 7
-
除了limit,还⽀持部分cgroup限制,可对进程做内存限制和cpu资源
限制等 [Service] ExecStart=… MemoryLimit=500M CPUShares=100
服务异常⾃动重启 upstart:
start on runlevel [3] description “mytest” exec /root/mytest.sh post-stop exec sleep 5 respawn respawn limit unlimited systemd:
[Unit] Description=mytest [Service] Type=simple ExecStart=/root/mytest.sh Restart=always RestartSec=5 StartLimitInterval=0 [Install] WantedBy=multi-user.target
写⽇志⽅式(⼀)
-
CentOS 6
-
⾃⾏输出到⽂件中,或通过syslog记录(如logger命令)
-
CentOS 7
-
若程序由systemd启动,只需输出到标准输出或标准错误
写⽇志⽅式(⼆)
-
建议centos7只将应⽤程序的⼀些元信息输出到标准输出或标准错误,⽐如启动成功、启动失败等等
-
不建议将业务⽇志输出到journal。因为journal中所有⽇志都存在⼀个⽂件中,会导致2个问题:
-
如果没有做⽇志持久化,则默认存在内存中,会导致最多⼀半的内存被占⽤
-
存储量很⼤,会导致查询其他⽇志很耗时
-
解决办法:输出到syslog,[Service]⽀持StandardOutput=syslog
指定每条⽇志级别(⼀)
-
CentOS 6
-
通过syslog将不同级别的⽇志输出到不同⽂件
-
CentOS 7
-
只需在输出的每⼀⾏开头加<⽇志级别>
指定每条⽇志级别(⼆)
-
CentOS 7⽇志级别及使⽤⽅法
-
0:emerg
-
1:alert
-
2:crit
-
3:err
-
4:warning
-
5:notice
-
6:info
-
7:debug
#!/bin/bash echo '<0>hello, emerg' echo '<1>hello, alert' echo '<2>hello, crit' echo '<3>hello, err' echo '<4>hello, warning' echo '<5>hello, notice' echo '<6>hello, info' echo '<7>hello, debug'
systemd⽇志永久保存
-
systemd⽇志默认保存在内存中,因此当服务器重启后,就⽆法通过journalctl来查看之前的⽇志
-
解决⽅法
mkdir -p /var/log/journal systemctl restart systemd-journald.service