centos7安装oracle12c

記錄自己安裝 Oracle 12c 的筆記,把一些注意事項給整理下來

為了要測試一些 SQL 指令,因為在 SQL Server 上對於 Window Function 支援比較有限,因此想安裝一下 Oracle 來測試一下,之前安裝其他的版本,差不多已經是六七年之前了,因此怕安裝過程中又忘記了,先把相關要注意的部分給記下來。

1. 安裝 Centos ( https://www.centos.org/download/ ):基本上沒有甚麼特別的選擇,除了之前 mandrake 有比較多使用,目前其他的我也不大熟悉,但現在 Centos 安裝上來說也是非常的方便,因為只是要來測試 Oracle,因此就選擇最基本的安裝。基本上安裝不是甚麼問題,但如果也是要跟我一樣安裝在 VM 的環境的時候,要記得調整 Memory 在 2G 以上,而 Swap 空間也要在 2.5GB 以上,這樣安裝過程會順利許多。

2. 安裝 XMing ( http://sourceforge.net/projects/xming/ ) : 在安裝其他版本的時候,都是直接用 SSH 連線就可以進行安裝就可以了,但是在 Oracle 12c 開始,就需要搭配 X Window 才能安裝。因為我都是使用 pietty ,因此就搭配 XMing 來進行 Oracle 安裝。


預備好相關檔案,就可以進行前置設定了,如果安裝 Centos 的時候,選擇全部安裝,基本上也沒有甚麼問題了,但是一般我們都會希望最精簡的方式,避免安裝太多不必要的套件,安裝越多就可能造成的漏洞就越多的情況下,因此可以利用 yum 來幫我們安裝一些必要的套件

yum install -y binutils compat-libcap1 compat-libstdc++-33 compat-libstdc++-33.i686 gcc gcc-c++ glibc glibc.i686 glibc-devel glibc-devel.i686 ksh libgcc libgcc.i686 libstdc++ libstdc++.i686 libstdc++-devel libstdc++-devel.i686 libaio libaio.i686 libaio-devel libaio-devel.i686 libXtst libXtst.i686 libXi libXi.i686 make sysstat 

因為新版本的 oracle 要在 X Window 下面進行安裝,因此也必須安裝 X Window 相關套件

yum groupinstall "X Window System" "Fonts" -y 

 

在 Linux 下,很多時候很多服務我們都會建立一個個別的帳號去啟動,這樣做相關權限管理會比較容易,因此 Oracle 安裝在 Linux 上也不例外,因此我們會建立一個 oracle 的帳號並且設定相關群組。而按照慣例會建立三個群組,如果要管控更細緻,可以建立更多的群組來分類,一般建立會使用 「groupmod [-g gid] 群組名」的方式來建立,在官方文件會特別指定 gid,我個人是覺得可有可無,因此就利用以下指令來做建立三個群組和一個 oracle 的帳號,並且指定 oracle 帳號的密碼。 ( 可參考 oracle 官方文件說明 )

接下來要建立目錄,並且設定對目錄有存取權限

oracle 使用者的環境參數設定

接下來就是對 Linux 環境參數調整,這個部分則看你的使用是單機測試還是正式環境,在官方文件上的說明,有特別介紹在安裝後如何針對需要的部分去放大參數,但如果是個人測試環境,則這些參數可以不用調整,至於這些參數的用途,等後續有機會再來整理看看,目前先記下來不做調整。下面的這些參數需要修改「 /etc/sysctl.conf 」內來做設定,設定好之後則透過 「 /sbin/sysctl -p 」 去套用。

fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 2097152
kernel.shmmax = 4294967295
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576

另外一個則是「/etc/security/limit.conf」,在這裡要指定我們之前所建立的 oracle 帳號的對開檔案和一些支援的限制,此部分可以參考官方文件上的說明,如同前面設定一樣,此部分如果再使用量很小的狀況是可以不用考慮的。

oracle   soft   nofile   1024
oracle   hard   nofile   65536
oracle   soft   nproc    2047
oracle   hard   nproc    16384
oracle   soft   stack    10240
oracle   hard   stack    32768

前置處理完成之後,就可以開啟新的視窗使用 oracle 帳號登入進行安裝,此使如果使用 Putty or Pietty 之類的 SSH 連線軟體,要記得把 X11 forwarding 給開啟,這樣安裝的時候才可以透過前端的 XMing 軟體將 X Window 畫面在前端顯示

因此就可以解開 oracle 安裝程式來進行安裝,透過執行「 . /runInstaller 」來執行安裝程式

後面就按照你的需求去做設定和調整

 

安裝到一半的時候,會出現有如下的視窗,要你另外再開一個視窗,利用 root 的權限去執行兩段 script

 

因此我們另外開視窗來進行安裝


設定開機自動啟動 Oracle 服務,首先先修改 /etc/oratab 的檔案,將第三個參數由原本的 N 改成 Y

 

接著新增一個檔案到 /etc/init.d/ 目錄下 ,命名為 dbora ,此部分可以參考官方文件上的設定

#!/bin/bash

# oracle: Start/Stop Oracle Database 11g R2/12c
#
# chkconfig: 345 90 10
# description: The Oracle Database Server is an RDBMS created by Oracle Corporation
#
# processname: oracle

. /etc/rc.d/init.d/functions

LOCKFILE=/var/lock/subsys/oracle
ORACLE_HOME=/u01/app/oracle/product/12.1.0/db_1/
ORACLE_USER=oracle

case "$1" in
'start')
   if [ -f $LOCKFILE ]; then
      echo $0 already running.
      exit 1
   fi
   echo -n $"Starting Oracle Database:"
   su - $ORACLE_USER -c "$ORACLE_HOME/bin/dbstart $ORACLE_HOME"
   touch $LOCKFILE
   ;;
'stop')
   if [ ! -f $LOCKFILE ]; then
      echo $0 already stopping.
      exit 1
   fi
   echo -n $"Stopping Oracle Database:"
   su - $ORACLE_USER -c "$ORACLE_HOME/bin/dbshut $ORACLE_HOME"
   rm -f $LOCKFILE
   ;;
'restart')
   $0 stop
   $0 start
   ;;
'status')
   if [ -f $LOCKFILE ]; then
      echo $0 started.
      else
      echo $0 stopped.
   fi
   ;;
*)
   echo "Usage: $0 [start|stop|status]"
   exit 1
esac

exit 0

 

建立好之後,就可以透過指令設定權限,並且透過 chkconfig 加入,這樣重新啟動之後就會自動將 oracle 給帶起來了。

cd /etc/init.d
chgrp dba dbora
chmod 750 dbora
chkconfig --add dbora

PS

1. 如果 X Window 執行有問題,可以考慮看看是否在執行 Xming 的時候提升為 Administrator 權限,我在部分電腦上是靠這樣才執行成功的。

 

2. Centos 7 開始預設的防火牆不是 iptables ,所以要注意一下新的設定方式,否則想說就沒有防火牆,怎麼會連不上去。

# firewall-cmd --zone=public --add-port=1521/tcp --permanent 
# firewall-cmd --zone=public --add-port=5500/tcp --permanent 
# firewall-cmd --zone=public --list-all --permanent

 

3. EM 連線的部分可以有 HTTP 和 HTTPS 兩種,因此要使用的時候要注意指令是否有加入 s,測試前要注意前面一項所說的防火牆設定。

select 
    dbms_xdb_config.gethttpport() http,
    dbms_xdb_config.gethttpsport() https
from dual;

-- 設定 HTTPS 的通道
exec DBMS_XDB_CONFIG.SETHTTPSPORT(5500);

-- 設定 HTTP 的通道
exec DBMS_XDB_CONFIG.SETHTTPSPORT(8080);

 

4. 以往使用 SQL Server 的時候都是一個 SSMS 就直接搞定,現在使用 SQLPlus 就沒有那麼順手了,之前都還會找 Aqua Data Studio 來使用,但現在要申請 14 天的測試版本有點複雜,而且還不能重複申請,好在 Oracle 還有一個免費的開發工具 Oracle Developer 可以使用,算是不錯的 GUI Tools。

 

5. 最好要把預設的 listen 的設定做個調整,可以先透過 lsnrctl status 查看一下 listen 設定檔案的位置,預設會是 $ORACLE_HOME/network/admin/listener.ora ,如果沒有修改的話,因為預設是抓 localhost,那可能會造成他只監聽 127.0.0.1,造成主機之外無法連接,因此建議更改微電腦名稱,這樣就算更改 IP 也不會出問題。

linux查看硬件信息命令和教程详解

众所周知,Linux大部分操作是通过命令实现的,并不像windows那么直观。linux查看硬件信息也是需要通过linux查看硬件信息命令查询的,下面小编来分享一下linux查看硬件信息的方法和命令写法。
linux查看硬件信息

cpu

lscpu命令,查看的是cpu的统计信息.

blue@blue-pc:~$ lscpu
Architecture:          i686            #cpu架构
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian   #小尾序
CPU(s):                4               #总共有4核
On-line CPU(s) list:   0-3
Thread(s) per core:    1               #每个cpu核,只能支持一个线程,即不支持超线程
Core(s) per socket:    4               #每个cpu,有4个核
Socket(s):             1               #总共有1一个cpu
Vendor ID:             GenuineIntel    #cpu产商 intel
CPU family:            6
Model:                 42
Stepping:              7
CPU MHz:               1600.000
BogoMIPS:              5986.12
Virtualization:        VT-x            #支持cpu虚拟化技术
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              6144K
查看/proc/cpuinfo,可以知道每个cpu信息,如每个CPU的型号,主频等。

#cat /proc/cpuinfo
processor    : 0
vendor_id    : GenuineIntel
cpu family    : 6
model        : 42
model name    : Intel(R) Core(TM) i5-2320 CPU @ 3.00GHz
…..

上面输出的是第一个cpu部分信息,还有3个cpu信息省略了。

 

内存

概要查看内存情况

free -m
total       used       free     shared    buffers     cached
Mem:          3926       3651        274          0         12        404
-/+ buffers/cache:       3235        691
Swap:         9536         31       9505
这里的单位是MB,总共的内存是3926MB。

 

查看内存详细使用

# cat /proc/meminfo
MemTotal:        4020868 kB
MemFree:          230884 kB
Buffers:            7600 kB
Cached:           454772 kB
SwapCached:          836 kB
…..
查看内存硬件信息

dmidecode -t memory
# dmidecode 2.11
SMBIOS 2.7 present.

Handle 0x0008, DMI type 16, 23 bytes
Physical Memory Array
Location: System Board Or Motherboard
….
Maximum Capacity: 32 GB
….

Handle 0x000A, DMI type 17, 34 bytes
….
Memory Device
Array Handle: 0x0008
Error Information Handle: Not Provided
Total Width: 64 bits
Data Width: 64 bits
Size: 4096 MB
…..

我的主板有4个槽位,只用了一个槽位,上面插了一条4096MB的内存。

 

磁盘

查看硬盘和分区分布

# lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 465.8G  0 disk
├—sda1   8:1    0     1G  0 part /boot
├—sda2   8:2    0   9.3G  0 part [SWAP]
├—sda3   8:3    0  74.5G  0 part /
├—sda4   8:4    0     1K  0 part
├—sda5   8:5    0 111.8G  0 part /home
└—sda6   8:6    0 269.2G  0 part
显示很直观

 

如果要看硬盘和分区的详细信息

# fdisk -l

Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders, total 976773168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00023728

Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     2148351     1073152   83  Linux
/dev/sda2         2148352    21680127     9765888   82  Linux swap / Solaris
/dev/sda3        21680128   177930239    78125056   83  Linux
/dev/sda4       177932286   976771071   399419393    5  Extended/dev/sda5       177932288   412305407   117186560   83  Linux
/dev/sda6       412307456   976771071   282231808   83  Linux
网卡

查看网卡硬件信息

# lspci | grep -i ‘eth’
02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 06)
查看系统的所有网络接口

# ifconfig -a
eth0      Link encap:以太网  硬件地址 b8:97:5a:17:b3:8f
…..

lo        Link encap:本地环回
…..
或者是

ip link show
1: lo: <LOOPBACK> mtu 16436 qdisc noqueue state DOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether b8:97:5a:17:b3:8f brd ff:ff:ff:ff:ff:ff
如果要查看某个网络接口的详细信息,例如eth0的详细参数和指标

# ethtool eth0
Settings for eth0:
Supported ports: [ TP MII ]
Supported link modes:   10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Half 1000baseT/Full #支持千兆半双工,全双工模式
Supported pause frame use: No
Supports auto-negotiation: Yes #支持自适应模式,一般都支持
Advertised link modes:  10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Half 1000baseT/Full
Advertised pause frame use: Symmetric Receive-only
Advertised auto-negotiation: Yes #默认使用自适应模式
Link partner advertised link modes:  10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
…..
Speed: 100Mb/s #现在网卡的速度是100Mb,网卡使用自适应模式,所以推测路由是100Mb,导致网卡从支  持千兆,变成要支持百兆
Duplex: Full   #全双工
…..
Link detected: yes    #表示有网线连接,和路由是通的
 

其他

查看pci信息,即主板所有硬件槽信息。

lspci
00:00.0 Host bridge: Intel Corporation 2nd Generation Core Processor Family DRAM Controller (rev 09) #主板芯片
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09) #显卡
00:14.0 USB controller: Intel Corporation Panther Point USB xHCI Host Controller (rev 04) #usb控制器
00:16.0 Communication controller: Intel Corporation Panther Point MEI Controller #1 (rev 04)
00:1a.0 USB controller: Intel Corporation Panther Point USB Enhanced Host Controller #2 (rev 04)
00:1b.0 Audio device: Intel Corporation Panther Point High Definition Audio Controller (rev 04) #声卡
00:1c.0 PCI bridge: Intel Corporation Panther Point PCI Express Root Port 1 (rev c4) #pci 插槽
00:1c.2 PCI bridge: Intel Corporation Panther Point PCI Express Root Port 3 (rev c4)
00:1c.3 PCI bridge: Intel Corporation Panther Point PCI Express Root Port 4 (rev c4)
00:1d.0 USB controller: Intel Corporation Panther Point USB Enhanced Host Controller #1 (rev 04)
00:1f.0 ISA bridge: Intel Corporation Panther Point LPC Controller (rev 04)
00:1f.2 IDE interface: Intel Corporation Panther Point 4 port SATA Controller [IDE mode] (rev 04) #硬盘接口
00:1f.3 SMBus: Intel Corporation Panther Point SMBus Controller (rev 04)
00:1f.5 IDE interface: Intel Corporation Panther Point 2 port SATA Controller [IDE mode] (rev 04) #硬盘接口
02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 06) #网卡
03:00.0 PCI bridge: Integrated Technology Express, Inc. Device 8893 (rev 41)
如果要更详细的信息:lspci -v 或者 lspci -vv

如果要看设备树:lscpi -t

 

查看bios信息

# dmidecode -t bios
……
BIOS Information
Vendor: American Megatrends Inc.
Version: 4.6.5
Release Date: 04/25/2012
…….
BIOS Revision: 4.6
……
dmidecode以一种可读的方式dump出机器的DMI(Desktop Management Interface)信息。这些信息包括了硬件以及BIOS,既可以得到当前的配置,也可以得到系统支持的最大配置,比如说支持的最大内存数等。

如果要查看所有有用信息

dmidecode -q

以上是linux查看硬件信息的所有命令,可以查看CPU、硬盘、网卡、磁盘等硬件的信息。

Centos6下查看/修改系统时区、时间

一、查看和修改Linux的时区

1. 查看当前时区

命令 : “date -R”

2. 修改设置Linux服务器时区

方法 A

命令 : “tzselect”

方法 B 仅限于RedHat Linux 和 CentOS

命令 : “timeconfig”

方法 C 适用于Debian

命令 : “dpkg-reconfigure tzdata”

3. 复制相应的时区文件,替换系统时区文件;或者创建链接文件

cp /usr/share/zoneinfo/$主时区/$次时区 /etc/localtime

例如:在设置中国时区使用亚洲/上海(+8)

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

4.注意

GMT(Greenwich Mean Time,格林威治标准时间):
是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。
UTC(Universal Time/Temps
Cordonné 世界标准时间)
CST(Central Standard Time 國家標準時間,一說中原標準時間); 中国标准时间(China
Standard Time)
GMT + 8 = UTC + 8 = CST

二、查看和修改Linux的时间

1、date

查看系统时间

# date

设置系统时间

# date –set “07/07/06 10:19″ (月/日/年 时:分:秒)

将当前时间和日期写入BIOS,避免重启后失效

命令 : “hwclock -w”

2、hwclock/clock

查看硬件时间

# hwclock –show

或者 # clock –show

设置硬件时间

# hwclock –set –date=”07/07/06 10:19″ (月/日/年 时:分:秒)

或者 # clock –set –date=”07/07/06 10:19″ (月/日/年 时:分:秒)

3、硬件时间和系统时间的同步

按照前面的说法,重新启动系统,硬件时间会读取系统时间,实现同步,但是在不重新启动的时候,需要用hwclock或clock命令实现同步。

硬件时钟与系统时钟同步:

# hwclock –hctosys(hc代表硬件时间,sys代表系统时间)

或者

# clock –hctosys

系统时钟和硬件时钟同步: # hwclock –systohc 或者 # clock –systohc

针对中国时区,修改操作如下
1.   修改文件 /etc/sysconfig/clock内容:
ZONE=Asia/Shanghai UTC=false ARC=false
2.     rm /etc/localtime
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

Linux下使用timedatectl命令时间时区操作详解

timedatectl命令对于RHEL / CentOS 7和基于Fedora 21+的分布式系统来说,是一个新工具,它作为systemd系统和服务管理器的一部分,代替旧的传统的用在基于Linux分布式系统的sysvinit守护进程的date命令。

timedatectl命令可以查询和更改系统时钟和设置,你可以使用此命令来设置或更改当前的日期,时间和时区,或实现与远程NTP服务器的自动系统时钟同步。

在本教程中,我要讲的是,如何在你的Linux系统上,通过使用来自于终端使用timedatectl命令的NTP,设置date、time、timezone和synchronize time来管理时间。

让你的Linux服务器或系统保持正确的时间是一个很好的实践,它有以下优点:

  • 维护及时操作的系统任务,因为在Linux中的大多数任务都是由时间来控制的。
  • 记录事件和系统上其它信息等的正确时间。

如何查找和设置Linux本地时区

1.要显示系统的当前时间和日期,使用命令行中的timedatectl命令,如下:

# timedatectl  status

在上面的示例中,RTC time就是硬件时钟的时间。

2.Linux系统上的time总是通过系统上的timezone设置的,要查看当前时区,按如下做:

# timedatectl 
OR
# timedatectl | grep Time

3.要查看所有可用的时区,运行以下命令:

# timedatectl list-timezones

4.要根据地理位置找到本地的时区,运行以下命令:

# timedatectl list-timezones |  egrep  -o “Asia/B.*”
# timedatectl list-timezones |  egrep  -o “Europe/L.*”
# timedatectl list-timezones |  egrep  -o “America/N.*”

5.要在Linux中设置本地时区,使用set-timezone开关,如下所示。

# timedatectl set-timezone “Asia/Kolkata”

推荐使用和设置协调世界时,即UTC。

# timedatectl set-timezone UTC

你需要输入正确命名的时区,否者在你改变时区的时候,可能会发生错误。在下面的例子中,由于 “Asia/Kalkata” 这个时区是不正确的,因此导致了错误。

如何在Linux中设置时间和日期

6.你可以使用timedatectl命令,设置系统上的日期和时间,如下所示:

设置Linux中的时间

只设置时间的话,我们可以使用set-time开关以及HH:MM:SS(小时,分,秒)的时间格式。

# timedatectl set-time 15:58:30

在Linux中设置日期

7.只设置日期的话,我们可以使用set-time开关以及YY:MM:DD(年,月,日)的日期格式。

# timedatectl set-time 20151120

8.设置日期和时间:

# timedatectl set-time '16:10:40 2015-11-20'

如何在Linux中查找和设置硬件时钟

9.要设置硬件时钟以协调世界时,UTC,可以使用 set-local-rtc boolean-value选项,如下所示:

首先确定你的硬件时钟是否设置为本地时区:

# timedatectl | grep local

将你的硬件时钟设置为本地时区:

# timedatectl set-local-rtc 1

将你的硬件时钟设置为协调世界时(UTC):

# timedatectl set-local-rtc 0

将Linux系统时钟同步到远程NTP服务器

NTP即Network Time Protocol(网络时间协议),是一个互联网协议,用于同步计算机之间的系统时钟。timedatectl实用程序可以自动同步你的Linux系统时钟到使用NTP的远程服务器。

注意,你必须在系统上安装NTP以实现与NTP服务器的自动时间同步。

要开始自动时间同步到远程NTP服务器,在终端键入以下命令。

# timedatectl set-ntp true

要禁用NTP时间同步,在终端键入以下命令。

# timedatectl set-ntp false

总结

本教程中描述的都是一些非常简单的例子,希望它们能对你设置各种Linux系统时钟和时区有帮助。有不同的看法,也请不吝指教。

CentOS 7 多网卡绑定 bond

# 概念

服务器存在多块网卡时,可以通过bond来实现多块网卡并在一起使用;

 

# 模式

mode 0:load balancing (round-robin)

Support:需要Switch支持 <H3C5510支持>

负载均衡<IN/OUT>:是

冗余:是

bond MAC: 所有slave MAC相同

工作模式:Transmit packets in sequential order from the first available slave through the last.

 

mode 1:  fault-tolerance (active-backup)

Support:无

负载均衡<IN/OUT>:否

冗余:是

bond MAC: 所有slave MAC相同

工作模式:同时只有一块网卡被激活,另一块网卡为backup,不工作

active抢夺:否

工作模式:Only one slave in the bond is active.

mode 4: lacp

802.3ad模式是IEEE标准 。

交换机端配置: interface AggregatePort 1 配置聚合口 interface GigabitEthernet 0/23 port-   group 1 mode active 接口下开启lacp

主动模式 interface GigabitEthernet 0/24 port-group 1

mode active

mode 5: transmit load balancing

Support:Ethtool

ingoing:active-backup

outgoing:一块网卡用完,另一块网卡开始

 

mode 6: adaptive load balancing

IN/OUT:一块网卡用完,另一块网卡开始

 

这里配置了 bond4 模式 ,交换机开启 lacp, 配置聚合

# 配置

1. 网卡配置

# cat /etc/sysconfig/network-scripts/ifcfg-em1

DEVICE=em1

NAME=em1

TYPE=Ethernet

BOOTPROTO=none

ONBOOT=yes

MASTER=bond4

SLAVE=yes

# cat /etc/sysconfig/network-scripts/ifcfg-em2

DEVICE=em2

NAME=em2

TYPE=Ethernet

BOOTPROTO=none

ONBOOT=yes

MASTER=bond4

SLAVE=yes

# cat /etc/sysconfig/network-scripts/ifcfg-em3

DEVICE=em3

NAME=em3

TYPE=Ethernet

BOOTPROTO=none

ONBOOT=yes

MASTER=bond4

SLAVE=yes

# cat /etc/sysconfig/network-scripts/ifcfg-bond4

DEVICE=bond4

NAME=bond4

TYPE=Bond

BONDING_MASTER=yes

IPADDR=172.16.32.51

GATEWAY=172.16.32.1

NETMASK=255.255.255.0

DNS1=172.16.32.241

DNS2=172.16.32.243

PEERDNS=yes

ONBOOT=yes

BOOTPROTO=static

BONDING_OPTS=”mode=802.3ad miimon=100 lacp_rate=fast”

# bonding生效

方法1:重启系统

# bonding状态查看

# cat /proc/net/bonding/bond4

Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: IEEE 802.3ad Dynamic link aggregation

Transmit Hash Policy: layer2 (0)

MII Status: up

MII Polling Interval (ms): 100

Up Delay (ms): 0

Down Delay (ms): 0

802.3ad info

LACP rate: fast

Min links: 0

Aggregator selection policy (ad_select): stable

Active Aggregator Info:

Aggregator ID: 3

Number of ports: 3

Actor Key: 17

Partner Key: 7985

Partner Mac Address: e4:c2:d1:e5:29:40

Slave Interface: em1

MII Status: up

Speed: 1000 Mbps

Duplex: full

Link Failure Count: 0

Permanent HW addr: 44:a8:42:21:87:ec

Aggregator ID: 3

Slave queue ID: 0

Slave Interface: em2

MII Status: up

Speed: 1000 Mbps

Duplex: full

Link Failure Count: 0

Permanent HW addr: 44:a8:42:21:87:ed

Aggregator ID: 3

Slave queue ID: 0

Slave Interface: em3

MII Status: up

Speed: 1000 Mbps

Duplex: full

Link Failure Count: 0

Permanent HW addr: 44:a8:42:21:87:ee

Aggregator ID: 3

Slave queue ID: 0

haproxy ssl 配置方式

haproxy 代理 ssl 有两种方式

1、haproxy 本身提供ssl 证书,后面的web 服务器走正常的http

2、haproxy 本身只提供代理,后面的web服务器https

第一种方式

需要编译haproxy 支持ssl,编译参数:

make TARGET=linux26 USE_OPENSSL=1 ADDLIB=-lz
ldd haproxy | grep ssl
libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007fb0485e5000)

配置参数:

frontend https_frontend
  bind *:443 ssl crt /etc/ssl/certs/servername.pem
  mode http
  option httpclose
  option forwardfor
  reqadd X-Forwarded-Proto:\ https
  default_backend web_server

backend web_server
  mode http
  balance roundrobin
  cookie SERVERID insert indirect nocache
  server s1 192.168.250.47:80 check cookie s1
  server s2 192.168.250.49:80 check cookie s2
 注意:这里的pem 文件是下面两个文件合并而成:
  cat servername.crt servername.key |tee servername.pem

第二种方式配置

不需要重新编译支持ssl,简单方便。需要后面的web服务器配置好ssl 即可。

frontend https_frontend
  bind *:443
  mode tcp
  default_backend web_server

backend web_server
  mode tcp
  balance roundrobin
  stick-table type ip size 200k expire 30m
  stick on src
  server s1 192.168.250.47:443
  server s2 192.168.250.49:443
  
  注意,这种模式下mode 必须是tcp 模式

参考:

http://virtuallyhyper.com/2013/05/configure-haproxy-to-load-balance-sites-with-ssl/

http://www.rackspace.com/knowledge_center/article/setting-up-haproxy

centos7安装haproxy

安装Haproxy

1
2
3
4
5
#yum -y install gcc           
#tar zxf haproxy-1.4.21.tar.gz
#mv haproxt-1.4.21 haproxy
#make TARGET=linux31 PREFIX=/usr/local/haproxy    将haproxy安装到指定目录
#make install PREFIX=/usr/local/haproxy

配置    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#安装完后会在安装目录下生成三个目录
    doc sbin  share
#cd /usr/local/haproxy
#vi haproxy.cfg             #默认没有这个文件,需要自己手动创建
global
    maxconn 51200
    uid 99
    gid 99
    daemon
    pidfile /usr/local/haproxy/logs/haproxy.pid
        mode http #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK  
        #retries 2 #两次连接失败就认为是服务器不可用,也可以通过后面设置  
        option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器  
        option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接  
        timeout connect 5000ms #连接超时  
        timeout client 30000ms #客户端超时  
        timeout server 30000ms #服务器超时  
        #timeout check 2000 #=心跳检测超时  
        log 127.0.0.1 local0 err #[err warning info debug]
          balance roundrobin                     #负载均衡算法  
#        option  httplog                        #日志类别,采用httplog  
#        option  httpclose   #每次请求完毕后主动关闭http通道,ha-proxy不支持keep-alive,只能模拟>这种模式的实现  
#        option  dontlognull  
#        option  forwardfor  #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip  
listen admin_stats
        bind 0.0.0.0:1080 #监听端口  
        option httplog #采用http日志格式  
        stats refresh 30s #统计页面自动刷新时间  
        stats uri /stats #统计页面url  
        stats realm Haproxy Manager #统计页面密码框上提示文本  
        stats auth admin:admin #统计页面用户名和密码设置  
        #stats hide-version #隐藏统计页面上HAProxy的版本信息
listen test2 :80
       option httpclose
       option forwardfor
       server s1 192.168.0.168:80 check weight 1 minconn 1 maxconn 3 check inter 40000
       server s2 192.168.0.198:80 check weight 1 minconn 1 maxconn 3 check inter 40000
启动haproxy
      /usr/local/haproxy/sbin/haproxy -f haproxy.cfg

访问http://ip:1080/stats,出现如下界面

wKioL1aLiX2jAkj3AADA5ya6XJQ514.png

访问http://ip:80,实现代理效果。

spacer.gif

wKioL1aLjmeAUuweAAAYe-nAnuI576.png

wKiom1aLjkKgMp2pAAAXQe-ErAU276.png

Linux服务器tcp连接数调优

假设一台Linux服务器有上百万的请求数,服务器的连接数高有设置好的话,很容易出现服务器负载不过来的问题,本文我们来看看如何优化Linux的连接数来应付大数据请求。

默认的Linux服务器文件描述符等打开最大是1024,用 ulimit -a 查看:

[viewuser@~]$ ulimit -a
core file size          (blocks, -c) 0   #coredump 文件大小
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 255622
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024   #打开文件数量,root账户无限制
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 4096   #root用户本项是无限
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

如果超过了连接数量,可以在 /var/log/message 里面看到类似:

May 14 16:13:52 hostname kernel: nf_conntrack: table full, dropping packet

的信息,基本可以判定是fd不够用引起的。(服务器受到攻击也会有这个信息)

设置要求:假设我们要设置为200W最大打开文件描述符

1、修改 nr_open 限制 (用途:能够配置nofile最大数)

cat /proc/sys/fs/nr_open

Linux 内核 2.6.25 以前,在内核里面宏定义是1024*1024,最大只能是100w(1048576),所以不要设置更大的值,如果Linux内核大于 2.6.25 则可以设置更大值。

设置方法:

sudo bash -c ‘echo 2000000 > /proc/sys/fs/nr_open’

注意:只有修改了 nr_open 限制,才能修改下面的限制。(如果 nr_open 的默认现有值如果高于我们的200w,那么可以不用修改)

2、打开文件描述符限制:修改 limits.conf 的nofile软硬打开文件限制(用途:tcp连接数)

(1) 临时生效

如果想针对当前登陆session临时生效文件描述符修改,可以直接使用 ulimit 命令:

ulimit -SHn 2000000

再执行相应的程序就能够正常使用不会超过限制,但是重启服务器会失效。
如果想一直生效,可以把这个内容保存到启动里面,同步到 : /etc/rc.local 文件

sudo echo “ulimit -SHn 2000000” >> /etc/rc.local

注意:如果需要让 /etc/rc.local 下次启动生效,务必记得有该文件必须有执行权限:sudo chmod +x /etc/rc.local

下次启动会自动执行这句,也是可以正常使用的。

(2) 永久生效

文件位置:/etc/security/limits.conf

查找 nofile ,如果没有,则在自己最后加上:

2.6.25 及以前内核设置为100W:

*        soft     nofile  1000000
*        hard    nofile  1000000

2.6.25 以后版本内核可以设置为200W:

*        soft     nofile  2000000
*        hard    nofile  2000000

设置后保存本文件。(本操作必须重启才生效,如果无法重启,会无法生效,不确定是否使用 /sbin/sysctl -p 是否可以直接生效)

说 明:如果需要 limits.conf生效,有部分需要加载/lib/security/pam_limits.so才能生效(默认情况一般不关心),如果需要关注,则 需要在 /etc/pam.d/login 在末尾追加 session required /lib/security/pam_limits.so ,但是目前新版内核应该都没问题问题,可以忽略。

3、打开进程限制:修改 limits.conf 中的nproc限制 (用途:进程数)

说明:如果你对进程总数量没有特殊要求,可以不修改本选项,如果你是一个高性能多进程的server,需要很多进程来处理,那么可以修改本选项。
ulimit -a 里可以看到 max user processes 如果值是比较大的,可以不用设置 nproc 项。
配置文件:/etc/security/limits.d/20-nproc.conf  (RHEL 7/CentOS 7,如果是 RHEL6.x/CentOS6.x 文件在 /etc/security/limits.d/90-nproc.conf)

*          soft    nproc  4096
root     soft    nproc  unlimited

就是root无限(实际root用户限制是:255622),其他非root用户是4096个进程。

说明:

硬限制表明soft限制中所能设定的最大值。 soft限制指的是当前系统生效的设置值。 hard限制值可以被普通用户降低。但是不能增加。 soft限制不能设置的比hard限制更高。 只有root用户才能够增加hard限制值。
当增加文件限制描述,可以简单的把当前值双倍。 例子如下, 如果你要提高默认值1024, 最好提高到2048, 如果还要继续增加, 就需要设置成4096。

4、修改 file-max 选项 (用途:可分配文件句柄数目)

file-max 价值:指定了可以分配的文件句柄的最大数目(可以使用 /proc/sys/fs/file-nr 文件查看到当前已经使用的文件句柄和总句柄数。)

(1) 临时生效:

文件路径:/proc/sys/fs/file-max

cat /proc/sys/fs/file-max

3252210

如果要修改,直接覆盖文件:(比如改成200w)

sudo echo 2000000 > /proc/sys/fs/file-max

注意:如果你想每次启动都自动执行上面的命令,可以在系统启动配置文件/etc/rc.local里面添加一句命令:(跟永久生效差不多)

echo 2000000 > /proc/sys/fs/file-max

或者直接Shell全搞定:

echo “echo 2000000 > /proc/sys/fs/file-max” >> /etc/rc.local

注意:如果需要让 /etc/rc.local 下次启动生效,务必记得有该文件必须有执行权限:sudo chmod +x /etc/rc.local

(2) 永久生效:

修改配置文件,文件位置:/etc/sysctl.conf

打开配置文件到最末尾,如果配置文件里没有则可以直接添加:

sudo echo “fs.file-max = 2000000” >>/etc/sysctl.conf

配置文件生效:sudo /sbin/sysctl -p

5、修改TCP等相关选项

配置文件:/etc/sysctl.conf

修改选项:

net.core.somaxconn = 2048
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 20000
net.ipv4.tcp_rmem = 4096 4096 16777216
net.ipv4.tcp_wmem = 4096 4096 16777216
net.ipv4.tcp_mem = 786432 2097152 3145728
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_orphans = 131072
fs.file-max = 2000000
fs.inotify.max_user_watches = 16384
net.netfilter.nf_conntrack_max = 6553500   #本选项在一些版本下无效,可以删除
net.netfilter.nf_conntrack_tcp_timeout_established = 1200     #本选项在一些版本下无效,可以删除

配置文件生效:sudo /sbin/sysctl -p

以上选项也可以直接给 /proc/sys/net/ 目录下面按照各个选项可以直接使用类似于 echo VALUE > /proc/sys/net/core/wmem_max 来直接修改内存临时值生效。

主要看这几项:

net.ipv4.tcp_rmem 用来配置读缓冲的大小,三个值,第一个是这个读缓冲的最小值,第三个是最大值,中间的是默认值。我们可以在程序中修改读缓冲的大小,但是不能超过最小与最 大。为了使每个socket所使用的内存数最小,我这里设置默认值为4096;
net.ipv4.tcp_wmem 用来配置写缓冲的大小。读缓冲与写缓冲在大小,直接影响到socket在内核中内存的占用;
net.ipv4.tcp_mem 则是配置tcp的内存大小,其单位是页,而不是字节。当超过第二个值时,TCP进入 pressure模式,此时TCP尝试稳定其内存的使用,当小于第一个值时,就退出pressure模式。当内存占用超过第三个值时,TCP就拒绝分配 socket了,查看dmesg,会打出很多的日志“TCP: too many of orphaned sockets”;
net.ipv4.tcp_max_orphans 这个值也要设置一下,这个值表示系统所能处理不属于任何进程的 socket数量,当我们需要快速建立大量连接时,就需要关注下这个值了。当不属于任何进程的socket的数量大于这个值时,dmesg就会看 到”too many of orphaned sockets”;
net.ipv4.tcp_syncookies = 1表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭;
net.ipv4.tcp_fin_timeout修改系?默认的TIMEOUT时间;
net.ipv4.tcp_max_syn_backlog 进入SYN包的最大请求队列.默认1024.对重负载服务器,增加该值显然有好处.可调整到16384;
net.ipv4.tcp_keepalive_time = 300 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为300秒;
net.ipv4.tcp_max_tw_buckets = 5000 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000;
fs.file-max = 2000000 是指能够打开的文件描述符的最大数量,如果系统报错:too many file opened,就需要修改本值(本值必须跟 /etc/security/limits.conf 一块修改才生效);
fs.inotify.max_user_watches = 16384 设置文件系统变化监听上线。如果在没满各种正常的情况下,还出现tail -f这种watch事件报错No space left on device就是这个值不够了;

注意:如果是客户端程序,为了更好的访问server程序不是卡在端口分配上,建议把客户端的端口(port_range)范围开大一些:

修改文件:/etc/sysctl.conf

net.ipv4.ip_local_port_range = 1024 65535

配置生效:sudo /sbin/sysctl -p

如果是客户端,其他文件打开限制等可以参考上面的来设置。

6、其他一些配置

(1) 打开core文件

如果为了观察程序是否正常,出现问题后生成相应映像文件,可以开启coredump相关的操作,可以打开:(非必须,如果线上环境,担心影响稳定性,可以考虑不开启)

配置文件:/etc/security/limits.conf

修改配置文件:

增加:

*        soft     core   102400
*        hard    core   2048003

建议设置为无限大小:

*        soft     core   unlimited
*        hard    core   unlimited

然后重启机器生效(不确定是否可以使用 /sbin/sysctl -p 生效),使用: ulimit -a 或 ulimit -c 查看结果,后续如果程序出现栈溢出等都会生成coredump文件,方便用gdb等追查问题原因。

(2) 修改其他 limits.conf 配置

如 果想临时当前会话里让 /etc/security/limits.conf 生效,可以直接使用 ulimit 命令进行修改,在当前session就直接生效(退出登陆或者重启失效,为了永久生效,必须直接修改 /etc/security/limits.conf 文件)

ulimit -SHc unlimited   #修改coredump文件大小,修改完当前session就生效了,启动的程序都会直接可用这个新配置值
ulimit -SHn 10000000  #修改打开文件数量限制为100W,修改完当前session就生效
ulimit -SHu 4096  #修改当前用户打开进程数量限制为4096个,修改完后当前session直接生效

#修改完成后使用 ulimit -a 可以查看修改的效果,需要用就生效修改 /etc/security/limits.conf 文件,然后重启服务器生效 #

优化Linux的内核参数来提高服务器并发处理能力

Linux 系统下,TCP连接断开后,会以TIME_WAIT状态保留一定的时间,然后才会释放端口。当并发请求过多的时候,就会产生大量的TIME_WAIT状态 的连接,无法及时断开的话,会占用大量的端口资源和服务器资源。这个时候我们可以优化TCP的内核参数,来及时将TIME_WAIT状态的端口清理掉。

本文介绍的方法只对拥有大量TIME_WAIT状态的连接导致系统资源消耗有效,如果不是这种情况下,效果可能不明显。可以使用netstat命令去查TIME_WAIT状态的连接状态,输入下面的组合命令,查看当前TCP连接的状态和对应的连接数量:
#netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
这个命令会输出类似下面的结果:
LAST_ACK 16
SYN_RECV 348
ESTABLISHED 70
FIN_WAIT1 229
FIN_WAIT2 30
CLOSING 33
TIME_WAIT 18098
我 们只用关心TIME_WAIT的个数,在这里可以看到,有18000多个TIME_WAIT,这样就占用了18000多个端口。要知道端口的数量只有 65535个,占用一个少一个,会严重的影响到后继的新连接。这种情况下,我们就有必要调整下Linux的TCP内核参数,让系统更快的释放 TIME_WAIT连接。

用vim打开配置文件:#vim /etc/sysctl.conf

在这个文件中,加入下面的几行内容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30

输入下面的命令,让内核参数生效:#sysctl -p

简单的说明上面的参数的含义:

net.ipv4.tcp_syncookies = 1
#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭;
net.ipv4.tcp_fin_timeout
#修改系?默认的 TIMEOUT 时间。

在经过这样的调整之后,除了会进一步提升服务器的负载能力之外,还能够防御小流量程度的DoS、CC和SYN攻击。

此外,如果你的连接数本身就很多,我们可以再优化一下TCP的可使用端口范围,进一步提升服务器的并发能力。依然是往上面的参数文件中,加入下面这些配置:
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
#这几个参数,建议只在流量非常大的服务器上开启,会有显著的效果。一般的流量小的服务器上,没有必要去设置这几个参数。

net.ipv4.tcp_keepalive_time = 1200
#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 10000 65000
#表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为10000到65000。(注意:这里不要将最低值设的太低,否则可能会占用掉正常的端口!)
net.ipv4.tcp_max_syn_backlog = 8192
#表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets = 6000
# 表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。默 认为180000,改为6000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于 Squid,效果却不大。此项参数可以控制TIME_WAIT的最大数量,避免Squid服务器被大量的TIME_WAIT拖死。

内核其他TCP参数说明:
net.ipv4.tcp_max_syn_backlog = 65536
#记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。
net.core.netdev_max_backlog = 32768
#每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
net.core.somaxconn = 32768
#web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。

net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216           #最大socket读buffer,可参考的优化值:873200
net.core.wmem_max = 16777216           #最大socket写buffer,可参考的优化值:873200
net.ipv4.tcp_timestsmps = 0
#时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。
net.ipv4.tcp_synack_retries = 2
#为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。
net.ipv4.tcp_syn_retries = 2
#在内核放弃建立连接之前发送SYN包的数量。
#net.ipv4.tcp_tw_len = 1
net.ipv4.tcp_tw_reuse = 1
# 开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接。

net.ipv4.tcp_wmem = 8192 436600 873200
# TCP写buffer,可参考的优化值: 8192 436600 873200
net.ipv4.tcp_rmem  = 32768 436600 873200
# TCP读buffer,可参考的优化值: 32768 436600 873200
net.ipv4.tcp_mem = 94500000 91500000 92700000
# 同样有3个值,意思是:
net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力。
net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段。
net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket。
上述内存单位是页,而不是字节。可参考的优化值是:786432 1048576 1572864

net.ipv4.tcp_max_orphans = 3276800
#系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。
如果超过这个数字,连接将即刻被复位并打印出警告信息。
这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,
更应该增加这个值(如果增加了内存之后)。
net.ipv4.tcp_fin_timeout = 30
# 如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60秒。 2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。

经过这样的优化配置之后,你的服务器的TCP并发处理能力会显著提高。以上配置仅供参考,用于生产环境请根据自己的实际情况。

Nginx+Keepalived实现站点高可用

公司内部 OA 系统要做线上高可用,避免单点故障,所以计划使用2台虚拟机通过 Keepalived 工具来实现 nginx 的高可用(High Avaiability),达到一台nginx入口服务器宕机,另一台备机自动接管服务的效果。(nginx做反向代理,实现后端应用服务器的负载均衡)快速搭建请直接跳至 第2节。

1. Keepalived介绍

Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat、corosync、pacemaker。但是它一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。

1.1 VRRP协议

VRRP全称 Virtual Router Redundancy Protocol,即 虚拟路由冗余协议。可以认为它是实现路由器高可用的容错协议,即将N台提供相同功能的路由器组成一个路由器组(Router Group),这个组里面有一个master和多个backup,但在外界看来就像一台一样,构成虚拟路由器,拥有一个虚拟IP(vip,也就是路由器所在局域网内其他机器的默认路由),占有这个IP的master实际负责ARP相应和转发IP数据包,组中的其它路由器作为备份的角色处于待命状态。master会发组播消息,当backup在超时时间内收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,保证路由器的高可用。

在VRRP协议实现里,虚拟路由器使用 00-00-5E-00-01-XX 作为虚拟MAC地址,XX就是唯一的 VRID (Virtual Router IDentifier),这个地址同一时间只有一个物理路由器占用。在虚拟路由器里面的物理路由器组里面通过多播IP地址 224.0.0.18 来定时发送通告消息。每个Router都有一个 1-255 之间的优先级别,级别最高的(highest priority)将成为主控(master)路由器。通过降低master的优先权可以让处于backup状态的路由器抢占(pro-empt)主路由器的状态,两个backup优先级相同的IP地址较大者为master,接管虚拟IP。

nginx-keepalived-vrrp.jpg

与heartbeat/corosync等比较

直接摘抄自 http://www.linuxidc.com/Linux/2013-08/89227.htm :

Heartbeat、Corosync、Keepalived这三个集群组件我们到底选哪个好,首先我想说明的是,Heartbeat、Corosync是属于同一类型,Keepalived与Heartbeat、Corosync,根本不是同一类型的。Keepalived使用的vrrp协议方式,虚拟路由冗余协议 (Virtual Router Redundancy Protocol,简称VRRP);Heartbeat或Corosync是基于主机或网络服务的高可用方式;简单的说就是,Keepalived的目的是模拟路由器的高可用,Heartbeat或Corosync的目的是实现Service的高可用。

所以一般Keepalived是实现前端高可用,常用的前端高可用的组合有,就是我们常见的LVS+Keepalived、Nginx+Keepalived、HAproxy+Keepalived。而Heartbeat或Corosync是实现服务的高可用,常见的组合有Heartbeat v3(Corosync)+Pacemaker+NFS+Httpd 实现Web服务器的高可用、Heartbeat v3(Corosync)+Pacemaker+NFS+MySQL 实现MySQL服务器的高可用。总结一下,Keepalived中实现轻量级的高可用,一般用于前端高可用,且不需要共享存储,一般常用于两个节点的高可用。而Heartbeat(或Corosync)一般用于服务的高可用,且需要共享存储,一般用于多节点的高可用。这个问题我们说明白了。

又有博友会问了,那heartbaet与corosync我们又应该选择哪个好啊,我想说我们一般用corosync,因为corosync的运行机制更优于heartbeat,就连从heartbeat分离出来的pacemaker都说在以后的开发当中更倾向于corosync,所以现在corosync+pacemaker是最佳组合。

1.2 Keepalived + nginx

keepalived可以认为是VRRP协议在Linux上的实现,主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。本文基于如下的拓扑图:

1
                   +-------------+
                   |    uplink   |
                   +-------------+
                          |
                          +
    MASTER            keep|alived         BACKUP
172.29.88.224      172.29.88.222      172.29.88.225
+-------------+    +-------------+    +-------------+
|   nginx01   |----|  virtualIP  |----|   nginx02   |
+-------------+    +-------------+    +-------------+
                          |
       +------------------+------------------+
       |                  |                  |
+-------------+    +-------------+    +-------------+
|    web01    |    |    web02    |    |    web03    |
+-------------+    +-------------+    +-------------+

2. keepalived实现nginx高可用

2.1安装

我的环境是CentOS 6.2 X86_64,直接通过yum方式安装最简单:

1
# yum install -y keepalived
# keepalived -v
Keepalived v1.2.13 (03/19,2015)

2.2 nginx监控脚本

该脚本检测ngnix的运行状态,并在nginx进程不存在时尝试重新启动ngnix,如果启动失败则停止keepalived,准备让其它机器接管。

/etc/keepalived/check_nginx.sh :

1
#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
    /usr/local/bin/nginx
    sleep 2
    counter=$(ps -C nginx --no-heading|wc -l)
    if [ "${counter}" = "0" ]; then
        /etc/init.d/keepalived stop
    fi
fi

你也可以根据自己的业务需求,总结出在什么情形下关闭keepalived,如 curl 主页连续2个5s没有响应则切换:

1
#!/bin/bash
# curl -IL http://localhost/member/login.htm
# curl --data "memberName=fengkan&password=22" http://localhost/member/login.htm

count = 0
for (( k=0; k<2; k++ )) 
do 
    check_code=$( curl --connect-timeout 3 -sL -w "%{http_code}\\n" http://localhost/login.html -o /dev/null )
    if [ "$check_code" != "200" ]; then
        count = count +1
        continue
    else
        count = 0
        break
    fi
done
if [ "$count" != "0" ]; then
#   /etc/init.d/keepalived stop
    exit 1
else
    exit 0
fi

2.3 keepalived.conf

1
! Configuration File for keepalived
global_defs {
    notification_email {
        zhouxiao@example.com
        itsection@example.com
    }
    notification_email_from itsection@example.com
    smtp_server mail.example.com
    smtp_connect_timeout 30
    router_id LVS_DEVEL
}

vrrp_script chk_nginx {
#    script "killall -0 nginx"
    script "/etc/keepalived/check_nginx.sh" 
    interval 2 
    weight -5 
    fall 3  
    rise 2 
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    mcast_src_ip 172.29.88.224
    virtual_router_id 51
    priority 101
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.29.88.222
    }
    track_script {
       chk_nginx 
    }
}

在其它备机BACKUP上,只需要改变 state MASTER -> state BACKUPpriority 101 -> priority 100mcast_src_ip 172.29.88.224 -> mcast_src_ip 172.29.88.225即可。

service keepalived restart

2.4 配置选项说明

global_defs

  • notification_email : keepalived在发生诸如切换操作时需要发送email通知地址,后面的 smtp_server 相比也都知道是邮件服务器地址。也可以通过其它方式报警,毕竟邮件不是实时通知的。
  • router_id : 机器标识,通常可设为hostname。故障发生时,邮件通知会用到

vrrp_instance

  • state : 指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTER
  • interface : 实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的
  • mcast_src_ip : 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在那个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址
  • virtual_router_id : 这里设置VRID,这里非常重要,相同的VRID为一个组,他将决定多播的MAC地址
  • priority : 设置本节点的优先级,优先级高的为master
  • advert_int : 检查间隔,默认为1秒。这就是VRRP的定时器,MASTER每隔这样一个时间间隔,就会发送一个advertisement报文以通知组内其他路由器自己工作正常
  • authentication : 定义认证方式和密码,主从必须一样
  • virtual_ipaddress : 这里设置的就是VIP,也就是虚拟IP地址,他随着state的变化而增加删除,当state为master的时候就添加,当state为backup的时候删除,这里主要是有优先级来决定的,和state设置的值没有多大关系,这里可以设置多个IP地址
  • track_script : 引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。

vrrp_script
告诉 keepalived 在什么情况下切换,所以尤为重要。可以有多个 vrrp_script

  • script : 自己写的检测脚本。也可以是一行命令如killall -0 nginx
  • interval 2 : 每2s检测一次
  • weight -5 : 检测失败(脚本返回非0)则优先级 -5
  • fall 2 : 检测连续 2 次失败才算确定是真失败。会用weight减少优先级(1-255之间)
  • rise 1 : 检测 1 次成功就算成功。但不修改优先级

这里要提示一下script一般有2种写法:

  1. 通过脚本执行的返回结果,改变优先级,keepalived继续发送通告消息,backup比较优先级再决定
  2. 脚本里面检测到异常,直接关闭keepalived进程,backup机器接收不到advertisement会抢占IP

上文 vrrp_script 配置部分,killall -0 nginx属于第1种情况,/etc/keepalived/check_nginx.sh属于第2种情况(脚本中关闭keepalived)。个人更倾向于通过shell脚本判断,但有异常时exit 1,正常退出exit 0,然后keepalived根据动态调整的 vrrp_instance 优先级选举决定是否抢占VIP:

  • 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加
  • 如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少

其他情况,原本配置的优先级不变,即配置文件中priority对应的值。

提示:

  1. 优先级不会不断的提高或者降低
  2. 可以编写多个检测脚本并为每个检测脚本设置不同的weight(在配置中列出就行)
  3. 不管提高优先级还是降低优先级,最终优先级的范围是在[1,254],不会出现优先级小于等于0或者优先级大于等于255的情况
  4. 在MASTER节点的 vrrp_instance 中 配置 nopreempt ,当它异常恢复后,即使它 prio 更高也不会抢占,这样可以避免正常情况下做无谓的切换

以上可以做到利用脚本检测业务进程的状态,并动态调整优先级从而实现主备切换。

配置结束

在默认的keepalive.conf里面还有 virtual_server,real_server 这样的配置,我们这用不到,它是为lvs准备的。 notify 可以定义在切换成MASTER或BACKUP时执行的脚本,如有需求请自行google。

notify

2.5 nginx配置

当然nginx没有什么可配置的,因为它与keepalived并没有联系。但记住,2台nginx服务器上的配置应该是完全一样的(rsync同步),这样才能做到对用户透明,nginx.conf 里面的 server_name 尽量使用域名来代替,然后dns解析这个域名到虚拟IP 172.29.88.222。

更多关于nginx内容配置请参考 这里 。

3. 测试

根据上面的配置,初始化状态:172.29.88.224 (itoatest1,MASTER,101),172.29.88.222(itoatest2,BACKUP,100),nginx和keepalived都启动,虚拟IP 172.29.88.222 在 itoatest1 上:

1
# 使用ip命令配置的地址,ifconfig查看不了
[root@itoatest1 nginx-1.6]# ip a|grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    inet 172.29.88.224/24 brd 172.29.88.255 scope global eth0
    inet 172.29.88.222/32 scope global eth0

浏览器访问 172.29.88.222 或域名,OK。

直接关闭 itoatest1 上的nginx:/usr/local/nginx-1.6/sbin/nginx -s stop

1
[root@localhost keepalived]# ip a|grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    inet 172.29.88.224/24 brd 172.29.88.255 scope global eth0

vip消失,漂移到 itoatest2:

nginx-keepalived-vip.png

同时可以看到两台服务器上 /var/log/messages

1
## itoatest1
Jun  5 16:44:01 itoatest1 Keepalived_vrrp[44875]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 172.29.88.222
Jun  5 16:44:06 itoatest1 Keepalived_vrrp[44875]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 172.29.88.222
Jun  5 16:44:46 itoatest1 Keepalived_vrrp[44875]: VRRP_Script(chk_nginx) failed
Jun  5 16:44:48 itoatest1 Keepalived_vrrp[44875]: VRRP_Instance(VI_1) Received higher prio advert
Jun  5 16:44:48 itoatest1 Keepalived_vrrp[44875]: VRRP_Instance(VI_1) Entering BACKUP STATE
Jun  5 16:44:48 itoatest1 Keepalived_vrrp[44875]: VRRP_Instance(VI_1) removing protocol VIPs.
Jun  5 16:44:48 itoatest1 Keepalived_healthcheckers[44874]: Netlink reflector reports IP 172.29.88.222 removed

## itoatest2
Jun  5 16:44:00 itoatest2 Keepalived_vrrp[35555]: VRRP_Instance(VI_1) Transition to MASTER STATE
Jun  5 16:44:00 itoatest2 Keepalived_vrrp[35555]: VRRP_Instance(VI_1) Received higher prio advert
Jun  5 16:44:00 itoatest2 Keepalived_vrrp[35555]: VRRP_Instance(VI_1) Entering BACKUP STATE
Jun  5 16:44:48 itoatest2 Keepalived_vrrp[35555]: VRRP_Instance(VI_1) forcing a new MASTER election
Jun  5 16:44:48 itoatest2 Keepalived_vrrp[35555]: VRRP_Instance(VI_1) forcing a new MASTER election
Jun  5 16:44:49 itoatest2 Keepalived_vrrp[35555]: VRRP_Instance(VI_1) Transition to MASTER STATE
Jun  5 16:44:50 itoatest2 Keepalived_vrrp[35555]: VRRP_Instance(VI_1) Entering MASTER STATE
Jun  5 16:44:50 itoatest2 Keepalived_vrrp[35555]: VRRP_Instance(VI_1) setting protocol VIPs.
Jun  5 16:44:50 itoatest2 Keepalived_vrrp[35555]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 172.29.88.222
Jun  5 16:44:50 itoatest2 Keepalived_healthcheckers[35554]: Netlink reflector reports IP 172.29.88.222 added
Jun  5 16:44:55 itoatest2 Keepalived_vrrp[35555]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 172.29.88.222

你也可以通过在两台服务器上抓包来查看 优先级priority 的变化:

1
## itoatest1 上
## 直接输出,或后加 -w itoatest-kl.cap存入文件用wireshark查看
# tcpdump -vvv -n -i eth0 dst 224.0.0.18 and src 172.29.88.224

nginx-keepalived-prio.png

参考

Linux命令行之逗趣无极限

你有没有在Linux命令行中见过一辆火车呢?“猫跟老鼠”呢?编辑Linux命令行其实并不总是件严肃古板的事情。你完全可以用它自娱自乐。下面我们就跟大家一起讨论一下Linux命令行的特质。

假设:本文所有示例都使用Ubuntu Linux。文中描述命令行功能或许在你的Linux系统中是默认的。

有趣的Linux命令行功效

1. Linux“sl”命令行

尽管“sl”代表了“蒸汽机机头”,但它是用来提醒那些命令行控们别把“ls”打成了“sl”。让我们看看在系统中运行这个命令的时候会怎样。

首先,我们安装的时候,要将其设置为不与标准Linux一起出现。用“apt-get”可以很方便地完成安装。

sudo apt-get install sl

大部分的安装需要sudo特权。完成安装后,在命令提示行中输入”sl”。

$sl

我们看到了动画蒸汽机机头从屏幕右边开往左边。这个火车头是用ASCLL字符绘制。

面是我机器上的效果图:

https://dn-linuxcn.qbox.me/data/attachment/album/201304/18/211758k4kau9t3kh3gwwzk.png

https://dn-linuxcn.qbox.me/data/attachment/album/201304/18/211758k4kau9t3kh3gwwzk.png

  这难道比我们平时操作Linux 命令行要难吗?我认为沉浸在工作中的Linux用户看到这幅意料之外的动画时,肯定会心一笑,并意识到自己的输入有误。

即便是这种简单的命令行也可以提供特定选项。详细命令参考:http://man.cx/sl%286%29

SYNOPSIS
sl [ -alFe ]

DESCRIPTION
sl Displays animations aimed to correct users who accidentally enter sl instead of ls.  SL stands for Steam Locomotive.

OPTIONS
-a     An accident seems to happen. You’ll feel pity for people who cry for help.

-l     shows little one.

-F     It flies.

-e     Allow interrupt by Ctrl+C.

还可以用  $alia ls=sl  给人弄个恶作剧。

2. Linux “yes” 命令

这里是一个在进程结束前一直打印输入字符串的命令。万一,用户不指定任何输入字符串,默认命令是”y”。

命令会这样运行:

$yes mylinuxbook
mylinuxbook
mylinuxbook
mylinuxbook
mylinuxbook
mylinuxbook
mylinuxbook
mylinuxbook
mylinuxbook
mylinuxbook
mylinuxbook
mylinuxbook
mylinuxbook
mylinuxbook
^C$

用”ctrl+c”结束前台运行进程。

很奇怪,是吗?为什么我们希望命令在进程中一直打印字符串呢?尽管这样运行的方式很傻,但却不一定没用。我们可以用特定脚本中的”yes”命令,在 这些脚本中,我们可以用重复操作作答。例如,我们可以在一组文件上进行操作,而Linux会要求我们对文件进行确认。我们可以用”yes”命令自动回复。

3. Linux”rev”命令

尽管非常简单,但我发现这行命令其实非常有意思。它会一行接一行地颠倒所输入的字符串。”rev”命令的名称来源于英文reverse。可以在命令指示符中输入”rev”然后按回车

$rev

终端会提示我们通过标准输入提供一个字符串。那么在每行后面我们就可以同时看到输出。

比如,我们输入”mylinuxbook”然后按回车。

mylinuxbook
koobxunilym

为了回到命令提示符,可以使用”ctrl+c”。

我们看到颠倒的字符串直接出现在了下一行。然后,我们可以输入下一个希望出现颠倒效果的字符串,接着按回车,就可以得到标准输出了。

$ rev
google
elgoog
linux is fun
nuf si xunil
^C$

这行命令也可以以文件的形式输入,它会颠倒文件中的所有字符串,然后把输出结果打成标准输出。

$ cat strings.txt
MyLinuxBook
Linux is so much fun!
Happy Birthday
$ rev strings.txt
kooBxuniLyM
!nuf hcum os si xuniL
yadhtriB yppaH

4. Linux”fortune” 命令

Fortune命令是在相同命令行中作为fortune cookies。我们运行这个命令的时候随机找了一条谚语或信息。

首先要对其进行安装,

$sudo apt-get install fortune

安装完成后,我们运行这个命令的方式就是:

$ fortune
You have the power to influence all with whom you come in contact.

所以,依靠这个命令,Linux可以像个算命师一样。

5. Linux”figlet”命令

这个命令会用大写方式把我们输入的字符串显示在标题栏,显示效果由ASCII字符组成。

由于它不是标准设置,所以要先安装这一功能。

$sudo apt-get install figlet

看到字符串在终端上变成这样确实很有意思。

$ figlet mylinuxbook

https://dn-linuxcn.qbox.me/data/attachment/album/201304/18/211800qv4qty3610ttsy3v.png

https://dn-linuxcn.qbox.me/data/attachment/album/201304/18/211800qv4qty3610ttsy3v.png

  你可以试着用”figlet”在脚本标头或源代码中添加标题栏。

6. Linux “toilet”命令

我不知道这个命令的名字源自哪里。但是它确实个五颜六色的命令。与figlet一样,它会把文本显示称标题栏,但是效果更好。

首先,安装:

$sudo apt-get install toilet

然后试一试这个简单的命令:

$toilet mylinuxbook

输入效果如下图所示:

https://dn-linuxcn.qbox.me/data/attachment/album/201304/18/211801zqqcjb89b8lfuqn0.png

https://dn-linuxcn.qbox.me/data/attachment/album/201304/18/211801zqqcjb89b8lfuqn0.png

  它比figlet命令的效果更有艺术感。

不过,它还可以添加颜色。我们可以运行下列命令看到颜色:

$toilet -f mono12 -F metal mylinuxbook

效果如下图:

https://dn-linuxcn.qbox.me/data/attachment/album/201304/18/2118020v70v4esf747v6eb.png

https://dn-linuxcn.qbox.me/data/attachment/album/201304/18/2118020v70v4esf747v6eb.png

7. Linux “cowsay”命令

Cowsay命令是一个有趣的命令。它会用ASCII字符描绘牛,羊和许多其他动物。但是不是每个Linux发行版都带有这个命令。

使用下面的命令安装此命令:

$sudo apt-get install cowsay

现在,运行命令,并在命令中给出一个信息字符串。

$cowsay “Linux is fun”

我们看到了一个有趣的图像:

https://dn-linuxcn.qbox.me/data/attachment/album/201304/18/211802inz5bn9iwi6ixxvb.png

https://dn-linuxcn.qbox.me/data/attachment/album/201304/18/211802inz5bn9iwi6ixxvb.png

  基本上,我们会看到一头牛告诉我们所输入的信息。尽管这个命令中只出现了cow,但其实它还可以有羊的效果。

$cowsay -f sheep “I too love linux”

效果如图:

https://dn-linuxcn.qbox.me/data/attachment/album/201304/18/21180364cyyur0by44ep46.png

https://dn-linuxcn.qbox.me/data/attachment/album/201304/18/21180364cyyur0by44ep46.png

  只需用 ‘-l 就能看到它能提供的所有动物。输入:

$cowsay -l

系统会弹出下列信息:

Cow files in /usr/share/cowsay/cows:
apt beavis.zen bong bud-frogs bunny calvin cheese cock cower daemon default
dragon dragon-and-cow duck elephant elephant-in-snake eyes flaming-sheep
ghostbusters gnu head-in hellokitty kiss kitty koala kosh luke-koala
mech-and-cow meow milk moofasa moose mutilated pony pony-smaller ren sheep
skeleton snowman sodomized-sheep stegosaurus stimpy suse three-eyes turkey
turtle tux unipony unipony-smaller vader vader-koala www

因此,我们可以用 ‘-f’ 输入以上信息中的任何动物。

为了使之更有趣,你可以让cowsay说出fortune信息,如输入:

$fortune | cowsay

则出现下面的效果:

https://dn-linuxcn.qbox.me/data/attachment/album/201304/18/211804wo022oea7dwa9wpg.png

https://dn-linuxcn.qbox.me/data/attachment/album/201304/18/211804wo022oea7dwa9wpg.png

8. Linux “cmatrix”命令

这个命令会在终端生成ASCII字符组成的矩阵风格的动画效果。

先安装:

$sudo apt-get install cmatrix

现在运行:

cmatrix

出来的效果很酷:

https://dn-linuxcn.qbox.me/data/attachment/album/201304/18/211806e1egbgrs0iip0og8.png

https://dn-linuxcn.qbox.me/data/attachment/album/201304/18/211806e1egbgrs0iip0og8.png

  用”ctrl+c” 结束,生成动画。

9. Linux “oneko” 命令

这个命令是最好玩的。我们都知道”猫和老鼠”的动画,这个命令会让我们想起他们的追逐游戏。有了这行命令,我们可以看到一只猫在追老鼠(鼠标指示器)的效果。

先安装:

$sudo apt-get install oneko

运行这个命令,我们输入:

oneko

然后你就可以看到不管鼠标指示器放到哪里,Tom猫都会追着跑。下面是截图,不过不足以显示动态的效果:

https://dn-linuxcn.qbox.me/data/attachment/album/201304/18/2118088ti8ai1b08sb4i5u.png

https://dn-linuxcn.qbox.me/data/attachment/album/201304/18/2118088ti8ai1b08sb4i5u.png

  即便我们切换应用,猫也不会离开老鼠。它甚至没有局限于终端。

想关掉这个的时候,只需在终端里用ctrl+c 结束进程即可。