配置Firewalld防火墙防御ICMP攻击

提到ICMP大家应该都很熟悉,可能有人会说:不就是ping吗?但是说到ICMP攻击以及相关防御措施可能就有的人不是非常清楚了。

ICMP的概念

要想理解ICMP攻击以及防范我们还得从ICMP的概念说起,ICMP是“Internet Control Message Protocol”的缩写,意思是“Internet控制消息协议”,他主要用于在不同主机、路由器等设备之间传递控制消息,比如网络是否可以联通、路由 设备地址的发现、路由路径是否合理等内容。

ICMP攻击

ICMP协议被攻击的方法有很多种,比如的“Ping of Death”、使用ICMP数据包发起DDOS攻击、redirect攻击等等,下面学生简单给大家介绍一下。

“Ping of Death”的原理是当发送的数据包大小超过64KB(规定最大64KB)后接收信息的主机就会出现内存分配错误,进一步会导致TCP/IP堆栈崩溃,甚至主机死机!不过这一漏洞在新版的操作系统中已经解决了。

ICMP 的DDOS简单来说就是一直不停地发送ICMP数据包从而占满被攻击主机的带宽,当然,更进一步还可以使用一些手段将流量进行放大,比如将源地址设置为被 攻击主机的“echo-request”类型报文广播给很多第三方主机,这时这些接收到报文的主机就会给被攻击目标主机返回“echo-replay”报 文,这样流量就被放大了。

要理解redirect攻击,首先要明白redirect的作用,学生给大家举个例子大家就明白了,比如有个快递 需要从北京发往广州,结果北京发到沈阳的中转站了,这时候沈阳就觉得不对呀,要往广州发应该往南边发才对怎么能往北边发呢?所以沈阳站就会跟北京站联系, 告诉他:你发的不对,你应该往南边的XXX站发送才对。ICMP中的redirect就是起这个作用的,当路由设备发现某个数据包经过自己不是最优路径时 就会给源地址发一个redirect数据包,告诉对方发的路径不合适,并且指出应该发往的地址。这个功能是很有用的,不过如果被攻击者使用情况就完全不一 样了,他们可以使用这一功能将正常(合理)的路由地址给修改为一个不合理的甚至不存在的地址,这样就会给通讯造成问题,另外,有一些还会将目标地址设置为 他们自己可以控制的主机的地址,这样就可以截获数据了!跟redirect相关的还有router-advertisement、router- solicitation等类型的ICMP数据包。

当然,除了这三种还有很多攻击的类型,比如我们下面会说到的destination-unreachable、source-quench、time-exceeded等类型的攻击。

可能看到这里有的读者就觉得不容易理解了:echo-request、redirect、destination-unreachable等等到底是什么东西呢?其实这都是ICMP的类型,下面学生就来给大家介绍ICMP的类型。

ICMP的类型

ICMP 数据包主要包含三部分内容:类型、代码和附加数据,其中的类型和代码属于包头,代码(code)相当于类型(type)下的细分子类型,我们也可以理解为 他们共同来决定一个ICMP包的类型,比如学生上面给大家讲的redirect的type为5,不过5这个type下面还有4个code——0,、1、 2、3,他们所表示的含义如下表所示

表1:ICMP包Redirect类型表

系统管理

具体更多的代码学生就不在这里罗列了,大家很容易就可以找到。在ICMP数据包中type和code就像excel中的两个单元格,只要将相应的数据填入,主机就可以知道这个ICMP包的类型了。

这里的type和code我们当然是不需要记的,在使用的时候只需要用名字就可以了,比如type为8的数据包我们直接写Echo request、type为0的数据包我们直接写Echo Reply就行了,下面学生简单地给大家介绍几个常见的类型

  • Echo request:需要回应的请求,也就是我们常说的ping请求
  • Echo Reply:对ping的回应报文(pong)
  • Destination Unreachable:目标不可达
  • Source Quench:源地址资源紧张,正常情况下当我们要发送数据的路由设备请求过多时就会发出这种ICMP包
  • Time Exceeded:超时,比如TTL用完后就会产生这种类型的数据包

Firewalld针对ICMP攻击的防御方法

firewalld中有专门针对icmp报文的配置方法,而且使用起来也非常简单,我们只需要将firewalld所支持的icmp类型配置到所使用的zone中就可以了,要查看firewalld所支持的icmp类型可以使用下面的命令

firewall-cmd [--permanent] --get-icmptypes

默认的返回结果如下

destination-unreachable echo-reply echo-request parameter-problem redirect 
router-advertisement router-solicitation source-quench time-exceeded

这里的类型前面学生基本都给大家介绍过了,下面来学生来给大家讲怎么使用。跟icmptype相关的命令主要有四个

firewall-cmd [--permanent] [--zone=zone] --list-icmp-blocks
firewall-cmd [--permanent] [--zone=zone] --add-icmp-block=<icmptype>
firewall-cmd [--permanent] [--zone=zone] --remove-icmp-block=<icmptype>
firewall-cmd [--permanent] [--zone=zone] --query-icmp-block=<icmptype>

他们分别用于列出zone中所阻止的所有icmp类型、添加、删除和查询某个具体的icmp类型,如果指定zone则对具体zone进行操作,否则对当前活动的zone进行操作。

icmp配置文件的结构也非常简单,除了short和description外只有一个destination节点,可以设置对ipv4和ipv6的支持与否。

补充与建议

对于firewalld中的icmp设置大家要特别注意下面三点

1、firewalld只可以阻止指定类型的icmp包,没有其他更多的配置选项

2、如果使用drop、reject这些zone的话,默认所有icmp类型都会阻塞

3、默认情况下firewalld中所配置的icmp类型主要是针对入包的,而对于主机发出的包是不会拦截的。另外,在前面学生跟大家说过firewalld是一款有状态的防火墙,也就是说不同连接之间的关系firewalld在内部是有记录的,所以即使我们将echo-reply设置到zone中之后再去使用本机ping其他主机也是可以收到回复的,这是因为firewalld底层可以识别出那个echo-reply是我们发生去请求的回应。

对于具体哪个类型应该阻止,哪个应该放行大家需要根据自己的实际情况来设定,学生下面给大家提供一些思考的方向和建议。

  • destination-unreachable:当收到这种类型数据包之后相应地址的连接将会被断开,如果是攻击者伪造的数据包,那么会将我们的很多正常连接断开。当将其设置到zone中后我们本机发送的请求还是可以收到destination-unreachable类型回复的,只是直接发给我们的destination-unreachable数据包进不来了,所以建议大家可以阻止。

  • echo-request:主要用于接收ping请求,阻塞之后我们的主机将不可被ping,不过打开后又有可能被攻击,有种惯用的做法是设置开通的频率,比如1秒钟只可以被ping一次,不过这种功能直接使用学生上面给大家介绍的方法是无法设置的,不过没关系,当学习了学生下一节将要给大家介绍的firewalld中的direct之后就可以设置了。

  • echo-reply:这是回应ping信息的包,一般来说我们应该将其阻止,因为他跟destination-unreachable一样,如果是我们本机发出的即使设置了阻止也还是可以接收到的。

  • parameter-problem:当接收到的报文参数错误,无法解析时会返回这种类型的报文。

  • redirect:这种报文学生在前面已经给大家详细介绍过,这里就不再重述了。

  • router-advertisement和router-solicitation:这是一对报文,他们的作用是用来发现路由设备的地址,主机发出router-solicitation类型数据包来查找路由设备,路由设备可以发出router-advertisement类型ICMP数据包来告诉主机自己是路由设备

  • source-quench:这个学生也给大家介绍过了,当源地址设备(比如路由设备)资源紧张时就会发出这种数据包

  • time-exceeded:数据包超时。

最后还是那句话,没有最优配置方法(否则就不需要配置了),大家需要根据自己的实际情况进行配置。

firewalld规则配置介绍

在基于RHEL7的服务器上,firewalld是一个可动态管理的防火墙服务,提供IPv4和IPv6防火墙规则定义和区域的支持。它可以直接代替iptables管理服务器的网络活动,能直接作用于内核的netfilter代码。
本文简要介绍了如何通过firewall-cmd命令管理和配置防火墙,假定所有命令都以root权限执行。

一. 启动和状态

1. 查询firewalld运行状态

$ firewall-cmd --state

如果返回not running,表示服务没有启动,输入下面命令启动firewallD

$ service firewalld start

对firewalld做了修改,通过下面的命令执行

$ firewall-cmd --reload

配置好firewalld之后,通过systemd命令使服务开机启动

$ systemctl enable firewalld

二. 规则设置

1. 查询firewalld当前规则

$ firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client http ssh ssh-custom
ports:
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:

2. 添加删除service规则

添加httpservice

$ firewall-cmd --permanent --zone=public --add-service=http

删除httpservice

$ firewall-cmd --permanent --zone=public --remove-service=http

3. 添加删除port规则

允许放行7777 TCP端口

$ firewall-cmd --permanent -zone=public --add-port=7777/tcp

允许放行多个端口

$ firewall-cmd --permanent -zone=public --add-port=7777-8000/tcp

删除端口

$ firewall-cmd --permanent --zone=public --remove-port=7777/tcp

查看当前打开的端口

$ firewall-cmd --zone=public --list-ports

4. 通过”RICH LANGUAGE”创建复杂规则

rich rule 命令的格式和结构如下所示

rule [family="rule family"]
[ source [NOT] [address="address"] [mac="mac-address"] [ipset="ipset"] ]
[ destination [NOT] address="address" ]
[ element ]
[ log [prefix="prefix text"] [level="log level"] [limit value="rate/duration"] ]
[ audit ]
[ action ]

NOTE: 一条rule作用于一个特定的zone。一个zone可以包含多条rule。如果几条rule互相影响或产生冲突,第一条匹配的rule会生效。

  • 封锁一个IP
$ firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.1.1' reject"
  • 封锁一个IP段, 192.168.1.0 ~ 192.168.1.254
$ firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.1.0/24' reject"

更详细rich rule的介绍参见redhat文档:
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html

5. 关于192.168.1.0/24的说明

192.168.0.0/24
表示网络码占24位,就是说该网络上可以有254个主机(2^8-2)
IP范围:192.168.0.1~192.168.0.254 192.168.0.255是广播地址,不能被主机使用

192.168.0.0/16
表示网络码占16位,也就是说该网络上可以有65534个主机(2^16-2)
IP范围:192.168.0.1~192.168.255.254 192.168.255.255是广播地址,不能被主机使用。

Firewalld常用命令介绍

Firewalld防火墙中所使用到的命令可以分为三大类:安装卸载、维护和策略操作。

安装

在Centos7中默认已经安装了firewalld,如果需要自行安装,可以直接使用yum安装

[[email protected] ~]# yum install firewalld

如果需要使用图形化配置工具还需要安装firewall-config

[[email protected] ~]# yum install firewall-config

这样firewalld就安装完成了,不过要注意firewalld跟iptables不能同时使用,所以在使用firewalld之前首先需要将iptables停用。

维护命令

firewalld的维护相对来说是非常简单的,其命令主要分为三大类:启动停止和查询状态、设置开机自动启动以及更新规则。

启动停止和查询状态

在Centos7中默认将原来的服务管理工具service升级为了systemctl,其实原来的service只是一个脚本执行工具,而systemctl的功能非常强大,关于systemctl的详细用法大家可以阅读linux中国的一篇文章,地址是:https://linux.cn/article-5926-1.html,这篇文章写的非常详细,所以学生就不再给大家做补充了,下面来说一说怎么用它来操作firewalld。

启动

[[email protected] ~]# systemctl start firewalld

停止

[[email protected] ~]# systemctl stop firewalld

重启

[[email protected] ~]# systemctl restart firewalld

查询状态

[[email protected] ~]$ systemctl status firewalld

另外,对于firewalld来说还可以使用自身的firewall-cmd工具来查询运行状态

[[email protected] ~]$ firewall-cmd --state

设置开机自动启动

设置开机自动启动也是使用systemctl来操作的,命令如下

启用开机自动启动

[[email protected] ~]$ systemctl enable firewalld

禁用开机自动启动

[[email protected] ~]$ systemctl disable firewalld

查看自动启动状态

[[email protected] ~]$ systemctl is-enabled firewalld

当然,systemctl的这些命令不只适用于firewalld,也适用于其他服务,使用时只要将firewalld换成相应服务的名称就可以了。

更新规则

直接使用firewall-cmd修改的规则是不需要更新就可以直接生效的,但是如果加了–permanent参数,或者直接编辑xml文件之后就需要我们手动reload了,firewall-cmd提供了两个更新规则的参数:–reload和–complete-reload,前者只是更新需要更新规则,而且更新的过程中不会影响现有的连接,而后者在更新时会将所有的规则清除掉然后重建,而且为了安全考虑,在更新之前首先会将策略设置为DROP,等更新完成之后再恢复为ACCEPT,这样就会对现有连接造成影响,所以如果没有特殊需求我们应该尽量使用前者。具体命令如下

[[email protected] ~]# firewall-cmd --reload
[[email protected] ~]# firewall-cmd --complete-reload

策略操作

对于firewalld来说最重要的就是策略操作了,策略操作主要有三种方法:使用firewall-config操作、使用firewall-cmd操作和直接编辑xml文件,学生在上节已经给大家介绍过了,firewall-config是图形化工具,firewall-cmd是命令行工具,我们这里主要以命令行工具为主来给大家介绍。

firewall-cmd中关于规则的命令非常多,如果在这里全部列出来再给大家解释一遍应该效果也不会太好,所以学生在后面讲到具体相关内容时再给大家讲相应的命令,比如讲到zone的时候给大家介绍跟zone相关的命令,这样大家更容易理解和记忆。

firewall-cmd中的命令虽然非常多,但是有四大类使用频率非常高的命令:–add-xxx、–remove-xxx、–query-xxx、–get-xxx以及–list-xxx,这里前两个非常容易理解,一个是添加一个是删除,而后三个从名字上就不太容易区分了,下面学生给大家解释一下。

  • –query-xxx主要用于布尔值的查询,比如
[[email protected] ~]$ firewall-cmd --zone=public --query-service=ssh

这个命令用于查询在public这个zone中是否包含ssh这个服务。

  • –get-xxx主要用于获取特定的内容,比如
[[email protected] ~]$ firewall-cmd --get-zones

这样就可以获取到预设的zones,默认情况下返回结果为

block dmz drop external home internal public trusted work
  • –list-xxx主要用于按一定条件进行查询(不过有的list命名也不需要条件),比如
[[email protected] ~]$ firewall-cmd --zone=public --list-services

这个命令可以返回public这个zone中所包含的services。

query还是比较容易理解的,但是get和list从字面上并不容易区分,刚开始学生以为get命令用于获取单个结果,list用于获取多个结果,但后来发现并不是这样。当然,我们在使用的时候按照文档中的说明来使用就可以了。

另外,在firewall-cmd中有一个比较特殊的参数:

–permanent,他表示是否将修改后的规则保存下来,如果不加这个参数,那么所做的修改当时会立即生效,但是在firewalld重启之后就会丢失,而加上这个参数后所做的修改就会永久保存下来,不过这时的修改不会立即生效而是需要reload后才可以生效。其实这个也非常容易理解,当不加–permanent修改规则时firewalld会实际修改运行时的规则,而如果加了这个参数firewalld其实是去修改的xml配置文件,和我们直接编辑xml文件一样,所以就需要reload才可以生效。

CentOS 7 firewalld防火墙简单配置介绍

学习apache安装的时候需要打开80端口,由于centos 7版本以后默认使用firewalld后,网上关于iptables的设置方法已经不管用了,想着反正iptable也不会用,索性直接搬官方文档,学习firewalld了,好像比iptables要简单点了。

官方文档地址:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html#sec-Introduction_to_firewalld

1、firewalld简介

  • firewalld是centos7的一大特性,最大的好处有两个:支持动态更新,不用重启服务;第二个就是加入了防火墙的“zone”概念

  • firewalld有图形界面和工具界面,由于我在服务器上使用,图形界面请参照官方文档,本文以字符界面做介绍

  • firewalld的字符界面管理工具是 firewall-cmd

  • firewalld默认配置文件有两个:/usr/lib/firewalld/ (系统配置,尽量不要修改)和 /etc/firewalld/ (用户配置地址)

zone概念:

硬件防火墙默认一般有三个区,firewalld引入这一概念系统默认存在以下区域(根据文档自己理解,如果有误请指正):

  • drop:默认丢弃所有包
  • block:拒绝所有外部连接,允许内部发起的连接
  • public:指定外部连接可以进入
  • external:这个不太明白,功能上和上面相同,允许指定的外部连接
  • dmz:和硬件防火墙一样,受限制的公共连接可以进入
  • work:工作区,概念和workgoup一样,也是指定的外部连接允许
  • home:类似家庭组
  • internal:信任所有连接

对防火墙不算太熟悉,还没想明白public、external、dmz、work、home从功能上都需要自定义允许连接,具体使用上的区别还需高人指点

2、安装firewalld

root执行 # yum install firewalld firewall-config

3、运行、停止、禁用firewalld

  • 启动:# systemctl start firewalld
  • 查看状态:# systemctl status firewalld 或者 firewall-cmd –state
  • 停止:# systemctl disable firewalld
  • 禁用:# systemctl stop firewalld

4、配置firewalld

  • 查看版本:$ firewall-cmd –version
  • 查看帮助:$ firewall-cmd –help

查看设置:

  • 显示状态:$ firewall-cmd –state
  • 查看区域信息: $ firewall-cmd –get-active-zones
  • 查看指定接口所属区域:$ firewall-cmd –get-zone-of-interface=eth0
  • 拒绝所有包:# firewall-cmd –panic-on
  • 取消拒绝状态:# firewall-cmd –panic-off
  • 查看是否拒绝:$ firewall-cmd –query-panic

  • 更新防火墙规则:# firewall-cmd –reload
    # firewall-cmd –complete-reload

两者的区别就是第一个无需断开连接,就是firewalld特性之一动态添加规则,第二个需要断开连接,类似重启服务

将接口添加到区域,默认接口都在public

# firewall-cmd --zone=public --add-interface=eth0

永久生效再加上 –permanent 然后reload防火墙

设置默认接口区域

# firewall-cmd --set-default-zone=public

立即生效无需重启

打开端口(貌似这个才最常用)
查看所有打开的端口:

# firewall-cmd --zone=dmz --list-ports

加入一个端口到区域:

# firewall-cmd --zone=dmz --add-port=8080/tcp

若要永久生效方法同上

打开一个服务,类似于将端口可视化,服务需要在配置文件中添加,/etc/firewalld 目录下有services文件夹,这个不详细说了,详情参考文档

# firewall-cmd --zone=work --add-service=smtp

移除服务

# firewall-cmd --zone=work --remove-service=smtp

还有端口转发功能、自定义复杂规则功能、lockdown,由于还没用到,以后再学习。

centos7使用systemd管理supervisor进程

介绍

Systemd

Systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置。可以通过 systemctl –version 命令来查看使用的版本

常用命令

# 立即启动一个服务
$ sudo systemctl start apache.service
# 立即停止一个服务
$ sudo systemctl stop apache.service
# 重启一个服务
$ sudo systemctl restart apache.service
# 杀死一个服务的所有子进程
$ sudo systemctl kill apache.service
# 重新加载一个服务的配置文件
$ sudo systemctl reload apache.service
# 重载所有修改过的配置文件
$ sudo systemctl daemon-reload
# 显示某个 Unit 的所有底层参数
$ systemctl show httpd.service

Supervisor

Supervisor是是一个用python写的进程管理程序,不仅仅可以用来管理进程,还可以用来做开机启动。它有但不限于以下一些功能:

重启机器后,能够自启动。
平时有个方便的进程查看方式。
能够有个方便的方式重启进程。

配置方法这里就不做记录了,不过要注意,默认的配置文件里面会把一些supervisor生成的重要文件放到 /tmp 目录下面,操作系统可能会把这些文件进行删除,导致 supervisorctl 命令由于找不到这些以前放到 /tmp 的文件而操作不了已经启动的supervisor进程。

方法

为了能够在机器启动之后自动启动supervisor,需要把supervisor进程配置进systemd,

步骤:

1、进入目录 /usr/lib/systemd/system/,增加文件 supervisord.service,来使得机器启动的时候启动supervisor,文件内容

# supervisord service for systemd (CentOS 7.0+)
# by ET-CS (https://github.com/ET-CS)
[Unit]
Description=Supervisor daemon

[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

2、激活开机启动命令

systemctl enable supervisord.service

3、启动supervisor进程

systemctl start supervisord.service

4、关闭supervisor进程

systemctl stop supervisord.service

5、如果修改了supervisor.service文件,可以通过reload命令来重新加载配置文件

systemctl reload supervisord.service

检查

可以通过 ps 命令可以查看supervisor 是否启动,并且可以查看supervisor管理的进程是否启动。

Debian系统apt-get包管理命令用法

apt-get 是Debian系Linux发行版(Debian,Ubuntu,Mint等)中的软件包管理工具。apt-get命令可以从网络随心所欲的管理Debian系统中的软件包,当要安装软件包时,自动从Debian的镜像服务器上下载所需要的软件和安全更新。

1. 安装软件包

apt-get install firefox

安装Firefox

2. 删除软件包

apt-get remove firefox

删除Firefox,但不会删除软件包的配置文件。

apt-get purge firefox

删除Firefox,并删除其配置文件。

apt-get clean

当apt-get安装或升级软件包时,会将deb安装包下载到文件系统的 /var/cache/apt/archives 目录下。软件安装完成后,这些deb安装包就没什么用了,apt-get clean 命令可以帮你删除这些deb安装包。

3. 更新本机的软件包索引

apt-get update

在安装任何软件之前,最好更新一下本机的软件包索引(package index)。本机软件包索引列出了软件仓库中所有可安装的软件包以及其版本信息。

4. 更新本机的软件包

apt-get upgrade

apt-get会告诉你哪些软件包会升级,并且询问你是否真的需要升级这些软件包。你可以在命令中添加-y 选项来自动回答yes.

5. 升级系统版本

apt-get dist-upgrade

Ubuntu系统配置samba实现文件夹共享

一. samba的安装:

sudo apt-get insall samba
sudo apt-get install smbfs

二. 创建共享目录:

mkdir /home/phinecos/share
sodu chmod 777 /home/phinecos/share

三. 创建Samba配置文件:

1. 保存现有的配置文件

sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak

2. 修改现配置文件

sudo gedit /etc/samba/smb.conf

在smb.conf最后添加

[share]
path = /home/phinecos/share
available = yes
browsealbe = yes
public = yes
writable = yes

四. 创建samba帐户

sudo touch /etc/samba/smbpasswd
sudo smbpasswd -a phinecos

然后会要求你输入samba帐户的密码

[如果没有第四步,当你登录时会提示 session setup failed: NT_STATUS_LOGON_FAILURE]

五. 重启samba服务器

sudo /etc/init.d/samba restart

六. 测试

smbclient -L //localhost/share

七,使用

可以到windows下输入ip使用了,在文件夹处输入 “\” + “Ubuntu机器的ip或主机名” + “\” + “share”

Ubuntu16.04系统无法启动grub rescue模式下修复grub

前几天整理了下电脑的分区,合并并删除一些分区,结果导致 grub 被破坏了,Ubuntu进不去了,启动后直接进入了 rescure 模式。后来又折腾了下,终于修复好了,现总结一下。

先说一下我的系统环境,我是 Win7 + Ubuntu 16.04 双系统,先安装的 Win7,后安装的 Ubuntu。采用的是 Windows 引导 Ubuntu 的方式,使用的工具是”EasyBCD 2.3 个人版本“。Ubuntu 分区时,”/boot” 是单独分区的。详细分区情况如下:“/boot” 分区, “/” 分区, “swap 交换空间“。

另外需要说明的,我在安装 Ubuntu 时,“安装启动引导器的设备”选择的是 “/boot” 所在的分区。

下面正式开始详细说明解决办法:

进入 Ubuntu 时,画面如下:

系统管理

首先,使用 ls 命令,找到 Ubuntu 的分区,执行 ls 命令后的结果如下:

系统管理

此时会看到硬盘上的分区情况,例如(hd0,msdos1),(hd0,msdos2)等等,其中 hd0 中的 0 代表第 1 块硬盘(硬盘号从 0 开始),msdos1 中的 1 代表第 1 个分区。

然后依次调用如下命令,直到找到 Ubuntu 所在的分区,命令如下:ls (hdx,msdosy)
其中 x 代表硬盘号,y 代表分区号。
以我的机器为例,依次查看每个分区情况:

ls (hd0,msdos1)
ls (hd0,msdos2)
ls (hd0,msdos3)
#......

执行结果如下:

系统管理

系统管理

系统管理

执行完之后,发现 (hd0,msdos5)和(hd0,msdos6)是 Ubuntu 的分区。然后分别执行如下命令,确定 grub 所在的分区:

ls (hd0,msdos5)/grub
ls (hd0,msdos6)/grub
# 若 “/boot” 没有单独分区,需要执行如下命令(待验证):
ls (hd0,msdos5)/boot/grub
ls (hd0,msdos6)/boot/grub

系统管理

执行完之后,发现 (hd0,msdos5) 中,有 grub.cfg 文件。说明 (hd0,msdos5) 是我们要找的引导分区。

之后,再依次执行如下命令,修复 grub 引导,并进入 grub2 引导画面:

set root=(hd0,msdos5)
set prefix=(hd0,msdos5)/grub
insmod normal
normal
# 若 “/boot” 没有单独分区,需要执行如下命令(待验证):
set root=(hd0,msdos5)
set prefix=(hd0,msdos5)/boot/grub
insmod normal
normal

系统管理

执行完上述命令之后,就可以看到 Ubuntu 的 grub2 引导画面,可以正常进入 Ubuntu 了。

系统管理

不过你会发现,若重新启动电脑的话,问题依旧。那是因为我们还没有执行 grub 的更新命令。

重新执行上述的命令,进入 Ubuntu。然后在终端执行如下命令更新 grub:

sudo update-grub2
sudo grub-install /dev/sda

  
注意: /dev/sda 后面不要加分区号,例如 sda1,sda2 之类的。
  
执行结果如下:

系统管理

系统管理

至此,grub 终于的修复完毕。不过,此时若重新电脑的话,你会发现,启动时变成了 Ubuntu 引导 Windows 了。而修复之前是 Windows 引导 Ubuntu。

为了解决这个问题,我用的方法是先进入 Win7,然后使用 ”EasyBCD“ 重新修复 MBR 从而解决了这个问题。

操作方法很简单:启动 EasyBCD,选择左侧的 ”BCD部署“,然后选中右侧的 ”在MBR中安装 Windows Vista+的bootloader“,也就是默认的第一项,最后点击 ”编写 MBR“ 按钮。

到这里,才算是直接的完成了 grub 的修复,并且可以用 Windows 引导 Ubuntu 了。
  ——————————————————————————————————

在一般情况下,有人可能直接修改GRUB配置文件“/boot/grub/grub.cfg”,但使用“sudu vim /boot/grub/grub.cfg”发现提示这个是系统自动生成的文件,不建议直接编辑,而应该到“/etc/grub.d”和“/etc/default/grub”去修改。
  
“/etc/grub.d”是操作系统菜单目录,一般由系统生成,我们无需修改,接下来就是修改“/etc/default/grub”文件了。使用“sudo vim /etc/default/grub”命令打开该配置文件。
  
其中的“GRUB_DEFAULT=0”就是设置的默认启动项了。GRUB启动项是按照启动菜单依次使用数字进行索引了,起始数字为0。结合前面的系统启动菜单,我们可以看到,Windows8的启动项在第5项,因此这里我们就需要修改为4(因为第一项是从0开始的)
  
修改完成,保存退出之后,还需要执行一下“sudo update-grub”来重新生成GRUB启动配置项。(修改GRUB配置之后,注意使用update-grub更新启动程序,否则修改将不会生效。)

vim的简单使用介绍

Vim是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用,和Emacs并列成为类Unix系统用户最喜欢的文本编辑器。

我们今天就来说说如何快速上手,简单快捷的使用vim。

在git bash中输入vim,进入vim编辑器。

vim编辑器初始状态

输入“i”进入编辑模式

编辑模式

“esc”返回到命令模式

命令模式

“:wq”保存退出(“:q!”不保存强制退出)

退出

在vim中常用到的命令

  1. 快速定位到当前段落的开头“(”或者“{”
  2. 快速定位到当前段落的结尾“)”或者“}”
  3. 复制 “y” , 粘贴 “p”
  4. “dd” 删除当前行,并把删除的行放入剪切板
  5. HJKL 或者 ↑↓←→ 上下左右移动光标 (HJKL 对应左 下 上 右 四个方向)
  6. 光标移动到文档开头 gg,光标移动到最后一行开头 shift+g
  7. “:help” 显示相关命令帮助 (退出帮助 “:q” )
  8. 在命令模式中使用 ctrl+b 上翻页, ctrl+f 下翻页, ctrl+u 上翻半页, ctrl+d 下翻半页。
  9. “/ +需要查找的字符” 显示文本中出现的第一个字符; “ ?+需要查找的字符” 显示文本中出现的最后一个字符。

CentOS 7 minimal 安装后的网络配置

CentOS7 minimal在安装后,有可能没有连接到网络,这里我们手动设置一下。

  1. 用root登录后,输入nmcli d,在结果中可以看到网络是不是有连接。

  2. 如发现网卡为禁用状态,在终端中输入nmtui,进行配置。

  3. 在打开的界面中,用tab键进行选择,使用enter进入,这里我们选择第一个网卡进行编辑(enp0s3)。

  4. 在网卡设置界面,选择IPV4为自动(IPv4 CONFIGURATION ),并勾选开机自动连接选项([X]Automatically connect)。

  5. 确认退出配置,重启网络服务service Network restart

  6. 最后用ip a命令确认连接情况