分类目录归档:未分类

雪茄–初探 —蒙特4号;

第一档:高希霸 Cohiba  

第二档:蒙特 Montecristo  帕特加 Partagas  罗密欧 Romeo Y Jjlieta  蒙特利 Hoyo de Monterrey  优民 H. Upmann

第三档:逢赛克 Fonseca  彼亚赛 Jose L. Piedra

关于口味:

高希霸:平衡的香味,集合古巴雪茄之大成,卡斯特罗送礼的官方标准,可以说是人见人爱,花见花开。世纪系列大众熟知也最爱(世纪346最有特点),经典系列(长矛、特冠、宾丽)也是各个顶尖;

蒙特:仅次于高希霸的世界知名品牌,陈年后爆发力极强,蒙特2号,埃德蒙是老茄客必选,蒙特银管2011的皮革、咖啡豆、坚果香混合且独特乃极品,蒙4.5属于短时间的最佳选择之一;

帕特加:喜维亚4号俗称D4乃是世界闻名的型号(胡椒、咖啡、泥土、奶混合),E2感觉是D4加强版但更均衡且丰富,尖顶2号(胡椒、烟草、皮革)口感直接畅快;

罗密欧:古巴雪茄里销量最大的世界品牌,大家熟知罗密欧123号铝管、贝伟达(价格实惠),经典型号是丘吉尔银管,展览4号,宽身丘吉尔,短丘吉尔;

蒙特利:口感轻到中,逍遥二号为经典,可可、烟草、坚果香;

优民:俗称乌普曼,经典为鉴赏家1号2011(香草、花香、烟草味)、玛瑙50(品牌最经典型号)

彼亚赛:俗称小比,经典款型为猎人,世界范围内的古巴入门茄。(他仅仅是一款入门雪茄,不要神话他,口感就那样而已)

单支/小包组合购买:

500-600元新手:

比亚赛猎人、优民君主、罗密欧银管2、3号、罗密欧福尔士、帕特金管、帕特大冠银管,蒙特4、5号;

推荐理由:单支购买,多品尝不同品牌有助于了解主线;

800-1500元进阶:

帕特加喜维亚D4,P2,E2、优民鉴赏家1号,玛瑙50,蒙特银管2011,蒙特1、2、3号、埃德蒙,罗密欧展览4号,宽身丘吉尔,蒙特利逍遥2号、高希霸奥秘、世纪1、2、宾丽、吉仕途、俱乐部;

推荐理由:这个阶段可以掌握每个品牌的世界知名主打型号,比如帕特加D4;

1500-3000品鉴:

包含进阶型的所有型号,高希霸特冠,世纪3、4、6、天才;

解释:各阶新手尽可能初次品尝多几类品牌的单支,便于挑选喜欢的口味。掌握了各个品牌的主线味道之后,再整盒购买更划算。

作者:雪茄123

链接:https://www.jianshu.com/p/7abc8328f9d8

APN

  1. 简介:https://blog.csdn.net/sjz4860402/article/details/78522871

APN(Access Point Name):即“接入点名称”,用来标识GPRS的业务种类,是通过手机上网时必须配置的一个参数,手机可以访问的外部网络类型有很多,例如:Internet、WAP网站、集团企业内部网络、行业内部专用网络。而不同的接入点所能访问的范围以及接入的方式是不同的,网络侧如何知道手机激活以后要访问哪个网络从而分配哪个网段的IP呢,这就要靠APN来区分了,即APN决定了用户的手机通过哪种接入方式来访问什么样的网络。从运营商角度看,APN就是一个逻辑名字,APN一般都部署在GGSN设备上或者逻辑连接到GGSN上,用户使用GPRS上网时,都通过GGSN代理出去到外部网络,因此,APN设置、过滤、统计等,就成为一个对GPRS计费、GPRS资费有重要参考价值的参数之一(因为APN可以区分一个业务或者外部网络)。

藏红花相关

(1)藏红花是什么?有什么功效?

藏红花(Saffron)也叫番红花,是常见的香料,产于土耳其和伊朗一带的植物,伊朗是世界最大的番红花出产地,占世界总产量90%以上。其次是西班牙,是全世界最贵的香料,大约要170,000朵番红花才能收集到1kg的雌蕊柱头,因为每一朵紫色的番红花只有三个柱头,而柱头的取得必须在日出前以人工完成采摘以避免花朵枯萎而失去采收价值,采收后必须再干燥脱水后才能分级出售。
藏红花主要用于食物香料上,譬如西班牙人用它做海鲜饭,伊朗人的传统美食khoresh(一种肉汤)也需要它,意大利人则用它做传统的米兰炖饭。中世纪的欧洲人使用番红花治疗呼吸道感染(咳嗽和感冒)、猩红热、天花、癌症和哮喘。此外,番红花还会用来医治血液和其他疾病包括:失眠、瘫痪、心脏病、胀气、胃病、痛风、慢性子宫出血、闭经、婴儿绞痛和眼疾等。在中国,《本草纲目》上记载藏红花具有镇静、镇痛、活血去瘀等功效。但因同时由于有通经、堕胎,促进子宫收缩的作用,所以孕妇不宜使用。古波斯人和埃及人,也会用番红花来壮阳、解毒、帮助消化,以及治疗痢疾和麻疹。在藏传佛教里常看到的藏传佛教徒以红花来供养舍利子使舍利子增生,传统的藏传佛教徒会把红花放在八供水里,让水变成橘红色,非常漂亮,以此供佛菩萨。现代医学上,有抑癌、抗氧化、免疫调节等作用。藏红花一般经口食用时并不会造成危险,但若大量食用会有急性中毒的危险,一次摄取5g以上的量会有严重的副作用,致死量大约在12~20g之间。 

用法:

* 用量:每次取3~8根,不要超过8根,每日或隔日,食用1次。开始几次可以吃3根,因为它会刺激肠道,便秘的人会顺畅,肠敏感的人会拉肚子,适应了就可以逐步加量。上午食用为佳,不要在睡前喝。一盒5克装大约可以吃8-10个月。小主每年都会购买头年新花
* 泡水喝:冷热水皆可,三杯之后,吞下花蕊。
* 烹美食:炖盅、做汤、煮饭皆可,藏红花是与鹅肝、鱼子酱和黑松露并称“三王一后”的美食皇后,是欧洲料理最青睐的香料,是日常的食疗佳品。
* 女性:孕期禁用。生理期,正常体质者停吃,因为藏红花活血效果此刻就会直观地显现;如生理期淤结不畅者,可在经期头1天吃,缓解淤结。
* 男性:四季皆可吃,改善心血肝的功效,缓解情绪淤结,强健生理功能。

(2)藏红花有什么副作用?

* 孕妇禁用
* 有溃疡病及出血性疾病者慎用,如:胃出血等
* 肠道敏感特别容易腹泻者慎用
* 此外,藏红花会让神经愉悦兴奋,不宜睡前吃

(3)如何购买?通常的价格?

藏红花的等级如下图所示:

极品:全为花蕊顶端,全红,无黄色,看起来较粗壮。极品藏红花产量低,药用价值相对较高,价格昂贵。极品花丝比特级更长更整齐更粗壮,市场上基本见不到,基本为特供;
特级:全红,无黄色,是藏红花顶端部分,与极品不同的是,特级藏红花为顶端柱头全部部分,包含极品藏红花部分。伊朗市场上大部分都是这种;
 一级:全红加黄根,即带有一点黄色的花杆。黄根占到1/3,属于中下等品质,黄根无药效,价格较低。
二级:黄根部分占整体重量大约三分之二,属于下等品质,
同时,采摘部位,花蕊的粗壮程度、花蕊的长度、完整度、干湿程度、韧度、新鲜度、断碎程度、混杂成色等都会影响藏红花的级别划分。

足球相关的英语单词

(1)场上人员称谓:

Assistant referee:助理裁判(名词) :The assistant referee held up his flag to show the referee that the ball was still in play.
Attacker: 前锋(forward)Striker:前锋
goalkeeper:守门员 The goalkeeper for France dived to the ground and saved Ronaldo’s shot.
Defender:后防队员
Midfielder:中场 Mesut Ozil is one of the best midfielders in the world.
Substitute (Sub):替补When Sir Alex Ferguson saw that his players were getting tired, he always substituted them.
Bench:板凳[席]/替补席
Skipper:[担任]队长
Full-back,边后卫
central defender,中卫
——其他的说法;
后卫: Back
前卫: Midfielder
前锋: Forward
中锋: Striker
自由人: libero
中后卫: Center Back
全能选手: utility player
守门员: Goalkeeper, Goalie
左(右)后卫: Left (Right) Back
清道夫, 拖后中卫: Sweeper
左(右)前卫: Left (Right) Midfielder
攻击型前卫, 前腰: Attacking Midfielder
防守型前卫, 后腰: Defending Midfielder

(2)一些比较出名的球队以及球员:

西甲—Barcelona:巴萨

Lionel Messi:
Luis Suárez,苏牙
Griezmann,格列兹曼
Dembélé,登贝莱
Semedo:塞梅多
Piqué,皮克
Umtiti,乌姆蒂蒂
Frenkie de Jong,德容
ter Stegen,特尔施特根

—皇马,Real Madrid

Hazard,阿扎尔
Benzema,本泽马
Bale,贝尔
Jović,约维奇
Rodrygo,罗德里格
Isco,伊斯科
James Rodríguez,哈梅斯·罗德里格斯
Valverde,巴尔韦德
Casemiro,卡塞米罗
Modric,莫德里奇
Kroos,克罗斯
Marcello,马塞洛
Varane,瓦拉内
Ramos,拉莫斯
Cavajal,卡瓦哈尔
Courtois,库尔图瓦

–Atletico Madrid,马竞

Costa,科斯塔
Félix,菲利克斯
Lemar,勒马尔
Oblak,奥布拉克

英超—曼联Manchester United

Rashford,拉什福德
Martial,马夏尔
Pogba,博格巴
Maguire,马奎尔
de Gea,德赫亚

曼城-Manchester City

Sterling,斯特林
Jesus,赫苏斯
Agüero,阿圭罗
Sané,萨内
Bernardo Silva,貝納多·席尔瓦
Bruyne,德布劳内
Hernandez,罗德里
Cancelo,坎塞骆
Laporte,拉波泽特
Otamendi,奥塔门迪
Ederson,埃德森

利物浦-Liverpool

Salah,萨拉赫
Mané,马内
Firmino,菲尔米诺
Fabinho,法比尼奥
Henderson,亨德森
van Dijk,范戴克
Lovren,洛夫伦
Arnold,阿诺德
Alisson,阿里森

切尔西-Chelsea

Pulisic,普利西奇
Giroud,吉鲁
Willian,威廉
Kovačić,科瓦西奇
Kanté,坎特
Jorginho,若日鸟
Alonso,阿隆索
Kepa,卡帕

阿森纳-Arsenal

Aubameyang,奥巴梅扬
Pépé,佩佩
Lacazette,拉卡泽特
Özil,厄齐尔
Ceballos,塞巴略斯
Mustafi,穆斯塔菲
Leno,莱诺

热刺-Tottenham Hotspur

Kane,凯恩
Son Heung-min,孙兴憨
Ndombele,恩东贝莱
Eriksen,埃里克森
Alli,阿里
Sanchez,桑切斯
Lloris,洛里斯

意甲,尤文图斯-Juventus

Cristiano Ronaldo,罗纳尔多
Dybala,迪巴拉
Costa,科斯塔
Higuaín,伊瓜因
Pjanić,皮亚尼奇
Ramsey,拉姆塞
Rabiot,拉比奥特
Bentancur,本坦库尔
Chiellini,基耶利尼
de Ligt,德利赫特
Bonucci,博努奇
Sandro,桑德罗
Demiral,德米拉尔
Szczęsny,什琴斯尼
Buffon,布冯

国米-Internazionale Milano

Lukaku,卢卡库
Sánchez,桑切斯
Martínez,马丁内斯
Barella,巴雷拉
Godín,戈丁
Handanovič,汉达诺维奇

德甲,拜仁-Bayern

Lewandowski,莱万
Müller,穆勒
Thiago,蒂亚戈
Martínez,马丁内斯
Tolisso,托里索
Lucas,卢卡斯
Kimmich,基西米
Alaba,阿拉巴
Neuer,诺伊尔

法甲-巴黎圣日尔曼,Paris Saint-Germain,

Neymar,内马尔
Mbappé,姆巴配
Icardi,伊卡尔迪
Cavani,卡瓦尼
Verratti,维拉蒂
Di María,迪马利亚
Silva,席尔瓦
Navas,纳瓦斯

(3)其他词汇;

Away game:客场比赛;
Corner:角球
Locker room:更衣室(locker是储存柜的意思)
Draw:打平/平局 The game ended in a draw, and the final score was 2-2.
Equalizer:扳平比分的进球,In the last minute, Marcello was able to run past the defense and score an equalizer.
Extra time:加时赛 They were lucky the game went into extra time because they ended up winning.
Fit:健康/状态良好(形容词)取自单词 fitness。如果说球员 fit,就表示他们状态良好,可以上场比赛
Foul:犯规
ree kick:任意球
Full-time:终场 The referee blew his whistle three times to tell everyone it was full-time.
Half-time:中场休息 The players ran off the pitch and had a meeting during half-time.
Handball:手球 When the ball hit Matt on the arm, the referee blew his whistle and the other team was given a penalty.
Header:头球(名词)Ronaldo’s teammate passed the ball high to him. He jumped up and managed to score a goal with a header.
Home game:主场比赛(名词)反义词:Away Game(客场比赛)
Injury time:伤停补时
Kick off:开球 Do you have any idea what time is kickoff?
Match:比赛
Offsides:越位 传球的一刹那,在进攻球员和对方门线之间必须至少有 2 名防守队员,否则,将吹罚进攻球员越位。The fans in the stadium shouted angrily when the referee blew his whistle to say that Messi was offsides; he had been very close to scoring a goal.
Pass:传球
penalty area:禁区
Penalty shootout:点球大战 Spot kick:点球
Pitch:球场,Because it had been raining for a couple of days, the pitch was muddy and difficult to play on.
Red card:红牌
Shoot:射门/攻门/打门
Spectator:观众
Stands:看台
Tackle:断球
Throw in:[掷]界外球
Touchline:边线(名词)足球场的长边,也作 sideline
Wall:人墙
Yellow card:黄牌
——得分进球相关的词
Concede:失球,Defeat:输球/失利(名词) suffer a defeat 意为输掉比赛。
Goal difference:分差/进球差距 Because all of the teams in the Premier League are really strong, the goal difference is usually small.
Premier League,超级联赛
Knock out:淘汰 In the last World Cup, New Zealand was knocked out of the competition by Mexico.
The Lead:领先 At the end of the first half Real Madrid were in the lead, but Chelsea won in the end.
Score:比分
Scoreboard:记分牌/板 The time on the scoreboard shows there’s only 5 minutes left of the match.
Advantage:攻方有利 The ref held up his hand to call advantage.
Bicycle kick:倒钩 Scissor kick:剪刀脚
Booking:吃[黄]牌 After two bookings for fighting with the other team, Jonathan was sent off
Boot:踢球
Box:禁区
Coin toss:掷硬币(名词) Toss a coin:掷硬币(动词)
Dead ball:死球
Division:[联赛]级别(名词)联赛的等级。All the top teams of the UK are in the premier division (league).
Fixture:赛程 All the World Cup fixtures are chosen out of a hat to make sure it’s completely fair.
Mark:盯人
Own goal:乌龙球
Pep talk:动员[讲话](名词)主教练鼓舞球队士气的简短讲话。The players sat and listened to their coach give them a pep talk in the changing rooms.
Promotion:升级(名词) Promote:升级
Rivals:对头/死敌(名词)对头/死敌。Manchester United and Manchester City have been rivals for years.
Relegation:降级(名词) Relegate:降级(动词)
Transfer fee:转会费
---装备
Cleats:鞋钉
Gloves:手套
Goal posts:门柱
Jersey:球衣
Kit:全套足球服
Net:球网
Soccer socks:球袜
Shin-pads:护腿板
Strip:队服

—解说:
Clinical finish:控制准确的进球(名词)指射门时对球的控制非常出色的进球。
Commentator:解说员
Keep possession:掌控球权/控球
Long-ball game:长传冲吊
One-touch football:一脚出球
Prolific goal scorer:高产得分手
Put eleven men behind the ball:“把十一个人都用在防守上”/龟缩防守/摆大巴(动词短语)指一只球队在防守端投入重兵而缺乏主动进球得分的意愿。
Replay:回放
Underdog:不被看好者
Get stuck in:投入
Have a lot of pace:速度快
Have a sweet left foot:金左脚
Man on!:“来人了”
Pull off a great/amazing save:做出精彩扑救
Put it in the back of the net:送入网窝
We were robbed!:“我们被抢了!”(短语)当你认为比赛存在不公时用以发泄怨气。
Broadcast:转播(名词/动词)电视、网络或电台实时播放比赛。
Fever pitch:狂热
Group stage:小组赛阶段
Host country:主办国/东道主
National anthem:国歌 National team:国家队
Knockout stage:淘汰赛阶段
Qualify:出线
Quarter-finals:四分之一决赛
Runners-up:亚军
Semi-finals:半决赛
Sponsor:赞助[商]
The finals:决赛阶段 一届赛事的最后阶段,包括四分之一决赛和半决赛。
The final:决赛
Trophy:奖杯


欧洲联赛:
Italian Seria A 意大利甲级联赛 
Germany Bundes liga 德国甲级联赛 
France Le Chanpionnat 法国甲级联赛 
Spain La Liga ;Primera división de Liga,简称La Liga西班牙甲级联赛
England Premiership英格兰超级联赛 
Eredivisie 荷兰甲级联赛 
Scottish Premier League 苏格兰超级联赛
 
 
欧洲足球赛事: 
European Championship; European Cup 欧洲杯(欧洲锦标赛)
UEFA Champion League 欧洲冠军联赛 
The UEFA Cup 联盟杯 
Toto Cup托托杯 
UEF Aunion of European Football Associations 欧洲足球联合会

足球相关英语词汇.doc

——参考:

足球英语终极词汇手册

Oracle专题

#########################前言########################

一、特殊符号ascii定义

制表符 chr(9)

换行符 chr(10)

回车符 chr(13)

###################

在我们遇到问题时,就应该不断深入研究,直至问题的核心本质,这样通过一个案例或实际问题的诊断学习和研究,我们就可以带动很多连带知识的学习,这样从一个点深入下去就形成一条线,再横向扩展就可以形成一个知识网,解决和研究的问题多了,就可以逐渐覆盖一个面,形成一个知识体系,这样慢慢的你就会觉得学习不再困难,而是一件得心应手的事情。

而且,认真思考和深入研究本身就是对DBA的一项基本素质要求

!!!!对于一个候选人来说,我希望他勤奋、严谨、具有钻研精神及独立思考能力。技术其实往往并不是我最关心的内容,因为具备了前面的素质之后,经过1~2年的锻炼,一个人绝对不会知道的太少。!!!!!!

DBA生存之四大守则:

1.备份重于一切

我们必需知道,系统总是要崩溃的,没有有效的备份只是等哪一天死!我经常开玩笑的说,唯一会使DBA在梦中惊醒的就是:没有有效的备份。

在进行重要的操作(如恢复尝试、升级操作等)之前,一定要做好备份,保留现场,以便必要时可以从头再来。

2.三思而后行

Think thrice before you act。

任何时候都要清楚你所做的一切,否则宁可不做!对于DBA来说,有时候一个回车,一条命令就会造成不可恢复的灾难,所以,你必需清楚确认你所做的一切,以及这些操作可能带来的后果,并且在必要时保护现场。

DBA切忌想当然。

3.rm是危险的

要知道在UNIX/Linux下,这个操作意味着你可能将永远失去后面的东西,所以,确认你的操作!!!

太多的人在 “rm -rf” 上悲痛欲绝,当年写下这条守则时,是一个凌晨被一个朋友吵醒,他说误操作rm -rf删除掉了200G的数据库,并且没有备份。

我当时能告诉他的只有一句话:要保持冷静.

4.你来制定规范

良好的规范是减少故障的基础。所以,作为一个DBA,你需要来制订规范,规范开发甚至系统人员,这样甚至可以规避有意或是无意的误操作,减少数据库的风险。

见过太多管理混乱的开发环境,经常出现程序员连错生产环境误操作的案例,所以规范实在是非常的重要

不以规矩,不成方圆。

这四个守则有的部分是相互关联,密不可分的,希望每个DBA都能谨慎认真,少犯错误

#######################################################

1.存储过程一:

DECLARE v_CreateSql VARCHAR2(4000);v_ExecuteSql VARCHAR2(4000);v_Pos NUMBER;

BEGIN  SELECT CREATE_SQL INTO v_CreateSql FROM DYN_TABLE

WHERE BASE_TABLE_NAME = ‘EVENT_USAGE’ ;

v_CreateSql := REPLACE(v_CreateSql, ‘&BILLING_CYCLE_ID’, 237 );

v_Pos := INSTR(v_CreateSql, ‘;’);  IF v_Pos = 0 THEN      v_Pos := length(v_CreateSql);

 END IF;  WHILE (v_Pos > 0) LOOP  v_ExecuteSql := SUBSTR(v_CreateSql, 1, v_Pos -1);

 EXECUTE IMMEDIATE(v_ExecuteSql);  v_CreateSql := SUBSTR(v_CreateSql, v_Pos+1);  

 v_Pos := INSTR(v_CreateSql, ‘;’);   END LOOP;   END;

##########################################################3

(1)declare定义变量;

(2)create_sql :

CREATE TABLE EVENT_CDR_&BILLING_CYCLE_ID

PARTITION BY HASH(SUBS_ID) PARTITIONS 64 STORE IN(TAB_RB)

AS

SELECT * FROM EVENT_CDR

WHERE ROWNUM<1;

CREATE INDEX IDX_EVENT_CDR_SUBS_ID_&BILLING_CYCLE_ID ON EVENT_CDR_&BILLING_CYCLE_ID (

  SUBS_ID ASC

)

LOCAL STORE IN(IDX_RB);

(3)replace函数:

replace(原字段,“原字段旧内容“,“原字段新内容“,)

语句:update sys_frmattachmentdb  set filefullname = replace(filefullname,’历城区,’北京区)

(4)instr()函数的格式  (俗称:字符查找函数)

格式一:instr( string1, string2 )    /   instr(源字符串, 目标字符串)

格式二:instr( string1, string2 [, start_position [, nth_appearance ] ] )   /   instr(源字符串, 目标字符串, 起始位置, 匹配序号)

解析:string2 的值要在string1中查找,是从start_position给出的数值(即:位置)开始在string1检索,检索第nth_appearance(几)次出现string2。

 注:在Oracle/PLSQL中,instr函数返回要截取的字符串在源字符串中的位置。只检索一次,也就是说从字符的开始到字符的结尾就结束。

<span style="font-family: Courier;"–<——实例————————————————

格式一

1 select instr(‘helloworld’,’l’) from dual; –返回结果:3    默认第一次出现“l”的位置2 select instr(‘helloworld’,’lo’) from dual; –返回结果:4    即:在“lo”中,“l”开始出现的位置3 select instr(‘helloworld’,’wo’) from dual; –返回结果:6    即“w”开始出现的位置

格式二

1 select instr(‘helloworld’,’l’,2,2) from dual;  –返回结果:4    也就是说:在”helloworld”的第2(e)号位置开始,查找第二次出现的“l”的位置

2 select instr(‘helloworld’,’l’,3,2) from dual;  –返回结果:4    也就是说:在”helloworld”的第3(l)号位置开始,查找第二次出现的“l”的位置

3 select instr(‘helloworld’,’l’,4,2) from dual;  –返回结果:9    也就是说:在”helloworld”的第4(l)号位置开始,查找第二次出现的“l”的位置

4 select instr(‘helloworld’,’l’,-1,1) from dual;  –返回结果:9    也就是说:在”helloworld”的倒数第1(d)号位置开始,往回查找第一次出现的“l”的位置

5 select instr(‘helloworld’,’l’,-2,2) from dual;  –返回结果:4    也就是说:在”helloworld”的倒数第1(d)号位置开始,往回查找第二次出现的“l”的位置

6 select instr(‘helloworld’,’l’,2,3) from dual;  –返回结果:9    也就是说:在”helloworld”的第2(e)号位置开始,查找第三次出现的“l”的位置

7 select instr(‘helloworld’,’l’,-2,3) from dual; –返回结果:3    也就是说:在”helloworld”的倒数第2(l)号位置开始,往回查找第三次出现的“l”的位置

注:MySQL中的模糊查询 like 和 oracle中的 instr() 函数有同样的查询效果; 如下所示:

select * from tableName a where name like ‘%helloworld%’;

select * from tableName a where instr(name,’helloworld’)>0;  –这两条语句的效果是一样的

(5) := 是Declare 与 Begin之间声明的变量、常量赋值符号,如 v_Total Number(14,2) := 100;

= 是Begin 与 End之间常用在SQL检索条件或者判断用的比较符号,如 …Where Rownum = 10; if v_Total = 100 then … end if;

(6)在oracle中,比较常见的可能是length、substr,至少我看到的大部分都是这两个,要不是昨天看代码发现了lengthb、substrb,估计我也遗忘了。length表示的是字符串的字符长度,lengthb表示的是字符串的字节长度;substr表示根据字符长度获取子串,substrb表示根据字节长度来获取字串

(7)substr(字符串,截取开始位置,截取长度) //返回截取的字

substr(‘Hello World’,0,1) //返回结果为 ‘H’  *从字符串第一个字符开始截取长度为1的字符串

substr(‘Hello World’,1,1) //返回结果为 ‘H’  *0和1都是表示截取的开始位置为第一个字符

substr(‘Hello World’,2,4) //返回结果为 ‘ello’

substr(‘Hello World’,-3,3)//返回结果为 ‘rld’ *负数(-i)表示截取的开始位置为字符串右端向左数第i个字符

测试:select substr(‘Hello World’,-3,3) value from dual;

(8)while loop 循环;

execute immediate:意思就是执行语句,在编写存储过程也是常用到的;

(9)power函数:

POWER(n2, n1)   返回n2的n1次方结果

2.oracle查看建表语句:

增加字段语法:alter table tablename add (column datatype [default value][null/not null],….);

说明:alter table 表名 add (字段名 字段类型 默认值 是否为空);

  例:alter table sf_users add (HeadPIC blob);

  例:alter table sf_users add (userName varchar2(30) default ‘空’ not null);

修改字段的语法:alter table tablename modify (column datatype [default value][null/not null],….);

说明:alter table 表名 modify (字段名 字段类型 默认值 是否为空);

  例:alter table sf_InvoiceApply modify (BILLCODE number(4));

删除字段的语法:alter table tablename drop (column);

说明:alter table 表名 drop column 字段名;

  例:alter table sf_users drop column HeadPIC;

字段的重命名:

说明:alter table 表名 rename  column  列名 to 新列名   (其中:column是关键字)

  例:alter table sf_InvoiceApply rename column PIC to NEWPIC;

表的重命名:

说明:alter table 表名 rename to  新表名

  例:alter table sf_InvoiceApply rename to  sf_New_InvoiceApply;

3.删表,drop,或者直接plsql tables中删除

一次插入一条数据

insert into 表名 (字段名1,字段名2) values (字段值1,字段值2);

例如:

insert into customer (id,name) values (1,‘xiaozhang’);

注意:字符类型的数据需要添加

一次插入多条条数据

例如:

insert all

into seller values(1,‘A服装店’,‘1300000000’,‘中国北京朝阳区’,www.a.com,‘5’,‘经营各式服装’)

into seller values(2,‘B数码店’,‘1580000000’,‘中国浙江省杭州市拱墅区’,www.b.com,‘4’,‘经营各类电子’)

into seller values(3,‘c电器店’,‘1370000000’,‘中国广东深圳莲花港’,www.c.com,‘4’,‘经营各类家电’)

into seller values(4,‘D书店’,‘1590000000’,‘中国山东崂山’,www.d.com,‘5’,‘经营各类实体书与电子书’)

select * from dual;

注意:字符类型的数据需要添加

4.Oracle报错:“ORA-02292:违反完整约束条件(XXX.FKXXX)- 已找到子记录

1、找到以”FKXXX“为外键的表A的子表,直接运行

select a.constraint_name, a.table_name, b.constraint_name

from user_constraints a, user_constraints b

where a.constraint_type = ‘R’

and b.constraint_type = ‘P’

and a.r_constraint_name = b.constraint_name

and a.constraint_name = ‘FKXXX’

2、删除相应的子表记录

3、删除主表记录

##############rownum##############

1.作用:查询返回结果的编号,用于限制返回的条数;只能查询rownum<某个数的结果,针对>默认为false,但是可以用子查询进行;

select * from(select rownum no ,id,name from student) where no>2;

2.默认排序是按照插入顺序排序的,用子查询;

select rownum ,id,name from (select * from student order by name);

#################trunc函数##################

/*

TRUNC(number,num_digits) 

Number 需要截尾取整的数字。 

Num_digits 用于指定取整精度的数字。Num_digits 的默认值为 0。

TRUNC()函数截取时不进行四舍五入

*/

##################表空间和数据文件#######################

首先,你需要明白的一点是:数据库的物理结构是由数据库的操作系统文件所决定,每一个Oracle数据库是由三种类型的文件组成:数据文件、日志文件和控制文件。数据库的文件为数据库信息提供真正的物理存储。 

每一个Oracle数据库有一个或多个物理的数据文件(data file)。一个数据库的数据文件包含全部数据库数据。逻辑数据库结构(如表、索引等)的数据物理地存储在数据库的数据文件中。数据文件通常为*.dbf格式,例如:userCIMS.dbf。数据文件有下列特征:①、一个数据文件仅与一个数据库联系;②、一旦建立,数据文件只增不减;③、一个表空间(数据库存储的逻辑单位)由一个或多个数据文件组成。 

其次,我们再来叙述一下Oracle的逻辑结构:Oracle的逻辑结构包括表空间(tablespace),段(segment),数据块(data block)以及模式对象(schema object)。 

Oracle数据库在逻辑上是由多个表空间组成的,表空间在物理上包含一个或多个数据文件。而数据文件大小是块大小的整数倍;表空间中存储的对象叫段,比如数据段,索引段和回退段。段由区组成,区是磁盘分配的最小单位。段的增大是通过增加区的个数来实现的。每个区的大小是数据块大小的整数倍,区的大小可以不相同;数据块是数据库中的最小的I/O单位,同时也是内存数据缓冲区的单位,及数据文件存储空间单位。块的大小由参数DB_BLOCK_SIZE设置,其值应设置为操作系统块大小的整数倍。 

⑴、表空间(tablespace) 

表空间是数据库中最大的逻辑单位,每一个表空间由一个或多个数据文件组成,一个数据文件只能与一个表空间相联系。每一个数据库都有一个SYSTEM表空间,该表空间是在数据库创建或数据库安装时自动创建的,用于存储系统的数据字典表,程序系统单元,过程函数,包和触发器等,也可用于存储用户数据表,索引对象。表空间具有在线(online)和离线(offline)属性,可以将除SYSTME以外的其他任何表空间置为离线。 

⑵、段(segment) 

数据库的段可以分为四类:数据段、索引段、回退段和临时段。 

⑶、区 

区是磁盘空间分配的最小单位。磁盘按区划分,每次至少分配一个区。区存储与段中,它由连续的数据块组成。 

⑷、数据块 

数据块是数据库中最小的数据组织单位与管理单位,是数据文件磁盘存储空间单位,也是数据库I/O的最小单位,数据块大小由DB_BLOCK_SIZE参数决定,不同的Oracle版本DB_BLOCK_SIZE的默认值是不同的。 

⑸、模式对象 

模式对象是一种应用,包括:表、聚簇、视图、索引序列生成器、同义词、哈希、程序单元、数据库链等。 

最后,在来说一下Oracle的用户、表空间和数据文件的关系: 

一个用户可以使用一个或多个表空间,一个表空间也可以供多个用户使用。用户和表空间没有隶属关系,表空间是一个用来管理数据存储的逻辑概念,表空间只是和数据文件发生关系,数据文件是物理的,一个表空间可以包含多个数据文件,而一个数据文件只能隶属一个表空间。 

总结一下:解释数据库、表空间、数据文件、表、数据的最好办法就是想象一个装满东西的柜子。数据库其实就是柜子,柜中的抽屉是表空间,抽屉中的文件夹是数据文件,文件夹中的纸是表,写在纸上的信息就是数据。

#######################索引#############################

<span style="font-size: 13px; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(245, 245, 245); color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-variant-caps: normal; font-variant-ligatures: normal;"–<   从物理上说,索引通常可以分为:分区和非分区索引、常规B树索引、位图(bitmap)索引、翻转(reverse)索引等。其中,B树索引属于最常见的索引。

-=- 提高查询速度的方法还有在表上建立主键,主键与唯一索引的差别在于唯一索引可以空,主键为非空,

—rowid, 存储了row在数据文件中的具体位置

<span style="font-size: 14px; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; color: rgb(0, 0, 0); font-family: "Microsoft YaHei", Verdana, sans-serif, SimSun; font-variant-caps: normal; font-variant-ligatures: normal;"–<基本概念:

1、 类似书的目录结构

2、 Oracle 的“索引”对象,与表关联的可选对象,提高SQL查询语句的速度

3、 索引直接指向包含所查询值的行的位置,减少磁盘I/O

4、 与所索引的表是相互独立的物理结构

5、 Oracle 自动使用并维护索引,插入、删除、更新表后,自动更新索引

6、 语法:CREATE INDEX index ON table (column[, column]…);

7、 B-tree结构(非bitmap):

########################################union and union all##########################

如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字。

union(或称为联合)的作用是将多个结果合并在一起显示出来。

union和union all的区别是,union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。

Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;

Union All:对两个结果集进行并集操作,包括重复行,不进行排序;

Intersect:对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;

Minus:对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序。

可以在最后一个结果集中指定Order by子句改变排序方式。

############################################################

#########################那些年ora报的那些数字#################

(1)ORA-14402:更新分区关键字列将导致分区更改(分区表注意)

建立完分区表后一定要和开发确认一点,就是是否会修改分区字段。因为update分区字段到其他分区时候,会报错。

解决办法:开启表的行转移功能,这样在update以后,会在老分区删除数据,新分区插入数据。

1
alter table XX enable row movement

(2) ORA-01348:值大于为此列指定的允许精度

(3) ora-00054;oracle之报错:ORA-00054: 资源正忙,要求指定 NOWAIT. https://www.cnblogs.com/Ronger/archive/2011/12/19/2293509.html

 select session_id from v$locked_object;
 SELECT sid, serial#, username, osuser FROM v$session where sid = 31;

分开旅行–陶立夏 读书笔记整理

偶然间拿起这本书,是我在出差去中东的路上,在9个小时的飞行过程中,我在一只长着翅膀的金属庞然大物之中,思绪随着作者飘散到了世界各地。作者带着寻找永恒的初衷(“天空里没有恒星的恒心,只有风雨的无常,我要为我们两个人,去看一看永恒。”)出发,旅行的最后发现,原来我是去寻找我自己,与自己做个和解(“翻过着千山万水,我终于让你,自由,而我也可以重新去爱”)

——意大利:“我们在爱情里期待永恒,但这世间真的存在永恒不变的东西吗?

和餐厅老板告别的时候,他说:“有些风景,一个人看才更漂亮”,此时作者依旧存疑,把这句当成了老板的经验之谈。听了卡布里宫主人的故事后,感慨道“梦露,杰奎琳,卡拉斯。男人将她们串在一起,这三个赢得了全世界仰慕的女人,没能完整地拥有一个属于自己的爱人”,从圣·米歇尔别墅的过往住客亚克塞尔·蒙特的故事中,写下了“当我们失去,我们还可以靠回忆来拥有,我们也只能如痴,但谁又知道,这不是更好的拥有方式?那些失去了的,永不会再失去;”而别墅前的千年橄榄树又让作者开始思考人生的意义“在这么漫长的岁月里,我们稍纵即逝的存在是为了什么?我们随肉身消散的情感又有什么意义?”

爱里所说的永恒,在历史的长河中又算是多长时间呢?或许,是自己太执着了吧,于是你说“我看见了迷惘,也看见了,挽留的徒劳无益”,开始有了放下的初念。

—伦敦:”从荒芜到繁华,学生时代的记忆再次回来,温言暖语,终成冰炭“

在作者与M相遇的城市,故地重游,似乎已是物是人非,景色依旧,而过去的人又在何方:“这条河目睹过罗马人的入侵,伊丽莎白一世的舰队,以及全世界来这里淘金的商船。它就像一把标尺,你可以用它来衡量整个世界的改变。懂了泰晤士河,就懂了伦敦,懂了伦敦,即是懂了人世的悲欢离合。”
—国家美术馆和伦敦其他美术馆,博物馆一样免费开放,这是个依旧存在着阶层的城市,生活着皇室,贵族与平民,连超市购物袋都能泄露你的收入和身份,但最珍贵的东西又往往是免费的,或许这正是“无价”一词的本义。
—或许,消亡是一件缓慢的事,我们都不该匆忙地去做。比如烛火的熄灭,比如感情的冷却。在逐渐升起的暮色中,想起伦敦所代表的那个大英帝国,她的伟大,荣耀与失落,背负这么多前尘往事,也难怪这城市时常有张沉思而阴郁的面容。亨利·詹姆斯在《英国风情》中写道:“只有那些热情的朝拜者,茫然的外国人和其他剥夺了特权的人们,才能欣赏这个令人赞叹的国家的’特点’。

–北德:”在往北就是秋天了,我去北德拜访勃拉姆斯,还有他对克拉拉无望的爱情“

--怪不得聂鲁达说,我喜欢船员的爱情,只一个吻就可以告别;
—吕内堡居然不是白色的,那种惊讶就如同有人告诉我,拔河的作品是不对称的。
---古典音乐史的高峰是“三B”,Bach,Beethoven,Brahms(巴赫,贝多芬,勃拉姆斯),贝多芬的音乐一贯如那些乐曲的名字,个性鲜明、风格突出,而单恋了克拉拉·舒曼一辈子的勃拉姆斯最懂的深刻与克制的含义,巴赫呢,他总给他的作品编号,仿佛那是流水线上下俩的作品,有人推测《哥德堡变奏》是首支让听众感到无聊的催眠曲,这也不足为奇。
—一切美好而有序,奢华,平静而妖娆。这是波德莱尔形容巴黎的言辞,不过用来评价巴赫的音乐也不错。
--君特·格拉斯在他的回忆录《剥洋葱》里说:那些曾让你觉得隐隐作痛的事,依旧隐隐作痛。每座城市,就像每个人一样,多少都带着伤痕。骄傲的吕贝克人却已经把它们一一抹平了。
— 谁不是这样呢,活在过去与未来的微醺里。
--我在它的纪念碑上读到:它能躲避二战战火,是因为这个地区有众多湖泊。当年盟军计划在夜晚轰炸什未林车站,切断德军运输线。湖水倒映着月光闪闪发亮,飞行员大概没读过什未林旅游宣传手册,认为这样的湖区一定属于乡间,于是把炸弹投在了郊外的一间工厂。

—蒙古:”每次回程飞机遭遇颠簸,就知已到达乌拉尔山脉,我想去看看,这片荒芜里有什么“

--如果不能直面人世的复杂,那么,去看一看人世的荒芜吧。
--韩国人与日本人来了,于是乌兰巴托有一条大街被命名为首尔街,姑娘们喜欢用韩国化妆品。最直接的影响是:日本车是右侧驾驶,韩国车则左侧驾驶,于是蒙古人依靠好骑手与生俱来的良好平衡感,习惯了驾驶时左右开弓。
--在人生最后的岁月中,成吉思汗想到自己的后代将结束艰苦的游牧生活而转向定居生活时,痛苦地反思:"我们的后裔将穿戴织金衣,吃鲜美肥食……但他们不说:'这都是由我们的父兄得来的',他们将忘掉我们和这个伟大的日子。"事实上他的话在800年后,有了一种微妙的阐述。
--以欧洲为代表的西方世界一度不愿正视成吉思汗的征服史,不承认成吉思汗的骑兵与马其顿方阵、罗马军团一样治军严谨、战策英明。不过,近年来成吉思汗却作为个体获得了崇高待遇,印有他画像的纪念品总是很畅销。这样的转变或许与美国式个人英雄主义的传播不无关系。他足够铁腕,足够英勇,足够强大,至于他确立蒙古文字、开创蒙古帝国最初的政治体制等这些建树反而在其次。我也同样在他非凡的经历里获得启示:要毫不犹豫地去相信你想相信的事,并付诸实践,尽管这自由意志代价高昂。
--蒙古谚语说:人唯有在开阔广大之地,才能具备真正的眼界。我决定出发到戈壁去。
--Muugi说飞马是戈壁也是蒙古的图腾,这让我想起威尼斯的标志:长着翅膀的狮子。有了翅膀,它们就可以征服天与地。
--在这片土地上,并不是拥有的越多就越富有,而是需要的越少,就越容易觉得满足。

—肯尼亚:《夜航西飞》《走出非洲》”乞力马扎罗山上的雪,马赛马拉的牧群,我好像开始怀念你了,像怀念一个故人“

—---这么年轻,为什么不快乐?没看见么?这个世界都是你的!
—---哈,中东很安全,不安全的,不过是人心。
----从来没有过问你经历了什么,独自承担了些什么,你的心为什么会改变,不就是人世与人心嘛,谁和谁不都一样?看着窗外纹丝不动的夜色,我独自想。你可以说这样很冷血,说这样很残忍,也可以说这是智慧,这是看透,“不见得你比别人更痛些,只不过你表达得精彩些。”黄碧云这话,算是句风凉话,但是真的,你走这么远赶来,不过是为了一时的心痛。
----欧美上流社会中曾流行在获得一笔丰厚遗产后买张到肯尼亚的机票,一下飞机就换上全身卡其布装束,扛上猎枪,带上几叠白色餐巾再雇一堆仆佣,浩浩荡荡向着狮子与大象进发。中间当然也有蚊虫叮咬,帐篷内缺水少电这样无伤大雅的小麻烦,他们最后都成为海明威的灵感,写进了《非洲的青山》以及《乞力马扎罗的雪》。
—--马赛人认为跳得高的是英雄,跳得越高就可以获得越多女朋友。
—---入睡前,我想起伯瑞尔·马卡姆在《夜航西北》中的句子,这个在肯尼亚长大的英国奇女子曾这样形容肯尼亚的寂静:“世间有许多种不同的静默,每一种都有不同的意味。有一种寂静是伴随清晨的树林一同降临,它有别于一座寂静是伴随清晨的树林一同降临,它有别于一座安睡的城市的寂静。有暴风雨前的寂静以及暴风雨后寂静,这两者也不尽相同。有虚无的静默,惊惧的静默,疑惑的静默······它是无声的回响。”
-----乞力马扎罗山越来越近,关于它的故事之一是英女王在19世纪末将它作为生日礼物送给了德国皇帝,乞力马扎罗也因此被划入德国殖民统治下的坦桑尼亚版图。事实上,事情并非如此简单,作为交换,英国人获得了印度洋海上贸易重镇桑给巴尔的控制权,肯尼亚的海岸线得到了巩固。在经历了无数纷争后,如今肯尼亚人对游客说:乞力马扎罗依旧是肯尼亚的,因为它最美的一面,只在肯尼亚才能看见。
——我们都说威尼斯要沉了,而乞力马扎罗山的雪正在融化,它们代表着某种无法转圜的遗憾。世界上当然还有许多其他的美景,我以为能做的,只是经过千山万水走到她们面前,然后为她们的美,屏住呼吸,忍住泪水。但是当我真的站在乞力马扎罗山下,才明白事情并非如此简单。或许我们走那么远,不是为了看风景,而是为了去天地的尽头会一会自己。因为只有在那遥远的地方,你才能把喧嚣的人世抛在身后。M,原来走这么远,我不是要寻找你,而是要寻找自己。
---放下餐巾走到空地上,静静看着基博峰耀目的折光,那一刻,我明白了海明威写《乞力马扎罗的雪》时感到的那种恐惧,一种来自迷惘的,竭泽之鱼般的恐惧,原来生命可以像烈酒般一饮而尽,吞下腹去不知所终。我们都像是书中失败的作家哈利,贪图安逸,逃避辛劳,最后一无所获,满心惆怅。
---我们顾虑太多,要求太多,到最后绕了很远的路回来,留在手心里,也还是最初的那一点感动,以为只要缱绻过一时,就能用这样的心去爱一世。但是在这激流一样的人世间,谁真的能够?我现在不会再觉得心痛,只有一种难言的怅惆。因为我更加懂得你,懂得了人世的不确定。
--仿佛只有到了拉姆,才真正明白了人的一生在时间长河中的意义,正如同庄子两千多年前在蜉蝣身上得到的那个小小启示。
--游客走过风景,而旅行者则让风景从自己的内心走过(A tourist goes through the scenery and a traveler let the scenery go through himself .)
—-肯尼亚告诉我,在时间的河上,人的一生何其短暂,她告诉我,我们索取得那么多,而真正需要的,又是那么少。

—印度:《宝莱坞生死恋》”我经过印度洋,一路北上去看望世界上最寂寞的阳台,原来有些人,确实深深爱过“

---其实所有景色都那么美,只是路这么远,到后来,就觉得有几分荒凉。
—沙杰汗的寝宫正朝着泰姬陵的方向,以白色大理石建造,上面刻满了繁复的花纹,这是世界上最精美的监狱,站在阳台外,凝视着不远处的泰姬陵,我仿佛懂得了沙杰汗的心,可望而不可及的无奈与绝望,他是否曾经祈祷时间快点过去,早日安睡在爱人身边。
—现在,人们都忘记了沙杰汗的荒淫跋扈,只记住了他执着一念的爱情。代价就是:除却星期五,每天都有人去瞻仰她们的爱情,永无安宁。

—赫尔辛基:”赫尔斯基的火车站,由你最喜欢的建筑师设计。走了这么多路,却没有与你重逢。“

---只知道我们总是战胜空间,却对时间无能为力。
—--爱或许真的是很恐怖的事情,因为我们爱的时候,心内总是无比挂碍,有太多颠倒梦想。而结局,永远无法按着你的愿望实现。

—墨尔本:”这里是蔷薇和长羽鸟的天堂。世界的另一端,也许远离,才能靠近。

—在自然的博大广阔与人类的渺小狭隘之间,产生出深深的热爱与敬意。
—甲之熊掌,乙之砒霜。世间许多事都如人饮水,冷暖自知。
—在山间的溪流中看三文鱼逆流而上,顺应生命中无可解释的召唤,从海中回到山间产卵。不知道那些倔强的鱼可曾有问过原因,当时间到来,一定要历经艰难、不眠不休地回到当初出生的地方。作为人类的我们,时常迷惘,时常想大声呼喊,时常在问为什么。但其实很多事情没有缘由。就如同,爱若死了,就是死了,捡拾不起,呼唤不应。
—1909年,著名作家、编剧尤金·奥尼尔从宿醉中醒来,发现自己娶了一个陌生女人。怀着强烈的自我厌恶之情,他登上了一艘游轮,并在海上漂流了七个月,正是在游轮上,他获得了那些海上独幕剧的灵感,他为那些剧集取名为:The Moon of the Caribbees and Six Other Plays of the Sea。一百年后,我们带着各式各样的装备与情绪上船旅行。或许想要用无所事事的悠闲将自己灌醉,或许想要从千篇一律的海景中获得人生启示。但或许,麦特的话就是真理:“无论你希望从这座移动城堡上获得什么,都请不要只坐在舱房内看海景,因为所有的快乐与真理都在外面,Get Out There!”
—但当你决定将心放在他人的手里,又怎能计算代价。

—新加坡:“在轮船轰鸣中等待日出。我写了满满的三页信给你,最后寄出的却是空白”

---很多事情我们以为自己明白,其实,未必透彻。《夜航西飞》中有这样一句话:“我独自度过了太多的时光,沉默已成习惯。”
—李光耀曾说:“新加坡是个小岛,退潮时,面积只有 214平方公理。”新加坡人就在这个什么都有限的小岛上,努力活得像热带植物一样丰盛。而乔治·艾略特则说,“The happiest women,like the happiest nations,have no history”.我想不出哪个国家比新加坡更适合乔治·艾略特的这句类比。
---旅行很容易,出发很容易,逃避很容易,但寻找答案并不容易,我也开始知道,爱一个人很难,不爱一个人更难,而最难的是真正离开一个人,当你离开一个人,他并不会瞬间消失在街角,他是慢慢在你生命中消失的,就像渐渐干涸的水渍。那是一种缓慢而迟钝的折磨。我清楚的直销,你不能回赠我同样的深情与激烈,只要伸一伸手就能将我拥入怀中,而你只会抿紧嘴唇,双手握拳,看我抹着泪远走。但我更清楚的知晓,不管爱不爱你,时间都一样会过去,在这条暗流汹涌的长河里,我倔强地选择你,做我心上那道深不可测亦无法愈合的伤口。M,我们的明天不会来了,我感到,好遗憾,原来关于命运,我们都猜错。

—-得克萨斯州:“颓废的美国南方,劈柴喂马的生活,我们有自由的灵魂,也有永恒的孤寂”

--世界上有两个巴黎,一个在法国,还有一个在美国的德克萨斯州。
—孤星旗是唯一可与美国国旗并列的州旗。
—这自由不仅代表着没有拘束的生活,也代表着责任、创造和勤奋。就像德克萨斯人常说的那句:“勇敢去梦想、执着去实现。”

——日本:德川家康,织田信长,丰臣秀吉;“人生是一期一会的事,就像樱花。古都奈良的一杯茶,吉野山上的一段经。悸动的心渐渐静了。”

—-当那年冬季终于过去,我恍然发现时至今日生命中不需要任何人亦能活得很健康。我们常常失去,也常常有所得。只是与失去的绝对相比较,生命中的音乐,原本皆是恩赐。原来,我们都曾是孩子,将在手的幸福看的太理所当然了一些。
---或许等待真是最好的方式。
---如果不可以触碰,如何体会,如果不靠近,有如何明了。
—--之所以如此,是因为不常在眼睛,才能久留于心中。

——以色列:“见过死海,就当是死过一回,一切重新开始。我在哭墙前对世界上所有的神明说,让我们自由。”

—可能等你过完自己的一生,到最后却发现了解别人胜过了解你自己。你学会观察他人,但你从不观察自己,因为你在与孤独苦苦抗争。假如你阅读,或玩纸牌,或照料一条狗,你就是在逃避自己,对孤独厌恶就如同想要生存的本能一样自然,如果不是这样,人类就不会费神创造什么字母表,或是从动物的叫喊中总结出语言,也不会穿梭在各大洲之间---每个人都想知道别人是什么样子。
——“拣尽寒枝不肯栖”,是殊不容易的执着,其实何必?人都是有欠有还,才能相逢。
—我最爱的《圣经》章节是“传道书”,里面写道“已行的事,后必再行。日光之下,并无新事。”

—米兰:“我回到这段旅行的起点,去看《最后的晚餐》。这是最后的告别,我终于可以重新去爱了”。

—你知道吗,在爱里,本没有好与坏,也没有是与非。因为被爱的人,总是可以在爱他的人心里摆脱道德的审判。我不恨你,但是却开始想要忘记你。是不是这一路太漫长,终让我变得冷酷?
—在诸多与时间对抗的技艺中,写作大概是最简单的一种,从事这份工作只需要你可以抵抗孤独;大量时间的独处,不间断的阅读,自我否定过程中获得的自信,我喜欢这种不张望的专注,并决定在写作以及与时间的对峙中,贯彻始终。
  • something

---罗马:威尼斯广场(因为附近的威尼斯宫(Palazzo Venezia)而得名,罗马最大的圆形广场,五条大街交汇处,维克多·埃曼纽尔二世纪念堂的外观像极了结婚蛋糕,是为庆祝1870年意大利统一而建造的纪念堂,耗时25年建成,台阶下两组喷泉寓意深刻:右边的象征第勒尼安海,左边的象征亚得里亚海,中央骑马的人物塑像就是完成了意大利统一大业的维克多·埃曼纽尔二世。建筑物上面有两座巨大的青铜雕像,右边的代表“热爱祖国的胜利”,左边代表的是“劳动的胜利”,注,图片和介绍摘自https://www.jianshu.com/p/914ca37d7201);马可斯.布鲁图斯刺杀凯撒;
--伊丽莎白一世:是都铎王朝的第五位也是最后一位君主。她终生未婚,因此有“童贞女王”(The Virgin Queen)之称,她即位时英格兰处于内部因宗教分裂的混乱状态,但她不但成功地保持了英格兰的统一,而且在经过近半个世纪的统治后,使英格兰成为欧洲最强大和最富有的国家之一,她的统治期在英国历史上称为“伊丽莎白时代”,亦称为“黄金时代”。伊丽莎白为人谨慎,她的座右铭是“明察无言”(拉丁语:video et taceo)
---世界上有三个国中之国,一个是梵蒂冈,一个是圣马力诺,还有一个是莱索托王国。
---那不勒斯:圣塞维诺小堂,主人雷蒙德.迪.桑格罗让雕塑师创作了《覆纱的耶稣》;但丁在神曲中暗示,地狱的入口在那不勒斯郊外;
---波斯塔诺:小镇的特别之处,在于从海边顺着悬崖而上的小巧白房子以及变幻的海景
---卡布里:卡布里宫酒店有随处可见的“海绵女士”系列,设计师解释“海绵是来自海洋的皇冠,他相信唯有用最廉价朴素的材料,才能还原最本真的内心,而时常出现的浴缸则象征生命源泉,躲在浴缸里,男孩们幻想自己成为将军迎击海盗,女孩们幻想自己成为美人鱼等待王子的船经过”;
--特拉法尔加海战是19世纪初英国舰队与法国西班牙联合舰队之间的一场大规模海战,因海战地点在西班牙大西洋沿岸特拉法尔加角(靠近加的斯城市和港口)附近而得名,是帆船海战史上以少胜多的一场漂亮的歼灭战,也是19世纪规模最大的一次海战。纳尔逊在这场海战中敢于突破陈旧的战斗序列理论,运用灵活机动的战术,使法国和西班牙联合舰队一败涂地,并用自己的生命换来了不列颠皇家海军荣耀的巅峰,将胜利之剑牢牢地插在大洋中心。
--伦敦朗廷酒店,阿瑟·柯南·道尔在这里撰写福尔摩斯的冒险,拿破仑三世将这里当作他客居他客居伦敦时的行宫,丘吉尔在这里主持“二战”大局,奥斯卡·王尔德在这里说,“没有危险倾向的想法不配被称为想法”。朗廷酒店开出的最大账单应该属于温莎公爵,他在这里与辛普森夫人初次相遇,为了这次相逢,他付出了整个大英帝国的代价。
--汉堡著名的“米歇尔”(Michel) 教堂不仅是德国北部最重要的巴洛克式教堂,也可以被视为全球最高的灯塔之一,因为它是易北河上航运的重要陆标。 从 106 米高的观景台上可以一览汉堡和港口的全景,夜景则更为迷人。
--在牛津也有这样的纪念品。1555年拉提摩尔和雷德利两位主教在这里被信仰天主教的玛丽皇后下令烧死,拉提摩尔主教对一同殉道的伙伴喊道:"今天我们以上帝的恩慈在英格兰点燃这样一支蜡烛,我相信它永不会熄灭。"拉提摩尔所谓的蜡烛指的是新教徒的信仰。一年后的1556年,克兰麦大主教也在同一地点被处死。柴堆的火焰烧焦了贝列尔学院在几尺开外的大门。后来大门被拆下来重新安装到内庭入口,那些焦痕如今依旧清晰可见。人类总是为了不同的追求,付出相同的代价。
---乞力马扎罗在斯瓦西里语中的意思,璀璨发光的山。(斯瓦希里语(kiswahili),中文也称斯瓦希里文,属于班图语族,是非洲语言使用人数最多的语言之一(5500万多人),和阿拉伯语及豪萨语并列非洲三大语言)
—“Dhows”,意为单桅三角帆船,并且专指阿拉伯人在印度洋地区使用的帆船,位于肯尼亚东南海岸线的拉姆群岛主要由拉姆、曼达、帕泰和基瓦由四个大岛组成,附近还散布着较小的岛屿,其中最大的城镇建在拉姆岛上,因为群岛中只有拉姆的地下有淡水。

—对美酒爱好者来说,达拉斯是冰镇玛格丽特的诞生地,1971年,玛丽克诺·玛格丽特为了制造这种柔滑醒神的饮品,还特意发明了特殊的机器。

—-日本人处世哲学:万事取其长,为自己用。

—-佛罗伦萨,在意大利稳重写作Firenze,意为“繁花之地”,这便是徐志摩诗作中的“翡冷翠“。

少年维特的烦恼–歌德(巴蜀译翁)

       晚年的歌德在其回忆青年时代的生活的自传《诗与真》中说,他的作品“仅仅是一篇巨大的自白的一个个片段”,可以说,《少年维特的烦恼》在一定程度上反映了青年歌德的生活经历,字里行间打下了他思想感情的烙印。1772年歌德在帝国高等法院实习的时候,一次乡村舞会上认识了天真美丽的少女夏绿蒂,对她产生了炙烈的爱情,但夏绿蒂已与他的朋友订婚在先,歌德因此绝望而痛苦,脑子里不时也出现自杀的念头,4个月后才毅然不辞而别,回到法兰克福,一个月后,突然受到大学同学在维兹拉尔因恋慕同事的妻子遭到拒斥,工作中常受上司的挑剔,社交场上被贵族男女轻侮而自杀。1774年,从前认识并有好感的马克西米琳娜来到法兰克福嫁给一个富商,重逢后两个人很高兴,因此过从甚密,富商对两个年轻人的关系产生嫉妒,与歌德发生了激烈冲突,使歌德愤而提笔,下决心抒写出两年来自己在爱情生活中所经历和感受的全部痛苦,这就是本书的历史背景。

        少年维特的烦恼,在我看来,是少年维特发自内心对自己周遭环境的事物的深入思考,不人云亦云,也不屈从于环境的条条框框。

       对于身边的人,他认为“跟到处的人一样!人类嘛都是一个模子铸出来的。多数人为了生活,不得不忙忙碌碌,花去大部分的时间;剩下一点点余暇确使他们泛起愁来,非想法设法打发掉不可,这就是人类的命运啊。”何尝不是如此,在信息如此发达,多媒体缤纷的时代,我们愈发的无法让自己的内心平静,与自己独处。在周末,下班之后的时间,我们总是想法设法的将其打发掉,可时间本来就在流逝,何须我们来进行打发呢?我们生来都是有此惰性的,可是,只要我们能又一次鼓起勇气克服了它,接下去便会顺顺当当,并在活动中获得真正的愉快。”很多时候,我们实际上是知道自己哪些地方做的不好的,可世界最容易寻找且取之不尽的就是“借口”,是么?晚上,我下定决心要享受日出,到了早晨却起不来床;白天,我希望能欣赏月色,天黑了又待在房中出不去。我闹不明白,我干嘛起身,干嘛就寝。” 何尝不是这样,再刷会儿手机吧,等一会儿再来,我要早起明天,今年我要减肥等等,当下的我们有时候是不是也是这种状态?

       “大大小小的学究们一致断定,小孩儿是不知何所欲求的;岂止小孩儿,成人们还不是在地球上东奔西闯,同样不清楚自己打哪儿来,往哪儿去,同样干起事来漫无目的,同样受着饼干,蛋糕和桦木鞭子的支配”,两千多年前柏拉图就抛出了这人生三问,可又有多少人深入的发自内心的思考过呢?这与大脑更加偏爱轻松简单的方法有一定的关系,无目的,散漫,随波逐流总是更加的轻松自在;你信上说,我母亲希望看见我有所作为。这使我感到好笑。难道我眼下不是在做事吗?归根到底,不管我是摘豌豆还是摘扁豆,不都一样吗?世界上的一切事情,说穿了全都无聊。一个人要是没有热情,没有需要,仅仅为了他人的缘故去逐利追名,苦苦折腾,这个人便是傻瓜。”让自己忙起来,从早忙到晚,不花时间思考似乎也就没有烦恼,但实际上真的是这样么?

        基于我们当前的学识和状态,我们总是会有“那儿好好,我要能去看看该多好”这样的想法真美啊,我能来到这儿的小丘上,眺望那道美丽的峡谷,那周围的景物竟是如此地吸引着我。那儿有一座小小的树林!–你要能到林荫中去有多好!那儿有一座高高的山峰!–你要能从峰顶俯瞰辽阔的原野有多好!那儿有连绵的丘陵,幽静的沟壑!–你要能徜徉其间,流连忘返有多好!”,可当有一天,当我们真的赶上去,当那儿成了这儿,当未来的一切仍一如既往,唉!我们就发现自己仍然平庸,仍然浅陋;我们的灵魂仍然焦渴难当,切盼着吸吮那已经流走了的甘霖。这样,浪迹天涯的游子最终又会思恋故土,并在自己的茅屋内,在妻子的怀抱里,在儿女们的簇拥下,在为维持生计的忙碌操劳中,找到他在广大的世界上不曾寻得的欢乐。”何其现实,如此的一针见血。

    “唉,我知道的东西谁都可以知道;而我的心却为我所独有”,所谓“千金易得,知己难寻”,大千世界的人总是因为这样那样的原因接近你,当得到自己想要的东西之后又忽然消失的无影无踪,但维特需要的是心之神交,但在当时的社会环境下就更难找到了,《维特》同时也有着异常强烈的时代精神,书中所提出的问题具有时代的普遍意义:欧洲当时正处于从封建制度向资本主义过渡的转折时期,经过文艺复兴,宗教改革和启蒙运动,新兴市民阶级已经觉醒,青年一代感情激荡,对于自己政治上的无权和社会上受歧视的地位深感不满。强烈渴望打破等级界限,建立符合自然的社会秩序和平等的人与人之间的关系。“ 我认为谁如果觉得自己有必要疏远所谓下等人以保持尊严,那他就跟一个因为怕失败而躲避敌人的懦夫一样可耻。” 开篇的时候维特帮忙把水放到使女的肩上的时候发出了这样的感慨;在自己任职期间到侯爵家中做客碰巧遇到聚会被排挤,封·B小姐的责怪等也可以看出当时社会等级的不平等。同时,就德国范围而言,《维特》乃是当时方兴未艾的“狂飙突进”运动最丰硕的果实。此运动深受卢梭的影响,追求“返归自然”,书中“自然”似乎也成了维特检验一切的准绳:他赞颂自然之美,亲近自然的人—天真的儿童和淳朴的村民,鄙视迂腐的贵族、虚伪的市民,主张艺术皈依自然,让天才自由发挥,不受束缚。因此维特发出了“只有自然,才是无穷丰富;只有自然,才能造就大艺术家” 的感慨,同时对于束缚,又做出了“朋友们啊!你们不是奇怪天才的巨流为什么难得激涨汹涌,奔腾澎湃,掀起使你们惊心动魄的狂涛吗?—亲爱的朋友,那是因为在这巨流的两边岸上,住着一些四平八稳的老爷,他们担心自己的庭园,花畦,花圃会被洪水冲毁,为了防范于未然,已及时地筑好堤,挖好沟了。”这样的比喻。

     中国有句俗语:“青年男子谁个不善钟情?妙龄女人谁个不善怀春?”少年的我们总是有这样的想法:“我喜欢ta,我就要和他永远在一起”,“爱ta,ta就是全部”,“爱就要付出一切”等等,因此书中的维特也有这样“自此,日月星辰尽可以安安静静地升起又落下,我却再也分不清白天和黑夜,周围的整个世界会全给抛到了脑后”的心头小鹿乱撞,“好的,亲爱的绿蒂,我将一切照办,一切办妥;你只管多多给我任务吧,常常给我任务吧!可有一件,我求求你,以后千万别再往你写给我的字条上撒沙子。今天我一接着它就送到嘴上去吻,结果弄得牙齿里全嘎吱嘎吱的。”的欣喜无措,思念时“么空虚啊!我的胸口觉得可怕的的空虚!—我常常想,哪怕你能把她拥抱在心口一次,仅仅一次,这整个的空虚就会填满了”的无限空洞,又有“我具有再多精力,也会被对她的热情吞噬掉;我具有再多天赋,没有她一切都将化作乌有一时心乱如麻等等的描写,他们三个人的关系也让我一时想起了梁思成,林徽因,徐志摩的故事,爱一个人的时候,我们总会在心中勾勒出一副对方“极度完美,极度适合自己”的构想,从而不断给自己推波助澜,而冷静下来的林徽因明确的指出了徐志摩所勾勒出来的并不是真正的自己,因而最终拒绝了,这也如同绿蒂对维特的提醒“我担心,我害怕,仅仅是因为不可能实现,才使这个占有我的欲望对你如此有诱惑力的”,正如歌词“得不到的永远在骚动”中描述的那样,年少的我们总是一根经,认定了一件事即使明知前路茫茫,也要不撞南墙不回头,但这也是年轻的我们积累下来的经验和财富,有一天,男孩总会长大,但只要保留心中的那份美好,去寻找另外适合自己的那一个,这需要一个过程,也需要有人进行引导,正如龙应台在《儿子给我上的爱情课》中讲到的那样,刚开始坚信不疑老师的话,“你们可不要相信这种‘纯纯’的爱。事实上,爱情能持久多半是因为两人有一种‘互利’的基础。没有‘互利’的关系,爱情是不会持久的。”,并且分析的头头是道,但是在龙应台进一步的表示疑问的时候,他也疑惑了,“妈,可是我才17岁啊,好像不该知道那么多,还是应该相信一点什么吧”,男孩需要不断推翻重建自己的认知,慢慢的获得成长;最怕的是陷入死循环中不得自己,就如维特一般,“绿蒂啊,只要能为你死,为你献身,我就是幸福的!我愿勇敢地死,高高兴兴地死,只要我的死能给你的生活重新带来宁静,带来快乐。可是,唉,人世间只有很少高尚的人肯为自己的亲眷抛洒热血,以自己的死在他们的友朋中鼓动起新的、百倍的生之勇气。”觉着如此一死便能解决一切。

     “唉,我不过是个漂泊者,是个在地球上来去匆匆的过客!难道你们就不是吗?”维特发出了这样的感慨,既然在此间无法得到绿蒂,他就漂泊到另一个地方,在那里等着。

——摘抄:

·是的,好朋友,诚如你所说:人们要是不这么没完没了地运用想象力去唤起昔日痛苦的回忆--上帝才知道为什么把人造成这个样子--而是多考虑考虑如何挨过眼前的话,人间的痛苦本来就会少一些的;
·我再次发现误解与成见,往往会在世界上铸成比诡诈与恶意更多的过错。
·我认为谁如果觉得自己有必要疏远所谓下等人以保持尊严,那他就跟一个因为怕失败而躲避敌人的懦夫一样可耻。
·你要是问这儿的人怎么样,我只能回答:跟到处的人一样!人类嘛都是一个模子铸出来的。多数人为了生活,不得不忙忙碌碌,花去大部分的时间;剩下一点点余暇确使他们泛起愁来,非想法设法打发掉不可,这就是人类的命运啊。(这与当下的与自己独处极其类似)
·大大小小的学究们一致断定,小孩儿是不知何所欲求的;岂止小孩儿,成人们还不是在地球上东奔西闯,同样不清楚自己打哪儿来,往哪儿去,同样干起事来漫无目的,同样受着饼干,蛋糕和桦木鞭子的支配。这个道理谁都不肯相信,但我想却是显而易见的。
·谁要虚怀若谷,正视这一切将会有怎样的结果;谁要能看见每一个殷实市民如何循规蹈矩,善于将自己的小小花园变成天国,而不幸者也甘负重荷,继续气喘吁吁地行进在人生的道路上,而且人人同样渴望多见一分钟阳光·是的,谁能认识到和看到这些,他也会心安理得,自己为自己创造一个世界,并且为生而为人感到幸福,这样,他尽管处处受着限制,内心却永远怀着甜滋滋的自由感觉,因为只要他愿意,他随时可以离开这座监狱。
·只有自然,才是无穷丰富;只有自然,才能造就大艺术家。
·朋友们啊!你们不是奇怪天才的巨流为什么难得激涨汹涌,奔腾澎湃,掀起使你们惊心动魄的狂涛吗?—亲爱的朋友,那是因为在这巨流的两边岸上,住着一些四平八稳的老爷,他们担心自己的庭园,花畦,花圃会被洪水冲毁,为了防范于未然,已及时地筑好堤,挖好沟了。
·诗人要做的只是发现美好的事物,并大胆地表达出来。
·亲爱的威廉,对于人们心中那种想要自我扩张,想要发现新事物,想要四处走走,见见世面的欲望,我曾经考虑的很多很多,后来,对于他们的逆来顺受,循规蹈矩,对周围任何事情都漠不关心的本能,我又作了种种思索。  真美啊,我能来到这儿的小丘上,眺望那道美丽的峡谷,那周围的景物竟是如此地吸引着我。那儿有一座小小的树林!--你要能到林荫中去有多好!那儿有一座高高的山峰!--你要能从峰顶俯瞰辽阔的原野有多好!那儿有连绵的丘陵,幽静的沟壑!--你要能徜徉其间,流连忘返有多好!  我匆匆赶去,去而复返,却不曾找到我所希望的东西。呵,对远方的希冀犹如对未来的憧憬!它就像一个巨大的、朦胧的整体,静静地呈现在我们面前,我们的感觉却和我们的视觉一样,在它里边也变得迷茫模糊了;但我们仍然渴望着,哎!渴望着献出自己的整个生命,渴望着让那唯一的伟大而奇妙的感情来充溢自己的心。—可是,当我们真的赶上去,当那儿成了这儿,当未来的一切仍一如既往,唉!我们就发现自己仍然平庸,仍然浅陋;我们的灵魂仍然焦渴难当,切盼着吸吮那已经流走了的甘霖。这样,浪迹天涯的游子最终又会思恋故土,并在自己的茅屋内,在妻子的怀抱里,在儿女们的簇拥下,在为维持生计的忙碌操劳中,找到他在广大的世界上不曾寻得的欢乐。
·是的,威廉,在这个世界上离我的心最近的是孩子们,每当我从旁观察他们,从细小的事情中发现他们有朝一日所需要的种种品德与才能到萌芽,从他们今日的固执任性中看出将来的坚毅与刚强,从今日的顽皮放肆中看出将来的幽默乐观以及轻松愉快地应付人世危难的本领,每当我发现这一切还丝毫未经败坏、完整无损,我便一次一次地,反反复复地,吟味人类的导师的这句金言:“可叹呀,你们要是不能变成小孩子的样子!”然而他们,好朋友,这些我们的同类,这些本应被我们视为楷模的人,我们对待他们却像对奴隶,竟不允许他们有自己的意志!--我们难道没有自己的意志吗?我们凭什么该享受这个特权吗?—因为我年长一些,懂事一些!—天国中的仁慈上帝呵,你可是把人类仅仅分成年长的孩子和年幼的孩子的;至于你更喜欢哪一类孩子,你的圣子可早已有所宣示呀。然而人们尽管信奉他。却并不听他的话,—这也是个老问题---因而都在照着自己的模样教育自己的孩子······
·我平生最讨厌的莫过于人与人之间相互折磨了,尤其是生命力旺盛的青年,他们本该坦坦荡荡,乐乐呵呵,实际上却常常板起面孔,仅有的几天好时光也被彼此给糟蹋掉,等到日后省悟过来,却已追悔莫及。
·我们生来都是有此惰性的,可是,只要我们能又一次鼓起勇气克服了它,接下去便会顺顺当当,并在活动中获得真正的愉快。--------很多缺点都一样,我们知道,但又习惯性的选择屈服。
·你信上说,我母亲希望看见我有所作为。这使我感到好笑。难道我眼下不是在做事吗?归根到底,不管我是摘豌豆还是摘扁豆,不都一样吗?世界上的一切事情,说穿了全都无聊。一个人要是没有热情,没有需要,仅仅为了他人的缘故去逐利追名,苦苦折腾,这个人便是傻瓜。
·的确,我们生来就爱拿自己和其他人反反复复比较,所以,我们是幸福或是不幸,全取决于我们与之相比的是些什么人;所以,最大最大的危险,就莫过于孤身独处了,我们的脑子生就是朝上想的,加之受到诗里的幻境的激发,便常常臆造出一些地位无比优越于我们的人来,好像他们个个都比自己杰出,个个都比自己完美。而且这似乎理所当然。经常地,我们感到自己身上有这样那样的缺陷;在我们看来,我们所欠缺的,别人偏偏都有。不仅如此,我们还把自己所有的品质全加在他的身上,外搭着某种心满意足,这样,一个幸福的人就完成了,只不过是我们自己的创造而已; 反之,如果我们不顾自己的衰弱和吃力,只管一个劲儿往前赶,我们常常便会发现,我们虽然步履踉跄,不断迷路,却仍比其他又张帆又划桨的人走得远—而且,一旦你与其他人并驾齐驱,或者甚至超越了他们,你就会真正感觉自身的价值。
·谁是第一号人物呢?我认为是那个眼光超过常人,有足够的魄力和心计把别人的力量和热情全动员起来实现自己计划的人。
·晚上,我下定决心要享受日出,到了早晨却起不来床;白天,我希望能欣赏月色,天黑了又待在房中出不去。我闹不明白,我干嘛起身,干嘛就寝。
·再说,他之重视我的智慧和才气,也胜过重视我的心;殊不知我的心才是我唯一的骄傲,才是我的一切力量、一切幸福、一切痛苦以及一切一切的唯一源泉!唉,我知道的东西谁都可以知道;而我的心却为我所独有。
·唉,我不过是个漂泊者,是个在地球上来去匆匆的过客!难道你们就不是吗?

———对于绿蒂的描述

·自此,日月星辰尽可以安安静静地升起又落下,我却再也分不清白天和黑夜,周围的整个世界会全给抛到了脑后。
·“我将要见到她啦!”清晨我醒来,望着东升的旭日,兴高采烈地喊道,“我将要见到她啦!”除此我别无希求,一切的一切,全融汇在这个期待中了。
·好的,亲爱的绿蒂,我将一切照办,一切办妥;你只管多多给我任务吧,常常给我任务吧!可有一件,我求求你,以后千万别再往你写给我的字条上撒沙子。今天我一接着它就送到嘴上去吻,结果弄得牙齿里全嘎吱嘎吱的。
·我打算去哪儿?让我对你说实话吧。我不得不在此地再逗留十四天,然后准备考虑去参加X地的一些矿井;但参观矿井压根儿不算回事,目的还是想借此离绿蒂近一些,如此而已。我自己也不禁笑起自己这颗心来,但笑尽管笑,却仍然迁就了它。
·我有时真不能理解,怎么还有另一个人能够爱她,可以爱她;要知道我爱她爱的如此专一,如此深沉,如此毫无保留,除她以外,我就什么也不知道,什么也不了解,什么也没有了呵。
·多么空虚啊!我的胸口觉得可怕的的空虚!—我常常想,哪怕你能把她拥抱在心口一次,仅仅一次,这整个的空虚就会填满了。
·我具有再多精力,也会被对她的热情吞噬掉;我具有再多天赋,没有她一切都将化作乌有。
~绿蒂说的,”我担心,我害怕,仅仅是因为不可能实现,才使这个占有我的欲望对你如此有诱惑力的。“
·它们经过了你的手,你还擦去了上面的灰尘;我把它们吻了一遍又一遍,因为你曾接触过它们。绿蒂呵,我的天使,是你成全我实现自己的决心!是你,绿蒂,是你把枪交给了我;我曾经渴望从你手中接受死亡,如今我的心愿得以满足了!
·绿蒂啊,只要能为你死,为你献身,我就是幸福的!我愿勇敢地死,高高兴兴地死,只要我的死能给你的生活重新带来宁静,带来快乐。可是,唉,人世间只有很少高尚的人肯为自己的亲眷抛洒热血,以自己的死在他们的友朋中鼓动起新的、百倍的生之勇气。

Linux就该这样学—-笔记整理

第一章部署安装Linux;

--RPM有点像Windows系统中的控制面板,会建立统一的数据库文件,详细记录软件信息并能够自动分析依赖关系。
----Linux操作系统的开机过程是这样的,即从BIOS开始,然后进入Boot Loader,再加载系统内核,然后内核进行初始化,最后启动初始化进程。systemd初始化进程服务采用了并发启动机制,开机速度得到了不小的提升。
-----Linux系统在启动时要进行大量的初始化工作,比如挂载文件系统和交换分区、启动各类进程服务等,这些都可以看作是一个一个的单元(Unit),systemd用目标(target)代替了System V init中运行级别的概念
-----如果想要将系统默认的运行目标修改为“多用户,无图形”模式,可直接用ln命令把多用户模式目标文件连接到/etc/systemd/system/目录:
ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target

第二章:

-----计算机硬件是由运算器、控制器、存储器、输入/输出设备等共同组成的,而让各种硬件设备各司其职且又能协同运行的东西就是系统内核。Linux系统的内核负责完成对硬件资源的分配、调度等管理任务。
Linux系统中时刻运行着许多进程,如果能够合理地管理它们,则可以优化系统的性能。在Linux系统中,有5种常见的进程状态,分别为运行、中断、不可中断、僵死与停止,其各自含义如下所示。
R(运行):进程正在运行或在运行队列中等待。
S(中断):进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该   状态。
D(不可中断):进程不响应系统异步信号,即便用kill命令也不能将其中断。
Z(僵死):进程已经终止,但进程描述符依然存在, 直到父进程调用wait4()系统函数后将进程释放。
T(停止):进程收到停止信号后停止运行。

-----pidof命令,用于查询某个指定服务进程的PID值;
-----last,这些信息都是以日志文件的形式保存在系统中
-----ls -l “-l”参数可以查看文件的属性、大小等详细信息。
-----看行号的时候,cat命令后面追加一个-n参数:
-----“tr [原始字符] [目标字符]” 某个文本内容中的英文全部替换为大写,cat anaconda-ks.cfg | tr [a-z] [A-Z]
-----wc命令:
-l  只显示行数
-w  只显示单词数
-c  只显示字节数
-----diff命令用于比较多个文本文件的差异,格式为“diff [参数] 文件”。在使用diff命令时,不仅可以使用--brief参数来确认两个文件是否不同,还可以使用-c参数来详细比较出多个文件的差异之处,这绝对是判断文件是否被篡改的有力神器。
------对touch命令来讲,有难度的操作主要是体现在设置文件内容的修改时间(mtime)、文件权限或属性的更改时间(ctime)与文件的读取时间(atime)上面。                touch命令的参数及其作用
-a  仅修改“读取时间”(atime)
-m  仅修改“修改时间”(mtime)
-d  同时修改atime与mtime
接下来,我们先使用ls命令查看一个文件的修改时间,然后修改这个文件,最后再通过touch命令把修改后的文件时间设置成修改之前的时间(很多黑客就是这样做的呢):
[root@linuxprobe ~]# ls -l anaconda-ks.cfg
-rw-------. 1 root root 1213 May  4 15:44 anaconda-ks.cfg
[root@linuxprobe ~]# echo "Visit the LinuxProbe.com to learn linux skills" >> anaconda-ks.cfg
[root@linuxprobe ~]# ls -l anaconda-ks.cfg
-rw-------. 1 root root 1260 Aug  2 01:26 anaconda-ks.cfg
[root@linuxprobe ~]# touch -d "2017-05-04 15:44" anaconda-ks.cfg
[root@linuxprobe ~]# ls -l anaconda-ks.cfg
-rw-------. 1 root root 1260 May  4 15:44 anaconda-ks.cfg
-------Linux系统中有一个名为/dev/zero的设备文件,因为这个文件不会占用系统存储空间,但却可以提供无穷无尽的数据,因此可以使用它作为dd命令的输入文件,来生成一个指定大小的文件。dd命令的参数及其作用如表2-13所示。
dd命令的参数及其作用
if       输入的文件名称
of       输出的文件名称
bs       设置每个“块”的大小
count    设置要复制“块”的个数
dd if=/dev/zero of=560_file count=1 bs=560M
如果您想把光驱设备中的光盘制作成iso格式的镜像文件,在Windows系统中需要借助于第三方软件才能做到,但在Linux系统中可以直接使用dd命令来压制出光盘镜像文件,将它变成一个可立即使用的iso镜像:dd if=/dev/cdrom of=RHEL-server-7.0-x86_64-LinuxProbe.Com.iso
-------file命令用于查看文件的类型,格式为“file 文件名”
------如果要在整个系统中搜索权限中包括SUID权限的所有文件(详见第5章),只需使用-4000即可:
[root@linuxprobe ~]# find / -perm -4000 -print

第三章

命令 < 文件           将文件作为命令的标准输入
命令 << 分界符         从标准输入中读入,直到遇见分界符才停止
命令 < 文件1 > 文件2   将文件1作为命令的标准输入并将标准输出到文件2
----通配符就是通用的匹配信息的符号,比如星号(*)代表匹配零个或多个字符,问号(?)代表匹配单个字符,中括号内加上数字[0-9]代表匹配0~9之间的单个数字的字符,而中括号内加上字母[abc]则是代表匹配a、b、c三个字符中的任意一个字符。
----单引号保持字符属性,双引号会进行变量切换;

第四章

---vim, n显示搜索命令定位到的下一个字符串,N是上一个;u撤销上一步操作;
---例如$0对应的是当前Shell脚本程序的名称,$#对应的是总共有几个参数,$*对应的是所有位置的参数值,$?对应的是显示上一次命令的执行返回值,而$1、$2、$3……则分别对应着第N个位置的参数值,
---[]条件表达式,作用
-d  测试文件是否为目录类型
-e  测试文件是否存在
-f  判断是否为一般文件
-r  测试当前用户是否有权限读取
-w  测试当前用户是否有权限写入
-x  测试当前用户是否有权限执行


---SGID主要实现如下两种功能:
让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);
在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。
部门内的任何人员在里面创建的任何文件都会归属于该目录的所属组,而不再是自己的基本用户组。此时,我们用到的就是SGID的第二个功能,即在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。
[root@linuxprobe ~]# cd /tmp
[root@linuxprobe tmp]# mkdir testdir
[root@linuxprobe tmp]# ls -ald testdir/
drwxr-xr-x. 2 root root 6 Feb 11 11:50 testdir/
[root@linuxprobe tmp]# chmod -Rf 777 testdir/    确保普通用户可以写;
[root@linuxprobe tmp]# chmod -Rf g+s testdir/
[root@linuxprobe tmp]# ls -ald testdir/
drwxrwsrwx. 2 root root 6 Feb 11 11:50 testdir/
-----chmod和chown命令是用于修改文件属性和权限的最常用命令,它们还有一个特别的共性,就是针对目录进行操作时需要加上大写参数-R来表示递归操作,即对目录内所有的文件进行整体操作。

----SBIT特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。当目录被设置SBIT特殊权限位后,文件的其他人权限部分的x执行权限就会被替换成t或者T,原本有x执行权限则会写成t,原本没有x执行权限则会被写成T。

-----隐藏属性:
chattr命令用于设置文件的隐藏权限,格式为“chattr [参数] 文件”。如果想要把某个隐藏功能添加到文件上,则需要在命令后面追加“+参数”,如果想要把某个隐藏功能移出文件,则需要追加“-参数”。chattr命令中可供选择的隐藏权限参数非常丰富,具体如表5-6所示。
表5-6                                  chattr命令中用于隐藏权限的参数及其作用
参数
作用
i
无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件
a
仅允许补充(追加)内容,无法覆盖/删除内容(Append Only)
S
文件内容在变更后立即同步到硬盘(sync)
s
彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域)
A
不再修改这个文件或目录的最后访问时间(atime)
b
不再修改文件或目录的存取时间
D
检查压缩文件中的错误
d
使用dump命令备份时忽略本文件/目录
c
默认将文件或目录进行压缩
u
当删除该文件后依然保留其在硬盘中的数据,方便日后恢复
t
让文件系统支持尾部合并(tail-merging)
x
可以直接访问压缩文件中的内容
-----lsattr命令用于显示文件的隐藏权限,格式为“lsattr [参数] 文件”。

----文件访问控制权限:
如果希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)了。通俗来讲,基于普通文件或目录设置ACL其实就是针对指定的用户或用户组设置文件或目录的操作权限。另外,如果针对某个目录设置了ACL,则目录中的文件会继承其ACL;若针对文件设置了ACL,则文件不再继承其所在目录的ACL。
-----针对目录文件需要使用-R递归参数;针对普通文件则使用-m参数;如果想要删除某个文件的ACL,则可以使用-b参数。
setfacl -Rm u:linuxprobe:rwx /root
getfacl命令用于显示文件上设置的ACL信息,格式为“getfacl 文件名称”。


-----su命令与用户名之间有一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。强烈建议在切换用户身份时添加这个减号(-)。
只有root管理员才可以使用visudo命令编辑sudo服务的配置文件。
在sudo命令的配置文件中,按照下面的格式将第99行(大约)填写上指定的信息:
谁可以使用  允许使用的主机=(以谁的身份)  可执行命令的列表
[root@linuxprobe ~]# visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=(ALL) ALL

第六章:

---系统内核中的udev设备管理器会自动把硬件名称规范起来,目的是让用户通过设备文件的名字可以猜出设备大致的属性以及分区信息等;
-----一般的硬盘设备都会是以“/dev/sd”开头的。而一台主机上可以有多块硬盘,因此系统采用a~p来代表16块不同的硬盘(默认从a开始分配),而且硬盘的分区编号也很有讲究:
主分区或扩展分区的编号从1开始,到4结束;逻辑分区从编号5开始。
----/dev目录中sda设备之所以是a,并不是由插槽决定的,而是由系统内核的识别顺序来决定的,而恰巧很多主板的插槽顺序就是系统内核的识别顺序,因此才会被命名为/dev/sda。
-----sda3只能表示是编号为3的分区,而不能判断sda设备上已经存在了3个分区。
-----/dev/sd5的意思是/dev/目录中保存的应当是硬件设备文件;其次,sd表示是存储设备;然后,a表示系统中同类接口中第一个被识别到的设备,最后,5表示这个设备是一个逻辑分区。一言以蔽之,“/dev/sda5”表示的就是“这是系统中第一块被识别到的硬件设备中分区编号为5的逻辑分区的设备文件”。
---硬盘设备是由大量的扇区组成的,每个扇区的容量为512字节。其中第一个扇区最重要,它里面保存着主引导记录与分区表信息。就第一个扇区来讲,主引导记录需要占用446字节,分区表为64字节,结束符占用2字节;其中分区表中每记录一个分区信息就需要16字节,这样一来最多只有4个分区信息可以写到第一个扇区中,这4个分区就是4个主分区。
-----为了解决分区个数不够的问题,可以将第一个扇区的分区表中16字节(原本要写入主分区信息)的空间(称之为扩展分区)拿出来指向另外一个分区。也就是说,扩展分区其实并不是一个真正的分区,而更像是一个占用16字节分区表空间的指针—一个指向另外一个分区的指针。这样一来,用户一般会选择使用3个主分区加1个扩展分区的方法,然后在扩展分区中创建出数个逻辑分区,从而来满足多分区(大于4个)的需求。
-----XFS:是一种高性能的日志文件系统,而且是RHEL 7中默认的文件管理系统,它的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费极低的计算和存储性能。并且它最大可支持的存储容量为18EB,
-----拿到了一块新的硬盘存储设备后,也需要先分区,然后再格式化文件系统,最后才能挂载并正常使用
-----Linux只是把每个文件的权限与属性记录在inode中,而且每个文件占用一个独立的inode表格,该表格的大小默认为128字节,里面记录着如下信息:
该文件的访问权限(read、write、execute);
该文件的所有者与所属组(owner、group);
该文件的大小(size);
该文件的创建或内容修改时间(ctime);
该文件的最后一次访问时间(atime);
该文件的修改时间(mtime);
文件的特殊权限(SUID、SGID、SBIT);
该文件的真实数据地址(point)。
而文件的实际内容则保存在block块中(大小可以是1KB、2KB或4KB),一个inode的默认大小仅为128B(Ext3),记录一个block则消耗4B。当文件的inode被写满后,Linux系统会自动分配出一个block块,专门用于像inode那样记录其他block块的信息,这样把各个block块的内容串到一起,就能够让用户读到完整的文件内容了。对于存储文件内容的block块,有下面两种常见情况(以4KB的block大小为例进行说明)。

-----Linux有众多的文件系统,但我们平时操作的时候都不用关心,这是因为“计算机系统在发展过程中产生了众多的文件系统,为了使用户在读取或写入文件时不用关心底层的硬盘结构,Linux内核中的软件层为用户程序提供了一个VFS(Virtual File System,虚拟文件系统)接口,这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作了。”
----------https://www.cnblogs.com/xiexj/p/7214502.html
------linux文件存储:
文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。
文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。
----iNode大小:
inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。这也决定了硬链接不能跨越文件系统;
每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。
查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令。df -i
-----iNode号码:每个inode都有一个号码,操作系统用inode号码来识别不同的文件。
这里值得重复一遍,Unix/linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。
表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。
使用ls -i命令,可以看到文件名对应的inode号码:

----Unix/Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。
目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。

---软硬链接:但是,Unix/Linux系统允许,多个文件名指向同一个inode号码。
这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hard link)。node信息中有一项叫做"链接数",记录指向该inode的文件名总数,这时就会增加1。
反过来,删除一个文件名,就会使得inode节点中的"链接数"减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。testfile的inode count增加了一个。而且testfile和testfile.hard这两个的Inode number是一样的。这个硬链接就是重新创建了一个文件名对应到原文件的Inode。实质就是在Directory中增加了一个新的对应关系。通过这个例子,你是不是更清楚了,这个Inode count的含义了。他就是指,一个Inode对应了多少个文件名。

--文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。
-----注意事项:
硬链接不能对目录进行创建,只能对文件创建硬链接

----删除文件
他实质上就是减少link count,当link count为0时,就表示这个Inode可以使用,并把Block标记为可以写,但并没有清除Block里面数据,除非是有新的数据需要用到这个block。

-----当用户需要使用硬盘设备或分区中的数据时,需要先将其与一个已存在的目录文件进行关联,而这个关联动作就是“挂载”。
-----对于比较新的Linux系统来讲,一般不需要使用-t参数来指定文件系统的类型,Linux系统会自动进行判断。而mount 中的-a参数则厉害了,它会在执行后自动检查/etc/fstab文件中有无疏漏被挂载的设备文件,如果有,则进行自动挂载操作。
-----如果想让硬件设备和目录永久地进行自动关联,就必须把挂载信息按照指定的填写格式“设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检”(各字段的意义见表6-4)写入到/etc/fstab文件中。
字段的意义
设备文件  :一般为设备的路径+设备名称,也可以写唯一识别码(UUID,Universally Unique Identifier)
挂载目录  :指定要挂载到的目录,需在挂载前创建好
格式类型  :指定文件系统的格式,比如Ext3、Ext4、XFS、SWAP、iso9660(此为光盘设备)等
权限选项  :若设置为defaults,则默认权限为:rw, suid, dev, exec, auto, nouser, async
是否备份  :若为1则开机后使用dump进行磁盘备份,为0则不备份
是否自检  :若为1则开机后自动进行磁盘自检,为0则不自检
-----umount命令用于撤销已经挂载的设备文件,格式为“umount [挂载点/设备文件]”。

------在Linux系统中,管理硬盘设备最常用的方法就当属fdisk命令了。fdisk命令用于管理磁盘分区,格式为“fdisk  [磁盘名称]”,它提供了集添加、删除、转换分区等功能于一身的“一站式分区服务”。
------输入partprobe命令手动将分区信息同步到内核,而且一般推荐连续两次执行该命令,效果会更好。
------mkfs命令很贴心地把常用的文件系统名称用后缀的方式保存成了多个命令文件,用起来也非常简单—mkfs.文件类型名称。例如要格式分区为XFS的文件系统,则命令应为mkfs.xfs /dev/sdb1。
-------du -sh /*命令来查看在Linux系统根目录下所有一级目录分别占用的空间大小
-------在生产环境中,交换分区的大小一般为真实物理内存的1.5~2倍
-------使用SWAP分区专用的格式化命令mkswap,使用swapon命令把准备好的SWAP分区设备正式挂载到系统中。我们可以使用free -m命令查看交换分区的大小变化
-------使用quota命令进行磁盘容量配额管理,从而限制用户的硬盘可用容量或所能创建的最大文件个数。quota命令还有软限制和硬限制的功能。
软限制:当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用。
硬限制:当达到硬限制时会提示用户,且强制终止用户的操作。
!!!!!!---存储设备却默认没有开启对quota的支持,此时需要手动编辑配置文件, 例如,/etc/fstab
UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults,uquota 1 2
-------xfs_quota命令是一个专门针对XFS文件系统来管理quota磁盘容量配额服务而设计的命令,格式为“xfs_quota [参数] 配额 文件系统”。其中,-c参数用于以参数的形式设置要执行的命令;-x参数是专家模式,让运维人员能够对quota服务进行更多复杂的配置。
-------edquota命令用于编辑用户的quota配额限制,格式为“edquota [参数] [用户] ”。在为用户设置了quota磁盘容量配额限制后,可以使用edquota命令按需修改限额的数值。其中,-u参数表示要针对哪个用户进行设置;-g参数表示要针对哪个用户组进行设置。edquota命令会调用Vi或Vim编辑器来让root管理员修改要限制的具体细节。

--------在Linux系统中存在硬链接和软连接两种文件。
硬链接(hard link):可以将它理解为一个“指向原始文件inode的指针”,系统不为它分配独立的inode和文件。所以,硬链接文件与原始文件其实是同一个文件,只是名字不同。我们每添加一个硬链接,该文件的inode连接数就会增加1;而且只有当该文件的inode连接数为0时,才算彻底将它删除。换言之,由于硬链接实际上是指向原文件inode的指针,因此即便原始文件被删除,依然可以通过硬链接文件来访问。需要注意的是,由于技术的局限性,我们不能跨分区对目录文件进行链接。

软链接(也称为符号链接[symbolic link]):仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进行链接。但是,当原始文件被删除后,链接文件也将失效,从这一点上来说与Windows系统中的“快捷方式”具有一样的性质。

ln命令中可用的参数以及作用
-s   创建“符号链接”(如果不带-s参数,则默认创建硬链接)
-f   强制创建文件或目录的链接
-i   覆盖前先询问
-v   显示创建链接的过程

第七章:raid和lvm管理;

---RAID 0技术把多块物理硬盘设备(至少两块)通过硬件或软件的方式串联在一起,组成一个大的卷组,并将数据依次写入到各个物理硬盘中。这样一来,在最理想的状态下,硬盘设备的读写性能会提升数倍,但是若任意一块硬盘发生故障将导致整个系统的数据都受到破坏。
---RAID 1是把两块以上的硬盘设备进行绑定,在写入数据时,是将数据同时写入到多块硬盘设备上(可以将其视为数据的镜像或备份)。当其中某一块硬盘发生故障后,一般会立即自动以热交换的方式来恢复数据的正常使用。
---RAID5技术是把硬盘设备的数据奇偶校验信息保存到其他硬盘设备中。RAID 5磁盘阵列组中数据的奇偶校验信息并不是单独保存到某一块硬盘设备中,而是存储到除自身以外的其他每一块硬盘设备上,这样的好处是其中任何一设备损坏后不至于出现致命缺陷;
---RAID 10技术需要至少4块硬盘来组建,其中先分别两两制作成RAID 1磁盘阵列,以保证数据的安全性;然后再对两个RAID 1磁盘阵列实施RAID 0技术,进一步提高硬盘设备的读写速度。
----mdadm命令用于管理Linux系统中的软件RAID硬盘阵列,格式为“mdadm [模式] <RAID设备名称> [选项] [成员设备名称]”。
-C参数代表创建一个RAID阵列卡;-v参数显示创建的过程,同时在后面追加一个设备名称/dev/md0,这样/dev/md0就是创建后的RAID磁盘阵列的名称;-a yes参数代表自动创建设备文件;-n 4参数代表使用4块硬盘来部署这个RAID磁盘阵列;而-l 10参数则代表RAID 10方案;

======== mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
在格式化,创建挂载点即可;

——lvm:

-----物理卷处于LVM中的最底层,可以将其理解为物理硬盘、硬盘分区或者RAID磁盘阵列,这都可以。卷组建立在物理卷之上,一个卷组可以包含多个物理卷,而且在卷组创建之后也可以继续向其中添加新的物理卷。逻辑卷是用卷组中空闲的资源建立的,并且逻辑卷在建立后可以动态地扩展或缩小空间。这就是LVM的核心理念。

----新建物理卷:pvcreate /dev/sdb /dev/sdc
----加入卷组:vgcreate storage /dev/sdb /dev/sdc
----切割逻辑卷:lvcreate -n vo -l 37 storage
----格式化:mkfs.ext4 /dev/storage/vo
----挂载:mount /dev/storage/vo /linuxprobe

--------扩容实验:
lvextend -L 290M /dev/storage/vo
检查完整性:e2fsck -f /dev/storage/vo
重置硬盘容量:resize2fs /dev/storage/vo
重新挂载:mount -a

-------缩小实验:相较于扩容逻辑卷,在对逻辑卷进行缩容操作时,其丢失数据的风险更大。所以在生产环境中执行相应操作时,一定要提前备份好数据。另外Linux系统规定,在对LVM逻辑卷进行缩容操作之前,要先检查文件系统的完整性(当然这也是为了保证我们的数据安全)。在执行缩容操作前记得先把文件系统卸载掉。
检查完整性:e2fsck -f /dev/storage/vo
把逻辑卷vo的容量减小到120MB,先把文件系统缩小  resize2fs /dev/storage/vo 120M
缩小逻辑卷大小            lvreduce -L 120M /dev/storage/vo
重新挂载:mount -a


-----快照:快照卷的容量必须等同于逻辑卷的容量;快照卷仅一次有效,一旦执行还原操作后则会被立即自动删除。
---由于快照需要与逻辑卷大小相同,所以先查看逻辑卷大小:vgdisplay
-----使用-s参数生成一个快照卷,使用-L参数指定切割的大小。另外,还需要在命令后面写上是针对哪个逻辑卷执行的快照操作。
lvcreate -L 120M -s -n SNAP /dev/storage/vo

-----恢复,记得先卸载掉逻辑卷设备与目录的挂载
-----umount /linuxprobe
[root@linuxprobe ~]# lvconvert --merge /dev/storage/SNAP

第八章:防火墙:

---iptables与firewalld都不是真正的防火墙,它们都只是用来定义防火墙策略的防火墙管理工具而已,或者说,它们只是一种服务。iptables服务会把配置好的防火墙策略交由内核层面的netfilter网络过滤器来处理,而firewalld服务则是把配置好的防火墙策略交由内核层面的nftables包过滤框架来处理。
----iptables服务的术语中分别是ACCEPT(允许流量通过)、REJECT(拒绝流量通过)、LOG(记录日志信息)、DROP(拒绝流量通过)。“允许流量通过”和“记录日志信息”都比较好理解,这里需要着重讲解的是REJECT和DROP的不同点。就DROP来说,它是直接将流量丢弃而且不响应;REJECT则会在拒绝流量后再回复一条“您的信息已经收到,但是被扔掉了”信息,从而让流量发送方清晰地看到数据被拒绝的响应信息。

—–iptables相关;

防火墙策略规则的匹配顺序是从上至下的,因此要把较为严格、优先级较高的策略规则放到前面,以免发生错误。

—-Firewalls:

—–firewall-cmd是firewalld防火墙配置管理工具的CLI(命令行界面)版本,支持通过tab键进行命令补齐;

---firewalld配置的防火墙策略默认为运行时(Runtime)模式,又称为当前生效模式,而且随着系统的重启会失效。如果想让配置策略一直存在,就需要使用永久(Permanent)模式了,方法就是在用firewall-cmd命令正常设置防火墙策略时添加--permanent参数,这样配置的防火墙策略就可以永久生效了。但是,永久生效模式有一个“不近人情”的特点,就是使用它设置的策略只有在系统重启之后才能自动生效。如果想让配置的策略立即生效,需要手动执行firewall-cmd --reload命令。

—–常见的实验:

查看firewalld服务当前所使用的区域:
[root@linuxprobe ~]# firewall-cmd --get-default-zone
public
查询eno16777728网卡在firewalld服务中的区域:
[root@linuxprobe ~]# firewall-cmd --get-zone-of-interface=eno16777728
public
把firewalld服务中eno16777728网卡的默认区域修改为external,并在系统重启后生效。分别查看当前与永久模式下的区域名称:
[root@linuxprobe ~]# firewall-cmd --permanent --zone=external --change-interface=eno16777728
success
[root@linuxprobe ~]# firewall-cmd --get-zone-of-interface=eno16777728
public
[root@linuxprobe ~]# firewall-cmd --permanent --get-zone-of-interface=eno16777728
external
把firewalld服务的当前默认区域设置为public:
[root@linuxprobe ~]# firewall-cmd --set-default-zone=public
success
[root@linuxprobe ~]# firewall-cmd --get-default-zone
public
启动/关闭firewalld防火墙服务的应急状况模式,阻断一切网络连接(当远程控制服务器时请慎用):
[root@linuxprobe ~]# firewall-cmd --panic-on
success
[root@linuxprobe ~]# firewall-cmd --panic-off
success
查询public区域是否允许请求SSH和HTTPS协议的流量:
[root@linuxprobe ~]# firewall-cmd --zone=public --query-service=ssh
yes
[root@linuxprobe ~]# firewall-cmd --zone=public --query-service=https
no
把firewalld服务中请求HTTPS协议的流量设置为永久允许,并立即生效:
[root@linuxprobe ~]# firewall-cmd --zone=public --add-service=https
success
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-service=https
success
[root@linuxprobe ~]# firewall-cmd --reload
success
把firewalld服务中请求HTTP协议的流量设置为永久拒绝,并立即生效:
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --remove-service=http
success
[root@linuxprobe ~]# firewall-cmd --reload
success
把在firewalld服务中访问8080和8081端口的流量策略设置为允许,但仅限当前生效:
[root@linuxprobe ~]# firewall-cmd --zone=public --add-port=8080-8081/tcp
success
[root@linuxprobe ~]# firewall-cmd --zone=public --list-ports
8080-8081/tcp
把原本访问本机888端口的流量转发到22端口,要且求当前和长期均有效:
流量转发命令格式为firewall-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标IP地址>
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.10.10
success
[root@linuxprobe ~]# firewall-cmd --reload
success
在客户端使用ssh命令尝试访问192.168.10.10主机的888端口:
[root@client A ~]# ssh -p 888 192.168.10.10
The authenticity of host '[192.168.10.10]:888 ([192.168.10.10]:888)' can't be established.
ECDSA key fingerprint is b8:25:88:89:5c:05:b6:dd:ef:76:63:ff:1a:54:02:1a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.10.10]:888' (ECDSA) to the list of known hosts.
root@192.168.10.10's password:此处输入远程root管理员的密码
Last login: Sun Jul 19 21:43:48 2017 from 192.168.10.10
firewalld中的富规则表示更细致、更详细的防火墙策略配置,它可以针对系统服务、端口号、源地址和目标地址等诸多信息进行更有针对性的策略配置。它的优先级在所有的防火墙策略中也是最高的。比如,我们可以在firewalld服务中配置一条富规则,使其拒绝192.168.10.0/24网段的所有用户访问本机的ssh服务(22端口):
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.10.0/24" service name="ssh" reject"
success
[root@linuxprobe ~]# firewall-cmd --reload
success
在客户端使用ssh命令尝试访问192.168.10.10主机的ssh服务(22端口):
[root@client A ~]# ssh 192.168.10.10
Connecting to 192.168.10.10:22...
Could not connect to '192.168.10.10' (port 22): Connection failed.

—-图形化界面;

--使用firewall-config工具配置完防火墙策略之后,无须进行二次确认,因为只要有修改内容,它就自动进行保存。下面进行动手实践环节。
----尝试添加一条防火墙策略规则,使其放行访问8080~8088端口(TCP协议)的流量,并将其设置为永久生效,以达到系统重启后防火墙策略依然生效的目的。在按照图8-4所示的界面配置完毕之后,还需要在Options菜单中单击Reload Firewalld命令,让配置的防火墙策略立即生效(见图8-5)。这与在命令行中执行--reload参数的效果一样。

—-SNAT(Source Network Address Translation,源网络地址转换)技术。SNAT是一种为了解决IP地址匮乏而设计的技术,它可以使得多个内网中的用户通过同一个外网IP接入Internet。在图8-6所示的局域网中有多台PC,如果网关服务器没有应用SNAT技术,则互联网中的网站服务器在收到PC的请求数据包,并回送响应数据包时,将无法在网络中找到这个私有网络的IP地址,所以PC也就收不到响应数据包了。在图8-7所示的局域网中,由于网关服务器应用了SNAT技术,所以互联网中的网站服务器会将响应数据包发给网关服务器,再由后者转发给局域网中的PC。

—–使用iptables命令实现SNAT技术是一件很麻烦的事情,但是在firewall-config中却是小菜一碟了。用户只需按照图8-8进行配置,并选中Masquerade zone复选框,就自动开启了SNAT技术。

—-将本机888端口的流量转发到22端口,且要求当前和长期均有效,

—可以把网卡与防火墙策略区域进行绑定

——服务的访问控制列表

TCP Wrappers是RHEL 7系统中默认启用的一款流量监控程序,它能够根据来访主机的地址与本机的目标服务程序作出允许或拒绝的操作。换句话说,Linux系统中其实有两个层面的防火墙,第一种是前面讲到的基于TCP/IP协议的流量过滤工具,而TCP Wrappers服务则是能允许或禁止Linux系统提供服务的防火墙,从而在更高层面保护了Linux系统的安全运行。

TCP Wrappers服务的防火墙策略由两个控制列表文件所控制,用户可以编辑允许控制列表文件来放行对服务的请求流量,也可以编辑拒绝控制列表文件来阻止对服务的请求流量。控制列表文件修改后会立即生效,系统将会先检查允许控制列表文件(/etc/hosts.allow),如果匹配到相应的允许策略则放行流量;如果没有匹配,则去进一步匹配拒绝控制列表文件(/etc/hosts.deny),若找到匹配项则拒绝该流量。如果这两个文件全都没有匹配到,则默认放行流量。

—-配置原则:

在配置TCP Wrappers服务时需要遵循两个原则:
1. 编写拒绝策略规则时,填写的是服务名称,而非协议名称;
2. 建议先编写拒绝策略规则,再编写允许策略规则,以便直观地看到相应的效果。

—-SSH服务

----RHEL和CentOS系统默认使用NetworkManager来提供网络服务,这是一种动态管理网络配置的守护进程,能够让网络设备保持连接状态。可以使用nmcli命令来管理Network Manager服务。nmcli是一款基于命令行的网络配置工具
----NM_CONTROLLED参数实时生效,修改后无需重启网卡,一般关闭;

<span style="font-weight: bold;"–<–实验,配置两种场景,公司和家里使用不同的网路配置;

可以使用nmcli命令并按照“connection add con-name type ifname”的格式来创建网络会话。假设将公司网络中的网络会话称之为company,将家庭网络中的网络会话称之为house,现在依次创建各自的网络会话。

使用con-name参数指定公司所使用的网络会话名称company,然后依次用ifname参数指定本机的网卡名称(千万要以实际环境为准,不要照抄书上的eno16777736),用autoconnect no参数设置该网络会话默认不被自动激活,以及用ip4及gw4参数手动指定网络的IP地址:

[root@linuxprobe ~]# nmcli connection add con-name company ifname eno16777736 autoconnect no type ethernet ip4 192.168.10.10/24 gw4 192.168.10.1

Connection 'company' (86c71220-0057-419e-b615-38f4014cfdee) successfully added.

使用con-name参数指定家庭所使用的网络会话名称house。因为我们想从外部DHCP服务器自动获得IP地址,因此这里不需要进行手动指定。

[root@linuxprobe ~]# nmcli connection add con-name house type ethernet ifname eno16777736

Connection 'house' (44acf0a7-07e2-40b4-94ba-69ea973090fb) successfully added.

在成功创建网络会话后,可以使用nmcli命令查看创建的所有网络会话:

[root@linuxprobe ~]# nmcli connection show

NAME UUID TYPE DEVICE

house 44acf0a7-07e2-40b4-94ba-69ea973090fb 802-3-ethernet —

company 86c71220-0057-419e-b615-38f4014cfdee 802-3-ethernet —

eno16777736 ec77579b-2ced-481f-9c09-f562b321e268 802-3-ethernet eno16777736

使用nmcli命令配置过的网络会话是永久生效的,这样当我们下班回家后,顺手启用house网络会话,网卡就能自动通过DHCP获取到IP地址了。

[root@linuxprobe ~]# nmcli connection up house

Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)

—–bond网卡;前提条件,两个网卡的模式要一样;USERCTL=no为是否允许非root用户控制该网卡;

[root@linuxprobe ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno16777736

TYPE=Ethernet

BOOTPROTO=none

ONBOOT=yes

USERCTL=no

DEVICE=eno16777736

MASTER=bond0

SLAVE=yes

[root@linuxprobe ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno33554968

TYPE=Ethernet

BOOTPROTO=none

ONBOOT=yes

USERCTL=no

DEVICE=eno33554968

MASTER=bond0

SLAVE=yes

还需要将绑定后的设备命名为bond0并把IP地址等信息填写进去,这样当用户访问相应服务的时候,实际上就是由这两块网卡设备在共同提供服务。(系统默认启动networkmanager,实验过程中重启网卡以后发现bond IP是正确的,但是没有流量,关闭NM后重启网卡,成功,不是很清楚为什么NM_CONTROLLED=no参数为什么没有作用

[root@linuxprobe ~]# vim /etc/sysconfig/network-scripts/ifcfg-bond0

TYPE=Ethernet

BOOTPROTO=none

ONBOOT=yes

USERCTL=no

DEVICE=bond0

IPADDR=192.168.10.10

PREFIX=24

DNS=192.168.10.1

NM_CONTROLLED=no

让Linux内核支持网卡绑定驱动。常见的网卡绑定驱动有三种模式—mode0、mode1和mode6。下面以绑定两块网卡为例,讲解使用的情景。

mode0(平衡负载模式):平时两块网卡均工作,且自动备援,但需要在与服务器本地网卡相连的交换机设备上进行端口聚合来支持绑定技术。

mode1(自动备援模式):平时只有一块网卡工作,在它故障后自动替换为另外的网卡。

mode6(平衡负载模式):平时两块网卡均工作,且自动备援,无须交换机设备提供辅助支持。

用Vim文本编辑器创建一个用于网卡绑定的驱动文件,使得绑定后的bond0网卡设备能够支持绑定技术(bonding);同时定义网卡以mode6模式进行绑定,且出现故障时自动切换的时间为100毫秒。

[root@linuxprobe ~]# vim /etc/modprobe.d/bond.conf

alias bond0 bonding

options bond0 miimon=100 mode=6

第4步:重启网络服务后网卡绑定操作即可成功。正常情况下只有bond0网卡设备才会有IP地址等信息:

[root@linuxprobe ~]# systemctl restart network

###############sshd#####################

<span style="font-size: 12px; color: rgb(61, 68, 80); font-family: "Microsoft Yahei", Helvetica, Arial, sans-serif; font-variant-caps: normal; font-variant-ligatures: normal; line-height: 23px;"–<-常用参数

<span style="box-sizing: border-box; text-indent: 1em; font-size: 12px; letter-spacing: normal; orphans: 2; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; color: rgb(61, 68, 80); font-family: "Microsoft Yahei", Helvetica, Arial, sans-serif; font-variant-caps: normal; font-variant-ligatures: normal; line-height: 23px;"–<——安全密钥验证

----在客户端主机中生成“密钥对”。ssh-keygen
-----把客户端主机中生成的公钥文件传送至远程主机: ssh-copy-id 192.168.10.10
-----对服务器进行设置,使其只允许密钥验证,拒绝传统的口令验证方式。记得在修改配置文件后保存并重启sshd服务程序。vim /etc/ssh/sshd_config
PasswordAuthentication no

<span style="font-size: 9pt; color: rgb(61, 68, 80); font-family: "Microsoft Yahei";"–<–scp(secure copy)是一个基于SSH协议在网络之间进行安全传输的命令,其格式为“scp [参数] 本地文件 远程帐户@远程IP地址:远程目录”。两台服务器都必须为Linux系统;

<span style="box-sizing: border-box; text-indent: 1em; font-size: 12px; letter-spacing: normal; orphans: 2; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; color: rgb(61, 68, 80); font-family: "Microsoft Yahei", Helvetica, Arial, sans-serif; font-variant-caps: normal; font-variant-ligatures: normal; line-height: 23px;"–<–screen是一款能够实现多窗口远程控制的开源服务程序,简单来说就是为了解决网络异常中断或为了同时控制多个远程终端窗口而设计的程序。

会话恢复:即便网络中断,也可让会话随时恢复,确保用户不会失去对远程会话的控制。
多窗口:每个会话都是独立运行的,拥有各自独立的输入输出终端窗口,终端窗口内显示过的信息也将被分开隔离保存,以便下次使用时依然能看到之前的操作记录。
会话共享:当多个用户同时登录到远程服务器时,便可以使用会话共享功能让用户之间的输入输出信息共享。

----screen命令能做的事情非常多:可以用-S参数创建会话窗口;用-d参数将指定会话进行离线处理;用-r参数恢复指定会话;用-x参数一次性恢复所有的会话;用-ls参数显示当前已有的会话;以及用-wipe参数把目前无法使用的会话删除,等等。 screen -x 带上会话的名称,则可以同步对应会话的信息;

<span style="box-sizing: border-box; text-indent: 1em; font-size: 12px; letter-spacing: normal; orphans: 2; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; color: rgb(61, 68, 80); font-family: "Microsoft Yahei", Helvetica, Arial, sans-serif; font-variant-caps: normal; font-variant-ligatures: normal; line-height: 23px;"–<———10,静态网站;—————–

-----我们平时访问的网站服务就是Web网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务。
-----目前能够提供Web网络服务的程序有IIS、Nginx和Apache等。其中,IIS(Internet Information Services,互联网信息服务)是Windows系统中默认的Web服务程序,这是一款图形化的网站管理工具,不仅可以提供Web网站服务,还可以提供FTP、NMTP、SMTP等服务。
----区域配置参数则是单独针对于每个独立的子站点进行设置的

<span style="box-sizing: border-box; text-indent: 1em; font-size: 12px; letter-spacing: normal; orphans: 2; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; color: rgb(61, 68, 80); font-family: "Microsoft Yahei", Helvetica, Arial, sans-serif; font-variant-caps: normal; font-variant-ligatures: normal; line-height: 23px;"–<———配置参数:

<span style="font-size: 9pt; color: rgb(61, 68, 80); font-family: "Microsoft Yahei"; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: bold; line-height: 23px;"–<–按理来说,只有在网站的首页面文件不存在或者用户权限不足时,才显示httpd服务程序的默认首页面。

<span style="box-sizing: border-box; text-indent: 1em; font-size: 12px; letter-spacing: normal; orphans: 2; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; color: rgb(61, 68, 80); font-family: "Microsoft Yahei", Helvetica, Arial, sans-serif; font-variant-caps: normal; font-variant-ligatures: normal; line-height: 23px;"–<—selinux安全子系统:

-----RHEL 7系统使用SELinux技术的目的是为了让各个服务进程都受到约束,使其仅获取到本应获取的资源。
-----所有文件无法访问数据库远程连接报错等都和selinux相关;它能够从多方面监控违法行为:对服务程序的功能进行限制(SELinux域限制可以确保服务程序做不了出格的事情);对文件资源的访问限制(SELinux安全上下文确保文件资源只能被其所属的服务程序进行访问)。
例如:/home目录是用来存放普通用户的家目录数据的,而现在,httpd提供的网站服务却要去获取普通用户家目录中的数据了,这显然违反了SELinux的监管原则。
ls -Z 查看上下文信息,就是文件的Selinux信息,可以理解为用户对该文件(夹)的权限;
----在文件上设置的SELinux安全上下文是由用户段、角色段以及类型段等多个信息项共同组成的。其中,用户段system_u代表系统进程的身份,角色段object_r代表文件目录的角色,类型段httpd_sys_content_t代表网站服务的系统文件。

SELinux服务有三种配置模式,具体如下。

enforcing:强制启用安全策略模式,将拦截服务的不合法请求。

permissive:遇到服务越权访问时,只发出警告而不强制拦截。

disabled:对于越权的行为不警告也不拦截。

<span style="font-size: 12px; color: rgb(61, 68, 80); font-family: "Microsoft Yahei", Helvetica, Arial, sans-serif; font-variant-caps: normal; font-variant-ligatures: normal; line-height: 23px;"–<–管理命令:semanage命令用于管理SELinux的策略,格式为“semanage [选项] [文件]”。

-l参数用于查询;

-a参数用于添加;

-m参数用于修改;

-d参数用于删除。

例如,可以向新的网站数据目录中新添加一条SELinux安全上下文,让这个目录以及里面的所有文件能够被httpd服务程序所访问到:
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/*
注意,执行上述设置之后,还无法立即访问网站,还需要使用restorecon命令将设置好的SELinux安全上下文立即生效。在使用restorecon命令时,可以加上-Rv参数对指定的目录进行递归操作,以及显示SELinux安全上下文的修改过程。最后,再次刷新页面,就可以正常看到网页内容了,结果如图10-8所示。
[root@linuxprobe ~]# restorecon -Rv /home/wwwroot/

安装论坛的时候出现过一个问题,将目录和权限赋予Apache用户,但是仍然显示没有权限,wp博客已经赋予了数据库权限,仍无法连接;本地连接没有问题,通过Apache连接有问题;

###########配置个人用户主页功能:

<span style="box-sizing: border-box; text-indent: 1em; font-size: 12px; letter-spacing: normal; orphans: 2; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px;"–<-配置文件:/etc/httpd/conf.d/userdir.conf  第17行的UserDir disabled参数前面加上井号(#),表示让httpd服务程序开启个人用户主页功能;同时再把第24行的UserDir public_html参数前面的井号(#)去掉(UserDir参数表示网站数据在用户家目录中的保存目录名称,即public_html目录)。修改目录权限755,重启服务;

<span style="font-size: 9pt;"–<-接下来使用getsebool命令查询并过滤出所有与HTTP协议相关的安全策略。其中,off为禁止状态,on为允许状态。getsebool -a | grep http

<span style="font-size: 9pt;"–<–setsebool命令后面加上-P参数,让修改后的SELinux策略规则永久生效且立即生效

<span style="font-size: 9pt;"–<—Apache的虚拟主机功能是服务器基于用户请求的不同IP地址、主机域名或端口号,实现提供多个网站同时为外部提供访问服务的技术,如图10-12所示,用户请求的资源不同,最终获取到的网页内容也各不相同。

<span style="font-size: 9pt;"–<–Apache可以基于源主机名、源IP地址或源主机上的浏览器特征等信息对网站上的资源进行访问控制。它通过Allow指令允许某个主机访问服务器上的网站资源,通过Deny指令实现禁止访问。在允许或禁止访问网站资源时,还会用到Order指令,这个指令用来定义Allow或Deny指令起作用的顺序,其匹配原则是按照顺序进行匹配,若匹配成功则执行后面的默认指令。比如“Order Allow, Deny”表示先将源主机与允许规则进行匹配,若匹配成功则允许访问请求,反之则拒绝访问请求。

###########11章################

FTP服务器是按照FTP协议在互联网上提供文件存储和访问服务的主机,FTP客户端则是向服务器发送连接请求,以建立数据传输链路的主机。FTP协议有下面两种工作模式。

主动模式:FTP服务器主动向客户端发起连接请求。

被动模式:FTP服务器等待客户端发起连接请求(FTP的默认工作模式)。

PAM(可插拔认证模块)是一种认证机制,通过一些动态链接库和统一的API把系统提供的服务与认证方式分开,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式。要想把PAM功能和作用完全讲透,至少要一个章节的篇幅才可以(对该主题感兴趣的读者敬请关注本书的进阶篇,里面会详细讲解PAM)。

通俗来讲,PAM是一组安全机制的模块,系统管理员可以用来轻易地调整服务程序的认证方式,而不必对应用程序进行任何修改。PAM采取了分层设计(应用程序层、应用接口层、鉴别模块层)的思想,其结构如图11-2所示。

图11-2  PAM的分层设计结构

<span style="box-sizing: border-box; text-indent: 1em; font-size: 12px; letter-spacing: normal; orphans: 2; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); color: rgb(61, 68, 80); font-family: "Microsoft Yahei", Helvetica, Arial, sans-serif; font-variant-caps: normal; font-variant-ligatures: normal; line-height: 23px;"–<—-在RHEL 7系统中,TFTP服务是使用xinetd服务程序来管理的。xinetd服务可以用来管理多种轻量级的网络服务,而且具有强大的日志功能。简单来说,在安装TFTP软件包后,还需要在xinetd服务程序中将其开启,把默认的禁用(disable)参数修改为no:

Linux本地源制作

1.centos7本地yum源制作:

(1)test

[base]
name=CentOS-$releasever - base
baseurl=ftp://10.101.1.41/yum_repo
gpgcheck=0
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

(2) repoquery是yum扩展工具包yum-utils中的一个工具,所有如果你没有repoquery命令的话,可以先 sudo yum install yum-utils 安装yum-utils包。是为了加强和补充yum功能的工具,重点是查询包的关系。https://www.cnblogs.com/JMLiu/p/7692784.html

(3)指定路径:cachedir=/mnt/usb_disk/yum-repo

         开启缓存:Keepcache=1  //1缓存  0不缓存

(4)生成repodata目录,自动创建索引信息 ,否则会报错“failed to retrieve packages”https://www.cnblogs.com/hailun1987/p/9827329.html

createrepo -pdo /yum/yum-custom/ /yum/yum-custom/
yum clean all
yun makecache

(5)clean参数

clean命令的选项:
下面指定你的clean命令的运行方式。这里命令中的“所有文件”实际就是当前被激活的软件仓库中的所有文件。如果你临时想要清除其他非激活的软件仓库中的内容,那么使用 --enablerepo='*'选项。
yum clean expire-cache
当元数据和每个软件仓库中的镜像列表下载的时候,删除本地的数据。也就是说,yum将会为每一个软件仓库刷新缓存。下次会使用到。但是如果缓存的数据仍然有用,那么不会删除任何重要的数据。
yum clean packages
从系统中删除任何缓存的软件包。我们需要注意的是当我们下载软件包之后,软件包并不会被自动地删除。
yum clean headers
删除所的头文件,这些头文件用于yum解决软件的以来关系。
yum clean metadata
删除yum用于确定软件包可用的一些文件(元数据文件)。使用这个选项会强制让yum下次运行的时候下载所有的元数据。
yum clean dbcache
删除sqlite缓存,这个缓存用来以很快的速度访问原数据。使用这个选项将会使得yum在下次运行的时候重新创建缓存文件。
yum clean all
删除上面说过的所的内容。

##########遇到问题##############

1.配置好vsftd,然而匿名访问的目录却为空; –selinux导致的;

#########附录########

以下两个命令可以列出RPM包的依赖情况,
1 yum deplist pakcage
2 rpm -qR package

###########参考附录:

https://www.cnblogs.com/nidey/p/6200685.html

–挂载U盘: https://www.cnblogs.com/kerrycode/archive/2013/04/01/2993744.html

2.Debian9本地apt源制作:

(1)创建文件夹,并把deb文件复制到该目录下,例如

mkdir -p /opt/apt_pkgs
cp -r /var/cache/apt/archives/* /opt/apt_pkgs

(2)建立Packages.gz包,里面记录了packs文件夹下面的软件包信息,包括依赖信息。

dpkg-scanpackages apt_pkgs /dev/null |gzip > apt_pkgs/Packages.gz -r

(3)修改sources.list为本地源:

deb file:///opt/apt/ apt_pkgs/
(注意三根斜杠,最后包目录前有一个空格)

(4)更新源:

sudo apt-get update

(5)内网源:

–先查看下是否已经安装apache2:service apache2 status

ln -s /opt/apt/apt_pkgs /var/www/html/apt_pkgs
ln -s /opt/apt_pkgs /var/www/html/apt_pkgs

–访问测试:http://127.0.0.1/apt_pkgs

(6)客户端配置:

deb [arch=amd64] http://127.0.0.1/ apt_pkgs/   ##空格注意,和本地配置一样

##########参考########

https://blog.csdn.net/metallicqi/article/details/51147832

–内网源配置:https://blog.csdn.net/sinat_36544290/article/details/82153524

lvs+keepalived+nginx实战

################几个名词解释###############

名称
缩写
全拼
说明
VIP
虚拟IP
virtual ip address
VIP为Director用于向客户端计算机提供服务的IP地址,如:www.test.com域名就要解析到vip上提供服务
RIP
真实IP地址
Real Server Ip Address
在集群下面节点上使用的IP地址,物理IP地址
DIP
Director
Director IP Address
用于连接内外网络的IP地址,物理网卡上的IP地址,是负载均衡器上的IP
CIP
客户端主机地址
Client IP address
客户端用户计算机请求集群服务器的IP地址,该地址用作发送给集群的请求的源IP地址

2.关于ip_forward:

IP地址分为公有ip地址和私有ip地址,Public Address是由INIC(internet network information center)负责的,这些IP地址分配给了注册并向INIC提出申请的组织机构。Private Address属于非注册地址,专门为组织内部使用。Private Address是不可能直接用来跟WAN通信的,要么利用帧来通信(FRE帧中继,HDLC,PPP),要么需要路由的转发(nat)功能把私有地址转换为公有地址才行。出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功能。

首先内网主机向外网主机发送数据包,由于内网主机与外网主机不在同一网段,所以数据包暂时发往内网默认网关GIP处理,而本网段的主机对此数据包不做任何回应。由于内网主机的SIP是私有的,禁止在公网使用,所以必须将数据包的SIP修改成公网上的可用IP,这就是网关收到数据包之后首先要做的事情--IP地址转换。然后网关再把数据包发往外网主机。外网主机收到数据包之后,只认为这是网关发送的请求,并不知道内网主机的存在,更不知道源IP地址是SIP而不是FIP,也没必要知道,目的主机处理完请求,把回应信息发还给网关的FIP。网关收到后,将目的主机返回的数据包的目标IP即FIP修改为发出请求的内网主机的IP地址即SIP,并根据路由表将其发给内网主机。这就是网关的第二个工作--数据包的路由转发。内网主机只要查看数据包的DIP与发送请求的SIP相同,就会回应,这就完成了一次请求。

3.关于Linux Pam:https://www.cnblogs.com/hftian/p/6944133.html

--PAM 为了实现其插件功能和易用性,它采取了分层设计思想:让各鉴别模块从应用程序中独立出来,然后通过PAM API作为两者联系的纽带,这样应用程序就可以根据需要灵活地在其中"插入"所需鉴别功能模块,从而真正实现了"鉴别功能,随需应变"。
--PAM验证模块的配置文件,存放位置 /etc/security中,如pam_limits.so验证模块对应的配置文件limits.conf,pam_group.so验证模块对应的配置文件group.conf。
PAM验证模块和应用程序的对应关系,存放位置/etc/pam.d文件夹。通过修改此文件夹下的配置文件,可以为应用选定具体的验证模块
--要使/etc/security/limits.conf 文件配置生效,必须要确保 PAM验证模块pam_limits.so 文件被加入到启动文件中。查看 /etc/pam.d/login 文件中有:
session  required  /lib/security/pam_limits.so
--64位地址是:/lib64/security/pam_limits.so 否则本地即使输入正确密码也无法登陆。

配置文件格式:
语法:Service  model_type  control_flag  model_path  options
--Service :使用PAM验证模块的应用程序,如ftp、telnet、login等。其中other一行指本文件中没有单独列出的其他应用程序;
-----验证模块的类型,主要有以下几种 auth :鉴别类模块   account:账户类模块   session:会话类模块       password:口令类模块
--Control_flag:对模块验证成功或者失败的结果的处理情况
-----Required:该模块验证成功是用户通过鉴别的必要条件。只有当应用程序对应的所有带有required标记的模块全部成功后,该应用程序才能通过 鉴别。同时,如果任何带有         required标记的模块出现了错误,PAM并不立刻将错误信息返回给应用程序,而是在所有模块都调用完毕后,再将错误信息返回给调用它的应用程序。
-----Requisite:与required相似,只有带有此标记的模块返回成功后,用户才能通过鉴别,不同之处在于,一旦失败就不再执行堆中后面的其他模块,并且鉴别过程到此结束。----------Optiona: 即使该模块验证失败,用户仍能通过鉴别。在PAM体系中,带有该标记的模块失败后,将继续处理下一模块。
Limits文件限制用户进程解析
PAM验证模块/lib/security/pam_limits.so主要是限制用户会话过程中对各种系统资源的使用。其对应的配置文件/etc/security/limits.conf其格式为:
Domain  type item
用户名/组名软/硬限制 项目
Domain:指被限制的用户名或组
Soft:当前系统生效的设置值(soft限制不能比hard限制高)
-      :同时设置了soft和hard的值
data——最大数据大小(KB)
memlock——最大可用内存空间(KB)
nofile——最大可以打开的文件数量
stack——最大堆栈空间(KB)
nproc——最大运行进程数
maxlogins——用户可以登录到系统最多次数
环境变量文件/etc/profile的更改也是为了修改对当前用户的进程限制。
-n:设置内核可以同时打开的文件描述符的最大值。
-u:设置用户最多可开启的程序数目。
数据段长度:ulimit -d unlimited
最大内存大小:ulimit -m unlimited
堆栈大小:ulimit -s unlimited
CPU 时间:ulimit -t unlimited。
虚拟内存:ulimit -v unlimited

(4)ifconfig命令:

---BROADCAST,MULTICAST,UP,LOWER_UP > 是net_device flags,网络设备的状态标识。UP 表示网卡处于启动的状态;BROADCAST 表示这个网卡有广播地址,可以发送广播包;MULTICAST 表示网卡可以发送多播包;LOWER_UP 表示 L1 是启动的,即网线插着。MTU1500 最大传输单元 MTU 为 1500,这是以太网的默认值。
---网络包是层层封装的。MTU 是二层 MAC 层的概念。MAC 层有 MAC 的头,以太网规定连 MAC 头带正文合起来,不允许超过 1500 个字节。正文里面有 IP 的头、TCP 的头、HTTP 的头。如果放不下,就需要分片来传输。
---

#######################################################

1.ipvsadm安装:

(1)编译环境准备:

yum install libnl* libpopt* -y
yum install popt-static -y

(2)安装:

tar -zxvf ipvsadm-1.26.tar.gz
cd ipvsadm-1.26
make
make install

(3)使用:https://blog.csdn.net/scape1989/article/details/21085659

ipvsadm:
      1、管理集群服务
           添加:-A -t|u|f service-address [-sscheduler]
                      -t:tcp协议的集群服务
                      -u:udp协议的集群
                      -f:FWM:防火墙标记
           修改:-E
           删除:-D
                      -D -t|u|f service-address    
                   例如:# ipvsadm -A -t 172.16.100.1:80 -s rr
      2、管理集群服务中的RS
           添加:-a -t|u|f service-address -rserver-address [-g|i|m] [-w weight]
                      -t|u|f service-address:事先定义好的某集群服务
                      -r server-address:某RS的地址,在NAT模型中,可以使用IP:PORT事先端口映射
                      [-g|i|m]:LVS类型
                           -g:DR
                           -I:TUN
                           -m:NAT
                      [-w weight]:定义服务器权重
       3、修改:-e
       4、删除:-d -t|u|f service-address -r server-address
                   例如:#ipvsadm -a -t 172.16.100.1:80 -r192.168.10.8 -m
                   例如:#ipvsadm-a -t 172.16.100.1:80 -r 192.168.10.9 -m
       5、查看
                    -L|l[options]
                           -n:数字格式显示主机地址和端口号
                           --stats:统计信息
                           --rate:速率
                           --timeout:显示tcp、tcpfin和udp会话的超时时间值
                           --daemon
                           --sort:跟协议、地址、端口进行排序,默认为升序
                           -c:显示当前ipvs连接状况
       6、删除所有集群服务:
                    -C:清空ipvs规则
       7、保存规则
                    -S:(用输出重定向进行保存)
                    格式:#ipvsadm -s >/path/to/somefile
       8、载入此前的规则:
                    -R
                     格式:#ipvsadm -R </path/to/somefile

2.keepalived安装:至于启动哪一个,主要是依据优先级,然后才根据设定的主备关系进行;

(1)编译环境准备:

yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel libnl libnl-devel

(2)安装:

tar -zxvf keepalived-2.0.12.tar.gz
cd keepalived-2.0.12
./configure
make && make install
cp keepalived/etc/init.d/keepalived /etc/init.d/
cp /usr/local/etc/sysconfig/keepalived  /etc/sysconfig/
systemctl enable keepalived
mkdir  -p  /etc/keepalived
cp /usr/local/sbin/keepalived /usr/sbin/

(3)keepalived.conf配置文件:由于采用dr模式,所以前后端口必须一致;

–master_example

! Configuration File for keepalived
global_defs {
router_id LVS_01 //本服务器的名称
}
vrrp_instance VI_1 { //定义VRRP热备实例
state MASTER //热备状态,MASTER表示主服务器,BACKUP表示从服务器
interface ens33 //承载VIP地址的物理接口
virtual_router_id 51 //虚拟路由器的ID号,每个热备组保持一致
priority 110 //优先级,数值越大优先级越高
advert_int 1 //通告间隔秒数(心跳频率)
authentication { //热备认证信息,每个热备组保持一致
auth_type PASS //认证类型
auth_pass 6666 //密码字符串
}
virtual_ipaddress { //指定漂移地址(VIP),可以有多个
10.101.1.100
}
}
virtual_server 10.101.1.100 8888 { //虚拟服务器地址(VIP)、端口
delay_loop 6 //健康检查的间隔时间(秒)
lb_algo rr //轮询(rr)调度算法
lb_kind DR //直接路由(DR)群集工作模式
persistence_timeout 60 //连接保持时间(秒)
protocol TCP //应用服务器采用的是TCP协议
real_server 10.101.1.70 8888 { //第一个Web服务器节点的地址、端口
weight 1 //节点的权重
TCP_CHECK { //健康检查方式
connect_port 8888 //检查的目标端口
connect_timeout 3 //连接超时(秒)
nb_get_retry 3 //重试次数
delay_before_retry 3 //重试间隔
}
}
real_server 10.101.1.59 8888 { //第二个Web服务器节点的地址、端口
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

–master

! Configuration File for keepalived
global_defs {
router_id LVS_01
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass 6666
}
virtual_ipaddress {
10.101.1.100
}
}
virtual_server 10.101.1.100 8880 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 60
protocol TCP
real_server 10.101.1.59 8880 {
weight 1
TCP_CHECK {
connect_port 8880
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 10.101.1.187 8880 {
weight 1
TCP_CHECK {
connect_port 8880
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

–backup

! Configuration File for keepalived
global_defs {
router_id LVS_02
}
vrrp_instance VI_1 {
state BACKUP
interface em1
virtual_router_id 51
priority 105
advert_int 1
authentication {
auth_type PASS
auth_pass 6666
}
virtual_ipaddress {
10.101.1.100
}
}
virtual_server 10.101.1.100 8880 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 60
protocol TCP
real_server 10.101.1.59 8880 {
weight 1
TCP_CHECK {
connect_port 8880
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 10.101.1.187 8880 {
weight 1
TCP_CHECK {
connect_port 8880
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

(4)启动:systemctl start keepalived:

<span style="font-size: 9pt; color: rgb(51, 51, 51); font-family: Monaco;"–<日志:tail -f /var/log/messages:

Feb 13 05:50:32 jumpserver Keepalived[51727]: Starting Keepalived v2.0.12 (01/25,2019), git commit v2.0.11-47-gce6cf748+
Feb 13 05:50:32 jumpserver Keepalived[51727]: Running on Linux 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 (built for Linux 3.10.0)
Feb 13 05:50:32 jumpserver Keepalived[51727]: Command line: '/usr/local/sbin/keepalived' '-D'
Feb 13 05:50:32 jumpserver Keepalived[51727]: Opening file '/etc/keepalived/keepalived.conf'.
Feb 13 05:50:32 jumpserver Keepalived[51728]: Starting Healthcheck child process, pid=51729
Feb 13 05:50:32 jumpserver Keepalived[51728]: Starting VRRP child process, pid=51730
Feb 13 05:50:32 jumpserver systemd: Started LVS and VRRP High Availability Monitor.
Feb 13 05:50:32 jumpserver Keepalived_vrrp[51730]: Registering Kernel netlink reflector
Feb 13 05:50:32 jumpserver Keepalived_vrrp[51730]: Registering Kernel netlink command channel
Feb 13 05:50:32 jumpserver Keepalived_vrrp[51730]: Opening file '/etc/keepalived/keepalived.conf'.
Feb 13 05:50:32 jumpserver Keepalived_vrrp[51730]: Assigned address 10.101.1.70 for interface ens33
Feb 13 05:50:32 jumpserver Keepalived_vrrp[51730]: Assigned address fe80::a280:336:15f:676 for interface ens33
Feb 13 05:50:32 jumpserver Keepalived_vrrp[51730]: Registering gratuitous ARP shared channel
Feb 13 05:50:32 jumpserver Keepalived_vrrp[51730]: (VI_1) removing VIPs.
Feb 13 05:50:32 jumpserver Keepalived_vrrp[51730]: (VI_1) Entering BACKUP STATE (init)
Feb 13 05:50:32 jumpserver Keepalived_vrrp[51730]: VRRP sockpool: [ifindex(2), family(IPv4), proto(112), unicast(0), fd(11,12)]
Feb 13 05:50:32 jumpserver Keepalived_healthcheckers[51729]: Opening file '/etc/keepalived/keepalived.conf'.
Feb 13 05:50:32 jumpserver Keepalived_healthcheckers[51729]: (Line 30) Unknown keyword 'nb_get_retry'
Feb 13 05:50:32 jumpserver Keepalived_healthcheckers[51729]: (Line 39) Unknown keyword 'nb_get_retry'
Feb 13 05:50:32 jumpserver Keepalived_healthcheckers[51729]: Gained quorum 1+0=1 <= 2 for VS [10.101.1.100]:tcp:8880
Feb 13 05:50:32 jumpserver Keepalived_healthcheckers[51729]: Activating healthchecker for service [10.101.1.59]:tcp:8880 for VS [10.101.1.100]:tcp:8880
Feb 13 05:50:32 jumpserver Keepalived_healthcheckers[51729]: Activating healthchecker for service [10.101.1.187]:tcp:8880 for VS [10.101.1.100]:tcp:8880
Feb 13 05:50:36 jumpserver Keepalived_healthcheckers[51729]: TCP connection to [10.101.1.187]:tcp:8880 success.
Feb 13 05:50:36 jumpserver Keepalived_vrrp[51730]: (VI_1) Receive advertisement timeout
Feb 13 05:50:36 jumpserver Keepalived_vrrp[51730]: (VI_1) Entering MASTER STATE
Feb 13 05:50:36 jumpserver Keepalived_vrrp[51730]: (VI_1) setting VIPs.
Feb 13 05:50:36 jumpserver Keepalived_vrrp[51730]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 13 05:50:36 jumpserver Keepalived_vrrp[51730]: (VI_1) Sending/queueing gratuitous ARPs on ens33 for 10.101.1.100
Feb 13 05:50:36 jumpserver Keepalived_vrrp[51730]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 13 05:50:36 jumpserver Keepalived_vrrp[51730]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 13 05:50:36 jumpserver Keepalived_vrrp[51730]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 13 05:50:36 jumpserver Keepalived_vrrp[51730]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 13 05:50:38 jumpserver Keepalived_healthcheckers[51729]: TCP connection to [10.101.1.59]:tcp:8880 success.
Feb 13 05:50:41 jumpserver Keepalived_vrrp[51730]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 13 05:50:41 jumpserver Keepalived_vrrp[51730]: (VI_1) Sending/queueing gratuitous ARPs on ens33 for 10.101.1.100
Feb 13 05:50:41 jumpserver Keepalived_vrrp[51730]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 13 05:50:41 jumpserver Keepalived_vrrp[51730]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 13 05:50:41 jumpserver Keepalived_vrrp[51730]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 13 05:50:41 jumpserver Keepalived_vrrp[51730]: Sending gratuitous ARP on ens33 for 10.101.1.100

(5)主从同步测试:可以看到VIP在主备之间进行切换;

---停掉master keepalived:
Feb 12 08:04:44 localhost Keepalived_vrrp[55841]: (VI_1) Backup received priority 0 advertisement
Feb 12 08:04:44 localhost Keepalived_vrrp[55841]: (VI_1) Receive advertisement timeout
Feb 12 08:04:44 localhost Keepalived_vrrp[55841]: (VI_1) Entering MASTER STATE
Feb 12 08:04:44 localhost Keepalived_vrrp[55841]: (VI_1) setting VIPs.
Feb 12 08:04:44 localhost Keepalived_vrrp[55841]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 12 08:04:44 localhost Keepalived_vrrp[55841]: (VI_1) Sending/queueing gratuitous ARPs on ens33 for 10.101.1.100
Feb 12 08:04:44 localhost Keepalived_vrrp[55841]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 12 08:04:44 localhost Keepalived_vrrp[55841]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 12 08:04:44 localhost Keepalived_vrrp[55841]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 12 08:04:44 localhost Keepalived_vrrp[55841]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 12 08:04:49 localhost Keepalived_vrrp[55841]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 12 08:04:49 localhost Keepalived_vrrp[55841]: (VI_1) Sending/queueing gratuitous ARPs on ens33 for 10.101.1.100
Feb 12 08:04:49 localhost Keepalived_vrrp[55841]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 12 08:04:49 localhost Keepalived_vrrp[55841]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 12 08:04:49 localhost Keepalived_vrrp[55841]: Sending gratuitous ARP on ens33 for 10.101.1.100
Feb 12 08:04:49 localhost Keepalived_vrrp[55841]: Sending gratuitous ARP on ens33 for 10.101.1.100
---重新启动master
Feb 12 08:05:27 localhost Keepalived_vrrp[55841]: (VI_1) Master received advert from 10.101.1.70 with higher priority 110, ours 105
Feb 12 08:05:27 localhost Keepalived_vrrp[55841]: (VI_1) Entering BACKUP STATE
Feb 12 08:05:27 localhost Keepalived_vrrp[55841]: (VI_1) removing VIPs.

3.nginx安装:

(1)编译环境准备:

sudo yum check-update || sudo yum update -y
sudo yum groupinstall -y 'Development Tools' && sudo yum install -y vim
sudo yum install -y epel-release
sudo yum install -y perl perl-devel perl-ExtUtils-Embed libxslt libxslt-devel libxml2 libxml2-devel gd gd-devel GeoIP GeoIP-devel
sudo yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel
yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel

(2)安装:

tar -xzf nginx-1.15.7.tar.gz
cd nginx-1.15.7
sed -i -e 's/1.15.7//g' -e 's/nginx\//TDTWS/g' -e 's/"NGINX"/"TDTWS"/g' src/core/nginx.h
./configure --prefix=/usr/local/nginx  --with-http_stub_status_module  --with-http_ssl_module --with-stream --with-stream_ssl_module
make
make install
/usr/sbin/groupadd -f www
/usr/sbin/useradd -g www www

(3)启动:启动前可以用-t参数判断下配置文件是否有问题,或者直接在启动参数中添加-t;修改配置文件可以用./nginx -s reload

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

(4)停止

--从容停止:ps -ef|grep nginx ;kill -QUIT 2072
--快速停止:kill -TERM 2132 或 kill -INT 2132
--强制停止:pkill -9 nginx

(5)管理和升级:

#查看nginx进程
ps -ef|grep nginx
#平滑启动nginx
kill -HUP `cat /var/run/nginx.pid`
或者
nginx -s reload
其中进程文件路径在配置文件nginx.conf中可以找到。
平滑启动的意思是在不停止nginx的情况下,重启nginx,重新加载配置文件,启动新的工作线程,完美停止旧的工作线程。
#完美停止nginx
kill -QUIT `cat /var/run/nginx.pid`
#快速停止nginx
kill -TERM `cat /var/run/nginx.pid`
或者
kill -INT `cat /var/run/nginx.pid`
#完美停止工作进程(主要用于平滑升级)
kill -WINCH `cat /var/run/nginx.pid`
#强制停止nginx
pkill -9 nginx
#检查对nginx.conf文件的修改是否正确
nginx -t -c /etc/nginx/nginx.conf 或者 nginx -t
#停止nginx的命令
nginx -s stop或者pkill nginx
#查看nginx的版本信息
nginx -v
#查看完整的nginx的配置信息
nginx -V

—升级:分为四个步骤,包括软件下载、预编译、编译、配置

wget http://www.nginx.org/download/nginx-1.4.2.tar.gz
获取旧版本nginx的configure选项
/usr/local/nginx/sbin/nginx -V
编译新版本的Nginx
tar  -xvf  nginx-1.4.2.tar.gz
cd nginx-1.4.2
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream --with-stream_ssl_module
make
备份旧版本的nginx可执行文件,复制新版本的nginx这行文件
mv /usr/local/nginx/sbin/nginx  /usr/local/nginx/sbin/nginx.old
cp objs/nginx /usr/local/nginx/sbin/
测试新版本nginx是否正常
/usr/local/nginx/sbin/nginx -t
平滑重启升级nginx
kill -QUIT `cat /usr/local/nginx/log/nginx.oldbin` ##关闭旧版nginx
验证nginx是否升级成功
/usr/local/nginx/sbin/nginx  -V显示最新编译的版本信息即可。

—重新编译添加新模块:

进入nginx源码目录
cd nginx-1.3.2
以下是重新编译的代码和模块
./configure --prefix=/usr/local/nginx--with-http_stub_status_module --with-http_ssl_module --with-file-aio --with-http_realip_module
make 千万别make install,否则就覆盖安装了
make完之后在objs目录下就多了个nginx,这个就是新版本的程序了
备份旧的nginx程序
cp /usr/local/nginx/sbin/nginx/usr/local/nginx/sbin/nginx.bak
把新的nginx程序覆盖旧的
cp objs/nginx /usr/local/nginx/sbin/nginx
测试新的nginx程序是否正确
/usr/local/nginx/sbin/nginx -t
nginx: theconfiguration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx:configuration file /usr/local/nginx/conf/nginx.conf test issuccessful
平滑重启nginx
/usr/local/nginx/sbin/nginx -s reload
查看ngixn版本极其编译参数
/usr/local/nginx/sbin/nginx -V

4.dr模式测试:realserver上必须启动脚本,将loIP地址设置成VIP的地址

#!/bin/sh
#LVS Client Server
VIP=192.1.105.200
case  $1  in                                                                                                                                                                                                                     
start)                                                                                                                                                                                                                           
    ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
    /sbin/route add -host $VIP dev lo:0
    echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
    sysctl -p >/dev/null 2>&1
    echo "RealServer Start OK"
    exit 0
;;                                                                                                                                                                                                                               
stop)
    ifconfig lo:0 down
    route del $VIP >/dev/null 2>&1
    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
    echo "RealServer Stoped OK"
    exit 1
;;
*)
    echo "Usage: $0 {start|stop}"
;;
esac

###############几个问题##############搬运工###################

(1)让lvs server和real server工作在同一台服务器上:https://www.douban.com/note/598634431/

(2)LVS的几个重点知识:http://www.360doc.com/content/14/0918/15/1123425_410457105.shtml

(3)DR原理详细介绍:https://blog.csdn.net/liupeifeng3514/article/details/79038451  https://www.cnblogs.com/leezhxing/p/4613500.html

1.DR数据流向:现在客户端CLient访问www.a.com ,经过dns查询得到目的IP为VIP,目的端口为80,于是客户端和我们VIP,端口80建立连接(TCP三次握手,只是建立连接没有传送数据),之后客户端发送HTTP请求,LVS在VIP上收到之后,根据hash策略,从后端realserver中选出一台作为此次请求的接受者,假设为RIP1,LVS将请求包的目的mac地址更改为RIP1的mac,然后封装后转发给后端的RIP1,同时将该链接记录在hash表中。RIP1的某一块网卡,比如eth0,接收到这个转发包看到mac地址是自己的,于是就转发给上层的IP层,IP层解开包后,发现目的的IP地址也是自己,因为VIP也配置在我们的一块non-arp的网卡上(比如lo:0),然后根据IP首部的类型字段(这里是TCP),把请求送给TCP,然后TCP根据目的端口80,传给应用层的Apache,Apache处理完请求之后,将数据传给TCP,TCP将源端口更改为80 ,源IP更改为VIP,目的端口更改为客户端的端口,目的IP更改为Client的IP,打包后给IP层,IP层根据目的地址进行路由,然后经过网络返给Client,完成了一次请求,而不经过LB;
2.DR模式的优缺点
优点:
    可扩展性强,ld不会成为业务增长的瓶颈
缺点:
    节点不能跨网段,即real server和ld必须在一个物理网段中,一定程度上可能会使用多个公网IP
    realserver上须有一块网卡不接受arp广播
3.DR模式与arp,由于DR模式使用的是更改目的的mac地址,所以难免要和arp打交道。arp -a可以查看当前服务器上面的arp缓存;https://www.jianshu.com/p/a682ecae9693
一般来说客户端是不会和我们的服务器在同一个网段的,那么请求就会经过我们的服务器所在网段的路由设备上,我们知道在同一网段中,两个主机通信靠的是二层的物理地址而不是Ip地址,所以当请求包到达这路由设备上之后,若路由设备的arp表中没有VIP对应的
MAC,就会广播一个arp请求,在这里我们将LVS和real server上都配置了VIP,那么按照理论他们都会响应这个arp请求,那路由器的arp表就会乱了。所以,我们就需要只让LVS上响应VIP的arp请求,而real server 不响应;Linux主机有这么一个特性,假设我们的主机上有两块网卡,比如eth0,eth1 当arp请求eth1的mac地址的时候,eth1会答复,这个是理所当然的,但是eth0也会“好心”的帮eth1回答这个arp请求; 要防止这样的话,就需要更改下我们的一些内核参数:

    net.ipv4.conf.lo.arp_ignore = 1

    net.ipv4.conf.all.arp_ignore = 1

正常情况下只写第二条就是了,all 是指所有设备的interface,当all和具体的interface比如lo,按照最大的值生效;另外一个linux的特性就是,对于一个从realserver发出的arp请求,其源IP是VIP,而出口不会是lo,这里假设是eth0,那么这个arp请求包里里面,源IP就是VIP,源MAC是eth0的mac,目的IP是网关,那么路由器在接收到这个请求的时候,会将将自己的相应接口的硬件地址放在arp响应包中,同时将请求包中的源IP及MAC放在arp高速缓存中,那这下可就乱套 了,就会使真正的VIP得不到正确的请求了.这是因为,正常的情况下,arp的请求中源IP是出去的所在接口的地址,mac也是出去的接口的mac,但linux在默认情况下却不是这样的,如果一个接口发出的arp请求须经另一个出口出去的时候,源IP就不是所出去接口的IP,那么将内核参数设置为 2 相应的解决了这个问题。

    net.ipv4.conf.lo.arp_announce = 2

    net.ipv4.conf.all.arp_announce = 2
2.PC1的网卡收到bit流,通过网卡解封装,查看数据报文中目的MAC地址为本机的MAC,继续解封装,查看目的IP地址为自己的IP地址,继续解封装,查看TCP报文,通过查看源端口,确定是与PC2连接的端到端连接,在解封装,发现为FTP报文,提交给上层协议进行处理,应用程序通过读取FTP报文,把报文返回到输出界面。

(4)tcpdump抓包:tcpdump -i eth1 port 80 -Xx(注:如果没有tcpdump,就yum -y install tcpdump)   wireshark查看;

(5)关于loopback回环端口,回环接口可以配置,而且是一个网络号,并非主机号,除非把掩码配置为32bits。https://blog.csdn.net/yydcj/article/details/8447567

Loopback接口是虚拟接口,是一种纯软件性质的虚拟接口。任何送到该接口的网络数据报文都会被认为是送往设备自身的。大多数平台都支持使用这种接口来模拟真正的接口。这样做的好处是虚拟接口不会像物理接口那样因为各种因素的影响而导致接口被关闭。事实上,将Loopback接口和其他物理接口相比较,可以发现Loopback接口有以下几条优点:
1.       Loopback接口状态永远是up的,即使没有配置地址。这是它的一个非常重要的特性。    
2.       Loopback接口可以配置地址,而且可以配置全1的掩码,可以节省宝贵的地址空间。    
3.       Loopback接口不能封装任何链路层协议。
IP协议中的loopback地址。RFC2606中明确指出了loopback地址的标准域名为localhost。在IPv4中,其对应的IP地址一直是127.0.0.1;理论上,整个127IP段(127.0.0.0~127.255.255.255)的IP地址都为loopback地址,与localhost对应。在IPv6中,localhost对应的IP地址为0:0:0:0:0:0:0:1,一般写作::1。
在网络设备中,loopback被用来代表某些用于管理目的的虚拟接口,其含义并没有"回环"的意思。loopback虚拟接口会分配到一个IP地址,但是这个IP地址不会对应到实际的物理接口。网络设备中的loopback地址主要用于管理目的,例如设备发出的报警。网络设备中的应用程序(管理程序)使用loopback地址发送可接收数据流,而不是使用实际物理接口的地址。对外部来说,直接使用loopback地址来查看设备对应的信息(如报警信息),与网卡的物理地址无关。。我们也可以把这种地址理解为网络设备提供的服务的地址。
在通信领域,loopback可以用作将接收到的信号或数据直接返回给发送者的测试方法。作为一种测试方法,很多通信设备都可以配置端口的数据发送模式(例如all ones模式),来检测同一个端口上的信号接收。这种测试也叫"回环测试"。

(6)关于手动添加ipvsadm规则删除:http://www.mamicode.com/info-detail-121656.html

#删除vip地址
  /sbin/ifconfig eth0:0 down
#关闭ip转发
  echo 0 > /proc/sys/net/ipv4/ip_forward
#清除ipvsadm 规则
  /sbin/ipvsadm -C
#删除锁文件
  /bin/touch $LOCKFILE
ipvsadm  -A  -t  10.101.1.100:8880  -s  rr
ipvsadm  -a  -t  10.101.1.100:8880  -r  10.101.1.59  -g  -w 2
ipvsadm  -a  -t  10.101.1.100:8880  -r  10.101.1.187  -g  -w 2
ipvsadm  -D  -t  10.101.1.100:8880
ipvsadm  -d  -t  10.101.1.100:8880  -r  10.101.1.59
ipvsadm  -d  -t  10.101.1.100:8880  -r  10.101.1.187

(7)安装配置:https://www.cnblogs.com/a-can/p/123ddd.html   https://www.cnblogs.com/liuyisai/p/5990645.html

(8)采坑专业户:http://baijiahao.baidu.com/s?id=1585299978849584757&wfr=spider&for=pc

(9)抓包分析网络问题:https://www.cnblogs.com/shizouwei/p/9072186.html

(10)网桥工具brctl使用:https://blog.csdn.net/skh2015java/article/details/82466718

(11)dnsmasq服务:http://blog.51cto.com/yanconggod/1977598  haproxy:https://www.linuxidc.com/Linux/2018-04/151871.htm

#################分割线####################遇到问题即解决:

1.报错:./configure: error: the HTTP rewrite module requires the PCRE library.

—sudo yum -y install zlib zlib-devel openssl openssl–devel pcre pcre-devel

2.报错:Nginx错误:[emerg] getpwnam(“www”) failed  原因:没有创建WWW这个用户;

/usr/sbin/groupadd -f www 
/usr/sbin/useradd -g www www

3.查看内核版本: uname -sr

4.报错:ip_vs.h:15:29: fatal error: netlink/netlink.h: No such file or directory

yum install libnl* libpopt* -y
yum install popt-static -y

5.Nginx: Too Many Open Files 错误和解决方案,主要原因是Linux / Unix 设置了软硬文件句柄和打开文件的数目:https://www.cnblogs.com/kevingrace/p/5815592.html

(1)临时生效方法:
--ulimit -n 30000   // 用ulimit -n 30000 修改只对当前的shell有效,退出后失效。
--nginx.conf文件添加:worker_rlimit_nofile 30000;
(2)永久生效:
---修改硬件配置:在nginx服务器可以打开的文件数量受你操作系统的限制,编辑/etc/sysctl.conf 添加如下内容:
    fs.file-max = 70000 保存退出,重新读取系统配置sysctl -p
    再编辑 /etc/security/limits.conf 添加内容:
    * soft nofile 10000
    * hard nofile 30000
    此修改内容需要reboot系统才能生效,所以务必从新启动下服务器。
---修改Nginx系统的文件限制,使用nginx worker_rlimit_nofile Option
    # set open fd limit to 30000
    worker_rlimit_nofile 30000;
    sudo service nginx reload
(3)查看命令:
    ulimit -Hn
    ulimit -Sn
ulimit : 设置最大进程数和最大文件打开数, 这个一般是系统优化的必要手段.
1) 临时修改
为了优化linux性能,可能需要修改这个最大值。临时修改的话ulimit -n 655360就可以了,重启后失效。
[root@localhost ~]# ulimit -n
1024
[root@localhost ~]# ulimit -n 655360
[root@localhost ~]# ulimit -n
655360
2) 永久修改
修改/etc/security/limits.conf文件, 在文件末尾添加
[root@localhost ~]# vim /etc/security/limits.conf
* soft nofile 655360
* hard nofile 655360
* soft nproc 655360
* hard nproc 655360
=============================
上面配置内容中:
*               代表针对所有用户
noproc     是代表最大进程数
nofile      是代表最大文件打开数
如上修改后重启服务或服务器,如果发现没更改过来, 还需要修改下面梁文文件
在/etc/security/limits.d/90-nproc.conf文件末尾添加
[root@localhost ~]# vim /etc/security/limits.d/90-nproc.conf
* soft nproc 655360
* hard nproc 655360
在/etc/security/limits.d/def.conf文件末尾添加
[root@localhost ~]# vim /etc/security/limits.d/def.conf
* soft nofile 655360
* hard nofile 655360
然后重启后生效

6.主备都有VIP:(VI_1) Received advert from 10.101.1.70 with lower priority 110, ours 115, forcing new election

—抓包发现主备都在进行VRRP广播:tcpdump -i em1 vrrp -n,正常情况下备机进行vrrp广播只可能是没有收到master的心跳包,查看发现备机防火墙将信息拦截了;

—抓包要带上网口-i,否则报错:tcpdump: NFLOG link-layer type filtering not implemented

############################内容跟进###############################################

1.keepalived简介:https://blog.csdn.net/qq_24336773/article/details/82143367

--Keepalived是Linux下一个轻量级别的高可用解决方案,高可用(High Avalilability,HA),其实两种不同的含义:广义来讲,是指整个系统的高可用行,狭义的来讲就是之主机的冗余和接管,它与HeartBeat RoseHA 实现相同类似的功能,都可以实现服务或者网络的高可用,但是又有差别,HeartBeat是一个专业的、功能完善的高可用软件,它提供了HA 软件所需的基本功能,比如:心跳检测、资源接管,检测集群中的服务,在集群节点转移共享IP地址的所有者等等。HeartBeat功能强大,但是部署和使用相对比较麻烦,与HeartBeat相比,Keepalived主要是通过虚拟路由冗余来实现高可用功能,虽然它没有HeartBeat功能强大,但是Keepalived部署和使用非常的简单,所有配置只需要一个配置文件即可以完成;
--Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点,后来Keepalived又加入了VRRP的功能,VRRP(Vritrual Router Redundancy Protocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied 一方面具有服务器状态检测和故障隔离功能,另外一方面也有HA cluster功能,下面介绍一下VRRP协议实现的过程;
--VRRP协议与工作原理:在现实的网络环境中,主机之间的通信都是通过配置静态路由或者(默认网关)来完成的,而主机之间的路由器一旦发生故障,通信就会失效,因此这种通信模式当中,路由器就成了一个单点瓶颈,为了解决这个问题,就引入了VRRP协议,熟悉网络的学员对VRRP协议应该不陌生,它是一种主备模式的协议,通过VRRP可以在网络发生故障时透明的进行设备切换而不影响主机之间的数据通信,这其中涉及到两个概念:物理路由器和虚拟路由器;VRRP可以将两台或者多台物理路由器设备虚拟成一个虚拟路由,这个虚拟路由器通过虚拟IP(一个或者多个)对外提供服务,而在虚拟路由器内部十多个物理路由器协同工作,同一时间只有一台物理路由器对外提供服务,这台物理路由设备被成为:主路由器(Master角色),一般情况下Master是由选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能,如:ARP请求,ICMP 数据转发等,而且其它的物理路由器不拥有对外的虚拟IP,也不提供对外网络功能,仅仅接收MASTER的VRRP状态通告信息,这些路由器被统称为“BACKUP的角色”,当主路由器失败时,处于BACKUP角色的备份路由器将重新进行选举,产生一个新的主路由器进入MASTER角色,继续提供对外服务,整个切换对用户来说是完全透明的;每个虚拟路由器都有一个唯一的标识号,称为VRID,一个VRID与一组IP地址构成一个虚拟路由器,在VRRP协议中,所有的报文都是通过IP多播方式发送 的,而在一个虚拟路由器中,只有处于Master角色的路由器会一直发送VRRP数据包,处于BACKUP角色的路由器只会接受Master角色发送过来的报文信息,用来监控Master运行状态,一一般不会发生BACKUP抢占的情况,除非它的优先级更高,而当MASTER不可用时,BACKUP也就无法收到Master发过来的信息,于是就认定Master出现故障,接着多台BAKCUP就会进行选举,优先级最高的BACKUP将称为新的MASTER,这种选举角色切换非常之快,因而保证了服务的持续可用性;
3》Keepalvied的工作原理:上面我们介绍了Keepalived通过VRRP实现高可用性的工作原理,而Keepalived作为一个高性能集群软件,它还能实现对集群中服务器运行状态的监控以及故障隔离,下面我们介绍一下Keepalived对服务器运行状态和故障隔离的工作原理;Keepalived工作在TCP/IP 参考模型的 三层、四层、五层,也就是分别为:网络层,传输层和应用层,根据TCP、IP参数模型隔层所能实现的功能,Keepalived运行机制如下:
--在网络层: 我们知道运行这4个重要的协议,互联网络IP协议,互联网络可控制报文协议ICMP、地址转换协议ARP、反向地址转换协议RARP,在网络层Keepalived在网络层采用最常见的工作方式是通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似与Ping的功能),如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点;
--在传输层: 提供了两个主要的协议:传输控制协议TCP和用户数据协议UDP,传输控制协议TCP可以提供可靠的数据输出服务、IP地址和端口,代表TCP 的一个连接端,要获得TCP服务,需要在发送机的一个端口和接收机的一个端口上建立连接,而Keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉;
--在应用层:可以运行FTP,TELNET,SMTP,DNS等各种不同类型的高层协议,Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived工作方式,例如:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否允许正常,如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除;
Keepalived 是运行在lvs 之上,它的主要功能是实现真实机的故障隔离及负载均衡器间的失败 切换,提高系统的可用性;

–基本架构:

SchedulerI/OMultiplexer是一个I/O复用分发调度器,它负载安排Keepalived所有内部的任务请求;
Memory Mngt是一个内存管理机制,这个框架提供了访问内存的一些通用方法;
Control Plane 是keepalived的控制版面,可以实现对配置文件编译和解析;
Core componets 这部分主要包含了5个部分;
Watchdog:是计算机可靠领域中极为简单又非常有效的检测工具,Keepalived正是通过它监控Checkers和VRRP进程的。
Checkers:这是Keepalived最基础的功能,也是最主要的功能,可以实现对服务器运行状态检测和故障隔离。
VRRP Stack:这是keepalived后来引用VRRP功能,可以实现HA集群中失败切换功能。负责负载均衡器之间的失败切换FailOver;
IPVS wrapper:这个是IPVS功能的一个实现,IPVSwarrper模块将可以设置好的IPVS规则发送的内核空间并且提供给IPVS模块,最终实现IPVS模块的负载功能。
Netlink Reflector:用来实现高可用集群Failover时虚拟IP(VIP)的设置和切换,
keepalived运行时,会启动3个进程,分别为:core(核心进程),check和vrrp
- core:负责主进程的启动,维护和全局配置文件的加载;
- check:负责健康检查
- vrrp:用来实现vrrp协议

–与Heartbeat、Corosync比较:

Heartbeat、Corosync、Keepalived这三个集群组件我们到底选哪个好,Heartbeat、Corosync是属于同一类型,Keepalived与Heartbeat、Corosync,根本不是同一类型的。Keepalived使用的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)一般用于服务的高可用,且需要共享存储,一般用于多节点的高可用。

–配置文件:keepalived.conf:http://outofmemory.cn/wiki/keepalived-configuration

—–global_defs区域主要是配置故障发生时的通知对象以及机器标识:

global_defs {
     notification_email {
         a@abc.com
         b@abc.com
         ...     }
     notification_email_from alert@abc.com
     smtp_server smtp.abc.com
     smtp_connect_timeout 30
     enable_traps
     router_id host163
 }
* notification_email 故障发生时给谁发邮件通知。
* notification_email_from 通知邮件从哪个地址发出。
* smpt_server 通知邮件的smtp地址。
* smtp_connect_timeout 连接smtp服务器的超时时间。
* enable_traps 开启SNMP陷阱(Simple Network Management Protocol)。
* router_id 标识本节点的字条串,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到。

—–static_ipaddress和static_routes区域配置的是是本节点的IP和路由信息。如果你的机器上已经配置了IP和路由,那么这两个区域可以不用配置。其实,一般情况下你的机器都会有IP地址和路由信息的,因此没必要再在这两个区域配置。

—–vrrp_script区域用来做健康检查的,当时检查失败时会将vrrp_instance的priority减少相应的值。

vrrp_script chk_http_port {
     script "</dev/tcp/127.0.0.1/80"
     interval 1
     weight -10
 }
以上意思是如果script中的指令执行失败,那么相应的vrrp_instance的优先级会减少10个点。

——vrrp_instance用来定义对外提供服务的VIP区域及其相关属性。

——vrrp_rsync_group用来定义vrrp_intance组,使得这个组内成员动作一致。举个例子来说明一下其功能:两个vrrp_instance同属于一个vrrp_rsync_group,那么其中一个vrrp_instance发生故障切换时,另一个vrrp_instance也会跟着切换(即使这个instance没有发生故障)。

vrrp_sync_group VG_1 {
     group {
         inside_network   # name of vrrp_instance (below)
         outside_network  # One for each moveable IP.
         ...
     }
     notify_master /path/to_master.sh
     notify_backup /path/to_backup.sh
     notify_fault "/path/fault.sh VG_1"
     notify /path/notify.sh
     smtp_alert
 }
 vrrp_instance VI_1 {
     state MASTER
     interface eth0
     use_vmac <VMAC_INTERFACE>
     dont_track_primary
     track_interface {
         eth0
         eth1
     }
     mcast_src_ip <IPADDR>
     lvs_sync_daemon_interface eth1
     garp_master_delay 10
     virtual_router_id 1
     priority 100
     advert_int 1
     authentication {
         auth_type PASS
         auth_pass 12345678
     }
     virtual_ipaddress {
         10.210.214.253/24 brd 10.210.214.255 dev eth0
         192.168.1.11/24 brd 192.168.1.255 dev eth1
     }
     virtual_routes {
         172.16.0.0/12 via 10.210.214.1
         192.168.1.0/24 via 192.168.1.1 dev eth1
         default via 202.102.152.1
     }
     track_script {
         chk_http_port
     }
     nopreempt
     preempt_delay 300
     debug
     notify_master <STRING>|<QUOTED-STRING>
     notify_backup <STRING>|<QUOTED-STRING>
     notify_fault <STRING>|<QUOTED-STRING>
     notify <STRING>|<QUOTED-STRING>
     smtp_alert
 }
* notify_master/backup/fault 分别表示切换为主/备/出错时所执行的脚本。
* notify 表示任何一状态切换时都会调用该脚本,并且该脚本在以上三个脚本执行完成之后进行调用,keepalived会自动传递三个参数($1 = "GROUP"|"INSTANCE",$2 = name of group or instance,$3 = target state of transition(MASTER/BACKUP/FAULT))。
* smtp_alert 表示是否开启邮件通知(用全局区域的邮件设置来发通知)。
* state 可以是MASTER或BACKUP,不过当其他节点keepalived启动时会将priority比较大的节点选举为MASTER,因此该项其实没有实质用途。
* interface 节点固有IP(非VIP)的网卡,用来发VRRP包。
* use_vmac 是否使用VRRP的虚拟MAC地址。
* dont_track_primary 忽略VRRP网卡错误。(默认未设置)
* track_interface 监控以下网卡,如果任何一个不通就会切换到FALT状态。(可选项)
* mcast_src_ip 修改vrrp组播包的源地址,默认源地址为master的IP。(由于是组播,因此即使修改了源地址,该master还是能收到回应的)
* lvs_sync_daemon_interface 绑定lvs syncd的网卡。
* garp_master_delay 当切为主状态后多久更新ARP缓存,默认5秒。
* virtual_router_id 取值在0-255之间,用来区分多个instance的VRRP组播。
可以用这条命令来查看该网络中所存在的vrid:tcpdump -nn -i any net 224.0.0.0/8
* priority 用来选举master的,要成为master,那么这个选项的值最好高于其他机器50个点,该项取值范围是1-255(在此范围之外会被识别成默认值100)。
* advert_int 发VRRP包的时间间隔,即多久进行一次master选举(可以认为是健康查检时间间隔)。
* authentication 认证区域,认证类型有PASS和HA(IPSEC),推荐使用PASS(密码只识别前8位)。
* virtual_ipaddress vip,不解释了。
* virtual_routes 虚拟路由,当IP漂过来之后需要添加的路由信息。
* virtual_ipaddress_excluded 发送的VRRP包里不包含的IP地址,为减少回应VRRP包的个数。在网卡上绑定的IP地址比较多的时候用。
* nopreempt 允许一个priority比较低的节点作为master,即使有priority更高的节点启动。
首先nopreemt必须在state为BACKUP的节点上才生效(因为是BACKUP节点决定是否来成为MASTER的),其次要实现类似于关闭auto failback的功能需要将所有节点的state都设置为BACKUP,或者将master节点的priority设置的比BACKUP低。我个人推荐使用将所有节点的state都设置成BACKUP并且都加上nopreempt选项,这样就完成了关于autofailback功能,当想手动将某节点切换为MASTER时只需去掉该节点的nopreempt选项并且将priority改的比其他节点大,然后重新加载配置文件即可(等MASTER切过来之后再将配置文件改回去再reload一下)。
当使用track_script时可以不用加nopreempt,只需要加上preempt_delay 5,这里的间隔时间要大于vrrp_script中定义的时长。
* preempt_delay master启动多久之后进行接管资源(VIP/Route信息等),并提是没有nopreempt选项。

——-virtual_server_group和virtual_server区域:virtual_server_group一般在超大型的LVS中用到,一般LVS用不过这东西,因此不多说。

virtual_server IP Port {
     delay_loop <INT>
     lb_algo rr|wrr|lc|wlc|lblc|sh|dh
     lb_kind NAT|DR|TUN
     persistence_timeout <INT>
     persistence_granularity <NETMASK>
     protocol TCP
     ha_suspend
     virtualhost <STRING>
     alpha
     omega
     quorum <INT>
     hysteresis <INT>
     quorum_up <STRING>|<QUOTED-STRING>
     quorum_down <STRING>|<QUOTED-STRING>
     sorry_server <IPADDR> <PORT>
     real_server <IPADDR> <PORT> {
         weight <INT>
         inhibit_on_failure
         notify_up <STRING>|<QUOTED-STRING>
         notify_down <STRING>|<QUOTED-STRING>
         # HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK
         HTTP_GET|SSL_GET {
             url {
                 path <STRING>
                 # Digest computed with genhash
                 digest <STRING>
                 status_code <INT>
             }
             connect_port <PORT>
             connect_timeout <INT>
             nb_get_retry <INT>
             delay_before_retry <INT>
         }
     }
 }
* delay_loop 延迟轮询时间(单位秒)。
* lb_algo 后端调试算法(load balancing algorithm)。
* lb_kind LVS调度类型NAT/DR/TUN。
* virtualhost 用来给HTTP_GET和SSL_GET配置请求header的。
* sorry_server 当所有real server宕掉时,sorry server顶替。
* real_server 真正提供服务的服务器。
* weight 权重。
* notify_up/down 当real server宕掉或启动时执行的脚本。
* 健康检查的方式,N多种方式。
* path 请求real serserver上的路径。
* digest/status_code 分别表示用genhash算出的结果和http状态码。
* connect_port 健康检查,如果端口通则认为服务器正常。
* connect_timeout,nb_get_retry,delay_before_retry分别表示超时时长、重试次数,下次重试的时间延迟

2.lvs:

–ipvs称之为IP虚拟服务器(IP Virtual Server,简写为IPVS)。是运行在LVS下的提供负载平衡功能的一种技术;

–IPVS的三种转发模式:根据负载均衡器转发客户端请求以及RS返回响应机制的不同,将IPVS的转发模式分为三种:NAT,DR,FULLNAT。(还有一种IP TUNNEL模式,IP通道技术,接触比较少)

——DR模式(Direct Routing):DR模式下,客户端的请求包到达负载均衡器的虚拟服务IP端口后,负载均衡器不会改写请求包的IP和端口,但是会改写请求包的MAC地址为后端RS的MAC地址,然后将数据包转发;真实服务器处理请求后,响应包直接回给客户端,不再经过负载均衡器。所以DR模式的转发效率是最高的,特别适合下行流量较大的业务场景,比如请求视频等大文件。

DR模式的特点:数据包在LB转发过程中,源/目的IP端口都不会变化LB只是将数据包的MAC地址改写为RS的MAC地址,然后转发给相应的RS。每台RS上都必须在环回网卡上绑定LB的虚拟服务IP,因为LB转发时并不会改写数据包的目的IP,所以RS收到的数据包的目的IP仍是LB的虚拟服务IP。为了保证RS能够正确处理该数据包,而不是丢弃,必须在RS的环回网卡上绑定LB的虚拟服务IP。这样RS会认为这个虚拟服务IP是自己的IP,自己是能够处理这个数据包的。否则RS会直接丢弃该数据包!RS上的业务进程必须监听在环回网卡的虚拟服务IP上,且端口必须和LB上的虚拟服务端口一致;因为LB不会改写数据包的目的端口,所以RS服务的监听端口必须和虚拟服务端口一致,否则RS会直接拒绝该数据包。RS处理完请求后,响应直接回给客户端,不再经过LB,因为RS收到的请求数据包的源IP是客户端的IP,所以理所当然RS的响应会直接回给客户端,而不会再经过LB。这时候要求RS和客户端之间的网络是可达的。LB和RS须位于同一个子网,因为LB在转发过程中需要改写数据包的MAC为RS的MAC地址,所以要能够查询到RS的MAC。而要获取到RS的MAC,则需要保证二者位于一个子网,否则LB只能获取到RS网关的MAC地址。

——NAT模式下,请求包和响应包都需要经过LB处理。当客户端的请求到达虚拟服务后,LB会对请求包做目的地址转换(DNAT),将请求包的目的IP改写为RS的IP。当收到RS的响应后,LB会对响应包做源地址转换(SNAT),将响应包的源IP改写为LB的IP。

NAT模式的特点:LB会修改数据包的地址,对于请求包,会进行DNAT;对于响应包,会进行SNAT。LB会透传客户端IP到RS(DR模式也会透传),虽然LB在转发过程中做了NAT转换,但是因为只是做了部分地址转发,所以RS收到的请求包里是能看到客户端IP的。需要将RS的默认网关地址配置为LB的浮动IP地址,因为RS收到的请求包源IP是客户端的IP,为了保证响应包在返回时能走到LB上面,所以需要将RS的默认网关地址配置为LB的虚拟服务IP地址。当然,如果客户端的IP是固定的,也可以在RS上添加明细路由指向LB的虚拟服务IP,不用改默认网关。LB和RS须位于同一个子网,并且客户端不能和LB/RS位于同一子网,因为需要将RS的默认网关配置为LB的虚拟服务IP地址,所以需要保证LB和RS位于同一子网。又因为需要保证RS的响应包能走回到LB上,则客户端不能和RS位于同一子网。否则RS直接就能获取到客户端的MAC,响应包就直接回给客户端了,不会走网关,也就走不到LB上面了。这时候由于没有LB做SNAT,客户端收到的响应包源IP是RS的IP,而客户端的请求包目的IP是LB的虚拟服务IP,这时候客户端无法识别响应包,会直接丢弃。

–持久化连接:

9》lvs持久性连接
      对于电子商务网站来说,用户在挑选商品的时候使用的是80端口来浏览的,当付款的时候则是通过443的ssl加密的方式,当然当用户挑选完商品付款的时 候,我们当然不希望                https的443跳转到另外一台REAL SERVER上,很显然应该是同一REAL SERVER才对,这时候就要用到基于防火墙标记的持久连接,通过定义端口的姻亲关系来实现。在生产环                 境中用的最多的也是PNMP即基于防火墙标记的持久 连接,好了引子就说到这下面我们就来详细说说LVS的持久连接;  
    1>PPC(Persistent Port Connections):将来自于同一个客户端对同一个集群服务的请求,始终定向至此前选定的RS;(持久端口连接)
        例如:client---->LVS(80)---->RS1 或 client---->LVS(23)---->RS2
        缺陷:期望访问不同的端口到同一台RS上,无法实现。
        配置:
            ipvsadm -A -t 172.16.100.1:80 -s rr -p 3600
            ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.10 -g -w 2
            ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.11 -g -w 2
    2>PCC(Persistent Client Connections):将来自于同一个客户端对所有端口的请求,始终定向至此前选定的RS;(持久客户端连接)
        说明:PCC是一个虚拟服务没有端口号(或者端口号为0),以"-p" 来标识服务。
        缺陷:定向所有服务,期望访问不同的Real Server无法实现。
        配置:
          ipvsadm -A -t 172.16.100.1:0 -s rr -p 3600
          ipvsadm -a -t 172.16.100.1:0 -r 172.16.100.10 -g -w 2
          ipvsadm -a -t 172.16.100.1:0 -r 172.16.100.11 -g -w 2
    3>PNMPP(Persistent Netfilter Marked Packet Persistence):持久防火墙标记连接,根据iptables 的规则,将对于某类服务几个不同端口的访问定义为一                                                                                                                    类;
      先对某一特定类型的数据包打上标记,然后再将基于某一类标记的服务送到后台的 Real Server上去,后台的Real Server 并不识别这些标记。将持久和防             火墙标记结合起来就能够实现端口姻亲功能,只要是来自某一客户端的对某一特定服务(需要不同的端口)的访问都定义到同一台 Real Server上去。
    案例:一个用户在访问购物网站时同时使用HTTP(80)和HTTPS(443)两种协议,我们需要将其定义到同一台Real Server上,而其他的服务不受限制。
    配置:        
        iptables -t mangle -A PREROUTING -d 172.16.100.1 -i eth0 -p tcp --dport 80 -j MARK --set-mark 8
        iptables -t mangle -A PREROUTING -d 172.16.100.1 -i eth0 -p tcp --dport 443 -j MARK --set-mark 8
        ipvsadm -A -f 8 -s rr -p 600
        ipvsadm -a -f 8 -r 172.16.100.10 -g -w 2
        ipvsadm -a -f 8 -r 172.16.100.11 -g -w 1
     4>持久连接命令
      1.ipvsadm -A|E … -p timeout
      2.选项
      3.-p timeout 指定持久连接时长,默认为360秒,单位是秒,即6分钟
http://www.it165.net/admin/html/201307/1565.html

LVS+Keepalived+nginx部署文档.docx

##########nginx负载均衡策略#############

当后端是缓存服务器时,经常使用一致性哈希算法来进行负载均衡。
使用一致性哈希的好处在于,增减集群的缓存服务器时,只有少量的缓存会失效,回源量较小。
在nginx+ats / haproxy+squid等CDN架构中,nginx/haproxy所使用的负载均衡算法便是一致性哈希。
我们举个例子来说明一致性哈希的好处。
假设后端集群包含三台缓存服务器,A、B、C。
请求r1、r2落在A上。
请求r3、r4落在B上。
请求r5、r6落在C上。
使用一致性哈希时,当缓存服务器B宕机时,r1/r2会仍然落在A上,r5/r6会仍然落在C上
也就是说这两台服务器上的缓存都不会失效。r3/r4会被重新分配给A或者C,并产生回源。
使用其它算法,当缓存服务器B宕机时,r1/r2不再落在A上,r5/r6不再落在C上了。
也就是说A、B、C上的缓存都失效了,所有的请求都要回源。
这里不介绍一致性哈希算法的基本原理,如果不了解,先花个10分钟看下这篇文章:
http://www.codeproject.com/Articles/56138/Consistent-hashing
在分析模块代码之前,先来看下nginx所实现的一致性哈希算法。

原文:https://blog.csdn.net/zhangskd/article/details/50256111

#######################

Ubuntu系统安装注意事项:https://blog.csdn.net/fduffyyg/article/details/86648737

–https://www.2cto.com/kf/201804/738752.html