CentOS/RHEL7 变化汇总

CentOS/RHEL7 带来了很多系统配置和管理上的变化,虽然有些不习惯,但大家还是应该去适应它们,而不是因循守旧,因为变化总是有原因的,它们大致都代表了未来的趋势,你不可能一直停留在原地踏步。

tab补全参数

# 最小化安装默认没有安装 bash-completion
yum -y install bash-completion # 安装完后重启

grub升级至2.0

bootloader 的配置文件也调整至 /boot/grub2/grub.cfg

开机修改 root 密码
以 ArchLinux 为例,CentOS 7.x 类似,只需注意:
1) 将ro改为rw
2) 将init=/bin/bash改为init=/sysroot/bin/sh
3) 启动后,使用chroot /sysroot/切换根目录;

第一步,按上下方向键,选择内核:
第一步,选择内核

第二步,按 E 键,进入编辑界面:
第二步,编辑参数

第三步,按 Ctrl+X 启动系统,修改密码:
第三步,修改密码

开机进入指定 target(systemd)
编辑内核参数
输入密码即可

/etc/inittab

在 CentOS6 中,我们可以通过修改/etc/inittab文件来修改运行级别;
但是在 CentOS7 中,这个文件已经没用了,修改运行级别需要使用 systemctl。

cat /etc/inittab可以看到以下说明:

# systemd uses 'targets' instead of runlevels. By default, there are two main targets: 
# 
# multi-user.target: analogous to runlevel 3 
# graphical.target: analogous to runlevel 5 
# 
# To view current default target, run: 
# systemctl get-default 
# 
# To set a default target, run: 
# systemctl set-default TARGET.target

因此,我们需要使用下面的方法来修改运行级别:

# 查看默认运行级别
systemctl get-default

# 可设置的运行级别
runlevel0.target -> poweroff.target
runlevel1.target -> rescue.target
runlevel2.target -> multi-user.target
runlevel3.target -> multi-user.target
runlevel4.target -> multi-user.target
runlevel5.target -> graphical.target
runlevel6.target -> reboot.target

# 设置默认运行级别
systemctl set-default runlevelN.target

/etc/hostname

在 CentOS6 中,修改主机名需要修改/etc/sysconfig/network文件;
在 CentOS7 中,修改主机名只需修改/etc/hostname文件,更简单了。

systemd取代sysvinit

在 CentOS6 中,使用chkconfig管理自启服务,使用service运行/停止服务;
在 CentOS7 中,这两个命令都被systemctl给替代了,使用 systemd 管理系统。

# systemd 将系统资源统称为 unit 单元
service.service         # 系统服务
socket.socket           # 进程间通信的套接字
device.device           # 系统设备
mount.mount             # 挂载点
automount.automount     # 自动挂载点
swap.swap               # 交换分区
target.target           # 启动目标,类似运行级别的概念
path.path               # 文件路径
timer.timer             # 定时任务
slice.slice             # 进程控制组
scope.scope             # D-Bus创建的单元

# 查看 unit 单元
systemctl                               # 查看所有已运行的单元      (active)
systemctl list-units                    # 查看所有已运行的单元      (active)
systemctl list-units -t service         # 查看所有已运行的服务      (active && service)
systemctl list-units -t timer           # 查看所有已运行的定时任务  (active && timer)
systemctl list-units --failed           # 查看所有运行失败的单元    (loaded && failed)
systemctl list-units -a                 # 查看所有已加载的单元      (loaded)
systemctl list-unit-files               # 查看所有已安装的单元      (installed)
systemctl list-unit-files -t service    # 查看所有已安装的服务      (installed && service)
systemctl list-unit-files -t timer      # 查看所有已安装的定时任务  (installed && timer)
systemctl list-unit-files -t service | grep enabled     # 查看所有自启动的服务
systemctl list-unit-files -t service | grep disabled    # 查看所有非自启的服务

# 管理后台服务
systemctl start nginx.service       # 启动 nginx
systemctl stop nginx.service        # 关闭 nginx
systemctl restart nginx.service     # 重启 nginx
systemctl reload nginx.service      # 重载 nginx 配置文件
systemctl status nginx.service      # 查看 nginx 运行状态
systemctl -l status nginx.service   # 查看 nginx 运行状态(全)

# 管理开机自启服务
systemctl enable nginx.service      # 设置 nginx 开机自启
systemctl disable nginx.service     # 取消 nginx 开机自启
systemctl is-enabled nginx.service  # 查看 nginx 是否自启
systemctl list-unit-files -t service | grep enabled # 查看所有开机自启的服务

# 关机、重启、睡眠
systemctl halt      # 关闭系统,但不断开电源
systemctl poweroff  # 关闭系统,并且断开电源
systemctl reboot    # 重启系统
systemctl suspend   # 挂起系统

# 运行级别相关
systemctl get-default                   # 查看默认运行级别
systemctl set-default runlevelN.target  # 设置默认运行级别
systemctl isolate graphical.target      # 切换当前运行级别
systemctl rescue    # 进入单用户模式
systemctl emergency # 进入紧急救援模式

# 重新扫描新的或有变动的 unit 单元
systemctl daemon-reload

# 查看系统日志信息
journalctl          # 查看所有已记录的日志
journalctl -b       # 查看本次系统启动日志
journalctl -k       # 查看内核日志,dmesg
journalctl -n       # 查看最新的 10 条日志
journalctl -n20     # 查看最新的 20 条日志
journalctl -f       # 实时滚动查看最新日志
journalctl -u nginx.service     # 查看 nginx 服务的相关日志
journalctl -fu nginx.service    # 追踪 nginx 服务的最新日志

# 查看当前日期和时间
timedatectl                     # 查看系统时间
timedatectl status              # 查看系统时间,同上
timedatectl set-ntp true        # 开启网络时间同步
timedatectl list-timezones      # 列出所有可用时区
timedatectl set-timezone Asia/Shanghai # 设置系统时区

# 设置系统的主机名
hostnamectl                     # 查看主机名信息
hostnamectl status              # 查看主机名信息,同上
hostnamectl set-hostname NAME   # 永久修改主机名

# locale 本地化设置
localectl                       # 查看本地化信息
localectl status                # 查看本地化信息,同上
localectl list-locales          # 列出可用 locales
localectl set-locale LOCALE...  # 设置系统 locales

# login 登录信息
loginctl                # 列出当前 session 会话
loginctl list-sessions  # 列出当前 session 会话,同上
loginctl list-users     # 列出当前登录用户
loginctl show-user root # 显示指定用户信息

# 查看启动耗时
systemd-analyze         # 获取开机时间信息
systemd-analyze blame   # 自启服务的启动耗时

/etc/rc.local

/etc/rc.local已经不存在了,如果需要请创建 rc-local 服务;

/etc/sysctl.conf

/etc/sysctl.conf中的默认配置移至/usr/lib/sysctl.d/00-system.conf
我们可以在/etc/sysctl.d/目录下创建自定义的 conf 文件,来覆盖默认配置;
如需立即生效,不能直接使用sysctl -p,须执行sysctl -p /etc/sysctl.d/*.conf

新的网卡名称

在 CentOS6 中,以太网卡的名称一般为 ethN;
在 CentOS7 中,以太网卡的名称一般为 ensN;

网卡命名规则如下:

  • en,for Ethernet,以太网;
  • wl,for wireless LAN (WLAN),无线局域网;
  • ww,for wireless wide area network (WWAN),无线广域网;

70-persistent-net.rules

/etc/udev/rules.d/70-persistent-net.rules在 CentOS7 中已经不存在了;
使用虚拟机的朋友可能对其有印象,每次克隆虚拟机时都要修改这个文件,修改完还必须重启。
好在现在不需要了,如果对虚拟机进行了克隆,我们只需要修改网卡配置文件。

iproute2取代net-tools

# 安装 iproute(一般不需要,已经默认安装了)
yum -y install iproute

# ip 命令
ip addr show                        # 查看所有网卡地址信息
ip addr show dev ens33              # 查看 ens33 网卡信息
ip addr add 10.0.0.1/32 dev ens33   # 给网卡添加一个新的 IP
ip -c addr show                     # 显示颜色,高亮(新版本)
ip -d addr show                     # 显示细节信息
ip -s addr show                     # 统计网卡信息
ip -s -h addr show                  # 统计网卡信息,易读

ip link set dev ens37 up    # 激活网卡 ens37
ip link set dev ens37 down  # 取消激活 ens37

ip route list                               # 查看 main 主路由表
ip route list table main                    # 查看 main 主路由表,同上
ip route list table default                 # 查看 default 默认路由表
ip route list table local                   # 查看 local 路由表(不可修改)
ip route add 0/0 via 192.168.1.1 dev ens33  # 在 main 路由表添加默认路由

ip rule list                                    # 查看当前路由策略
ip rule add fwmark 0x1/0x1 pref 100 table 100   # 添加一条路由策略
ip rule del pref 100                            # 删除一条路由策略

# ss 命令
ss -s       # 打印 socket 统计信息
ss -anp     # all sockets
ss -anp4    # ipv4 sockets
ss -anp6    # ipv6 sockets
ss -anpt    # tcp sockets
ss -anpu    # udp sockets
ss -anpx    # unix sockets
ss -anpw    # raw sockets
ss -lnp     # all listening-sockets
ss -lnp4    # ipv4 listening-sockets
ss -lnp6    # ipv6 listening-sockets
ss -lnpt    # tcp listening-sockets
ss -lnpu    # udp listening-sockets
ss -lnpx    # unix listening-sockets
ss -lnpw    # raw listening-sockets

NetworkManager

从 CentOS7 开始,网络由NetworkManager服务负责管理,之前的 network 脚本只是为了兼容。
NetworkManager 有两个主要配置工具:nmtui(文本用户界面)、nmcli(命令行工具)。

nmtui
nmtui 类似 CentOS6 的 setup(在 CentOS7 中 setup 已经没啥用了)工具,提供一个文本图形界面;
可以用来简单的配置连接、启用/禁用连接、更改主机名;系统初装之后可以第一时间用 nmtui 配置网络,挺方便的。

nmcli
nmcli 是 NetworkManager 的主要配置工具,因此,需要熟练掌握:

添加多 IP:
ip addr add,用于临时添加 IP,重启失效;
ifcfg-eth0:x,这种方式已经失效,不能使用;
如需添加多 IP,请使用 nmcli 工具,或者手动修改配置文件,添加字段IPADDRx/PREFIXx/GATEWAYx

DNS 设置:
/etc/resolv.conf不能直接手动修改,要修改 DNS 请使用 nmcli,或在配置文件中添加字段DNS1/DNS2/DNS3,重载网卡配置文件后自动覆盖/etc/resolv.conf

hostname 设置:
/etc/hostname文本文件用来保存主机名,永久修改使用hostnamectl set-hostname NAME

全局默认网关:
/etc/sysconfig/network可用于配置全局网关(默认空文件)

静态路由配置:
ip route list,查看当前路由表(main)
ip route add 192.168.1.0/24 via 192.168.2.254,添加静态路由条目(重启失效)
ip route add 172.16.0.0/16 dev eth0,添加静态路由条目(重启失效)
ip route del 10.0.0.0/8,删除静态路由条目(重启失效)

永久静态路由配置:
经测试,在 CentOS7 中,/etc/sysconfig/static-routes已不再使用!
需要新建/etc/sysconfig/network-scripts/route-INTERFACE(INTERFACE 为对应网卡名称)
然后根据需要,在配置文件中添加以下配置,重启可生效,如需立即生效,可使用 nmcli 重载配置文件:
192.168.2.0/24 via 10.0.0.254
192.168.1.0/24 dev eth0

firewalld取代iptables

在 CentOS7 中,防火墙用户空间配置工具被替换为了firewalld,特点是引入了 zone 的概念,支持动态管理;
但是内核空间还是用的 netfilter 模块,因为感觉 zone 很麻烦、不直观,因此我还是喜欢iptables配置工具。

如想了解关于 netfilter/iptables 的知识,可以参考我之前的这篇博客 - iptables 详解

禁用 firewalld,并安装 iptables-service:

yum -y install iptables-services
systemctl disable firewalld
systemctl enable iptables