linux 学习笔记
9unk Lv5

linux简介

Linux 是一套免费使用和自由传播的类 Unix 操作系统。因为 linux 是借鉴 Unix 来开发的,与 unix 有许多相似之处,并且在一定程度上遵守 POSIX 规范。

Unix 起源

  • MULTICS 项目

回顾 Unix 历史,我们就要说一下一个叫 MULTICS 的项目。上世纪六十年代时,大部份计算机都是采用批处理的方式(也就是说,当作业积累一定数量的时候,计算机才会进行处理)。那时,我们熟知的美国电话及电报公司(AT&T)、通用电器公司(G.E.)及麻省理工学院(MIT)计划合作开发一个多用途、分时及多用户的操作系统,也就是这个 MULTICS,其被设计运行在 GE-645 大型主机上。不过,这个项目由于太过复杂,整个目标过于庞大,糅合了太多的特性,进展太慢,几年下来都没有任何成果,而且性能都很低。于是到了 1969 年 2 月,贝尔实验室决定退出这个项目。

  • Space Travel

熟悉这段历史的人都知道,贝尔实验室中的有个叫 Ken Thompson 的人,他为 MULTICS 这个操作系统写了个游戏叫 “Space Travel” 的游戏,在 MULTICS 上经过实际运行后,他发现游戏速度很慢而且耗费昂贵 —— 每次运行会花费 75 美元。退出这个项目以后。他为了让这个游戏能玩,所以他找来 Dennis Ritchie 为这个游戏开发一个极其简单的操作系统。这就是后来的 Unix。(值得一提的是,当时他们本想在 DEC-10 上写,后来没有申请到,只好在实验室的土·啬角边找了一台被人遗弃的 Digital PDP-7 的迷你计算机进行他们的计划,这台计算机上连个操作系统都没有,于是他们用汇编语言仅一个月的时间就开发了一个操作系统的原型)他们的同事 Brian Kernighan 非常不喜欢这个系统,嘲笑 Ken Thompson 说:“你写的系统好真差劲,干脆叫 Unics 算了。” Unics 的名字就是相对于 MULTICS 的一种戏称,后业改成了 Unix。于是,Unix 就在这样被游戏和玩笑创造了,当时是1969年8 月。也就是这一年,Linux 之父 Linus Torvalds 在芬兰出生了。

  • Unix 第一版出现

1971年,Ken Thompson 写了充分长篇的申请报告,申请到了一台 PDP-11/24 的机器。于是 Unix 第一版出来了。在一台 PDP-11/24 的机器上完成。这台电脑只有 24KB 的物理内存和 500K 磁盘空间。Unix 占用了 12KB 的内存,剩下的一半内存可以支持两用户进行 Space Travel 的游戏。而著名的 fork() 系统调用也就是在这时出现的。

  • C 语言出现

到了 1973 年的时候,Ken Thompson 与 Dennis Ritchie 感到用汇编语言做移植太过于头痛,他们想用高级语言来完成第三版,对于当时完全以汇编语言来开发程序的年代,他们的想法算是相当的疯狂。一开始他们想尝试用 Fortran,可是失败了。后来他们用一个叫 BCPL 的语言开发,他们整合了BCPL 形成 B 语言,后来 Dennis Ritchie 觉得 B 语言还是不能满足要求,就是就改良了 B 语言,这就是今天的大名鼎鼎的 C 语言。于是,Ken Thompson 与 Dennis Ritchie 成功地用 C 语言重写了 Unix 的第三版内核。至此,Unix 这个操作系统修改、移植相当便利,为 Unix 日后的普及打下了坚实的基础。而 Unix 和 C 完美地结合成为一个统一体,C 与 Unix 很快成为世界的主导。

  • Unix 发布

Unix 的第一篇文章 “The UNIX Time Sharing System” 由 Ken Thompson 和 Dennis Ritchie 于1974年7月的 the Communications of the ACM 发表。这是 UNIX 与外界的首次接触。结果引起了学术界的广泛兴趣并对其源码索取,所以,Unix 第五版就以“仅用于教育目的”的协议,提供给各大学作为教学之用,成为当时操作系统课程中的范例教材。各大学公司开始通过 Unix 源码对 Unix 进行了各种各样的改进和扩展。于是,Unix 开始广泛流行。

Unix 分裂

  • BSD 出现

1978年,对 Unix 而言是革命性的一年;因为学术界的老大柏克利大学,推出了一份以第六版为基础,加上一些改进和新功能而成的 Unix。这就是著名的 “1 BSD(1st Berkeley Software Distribution)”,开创了 Unix 的另一个分支:BSD 系列。 同时期,AT&T 成立 USG,将 Unix 变成商业化的产品。从此,BSD 的 Unix 便和 AT&T 的 Unix 分庭抗礼,Unix 就分为 System IV 和 4.x BSD 这两大主流,各自蓬勃发展。

  • “最后一个真正的Unix”

1979 年发布的 Unix 第七版被称为是“最后一个真正的 Unix”,这个版本的 Unix 内核只有 40K bytes。后来这个版本被移植到 VAX 机上。20世纪80年代相继发布的 8、9、10 版本只授权给了少数大学。

  • TCP/IP

1982 年,AT&T 基于版本 7 开发了 UNIX System Ⅲ 的第一个版本,这是一个商业版本仅供出售。为了解决混乱的 UNIX 版本情况,AT&T 综合了其他大学和公司开发的各种 UNIX,开发了 UNIX System V Release 1。这个新的 UNIX 商业发布版本不再包含源代码,所以加州大学 Berkeley 分校继续开发 BSD UNIX,作为 UNIX System III 和 V 的替代选择。BSD 对 UNIX 最重要的贡献之一是 TCP/IP。BSD 有 8 个主要的发行版中包含了 TCP/IP:4.1c、4.2、4.3、4.3-Tahoe、4.3-Reno、Net2、4.4以及 4.4-lite。这些发布版中的 TCP/IP 代码几乎是现在所有系统中 TCP/IP 实现的前辈,包括 AT&T System V UNIX 和 Microsoft Windows中 的 TCP/IP 都参照了 BSD 的源码。

  • sun

同时,其他一些公司也开始为其自己的小型机或工作站提供商业版本的 UNIX 系统,有些选择 System V 作为基础版本,有些则选择了 BSD。BSD 的一名主要开发者,Bill Joy,在 BSD 基础上开发了 SunOS,并最终创办了 Sun Microsystems。

  • 386BSD

1991年,一群 BSD开发者(Donn Seeley、Mike Karels、Bill Jolitz 和 Trent Hein)离开了加州大学,创办了 Berkeley Software Design, Inc (BSDI)。BSDI 是第一家在便宜常见的 Intel 平台上提供全功能商业 BSD UNIX 的厂商。后来 Bill Jolitz 离开了 BSDI,开始了 386BSD 的工作。386BSD 被认为是 FreeBSD、OpenBSD 和 NetBSD、DragonFlyBSD 的先辈。

  • POSIX 标准

这是一个 AT&T 妄图私有化的 Unix 的时代。为了私有化 Unix,1986 年 IEEE 指定了一个委员会制定了一个一个开放作业系统的标准,称为 POSIX (Portable Operating Systems Interface)。最后加上个 X,不知道是为了好听,还是因为这本质上是 UNIX 的标准。当然,AT&T 的 Unix 取得了这个标准制订战争的胜利,还取得了 Unix 这个注册商标。此时 BSD 的拥护者自喻为冷酷无情的公司帝国的反抗军。就销售量来说,AT&T UNIX 始终赶不上 BSD/Sun。到 1990 年,AT&T 与 BSD 版本已难明显区分,因为彼此都有采用对方的新发明。

这段时期,从实验室出来的被全世界所分享的 Unix,正处于被私有化的关键时期。

  • Unix 的法律纠纷

BSDI 很快就与 AT&T 的 UNIX Systems Laboratories(USL)附属公司产生了法律纠纷,USL 是 AT&T 注册的公司。AT&T 为了拥有 System V 版权,以及 Unix 商标,为了垄断 Unix,1992年,USL 正式对 BSDI 提起诉讼,说 BSD 剽窃他的源码。而最终了结了好评如潮的 BSD 系统。

由于最后判决悬而未决,这桩法律诉讼将 BSD 后裔的开发,特别是自由软件,延迟了两年,这导致没有法律问题的 Linux 内核获得了极大的支持。Linux 跟 386BSD 的开发几乎同时起步,Linus 说,当时如果有自由的基于 386 的 Unix-like 操作系统,他就可能不会创造 Linux。尽管无法预料这给以后的软件业究竟造成了什么样的影响(如果没有这个法律纠纷,很有可能没有今天的革命性的 Linux),但有一点可以肯定,Linux 更加丰富了这块土壤。

这场官司一直打到 AT&T 将自己的 Unix 系统实验室卖掉,新接手的 Novell 公司采取了一种比较开明的做法,允许 BSDI 自由发布自己的 BSD,但是前提是必须将来自于 AT&T 的代码完全删除,于是诞生了 4。4 BSD Lite 版,由于这个版本不存在法律问题,4。4BSD Lite 成为了现代 BSD 系统的基础版本。

这桩诉讼最终在1994年1月了结,更多地满足了 BSDI 的利益。伯克利套件的 18,000 个文件中,只有 3 个文件要求删除,另有 70 个文件要求修改,并显示 USL 的版权说明。这项调解另外要求,USL 不得对 4。4BSD 提起诉讼,不管是用户还是 BSDI 代码的分发者。于是,BSD Unix 走上了复兴的道路。BSD 的开发也走向了几个不同的方向,并最终导致了 FreeBSD、OpenBSD 和 NetBSD 的出现。

从 AT&T 意识到了 Unix 的商业价值,不再将 Unix 源码授权给学术机构以来,到以后的几十年,Unix 仍在不断变化,其版权所有者不断变更,授权者的数量也在增加。Unix 的版权曾经为 AT&T 所有,之后 Novell 拥有了 Unix,再之后 Novell 又将版权出售给了 SCO(这一事实双方尚存在争议,这里是最新进展)。有很多大公司在取得了 Unix 的授权之后,开发了自己的 Unix 产品。(几年前,据传闻微软为了限制 Linux,微软让 SCO 到法院告Linux 剽窃其源码)

由于 Unix 是由 C 语言写的,所以修改和移植都很容易,因此,很多商业公司及学术机构均加入这个操作系统的研发,各个不同版本的 Unix 也开始蓬勃发展。这才产生了今天这么多的各式各样的 Unix 衍生产品。如 AIX、Solaris、HP-UX、IRIX、OSF、Ultrix 等等。(这些商业化的 Unix 基本上都是源于 AT&T 授权的 Unix System V)

Unix 开源组织

AT&T 的这种商业态度,让当时许许多的 Unix 的爱好者和软件开发者们感到相当的痛心和忧虑,他们认为商业化的种种限制并不利于产生的发展,相反还能导制产品出现诸多的问题。随着商业化 Unix 的版本的种种限制和诸多问题,引起了大众的不满和反对。于是,大家开始有组织地结成“反叛联盟”以此对抗欺行罢市的 AT&T 等商业化行为。
另一方面,关于“大教堂”(集权、封闭、受控、保密)和“集市”(分权、公开、精细的同僚复审)两种开发模式的对比成为了新思潮的中心思想。这个新思潮对 IT 业产生了非常深远影响。为整个计算机世界带来了革命性的价值观。

  • Open Source

此时,一个名叫 Richard Stallman 的领袖出现了,他认为 Unix 是一个相当好的操作系统,如果大家都能够将自己所学贡献出来,那么这个系统将会更加的优异!他倡导的 Open Source 的概念,就是针对 Unix 这一事实反对实验室里的产品商业化私有化。尽管 Stallman 既不是、也从来没有成为一个 Unix 程序员,但在后 1980 的大环境下,实现一个仿 Unix 操作系统成了他追求的明确战略目标。Richard Stallman 早期的捐助者大都是新踏入 Unix 土地的老牌 ARPANET 黑客,他们对代码共享的使命感甚至比那些有更多 Unix 背景的人强烈。

  • GNU

为了这个理想,Richard Stallman 于 1984 年创业了 GNU,计划开发一套与 Unix 相互兼容的的软件。1985 年 Richard Stallman 又创立了自由软件基金会(Free Software Foundation)来为 GNU 计划提供技术、法律以及财政支持。尽管 GNU 计划大部分时候是由个人自愿无偿贡献,但 FSF 有时还是会聘请程序员帮助编写。当 GNU 计划开始逐渐获得成功时,一些商业公司开始介入开发和技术支持。当中最著名的就是之后被 Red Hat 兼并的 Cygnus Solutions。

GNU 组织的建立,延续了当年 Unix 刚出现时的情形,并为这种情形建立了可靠的法律和财务保障。GNU 工程十几年以来, 已经成为一个对软件开发主要的影响力量, 创造了无数的重要的工具。例如:强健的编译器,有力的文本编辑器,甚至一个全功能的操作系统。从那时开始,许多程序员聚集起来开始开发一个自由的、高质量、易理解的软件,让这使得 Unix 社区生机勃勃,一派繁荣景象。

自90年代发起这个计划以来,GNU 开始大量的产生或收集各种系统所必备的组件,像是——函数库、编译器、调式工具、文本编辑器、网站服务器,以及一个 Unix 的使用者接口(Unix shell)等等,等等。但由于种种原因,GNU 一直没有开发操作系统的 kernel。正当 Richard Stallman在为操作系统内核伤脑筋的时候,Linux 出现了。

Linux 横空出世

1990年,Linus Torvalds 还是芬兰赫尔辛基大学的一名学生,最初是用汇编语言写了一个在 80386 保护模式下处理多任务切换的程序,后来从 Minix 得到灵感,进一步产生了自认为狂妄的想法——写一个比 Minix 更好的 Minix,于是开始写了一些硬件的设备驱动程序,一个小的文件系统。这样0.0.1版本的 Linux 就出来了,但是它只具有操作系统内核的勉强的雏形,甚至不能运行,你必须在有 Minix 的机器上编译以后才能玩。这时候 Linus 已经完全着迷而不想停止,决定踢开 Minix,于是在1991年10 月5号发布 Linux 0.0.2 版本,在这个版本中已经可以运行 bash 和 gcc。

  • Linux 1.0

从一开始,Linus 就决定自由扩散 Linux,包括原代码,随即 Linux 引起黑客们的注意,通过计算机网络加入了 Linux 的内核开发。Linux 倾向于成为一个黑客的系统——直到今天,在 Linux 社区里内核的开发被认为是真正的编程。由于一批高水平黑客的加入,使 Linux 发展迅猛,几乎一两个礼拜就有新版或修正版的出现,到1993年底94年初,Linux 1.0 终于诞生了!

Linux 1.0 已经是一个功能完备的操作系统,而且内核写得紧凑高效,可以充分发挥硬件的性能,在 4M 内存的 80386 机器上也表现得非常好,至今人们还在津津乐道。时至今日,kernel 的版本已经出到 2.6。Linux 的发展不像传统的软件工程,它完全是透过网络,集合世界各地的高手而成的一套操作系统,在这里我们也可以见识到网络快速传播的威力。Linux 初次让整个世界感觉到了开源力量和网络力量的如此强大。(Linux 的标志和吉祥物是一只名字叫做 Tux 的企鹅,标志的由来是因为Linus在澳洲时曾被一只动物园里的企鹅咬了一口,便选择了企鹅作为Linux的标志。)

  • Red Hat

Linux 的历史是和 GNU 紧密联系在一起的。从1983年开始的 GNU 计划致力于开发一个自由并且完整的类 Unix 操作系统,包括软件开发工具和各种应用程序。到 1991年 Linux 内核发布的时候,GNU 已经几乎完成了除了系统内核之外的各种必备软件的开发。在 Linus Torvalds 和其它开发人员的努力下,GNU 组件可以运行于 Linux 内核之上。整个内核是基于 GNU 通用公共许可,也就是 GPL(GNU General Public License,GNU通用公共许可证)的,但是 Linux 内核并不是 GNU 计划的一部分。1994年3月,Linux1.0 版正式发布,Marc Ewing 成立了 Red Hat 软件公司,成为最著名的 Linux 分销商之一。

严格来讲,Linux 这个词本身只表示 Linux 内核,但在实际上人们已经习惯了用 Linux 来形容整个基于 Linux 内核,并且使用 GNU 工程各种工具和应用程序的操作系统(也被称为 GNU/Linux)。基于这些组件的 Linux 软件被称为 Linux 发行版。一般来讲,一个 Linux 发行套件包含大量的软件,比如软件开发工具,数据库,Web 服务器(例如 Apache),X Window,桌面环境(比如 GNOME 和 KDE),办公套件(比如 OpenOffice.org),等等。

1991 至 1995 年间,Linux 从概念型的 0.1 版本内核原型,发展成为能够在性能和特性上均堪媲美专有 Unix 的操作系统,并且在连续正常工作时间等重要统计数据上打败了这些 Unix 中的绝大部分。1995 年,Linux 找到了自己的杀手级应用——开源的 web 服务器 Apache。就像 Linux,Apache 出众地稳定和高效。很快,运行 Apache 的 Linux 机器成了全球 ISP 平台的首选。约 60% 的网站选用 Apache,轻松击败了另两个主要的专有型竞争对手。今天的 LAMP(Linux , Apache, MySQL, PHP)已经成为了架构 Web 服务器的主要首选。
现如今的 Linux 不但可以装在几乎所有的主流服务器上,当然也包括桌面的 X86 系统中。其还常常被用于嵌入式系统,机顶盒、手机、交换机、游戏机、PDA、网络交换机、路由器、等等,都是因为 Linux 那精彩的内核。

Linux 的出现,不仅仅给世界带来了一个免费的操作系统,也不仅仅是对 Unix 自由、共享的文化的延续,它的出现带给了计算机世界自 Unix、GNU 以来更为成熟的思想和文化。

Linux —— 今天的领袖

Linux 和 GNU 关系是比较微妙的。那时,自由软件基金会编写的用户软件工具包铺平了一条摆脱高成本专有软件开发工具的前进道路。意识服从经济,而不是领导:一些新手加入了 RMS 的革命运动,高举 GPL 大旗,另一些人则更认同整体意义上的 Unix 传统,加入了反对 GPL 的阵营,但其他大部分人置身事外,一心编码。

今天,我们也说不清楚是 GNU Linux 还是 Linux GNU。Linux 既不排斥开源,也不排斥商业化,Linus 认为好的软件是需要免费和商业化共同推进的。正是这种革命性的想法,造就了今天的 Linux 火红的局面。Linux 就像一股清泉流入了所有人的心中,引发了很多的启迪和思考。

Unix 的历史教训

在 Unix 历史中,最大的规律就是:
距开源越近就越繁荣。任何将 Unix 专有化的企图,只能陷入停滞和衰败。
回顾过去,我们早该认识到这一点。1984年至今,我们浪费了十年时间才学到这个教训。如果我们日后不思悔改,可能还得大吃苦头。

虽然我们在软件设计这个重要但狭窄的领域比其他人聪明,但这不能使我们摆脱对技术与经济相互作用影响的茫然,而这些就发生在我们的眼皮底下。即使 Unix 社区中最具洞察力、最具远见卓识的思想家,他们的眼光终究有限。对今后的教训就是:过度依赖任何一种技术或者商业模式都是错误的——相反,保持软件及其设计传统的的灵活性才是长存之道。

另一个教训是:别和低价而灵活的方案较劲。或者,换句话说,低档的硬件只要数量足够,就能爬上性能曲线而最终获胜。经济学家 Clayton Christensen 称之为“破坏性技术”,他在《创新者窘境》一书中以磁盘驱动器、蒸汽挖土机和摩托车为例阐明了这种现象的发生。当小型机取代大型机、工作站和服务器取代小型机以及日用 Intel 机器又取代工作站和服务器时,我们也看到了这种现象。开源运动获得成功正是由于软件的大众化。Unix 要繁荣,就必须继续采用吸纳低价而灵活的方案的诀窍,而不是去反对它们。

最后,旧学派的 Unix 社区因采用了传统的公司组织、财务和市场等命令机制而最终未能实现“职业化”。只有痴迷的“黑客”和具有创造力的怪人结成的反叛联盟才能把我们从愚蠢中拯救出来——他们接着教导我们,真正的专业和奉献精神,正是我们在屈服于世俗观念的“合理商业做法”之前的所作所为。

后记

在中国,我们被微软所创造的文化所笼罩里。就在 Unix 出现革命性的转变,在 Unix 影响计算机世界文化的那几年里,科班出生专业开发人员学习的是 MS-DOS 和微软的文化,我们犹如一个井底之蛙一样,对外面的番·习天覆地的变化无动于衷。微软创造的文化在我们这里尤其地根深蒂固,我们几乎忘记了另外一边的 Unix 。

在那充满激情的 Unix 的岁月里,大伙为了科研目的或个人兴趣在 Unix 上进行各种开发,并且不计较金钱利益,将这些源码公开,互相共享。在那里,开发和自由成为主题,正因为如此,当今的世界才如此丰富多采。在 40 年 Unix 文化和技术积淀的里面,蕴涵着比较纯正的计算机文化和思想。

纵观整个 Unix 的历史过程中,许许多多的程序员、工程师前辈们在 Unix 中所摸爬滚打,他们的辛勤地、他们呕心沥血地跟随 Unix,努力建立一个繁荣的计算机世界的文明。Unix 不是一个简简单单的操作系统。有人说,Unix 是程序员设计给程序员的,一点没错。Unix 的近40年历史造就了它的博大精深,它给程序员们带来的绝不仅仅只是技术上的知识。它的失误,它的无奈,它的精神,它的荣耀,它从技术和思想上都启迪着我们。对于程序员来说,学习 Unix 就等同于向前辈程序学习。无论你是什么样的程序员,你都应该了解 Unix,这是开发人员的根,前面的开发者造就了它,而它又在引领后面的开发人员,它是前辈程序员们交给我们的一份礼物,一个接力棒,它是开发人员赖以生存的土壤,是上一辈程序员留给我们这一代程序员开启未来的钥匙。Unix 就像一个程序员教父一样,理当受到我们的尊敬和崇拜。

linux 权限管理

所谓权限管理,其实就是指对不同的用户,设置不同的文件访问权限,包括对文件的读、写、删除等,在 Linux 系统中,每个用户都具有不同的权限,拿非 root 用户来说,它们只能在自己的主目录下才具有写权限,而在主目录之外,只具有访问和读权限。


用户权限

  • UID

root用户(即超级用户)拥有极高的系统所有权,能够管理系统的各项功能。而 root 只是一个名字,真正让他成为 “超级用户” 的是 UID 的值。每个用户都有一个对应的 UID 值,就像是我们的身份证号码。

超级用户 UID(0):root用户默认为 0

系统用户 UID(1~999):系统中的系统服务由不同的用户运行,这样更加安全,默认被限制登录系统

普通用户 UID(1000~):管理员创建的用于日常工作而不能管理系统的普通用户

注:UID 不能一样

  • GID

GID 可将多用户加入到某个组中,方便工作。

注:每个用户在被创建的时候都会创建一个默认组(其 GID 和 UID 相同,俗称基本组),而后加入的叫扩展组。

用户组名称 与 GID 保存在 /etc/group 文件中。

文件权限

1
2
[fuck@master ~]$ ls -l test.txt
-rwxr-xr-x. 1 fuck fuck 38 11月 15 15:04 test.txt

第一个字段:

  • -:表示普通文件

  • rwx 所有者权限

  • r-x 所属组权限

  • r-x 其他人权限。

  • r:读权限,整数值为4;

  • w:写权限,整数值为2;

  • x:执行权限,整数值为 1

注:没有权限的地方会用 - 来表示

第二个字段

1:文件的硬链接个数

第三个字段

fuck:所有者,就是创建这个目录的用户

第四个字段

fuck:用户组,创建这个文件时所在的组就是用户组

第五个字段

38 11月 15 15:04:文件修改日期,上次文件执行、修改内容、权限、文件名等等的时间

第六个字段
test.txt:文件名

读权限

1
2
3
4
5
6
7
8
9
[fuck@master ~]$ ls -l test.txt
-r--------. 1 fuck fuck 43 11月 15 13:19 test.txt
[fuck@master ~]$ vim test.txt #可以强制修改保存文件

#查看文件
[fuck@master ~]$ cat test.txt
#!/bin/bash
echo "SB > Sb > sB > sb"
sssss

可以查看信息、修改文件(有警告信息)、查看文件详细信息

写权限

1
2
3
4
5
[fuck@master ~]$ ls -l test.txt
--w-------. 1 fuck fuck 43 11月 15 13:19 test.txt
[fuck@master ~]$ vim test.txt
[fuck@master ~]$ cat test.txt
cat: test.txt: 权限不够

只能查看自己的信息,如果强行修改文件的话,旧文件内容会被你新内容覆盖

执行权限

1
2
3
4
5
6
7
[fuck@master ~]$ ls -l test.txt
---x------. 1 fuck fuck 9 11月 15 13:22 test.txt
[fuck@master ~]$ ./test.txt
bash: ./test.txt: 权限不够
[fuck@master ~]$ cat test.txt
cat: test.txt: 权限不够
[fuck@master ~]$ vim test.txt

只能查看自己的信息,同样强制修改会覆盖旧内容

读和执行

1
2
3
4
5
6
7
8
[fuck@master ~]$ ls -l test.txt
-r-x------. 1 fuck fuck 28 11月 15 14:48 test.txt
[fuck@master ~]$ vim test.txt
[fuck@master ~]$ ./test.txt
njndkjdn
[fuck@master ~]$ cat test.txt
#!/bin/bash
echo "njndkjdn"

可以对文件进行修改(有警告信息)、执行、查看

读和写

1
2
3
4
5
6
7
[fuck@master ~]$ ls -l test.txt
-rw-------. 1 fuck fuck 28 11月 15 14:48 test.txt
[fuck@master ~]$ vim test.txt
[fuck@master ~]$ cat test.txt
#!/bin/bash
echo "njndkjdn"
echo "sb"

可以对文件进行修改(无警告信息)、查看

写和执行

1
2
3
4
5
6
[fuck@master ~]$ chmod 300 test.txt
[fuck@master ~]$ cat test.txt
cat: test.txt: 权限不够
[fuck@master ~]$ vim test.txt
[fuck@master ~]$ ./test.txt
/bin/bash: ./test.txt: 权限不够

可以强制修改文件内容,同样会覆盖旧文件内容

总结

首先文件必须有读的权限,不然无法对文件进行任何操作。写权限就是对文件进行修改,执行权限就是执行文件

目录权限

1
2
3
root@master hello]# ls -l
总用量 4
drwxr-xr-x. 2 fuck fuck 6 11月 12 11:11 fuck

第一个字段

  • d:表示目录

  • rwx 所有者权限

  • r-x 所属组权限

  • r-x 其他人权限。

r:读权限,w:写权限,x:执行权限(没有这个权限会用 - 来表示)

第二个字段

  • 目录内所含的文件,目录数量

  • 每个目录默认会包含两个目录,分别是 .(当前目录) ..(父目录)

第三个字段

root:所有者,就是创建这个目录的用户

第四个字段

root:用户组,创建这个目录时所在的组就是用户组

第四个字段

6 11月 12 11:11:目录修改日期,上次进入目录、更改目录名的时间

第五个字段

fuck:目录名

目录读权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#查看目录信心
[fuck@master ~]$ ls -l
总用量 0
dr--------. 3 fuck fuck 50 11月 14 21:17 hello

#进入目录
[fuck@master ~]$ cd hello/
-bash: cd: hello/: 权限不够

#查看目录里的文件和目录信息
[fuck@master ~]$ ls -l hello/
ls: 无法访问hello/file1.txt: 权限不够
ls: 无法访问hello/file2.txt: 权限不够
ls: 无法访问hello/Hi: 权限不够
总用量 0
-????????? ? ? ? ? ? file1.txt
-????????? ? ? ? ? ? file2.txt
d????????? ? ? ? ? ? Hi

#编辑目录下的文件
[fuck@master ~]$ vim hello/file1.txt
~
~
~
~
"hello/file1.txt" [权限不足]

#移动目录下的文件
[fuck@master ~]$ mv hello/file1.txt .
mv: 无法获取"hello/file1.txt" 的文件状态(stat): 权限不够

#删除文件
[fuck@master ~]$ rm -r hello/file1.txt
rm: 无法删除"hello/file1.txt": 权限不够

#复制文件
[fuck@master ~]$ cp hello/file1.txt .
cp: 无法获取"hello/file1.txt" 的文件状态(stat): 权限不够

只可以查看自己的信息。

目录写权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[fuck@master ~]$ ls -l
总用量 0
d-w-------. 3 fuck fuck 50 11月 14 21:34 hello
[fuck@master ~]$ ls -l hello/
[fuck@master ~]$ ls -l hello/
ls: 无法打开目录hello/: 权限不够
[fuck@master ~]$ cd hello/
-bash: cd: hello/: 权限不够


~
~
~
~
~
~
"hello/file1.txt" [权限不足] 0,0-1 全部

同样只能查看自己的信息

目录执行权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[fuck@master ~]$ ls -l
总用量 0
d--x------. 3 fuck fuck 50 11月 14 21:34 hello

[fuck@master ~]$ cd hello/
[fuck@master hello]$ cd ..

[fuck@master ~]$ ls -l hello/
ls: 无法打开目录hello/: 权限不够

[fuck@master hello]$ vim file1.txt
123456789
~
~
~
~
"file1.txt" 1L, 10C 1,1 全部

[fuck@master hello]$ rm -r file1.txt
rm: 无法删除"file1.txt": 权限不够

[fuck@master hello]$ mv file1.txt ~
mv: 无法将"file1.txt" 移动至"/home/fuck/file1.txt": 权限不够

可以进入目录、对文件进行查看、修改操作(前提是这个文件要有这个权限,文件名无法用tab补全)

目录读和执行权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[fuck@master ~]$ ls -l
总用量 0
dr-x------. 3 fuck fuck 50 11月 14 22:41 hello
[fuck@master ~]$ ls -l hello/
总用量 8
-rw-rw-r--. 1 fuck fuck 10 11月 14 21:16 file1.txt
-rw-rw-r--. 1 fuck fuck 11 11月 14 21:17 file2.txt
drwxrwxr-x. 2 fuck fuck 6 11月 14 21:17 Hi
[fuck@master ~]$ cd hello/
[fuck@master hello]$ cat file1.txt
123456789
[fuck@master hello]$ vim file1.txt
[fuck@master hello]$ rm -r file1.txt
rm: 无法删除"file1.txt": 权限不够
[fuck@master hello]$ touch file3.txt
touch: 无法创建"file3.txt": 权限不够

只可以查看文件详情,修改文件,进入目录

目录写和执行权限

1
2
3
4
5
6
7
8
9
10
[fuck@master ~]$ ls -l
总用量 0
d-wx------. 3 fuck fuck 50 11月 14 23:10 hello
[fuck@master ~]$ ls -l hello/
ls: 无法打开目录hello/: 权限不够
[fuck@master ~]$ cd hello/
[fuck@master hello]$ touch file3.txt
[fuck@master hello]$ rm file1.txt
[fuck@master hello]$ rm -r file1.txt
rm: 无法删除"file1.txt": 没有那个文件或目录

可以进入目录,修改、查看、创建,删除文件

目录读写权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[fuck@master ~]$ ls -l
总用量 0
drw-------. 3 fuck fuck 50 11月 14 23:10 hello
[fuck@master ~]$ cd hello/
-bash: cd: hello/: 权限不够
[fuck@master ~]$ touch hello/file5.txt
touch: 无法创建"hello/file5.txt": 权限不够
[fuck@master ~]$ rm -r hello/file2.txt
rm: 无法删除"hello/file2.txt": 权限不够
[fuck@master ~]$ ls -l hello/
ls: 无法访问hello/file2.txt: 权限不够
ls: 无法访问hello/Hi: 权限不够
ls: 无法访问hello/file3.txt: 权限不够
总用量 0
-????????? ? ? ? ? ? file2.txt
-????????? ? ? ? ? ? file3.txt
d????????? ? ? ? ? ? Hi

只能查看自己的信息

总结

修改目录中的文件首先需要有进入目录的权限(即执行权限X),写权限可以创建和删除文件(前提是要有执行权限),读权限可以查看目录内的文件的详细信息。

特殊权限

SUID

SUID(set uid ID upon execution)特殊权限只能对可执行的二进制文件进行设置。SUID 特殊权限以 s 权限覆盖所有者的 x 的权限。

作用:只要用户对设有 SUID 的文件有执行权限,那么当用户执行此文件时,普通用户会变成文件所有者,一旦文件执行结束,身份的切换也随之消失。

例如:修改密码的 passwd 命令,该文件的所有者是 root,但是任何用户都可以使用 passwd 命令修改自己的密码。

1
2
[root@localhost ~]# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd

这就是因为 passwd 文件有 SUID 权限,任何一个用户都可以用文件所有者,也就是 root 的身份去执行 passwd 命令。

  • 权限设置
1
[root@localhost ~]# chmod 4755 filename

PS:SUID 的权限值为 4 ,权限设置位置在第一位。

SGID

SGID(set group ID upon execution)特殊权限能对可执行文件和目录进行设置。SUID 特殊权限以 s 权限覆盖所属组的 x 的权限。

对文件的作用

只要用户对设有 SUID 的文件有执行权限,那么当用户执行此文件时,普通所属组会变成文件所属组的身份去执行此文件,一旦文件执行结束,身份的切换也随之消失。

例如:查询文件的 locate 命令, /usr/bin/locate 文件被赋予了 SGID 的特殊权限,这就意味着,当普通用户使用 locate 命令时,该用户的所属组会直接变为 locate 命令的所属组,也就是 slocate。

1
2
[root@localhost ~]# ll /usr/bin/locate
-rwx--s--x 1 root slocate 40520 4月 11 2018 /usr/bin/locate

locate 命令是用于在系统中按照文件名查找符合条件的文件的,当执行搜索操作时,它会通过搜索 /var/lib/mlocate/mlocate.db 这个数据库中的数据找到答案

1
2
[root@localhost ~]# ll /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 1815005 4月 5 09:02 /var/lib/mlocate/mlocate.db

mlocate.db 文件的所属组为 slocate,虽然对文件只拥有 r 权限,但对于普通用户执行 locate 命令来说,已经足够了。一方面,普通用户对 locate命令拥有执行权限,其次,locate 命令拥有 SGID 权限,这使得普通用户在执行 locate 命令时,所属组身份会变为 slocate,而 slocate 对 mlocate.db 数据库文件拥有 r 权限,所以即便是普通用户,也可以成功执行 locate 命令。

对目录的作用

当一个目录被赋予 SGID 权限后,进入此目录的普通用户,其有效群组会变为该目录的所属组,会就使得用户在创建文件(或目录)时,该文件(或目录)的所属组将不再是用户的所属组,而使用的是目录的所属组。

也就是说,只有当普通用户对具有 SGID 权限的目录有 rwx 权限时,SGID 的功能才能完全发挥。比如说,如果用户对该目录仅有 rx 权限,则用户进入此目录后,虽然其有效群组变为此目录的所属组,但由于没有 x 权限,用户无法在目录中创建文件或目录,SGID 权限也就无法发挥它的作用。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 赋予目录 775 权限,但普通用户无法做任何操作
[test@localhost ~]$ ll -d /root/dirtest
drwxrwsr-x 2 root root 6 4月 6 23:04 /root/dirtest
[test@localhost ~]$ mkdir /root/dirtest/test1
mkdir: 无法创建目录"/root/dirtest/test1": 权限不够

# 赋予目录 773 权限,但普通用户只能创建文件、目录,不能读文件。test 用户文件的所属组是 root
[test@localhost ~]$ ll -d dirtest/
drwxrws-wx 2 root root 6 4月 6 23:04 dirtest/
[test@localhost ~]$ ll -d /root/dirtest/test1
drwxrwsr-x 2 test root 6 4月 6 23:16 /root/dirtest/test1
[test@localhost ~]$ ll /root/dirtest/
ls: 无法打开目录/root/dirtest/: 权限不够

SBIT

SBIT(Sticky BIT) 特殊权限仅对目录有效,一旦目录设定了 SBIT 权限,则用户在此目录下创建的文件或目录,就只有自己和 root 才有权利修改或删除该文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
# root 用户创建的文件,同时赋予 777 权限,但是 test 用户无法删除 test1 文件
[root@localhost ~]# ll -d dirtest/
drwxrwsrwt 2 root root 6 4月 7 00:36 dirtest/
[root@localhost dirtest]# ll test1
-rwxrwxrwx 1 root root 0 4月 7 00:39 test1
[test@localhost ~]$ rm -rf /root/dirtest/test1
rm: 无法删除"/root/dirtest/test1": 不允许的操作

# test 用户创建的文件,同时赋予 664 权限。test 用户可以删除 test2 文件
[test@localhost ~]$ touch /root/dirtest/test2
[test@localhost ~]$ ll /root/dirtest/test2
-rw-rw-r-- 1 test root 0 4月 7 00:42 /root/dirtest/test2
[test@localhost ~]$ rm -rf /root/dirtest/test2

隐藏权限

属性 功能
i 如果对文件设置 i 属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;
如果对目录设置 i 属性,那么只能修改目录下文件中的数据,但不允许建立和删除文件;
a 如果对文件设置 a 属性,那么只能在文件中増加数据,但是不能删除和修改数据;
如果对目录设置 a 属性,那么只允许在目录中建立和修改文件,但是不允许删除文件;
u 设置此属性的文件或目录,在删除时,其内容会被保存,以保证后期能够恢复,常用来防止意外删除文件或目录。
s 和 u 相反,删除文件或目录时,会被彻底删除(直接从硬盘上删除,然后用 0 填充所占用的区域),不可恢复。

PS: ext2、ext3、ext4、xfs文件不支持 u 和 s 权限

i 权限

  1. 给文件赋予 i 属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 创建测试文件
[root@localhost ~]# touch ftest

# 添加 i 属性
[root@localhost ~]# chattr +i ftest

# 查看文件的隐藏属性
[root@localhost ~]# lsattr -a ftest
----i----------- ftest

# 无法删除文件
[root@localhost ~]# rm -rf ftest
rm: 无法删除"ftest": 不允许的操作

# 无法写入数据
[root@localhost ~]# echo 111>ftest
-bash: ftest: 权限不够

# 无法重命名文件
[root@localhost ~]# mv ftest ftest1
mv: 无法将"ftest" 移动至"ftest1": 不允许的操作
  1. 给目录赋予 i 权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 创建测试目录
[root@localhost ~]# mkdir dtest

# 创建测试文件
[root@localhost ~]# touch dtest/test1

# 赋予目录 i 属性
[root@localhost ~]# chattr +i dtest/

# 查看目录隐藏属性
[root@localhost ~]# lsattr -d dtest/
----i----------- dtest/

# 无法创建文件
[root@localhost ~]# cd dtest/
[root@localhost dtest]# touch test2
touch: 无法创建"test2": 权限不够

# 无法删除文件
[root@localhost dtest]# rm -rf test1
rm: 无法删除"test1": 权限不够

# 无法重命名文件
[root@localhost dtest]# mv test1 test2
mv: 无法将"test1" 移动至"test2": 权限不够

# 可以修改文件数据
[root@localhost dtest]# echo ll>>test1
[root@localhost dtest]# cat test1
ll

a 权限

  1. 给文件赋予 a 权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 添加 a 属性
[root@localhost ~]# chattr +a ftest

# 查看隐藏属性
[root@localhost ~]# lsattr -a ftest
-----a---------- ftest

# 无法删除文件
[root@localhost ~]# rm -rf ftest
rm: 无法删除"ftest": 不允许的操作

# 无法修改数据
[root@localhost ~]# echo ll> ftest
-bash: ftest: 不允许的操作

# 可以添加数据
[root@localhost ~]# echo ll>> ftest
[root@localhost ~]# cat ftest
ll

# 无法重命名文件
[root@localhost ~]# mv ftest ftest1
mv: 无法将"ftest" 移动至"ftest1": 不允许的操作
  1. 给目录赋予 a 权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 添加 a 属性
[root@localhost ~]# chattr +a dtest/

# 查看隐藏属性
[root@localhost ~]# lsattr -d dtest/
-----a---------- dtest/

# 可以创建文件,修改、添加数据
[root@localhost ~]# cd dtest/
[root@localhost dtest]# touch test2
[root@localhost dtest]# echo aaa>test1
[root@localhost dtest]# echo bbb>>test2
[root@localhost dtest]# cat test1 test2
aaa
bbb

# 无法删除文件
[root@localhost dtest]# rm -rf test1 test2
rm: 无法删除"test1": 不允许的操作
rm: 无法删除"test2": 不允许的操作

# 无法重命名文件
[root@localhost dtest]# mv test1 test3
mv: 无法将"test1" 移动至"test3": 不允许的操作

linux 文件目录管理

在 LINUX 系统中有一个重要的概念:一切皆文件。其实这是 UNIX 哲学的一个体现,而 Linux 是重写 UNIX 而来,所以这个概念也就传承了下来。在 UNIX 系统中,把一切资源都看作是文件,包括硬件设备。UNIX 系统把每个硬件都看成是一个文件,通常称为设备文件,这样用户就可以用读写文件的方式实现对硬件的访问。


文件类型

文件属性 文件类型
- 普通文件(二进制文件,xml文件,db文件等等)
d 目录文件
b 块设备(存储设备),如:硬盘,光盘,U盘等设备
c 字符设备,如:鼠标、键盘等设备
s 套接字文件,使两个进程之间(跨计算机)互相通信
l 符号链接文件,可以简单理解为 linux 文件的快捷方式
p 命名管道文件,让同一主机之间的两个进程通信

目录架构

linux 目录是树形结构,主要目的是方便文件系统的管理和维护,想象一下,如果所有的文件都放在一个目录下,其文件系统的管理和维护将变成一场噩梦。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/
├── bin -> usr/bin //存放系统管理员及普通用户使用的命令和可执行的二进制文件
├── boot //存放启动 linux 时使用的一些内核文件和引导程序文件
├── dev //访问外部设备文件的接口(相当于识别出设备,但无法访问)
├── etc //存放系统配置文件和子目录
├── home //存放系统用户目录
├── lib -> usr/lib //存放 32 位系统使用函数库目录(类似 windows 中的 DLL 文件)
├── lib64 -> usr/lib64 //存放 64 位系统使用函数库目录
├── media //自动识别挂载设备(如:U盘、移动硬盘等)
├── mnt //让管理员手动挂载临时媒体设备
├── opt //存放系统额外安装的软件
├── proc //它是一个虚拟目录,映射系统的内存信息,通常直接访问这个目录来获取系统信息。
├── root //超级用户主目录
├── run //一个临时文件系统,存储系统启动的信息,当系统重启时,这个目录下的文件会被删掉除。
├── sbin -> usr/sbin //存放系统管理员使用的可执行命令
├── srv //存放一些服务启动之后需要提取的数据(例如www服务启动后,数据就会存放在/srv/www内)
├── sys //存放sysfs文件系统,用户科通过访问这个目录,来查看内核驱动及设备等
├── tmp //存放临时文件
├── usr //用户的应用程序存放目录
└── var //存放系统执行过程中经常变化的文件(如:日志文件、登录文件、邮件文件等)

深入理解 linux 文件类型

符号链接设备

  1. linux 文件获取过程
    我们知道文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。元数据中有一个 inode 号(索引节点号),它的作用就是告诉计算机文件的真实数据存放在硬盘的哪个位置。inode 号才是文件的唯一标识,而文件名只是为了方便人们记忆和使用,统或程序通过 inode 号寻找正确的文件数据块。图 1.展示了程序通过文件名获取文件内容的过程。

文件读取流程

  1. 硬链接
    符号链接文件分为两种:硬链接和软链接。在一般情况下文件名和 inode 号是“一一对应”的关系。但是,Unix/Linux 系统允许多个文件名指向同一个 inode 号码。
    这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为”硬链接”(hard link)。

  2. 软链接
    就相当于 Windows 的快捷方式,软连接的内容是目标文件的绝对路径。一旦将文件删除,软连接就无法使用。

  3. 软链接和硬链接的区别

    • 硬链接

      1. 只能对已存在文件创建
      2. 不能跨文件系统
      3. 创建硬链接不会占用 inode 号和磁盘空间,会增加链接计数
      4. 不能对目录创建
      5. 删除文件时,会先删除硬链接,最后再删除文件
    • 软连接

      1. 有自己的文件属性及权限等
      2. 可以对不存在的文件进行创建
      3. 可以跨文件系统创建
      4. 可以对文件或目录进行创建
      5. 删除软链接不会对文件有影响,删除文件软链接将无法使用
      6. 创建软链接会占用 inode 号和磁盘空间,不会增加链接计数

块设备

应用程序可以随机访问设备数据,程序可自行确定读取数据的位置。硬盘是典型的块设备,应用程序可以寻址磁盘上的任何位置,并由此读取数据。此外,数据的读写只能以块(通常是512B)的倍数进行。与字符设备不同,块设备并不支持基于字符的寻址。

字符设备

提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。相反,此类设备支持按字节/字符来读写数据。举例来说,鼠标、键盘、调制解调器是典型的字符设备。

套接字文件

先举个简单的例子:电风扇中有各种零件(如扇叶,马达等),插座也是由各种零件组成,将插头插入插座对应的插孔才能使电风扇转起来,其中的插头和插座的插孔才是真正使电风扇转起来的东西。这个例子中的各个零件可以理解为网络中的 TCP/IP 协议栈,电风扇的插头和插座的插孔可以理解为 socket(套接字),其中的 socket 才是实现两个计算机互相通信的东西。

从上面的例子中可以了解到,Socket 跟 TCP/IP 协议没有必然的联系。socket(套接字)并不是一种协议,而是 TCP/IP 的一个编程接口。Socket 编程接口在设计的时候,就希望也能适应其他的网络协议,Socket 只是使得用 TCP/IP 协议栈更方便而已。套接字用(IP地址:端口号)表示,区分不同应用程序进程间的网络通信和连接,主要有3个参数:通信的目的 IP 地址、使用的传输层协议(TCP 或 UDP)和使用的端口号。

套接字分为三种,一个是监听套接字,在服务端负责一直监听着客户端是否有请求发来;一种是客户端套接字,负责与服务端建立联系并收发信息;最后一种是对等连接套接字,是在服务端和客户端负责收发信息。

命名管道文件

“|” 管道符号将数据从一个进程传输到另一个进程的操作。它使用户能简便地从一个命令输出数据到另一个命令,并筛选出想要的数据而无须写脚本进行选择、重新格式化等操作。

命名管道 和 “ | ” 的功能是一样的,它们的主要区别就是命名管道是以文件形式实实在在地存在于文件系统中的,命名管道的表现形式就是文件。但是与其它文件不同的是,命名管道文件似乎从来没有文件内容。即使用户往命名管道中写入大量数据,该文件看起来还是空的。这其实是因为命名管道的内容驻留在内存中而不是被写到硬盘上。

命名管道的作用:通过使用命名管道,用户可以创建一个进程写入管道并且另外一个进程读取管道的流程,而不用关心协调二者时间上的同步。

服务器搭建

Centos6 源码安装 zabbix4.0

安装环境

OS:CentOS6.5
zabbix:4.0.6
apche :2.2.15(1.3.12或以上)
mysql:5.1.73(5.0.3或以上 )
php:5.6(5.4.0或以上)

配置 LAMP

  1. 安装 httpd 和 mysql
1
2
3
4
[root@localhost ~]# yum -y install httpd mysql mysql-devel mysql-server
[root@localhost ~]# chown apache:apache /var/www/html
[root@localhost ~]# chkconfig httpd on
[root@localhost ~]# chkconfig httpd on
  1. 安装 php56
1
2
3
4
5
6
7
8
9
10
11
12
# 安装php56
[root@localhost ~]# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
[root@localhost ~]# rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm
[root@localhost ~]# yum install -y php56w php56w-opcache php56w-xml php56w-mcrypt php56w-gd php56w-devel php56w-mysql php56w-intl php56w-mbstring php56w-bcmath php56w-ldap

# 配置 php56(修改如下参数)
[root@192 ~]# vim /etc/php.ini
post_max_size = 16M
max_execution_time = 300
max_input_time = 300
date.timezone = PRC
always_populate_raw_post_data = -1
  1. 关闭防火墙和selinux
1
2
3
4
[root@localhost ~]# service iptables stop
[root@localhost ~]# service iptables disable
[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
[root@localhost ~]# reboot

安装 zabbix

  1. 创建用户
1
2
[root@localhost ~]# groupadd zabbix
[root@localhost ~]# useradd -g zabbix zabbix
  1. 配置安装目录
1
2
3
[root@localhost ~]# mkdir /usr/local/zabbix
[root@localhost ~]# mkdir /usr/local/zabbix/log
[root@localhost ~]# chown zabbix:zabbix /usr/local/zabbix
  1. 下载 zabbix-4.0.6 源码包
1
2
3
[root@localhost ~]# wget https://sourceforge.net/projects/zabbix/files/ZABBIX%20Latest%20Stable/4.0.6/zabbix-4.0.6.tar.gz
[root@localhost ~]# tar xvzf zabbix-4.0.6.tar.gz
[root@localhost ~]# yum install libxml2-devel net-snmp-devel libevent-devel curl-devel pcre*
  1. 安装 zabbix
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# 解压安装zabbix
[root@localhost ~]# cd zabbix-4.0.6
[root@192 zabbix-4.0.6]# ./configure --prefix=/usr/local/zabbix --enable-server --enable-agent --enable-proxy --with-mysql=/usr/bin/mysql_config --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2
[root@192 zabbix-4.0.6]# make install

# copy命令到系统命令存放处(方便调用)
[root@192 zabbix-4.0.6]# cp /usr/local/zabbix/sbin/* /usr/sbin/
[root@192 zabbix-4.0.6]# cp /usr/local/zabbix/bin/* /usr/bin/

# 配置mysql
mysql> create database zabbix character set utf8;
mysql> grant all on zabbix.* to zabbix@localhost identified by 'zabbix@qaz';
mysql> flush privileges;

# 导入配置文件
[root@192 zabbix-4.0.6]# cd database/mysql
[root@192 mysql]# mysql -u zabbix -pzabbix@qaz -h localhost zabbix < schema.sql
[root@192 mysql]# mysql -u zabbix -pzabbix@qaz -h localhost zabbix < images.sql
[root@192 mysql]# mysql -u zabbix -pzabbix@qaz -h localhost zabbix < data.sql



# 编辑配置文件
[root@192 mysql]# vim /usr/local/zabbix/etc/zabbix_server.conf
LogFile=/usr/local/zabbix/log/zabbix_server.log //日志文件存放的路径
PidFile=/usr/local/zabbix/zabbix_server.pid //pid文件存放的路径
DBHost=localhost //数据库服务器地址
DBName=zabbix //数据库名字
DBUser=zabbix //连接数据库的用户名
DBPassword=zabbix@qaz //连接数据库用户的密码
DBSocket=/var/lib/mysql/mysql.sock //指定连接mysql的socket,mysql配置的client sock文件路径
DBPort=3306 //数据库端口
Timeout=4 //超时时间
LogSlowQueries=3000 //慢查询记录的时间


# 启动zabbix_server
[root@192 mysql]# /usr/local/zabbix/sbin/zabbix_server -c /usr/local/zabbix/etc/zabbix_server.conf
[root@192 mysql]# netstat -nlutp |grep zabbix_server
tcp 0 0 0.0.0.0:10051 0.0.0.0:* LISTEN 17003/zabbix_server

# 添加启动脚本
[root@192 mysql]# cd ../../
[root@192 zabbix-4.0.6]# cp misc/init.d/fedora/core/zabbix_server /etc/init.d/
[root@192 zabbix-4.0.6]# cp misc/init.d/fedora/core/zabbix_agentd /etc/init.d/
[root@192 zabbix-4.0.6]# chmod +x /etc/init.d/zabbix_server
[root@192 zabbix-4.0.6]# chmod +x /etc/init.d/zabbix_agentd
[root@192 zabbix-4.0.6]# chkconfig --add zabbix_server
[root@192 zabbix-4.0.6]# chkconfig --add zabbix_agentd
[root@192 zabbix-4.0.6]# chkconfig zabbix_server on
[root@192 zabbix-4.0.6]# chkconfig zabbix_agentd on

[root@192 zabbix-4.0.6]# vim /etc/init.d/zabbix_server //编辑服务端配置文件
BASEDIR=/usr/local/zabbix/ //zabbix安装路径
PIDFILE=/usr/local/zabbix/$BINARY_NAME.pid //pid文件路径

[root@192 zabbix-4.0.6]# vim /etc/init.d/zabbix_agentd //编辑客户端配置文件
BASEDIR=/usr/local/zabbix/ //zabbix安装路径
PIDFILE=/usr/local/zabbix/$BINARY_NAME.pid //pid文件路径

# 测试
[root@192 zabbix-4.0.6]# /etc/init.d/zabbix_server start
Starting zabbix_server: [ OK ]
[root@192 zabbix-4.0.6]# /etc/init.d/zabbix_agentd start
Starting zabbix_agentd: [ OK ]

# 开始配置web界面
[root@192 zabbix-4.0.6]# cp -a /root/zabbix-4.0.6/frontends/php/* /var/www/html/zabbix/

zabbix web设置

zabbix.png

zabbix-1.png

zabbix-2.png

zabbix-3.png

zabbix-4.png

zabbix-5.png

zabbix-6.png

zabbix-7.png

reference

Unix传奇(上篇)

Unix传奇(下篇)

Linux目录结构及详细介绍

【转】/mnt /media /dev 目录区别

linux /sys目录下的各个子目录说明

为什么应该在 Linux 上使用命名管道

socket编程到底是什么?

搞懂Linux下的几种文件类型

Linux字符设备与块设备的区别与比较

理解Linux操作系统中的块设备

理解 Linux 的硬链接与软链接

理解Linux文件系统之inode

套接字详解(socket)

一篇搞懂TCP、HTTP、Socket、Socket连接池

Linux 管道pipe的实现原理

Linux chattr命令详解:修改文件系统的权限属性

CentOS7安装部署ELK

zabbix–4.0源码安装

CentOS 6.x 上如何升级php

Centos 6/7 升级 PHP 5.6 到 7.1/7.2

  • 本文标题:linux 学习笔记
  • 本文作者:9unk
  • 创建时间:2020-03-31 21:36:51
  • 本文链接:https://9unkk.github.io/2020/03/31/linux-xue-xi-bi-ji/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!