CentOS 7 V.S CentOS 6

Centos推出已经两年有余了(7.0-1406:7 July 2014),目前有些企业已经在使用。它是基于3.2版本内核的,已经不再区分32和64位。该文只基于我使用过程中发现的,并不全面(但后续我会补充)。

CentOS 7的安装

相比较于6而言,过程更加简单啦。这里没有什么太多需要注意的,只要按照安装引导一步一步执行即可。这里值得一提的是磁盘默认是基于LVM的(自定义分区的时候可以看到)。当然,我们安装的时候可以选用标准分区。

建议分区方案:1:/boot 200M;2:/swap:2048M;3:/usr:20G;4:/:20G;5:/data:剩余

关于SWAP分区大小:8G以下给当前内存的2倍即可,8G以上一律给16G即可(再给大了也是浪费磁盘空间)。

启动级别/模式

我们熟悉的CentOS 6中,系统有7个运行级别(0:关机/1:单用户/2:多用户 – NO NFS/3:多用户/4:保留/5:x11图形界面/6:重启)。而在7中,这7个级别转化为4个target,分别如下:

  • Graphical.target:多人模式,支持图形和命令行两种登录,对应6中的3和5。
  • Multi-User.target: 多人模式,只支持命令行登录,对应6中的3。
  • Rescue.target: 单人模式,对应于之前的1级别
  • Emergency.target: 单人模式,不过系统启动后根目录是只读模式,

emergency.target

我们如果忘记系统的root密码,可以进入该模式进行重置。Centos 7中引入了Grub 2(内核条目选择界面按E编辑,为了不错过该界面,我们启动后可以按几下上下方向键),我们可以发现与之前的grub配置有很大区别,多了很多设置内容。我们这里要进入emergency.target,只需要在”linux16″所在行的最后添加“ rd.break”。这里要特别说明一点,如果之前安装系统选择了非英文的系统语言,此行原本最后一个设置LANG建议改回”en_US.UTF-8″, 否则进入系统命令窗口执行命令可能会出现乱码(当然,我们可以进入系统再修改)。按”ctrl+x”后,我们就进入了emergency.target模式中。

目前,我们的系统是只读的,我们需要重新挂载一下即可。如下:

mount -o remount,rw /sysroot/
chroot /sysroot/ #切换到原始系统
touch /.autorelabel #这句是让selinux生效
echo $LANG
LANG=en
passwd #修改密码
exit #退出
init 6 #重启系统

没错,为了先后兼容,7中仍然支持init + 启动级别的指令。这意味着我们可以用init 0关机、init 6重启那。正统的相关指令为systemctl。进入系统是,我们不难感受到:CentOS7启动速度还是比较快,这得益于之后要说明的systemd服务。

rescue.target: 救援模式

在CentOS 7中,救援模式的进入和6倒区别不大。步骤如下:

  1. BIOS设置光驱启动。
  2. CentOS 7安装选项页面:我们选择troubelshooting。
  3. 在troubleshooting选项界面选择”rescue a CentOS system”即可。
  4. 选择需要进入的救援模式(可写、只读)
  5. 进入所选择的救援模式,执行指令“chroot /mnt/sysimage”,挂载原来的系统


chroot /mnt/sysimage

IP设定

  • 网卡名称不再是eth0、eth1,而是eno+8位数字。
  • dhclient先自动获取IP
  • 默认不再支持ifconfig命令,而是使用ip add查看。不过我们可以自行安装net-tools包(yum install -y net-tools)。
  • 重启网络命令:systemctl restart network.service

至于配置核心选项是一样的。

主机名设置

这一部分不多说啦,直接看看命令。

hostname #5\6\7都是使用该命令查看
hostname putty.biz #只在当前shell中有效
hostnamectl set-hostname putty.biz #设置主机名,直接更改配置文件/etc/hostname中的设置。
hostname status #这个命令不但包括主机名,还有很多其他信息,例如内核、系统版本等

加强版的TAG命令补全

在CentOS中,我们可以让参数也被自动补全。不过,最小化安装是不支持的,我们需要额外手动安装一个RPM包:bash-completion.

yum install -y bash-completion
source /etc/profile
hostnamectl set- #我们试试TAB补全吧。。。

服务相关systemd

在CentOS 6中,我们熟悉的服务相关命令chkconfig、service等不再被提供,取而代之的是systemd(对应的命令是systemctl),使用概况如下:

systemctl enable httpd.service #自启动某服务
systemctl disable httpd.service #禁用开机启动
systemctl status httpd.service #查看服务状态
systemctl list-units --type=service #查看所有服务
systemctl start httpd.service
systemctl stop httpd.service
systemctl restart httpd.service
systemctl is-enabled httpd #查看httpd服务是否开机启动

而对于启动脚本的存放位置,也不再是/etc/init.d/(这个目录也是存在的),而是/usr/lib/systemd/system/.

ls /usr/lib/systemd/system

systemd中的服务是可以并行启动的,只要它们之间不存在依赖关系(支持自动检测服务依赖的服务),这也是为什么CENTOS 7开机启动要更快的原因之一。 不过systemd机制相对6中的init.d机制(顺序启动))要复杂得多。正所谓舍得嘛!

systemd – unit

systemd可以管理所有系统资源,不同的资源称之为Unit.Unit一共分成12种类型,一共分为12种类型,分别为:

  • Service Unit: 系统服务
  • Target Unit: 多个Unit构建的一个组合
  • Device Unit: 硬件设备
  • Mount Unit: 文件系统的挂载点
  • Automount Unit:自动挂载点
  • Path Unit:文件或路径
  • Scope Unit:不是由Systemd启动的外部进程
  • Slice Unit: 进程组
  • Snapshot Unit: systemd快照,可以切回某个快照
  • Socket Unit: 进程间通信的Socket
  • SWAP Unit: swap文件
  • Timer Unit: 定时器

我们在日常运维中经常接触的是前两者。对于Unit,我们需要掌握以下基本命令。

systemctl list-units #列出正在运行的Unit
systemctl list-units --all #列出所有Unit
systemctl list-units --all --state=inactive #列出所有没有运行的
systemctl list-units --failed #列出所有启动失败的,用上面的--state选项过滤也可,效果一样的
systemctl list-units --type=service #列出类型为服务的Unit
systemctl is-active application.service #查看某个服务Unit是否正在运行
systemctl is-failed application.service #查看某个服务是否加载失败
systemctl is-enabled application.service #查看某个Unit是否启用

Systemd – Unit – Target

我们之前提到过对应于6中的启动级别的4种target。它就是将多个Units进行组合。我们甚至可以同时启动多个target。

runlevel #查看最近的运行级别
systemctl list-unit-files --type=target #查看当前系统的所有Target,我们可以看到里面有几个runlevel0-level6的target.它们是做的软连接。所以init 0-6一样可以切换
systemctl list-dependencies multi-user.target #查看一个target中包含的Unit
systemctl get-default #启动时默认的target
systemctl set-default multi-user.target #设置启动时默认的target, 本质是ln -svf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
systemctl graphical.target #默认情况下,我们切换target时,前一个target启动的进程是不会关闭的。
systemctl isolate graphical.target #而这条命令可以改变这种默认行为,将只属于上一个target的unit关闭掉。就相当于init 5

注意:systemd不使用/etc/inittab文件。

target和unit的关联

根据我们之前讲述的知识,target是一系列unit的组合,方便了管理。那么,它们之间的关联有哪些呢?

首先,我们可以通过查看对应的targetname.wants目录(里面大多是软链接)。这里面是对应target要预先加载的一些unit.

其次,我们之前介绍了如何查看某个target下所有的unit,那么我们怎么知道某个unit都跟哪些target有关联呢?

cat /usr/lib/systemd/system/sshd.service #查看[install]下面的内容

最后,systemd主配置文件是/etc/systemd/system.conf。

cat /etc/systemd/system.conf

另外,我们需要了解的是/etc/systemd/system/default.target.

ls -l /etc/systemd/system/default.target #systemctl set-default所设置的运行模式
cat /etc/systemd/system/default.target
##
[Unit]
Description=Multi-User System //描述
Documentation=man:systemd.special(7)
Requires=basic.target //依赖的target
Conflicts=rescue.service rescue.target //冲突的target
After=basic.target rescue.service rescue.target //预先启动的target
AllowIsolate=yes //将之前的systectl isolate指令
##

防火墙firewalld

CentOS 6中的防火墙程序netfilter也被替换为firewalld。不过,为了保持先后兼容性,我们仍然可以使用netfilter,方法如下:

systemctl stop firewalld
systemctl disable firewalld
yum installed -y iptables-services
systemctl enable iptables
systemctl start iptables

之后,我们就可以按照Netfilter那一套去操作。

CentOS 7中的firewalld机制类似于windows防火墙,是基于场景的(例如办公家庭网络)。当然,我们可以在此基础上去添加自定义规则。那么,它和之前的netfilter主要区别在哪里?firewalld的规则是动态的,更新了规则不需要重新加载配置。在netfilter中,更新了iptables规则(/etc/sysconfig/iptables),我们需要手动加载或重启iptables服务。这个过程等同于将之前的规则全部清空,再把配置文件里面的规则重新加载起来。

不管是netfilter还是firewalld,底层都是通过iptables来配置规则的。在firewalld中有zone和service两个概念。每个zone里面的iptables规则不一样,CentOS 7中预设了9个zone,默认的zone是public.

  • drop – 丢弃:只能发送出去请求,任何接收到的网络数据包都将会被丢弃。
  • block – 限制:任何接收的网络连接都被拒绝,反馈IPV4的icmp-host-prohibited信息和IPV6的icmp4-adm-prohibite信息
  • public – 公共:在公共区域类使用,不能相信网络内的其他计算机,只能接收经过选取的连接,就是windows防火墙弹出提示的public,比如咖啡馆等地方的网络。
  • external – 外部:启用了伪装功能的外部网中的路由器服务器。不能信任那只网络的其他计算机,只能接收经过选择的连接
  • dmz – 非军事区:用于非军事区的电脑,此区域可以公开访问,可以优先地进入内部网,仅接收经过选择的连接
  • work – 工作:用于工作区,基本可以相信网络内的其他电脑。仅接受经过选择的连接
  • home – 家庭:用于家庭网络,可以基本信任网络内的其他计算机。仅接受经过选择的连接
  • internal – 内部:用于内部网络,可以基本信任网络类的其他计算机不会有威胁,仅接受经过选择的连接
  • trusted – 信任:可以接受所有的网络连接


firewall-cmd --get-zones //获取所有预设的zone
firewall-cmd --get-default-zone //查看系统默认的zone
iptables -nvL //我们可以看到有关于public的链

firewalld zone相关指令


firewall-cmd --get-default-zone
filewall-cmd --set-default-zone=work #设置默认的zone,接口连入NetWorkManager
firewall-cmd --get-zone-of-interface=eno16777736 #查看指定网卡所属的zone
firewall-cmd --zone=public --add-interface=lo #给指定的网卡设置zone
firewall-cmd --zone=dmz --change-interface=lo #针对网卡更改zone
firewall-cmd --zone=dmz --remove-interface=lo #针对网卡删除zone
firewall-cmd --get-active-zones #查看网卡所在的zone

其中,我们是可以做到不同的网卡设定不同的ZONE。默认情况下,我们使用set-default-zone选项指定zone时,所有的网卡都被设置为指定的zone.

firewalld zone配置文件


ls /etc/firewalld/
ls /etc/firewalld/zones/ #这里面是当前系统默认zone的配置文件
ls /usr/lib/firewalld/zones/ #这里是所有9个预设zone的配置文件

注意:/etc/firewalld/目录下才是当前系统生效的各项配置。而/usr/lib/firewalld/中是预设的一些配置样例!

firewalld services


ls /usr/lib/firewalld/services/
cat /usr/lib/firewalld/services/ssh.xml #sshd的配置文件

以上目录中的配置文件都不是在当前系统生效的配置文件,生效的配置文件在/etc/firewalld/目录中。与CentOS 6中不同,我们很多时候不用去记各项服务的tcp/udp端口,在7中预设了70+种服务(上面的/usr/lib/firewalld/services/目录中,最小化安装是载入了50多种)以应对各种不同的需求。

firewall-cmd --get-services #列出当前预设的所有服务
firewall-cmd --get-services |awk '{print NF}' #列出所有预设的服务配置,统计结果条数,我这里是54条。
ls /usr/lib/firewalld/services/ |wc -l #根上面效果是一样的
firewall-cmd --list-services #列出当前zone下支持的服务,其实我们查看/usr/lib/firewalld/zones/public.xml中配置是一致的
firewall-cmd --zone=public --list-services #查看某个zone下的services
firewall-cmd --zone=public --add-services=http #为指定zone添加一条服务,并不会直接保存到配置文件中
firewall-cmd --zone=public --add-services=http --permanent #为public添加服务http,并保存到其配置文件/etc/firewalld/public.xml中
firewall-cmd --zone=public --remove-services=http --permanent #在某个zone上删除http服务

通过观察zone的配置文件,我们可以发现,它里面是列举了当前zone可以通过的services。以上的命令其实也就是在修改这些对应的配置文件。

firewalld自定义规则

假设我们SSHD端口由默认的修改成1333啦,那么,基于之前的知识,我们可以直接去修改服务配置文件sshd.xml。除此之外,我们也可以通过命令尾当前zone直接添加放行的端口。

firewall-cmd --add-port=13333/tcp --permanent
cat /etc/firewalld/zones/public.xml
###
...
  #我们会发现系统当前的zone配置文件多了一条配置信息
###

那么,我们可不可以手动去修改上面的配置文件,直接添加一条配置规则了。答案是肯定的。我们只需要记得修改后重载一次即可。

vim /etc/firewalld/zones/public.xml
###
添加自定义规则
##
cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ #修改某个预设的services端口
vim !$
###
改掉默认的端口21
###
vim /etc/firewalld/zones/work.xml #查看一下当前网卡所配置zone时候有开放ssh service
firewall-cmd --reload #重新加载配置文静,不会中断已连接用户
firewall-cmd --complete-reload #彻底重载

除了增加一个端口,我们还可以添加一个端口范围。以及一些其他操作如下:

firewall-cmd --add-port=2000-4000/tcp #为当前系统zone添加一段端口范围
firewall-cmd --permanent --zone=home --add-port=8080/tcp #为特定的zone增加端口
firewall-cmd --permanent --zone=home --add-forward-port=port=22:proto=tcp:toaddr=127.0.0.2 #启用端口转发,将到22端口的请求转发到127.0.0.2