<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Linux on My Blog</title><link>/tags/linux/</link><description>Recent content in Linux on My Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 26 Jun 2016 00:00:00 +0000</lastBuildDate><atom:link href="/tags/linux/index.xml" rel="self" type="application/rss+xml"/><item><title>Python模块之psutil</title><link>/2016/06/26/python%E6%A8%A1%E5%9D%97%E4%B9%8Bpsutil/</link><pubDate>Sun, 26 Jun 2016 00:00:00 +0000</pubDate><guid>/2016/06/26/python%E6%A8%A1%E5%9D%97%E4%B9%8Bpsutil/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;p&gt;用Python来编写脚本简化日常的运维工作是Python的一个重要用途。在Linux下，有许多系统命令可以让我们时刻监控系统运行的状态，如&lt;code&gt;ps&lt;/code&gt;，&lt;code&gt;top&lt;/code&gt;，&lt;code&gt;free&lt;/code&gt;等等。要获取这些系统信息，Python可以通过&lt;code&gt;subprocess&lt;/code&gt;模块调用并获取结果。但这样做显得很麻烦，尤其是要写很多解析代码。&lt;/p&gt;
&lt;p&gt;在Python中获取系统信息的另一个好办法是使用&lt;code&gt;psutil&lt;/code&gt;这个第三方模块。顾名思义，psutil = process and system utilities，它不仅可以通过一两行代码实现系统监控，还可以跨平台使用，支持Linux／UNIX／OSX／Windows等，是系统管理员和运维小伙伴不可或缺的必备模块。&lt;/p&gt;
&lt;h3 id="安装psutil"&gt;安装psutil&lt;/h3&gt;
&lt;p&gt;如果安装了Anaconda，psutil就已经可用了。否则，需要在命令行下通过pip安装：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ pip install psutil
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="获取cpu信息"&gt;获取CPU信息&lt;/h3&gt;
&lt;p&gt;我们先来获取CPU的信息：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import psutil
&amp;gt;&amp;gt;&amp;gt; psutil.cpu_count() # CPU逻辑数量
4
&amp;gt;&amp;gt;&amp;gt; psutil.cpu_count(logical=False) # CPU物理核心
2
# 2说明是双核超线程, 4则是4核非超线程
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;统计CPU的用户／系统／空闲时间：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; psutil.cpu_times()
scputimes(user=10963.31, nice=0.0, system=5138.67, idle=356102.45)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;再实现类似&lt;code&gt;top&lt;/code&gt;命令的CPU使用率，每秒刷新一次，累计10次：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; for x in range(10):
... psutil.cpu_percent(interval=1, percpu=True)
...
[14.0, 4.0, 4.0, 4.0]
[12.0, 3.0, 4.0, 3.0]
[8.0, 4.0, 3.0, 4.0]
[12.0, 3.0, 3.0, 3.0]
[18.8, 5.1, 5.9, 5.0]
[10.9, 5.0, 4.0, 3.0]
[12.0, 5.0, 4.0, 5.0]
[15.0, 5.0, 4.0, 4.0]
[19.0, 5.0, 5.0, 4.0]
[9.0, 3.0, 2.0, 3.0]
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="获取内存信息"&gt;获取内存信息&lt;/h3&gt;
&lt;p&gt;使用psutil获取物理内存和交换内存信息，分别使用：&lt;/p&gt;</description></item><item><title>Linux网页缓存之varnish</title><link>/2015/11/13/linux%E7%BD%91%E9%A1%B5%E7%BC%93%E5%AD%98%E4%B9%8Bvarnish/</link><pubDate>Fri, 13 Nov 2015 00:00:00 +0000</pubDate><guid>/2015/11/13/linux%E7%BD%91%E9%A1%B5%E7%BC%93%E5%AD%98%E4%B9%8Bvarnish/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;程序的运行具有局部性特征：
时间局部性：一个数据被访问过之后，可能很快会被再次访问
空间局部性：一个数据被访问时，其周边的数据也有可能被访问到
cache：命中
热区：局部性；
时效性：
缓存空间耗尽：LRU
过期：缓存清理
缓存命中率：hit/(hit+miss)
(0,1)
页面命中率：基于页面数量进行衡量
字节命中率：基于页面的体积进行衡量
缓存与否：
私有数据：private，private cache；
公共数据：public, public or private cache;
Cache-related Headers Fields
The most important caching header fields are:
Expires：过期时间；
Expires:Thu, 22 Oct 2026 06:34:30 GMT
Cache-Control
Etag
If-None-Match
Last-Modified
If-Modified-Since
Vary
Age
缓存有效性判断机制：
过期时间：Expires
HTTP/1.0
Expires
HTTP/1.1
Cache-Control: maxage=
Cache-Control: s-maxage=
条件式请求：
Last-Modified/If-Modified-Since
Etag/If-None-Match
Expires:Thu, 13 Aug 2026 02:05:12 GMT
Cache-Control:max-age=315360000
ETag:&amp;#34;1ec5-502264e2ae4c0&amp;#34;
Last-Modified:Wed, 03 Sep 2014 10:00:27 GMT
缓存层级：
私有缓存：用户代理附带的本地缓存机制；
公共缓存：反向代理服务器的缓存功能；
User-Agent &amp;lt;--&amp;gt; private cache &amp;lt;--&amp;gt; public cache &amp;lt;--&amp;gt; public cache 2 &amp;lt;--&amp;gt; Original Server
请求报文用于通知缓存服务如何使用缓存响应请求：
cache-request-directive =
&amp;#34;no-cache&amp;#34;，
| &amp;#34;no-store&amp;#34;
| &amp;#34;max-age&amp;#34; &amp;#34;=&amp;#34; delta-seconds
| &amp;#34;max-stale&amp;#34; [ &amp;#34;=&amp;#34; delta-seconds ]
| &amp;#34;min-fresh&amp;#34; &amp;#34;=&amp;#34; delta-seconds
| &amp;#34;no-transform&amp;#34;
| &amp;#34;only-if-cached&amp;#34;
| cache-extension
响应报文用于通知缓存服务器如何存储上级服务器响应的内容：
cache-response-directive =
&amp;#34;public&amp;#34;
| &amp;#34;private&amp;#34; [ &amp;#34;=&amp;#34; &amp;lt;&amp;#34;&amp;gt; 1#field-name &amp;lt;&amp;#34;&amp;gt; ]
| &amp;#34;no-cache&amp;#34; [ &amp;#34;=&amp;#34; &amp;lt;&amp;#34;&amp;gt; 1#field-name &amp;lt;&amp;#34;&amp;gt; ]，可缓存，但响应给客户端之前需要revalidation；
| &amp;#34;no-store&amp;#34; ，不允许存储响应内容于缓存中；
| &amp;#34;no-transform&amp;#34;
| &amp;#34;must-revalidate&amp;#34;
| &amp;#34;proxy-revalidate&amp;#34;
| &amp;#34;max-age&amp;#34; &amp;#34;=&amp;#34; delta-seconds
| &amp;#34;s-maxage&amp;#34; &amp;#34;=&amp;#34; delta-seconds
| cache-extension
开源解决方案：
squid：
varnish：
varnish官方站点： http://www.varnish-cache.org/
Community
Enterprise
This is Varnish Cache, a high-performance HTTP accelerator.
程序架构：
Manager进程
Cacher进程，包含多种类型的线程：
accept, worker, expiry, ...
shared memory log：
统计数据：计数器；
日志区域：日志记录；
varnishlog, varnishncsa, varnishstat...
配置接口：VCL
Varnish Configuration Language,
vcl complier --&amp;gt; c complier --&amp;gt; shared object
varnish的程序环境：
/etc/varnish/varnish.params： 配置varnish服务进程的工作特性，例如监听的地址和端口，缓存机制；
/etc/varnish/default.vcl：配置各Child/Cache线程的缓存工作属性；
主程序：
/usr/sbin/varnishd
CLI interface：
/usr/bin/varnishadm
Shared Memory Log交互工具：
/usr/bin/varnishhist
/usr/bin/varnishlog
/usr/bin/varnishncsa
/usr/bin/varnishstat
/usr/bin/varnishtop
测试工具程序：
/usr/bin/varnishtest
VCL配置文件重载程序：
/usr/sbin/varnish_reload_vcl
Systemd Unit File：
/usr/lib/systemd/system/varnish.service
varnish服务
/usr/lib/systemd/system/varnishlog.service
/usr/lib/systemd/system/varnishncsa.service
日志持久的服务；
varnish的缓存存储机制( Storage Types)：
-s [name=]type[,options]
・ malloc[,size]
内存存储，[,size]用于定义空间大小；重启后所有缓存项失效；
・ file[,path[,size[,granularity]]]
文件存储，黑盒；重启后所有缓存项失效；
・ persistent,path,size
文件存储，黑盒；重启后所有缓存项有效；实验；
varnish程序的选项：
程序选项：/etc/varnish/varnish.params文件
-a address[:port][,address[:port][...]，默认为6081端口；
-T address[:port]，默认为6082端口；
-s [name=]type[,options]，定义缓存存储机制；
-u user
-g group
-f config：VCL配置文件；
-F：运行于前台；
...
运行时参数：/etc/varnish/varnish.params文件， DEAMON_OPTS
DAEMON_OPTS=&amp;#34;-p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300&amp;#34;
-p param=value：设定运行参数及其值； 可重复使用多次；
-r param[,param...]: 设定指定的参数为只读状态；
重载vcl配置文件：
~ ]# varnish_reload_vcl
varnishadm
-S /etc/varnish/secret -T [ADDRESS:]PORT
help [&amp;lt;command&amp;gt;]
ping [&amp;lt;timestamp&amp;gt;]
auth &amp;lt;response&amp;gt;
quit
banner
status
start
stop
vcl.load &amp;lt;configname&amp;gt; &amp;lt;filename&amp;gt;
vcl.inline &amp;lt;configname&amp;gt; &amp;lt;quoted_VCLstring&amp;gt;
vcl.use &amp;lt;configname&amp;gt;
vcl.discard &amp;lt;configname&amp;gt;
vcl.list
param.show [-l] [&amp;lt;param&amp;gt;]
param.set &amp;lt;param&amp;gt; &amp;lt;value&amp;gt;
panic.show
panic.clear
storage.list
vcl.show [-v] &amp;lt;configname&amp;gt;
backend.list [&amp;lt;backend_expression&amp;gt;]
backend.set_health &amp;lt;backend_expression&amp;gt; &amp;lt;state&amp;gt;
ban &amp;lt;field&amp;gt; &amp;lt;operator&amp;gt; &amp;lt;arg&amp;gt; [&amp;amp;&amp;amp; &amp;lt;field&amp;gt; &amp;lt;oper&amp;gt; &amp;lt;arg&amp;gt;]...
ban.list
配置文件相关：
vcl.list
vcl.load：装载，加载并编译；
vcl.use：激活；
vcl.discard：删除；
vcl.show [-v] &amp;lt;configname&amp;gt;：查看指定的配置文件的详细信息；
运行时参数：
param.show -l：显示列表；
param.show &amp;lt;PARAM&amp;gt;
param.set &amp;lt;PARAM&amp;gt; &amp;lt;VALUE&amp;gt;
缓存存储：
storage.list
后端服务器：
backend.list
VCL：
”域“专有类型的配置语言；
state engine：状态引擎；
VCL有多个状态引擎，状态之间存在相关性，但状态引擎彼此间互相隔离；每个状态引擎可使用return(x)指明关联至哪个下一级引擎；每个状态引擎对应于vcl文件中的一个配置段，即为subroutine
vcl_hash --&amp;gt; return(hit) --&amp;gt; vcl_hit
Client Side：
vcl_recv, vcl_pass, vcl_hit, vcl_miss, vcl_pipe, vcl_purge, vcl_synth, vcl_deliver
vcl_recv：
hash：vcl_hash
pass: vcl_pass
pipe: vcl_pipe
synth: vcl_synth
purge: vcl_hash --&amp;gt; vcl_purge
vcl_hash：
lookup：
hit: vcl_hit
miss: vcl_miss
pass, hit_for_pass: vcl_pass
purge: vcl_purge
Backend Side：
vcl_backend_fetch, vcl_backend_response, vcl_backend_error
两个特殊的引擎：
vcl_init：在处理任何请求之前要执行的vcl代码：主要用于初始化VMODs；
vcl_fini：所有的请求都已经结束，在vcl配置被丢弃时调用；主要用于清理VMODs；
vcl的语法格式：
(1) VCL files start with vcl 4.0;
(2) //, # and /* foo */ for comments;
(3) Subroutines are declared with the sub keyword; 例如sub vcl_recv { ...}；
(4) No loops, state-limited variables（受限于引擎的内建变量）；
(5) Terminating statements with a keyword for next action as argument of the return() function, i.e.: return(action)；用于实现状态引擎转换；
(6) Domain-specific;
The VCL Finite State Machine
(1) Each request is processed separately;
(2) Each request is independent from others at any given time;
(3) States are related, but isolated;
(4) return(action); exits one state and instructs Varnish to proceed to the next state;
(5) Built-in VCL code is always present and appended below your own VCL;
三类主要语法：
sub subroutine {
...
}
if CONDITION {
...
} else {
...
}
return(), hash_data()
VCL Built-in Functions and Keywords
函数：
regsub(str, regex, sub)
regsuball(str, regex, sub)
ban(boolean expression)
hash_data(input)
synthetic(str)
Keywords:
call subroutine， return(action)，new，set，unset
操作符：
==, !=, ~, &amp;gt;, &amp;gt;=, &amp;lt;, &amp;lt;=
逻辑操作符：&amp;amp;&amp;amp;, ||, !
变量赋值：=
举例：obj.hits
if (obj.hits&amp;gt;0) {
set resp.http.X-Cache = &amp;#34;HIT via &amp;#34; + server.ip;
} else {
set resp.http.X-Cache = &amp;#34;MISS via &amp;#34; + server.ip;
}
变量类型：
内建变量：
req.*：request，表示由客户端发来的请求报文相关；
req.http.*
req.http.User-Agent, req.http.Referer, ...
bereq.*：由varnish发往BE主机的httpd请求相关；
bereq.http.*
beresp.*：由BE主机响应给varnish的响应报文相关；
beresp.http.*
resp.*：由varnish响应给client相关；
obj.*：存储在缓存空间中的缓存对象的属性；只读；
常用变量：
bereq.*, req.*：
bereq.http.HEADERS
bereq.request：请求方法；
bereq.url：请求的url；
bereq.proto：请求的协议版本；
bereq.backend：指明要调用的后端主机；
req.http.Cookie：客户端的请求报文中Cookie首部的值；
req.http.User-Agent ~ &amp;#34;chrome&amp;#34;
beresp.*, resp.*：
beresp.http.HEADERS
beresp.status：响应的状态码；
reresp.proto：协议版本；
beresp.backend.name：BE主机的主机名；
beresp.ttl：BE主机响应的内容的余下的可缓存时长；
obj.*
obj.hits：此对象从缓存中命中的次数；
obj.ttl：对象的ttl值
server.*
server.ip
server.hostname
client.*
client.ip
用户自定义：
set
unset
示例1：强制对某类资源的请求不检查缓存：
vcl_recv {
if (req.url ~ &amp;#34;(?i)^/(login|admin)&amp;#34;) {
return(pass);
}
}
示例2：对于特定类型的资源，例如公开的图片等，取消其私有标识，并强行设定其可以由varnish缓存的时长；
if (beresp.http.cache-control !~ &amp;#34;s-maxage&amp;#34;) {
if (bereq.url ~ &amp;#34;(?i)\.(jpg|jpeg|png|gif|css|js)$&amp;#34;) {
unset beresp.http.Set-Cookie;
set beresp.ttl = 3600s;
}
}
缓存对象的修剪：purge, ban
(1) 能执行purge操作
sub vcl_purge {
return (synth(200,&amp;#34;Purged&amp;#34;));
}
(2) 何时执行purge操作
sub vcl_recv {
if (req.method == &amp;#34;PURGE&amp;#34;) {
return(purge);
}
...
}
添加此类请求的访问控制法则：
acl purgers {
&amp;#34;127.0.0.0&amp;#34;/8;
&amp;#34;10.1.0.0&amp;#34;/16;
}
sub vcl_recv {
if (req.method == &amp;#34;PURGE&amp;#34;) {
if (!client.ip ~ purgers) {
return(synth(405,&amp;#34;Purging not allowed for &amp;#34; + client.ip));
}
return(purge);
}
...
}
如何设定使用多个后端主机：
backend default {
.host = &amp;#34;172.16.100.6&amp;#34;;
.port = &amp;#34;80&amp;#34;;
}
backend appsrv {
.host = &amp;#34;172.16.100.7&amp;#34;;
.port = &amp;#34;80&amp;#34;;
}
sub vcl_recv {
if (req.url ~ &amp;#34;(?i)\.php$&amp;#34;) {
set req.backend_hint = appsrv;
} else {
set req.backend_hint = default;
}
...
}
Director：
varnish module；
使用前需要导入：
import director；
示例：
import directors; # load the directors
backend server1 {
.host =
.port =
}
backend server2 {
.host =
.port =
}
sub vcl_init {
new GROUP_NAME = directors.round_robin();
GROUP_NAME.add_backend(server1);
GROUP_NAME.add_backend(server2);
}
sub vcl_recv {
# send all traffic to the bar director:
set req.backend_hint = GROUP_NAME.backend();
}
BE Health Check：
backend BE_NAME {
.host =
.port =
.probe = {
.url=
.timeout=
.interval=
.window=
.threshhold=
}
}
.probe：定义健康状态检测方法；
.url：检测时请求的URL，默认为”/&amp;#34;;
.request：发出的具体请求；
.request =
&amp;#34;GET /.healthtest.html HTTP/1.1&amp;#34;
&amp;#34;Host: www.magedu.com&amp;#34;
&amp;#34;Connection: close&amp;#34;
.window：基于最近的多少次检查来判断其健康状态；
.threshhold：最近.window中定义的这么次检查中至有.threshhold定义的次数是成功的；
.interval：检测频度；
.timeout：超时时长；
.expected_response：期望的响应码，默认为200；
健康状态检测的配置方式：
(1) probe PB_NAME = { }
backend NAME = {
.probe = PB_NAME;
...
}
(2) backend NAME {
.probe = {
...
}
}
示例：
probe check {
.url = &amp;#34;/.healthcheck.html&amp;#34;;
.window = 5;
.threshold = 4;
.interval = 2s;
.timeout = 1s;
}
backend default {
.host = &amp;#34;10.1.0.68&amp;#34;;
.port = &amp;#34;80&amp;#34;;
.probe = check;
}
backend appsrv {
.host = &amp;#34;10.1.0.69&amp;#34;;
.port = &amp;#34;80&amp;#34;;
.probe = check;
}
varnish的运行时参数：
线程模型：
cache-worker
cache-main
ban lurker
acceptor：
epoll/kqueue：
...
线程相关的参数：
在线程池内部，其每一个请求由一个线程来处理； 其worker线程的最大数决定了varnish的并发响应能力；
thread_pools：Number of worker thread pools. 最好小于或等于CPU核心数量；
thread_pool_max：The maximum number of worker threads in each pool. 每线程池的最大线程数；
thread_pool_min：The minimum number of worker threads in each pool. 额外意义为“最大空闲线程数”；
最大并发连接数=thread_pools * thread_pool_max
thread_pool_timeout：Thread idle threshold. Threads in excess of thread_pool_min, which have been idle for at least this long, will be destroyed.
thread_pool_add_delay：Wait at least this long after creating a thread.
thread_pool_destroy_delay：Wait this long after destroying a thread.
设置方式：
vcl.param
param.set
永久有效的方法：
varnish.params
DEAMON_OPTS=&amp;#34;-p PARAM1=VALUE -p PARAM2=VALUE&amp;#34;
varnish日志区域：
shared memory log
计数器
日志信息
1、varnishstat - Varnish Cache statistics
-1
-1 -f FILED_NAME
-l：可用于-f选项指定的字段名称列表；
MAIN.cache_hit
MAIN.cache_miss
# varnishstat -1 -f MAIN.cache_hit -f MAIN.cache_miss
2、varnishtop - Varnish log entry ranking
-1 Instead of a continously updated display, print the statistics once and exit.
-i taglist，可以同时使用多个-i选项，也可以一个选项跟上多个标签；
-I &amp;lt;[taglist:]regex&amp;gt;
-x taglist：排除列表
-X &amp;lt;[taglist:]regex&amp;gt;
3、varnishlog - Display Varnish logs
4、 varnishncsa - Display Varnish logs in Apache / NCSA combined log format
内建函数：
hash_data()：指明哈希计算的数据；减少差异，以提升命中率；
regsub(str,regex,sub)：把str中被regex第一次匹配到字符串替换为sub；主要用于URL Rewrite
regsuball(str,regex,sub)：把str中被regex每一次匹配到字符串均替换为sub；
return()：
ban(expression)
ban_url(regex)：Bans所有的其URL可以被此处的regex匹配到的缓存对象；
synth(status,&amp;#34;STRING&amp;#34;)：purge操作；
总结：
varnish： state engine, vcl
varnish 4.0：
vcl_init
vcl_recv
vcl_hash
vcl_hit
vcl_pass
vcl_miss
vcl_pipe
vcl_waiting
vcl_purge
vcl_purge
vcl_deliver
vcl_synth
vcl_fini
vcl_backend_fetch
vcl_backend_response
vcl_backend_error
sub VCL_STATE_ENGINE
backend BE_NAME {}
probe PB_NAME {}
acl ACL_NAME {}
博客作业：以上所有内容；
课外实践：(1) zabbix监控varnish业务指标；
(2) ansible实现varnish快速部署；
(3) 两个lamp部署wordpress，用Nginx反代，做压测；nginx后部署varnish缓存，调整vcl，多次压测；
ab, http_load, webbench, seige, jmeter, loadrunner,...
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Linux系统高可用之HA-Cluster</title><link>/2015/11/03/linux%E7%B3%BB%E7%BB%9F%E9%AB%98%E5%8F%AF%E7%94%A8%E4%B9%8Bha-cluster/</link><pubDate>Tue, 03 Nov 2015 00:00:00 +0000</pubDate><guid>/2015/11/03/linux%E7%B3%BB%E7%BB%9F%E9%AB%98%E5%8F%AF%E7%94%A8%E4%B9%8Bha-cluster/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;
HA Cluster：
集群类型：LB（lvs/nginx（http/upstream, stream/upstream））、HA、HP
SPoF: Single Point of Failure
系统可用性的公式：A=MTBF/（MTBF+MTTR）
(0,1), 95%
几个9（指标）: 99%, ..., 99.999%，99.9999%；
99%： %1, 99.9%， 0.1%
系统故障：
硬件故障：设计缺陷、wear out、自然灾害、……
软件故障：设计缺陷、
提升系统高用性的解决方案之降低MTTR：
手段：冗余（redundant）
active/passive（主备），active/active（双主）
active --&amp;gt; HEARTBEAT --&amp;gt; passive
active &amp;lt;--&amp;gt; HEARTBEAT &amp;lt;--&amp;gt; active
高可用的是“服务”：
HA nginx service：
vip/nginx process[/shared storage]
资源：组成一个高可用服务的“组件”；
(1) passive node的数量？
(2) 资源切换？
shared storage：
NAS：文件共享服务器；
SAN：存储区域网络，块级别的共享；
Network partition：网络分区
隔离设备：
node：STONITH = Shooting The Other Node In The Head
资源：fence
quorum：
with quorum： &amp;gt; total/2
without quorum: &amp;lt;= total/2
TWO nodes Cluster？
辅助设备：ping node, quorum disk;
Failover：故障切换，即某资源的主节点故障时，将资源转移至其它节点的操作；
Failback：故障移回，即某资源的主节点故障后重新修改上线后，将转移至其它节点的资源重新切回的过程；
HA Cluster实现方案:
vrrp协议的实现
keepalived
ais：完备HA集群
RHCS（cman）
heartbeat
corosync
keepalived：
vrrp协议：Virtual Redundant Routing Protocol
术语：
虚拟路由器：Virtual Router
虚拟路由器标识：VRID(0-255)
物理路由器：
master：主设备
backup：备用设备
priority：优先级
VIP：Virtual IP
VMAC：Virutal MAC (00-00-5e-00-01-VRID)
通告：心跳，优先级等；周期性；
抢占式，非抢占式；
安全工作：
认证：
无认证
简单字符认证
MD5
工作模式：
主/备：单虚拟路径器；
主/主：主/备（虚拟路径器1），备/主（虚拟路径器2）
keepalived:
vrrp协议的软件实现，原生设计的目的为了高可用ipvs服务：
vrrp协议完成地址流动；
为vip地址所在的节点生成ipvs规则（在配置文件中预先定义）；
为ipvs集群的各RS做健康状态检测；
基于脚本调用接口通过执行脚本完成脚本中定义的功能，进而影响集群事务；
组件：
核心组件：
vrrp stack
ipvs wrapper
checkers
控制组件：配置文件分析器
IO复用器
内存管理组件
HA Cluster的配置前提：
(1) 各节点时间必须同步；
ntp, chrony
(2) 确保iptables及selinux不会成为阻碍；
(3) 各节点之间可通过主机名互相通信（对KA并非必须）；
建议使用/etc/hosts文件实现；
(4) 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信；（并非必须）
keepalived安装配置：
CentOS 6.4+
程序环境：
主配置文件：/etc/keepalived/keepalived.conf
主程序文件：/usr/sbin/keepalived
Unit File：keepalived.service
Unit File的环境配置文件：/etc/sysconfig/keepalived
配置文件组件部分：
TOP HIERACHY
GLOBAL CONFIGURATION
Global definitions
Static routes/addresses
VRRPD CONFIGURATION
VRRP synchronization group(s)：vrrp同步组；
VRRP instance(s)：每个vrrp instance即一个vrrp路由器；
LVS CONFIGURATION
Virtual server group(s)
Virtual server(s)：ipvs集群的vs和rs；
单主配置示例：
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.19
}
vrrp_instance VI_1 {
state BACKUP
interface eno16777736
virtual_router_id 14
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
virtual_ipaddress {
10.1.0.91/16 dev eno16777736
}
}
配置语法：
配置虚拟路由器：
vrrp_instance &amp;lt;STRING&amp;gt; {
....
}
专用参数：
state MASTER|BACKUP：当前节点在此虚拟路由器上的初始状态；只能有一个是MASTER，余下的都应该为BACKUP；
interface IFACE_NAME：绑定为当前虚拟路由器使用的物理接口；
virtual_router_id VRID：当前虚拟路由器的惟一标识，范围是0-255；
priority 100：当前主机在此虚拟路径器中的优先级；范围1-254；
advert_int 1：vrrp通告的时间间隔；
authentication {
auth_type AH|PASS
auth_pass &amp;lt;PASSWORD&amp;gt;
}
virtual_ipaddress {
&amp;lt;IPADDR&amp;gt;/&amp;lt;MASK&amp;gt; brd &amp;lt;IPADDR&amp;gt; dev &amp;lt;STRING&amp;gt; scope &amp;lt;SCOPE&amp;gt; label &amp;lt;LABEL&amp;gt;
192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2:1
}
track_interface {
eth0
eth1
...
}
配置要监控的网络接口，一旦接口出现故障，则转为FAULT状态；
nopreempt：定义工作模式为非抢占模式；
preempt_delay 300：抢占式模式下，节点上线后触发新选举操作的延迟时长；
定义通知脚本：
notify_master &amp;lt;STRING&amp;gt;|&amp;lt;QUOTED-STRING&amp;gt;：当前节点成为主节点时触发的脚本；
notify_backup &amp;lt;STRING&amp;gt;|&amp;lt;QUOTED-STRING&amp;gt;：当前节点转为备节点时触发的脚本；
notify_fault &amp;lt;STRING&amp;gt;|&amp;lt;QUOTED-STRING&amp;gt;：当前节点转为“失败”状态时触发的脚本；
notify &amp;lt;STRING&amp;gt;|&amp;lt;QUOTED-STRING&amp;gt;：通用格式的通知触发机制，一个脚本可完成以上三种状态的转换时的通知；
双主模型示例：
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.19
}
vrrp_instance VI_1 {
state MASTER
interface eno16777736
virtual_router_id 14
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
virtual_ipaddress {
10.1.0.91/16 dev eno16777736
}
}
vrrp_instance VI_2 {
state BACKUP
interface eno16777736
virtual_router_id 15
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass 578f07b2
}
virtual_ipaddress {
10.1.0.92/16 dev eno16777736
}
}
示例通知脚本：
#!/bin/bash
#
contact=&amp;#39;root@localhost&amp;#39;
notify() {
mailsubject=&amp;#34;$(hostname) to be $1, vip floating&amp;#34;
mailbody=&amp;#34;$(date +&amp;#39;%F %T&amp;#39;): vrrp transition, $(hostname) changed to be $1&amp;#34;
echo &amp;#34;$mailbody&amp;#34; | mail -s &amp;#34;$mailsubject&amp;#34; $contact
}
case $1 in
master)
notify master
;;
backup)
notify backup
;;
fault)
notify fault
;;
*)
echo &amp;#34;Usage: $(basename $0) {master|backup|fault}&amp;#34;
exit 1
;;
esac
脚本的调用方法：
notify_master &amp;#34;/etc/keepalived/notify.sh master&amp;#34;
notify_backup &amp;#34;/etc/keepalived/notify.sh backup&amp;#34;
notify_fault &amp;#34;/etc/keepalived/notify.sh fault&amp;#34;
虚拟服务器：
配置参数：
virtual_server IP port |
virtual_server fwmark int
{
...
real_server {
...
}
...
}
常用参数：
delay_loop &amp;lt;INT&amp;gt;：服务轮询的时间间隔；
lb_algo rr|wrr|lc|wlc|lblc|sh|dh：定义调度方法；
lb_kind NAT|DR|TUN：集群的类型；
persistence_timeout &amp;lt;INT&amp;gt;：持久连接时长；
protocol TCP：服务协议，仅支持TCP；
sorry_server &amp;lt;IPADDR&amp;gt; &amp;lt;PORT&amp;gt;：备用服务器地址；
real_server &amp;lt;IPADDR&amp;gt; &amp;lt;PORT&amp;gt;
{
weight &amp;lt;INT&amp;gt;
notify_up &amp;lt;STRING&amp;gt;|&amp;lt;QUOTED-STRING&amp;gt;
notify_down &amp;lt;STRING&amp;gt;|&amp;lt;QUOTED-STRING&amp;gt;
HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... }：定义当前主机的健康状态检测方法；
}
HTTP_GET|SSL_GET：应用层检测
HTTP_GET|SSL_GET {
url {
path &amp;lt;URL_PATH&amp;gt;：定义要监控的URL；
status_code &amp;lt;INT&amp;gt;：判断上述检测机制为健康状态的响应码；
digest &amp;lt;STRING&amp;gt;：判断上述检测机制为健康状态的响应的内容的校验码；
}
nb_get_retry &amp;lt;INT&amp;gt;：重试次数；
delay_before_retry &amp;lt;INT&amp;gt;：重试之前的延迟时长；
connect_ip &amp;lt;IP ADDRESS&amp;gt;：向当前RS的哪个IP地址发起健康状态检测请求
connect_port &amp;lt;PORT&amp;gt;：向当前RS的哪个PORT发起健康状态检测请求
bindto &amp;lt;IP ADDRESS&amp;gt;：发出健康状态检测请求时使用的源地址；
bind_port &amp;lt;PORT&amp;gt;：发出健康状态检测请求时使用的源端口；
connect_timeout &amp;lt;INTEGER&amp;gt;：连接请求的超时时长；
}
TCP_CHECK {
connect_ip &amp;lt;IP ADDRESS&amp;gt;：向当前RS的哪个IP地址发起健康状态检测请求
connect_port &amp;lt;PORT&amp;gt;：向当前RS的哪个PORT发起健康状态检测请求
bindto &amp;lt;IP ADDRESS&amp;gt;：发出健康状态检测请求时使用的源地址；
bind_port &amp;lt;PORT&amp;gt;：发出健康状态检测请求时使用的源端口；
connect_timeout &amp;lt;INTEGER&amp;gt;：连接请求的超时时长；
}
高可用的ipvs集群示例：
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.19
}
vrrp_instance VI_1 {
state MASTER
interface eno16777736
virtual_router_id 14
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
virtual_ipaddress {
10.1.0.93/16 dev eno16777736
}
notify_master &amp;#34;/etc/keepalived/notify.sh master&amp;#34;
notify_backup &amp;#34;/etc/keepalived/notify.sh backup&amp;#34;
notify_fault &amp;#34;/etc/keepalived/notify.sh fault&amp;#34;
}
virtual_server 10.1.0.93 80 {
delay_loop 3
lb_algo rr
lb_kind DR
protocol TCP
sorry_server 127.0.0.1 80
real_server 10.1.0.69 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
real_server 10.1.0.71 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
博客作业：第一部分
双主模式的lvs集群，拓扑、实现过程；
配置示例（一个节点）：
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from kaadmin@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.67
}
vrrp_instance VI_1 {
state MASTER
interface eno16777736
virtual_router_id 44
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass f1bf7fde
}
virtual_ipaddress {
172.16.0.80/16 dev eno16777736 label eno16777736:0
}
track_interface {
eno16777736
}
notify_master &amp;#34;/etc/keepalived/notify.sh master&amp;#34;
notify_backup &amp;#34;/etc/keepalived/notify.sh backup&amp;#34;
notify_fault &amp;#34;/etc/keepalived/notify.sh fault&amp;#34;
}
vrrp_instance VI_2 {
state BACKUP
interface eno16777736
virtual_router_id 45
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass f2bf7ade
}
virtual_ipaddress {
172.16.0.90/16 dev eno16777736 label eno16777736:1
}
track_interface {
eno16777736
}
notify_master &amp;#34;/etc/keepalived/notify.sh master&amp;#34;
notify_backup &amp;#34;/etc/keepalived/notify.sh backup&amp;#34;
notify_fault &amp;#34;/etc/keepalived/notify.sh fault&amp;#34;
}
virtual_server fwmark 3 {
delay_loop 2
lb_algo rr
lb_kind DR
nat_mask 255.255.0.0
protocol TCP
sorry_server 127.0.0.1 80
real_server 172.16.0.69 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 2
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.16.0.6 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 2
nb_get_retry 3
delay_before_retry 3
}
}
}
keepalived调用外部的辅助脚本进行资源监控，并根据监控的结果状态能实现优先动态调整；
分两步：(1) 先定义一个脚本；(2) 调用此脚本；
vrrp_script &amp;lt;SCRIPT_NAME&amp;gt; {
script &amp;#34;&amp;#34;
interval INT
weight -INT
}
track_script {
SCRIPT_NAME_1
SCRIPT_NAME_2
...
}
示例：高可用nginx服务
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.19
}
vrrp_script chk_down {
script &amp;#34;[[ -f /etc/keepalived/down ]] &amp;amp;&amp;amp; exit 1 || exit 0&amp;#34;
interval 1
weight -5
}
vrrp_script chk_nginx {
script &amp;#34;killall -0 nginx &amp;amp;&amp;amp; exit 0 || exit 1&amp;#34;
interval 1
weight -5
}
vrrp_instance VI_1 {
state MASTER
interface eno16777736
virtual_router_id 14
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
virtual_ipaddress {
10.1.0.93/16 dev eno16777736
}
track_script {
chk_down
chk_nginx
}
notify_master &amp;#34;/etc/keepalived/notify.sh master&amp;#34;
notify_backup &amp;#34;/etc/keepalived/notify.sh backup&amp;#34;
notify_fault &amp;#34;/etc/keepalived/notify.sh fault&amp;#34;
}
博客作业：以上所有内容；
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Linux安全策略之tcp_wrapper</title><link>/2015/11/01/linux%E5%AE%89%E5%85%A8%E7%AD%96%E7%95%A5%E4%B9%8Btcp_wrapper/</link><pubDate>Sun, 01 Nov 2015 00:00:00 +0000</pubDate><guid>/2015/11/01/linux%E5%AE%89%E5%85%A8%E7%AD%96%E7%95%A5%E4%B9%8Btcp_wrapper/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;tcp_wrapper：
库文件：libwrap.so，tcp包装器；
判断一个服务程序是否能够由tcp_wrapper进行访问控制的方法：
(1) 动态链接至libwrap.so库；
ldd /PATH/TO/PROGRAM
libwrap.so
(2) 静态编译libwrap.so库文件至程序中：
strings /PATH/TO/PGRGRAM
hosts_access
配置文件：/etc/hosts.allow, /etc/hosts.deny
See &amp;#39;man 5 hosts_options&amp;#39; and &amp;#39;man 5 hosts_access&amp;#39; for information on rule syntax.
配置文件语法：
daemon_list : client_list[ : option : option ...]
daemon_list：程序文件名称列表
(1) 单个应用程序文件名；
(2) 程序文件名列表，以逗号分隔；
(3) ALL：所有受tcp_wrapper控制的应用程序文件；
client_list：
(1) 单个IP地址或主机名；
(2) 网络地址：n.n.n.n/m.m.m.m，n.n.n.；
(3) 内建的ACL:
ALL：所有客户端主机；
LOCAL：Matches any host whose name does not contain a dot character.
UNKNOWN
KNOWN
PARANOID
OPERATORS：
EXCEPT
list1 EXCEPT list2 EXCEPT list3
sshd: 172.16. EXCEPT 172.16.100. EXCEPT 172.16.100.68
[ : option : option ...]
deny：拒绝，主要用于hosts.allow文件中定义“拒绝”规则；
allow：允许，主要用于hosts.deny文件中定义”允许“规则；
spawn：生成，发起，触发执行用户指定的任意命令，此处通常用于记录日志；
vsftpd: 172.16. : spawn /bin/echo $(date) login attempt from %c to %s &amp;gt;&amp;gt; /var/log/tcp_wrapper.log
练习：仅开放本机的sshd服务给172.16.0.0/16网络中除了172.16.0.0/24网络中的主机之外的所有主机，但允许172.16.0.200访问； 每次的用户访问都要记录于日志文件中；
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>CentOS 7 PXE 无盘系统配置说明</title><link>/2015/10/13/centos-7-pxe-%E6%97%A0%E7%9B%98%E7%B3%BB%E7%BB%9F%E9%85%8D%E7%BD%AE%E8%AF%B4%E6%98%8E/</link><pubDate>Tue, 13 Oct 2015 00:00:00 +0000</pubDate><guid>/2015/10/13/centos-7-pxe-%E6%97%A0%E7%9B%98%E7%B3%BB%E7%BB%9F%E9%85%8D%E7%BD%AE%E8%AF%B4%E6%98%8E/</guid><description>&lt;p&gt;PXE无盘工作站系统是指由一台或多台“系统服务器”和多台“PXE客户端(无盘工作站)”通过 交换机 相连组成的局域网系统。&lt;/p&gt;
&lt;p&gt;&lt;img alt="xitong.png" loading="lazy" src="/2015/10/13/centos-7-pxe-%E6%97%A0%E7%9B%98%E7%B3%BB%E7%BB%9F%E9%85%8D%E7%BD%AE%E8%AF%B4%E6%98%8E/xitong.png"&gt;&lt;/p&gt;
&lt;p&gt;系统服务器：通过DHCP+TFTP+NFS服务向无盘工作站提供系统支持&lt;/p&gt;
&lt;p&gt;　　· DHCP服务：向PXE客户端分发IP地址、子网掩码、网关等，并指定启动引导文件所在服务器（TFTP服务器）的地址和PXE启动文件（pxelinux.0）&lt;/p&gt;
&lt;p&gt;　　· TFTP服务：向PXE客户端传输PXE启动文件、PXE引导配置文件、linux内核vmlinuz，以及系统启动文件initrd.img&lt;/p&gt;
&lt;p&gt;　　· NFS服务：向PXE客户端发布工作站的系统（整个根目录“/”的克隆）；为了避免磁盘IO资源的冲突，建议将克隆的系统部署在存储服务器上&lt;/p&gt;
&lt;p&gt;PXE客户端：PXE客户端无需硬盘，只需要一块支持PXE启动的网卡,将“网卡启动”设置为首选&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;操作系统&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CentOS 7.2&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;软件环境&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;tftp-server-5.2-12.el7.x86_64&lt;/td&gt;
&lt;td&gt;向无盘工作站传输系统启动文件等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nfs-utils-1.3.0-0.21.el7.x86_64&lt;/td&gt;
&lt;td&gt;共享发布工作站系统&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;syslinux-4.05-12.el7.x86_64&lt;/td&gt;
&lt;td&gt;提供引导程序&amp;quot;pxelinux.0&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dhcp-4.2.5-42.el7.centos.x86_64&lt;/td&gt;
&lt;td&gt;提供DHCP 服务；指定TFTP 地址及PXE 启动文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dracut-033-359.el7.x86_64&lt;/td&gt;
&lt;td&gt;用来制作启动initrd 镜像&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dracut-network-033-359.el7.x86_64&lt;/td&gt;
&lt;td&gt;依赖包，否则将导致PXE无法启动&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="首先克隆好工作站的系统模板"&gt;首先，克隆好工作站的系统模板&lt;/h3&gt;
&lt;p&gt;配置之前关掉防火墙和selinux&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;systemctl stop firewalld #我还是比较习惯用iptables 所以关掉了 firewalld
systemctl disable firewalld
iptables -F #清空防火墙策略，如果之前有布置防火墙策略的需要查看下是否真要清空
iptables -vnL #查看filter防火墙策略
setenforce 0 #临时关闭selinux，重启后失效
vim /etc/sysconfig/selinux
SELINUX=disabled #关闭selinux，重启后生效
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;\1. 创建工作站系统模板的存放目录（/nodiskos/workstation）和启动引导文件存放目录（/nodiskos/tftpboot）&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkdir /nodiskos # 系统模板+启动文件存放目录
mkdir /nodiskos/tftpboot # 工作站系统启动文件存放目录
mkdir /nodiskos/workstation # 工作站系统模板存放目录
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;\2. 使用rsync 工具将整个&amp;quot;/&amp;ldquo;目录拷贝到/nodiskos/workstation 目录下，去除不需要的文件目录&lt;/p&gt;</description></item><item><title>Linux负载均衡之lvs</title><link>/2015/10/13/linux%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E4%B9%8Blvs/</link><pubDate>Tue, 13 Oct 2015 00:00:00 +0000</pubDate><guid>/2015/10/13/linux%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E4%B9%8Blvs/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;单台主机的处理能力是有限的，一台主机同时处理500个动态网页请求已经是极限了。这里有两种方法提升处理性能，一，定制高性能的计算机（Scale UP），众所周知计算机硬件设计成本极其高，性能每提高10%成本就要增加一倍，这也是intel被称为挤牙膏公司的原因，不是其研发能力不行而是计算机硬件性能提升的难度太大，这个方法貌似不可行。二，使用两台主机处理业务，这就会引来一个问题怎么把请求分发到多个主机（Scale Out），这里我们引入了负载均衡器。
使用负载均衡有两个方法，一是采用商用负载均衡硬件的，这个方法是最好的方法，能上硬件一定不要使用软件，又是硬件同样的问题也是价格，只要是涉及到基础设施的服务一定要使用。一方面是硬件的稳定性，比软件好很多，虽然软件可维护性和拓展性比较好，但是对于一些金融公司，他们玩的就是公信力和大众信心，每个故障都是竞争对手拆台的理由，一旦故障硬件背锅，理赔。常用的硬件F5的Big-IP，Citrix的Netscaler，A10的A10
另一种是采用软件负载均衡，只要考虑成本使用负载均衡软件就对了，它的性能比硬件也不会差别太大，并且灵活。
在做负载均衡的时候，我们在7层模型的哪一层做负载均衡，ip层基于主机做负载均衡粒度太大可用性太差基本不使用，更低的层基本上没有价值了，tcp层的话我们就可以把不同服务的请求采取不同的方式负载均衡，应用层的话我们可以根据具体协议拆包分析后负载均衡，既然涉及到拆开数据包，那处理的数据量就会大大增加，那么对计算机性能要求也越高，性能就越差，并且负载均衡器的通用性也越差。
传输层：lvs，nginx：(stream)，haproxy：(mode tcp)
应用层：
http：nginx, httpd, haproxy(mode http)
fastcgi：nginx, httpd
mysql：mysql-proxy
Linux Cluster：
Cluster：计算机集合，为解决某个特定问题组合起来形成的单个系统；
Linux Cluster类型：
LB：Load Balancing，负载均衡；
HA：High Availiablity，高可用；
A=MTBF/（MTBF+MTTR），MTBF:mean time bettween failure,平均工作时长或者平均故障间隔时间。MTTR:mean time to restoration/repair，平局修复时长
(0,1)：90%, 95%, 99%, 99.5%, 99.9%, 99.99%, 99.999%, 99.9999%
HP：High Performance，高性能；
分布式系统：
分布式存储
分布式计算
系统扩展方式：
Scale UP：向上扩展
Scale Out：向外扩展，增加计算机数量，也就形成了集群
LB Cluster：
LB Cluster的实现：
硬件：
F5 Big-IP
Citrix Netscaler
A10 A10
软件：
lvs：Linux Virtual Server
nginx
haproxy
ats：apache traffic server
perlbal
pound
基于工作的协议层次划分：
传输层（通用）：（DPORT）
lvs：
nginx：（stream）
haproxy：（mode tcp）
应用层（专用）：（自定义的请求模型分类）
proxy sferver：
http：nginx, httpd, haproxy(mode http), ...
fastcgi：nginx, httpd, ...
mysql：mysql-proxy, ...
...
站点指标：
PV：Page View
UV：Unique Vistor
IP：
会话保持：
(1) session sticky
Source IP
Cookie
(2) session replication;
session cluster
(3) session server
lvs：Linux Virtual Server 作者：章文嵩；alibaba --&amp;gt; didi
VS: Virtual Server
RS: Real Server
lvs: ipvsadm/ipvs 类似于 iptables/netfilter
ipvsadm：用户空间的命令行工具，规则管理器，用于管理集群服务及RealServer；
ipvs：工作于内核空间的netfilter的INPUT钩子之上的框架；
lvs集群类型中的术语：
vs：Virtual Server, Director, Dispatcher, Balancer
rs：Real Server, upstream server, backend server
CIP：Client IP, VIP: Virtual serve IP, RIP: Real server IP, DIP: Director IP
CIP &amp;lt;--&amp;gt; VIP == DIP &amp;lt;--&amp;gt; RIP
lvs集群的类型：
lvs-nat：修改请求报文的目标IP；多目标IP的DNAT；
lvs-dr：操纵封装新的MAC地址；
lvs-tun：在原请求IP报文之外新加一个IP首部；
lvs-fullnat：修改请求报文的源和目标IP；
lvs-nat：
多目标IP的DNAT，通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发；
（1）RIP和DIP必须在同一个IP网络，且应该使用私网地址；RS的网关要指向DIP；
（2）请求报文和响应报文都必须经由Director转发；Director易于成为系统瓶颈；
（3）支持端口映射，可修改请求报文的目标PORT；
（4）vs必须是Linux系统，rs可以是任意系统；
lvs-dr：
Direct Routing，直接路由；
通过为请求报文重新封装一个MAC首部进行转发，源MAC是DIP所在的接口的MAC，目标MAC是某挑选出的RS的RIP所在接口的MAC地址；源IP/PORT，以及目标IP/PORT均保持不变；
Director和各RS都得配置使用VIP；
(1) 确保前端路由器将目标IP为VIP的请求报文发往Director：
(a) 在前端网关做静态绑定；
(b) 在RS上使用arptables；
(c) 在RS上修改内核参数以限制arp通告及应答级别；
arp_announce
arp_ignore
(2) RS的RIP可以使用私网地址，也可以是公网地址；RIP与DIP在同一IP网络；RIP的网关不能指向DIP，以确保响应报文不会经由Director；
(3) RS跟Director要在同一个物理网络；
(4) 请求报文要经由Director，但响应不能经由Director，而是由RS直接发往Client；
(5) 不支持端口映射；
lvs-tun：
转发方式：不修改请求报文的IP首部（源IP为CIP，目标IP为VIP），而在原IP报文之外再封装一个IP首部（源IP是DIP，目标IP是RIP），将报文发往挑选出的目标RS；RS直接响应给客户端（源IP是VIP，目标IP是CIP）；
(1) DIP, VIP, RIP都应该是公网地址；
(2) RS的网关不能，也不可能指向DIP；
(3) 请求报文要经由Director，但响应不能经由Director；
(4) 不支持端口映射；
(5) RS的OS得支持隧道功能；
lvs-fullnat：
通过同时修改请求报文的源IP地址和目标IP地址进行转发；
CIP --&amp;gt; DIP
VIP --&amp;gt; RIP
(1) VIP是公网地址，RIP和DIP是私网地址，且通常不在同一IP网络；因此，RIP的网关一般不会指向DIP；
(2) RS收到的请求报文源地址是DIP，因此，只需响应给DIP；但Director还要将其发往Client；
(3) 请求和响应报文都经由Director；
(4) 支持端口映射；
注意：此类型默认不支持；
总结：
lvs-nat, lvs-fullnat：请求和响应报文都经由Director；
lvs-nat：RIP的网关要指向DIP；
lvs-fullnat：RIP和DIP未必在同一IP网络，但要能通信；
lvs-dr, lvs-tun：请求报文要经由Director，但响应报文由RS直接发往Client；
lvs-dr：通过封装新的MAC首部实现，通过MAC网络转发；
lvs-tun：通过在原IP报文之外封装新的IP报文实现转发，支持远距离通信；
ipvs scheduler：
根据其调度时是否考虑各RS当前的负载状态，可分为静态方法和动态方法两种：
静态方法：仅根据算法本身进行调度；
RR：roundrobin，轮询；
WRR：Weighted RR，加权轮询；
SH：Source Hashing，实现session sticy，源IP地址hash；将来自于同一个IP地址的请求始终发往第一次挑中的RS，从而实现会话绑定；
DH：Destination Hashing；目标地址哈希，将发往同一个目标地址的请求始终转发至第一次挑中的RS，典型使用场景是正向代理缓存场景中的负载均衡；
动态方法：主要根据每RS当前的负载状态及调度算法进行调度；
Overhead=
LC：least connections 选中最少连接数的RS服务器
Overhead=activeconns*256+inactiveconns
WLC：Weighted LC 默认调度方法
Overhead=(activeconns*256+inactiveconns)/weight
SED：Shortest Expection Delay 最短期望延迟，
Overhead=(activeconns+1)*256/weight
NQ：Never Queue 永不排队，权重小的不会空闲
LBLC：Locality-Based LC，动态的DH算法；
LBLCR：LBLC with Replication，带复制功能的LBLC；
ipvsadm/ipvs：
ipvs：
~]# grep -i -C 10 &amp;#34;ipvs&amp;#34; /boot/config-VERSION-RELEASE.x86_64
支持的协议：TCP， UDP， AH， ESP， AH_ESP, SCTP；
ipvs集群：
集群服务
服务上的RS
ipvsadm：
程序包：ipvsadm
Unit File: ipvsadm.service
主程序：/usr/sbin/ipvsadm
规则保存工具：/usr/sbin/ipvsadm-save
规则重载工具：/usr/sbin/ipvsadm-restore
配置文件：/etc/sysconfig/ipvsadm-config
ipvsadm命令：
核心功能：
集群服务管理：增、删、改；
集群服务的RS管理：增、删、改；
查看：
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]
ipvsadm -D -t|u|f service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address -r server-address [options]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
管理集群服务：增、改、删；
增、改：
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
删：
ipvsadm -D -t|u|f service-address
service-address：
-t|u|f：
-t: TCP协议的端口，VIP:TCP_PORT
-u: TCP协议的端口，VIP:UDP_PORT
-f：firewall MARK，是一个数字；
[-s scheduler]：指定集群的调度算法，默认为wlc；
管理集群上的RS：增、改、删；
增、改：
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
删：
ipvsadm -d -t|u|f service-address -r server-address
server-address：
rip[:port]
选项：
lvs类型：
-g: gateway, dr类型
-i: ipip, tun类型
-m: masquerade, nat类型
-w weight：权重；
清空定义的所有内容：
ipvsadm -C
查看：
ipvsadm -L|l [options]
--numeric, -n：numeric output of addresses and ports
--exact：expand numbers (display exact values)
--connection， -c：output of current IPVS connections
--stats：output of statistics information
--rate ：output of rate information
保存和重载：
ipvsadm -S = ipvsadm-save
ipvsadm -R = ipvsadm-restore
负载均衡集群设计时要注意的问题：
(1) 是否需要会话保持；
(2) 是否需要共享存储；
共享存储：NAS， SAN， DS（分布式存储）
数据同步：
课外作业：rsync+inotify实现数据同步
lvs-nat：
设计要点：
(1) RIP与DIP在同一IP网络, RIP的网关要指向DIP；
(2) 支持端口映射；
(3) Director要打开核心转发功能；
ipvsadm -A -t 172.16.252.127:80 -s rr // -s rr 课不写 默认为wlc
ipvsadm -a -t 172.16.252.127:80 -r 192.168.0.5:80 -m //[-w weight_num]
ipvsadm -a -t 172.16.252.127:80 -r 192.168.0.6:80 -m //[-w weight_num]
ipvsadm -L
echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward 转发功能打开
ifconfig eth0 192.168.191.131/24
route add default gw 192.168.191.1
测试：
for i in {1..10} ; do curl 172.16.252.127 ; done
实践作业（博客）：负载均衡一个php应用（wordpress）；
测试：(1) 是否需要会话保持；(2) 是否需要共享存储；
Demo：
lvs-dr：
dr模型中，各主机上均需要配置VIP，解决地址冲突的方式有三种：
(1) 在前端网关做静态绑定；
(2) 在各RS使用arptables；
(3) 在各RS修改内核参数，来限制arp响应和通告的级别；
限制响应级别：arp_ignore
0：默认值，表示可使用本地任意接口上配置的任意地址进行响应；
1: 仅在请求的目标IP配置在本地主机的接收到请求报文接口上时，才给予响应；
限制通告级别：arp_announce
0：默认值，把本机上的所有接口的所有信息向每个接口上的网络进行通告；
1：尽量避免向非直接连接网络进行通告；
2：必须避免向非本网络通告；
RS的预配置脚本：
#!/bin/bash
#
vip=10.1.0.5
mask=&amp;#39;255.255.255.255&amp;#39;
case $1 in
start)
echo 1 &amp;gt; /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 &amp;gt; /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 &amp;gt; /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 &amp;gt; /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig lo:0 $vip netmask $mask broadcast $vip up
route add -host $vip dev lo:0
;;
stop)
ifconfig lo:0 down
echo 0 &amp;gt; /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 &amp;gt; /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 &amp;gt; /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 &amp;gt; /proc/sys/net/ipv4/conf/lo/arp_announce
;;
*)
echo &amp;#34;Usage $(basename $0) start|stop&amp;#34;
exit 1
;;
esac
VS的配置脚本：
#!/bin/bash
#
vip=&amp;#39;10.1.0.5&amp;#39;
iface=&amp;#39;eno16777736:0&amp;#39;
mask=&amp;#39;255.255.255.255&amp;#39;
port=&amp;#39;80&amp;#39;
rs1=&amp;#39;10.1.0.7&amp;#39;
rs2=&amp;#39;10.1.0.8&amp;#39;
scheduler=&amp;#39;wrr&amp;#39;
type=&amp;#39;-g&amp;#39;
case $1 in
start)
ifconfig $iface $vip netmask $mask broadcast $vip up
iptables -F
ipvsadm -A -t ${vip}:${port} -s $scheduler
ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1
ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1
;;
stop)
ipvsadm -C
ifconfig $iface down
;;
*)
echo &amp;#34;Usage $(basename $0) start|stop&amp;#34;
exit 1
;;
esac
课外扩展作业：vip与dip/rip不在同一网段的实验环境设计及配置实现；
博客作业：lvs的详细应用
讲清楚类型、调度方法；并且给出nat和dr类型的设计拓扑及具体实现；
FWM：FireWall Mark
netfilter：
target: MARK, This target is used to set the Netfilter mark value associated with the packet.
--set-mark value
借助于防火墙标记来分类报文，而后基于标记定义集群服务；可将多个不同的应用使用同一个集群服务进行调度；
打标记方法（在Director主机）：
# iptables -t mangle -A PREROUTING -d $vip -p $proto --dport $port -j MARK --set-mark NUMBER
基于标记定义集群服务：
# ipvsadm -A -f NUMBER [options]
lvs persistence：持久连接
持久连接模板：实现无论使用任何调度算法，在一段时间内，能够实现将来自同一个地址的请求始终发往同一个RS；
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
port Affinity：
每端口持久：每个端口对应定义为一个集群服务，每集群服务单独调度；
每防火墙标记持久：基于防火墙标记定义集群服务；可实现将多个端口上的应用统一调度，即所谓的port Affinity；
每客户端持久：基于0端口定义集群服务，即将客户端对所有应用的请求统统调度至后端主机，必须定义为持久模式；
保存及重载规则：
保存：建议保存至/etc/sysconfig/ipvsadm
ipvsadm-save &amp;gt; /PATH/TO/IPVSADM_FILE
ipvsadm -S &amp;gt; /PATH/TO/IPVSADM_FILE
systemctl stop ipvsadm.service
重载：
ipvsadm-restore &amp;lt; /PATH/FROM/IPVSADM_FILE
ipvsadm -R &amp;lt; /PATH/FROM/IPVSADM_FILE
systemctl restart ipvsadm.service
考虑：
(1) Director不可用，整个系统将不可用；SPoF
解决方案：高可用
keepalived
heartbeat/corosync
(2) 某RS不可用时，Director依然会调度请求至此RS；
解决方案：对各RS的健康状态做检查，失败时禁用，成功时启用；
keepalived
heartbeat/corosync, ldirectord
检测方式：
(a) 网络层检测；
(b) 传输层检测，端口探测；
(c) 应用层检测，请求某关键资源；
ok --&amp;gt; failure
failure --&amp;gt; ok
ldirectord：
Daemon to monitor remote services and control Linux Virtual Server. ldirectord is a daemon to monitor and administer real servers in a cluster of load balanced virtual servers. ldirectord typically is started from heartbeat but can also be run from the command line.
配置示例：
checktimeout=3
checkinterval=1
fallback=127.0.0.1:80
autoreload=yes
logfile=&amp;#34;/var/log/ldirectord.log&amp;#34;
quiescent=no
virtual=5
real=172.16.0.7:80 gate 2
real=172.16.0.8:80 gate 1
fallback=127.0.0.1:80 gate
service=http
scheduler=wrr
checktype=negotiate
checkport=80
request=&amp;#34;index.html&amp;#34;
receive=&amp;#34;CentOS&amp;#34;
补充：共享存储
NAS：Network Attached Storage
nfs/cifs
文件系统接口
SAN：Storage Area Network
“块”接口
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Linux负载均衡之lvs-dr模式</title><link>/2015/10/13/linux%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E4%B9%8Blvs-dr%E6%A8%A1%E5%BC%8F/</link><pubDate>Tue, 13 Oct 2015 00:00:00 +0000</pubDate><guid>/2015/10/13/linux%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E4%B9%8Blvs-dr%E6%A8%A1%E5%BC%8F/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;lvs-dr：
dr模型中，各主机上均需要配置VIP，解决地址冲突的方式有三种：
(1) 在前端网关做静态绑定；
(2) 在各RS使用arptables；
(3) 在各RS修改内核参数，来限制arp响应和通告的级别；
限制响应级别：arp_ignore
0：默认值，表示可使用本地任意接口上配置的任意地址进行响应；
1: 仅在请求的目标IP配置在本地主机的接收到请求报文接口上时，才给予响应；
限制通告级别：arp_announce
0：默认值，把本机上的所有接口的所有信息向每个接口上的网络进行通告；
1：尽量避免向非直接连接网络进行通告；
2：必须避免向非本网络通告；
RS的预配置脚本：
#!/bin/bash
#
vip=10.1.0.5
mask=&amp;#39;255.255.255.255&amp;#39;
case $1 in
start)
echo 1 &amp;gt; /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 &amp;gt; /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 &amp;gt; /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 &amp;gt; /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig lo:0 $vip netmask $mask broadcast $vip up
route add -host $vip dev lo:0//当发往本机的请求报文目标地址为 vip 的时候，本机的响应报文从lo:o应答
;;
stop)
ifconfig lo:0 down
echo 0 &amp;gt; /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 &amp;gt; /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 &amp;gt; /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 &amp;gt; /proc/sys/net/ipv4/conf/lo/arp_announce
;;
*)
echo &amp;#34;Usage $(basename $0) start|stop&amp;#34;
exit 1
;;
esac
VS
ifconfig eno16777736:0 172.16.0.50 netmask 255.255.255.255 broadcast 172.16.0.50 up
vip=172.16.0.50
VS的配置脚本：
#!/bin/bash
#
vip=&amp;#39;10.1.0.5&amp;#39;
iface=&amp;#39;eno16777736:0&amp;#39;
mask=&amp;#39;255.255.255.255&amp;#39;
port=&amp;#39;80&amp;#39;
rs1=&amp;#39;10.1.0.7&amp;#39;
rs2=&amp;#39;10.1.0.8&amp;#39;
scheduler=&amp;#39;wrr&amp;#39;
type=&amp;#39;-g&amp;#39;
case $1 in
start)
ifconfig $iface $vip netmask $mask broadcast $vip up
iptables -F
ipvsadm -A -t ${vip}:${port} -s $scheduler
ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1
ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1
;;
stop)
ipvsadm -C
ifconfig $iface down
;;
*)
echo &amp;#34;Usage $(basename $0) start|stop&amp;#34;
exit 1
;;
esac
课外扩展作业：vip与dip/rip不在同一网段的实验环境设计及配置实现；
博客作业：lvs的详细应用
讲清楚类型、调度方法；并且给出nat和dr类型的设计拓扑及具体实现；
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>PXE配置文档</title><link>/2015/10/13/pxe%E9%85%8D%E7%BD%AE%E6%96%87%E6%A1%A3/</link><pubDate>Tue, 13 Oct 2015 00:00:00 +0000</pubDate><guid>/2015/10/13/pxe%E9%85%8D%E7%BD%AE%E6%96%87%E6%A1%A3/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;p&gt;目前所做为测试，即在虚拟机上的测试。先简单介绍一下整体环境，两台centos7.2系统，7-2-a（安装vsftp tftp）和7-2-b（安装dhcp服务）&lt;/p&gt;
&lt;p&gt;在7-2-a ip:192.168.199.149 的操作：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;systemctl stop firewalld
setenforce 0
yum install -y vsftpd tftp-server syslinux
cp -a /misc/cd/* /var/ftp
cp /root/anaconda-ks.cfg /var/ftp/ks.cfg
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;//这里ks.cfg需要根据自己需求简单修改配置，后面会说明用system-config-kickstart 如何配置ks.cfg&lt;/p&gt;
&lt;p&gt;内容修改如下&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#platform=x86, AMD64, or Intel EM64T
#version=DEVEL
# Install OS instead of upgrade
install
# Keyboard layouts
keyboard &amp;#39;us&amp;#39;
# Root password
rootpw --iscrypted $1$gfl.Vz5t$mqzEhPMYDiANGwDB8gj/E/
# System timezone
timezone Asia/Shanghai
user --name=superman --password=$6$cq8y5jAZQCGd4muD$8G7zz.fpZFK3rI0AA7dyAxeD2B3mIjgu1HY/yeOm.PdsYHAYsD77K8uXTjbEPvJs9z7M6s0TECr6FtL2Bc5to/ --iscrypted --gecos=&amp;#34;superman&amp;#34; #为服务器添加一个用户
# Use network installation
url --url=&amp;#34;ftp://192.168.199.149&amp;#34;
# System language
lang en_US
# Firewall configuration
firewall --disabled
# System authorization information
auth --useshadow --passalgo=sha512
# Use text mode install
text
firstboot --enable
# SELinux configuration
selinux --disabled
# Network information
network --bootproto=dhcp --device=eno16777736 --ipv6=auto --activate
network --hostname=7-2-test
# Reboot after installation
reboot
# System bootloader configuration
bootloader --location=mbr --boot-drive=sda
# Partition clearing information
clearpart --all --initlabel
# Disk partitioning information
part / --fstype=&amp;#34;xfs&amp;#34; --size=12040
part /boot --fstype=&amp;#34;xfs&amp;#34; --size=10240
part /home --fstype=&amp;#34;xfs&amp;#34; --size=10240
part /var --fstype=&amp;#34;xfs&amp;#34; --size=20480
part /usr --fstype=&amp;#34;xfs&amp;#34; --size=10240
part /tmp --fstype=&amp;#34;xfs&amp;#34; --size=10240
%packages
@^minimal
@core
@ftp-server
%end
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;配置tftp-server&lt;/p&gt;</description></item><item><title>Linux程序包的编译安装</title><link>/2015/09/20/linux%E7%A8%8B%E5%BA%8F%E5%8C%85%E7%9A%84%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85/</link><pubDate>Sun, 20 Sep 2015 00:00:00 +0000</pubDate><guid>/2015/09/20/linux%E7%A8%8B%E5%BA%8F%E5%8C%85%E7%9A%84%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;p&gt;在有些源代码程序没有被编译成rpm的时候，或者其他人写了一个源代码程序，要把它安装在服务器上要怎么做呢？
那就需要对源代码进行编译安装了。
C代码编译安装三步骤：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1、./configure：
(1)通过选项传递参数，指定启用特性、安装路径等；执行时会参考用户的指定以及makefile.in文件生成makefile
(2) 检查依赖到的外部环境，如依赖的软件包
2、make：根据makefile文件，构建应用程序
3、make install:复制文件到相应路径
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;开发工具：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;autoconf: 生成configure脚本
automake：生成Makefile.in
注意：安装前查看INSTALL，README
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例子:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;下面就以编译安装HTTP服务为例进行说明：
首先要 获取到HTTP源代码，此处通过FTP获取
yum install lftp 安装FTP--源代码获取工具
ftp://172.16.0.1/pub/Sources/sources/httpd/httpd-2.2.29.tar.bz2 --下载源代码
tar xvf httpd-2.2.29.tar.bz2 --解压源代码--&amp;gt; 得到http-2.2.29 目录
由于要用到autoconf和automake工具 因此可以安装 工具包
yum groupinstall &amp;#34;Development Tools&amp;#34;
安装工具安装好了之后进入http目录执行 ./configure命令，注意这个命令要指定该软件安装的程序所在目录，以及配置文件所在目录。所以执行./configure命令之前要先看一下目录下的INSTALL、README两个文件
http服务中--prefix=程序安装目录 --sysconfdir=配置文件目录 如果不加这两个选项，是有默认安装路径的。在man帮助中有，接下来执行：
./configure --prefix=/usr/local/huyuhttp --sysconfdir=/etc/huyuhttp/
make 和 make install
这样呢其实已经安装完了http服务，但是此时http还没有启动，帮助文档还不能方便查看，调用的库也不行，共享库有哪些也不知道，所以要进行接下来的配置。
1、在/etc/profile.d/目录下创建一个以.sh结尾的文件，修改path变量，加入http二进制程序路径，这样就可以不用加路径直接执行http程序了。
vim /etc/profile.d/huyuhttp.sh
PATH=$PATH:/usr/local/huyuhttp/bin
. /etc/profile.d/huyuhttp.sh 刷新path变量值
2、添加man手册，可以方便查看帮助
vim /etc/man_db.conf /usr/local/huyuhttp/man
3、添加lib图文件目录
vim /etc/ld.so.conf.d/huyuhttp.conf /usr/local/huyuhttp/lib
ldconfig 刷新库文件缓存
4、添加头文件，这里只需要在include的目录中加入http的include目录链接即可
ln -s /usr/local/huyuhttp/include/ /usr/include/huyuhttp
5、关闭防火墙
iptables -F
6、开启http
apachectl start
7、查看端口是否打开
netstat -ant 查看80
8、测试查看网页
links ip
curl ip
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>dd命令制作U盘启动</title><link>/2015/09/19/dd%E5%91%BD%E4%BB%A4%E5%88%B6%E4%BD%9Cu%E7%9B%98%E5%90%AF%E5%8A%A8/</link><pubDate>Sat, 19 Sep 2015 00:00:00 +0000</pubDate><guid>/2015/09/19/dd%E5%91%BD%E4%BB%A4%E5%88%B6%E4%BD%9Cu%E7%9B%98%E5%90%AF%E5%8A%A8/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;1、插入U盘，df -h查看U盘文件系统挂载情况，然后使用umount /dev/sdb*卸载U盘文件系统；
2、执行命令：sudo mkfs.vfat -I /dev/sdb格式化U盘为FAT格式；
3、dd if=*/*.iso   of=/dev/sdb  bs=4M  (数据块大小，每个数据块只能存一个文件的数据)
4、执行sync，同步缓存中的数据至U盘；
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Linux sed</title><link>/2015/09/13/linux-sed/</link><pubDate>Sun, 13 Sep 2015 00:00:00 +0000</pubDate><guid>/2015/09/13/linux-sed/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;h1 id="sed--stream-editor"&gt;sed : Stream EDitor&lt;/h1&gt;
&lt;p&gt;sed是一种流编辑器，它一次处理一行内容。处理时，把当前处理的行存储在临时缓冲区中，称为“模式空间”（pattern space），接着用sed命令处理缓冲区中的内容，处理完成后，把缓冲区的内容送往屏幕。接着处理下一行，这样不断重复，直到文件末尾。文件内容并没有改变，除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等&lt;/p&gt;
&lt;h2 id="用法"&gt;用法&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sed [option]... &amp;#39;script&amp;#39; inputfile...
常用选项：
-n：不输出模式空间内容到屏幕，即不自动打印,默认在输出前会打印源内容
-e: 多点编辑
-f：/PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本
-r: 支持使用扩展正则表达式
-i: 原处编辑
script:
&amp;#39;地址命令&amp;#39;= [地址定界] + 编辑命令 + [替换标记]
地址定界：
(1) 不给地址：对全文进行处理
(2) 单地址：
#: 指定的行
/pattern/：被此处模式所能够匹配到的每一行
(3) 地址范围：
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~：步进
1~2 奇数行
2~2 偶数行
编辑命令：
d: 删除模式空间匹配的行
p: 显示模式空间中的内容
a [\]text：在指定行后面追加文本，支持使用\n实现多行追加
i[\]text：在行前面插入文本
c [\]text：替换行为单行或多行文本
w /path/somefile: 保存模式匹配的行至指定文件
r /path/somefile：读取指定文件的文本至模式空间中匹配到的行后
=: 为模式空间中的行打印行号
!:模式空间中匹配行取反处理
s///：查找替换,支持使用其它分隔符，s@@@，s###
替换标记：
g: 行内全局替换
p: 显示替换成功的行
w /PATH/TO/SOMEFILE：将替换成功的行保存至文件中
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="实例"&gt;实例&lt;/h2&gt;
&lt;p&gt;例子来啦!没有例子呢,的确是很难懂的.那么下面就尽量给多一点例子,来详细分析上面的意思.&lt;/p&gt;</description></item><item><title>CentOS系统yum的配置</title><link>/2015/08/25/centos%E7%B3%BB%E7%BB%9Fyum%E7%9A%84%E9%85%8D%E7%BD%AE/</link><pubDate>Tue, 25 Aug 2015 00:00:00 +0000</pubDate><guid>/2015/08/25/centos%E7%B3%BB%E7%BB%9Fyum%E7%9A%84%E9%85%8D%E7%BD%AE/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;p&gt;yum仓库使用起来特别方便，然而使用之前当然是要配置的啦。下面就介绍一下怎么从0 配置一个yum仓库。
首先要创建yum仓库，当然不能使只给一台服务器用，那要给多个服务器用的话，就需要网络服务。yum仓库支持的网络服务有两种，FTP和HTTP。用yum主要用到的是数据传输，因此FTP更适合创建yum仓库，下面就以FTP为例，说明一下yum仓库的配置。
第一步是要先在自己的服务器上提供FTP服务，而这个时候还没有yum仓库，所以只能使用rpm的方式安装vsftp，把FTP服务搭起来。这个包必须要提前有，或者从光盘中获取。
获取安装 FTP服务 并启用&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkdir /mnt/cdrom
mount /dev/cdrom /mnt/cdrom
rpm -ivh /mnt/cdrom Packages/vsftpd-3.0.2-10.el7.x86_64.rpm
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;注意，在CentOS 6 和CentOS 7 上开启FTP服务的命令式不一样的。
iptables -F（在CentOS 7 上 也可以使用systemctl stop firewalld 来关闭防火墙）
CentOS-6 开启FTP服务
chkconfig vsftpd on === 立即打开FTP，但重启后失效
service vsftpd start === 开启FTP服务，但不会立即生效
CentOS-7 开启FTP服务
systemctl enable vsftpd === 立即打开FTP，但重启后失效
systemctl start vsftpd === 开启FTP服务，但不会立即生效&lt;/p&gt;
&lt;p&gt;到此为止FTP服务就开启啦，在一个局域网内的电脑只需要在浏览器里面输入 ftp://ip 就可以访问这个服务器啦
但是里面说明内容的没有，顶多只有一个lost+found 和pub 的文件夹，这个目录就是本机的/var/ftp/ 共享文件要放到这个文件里面。
需要注意一点，共享的文件所有FTP客户端都可以访问，所以我们这里如果创建yum仓库的话是可以给众多使用yum的系统提供yum仓库的，只不过不同系统例如CentOS 5 、CentOS 6.7 CentOS6.8 CentOS 7 等不同版本的系统使用的程序安装包不同，所以只需要在这里分类创建文件夹，供各类系统使用即可。
实例：&lt;/p&gt;</description></item><item><title>Linux查找命令find和locate</title><link>/2015/08/24/linux%E6%9F%A5%E6%89%BE%E5%91%BD%E4%BB%A4find%E5%92%8Clocate/</link><pubDate>Mon, 24 Aug 2015 00:00:00 +0000</pubDate><guid>/2015/08/24/linux%E6%9F%A5%E6%89%BE%E5%91%BD%E4%BB%A4find%E5%92%8Clocate/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;p&gt;有些时候我们是想要在系统中查找某个具体的文件，却不知道路径在哪里，只是知道其中的某些特性，比如大小或者名字什么的。这时候就要用到查找工具啦。
在文件系统上查找符合条件的文件命令有两个，locate和find，其中locate是非实时查找即数据库查找。而find是实时查找&lt;/p&gt;
&lt;p&gt;locate：
用法：locate [OPTION]&amp;hellip; [PATTERN]&amp;hellip;
[option]
-i 不区分大小写
-n # 只列举前N个匹配项目
-r 使用扩展正则表达式 查询
locate foo 搜索名称或路径中带有foo的文件
locate -r &amp;lsquo;.foo$&amp;rsquo; 使用扩展正则表达式来搜索以 &amp;ldquo;.foo&amp;rdquo; 结尾的文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;查询系统上的文件索引数据库
/var/lib/mlocate/mlocate.db
依赖于实现构建的索引，
索引的构建是在系统较为空闲时自动进行的（周期性任务），也可管理员手动更新数据库（updatedb）
索引构建过程需要遍历整个根文件系统，极消耗资源
工作特点：
查找速度快（只查找数据库中有的数据）
模糊查找
非实时查找（在索引构建之后创建的文件时不能找到的）
搜索的是文件的全路径，不仅仅是文件名
可能只搜索用户具备读取和执行权限的目录
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;find：
find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path&amp;hellip;] [expression]
即：find [option] [查找路径] [查找条件] [处理动作]
查找路径：指定具体目标路径，【默认为当前目录】
查找条件：指定的查找标准，可以文件名、大小、类型、权限等。默认找出指定路径下的所有文件
处理动作：对符合条件的文件做操作，默认输出至屏幕
【查找条件】
根据文件名和inode查找：
-name “文件名称”： 支持使用glob （文件名通配符） &lt;em&gt;，？，[],[^]
-iname “文件名称” ： 不区分字母大小写
inum n 按inode号查找
-samefile name 相同inode号的文件
-links n 链接数为n的文件
-regex “PATTERN”：以pattern匹配整个文件路径字符串，而不仅仅是文件名称
根据属主属组查找：
-user username：
-group groupname：
-uid userid：
-gid groupid：
-nouser：查找没有属主的文件
-nogroup：查找没有属组的文件
根据文件类型查找：
-type type： f,d,l,s,b,c,p
根据组合条件查找：
-a -o -not=!
根据文件大小来查找：
-size [+|-]#UNIT (k,M,G)
#UNIT (#-1,#] &amp;ndash;&amp;gt; 如6k 即（5k,6k] 5k到6k 但不包括5k
-#UNIT:[0,#-1] &amp;ndash;&amp;gt;如6k 即[0,5k]
+#UNIT:(#,∞) 大于# 但不包括#
根据时间戳查找：
以 【天】为单位
-atime[+|-]# ： [0,#) [#,#+1) [#+1,∞]
-mtime[+|-]# ：
-ctime[+|-]# ：
以【分钟】为单位
-amin[+|-]# ：
-mmin[+|-]# ：
-cmin[+|-]# ：
根据权限查找：
-perm [/|-] mode
mode : 精确匹配，不能多不能少
/mode 或+mode ： 或关系 ugo中 只要有一个匹配即可
-mode : ugo必须至少拥有或比mode更多权限
【处理动作】
-print：默认处理动作
-ls：类似于对查找到的文件执行 ls -l
-delete:删除查找到的文件
-fls file：查找到的所有文件的长格式信息保存至指定文件中
-ok commond {} ; 对查找到的每个文件执行有commond指定的命令，每个文件执行前都要交互式确认
-exec commond {} ; 对查找到的每个文件执行有commond指定的命令
{}：用于引用查找到的文件名称自身
例：
find -name “&lt;/em&gt;.conf” -exec cp {} {}.orig ;
•备份配置文件，添加.orig这个扩展名
find /tmp -ctime +3 -user joe -ok rm {} ;
•提示删除存在时间超过３天以上的joe的临时文件
find ~ -perm -002 -exec chmod o-w {} \ ;
•在你的主目录中寻找可被其它用户写入的文件
find /data –type f -perm 644 -name “*.sh” –exec chmod 755 {} ;
•在 /data 目录中 找出所有 以.sh 结尾没有执行全选的文件 增加执行权限
find /home -type d -ls
找出所有/home 目录下的 目录 列出详细信息&lt;/p&gt;</description></item><item><title>Linux安装命令yum的使用</title><link>/2015/08/23/linux%E5%AE%89%E8%A3%85%E5%91%BD%E4%BB%A4yum%E7%9A%84%E4%BD%BF%E7%94%A8/</link><pubDate>Sun, 23 Aug 2015 00:00:00 +0000</pubDate><guid>/2015/08/23/linux%E5%AE%89%E8%A3%85%E5%91%BD%E4%BB%A4yum%E7%9A%84%E4%BD%BF%E7%94%A8/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;p&gt;YUM: yellowdog update modifier ，rpm的前端程序，用来解决软件包相关依赖性，可以在多个库之间定位软件包。
yum repository：yum repo，存储了众多RPM包，以及包相关的元数据文件，放置于特定目录repodata下。
yum 访问的文件服务器主要有三种，ftp，http，file。&lt;/p&gt;
&lt;p&gt;yum客户端配置文件：
【/etc/yum.conf】:为所有仓库提供公共配置,man /etc/yum.conf 有英文详解
[main]
cachedir=/var/cache/yum
//yum 缓存的目录，yum 在此存储下载的rpm 包和数据库，默认设置为/var/cache/yum
keepcache=0
　　//安装完成后是否保留软件包，0为不保留（默认为0），1为保留
debuglevel=2
　　//Debug 信息输出等级，范围为0-10，缺省为2
logfile=/var/log/yum.log
　　//yum 日志文件位置。用户可以到/var/log/yum.log 文件去查询过去所做的更新。
pkgpolicy=newest
//包的策略。一共有两个选项，newest 和last，这个作用是如果你设置了多个repository，而同一软件在不同的repository 中同时存在，yum 应该安装哪一个，如果是newest，则yum 会安装最新的那个版本。如果是last，则yum 会将服务器id 以字母表排序，并选择最后的那个服务器上的软件安装。一般都是选newest。
distroverpkg=centos-release
　　//指定一个软件包，yum 会根据这个包判断你的发行版本，默认是 centos-release，也可以是安装的任何针对自己发行版的rpm 包。
tolerant=1
//有1和0两个选项，表示yum 是否容忍命令行发生与软件包有关的错误，比如你要安装1,2,3三个包，而其中3此前已经安装了，如果你设为1,则yum 不会出现错误信息。默认是0。
exactarch=1
　　//有1和0两个选项，设置为1，则yum 只会安装和系统架构匹配的软件包，例如，yum 不会将i686的软件包安装在适合i386的系统中。默认为1。
retries=6
　　//网络连接发生错误后的重试次数，如果设为0，则会无限重试。默认值为6.
obsoletes=1
　　//这是一个update 的参数，具体请参阅yum(8)，简单的说就是相当于upgrade，允许更新陈旧的RPM包。
plugins=1
//是否启用插件，默认1为允许，0表示不允许。我们一般会用yum-fastestmirror这个插件。官方yum源的速度实在让人不敢恭维，而非官方的yum源又五花八门，让人难以取舍。幸运的是，yum-fastestmirror插件弥补了这一缺陷：自动选择最快的yum源。安装之后，生成配置文件/etc/yum/pluginconf.d/fastestmirror.conf。配置文件中的hostfilepath字段，用于定义yum源的配置文件（通常是/var/cache/yum/x86/7/timedhosts.txt），然后我们就可以将所知道的yum源统统写入这个txt文件
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=16&amp;amp;ref=http://bugs.centos.org/bug_report_page.php?category=yum&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; metadata_expire=1h
installonly_limit = 5
【/etc/yum.repo.d/*.repo】:为仓库的指向提供配置 主要配置 [repositoryID] baseurl gpgcheck 三个即可使用仓库
[repositoryID] //仓库ID
name=Some name for this repository//仓库名称
baseurl=url://path/to/repository/ //仓库路径，路径必须给到 repodata文件夹所在的目录
URL可以有一下三种，file，ftp，http
enabled={1|0} //使能
gpgcheck={1|0} //是否检查来源合法性
gpgkey=URL //gpg证书来源路径
enablegroups={1|0
failovermethod={roundrobin|priority}
默认为：roundrobin，意为随机挑选；
cost= 默认为1000
yum的repo配置文件中可用的变量：
$releasever: 当前OS的发行版的主版本号
$arch: 平台，i386,i486,i586,x86_64等
$basearch：基础平台；i386
$YUM0-$YUM9:自定义变量
实例:
baseurl=http://server/centos/$releasever/$basearch/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;yum命令的用法：yum [options] [command] [package &amp;hellip;]
yum-config-manager &amp;ndash;add-repo= http://172.16.0.1/cobbler/ks_mirror/CentOS-X-x86_64/ 快速非交互式创建yum仓库
yum-config-manager &amp;ndash;disable “仓库名&amp;quot; 禁用仓库
yum-config-manager &amp;ndash;enable “仓库名” 启用仓库
yum repolist [all|enabled|disabled] 显示仓库 所有的|可用的|禁用的
yum list [all | glob_exp1] [glob_exp2] [&amp;hellip;] 根据需求筛选需要的RPM包
yum list {available|installed|updates} [glob_exp1]
yum install package1 [package2] [&amp;hellip;]
yum reinstall package1 [package2] [&amp;hellip;] 重新安装
yum remove | erase package1 [package2] [&amp;hellip;] 卸载
yum provides | whatprovidesfeature1 [feature2] [&amp;hellip;]查看指定的特性(可以是某文件)是由哪个程序包所提供：
yum clean [ packages | metadata | expire-cache | rpmdb| plugins | all ]清理本地缓存：
yum search string1 [string2] [&amp;hellip;] 以指定的关键字搜索程序包名及summary信息
yum history
yum history info 6
yum history undo 6
yum history redo 6
包组管理的相关命令：
yum groupinstall group1 [group2] [&amp;hellip;]
yum groupupdate group1 [group2] [&amp;hellip;]
yum grouplist [hidden] [groupwildcard] [&amp;hellip;]
yum groupremove group1 [group2] [&amp;hellip;]
yum groupinfo group1 [&amp;hellip;]
-y: 自动回答为“yes” 可实现非交互式
创建yum仓库：
createrepo[options] &lt;directory&gt;&lt;/p&gt;</description></item><item><title>Linux用户资源配额</title><link>/2015/08/19/linux%E7%94%A8%E6%88%B7%E8%B5%84%E6%BA%90%E9%85%8D%E9%A2%9D/</link><pubDate>Wed, 19 Aug 2015 00:00:00 +0000</pubDate><guid>/2015/08/19/linux%E7%94%A8%E6%88%B7%E8%B5%84%E6%BA%90%E9%85%8D%E9%A2%9D/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;p&gt;用户资源系统配额
在系统中，允许系统用户使用存储空间，但是不能限制的让用户随意使用存储空间，对用户存储空间的设定就是用户资源系统配额。
下面以/home 为例，通常如果系统中有一定的用户，会把用户的家目录作为一个单独的分区，从而实现更好的管理。下面具体讲解如何把用户家目录从根系统分区分离出来进行磁盘配额。&lt;/p&gt;
&lt;h1 id="1备份数据"&gt;1.备份数据&lt;/h1&gt;
&lt;p&gt;拿出一个未使用的分区，把用户家目录的数据拷贝到新的分区&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;fdisk /dev/sdb --&amp;gt; n（新建分区）--&amp;gt; p(主分区)--&amp;gt; +10G--&amp;gt; w (保存)
mkfs.ext4 -L home_dir /dev/sdb1 格式化新建的分区，卷标名称：home_dir
(如果新建分区没有跟新到内存，partx -a /dev/sdb --&amp;gt;centos6 partprobe --&amp;gt;centos7|5)
mkdir /mnt/home
mount /mnt/home /dev/sdb1 将分区临时挂载到一个目录，备份home目录中数据
cp -a /home/* /mnt/home
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这样就将home家目录中的历史数据备份到新的分区里面了，但要想将之后的数据也自动存储到新建分区的中必须重新挂载，如果直接将新的分区挂载到/home 目录下，存在以下问题。第一、挂载过程中存在用户正在使用家目录的情况，挂载到/home后原来/家目录中的数据时没有用的，而且会自动隐藏掉。所以，安全起见，必须实现通知所有用户，即将要迁移家目录，选一个时间停掉服务，在init 1 模式下实现重新挂载&lt;/p&gt;
&lt;h1 id="2单用户模式运行"&gt;2.单用户模式运行&lt;/h1&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;rm -rf /home/*
vim /etc/fstab --&amp;gt; /dev/sdb1 /home ext4 defaults.usrquota,grpquota 0 0
mount -a 将分区重新挂载到家目录下
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="3init-3-重新回到正常模式"&gt;3、init 3 重新回到正常模式&lt;/h1&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cd /home --&amp;gt; quotacheck -cug /home --&amp;gt;可以看到 aquota.group aquota.user两个数据库
quotaon -p /home quotaon /home 查看和打开系统配额功能
（如果系统配额没有打开，有可能是selinux功能没有关闭 ）
getenforce 查看selinux setenforce=0 关闭selinux功能
repquota -a 可以查看所有用户的磁盘配额情况，显示如下
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 4 0 0 1 0 0
huyu -- 56 10240 40960 19 0 0
superman -- 48 0 0 12 0 0
supergirl -- 48 0 0 12 0 0
user/group ：用户或者组名
userd：用户或者组 已经使用的存储空间，以byte为单位
soft：存储空间使用过多警告提示
hard：空间使用极限，提示如下
sdb1: warning, user block quota exceeded.
sdb1: write failed, user block limit reached.
grace： 宽限期。在这个有效时间内，存储空间数据可以使用修改
后面的分别表示 inode节点的限制，内容和空间相同，只是数值表示限制节点个数
repquota -u /dir|/dev/sdb1 repquota -g /dir|/dev/sdb1 这两个可以看分区用户和组的配额
修改用户/组 de 存储空间配额
edquota -u/g huyu --&amp;gt; 进入修改
edquota -p huyu user2 配额复制，user2配额 如同 huyu
setquota username soft hard soft hard 直接命令配置，没有限制，则用0 代替
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="4去掉磁盘配额"&gt;4、去掉磁盘配额&lt;/h1&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;1、 quotaoff /dir|/dev/sdb1
2、 rm -rf aquota.user|group
3、 vim /etc/fstab
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Linux防火策略iptables</title><link>/2015/08/10/linux%E9%98%B2%E7%81%AB%E7%AD%96%E7%95%A5iptables/</link><pubDate>Mon, 10 Aug 2015 00:00:00 +0000</pubDate><guid>/2015/08/10/linux%E9%98%B2%E7%81%AB%E7%AD%96%E7%95%A5iptables/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;h1 id="防火墙分类"&gt;防火墙分类&lt;/h1&gt;
&lt;p&gt;按照硬件组成部分划分：
​ 硬件防火墙：在硬件级别实现部分功能的防火墙；另一个部分功能基于软件实现；
​ 软件防火墙：应用软件处理逻辑运行于通用硬件平台之上的防火墙；
按照服务范围划分：
​ 主机防火墙：服务范围为当前主机；
​ 网络防火墙：服务范围为防火墙被的局域网；&lt;/p&gt;
&lt;h1 id="netfilter"&gt;netfilter&lt;/h1&gt;
&lt;p&gt;netfilter是位于内核空间的一个防火墙框架，通过iptables这样一个规则管理工具，向框架中添加规则，从而实现防火墙功能。&lt;/p&gt;
&lt;h1 id="iptables"&gt;iptables&lt;/h1&gt;
&lt;p&gt;Firewall：防火墙的意思，只是一个隔离工具；Packets Filter Firewall，主要实现经过该网络的数据包的过滤功能；工作于主机或网络的边缘，对经由的报文根据预先定义的规则（匹配条件）进行检测，对于能够被规则匹配到的报文实行某预定义的处理机制的一套组件；&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;netfilter：防火墙框架，framework；位于内核空间；
iptables：命令行工具程序，位于用户空间；规则管理工具；
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="传说中的四表五链"&gt;传说中的四表五链&lt;/h2&gt;
&lt;p&gt;要处理这些数据包总要一种规则，然而这些表和链就组成了一个规则。来看一张完整图：&lt;/p&gt;
&lt;p&gt;&lt;img alt="&lt;img loading=\"lazy\" src=\"complete\"&gt;" loading="lazy" src="13-Linux%E4%B9%8B%E9%98%B2%E7%81%AB%E5%A2%99iptables/complete.png"&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;表：
filter表--过滤数据包
nat表--用于网络地址转换（IP、端口）
mangle表--修改数据包的服务类型、TTL、并且可以配置路由实现QOS
raw表--决定数据包是否被状态跟踪机制处理
链：
INPUT链--进来的数据包应用此规则链中的策略
OUTPUT链--外出的数据包应用此规则链中的策略
FORWARD链--转发数据包时应用此规则链中的策略
PREROUTING链--对数据包作路由选择前应用此链中的规则（所有的数据包进来的时侯都先由这个链处理）
POSTROUTING链--对数据包作路由选择后应用此链中的规则（所有的数据包出来的时侯最后都由这个链处理）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;上图十分清晰的表明数据包的流向。&lt;/p&gt;
&lt;p&gt;由于四表中我们常用的就只有filter和nat，所以再来一张鸟哥版精简图：&lt;/p&gt;
&lt;p&gt;&lt;img alt="simple" loading="lazy" src="/2015/08/10/linux%E9%98%B2%E7%81%AB%E7%AD%96%E7%95%A5iptables/simple.png"&gt;&lt;/p&gt;
&lt;h2 id="iptables的命令组成"&gt;iptables的命令组成&lt;/h2&gt;
&lt;p&gt;匹配条件：
​ 网络层首部：Source IP, Destination IP, &amp;hellip;
​ 传输层首部：Source Port, Destination Port, TCP Flags(SYN,ACK,FIN,URG,RST,PSH), &amp;hellip;
​ 扩展检查机制：
处理动作：target
​ ACCEPT，DROP，REJECT,&amp;hellip;&lt;/p&gt;
&lt;h2 id="iptables-语法"&gt;iptables 语法&lt;/h2&gt;
&lt;p&gt;iptables 不是固定的一种使用格式，而是有好多种。来看看帮助文档的写法吧。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# man iptables
iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
其中：
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;总结起来大概就是这样&lt;/p&gt;</description></item><item><title>Linux日志工具之rsyslog</title><link>/2015/08/07/linux%E6%97%A5%E5%BF%97%E5%B7%A5%E5%85%B7%E4%B9%8Brsyslog/</link><pubDate>Fri, 07 Aug 2015 00:00:00 +0000</pubDate><guid>/2015/08/07/linux%E6%97%A5%E5%BF%97%E5%B7%A5%E5%85%B7%E4%B9%8Brsyslog/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;日志：历史事件；
历史事件：时间、地点、事件；
syslog：
klogd：kernel
syslogd：system(application)
事件记录格式：
日期时间 主机 进程[pid]: 事件内容；
C/S架构：通过TCP或UDP协议的服务完成日志记录传送；
rsyslog：
rsyslog的特性：
多线程；
UDP/TCP/SSL/TLS/RELP；
存储日志信息于MySQL, PGSQL, Oracle等RDBMS；
强大的过滤器，实现过滤日志信息中的任何部分的内容；
自定义的输出格式；
……
ELK：
E: elasticsearch, L: logstash, K: kibana
rsyslog日志收集器的基本术语：
facility：设施，收束日志数据流为有限几个；
auth, authpriv, cron, daemon, kern, lpr, mail, mark, news, security, user, uucp, syslog, local0-local7
proirity：优先级
debug, info, notice, warn(warning), err(error), crit(critical), alert, emerg(panic)
程序包：rsyslog
程序环境：
配置文件：/etc/rsyslog.conf，/etc/rsyslog.d/*.conf
主程序：/usr/sbin/rsyslogd
CentOS 6：service rsyslogs {start|stop|restart|status}
CentOS 7：/usr/lib/systemd/system/rsyslog.service
配置文件格式：
由三部分组成：
MODULES：模块配置
GLOBAL DIRECTIVES：全局配置
RULES：日志记录相关的配置
RULES:
配置格式：
facility.priority target
facility：
*: 所有的facility；
f1,f2,f3,...：指定的facility列表；
priority：
*: 所有级别；
none：没有级别；
PRIORITY：指定级别（含）以上的所有级别；
=PRIORITY：仅记录指定级别的日志信息；
target：
文件：将日志信息记录到指定的文件中；文件路径前的-表示异步写入；
用户：将日志事件通知给指定的用户；
日志服务器：@host，把日志通过网络送往指定的服务器记录，而非由本地记录；
管道： | COMMAND
配置rsyslog成为日志服务器：
#### MODULES ####
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
其它的日志文件：
/var/log/secure：系统安装日志，应该周期性分析；
/var/log/btmp：当前系统上，用户的失败尝试登录相关的日志信息，lastb命令进行查看；
/var/log/wtmp：当前系统上，用户正常 登录系统的相关日志信息，last命令可以查看；
lastlog命令：用于查看当前系统上每一个用户最近一次的登录信息；
/var/log/messages：系统日志信息；
/var/log/dmesg：系统引导过程中的日志信息；
文本查看工具查看；
也可以使用专用命令dmesg查看；
rsyslog将日志记录于MySQL中：
(1) 准备MySQL Server；
(2) 在mysql server上授权rsyslog能连接至当前服务器；
mysql&amp;gt; GRANT ALL ON Syslog.* TO &amp;#39;USER&amp;#39;@&amp;#39;HOST&amp;#39; IDENTIFIED BY &amp;#39;PASSWORD&amp;#39;;
(3) 在rsyslog主机上安装mysql模块相关的程序包；
yum install rsyslog-mysql
(4) 为rsyslog创建数据库及表；
mysql -uUSERNAME -hHOST -pPASSWORD &amp;lt; /usr/share/doc/rsyslog-7.4.7/mysql-createDB.sql
(5) 配置rsyslog将日志保存到mysql中；
#### MODULES ####
$ModLoad ommysql
#### RULES ####
facility.priority :ommysql:DBHOST,DBNAME,DBUSER,DBUSERPASSWORD
(6) 重启rsyslog服务；
通过loganalyzer展示数据库中的日志：
(1) 准备amp或nmp组合；
# yum install httpd php php-mysql php-gd
(2) 安装LogAnalyzer：
# tar xf loganalyzer-3.6.5.tar.gz
# cp -a loganalyzer-3.6.5/src /var/www/html/loganalyzer
# cd /var/www/html/loganalyzer
# touch config.php
# chmod 666 config.php
(3) 配置loganalyzer：
systemctl start httpd.service
http://HOST/loganalyzer
MySQL Native, Syslog Fields, Monitorware
(4) 安全加强
# cd /var/www/html/loganalyzer
# chmod 644 config.php
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Linux的inode软链接和硬链接</title><link>/2015/08/05/linux%E7%9A%84inode%E8%BD%AF%E9%93%BE%E6%8E%A5%E5%92%8C%E7%A1%AC%E9%93%BE%E6%8E%A5/</link><pubDate>Wed, 05 Aug 2015 00:00:00 +0000</pubDate><guid>/2015/08/05/linux%E7%9A%84inode%E8%BD%AF%E9%93%BE%E6%8E%A5%E5%92%8C%E7%A1%AC%E9%93%BE%E6%8E%A5/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;p&gt;Linux系统中的链接有两种，软连接和硬链接。要充分了解他们最好先了解下inode.&lt;/p&gt;
&lt;h1 id="inode"&gt;inode&lt;/h1&gt;
&lt;p&gt;简单来说就是系统文件记录方式用的是inode,二文件名称只是inode的一个别名,就好像机房有100台主机,每台主机有自己的编号(inode),而有两个主机用来做管理,所以取名叫master1,master2(文件名).&lt;/p&gt;
&lt;p&gt;为什么要这么做呢?文件系统是数据在硬盘上的一种排列组织方式，linux每个分区都可以格式化为不同的文件系统，所以可以说每个分区都是一个文件系统，都有自己的目录层次结构。而在目录之下，linux已经将所有的资源处理成为文件，不论是目录还是命令，之后linux会将这些分属不同分区的、单独的文件系统按一定的方式形成一个系统的总的目录层次结构，实现对不同分区的数据进行访问。但是通过目录层次访问磁盘上的文件，只是表面现象。要知道数据在磁盘上以块(block)存储(一个block由8个扇区组成，每个扇区0.5K，扇区是硬盘存储数据的最小单位)数据的大小不一，造成了块的数量也不尽相同，增删改查都会影响数据块的排列方式，那么如何在众多的可能不连续的数据块中，如何精准的找到数据对应的那些块，必须依附在一张索引列表之上，这就是inode。当然，inode中不仅仅存储着指针，还存储着对应资源的权限、属主、属组和大小.&lt;/p&gt;
&lt;p&gt;inode也是存储在block上的一段数据，所以其也是占用磁盘空间的，每个分区都有自己的inode上限，所以有时候如果显示磁盘空间已满，inode上限也需要作为一个原因，可使用&lt;code&gt;df -i&lt;/code&gt;查看&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[yhu@login ~]$df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda2 419430400 1008127 418422273 1% /
/dev/sda1 2097152 374 2096778 1% /boot
[yhu@login ~]$df -ih
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda2 400M 985K 400M 1% /
/dev/sda1 2.0M 374 2.0M 1% /boot
[yhu@login ~]$df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 400G 144G 257G 36% /
/dev/sda1 2.0G 169M 1.9G 9% /boot
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;查看文件的inode，使用&lt;code&gt;ls -i&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Linux终端类型</title><link>/2015/08/03/linux%E7%BB%88%E7%AB%AF%E7%B1%BB%E5%9E%8B/</link><pubDate>Mon, 03 Aug 2015 00:00:00 +0000</pubDate><guid>/2015/08/03/linux%E7%BB%88%E7%AB%AF%E7%B1%BB%E5%9E%8B/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;h1 id="1终端的概念"&gt;1.终端的概念&lt;/h1&gt;
&lt;p&gt;所谓终端就是在一个连接主机的端子上面接入鼠标、键盘、显示器等所组成的一个组合。终端用于用户与主机之间的交互。早期的时候，在大型主机上，想使用主机的用户很多，但是主机却只有一个，也不能实现人手一台。于是为了让一台主机给多个用户使用，便产生了多个终端和多个用户，这样每个用户只要有一个终端变可以与主机交互了。&lt;/p&gt;
&lt;h1 id="2终端的类型"&gt;2.终端的类型&lt;/h1&gt;
&lt;p&gt;终端的类型有四类：物理终端，虚拟终端，图形终端和伪终端。&lt;/p&gt;
&lt;h2 id="物理终端"&gt;物理终端：&lt;/h2&gt;
&lt;p&gt;将鼠标、键盘、显示器直接连接到主机的接口上。也称为物理控制台（console）&amp;ndash;/dev/console。&lt;/p&gt;
&lt;h2 id="虚拟终端"&gt;虚拟终端：&lt;/h2&gt;
&lt;p&gt;附加在物理终端之上，用软件的方式实现虚拟终端。centos中有6个虚拟中断，通过Alt+Ctrl+（F1-F6）进行切换。&lt;/p&gt;
&lt;h2 id="图形终端"&gt;图形终端：&lt;/h2&gt;
&lt;p&gt;图形终端也是附加在物理终端之上，用软件的方式实现。但提供桌面环境，切换方式 Ctrl+Alt+F7.&lt;/p&gt;
&lt;h2 id="伪终端"&gt;伪终端：&lt;/h2&gt;
&lt;p&gt;在图形界面下打开的的命令行界面，或者基于ssh协议或Telnet协议等远程打开的命令行界面。例如用xshell或者secureCRT远程连接的命令行界面就是属于伪终端。&lt;/p&gt;
&lt;p&gt;在这里我们要注意的是，实际操作中当我们的系统启动还没有完全运行起来的时候，在我们的设备上运行的终端是物理终端，在服务完全启动之后映射的就是虚拟终端或者图形终端啦。&lt;/p&gt;</description></item><item><title>Linux用户和组的权限</title><link>/2015/08/02/linux%E7%94%A8%E6%88%B7%E5%92%8C%E7%BB%84%E7%9A%84%E6%9D%83%E9%99%90/</link><pubDate>Sun, 02 Aug 2015 00:00:00 +0000</pubDate><guid>/2015/08/02/linux%E7%94%A8%E6%88%B7%E5%92%8C%E7%BB%84%E7%9A%84%E6%9D%83%E9%99%90/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;h1 id="1文件的权限分类"&gt;1、文件的权限分类&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;文件的权限对象分三类：属主（u）、属组（g）、其他（o），每个对象都有rwx，读写执行三类权限。
对于文件
r：可查看文件内容
w：可修改其类容
x：可把此文件提请内核启动为一个进程
对于目录
r：可使用ls查看此目录中文件列表
w：可在此目录中创建和删除文件
x：可使用ls查看目录中文件列表，可以cd进入此目录
X：只给目录x权限，不给文件x权限
在访问文件之前，必须要先能够进入文件的父目录
前提：进程有属主和属组；文件有属主和属组
(1) 任何一个可执行程序文件能不能启动为进程：取决发起者对程序文件是否拥有执行权限
(2) 启动为进程之后，其进程的属主为发起者；进程的属组为发起者所属的组
(3) 进程访问文件时的权限，取决于进程的发起者
(a) 进程的发起者，同文件的属主：则应用文件属主权限
(b) 进程的发起者，属于文件属组；则应用文件属组权限
(c) 应用文件“其它”权限
root 没有了 x 执行权限不能执行，但是可以给自己加权限
root用户没有读和写权限也可以直接修改查看。
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="2chmod-用法"&gt;2、chmod 用法&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;a、chmod [option]... 八进制 file
eg：chmod -R 755 /dir
b、chmod [option]... mode ... file
eg：chmod u=rwx,g=rx,u= file/dir
或者 chmod a=rx file/dir 或者 chmod u+w file/dir
c、chmod [option] ... --reference = rfile file
参考rfile权限 复制到 file
chmod -R a=rwX dir
目录下的文件如果有x权限 则都有x权限
如果没有x权限 则 所有的文件都没有x权限
但是所有的目录都有x权限
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="3新建文件和目录的默认权限"&gt;3、新建文件和目录的默认权限&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;新建FILE权限:666-umask如果所得结果某位存在执行（奇数）权限，则将其权限+1
新建DIR权限: 777-umask,非特权用户umask是002,root的umask是022
umask: 查看 umask#: 设定 #umask -S --&amp;gt; u=rwx,g=rx,o=rx #umask -p --&amp;gt; umask 0022
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="4linux文件系统上的特殊权限suid-sgid-sticky"&gt;4、Linux文件系统上的特殊权限，SUID, SGID, Sticky&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;chmod 4755 file
chmod u+s /usr/bin/passwd
-rwsr-xr-x. 1 root root 30768 Feb 22 2012 /usr/bin/passwd
当用户使用passwd【具有suid权限的二进制程序文件】命令，用户权限临时切换成【passwd文件所有者】权限
启动为进程之后，其进程的属主为原程序文件的属主
/bin 文件夹下面有众多 红色背景的程序均是这样。
chmod 2755
/usr/bin/passwd chmod g+s /usr/bin/passwd
-rwxr-sr-x. 1 root root 30768 Feb 22 2012 /usr/bin/passwd
当用户使用passwd【具有suid权限的二进制程序文件】命令，用户权限临时切换成【passwd文件所属组】权限 --黄色背景
启动为进程之后，其进程的属主为原程序文件的属组
chmod 1777 /dir
[root@localhost conf]#ll -d /tmp
drwxrwxrwt. 18 root root 4096 Oct 16 02:52 /tmp
可以在目录中删除【自己的】文件，而不能删除别人的文件
chmod 2755 dir
chmod g+s /dir
-rwxr-sr-x. 1 root root 30768 Feb 22 2012 /dir
当该目录【所属组用户】在该目录下创建文件的时候，创建的文件所属组均为目录的所属组
小坑一个： 用0777，并不能把sst等权限去掉
没有执行权限则该位置显示为【S、T】
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="5设定文件特定属性attrattribute"&gt;5、设定文件特定属性（attr&amp;ndash;attribute）&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;chattr +i 不能删除，改名，更改 +a 只能追加（&amp;gt;&amp;gt;）
lsattr 显示文件特定属性。
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="6acl"&gt;6、ACL&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;ACL：Access Control List，实现灵活的权限管理，除了u，g，o可以对更多的用户设置权限
ACL生效顺序：所有者（属主，属组），自定义用户，自定义组，其他人
setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
-b,--remove-all：删除所有扩展的acl规则，基本的acl规则(所有者，群组，其他）将被保留。
-k,--remove-default：删除缺省的acl规则。如果没有缺省规则，将不提示。
-n，--no-mask：不要重新计算有效权限。setfacl默认会重新计算ACL mask，除非mask被明确的制定。
--mask：重新计算有效权限，即使ACL mask被明确指定。
-d，--default：设定默认的acl规则。
--restore=file：从文件恢复备份的acl规则（这些文件可由getfacl-R产生）。通过这种机制可以恢复整个目录树的acl规则。
此参数不能和除--test以外的任何参数一同执行。
--test：测试模式，不会改变任何文件的acl规则，操作后的acl规格将被列出。
-R，--recursive：递归的对所有文件及目录进行操作。
-L，--logical：跟踪符号链接，默认情况下只跟踪符号链接文件，跳过符号链接目录。
-P，--physical：跳过所有符号链接，包括符号链接文件。
--version：输出setfacl的版本号并退出。 --help：输出帮助信息。
--：标识命令行参数结束，其后的所有参数都将被认为是文件名
-：如果文件名是-，则setfacl将从标准输入读取文件名。
Usage: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
-m, --modify=acl modify the current ACL(s) of file(s)
-M, --modify-file=file read ACL entries to modify from file
-x, --remove=acl remove entries from the ACL(s) of file(s)
-X, --remove-file=file read ACL entries to remove from file
例子：
mount -o acl /directory
getfacl file|directory --获取文件或者目录的acl
setfacl -m u:wang:rwx file|directory --增加文件或者目录的用户acl
setfacl -Rm g:sales:rwX directory --目录及其子目录以及文件增加用户acl，新增加文件或者目录不会自带acl
setfacl -M file.acl file|directory --参照file.acl 给目录或者文件增加acl
setfacl -m g:salesgroup:rw file| directory --增加文件或者目录的用户组acl
setfacl -m d:u:wang:rx directory --增加该目录的acl，新增文件或者目录的时候【自带acl】，目录下原有的文件或者目录acl不变
setfacl -x u:wang file|directory --删除文件或者目录中，对应用户的acl ，mask还在
setfacl -X file.acl directory --参照file.acl 删除目录中的acl ，mask还在
setfacl -Rb directory --清空目录下的所有acl，包括mask
setfacl-k dir --删除默认ACL权限
【注意】：
默认拷贝不会拷贝文件或者目录的acl，用cp来复制文件的时候我们现在可以加上-p选项。对于不能拷贝的ACL属性将给出警告。
mv命令将会默认地移动文件的ACL属性，同样如果操作不允许的情况下会给出警告。
如果你的文件系统不支持ACL的话，你也许需要重新mount你的file system： mount -o remount, acl [mount point]
如果用chmod命令改变Linux file permission的时候相应的ACL值也会改变，反之改变ACL的值，相应的file permission也会改变。
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Linux文本查看工具</title><link>/2015/08/01/linux%E6%96%87%E6%9C%AC%E6%9F%A5%E7%9C%8B%E5%B7%A5%E5%85%B7/</link><pubDate>Sat, 01 Aug 2015 00:00:00 +0000</pubDate><guid>/2015/08/01/linux%E6%96%87%E6%9C%AC%E6%9F%A5%E7%9C%8B%E5%B7%A5%E5%85%B7/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;p&gt;在Linux系统中，一个核心理念就是：一切皆文件。正确的对系统中文本的编辑配置与管理是Linux系统得以稳定运行的一个重要大前提。
因此Linux系统中的文件与管理特别重要，下面简单说一下在对文件处理过程中经常用到的一些工具。
文本查看命令：&lt;code&gt;cat,tac,rev,more,less&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat [option]...[file]...
-E:显示行结束符$
-n:显示行号
-A:显示所有控制符eg：tab键就显示为 ^I
-b:非空行编号，即空行不显示行号，略过
-s:压缩连续的空行成一行
tac [option]...[file]...
-b, --before 在行前而非行尾添加分隔标志【默认换行】
-r, --regex 将分隔标志视作正则表达式来解析
-s, --separator=字符串 使用指定字符串代替换行作为分隔标志 -s=&amp;quot;#&amp;quot;
rev [options] [file ...]
reversing the order of characters in every line：将每一行的显示翻转过来
注意这里tac和rev不同的地方是，tac是将整个文档以行为单位翻转，而rev是以每一个字符为单位，在一行的范围内翻转。ABC--&amp;gt;CBA 而tac 是 ABC 【第一行】 123【第二行】 --&amp;gt;123【第一行】ABC【第二行】
more [options] file [...] 翻到底自动退出
less [options] file [...] 翻到底不会自动退出（man帮助查看就是用的less用法）
head [OPTION]... [FILE]...
-c # :指定获取前#个字节
-n # 或 -# : 指定获取行数
tail [OPTION]... [FILE]...
-c # :指定获取前#个字节
-n # 或 -# : 指定获取行数
-f ：跟踪显示文件新追加的内容，常用语日志监控
cut [OPTION]... [FILE]...
-d : 指明分隔符，默认tab 。eg：-d&amp;quot; &amp;quot;,以空格为分割
-f FILEDS: #: 第#个字段 #,#[,#]：离散的多个字段，例如1,3,6
#-#：连续的多个字段, 例如1-6 混合使用：1-3,7
-c按字符切割 cut -c 1-10 anaconda-ks.cfg
--output-delimiter=STRING指定输出分隔符
paste 合并两个文件同行号的列到一行
paste [OPTION]... [FILE]...
-d 分隔符:指定分隔符，默认用TAB
-s : 所有行合成一行显示
paste f1 f2
paste -s f1 f2 先合并成一行，在追加。n个文件就显示n行。
wc [OPTION]... [FILE]...
-c, --bytes 显示 字节数
-m, --chars 显示 字符数
-l, --lines 显示 行号
sort [OPTION]... [FILE]...
-r执行反方向（由上至下）整理
-n执行按数字大小整理 默认是按字符排序，即1,11,12...19,2,21...
-f选项忽略（fold）字符串中的字符大小写
-u选项（独特，unique）删除输出中的重复行
uniq[OPTION]... [FILE]...
-c: 显示每行重复出现的次数
-d: 仅显示重复过的行
-u: 仅显示不曾重复的行
【连续且完全相同方为重复】
diff foo.conf-brokenfoo.conf-works
比较两个文件的不同
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Linux用户和组</title><link>/2015/07/30/linux%E7%94%A8%E6%88%B7%E5%92%8C%E7%BB%84/</link><pubDate>Thu, 30 Jul 2015 00:00:00 +0000</pubDate><guid>/2015/07/30/linux%E7%94%A8%E6%88%B7%E5%92%8C%E7%BB%84/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;h1 id="1用户"&gt;1、用户&lt;/h1&gt;
&lt;p&gt;个人理解的是，给使用者一个在系统中使用的身份，即用户。
用户分两种：管理员和普通用户。
而每一个用户都有一些属性，每一个属性都是用冒号分割开来。配置文件存储在【/etc/passwd】中。
例如，&lt;code&gt;sarash:x:507:508::/home/sarash:/bin/nologin&lt;/code&gt;
他们分别是，用户名，密码，ID号，主组ID号，注释，家目录，默认登录shell
用户名是用来登录的账号，密码位置并没有存储真正的密码在这里，只是一个占位符。如果的确想要看到密码存储结果，可以使用命令：pwunconv。
其中 pwconv, pwunconv, grpconv, grpunconv - convert to and from shadow passwords and groups 就是用户密码隐藏 显示 组密码隐藏显示的命令
增加用户的常用命令是：
&lt;code&gt; useradd [options] login&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-u UID: [UID_MIN, UID_MAX]定义在/etc/login.defs
-o 配合-u 选项，不检查UID的唯一性
-g GID：指明用户所属基本组，可为组名，也可以GID
-c &amp;quot;COMMENT&amp;quot;：用户的注释信息
-d HOME_DIR:以指定的路径(不存在)为家目录
-s SHELL: 指明用户的默认shell程序 在/etc/shells文件中有系统可用shell
-G GROUP1[,GROUP2,...]：为用户指明附加组，组必须事先存在
-N 不创建私用组做主组，使用users组做主组
-r: 创建系统用户CentOS 6: ID&amp;lt;500，CentOS 7: ID&amp;lt;1000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt; userdel [options] LOGIN&lt;/code&gt;
-f, &amp;ndash;force 删除用户的主目录和邮箱，即使用户登录中，或者邮箱公用
-r 删除用户家目录及邮箱
【注意】：在新建服务型用户的时候（例如MySQL），由于这些用户不需要登录（/bin/nologin），也不需要家目录，所以定义成系统用户最好。可以防止恶意的登录。
一般来说， 1&lt;del&gt;99 会保留给系统预设的帐号，另外 100&lt;/del&gt;499 则保留给一些服务来使用。centos7 就加倍。&lt;/p&gt;</description></item><item><title>Linux系统grep的使用</title><link>/2015/07/28/linux%E7%B3%BB%E7%BB%9Fgrep%E7%9A%84%E4%BD%BF%E7%94%A8/</link><pubDate>Tue, 28 Jul 2015 00:00:00 +0000</pubDate><guid>/2015/07/28/linux%E7%B3%BB%E7%BB%9Fgrep%E7%9A%84%E4%BD%BF%E7%94%A8/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;h1 id="grep"&gt;grep:&lt;/h1&gt;
&lt;p&gt;Global search REgular expression and Print out the line .&lt;/p&gt;
&lt;p&gt;文本过滤工具，根据用户指定的模式对目标文本进行匹配检查；打印匹配到的行。过滤即不改变原来文本数据。这对于在输出较多信息或者文本内容较多的信息中寻找指定信息很有帮助.&lt;/p&gt;
&lt;p&gt;比如想查看文件ifcfg-eth0中配置的网络是多少,你只需要显示有IPADDR这一行:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#grep IPADDR ifcfg-eth0
IPADDR=172.16.10.18
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这样,就会显示ifcfg-eth0 文件中包含有IPADDR的行.&lt;/p&gt;
&lt;p&gt;当然grep还有很多参数可以帮助我们更精确的找到想要的内容,下面列举几个最常用的参数&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;grep [options] PATTERN [file...]
--color=auto： 对匹配到的文本着色显示
-v：显示不被pattern匹配到的行
-i：忽略大小写 #上面的就可以写成 grep -i ipaddr ifcfg-eth0
-n：显示匹配的行号
-c：统计匹配的行数
-o：仅显示匹配到的字符串
-q：静默模式，不输出任何模式
-A #：after，后#行一并显示
-B #：before，前#行一并显示
-C #：context，前后#行一并显示
-e:实现多个选择间的逻辑或关系--&amp;gt; grep -e ‘cat’ -e ‘dog’ file
grep的PATTERN 支持正则表达式，支持正则表达式的还有 vim，less，nginx等
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;grep还可以配合管道命令使用:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[root@node7 ~]#lspci | grep -i network #lspci的结果直接通过grep过滤显示
81:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
81:00.1 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="正则表达式"&gt;正则表达式&lt;/h1&gt;
&lt;p&gt;regexp，由一类特殊字符及文本字符所编写的模式，其中有些字符不表示字符字面意义，而表示控制或通配的功能.比如:&lt;/p&gt;</description></item><item><title>Linux awk</title><link>/2015/07/25/linux-awk/</link><pubDate>Sat, 25 Jul 2015 00:00:00 +0000</pubDate><guid>/2015/07/25/linux-awk/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;h1 id="awk介绍"&gt;awk介绍&lt;/h1&gt;
&lt;p&gt;awk是Linux三剑客中功能最强大，使用最复杂的命令。强大到awk都成为一种语言了，它适合文本处理和报表生成，其语法较为常见，借鉴了某些语言的一些精华，如 C 语言等。在 linux 系统日常处理工作中，发挥很重要的作用，掌握了 awk将会使你的工作变的高大上。 awk 是三剑客的老大，利剑出鞘，必会不同凡响。&lt;/p&gt;
&lt;h1 id="awk基本用法"&gt;awk基本用法&lt;/h1&gt;
&lt;p&gt;输入awk就可以看到awk简要帮助，下面就结合我自己查找资料和使用之后的一个总结：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;awk基本用法
awk [options] &amp;#39;program&amp;#39; var=value file…
awk [options] -f programfile var=value file…
&amp;#39;program&amp;#39; = &amp;#39;BEGIN{ action;… } pattern{ action;… } END{ action;… }&amp;#39;
options（选项）:
-f progfile --file=progfile #从文件中读取program语法
-F fs --field-separator=fs #字段分隔符，默认空格
-v var=val --assign=var=val #自定义变量
#官方简单例子，将/etc/passwd以冒号&amp;#34;:&amp;#34;分隔，将得到的的第一列打印
#gawk -F: &amp;#39;{ print $1 }&amp;#39; /etc/passwd
root
bin
daemon
...
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="1分隔符域和记录"&gt;1.分隔符.域和记录&lt;/h2&gt;
&lt;p&gt;awk执行时,参数&lt;code&gt;-F &lt;/code&gt;的值就是分隔符,不写默认为空格.&lt;/p&gt;
&lt;p&gt;分割出来的字段就是域,从前往后一次标记为&lt;code&gt;$1,$2,$3...$n&lt;/code&gt; 称为域标示.&lt;code&gt;$0&lt;/code&gt;为所有域.&lt;/p&gt;
&lt;p&gt;文件的每一行称为一条记录.&lt;/p&gt;
&lt;h2 id="2awk语法"&gt;2.awk语法&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;program: &amp;#39;BEGIN{ action;… } pattern{ action;… } END{ action;… }&amp;#39;
pattern和action：
pattern部分决定动作语句何时触发及触发事件（BEGIN,END 也是属于pattern中的特殊部分吧）
action statements对数据进行处理，放在{}内指明
（print, printf）
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="3awk工作过程"&gt;3.awk工作过程&lt;/h2&gt;
&lt;p&gt;awk的工作过程:
第一步: 执行 BEGAIN{action;&amp;hellip;} 语句块中的语句,如果没有就跳过此步骤.
第二步: 从文件和标准输入读取一行(就是一条记录),然后按照pattern中匹配中了就执行后面的 { action;… } ,然后读取下一条记录匹配执行,重复这个过程知道文件全部读取完毕.
第三步: 执行 END{ action;… } 语句块中的语句,如果没有就跳过此步骤.&lt;/p&gt;</description></item><item><title>Linux磁盘管理</title><link>/2015/07/20/linux%E7%A3%81%E7%9B%98%E7%AE%A1%E7%90%86/</link><pubDate>Mon, 20 Jul 2015 00:00:00 +0000</pubDate><guid>/2015/07/20/linux%E7%A3%81%E7%9B%98%E7%AE%A1%E7%90%86/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;在系统中，常见的硬盘接口有分两类：并行的和串行的
并行：
IDE: 133MB/s
SCSI: 640MB/s
串行：
SATA: 6Gbps
SAS: 6Gbps
USB: 480MB/s
存储设备的设备文件命名方式大致为：/dev/DEV_FILE
IDE: /dev/hd# #--&amp;gt;0,1,2,3
SCSI,SATA,SAS,USB: /dev/sdx x表示a-z eg：/dev/sda,/dev/sdb
光盘中显示的是 /dev/sr0,/dev/sr1...
同一设备上的不同分区：1,2,3... eg：/dev/sda1,/dev/sda2...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;想要使用一块没有用过的磁盘，需要做一下几部：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1、设备识别，即首先要讲磁盘接入设备中，在系统中能够看到设备（/dev/DEV_FILE）
2、设备分区，全新的磁盘是没有分区的
3、创建文件系统，主要明确在设备上存储的数据是什么格式的.(ext3,ext4,NTFS...)
4、标记文件系统
5、在/etc/fstab文件中创建条目
6、挂在新的文件系统
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;磁盘分区：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;磁盘分区的理由:
1、优化i/o性能
2、实现磁盘空间配额限制
3、提高修复速度
4、隔离系统和程序
5、安装多个OS
6、采用不同文件系统
两种分区方式：MBR,GPT
MBR: master boot record ，使用32位表示山区数，分区不超过2T，按柱面分区
在0磁道0扇区的512bytes中，前446bytes：BootLoader，64bytes：分区表（其中16byte表示一个分区，因此主分区+扩展分区&amp;lt;=4）最后2byte：55AA
GPT:GUID(global unique identifiers) partition table 支持128个分区，使用64位，支持8Z（512byte/block） 64Z（4096byte/block）
使用128位UUID（universally unique identifier ）表示磁盘和分区，GPT分区表自动备份在头和尾两份，并有CRC校验位
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;管理分区：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;列出块设备：lsblk
创建分区：fdisk（MBR），gdisk（GPT），parted 高级分区操作（创建，复制，调整大小等）
partprobe 重新设置内存中的内核分区表版本
fdisk gdisk命令类似，下面主要介绍fdisk的使用
fdisk [options] &amp;lt;disk&amp;gt; change partition table
fdisk [options] -l &amp;lt;disk&amp;gt; list partition table(s)
交互式fdisk命令其实更适合使用，分区之后可查看，可修改，只有在保存的时候才会真正的自该磁盘的分区。
子命令：
p 分区列表
t 更改分区类型
n 创建分区
d 删除分区
w 保存并退出
q 不保存退出
m 查看帮助，打印菜单选择项
在修改分区完成之后，可查看内核是否已经识别新的分区 cat /proc/partations
如果内核没有识别到新的分区，可通过命令是内核重新读取硬盘分区表
在 centos 6 上 partx -a -n M:N /dev/DEVICE 或者 kpartx -a /dev/DEVICE
删除分区：partx -d -n M:N /dev/DEVICE
在centos 5，7上面直接使用partprobe 就可以了 partprobe [/dev/DEVICE]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;文件系统:&lt;/p&gt;</description></item><item><title>Linux压缩和解压</title><link>/2015/07/18/linux%E5%8E%8B%E7%BC%A9%E5%92%8C%E8%A7%A3%E5%8E%8B/</link><pubDate>Sat, 18 Jul 2015 00:00:00 +0000</pubDate><guid>/2015/07/18/linux%E5%8E%8B%E7%BC%A9%E5%92%8C%E8%A7%A3%E5%8E%8B/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;p&gt;在Linux系统中压缩、解压以及归档的工具主要有一下几种：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;file-roller ： 这个工具适合在桌面系统下进行解压操作。
compress/uncompress ：这是一个比较老的解压工具，压缩后会添加.Z为后缀
gzip/gunzip : .gz结尾
bzip2/bunzip2 : .bz2
xz/unxz : .xz
zip/unzip .zip
tar
cpio
主要命令参数介绍
compress [-dvc] [file...]
-d: 解压，相当于uncompress
-c: 解压结果标准输出，不删除源文件
-v: 显示详情
zcat file.Z --&amp;gt;不解压的情况下查看文件
zcat file.Z &amp;gt;file --&amp;gt;解压保留源文件
gzip [-dc#] file...
-d:解压缩 =gunzip
-c:标准输出
-#：1-9,指定压缩比，默认为6
zcat file.gz --&amp;gt;不解压的情况下查看文件
zcat file.gz &amp;gt;file --&amp;gt;解压保留源文件
bzip2 [-kd#] file...
-k:keep,即保留源文件
-d:解压缩=bunzip2
-#：指定压缩比，默认6
bzcat ：不解压下查看文件内容
xz [-kd#] file...
-k:keep,即保留源文件
-d:解压缩=unxz
-#：指定压缩比，默认6
xzcat ：不解压下查看文件内容
zip
-r : 递归压缩，文件及目录
zip –r /testdir/sysconfig.zip /etc/sysconfig/ ...
-d :删除压缩文件中指定的文件
-m :添加
zip -d myfile.zip old.txt
zip -m myfile.zip new.txt
unzip -p message.zip &amp;gt; message
tar [] tape archive 磁带 归档
-c create
-f file.tar
-v 可视化
-x 解包
-r add追加
-t 预览文件名
-C 展开到指定目录
-z 归档后压缩成 .tar.gz
-j .tar.bz2
-J .tar.xz
-T 指定输入文件
-X 指定要排除文件
常用组合
tar -cvf archive.tar file ... 归档
tar -tvf archive.tar 查看归档文件名列表
tar -xvf archive.tar 解包
cpio: copy input output,可解压以.cpio 或者.tar结尾的文件
cpio [option] &amp;gt; file or devicename
cpio [option] &amp;lt; file.cpio or devicename
-o :打包生成file.cpio
-i ：从cpio中解包
-t :预览文件名
-v :显示过程
-d ：解包生成目录
常用组合
find ./etc |cpio -ov &amp;gt; etc.cpio
cpio -tv &amp;lt; etc.cpio
cpio -iv &amp;lt; etc.cpio
cpio -idv &amp;lt; etc.cpio
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Linux程序包管理器</title><link>/2015/07/15/linux%E7%A8%8B%E5%BA%8F%E5%8C%85%E7%AE%A1%E7%90%86%E5%99%A8/</link><pubDate>Wed, 15 Jul 2015 00:00:00 +0000</pubDate><guid>/2015/07/15/linux%E7%A8%8B%E5%BA%8F%E5%8C%85%E7%AE%A1%E7%90%86%E5%99%A8/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;p&gt;源代码命名方式，name-version.tar.gz|bz2|xz, &amp;ndash;&amp;gt;version:major.minor.release
要将一个源代码程序安装到Linux系统上，一般有两个方法。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1.找到源代码，手动编译安装。解压，./configure --&amp;gt; make --&amp;gt; make install
2.使用软件包管理器（程序包管理器）
3.直接解压做好的二进制包后使用
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="1程序包管理器"&gt;1.程序包管理器：&lt;/h1&gt;
&lt;p&gt;将编译好的应用程序文件打包成一个或者几个，从而方便快捷的实现程序包的安装，卸载，查询，升级和校验等管理操作。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Linux系统不同版本有不同的程序包管理器。目前主要分两类
1、debian：deb文件，dpkg包管理器
2、RedHat：rpm文件，rpm包管理器，RPM：RedHat package manager（原名），现在已是 RPM package manager 递归缩写
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="2rpm包命名方式"&gt;2.RPM包命名方式：&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;name-version-release.arch.rpm --&amp;gt;version:major.minor.release --&amp;gt;release:release.os
eg:bash-4.2.46-19.el7.x86_64.rpm
常见arch：x86，x86_64，PowerPC 或者noarch（）
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="3rpm包的分类和拆包"&gt;3.RPM包的分类和拆包&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm开发子包
Application-utils-VERSION-ARHC.rpm其它子包
Application-libs-VERSION-ARHC.rpm其它子包
包与包之间可能存在依赖关系，甚至循环依赖。解决方法：yum（RedHat，centos）
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="4rpm包文件组成"&gt;4.RPM包文件组成&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;a、RPM包内的文件。 b、RPM包的元数据，如名称，版本，依赖性，描述等。 c、安装或者卸载时运行的脚本。
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="5获取程序包的途径方法"&gt;5.获取程序包的途径方法：&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;1、系统发版的光盘或者官方服务器；
CentOS镜像
http:www.centos.org/download/
http://mirror.aliyun.com（阿里云） 搜狐 163等
2、项目官方站点
3、第三方组织
Fedora-EPEL：
Extra Packages for Enterprise Linux
Rpmforge:RHEL推荐，包很全
搜索引擎：
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net/
4、自己制作
注意：非官方下载的程序包要检查其合法性：来源的合法以及程序包的完整性
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="6库文件"&gt;6.库文件&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;程序的运行需要依赖库文件 ldd /path/to/binary_file 可以查看二进制程序所依赖的库文件
库文件的配置文件：/etc/ld.so.conf /etc/ld.so.conf.d/*.conf 即ld.so.conf 文件和 /etc/ld.so.conf.d/ 目录下所有以 .conf结尾的文件
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Linux安装命令rpm的使用</title><link>/2015/07/13/linux%E5%AE%89%E8%A3%85%E5%91%BD%E4%BB%A4rpm%E7%9A%84%E4%BD%BF%E7%94%A8/</link><pubDate>Mon, 13 Jul 2015 00:00:00 +0000</pubDate><guid>/2015/07/13/linux%E5%AE%89%E8%A3%85%E5%91%BD%E4%BB%A4rpm%E7%9A%84%E4%BD%BF%E7%94%A8/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;p&gt;rpm命令，安装（-i，&amp;ndash;install）、卸载、升级（-U，-F）、查询（-q，&amp;ndash;query）、校验（-V，&amp;ndash;verify）、数据库维护&lt;/p&gt;
&lt;h1 id="1安装"&gt;1.安装：&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;rpm {-i|--install} [install-options] PACKAGE_FILE…
v：可视化
h：以#显示进度
rpm -ivh package_file
[install-options]
--test：测试安装
--nodeps：忽略依赖关系
--replacepkgs |replacefiles
--nosignalture：不检查来源合法性
--noscripts：不执行程序包脚本
--nopre,--nopost,--nopreun,--nopostun 安装前后，卸载前后
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="2查询"&gt;2.查询：&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;rpm {-q|--query} [select-options][query-options]
[select-options]
-a：所有包
-f:查看指定文件有那个程序安装包生成
-p rpmfile：正对尚未安装的程序包做查询操作
--whatprovides capability：查看指定的capability由哪个包所提供
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="3卸载"&gt;3.卸载：&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;rpm {-e|--erase} [--allmatches][--nodeps] [--noscripts][--notriggers] [--test] PACKAGE_NAME ...&lt;/code&gt;&lt;/p&gt;
&lt;h1 id="4包校验"&gt;4.包校验：&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;rpm {-V|--verify} [select-options][verify-options]
S file Size differs
M Mode differs (includes permissions and file type)
5 digest (formerly MD5 sum) differs
D Device major/minor number mismatch
L readLink(2) path mismatch
U User ownership differs
G Group ownership differs
T mTimediffers
P capabilities differ
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="5导入所需要公钥"&gt;5.导入所需要公钥：&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;rpm -K|checksig rpmfile检查包的完整性和签名
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
CentOS 7发行版光盘提供：RPM-GPG-KEY-CentOS-7
rpm -qagpg-pubkey*
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="6常用"&gt;6.常用&lt;/h1&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;rpm -ivh package_file
rpm -ql app_name
rpm -qf file
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
&lt;/code&gt;&lt;/pre&gt;</description></item></channel></rss>