Linux系统管理员成长经验之工作心得
2009-09-26 15:55:10 Administrator

随着Linux应用的扩展许多朋友开始接触Linux,根据学习Windwos的经验往往有一些茫然的感觉:不知从何处开始学起。作为一个 Linux系统管理员,我看了许多有关Linux的文档和书籍,并为学习Linux付出了许多艰苦的努力。当真正获得了一份正式的Linux系统管理工作 后,我更加深刻地理解了Linux的灵魂:服务与多用户。Linux系统知识是非常广博的,但是只要掌握了重点知识,管理它并没有想象中的那么可怕。在下 面我会将作为系统管理员的一些工作心得和总结出来的经验系统地介绍给大家。

一、 学习的目的
通过Linux的学习掌握UNIX 的目的想必不用多说了,在这个网络人才身价倍增的年代,想靠技术吃饭又不想掌握网络和编程技术是不明智的。当一人第一次听说Linux并跃跃欲试的时候, 总会提出几个?,它是什么(What)? 为什么要用它(Why)? 怎样学习它(How)?做为开放源码运动的主要组成部分,Linux的应用越来越广泛,从我们平时的娱乐、学习,到商业、政府办公,再到大规模计算的应 用。为了满足人们的需求,各种各样的、基于Linux的应用软件层出不穷。只要具备了Linux的基本功,并具有了自学的能力之后,都可以通过长期的学习 将专项内容予以掌握。

二、 从命令开始从基础开始
常常有些朋友一接触Linux 就是希望构架网站,根本没有想到要先了解一下Linux 的基础。这是相当困难的。虽然Linux桌面应用发展很快,但是命令在Linux中依然有很强的生命力。Linux是一个命令行组成的操作系统,精髓在命 令行,无论图形界面发展到什么水平这个原理是不会变的,Linux命令有许多强大的功能:从简单的磁盘操作、文件存取、到进行复杂的多媒体图象和流媒体文 件的制作。这里笔者把它们中比较重要的和使用频率最多的命令,按照它们在系统中的作用分成几个部分介绍给大家,通过这些基础命令的学习我们可以进一步理解 Linux系统:
●安装和登录命令:login、shutdown、halt、reboot 、mount、umount 、chsh
●文件处理命令:file、mkdir、grep、dd、find、mv 、ls 、diff、cat、ln
●系统管理相关命令:df、top、free、quota 、at、lp、adduser、groupadd、kill、crontab、tar、unzip、gunzip、last
●网络操作命令:ifconfig、ip、ping、netstat 、telnet、ftp、route、rlogin、rcp、finger、mail、nslookup
●系统安全相关命令:passwd、su、umask 、chgrp、chmod、chown、chattr、sudo、ps、who

三、 选择一本好的Linux书籍
无 论在论坛还是读者反馈中,我们看到最多的问题往往是某个新手,在安装或使用linux的过程中遇到一个具体的问题就开始提问,很多都是重复性的问题,甚至 有不少人连基本的问题描述都不是很清楚。这说明很多初学linux的人还没有掌握基本功。怎样才能快速提高掌握linux的基本功呢? 最有效的方法莫过于学习权威的linux工具书,工具书对于学习者而言是相当重要的。一本错误观念的工具书却会让新手整个误入歧途。目前国内关于 linux的书籍有很多不过精品的不多,笔者强烈建议阅读影印本的“o'reilly原版linux图书”,而且出版社还提供了一个非常好的路线图:见下图。



四 、养成在命令行下工作
一 定要养成在命令行下工作的习惯,要知道X-window只是运行在命令行模式下的一个应用程序。在命令行下学习虽然一开始进度较慢,但是熟悉后,未来的学习之路将是以指数增加的方式增长的。从网管员来说,命令行实际上就是规则,它总是有效的,同时也是灵活的。即使是通过一条缓慢的调制解调器线路,它也能操纵几千公里以外地远程系统。

五、用Unix思维思考Linux
由于Linux是参照Unix的思想来设计的,理解和掌握它就必须以Unix的思维来进行,而不能以Windows思维。不可否认,Windows 在市场上的成功很大一部分在于技术思想的独到之处。可是这个创新是在面对个人用户的前提下进行的,而面对着企业级的服务应用,它还是有些力不从心。多年来 在计算机操作系统领域一直是二者独大:unix在服务器领域,Windows在个人用户领域。由此可见,用户需求决定了所采用的操作系统。不管什么原因, 如果要学习Linux,那么首先要将思维从Windows的“这个小河” 中拖出来,放入Unix的海洋。

六 、学习shell
对 于Shell(中文名称壳),习惯Windows的读者肯定是非常陌生的,因为Windows只有一个“Shell”(如果可以说是Shell的话),那 就是Windows自己。用一句话容易理解的解释就是,shell是用户输入命令与系统解释命令之间的中介。最直观的说法,一种Shell有一套自己的命 令。举一个容易理解的例子,Linux的标准Shel是Bash Shel;Solaris的shell是B shell;Linux的Shell是以命令行的方式表现出来的。读者可能会不理解,Windows从命令行“进化”到了图形界面,那么Linux现在还 使用命令行岂不是一种倒退?
当初我刚刚接触Linux时就曾有过这种想法。可是后来发现,如果使用图形界面,那么分配给应用软件的资源就少了,在价格昂贵的服务器上,能够以较低的硬件配置实现同样的功能是非常重要的。下面举例说明,一台服务器有1GB内存,假设其中512MB用于处理图形界面,若要安装一个需要784MB内存的数据库软件,惟一的办法就是扩大内存。但是如果使用命令行,系统可能只需要64MB内存,其它的内存就可以供数据库软件使用了。使用命令行,不仅是内存,而且CPU及硬盘等资源的占用都要节省很 多。所以,作为服务器使用命令行是优点而不是缺点。既然Shell有这么多优点,就必须要学习它。

七、勤于实践
要增加自己 Linux 的技能,只有通过实践来实现了。所以,赶快找一部计算机,赶快安装一个 Linux 发行版本,然后进入精彩的Linux世界。相信对于你自己的 Linux 能力必然大有斩获。此外,人脑不像计算机的硬盘一样,除非硬盘坏掉了或者是资料被你抹掉了,否则储存的资料将永远而且立刻的记忆在硬盘中。在人类记忆的曲 线中,你必须要不断的重复练习才会将一件事情记得比较熟。同样的,学习 Linux 也一样,如果你无法经常学习的话,学了后面的,前面的忘了。你对Linux命令熟悉后你可以开始搭建一个小的Linux网络,这是最好的实践方法。Linux是网络的代名词,Linux网络服务功能非常强大,不论是邮件服务器、Web服务器、DNS服务器等都非常完善。当然你不需搭建所有服务,可以慢慢来。需要说明的是这个Linux网络对于初学者有两三台计算机即可。自己多动手,不要非要等着别人帮你解决问题。

八、学会使用文档
和 私有操作系统不同,各个Linux的发行版本的技术支持时间都较短,这对于Linux初学者是往往不够的。其实当你安装了一个完整的Linux系统后其中 已经包含了一个强大的帮助,只是可能你还没有发现和使用它们的技巧。主流Linux发行版都自带非常详细的文档(包括手册页和FAQ),从系统安装到系统 安全,针对不同层次的人的详尽文档,仔细阅读文档后40%问题都可在此解决。查阅经典工具书和Howto,特别是Howto是全球数以万计的 Linux、Unix的经验总结非常有参考价值通常40%的问题同样可以解决。安装一个新的软件时先看README,再看INSTALL然后看FAQ,最 后才动手安装,这样遇到问题就知道为什么。如果说明文档不看,结果出了问题再去论坛来找答案反而浪费时间。当查找文档时, 一定要看文档是在何种版本、何种环境及何种状态下出现的何种结果。对于文档的有效性, 一时还无法在操作前就知道结论如何,那么对某个专题或问题,阅读相关的多篇文章将会节省大量的时间,还可以保证尽量“干净”的环境,有效避免因为不同操作 所造成的更多问题。操作时要仔细核对各个步骤及输出的结果,尽量保持与文档一致。

九、在Linux论坛获取帮助
如果上面的措施没 有解决问题,此时你就需要Linux社区的帮助了。需要说明的是你要有周全的思考,准备好你的问题,不要草率的发问,否则只会得到到草率的回答或者根本得不到任何答案。越表现出在寻求帮助前为解决问题付出的努力,你越能得到实质性的帮助。最好先搜寻一下论坛是否有您需要的文章。这样可以获得事半功倍的效果。你需要提供精确有效的信息。这并不是要求你简单的把成吨的出错代码或者数据完全转储摘录到你的提问中。如果你有庞大而复杂的测试条件,尽量把它剪裁得越小越好。可能你会遇到这种情况,对于一个问题会出现不同内容回答,这时你需要通过实践来验证。另外把这个问题放在其他Linux社区请求帮助也是一种选择。如果得不到答案,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。这时换一个社区是不错的选择。

十、学习专业英文
如果你想深入学习Linux,看不懂因为文档实在是太难了。写的最好的,最全面的文档都是英语写的,最先发布的技术信息也都是用英语写的。即便是非英语国家的人发布技术文档,也都首先翻译成英语在国际学术杂志和网络上发表。通过man、info等命令,可以从在线帮助中快速地获得所需要的命令和操作方法。不要害怕海量的系统帮助,仔细阅读几个man或info文档就会发现,这 些帮助几乎都按照固定格式写成一命令名称、参数、参数说明、使用例子、参考等。当英语成为一种习惯,就会自觉地查找或订阅互联网上感兴趣的英文材料。这样在不知不觉中就已经和世界同步。

十一、在社区共享你的经验
随着Linux应用的扩展,出现了不少Linux社区。随着知识的不断积累,就可以把自己动手解决一些前人没有遇到的问题写出文档在网络上共享给其他读者。这个时候,也就成为了一名“高手”。Linux的使用者一般都是专业人士,他们有着很好的电脑背景且愿意协助他人,Linux高手更具有鼓励新手的文化精神。

这里附上笔者的Linux学习的路线图(roadmap):
●了解Linux 的基础知识,这些包含了用户管理、群组的概念、权限的观念等;
●掌握至少50个以上的常用命令;
●掌握.tgz、.rpm等软件包的常用安装方法
●学习添加外设,安装设备驱动程序(比如网卡)
●熟悉Linux文件系统和目录结构
●掌握vi,gcc,gdb等常用编辑器,编译器,调试器 。
●理解shell别名、管道、I/O重定向、输入和输出以及shell脚本编程。
●网络的基础包括:掌握路由概念、OSI七层网络模型、TCP/IP模型及相关服务对应的层次对于Linux学习非常重要的。然后学习Linux环境下的组网。

在很多国内的自由Linux论坛上可以发现有很多Linux爱好者提出的各种各样的问题。其中包括Linux安装、故障解决、用户管理等等问题。在这些问题当中,最突出的就有如何成为一名合格的Linux系统管理员,还有就是成为一名Linux系统管理员都需要具备什么样的基本条件。尽管目前使用Linux的朋友很多,可是真正能有条件用Linux来构造网络并提供网络服务的人并不多,大多数Linux爱好者是在校大学生和一些从WINDOWS投入Linux怀抱的初学者。成为一名合格的Linux系统管理员我想是很多Linux爱好者的梦想。下面笔者就来简要的谈谈如何成为一名合格的Linux系统管理员。

如果你无法熟练地操作 Linux,基本上等于少了一半的功力,也少了一半的机会。越是高薪工作,对操作底层原理的考量越明显。可是很多人在学习过程中很容易迷路,主要有下面两个原因:
1).操作系统涉及方方面面的知识,包括数据结构与算法、计算机组成原理、网络协议、编译原理等等 CS 专业的硬核知识,可以说是最复杂的软件系统;
2).理解操作系统更需要理论与实践深度结合,很多具体的编程问题,比如并发、网络编程、性能调优等等,都需要你理解操作系统的工作原理。

十二、运维所要管理的系统软件主要有哪些

系统软件主要有以下4类,分别是,1:操作系统软件,2:语言处理软件,3:数据库管理软件,4:其他辅助程序软件。


计算机软件分为应用软件和系统软件两大类,Office等都是应用软件,操作系统等支撑应用软件的软件为系统软件。所以系统软件是管理和控制计算机各种独立硬件和支持应用软件开发和运行的软件。不仅操作系统软件是系统软件,还有语言处理软件、数据库管理软件和辅助程序软件都是系统软件,下面分别介绍:

1:操作系统软件
操作系统软件是计算机系统软件的核心,是计算机最底层的软件,所有的硬件资源都直接与操作系统打交道,是计算机硬件裸机和应用程序之间连接到纽带,是最重要的系统软件之一。比如Windows、Linux操作系统都是这类软件。

2:语言处理软件
语言处理软件是将应用软件翻译成计算机能识别的语言,应用软件通常都是由高级语言编写,而这些成千上万条由高级语言编写的程序,计算机CPU必须由语言处理软件转换为计算机能直接读取的机器语言才能运行应用软件。比如汇编语言编译器、C语言编译器等都是这类软件。

3:数据库管理软件
数据库管理软件是将大量数据有组织、动态的存储起来,方便查阅和检索。操作系统需要提供管理和维护数据库的辅助环境。比如PostgreSQL、Oracle、MySQL等都是这类软件。

4:辅助程序软件
除了以上三种,辅助程序软件也归为系统软件,系统辅助处理程序软件通常提供调试程序、辅助管理、运维监控等功能。

系统软件是管理计算机硬件资源和支持应用软件开发或运行的软件,主要有操作系统软件、语言处理软件、数据库管理软件和辅助程序软件4类。

十三、作为运维有什么诀窍吗

在进做IT运维行业前,一定要做好心理准备,这并不是一个轻松的工作,工作中的事情多而又杂,除了坚持,需要懂得东西很多。下面分享一下这十年来对运维的一点看法:

运维职业现状

国内人才紧缺,特别是互联网公司。小公司的运维工作强度大,负责事情较多,基本上服务器沾边的工作都是运维的职责。大公司的运维分工细,人才要求较高。但国内大多数来自培训机构的运维人才都处于一个相对较低的层次,他们会写脚本,会做一些基础工作,但基本上都是照葫芦画瓢,看文档,找参考,而没有去挖掘底层或者更上层的东西。

运维工作

需要随时随地待命,有故障需要立马解决,服务器宕机带来的损失是非常巨大的,能在越短的时间修复越好;
项目上线、维护、更新基本上会选择凌晨,要有心理准备;
运维工程师需要和开发工程师沟通协作,必要时指出合理的建议。
由此可见,运维需要有一颗强大的心脏和一个强壮的身体,还需要有与人沟通协助的技巧。

运维的晋升空间

总体上运维分四条线:
1.应用运维;2.运维开发;3.系统运维;4.DBA。

各线之间方向不同,但又密不可分。每条线都有自己深度,初级、中级、高级和资深的进阶过程,架构师是深度加广度。基础的运维实际上相对简单,做好的前提下才能考虑更长远的发展。

运维各阶段的必备技能

作为一个公司的基础运维,想要得到晋升,加深技术的深度是必要的,这是技能升级必经之路。

初级:
Linux基础与命令:这是刚需,比如操作系统基础知识、熟悉Vi编辑器等。不会这个就没有然后了。
基础服务:如DNS、Postfix、Nginx、FTP、NTP、MFS这一部分需要达到熟练,能够理解原理最好。
硬件:毕竟做运维,经常需要和服务器打交道,硬件知识是必不可少。

中级:
运维平台工具:比如Nagios、Zabbix、Puppet、ansible等。这一部分可以提高不少效率和便利。
数据库:熟悉常见的数据库,基本安装配置,基础sql的DDL、DML操作。
脚本语言:Shell言语是必须的。

高级:
Linux内核:这一部分用于修炼内功,要有一定的C语言功底。
网络:熟悉TCP/IP协议,熟练使用tcpdump,对故障分析、系统优化帮助非常大。
安全:熟练掌握iptables配置,熟悉SELinux。安全对运维可以说至关重要。

资深:
需要往技能广度上去了,大数据、虚拟化、云计算、分布式等得深挖。

运维必知的管理方式

运维由于事情杂而多,并且打交道的部门也多,工作很容易受到外界的影响。需要有良好的时间管理方式,才能高质高效的做好每一件事。但是作为基础运维的时候,总有需要同时兼顾工作、生活和进修。从菜鸟开始,就要学会把自己从加班中抽离,学会使用必备的远程工具来应急。总之,运维要懂的知识技能范围很广,要经常整理和记录在平时用到的工具、遇到的状况,多写写技术博客来总结。


来看看鸟哥(《鸟哥的Linux私房菜》的作者)为初学者提供的学习建议:


1、从头学习Linux基础

鸟哥希望大家能够更了解Linux,好让它可以为你做更多的事情,而且这些基础知识是学习更深入的技巧的必备条件,因此建议:

1.计算机概论与硬件相关知识
因为既然想要走Linux这条路,信息技术相关的基础技能也不能没有,所以先理解一下基础的硬件知识,不用一定要全懂。又不是真的要你去组装计算机,但是至少要“听过、有概念”即可。

2.先从Linux的安装与命令学起
没有Linux怎么学习Linux?所以好好地先安装一个你需要的Linux吧!虽然说Linux发行版很多,不过基本上架构都是大同小异,差别在于界面的亲和力与软件的选择不同罢了。选择一个你喜欢的就好,倒是没有哪一个特别好这一说。

3.Linux操作系统的基础技能
这些包含了“用户、用户组的概念”、“权限的观念”、“程序的定义”等,尤其是权限的概念,由于不同的权限设置会影响你的用户的便利性,但是太过于便利又会导致入侵的可能,所以这里需要了解一下你的系统。

4.务必学会vi文本编辑器
Linux的文本编辑器多到会让你数到生气,不过,vi却是强烈建议要先学习的,这是因为vi会被很多软件所调用,加上所有的UNIX-like系统上面都有vi,所以你一定要学会才好。

5.Shell与Shell脚本的学习
其实鸟哥上面一直谈到的“命令行模式”说穿了就是一个名为Shell的软件。既然要玩命令行模式,当然就是要会使用Shell的意思。但是Shell上面的知识太多了,包括“正则表达式”、“管道命令”与“数据流重定向”等,真的需要了解比较好。此外,为了帮助你未来的管理服务器的便利性,Shell脚本也是挺重要的,要学!

6.一定要会软件管理
因为玩Linux常常会面临到要自己安装驱动程序或是安装额外软件的时候,尤其是嵌入式设备或是学术研究单位等。这个时候了解Tarball、RPM、DPKG、YUM、APT等软件管理的安装方式,对你来说就非常重要。

7.网络基础的建立
如果上面你都通过了,那么网络的基础就是下一阶段要接触的东西,这部分包含了“IP概念”、“路由概念”等。

8.如果连网络基础都通过了,那么网站的搭建对你来说,简直就是“太简单”。
在一些基础知识上,可能的话当然得去书店找书来读。如果您想要由网络上面阅读的话,那么这里推荐一下由Netman大哥主笔的Study-Area里面的基础文章,相当实用。
计算机基础
网络基础

2、选择一本易读的工具书

正所谓:“好的书本带你上天堂、坏的书本让你穷瞎忙。”一本好的工具书是需要的,不论是未来作为查询之用,还是在正确的学习方法上。可惜的是,目前坊间的书大多强调速成的Linux教育,或是强调Linux的网络功能,却欠缺了大部分的Linux基础管理,鸟哥在这里还是要再次强调,Linux的学习历程并不容易,它需要比较长的时间来适应、学习与熟悉,但是只要能够学会这些简单的技巧,这些技巧却可以帮助您在各个不同的操作系统之间遨游。

您既然看到这里,应该是已经取得了《鸟哥的Linux私房菜基础学习篇》了吧!希望这本书可以帮助您缩短基础学习的历程,也希望能够带给您一个有效的学习观念。而在这本书看完之后,或许还可以参考一下Netman推荐的相关网络书籍

不过,要强调的是,每个人的阅读习惯都不太一样,所以,除了大家推荐的书籍之外,您必须要亲眼看过该本书籍,确定您可以吸收得了书上的内容,再去购买。其实鸟哥买科技类书籍比较喜欢买基础书,因为基础学好了,其他的部分大概找个关键词,再去搜索引擎搜索一下,一大堆数据就可以让你去分析判断。你会说,既然如此,那基础书籍内的项目不是搜索就是一大堆?不要忘记“最开始你是要用什么关键词去搜索的?”。所以,阅读基础书籍的重点,就是让自己能够掌握住那些关键词。

3、实践再实践

要增强自己的体力,就只有运动;要增加自己的知识,就只有读书。当然,要提高自己对于Linux的认识,大概就只有实践经验了。所以,赶快找一台计算机,安装一个Linux发行版,然后快点进入Linux的世界里面晃一晃,相信对于你自己的Linux能力必然大有斩获。除了自己的实践经验之外,也可以参考网络上一些善心人士整理的实践经验分享,例如最有名的Study-Area等网站。

此外,人脑不像计算机的硬盘,除非硬盘坏掉了或是数据被你抹掉,否则存储的数据将永远而且立刻记忆在硬盘中。在人类记忆的曲线中,你必须要“不断的重复练习”才会将一件事情记得比较熟。同样的,学习Linux也一样,如果你无法经常摸索的话,那么,抱歉的是学了后面的,前面的忘光光,学了等于没学,这也是为什么鸟哥当初要架设“鸟哥的私房菜”这个网站的主要原因,因为,鸟哥的忘性似乎比一般人还要大,所以,除了要实践之外,还得要常摸,才会熟悉Linux而且不会怕它。

鸟哥上课时,常常有学生问到:“老师,到底要听过你的课几次之后,才能学的会?”鸟哥的标准答案是:“你永远学不会”,因为你是用“听”的,没有动手做,那么永远不会知道“经验”两个字怎么写。很多时候计算机或网络都会有一些莫名其妙的突发情况,没有实际碰触过,怎么可能会理解?所以“永远是不可能听会的”,为啥要实验?因为实验过后你才会有经验,否则实验结果课本都有。不是背一背就好了,干嘛实验?浪费钱吗?

4、发生问题怎么处理

我们是人不是神,所以在学习的过程中发生问题很常见。重点是我们该如何处理在自身所发生的Linux问题?在这里鸟哥的建议这样的学习流程:

1.在自己的主机/网络资料库上查询HowTo或FAQ
其实,在Linux主机及网络上面已经有相当多整理出来的FAQ。所以,当你发生任何问题的时候,除了自己检查,或到上述的实践网站上面查询一下是否有设置错误的问题之外,最重要的当然就是到各大FAQ的网站上查询。以下列出一些有用的FAQ与HowTo网站可参考一下,Linux自己的文档:/usr/share/doc(在阁下的Linux系统中)。

上面比较有趣的是那个TLDP(The Linux Documentation Project),它几乎列出了所有Linux上面可以看到的文献数据,各种HowTo的做法等,虽然是英文,不过很有参考价值。除了这些基本的FAQ之外,其实,还有更重要的问题查询方法,那就是利用Google帮您去查找答案。在鸟哥学习Linux的过程中,有什么奇怪的问题发生时,第一个想到的,就是去搜索引擎查找是否有相关的信息。举例来说,我想要找出Linux下面的NAT,只要在上述的搜索引擎网站内,输入Linux跟NAT,立刻就会显示一大堆资料,真的相当的优秀好用。您也可以通过搜索引擎来找鸟哥网站上的数据。

2.注意信息输出,自行解决疑难杂症
一般而言,Linux在执行命令的过程当中,或是log file(日志文件)里面就可以自己查得错误信息,举个例子来说,当你执行:
# ls -l /vbird

由于系统并没有 /vbird 这个目录,所以会在屏幕前面显示:
ls: /vbird: No such file or directory

这个错误信息够明确了吧!系统很完整地告诉您“查无该数据”。所以,请注意,发生错误的时候,请先自行以屏幕前面的信息来进行 debug(除错)的操作,然后,如果是网络服务的问题时,请到/var/log/这个目录里面去查看一下log file(日志文件),这样可以几乎解决大部分的问题。

3.查找过后,注意网络礼节,讨论区大胆的发言
一般来说,如果发生错误现象,一定会有一些信息对吧!那么当您要请教别人之前,就得要将这些信息整理整理,否则网络上人家也无法告诉您解决的方法,这一点很重要。

万一经过了自己的查询,却找不到相关的信息,那么就发问吧!不过,在发问之前建议您最好先看一下“提问的智慧”这一篇讨论,然后可以到下面几个讨论区发问看看。不过,基本上去每一个讨论区回答问题的熟手,都差不多是那几个,所以,您的问题“不要重复发表在各个主要的讨论区。”举例来说,鸟园与酷学园讨论区上的朋友重复性很高,如果您两边都发问,可能会得到反效果,因为大家都觉得,另外一边已经回答您的问题了。

4.Netman大大给的建议
此外,Netman兄提供的一些学习的基本方针,提供给大家参考:
有系统地设计文件目录,不要随便到处保存文件以至于以后不知道放哪里了,或找到文件也不知道为何物。
养成一个做记录的习惯。尤其是发现问题的时候,把错误信息和引发状况以及解决方法记录清楚,同时最后归类及定期整理。别以为您还年轻,等再多弄几年计算机,您将会非常庆幸有此习惯。
如果在网络上看到任何好文章,可以为自己留一份备份,同时定好题目,归类存盘。(鸟哥注:需要注意知识产权)。
作为一个用户,人要迁就机器;做为一个开发者,要机器迁就人。
学写脚本的确没设置服务器那么好玩,不过以我自己的感觉是:关键是会得“偷”,偷了会得改,改了会得变,变则通矣。
在Windows里面,设置不好设备,您可以骂它;在Linux里面,如果设置好设备,您得要感激它。

以上回答来自《鸟哥的Linux私房菜 基础学习篇》一书。

这本书确实是为Linux新手所写的,里面包含了鸟哥从完全不懂Linux到现在的所有历程。因此,如果您对Linux有兴趣,那么这本书理论上应该是可以符合您的需求。由于Linux的基本功比较无聊,因此很多人在第一次接触就打退堂鼓了,非常可惜!您得要耐得住性子,要有刻苦耐劳的精神,才能够顺利地照着本书的流程阅读下去。

由于操作系统非常难,因此Linux并不好学。而且操作系统每个部分都是息息相关的,不论哪本书籍,章节的编排都很伤脑筋。建议您使用本书时,看不懂或者是很模糊的地方,可以先略过去,全部的文章都看完之后,再从头仔细地读一遍并做一遍,相信就能够豁然开朗起来。此外,“尽信书不如无书”,只读完这本书,相信您一定不可能学会Linux,但如果照着这本书里面的范例实践过,且在实作时思考每个指令动作所代表的意义,并且实际自己去学习过在线文档,那么想不会Linux都不容易啊!这么说,您应该清楚如何学习了吧?没错,实践与观察才是王道。


要成为一名合格的Linux管理员,一般来说都要懂得如下几点规则:

规则1:了解Linux的一切。首先,在了解以下规则之前,笔者必须向大家说明的是,即使最基本的Linux系统管理员都是要经过不断的学习和长时间实践才能真正了解整个 Linux操作系统和网络的。如果您还是一名刚刚入门的Linux新手或者对Linux了解不多,在这样的情况下如果要成为一名合格的Linux系统管理员,那么笔者建议您先花点时间和耐心学习和了解清楚Linux,如果您对Linux有足够的了解,能够像操作WINDOWS那样熟悉Linux了,那就可以进一步学习,去实现一个合格的Linux系统管理员的梦想了。

规则2:如果您不能真正的了解Linux的一切,那最少要知道如何才能找到,在哪里才能找到您所需要的Linux信息和知识。一般来说,作为Linux系统管理员,您至少有几本比较全面的Linux工具书,其中最好包括 Linux安装,Linux网络配置,Linux系统分析,Linux使用大全之类的原版工具书。国内大多数的Linux工具书为翻译外国的。在这里也向 大家推荐基本比较好的工具书,尽供您参考选购:《RED HAT 6 大全》此书内容翔实,涉及领域广泛,并且提供了详细的例子和大量的参考资料,包括书籍,光盘和电子文档和INTERNET站点,是一本学习,使用和管理 Linux的较好工具书。适合Linux中级用户。

《Linux常用技术大全》--电子工业出版社出版 ISBN 7-5053-5460-2此书摘录了Linux文档项目中的上千页资料,提供了Linux操作系统的综合信息。本书符合各种计算机用户使用。中级用户可以通过此书更加深入的了解和利用Linux。高级用户可以将此书作为使用Linux操作系统的高级参考手册。

有了以上这些工具书也许并不能完全满足一个系统管理员的需要,毕竟没有一本书是完全能概括Linux的全部的。这时需要学会如何从一大堆的书籍和资料中查找到您需要的知识和信息。另外需要指出的是,由于世界上有很多种Linux发行版本,每一种Linux发行版本的操作和使用甚至参数配置文件都不尽相同,所以建议大家在购买,下载Linux发行版本的时候注意购买该版本的官方版的资料和参考书籍,以方便今后管理系统之用。

规则 3:如果您无法从各种渠道获取您所需要的信息,请试着用自己的方法来解决问题。不是所有的Linux故障书籍上都有解答,也许这些您遇到的希奇古怪的问题别人也无法回答,这时候就需要自己动手动脑来研究解决了。最后建议您在Linux自由论坛上公布您遇到的问题和解决方案,以方便别人在遇到同类问题的时候无需花费太多的精力来解决。

规则4:随时准备一本便于携带的Linux系统用户参考手册,您在旅途中,在等公共汽车的时候,在任何空 闲的时间来阅读。这可是国外一名资深的Linux系统管理员的成功经验。他说他在学习Linux的时候每天都要花上2-3个小时的空闲时间来仔细阅读各种 Linux命令,来研究Linux的安全问题。毕竟Linux是一个正在发展的操作系统,如果没有足够的时间对它的方方面面进行研究的话,很难成为一名 优秀的Linux系统管理员。

除了以上这些学习Linux的门道之外,成为一名合格的Linux系统管理员更重要的是要掌握很多技巧和专业知识。

技巧1:熟悉TCP/IP和Linux提供的各种网络服务,如DNS,SMTP,UDP,HTTP,FTP,POP3等等。以及要知道Linux程序,Linux平台下软件的安装,调试和维护。总之,和Linux有关的知识懂得越多越好。

技巧2:如果可以的话,最好能熟悉尽可能多的操作系统。这一点很重要,很多朋友也许认为作为一名Linux系统管理员只有精通Linux就可以了。事实上 Linux提供了网络服务,很多其他的操作系统都有可能作为客户端,所以作为Linux系统管理员,有时候您不得不需要解决Linux和其他的操作系统之间的通讯,安全等问题。一般,熟悉微软的WINDOWS系列操作系统不难,重要的是我们应该对Solaris,Linux,IRIX,HPUX,PPC等 系统及其硬件平台都要有所了解。

技巧3:熟悉网络,网络理念和硬件。操作系统是管理整个计算机硬件的最大的程序,Linux也不例外。无论是台式PC还是笔记本电脑,甚至是大型的网络服务器,Linux都能对其进行很好的管理。这就要求Linux系统管理员要熟悉Linux所控制的硬件平台,因为只有这样才能很好的发挥计算机硬件的最大优势。其实,如果Linux不是用来提供网络服务,那就是极大的浪费了,大家都知道Linux要比微软的操作系统稳定、安全。要记住,Linux能提供一整套很完整的网络服务,如果您在商业公司作一名Linux系统管理员,那么您必须要对网络及其网络理念有清楚的认 识,能够独立完成整个网络和网络服务的配置工作。

技巧4:备份系统和文件恢复。这是Linux系统管理员最重要的工作之一。每天对Linux系统和重要文件进行备份是一名有责任心的Linux系统管理员必须做的工作。事实上,对Linux系统和文件进行备份无论从硬件还是软件技术上目前都没有什么太大的问题,问题往往出现在系统管理员忘记备份文件或者抱着侥幸的心理,一旦您的Linux服务器受到攻击,文件损失殆尽,那么您就无法恢复原有文件,一切损失的责任也只能由您负责了。选用Linux中的定期备份软件和好的备份磁盘磁带都能为您节省不少备份的时间。只要您做到经常,定期备份数据,那么即使 Linux服务器出了再大的问题,一切都能恢复原样的。

技巧5:掌握好一门脚本语言。大家都知道很多Linux软件的安装都是通过脚本语言来进行的。BASH和PERL是不错的选择。掌握脚本语言另外一个很大的优势就在于能读懂其他Linux程序员的程序和开发构想,也能方便您在需要的时候修改别 人的程序。Perl语言功能强大,学习起来也比较容易。

技巧6:注意Linux的安全问题。这也是Linux当中最复杂,最富有挑战性的话题了。同时,Linux的安全问题也给Linux系统管理员很大的压力。我认为,安全性实际上取决于用户遵循某种策略的自觉性,安全性措施在很多操作系统上和许多公司中造成了冲突。用户需要完成他们的工作,系统管理员需要把不合理的请求拒之于系统之外;公司管理部门需要保守公司的机密,在许多方面,安全性是最难 取得用户配合的领域,但是实际上这是最重要的领域。

对于Linux系统管理员来说,我可以提供的一个忠告就是:“最好的用户也只是根据您所遵循的策略去做,如果您有忽视安全性的坏习惯,他们就只能更糟糕。”从另外一个方面来说,人们通常提出要求显示或者查看最底层的消息,这超出了系统管理员的职责范围,应友好的指出并做改进。与此同时,要极力阻止那些企图通过Linux后门进入系统的黑客。由于Linux的安全问题覆盖的范围很广泛,限于篇幅,在 这里也就无法进行谈论了。

有人曾经说过,点滴知识就能获得长久的应用。这句话对于那些想成为或者已经成为了一名Linux系统管理员是再合适不过的了。具体来说,可以从以下方面展开:

1、了解开源历史、Linux系统的种类及优势特性、Linux运维工程师的职责。了解红帽公司及红帽系的系统,安装部署虚拟机、搭建虚拟机实验环境系统。简单熟悉常用的Linux系统命令及内核原理,理解RPM、Yum及守护进程机制理论,及RPM软件包与源码安装的区别、并能够理解它们的优缺点。

2、学习Linux系统内核与BASH解释器的关系与作用,了解Linux系统中命令的执行及排错方法。学习用于日常工作、系统管理、工作目录切换、文本文件管理、用户与组管理、打包压缩及文件搜索等数十个常用命令,并通过实战演练将这些命令与参数灵活搭配,让任务完成更加准确,日常的工作更加的自动化。

3、Linux系统命令,掌握Shell脚本原理及作用,搞清环境变量的作用。学习如管道符、输入输出重定向、命令通配符等Shell语法规则并学习Vim编辑器。了解Linux系统执行命令后的原理机制,学习Linux系统中各种重要的环境变量,尤其是PATH变量。

4、学习Vim编辑器中的常见命令、快捷键及三种模式的原理和切换方式并要求能够熟练使用Vim来编写文档、配置主机名、网卡信息及Yum仓库信息。学习SHELL脚本的编写规则与经验,学习文件测试、逻辑测试、整数值比较、字符串比较的条件测试语句,从而能够接收并处理用户的参数。学习Linux系统中编写SHELL脚本的if(单分支、双分支、多分支)/for/while/case条件语句,学习能够实现计划任务crond系统,从最终能够结合所学命令编写出实现自动化工作的Shell脚本。学习搭建PXE+DHCP+TFTP+VSftpd+Kickstart服务程序搭建出无人值守安装系统,从而批量部署客户机系统。

5、用户、用户组和其余人在系统中的不同身份与能力,以及文件的读(r)写(w)执行(x)权限的作用。为了让系统更加的安全还需要学习SUID、SGID和SBIT的文件特殊权限,文件隐藏权限以及ACL访问控制列表。学会su命令和sudo服务后一定能够满足以非超级用户操作实验或日常工作的需求,同时也保证了系统的安全性。

6、Linux系统的存储结构引入,讲述硬盘存储结构、硬件命名规则以及内核Udev设备管理器服务,掌握系统中文件权限、学习对文件的限制操作,了解各个文件系统的特性。理解文件系统的作用,能够区分ext3,ext4,xfs有何不同并学习将硬盘设备分区、格式化以及挂载等常用硬盘管理操作,完整配置Swap交换分区、Quota服务限制磁盘配额。

7、深入学习ln命令创建软/硬链接、管理Raid磁盘冗余阵列(0、1、5和10模式)、LVM逻辑卷管理器并能够熟练掌握创建软/硬链接的方法,学习了解VFS原理。

8、RHEL7以后系统已经用firewalld服务替代了iptables服务,了解Firewalld防火墙的新特性及Zone区域概念,基于数十个防火墙需求学习新的防火墙管理命令firewall-cmd。了解掌握防火墙的原理、学习规则策略的配置方法、基于条件的数据包过滤规则、学习SNAT源地址转换技术及DNAT目的地址转换技术,防火墙的端口转发及负载均衡等实验,还新增了Tcp_wrappers防火墙服务,即可通过简单配置来保证系统与服务的安全。

9、RHEL7以后系统将原先熟悉的守护进程替换为了systemd,用sytemctl命令替换掉了很多管理命令,课程会先了解Systemd初始化进程的作用,要求能够查看网卡状态并熟练的管理网卡参数。学习使用nmtui命令配置网卡参数、手工将多块网卡做绑定、使用nmcli命令查看网卡信息和使用ss命令查看网络及端口状态,完整演示sshd服务配置方法并详细讲述每个参数的作用,实战基于密钥远程登陆实验以及用tmux服务让远程会话不再终断。

10、了解SELinux服务的3种工作模式,小心谨慎的使用semanage命令和setsebool命令配置SELinux安全上下文和服务监管策略,学习网站服务程序的部署方法、个人用户主页功能以及基于IP地址、主机名(域名)、端口号的虚拟主机功能。Nginx是一款相当优秀的用于部署动态网站的服务程序,Nginx具有不错的稳定性、丰富的功能以及占用较少的系统资源等特性,对其多个场景下的配置要掌握。

11、文件传输协议来帮助读者理解FTP协议的用处,安装vsftpd服务程序并逐条分析服务文件的配置参数。vsftpd服务匿名访问模式、本地用户模式及虚拟用户模式的配置方法,介绍PAM可插拔式认证模块的原理与认证流程;同时掌握WebDav方式的文件上传。

12、文件共享系统的作用,了解Samba与NFS服务程序的开发背景以及用法,详细逐条讲解Samba服务配置参数,演示安全共享文件的配置方法,并使用autofs服务程序自动挂载设备,掌握实现Linux系统之间或与Windows系统之间的文件共享的方法,以及在共享文件时如何配置防火墙与SELinux策略规则,最终要求能够熟练使用Samba及NFS安全的共享文件,并掌握Autofs自动挂载服务。

13、DNS服务程序的原理,学习正向解析与反向解析实验,掌握DNS主服务器、从服务器、缓存服务器的部署方法。能够熟练配置区域信息文件与区域数据文件,以及通过使用分离解析技术让不同来源的用户得到更合适的解析结果。DNS服务作为互联网的基础设施,我们还可以配置BIND服务程序支持TSIG安全加密传输机制,从而保障解析数据不被嗅探监听。

14、DHCP协议服务能够自动化的管理局域网内的主机IP地址,有效的提升IP地址使用率,提高配置效率,减少管理与维护成本。学习dhcpd服务程序的使用方法并逐条讲解配置参数,完整演示自动化分配IP地址、绑定IP地址与Mac地址等实验。DHCP中继代理技术是多个物理网段共同一台DHCP服务器的最佳解决方案,这也是运维人员必学的实用技术之一。

15、电子邮局系统的组成角色原理,了解MUA、MTA与MDA的作用理论,熟悉熟悉SMTP、POP3与IMAP4邮局协议。学习postfix与dovecot服务程序的使用方法并逐条讲解配置参数,完整演示了部署基础电子邮局系统以及设置用户别名邮箱的方法。

16、代理缓存服务的工作原理的掌握,能够清晰理解正向代理(普通模式、透明模式)与反向代理的作用。要求能够正确的使用squid或3proxy服务程序部署代理缓存服务可以有效提升访问静态资源的效率,降低原服务器的负载并学习对指定IP地址、网页关键词、网址与文件后缀的ACL访问限制功能的实验,内容非常实用。

17、了解网络存储技术的原理,分析SCSI与iSCSI技术结构的不同与iSCSI技术的优势、SAN存储网络技术结构以及iSCSI HBA卡的作用。完整部署iSCSI target服务程序的方法流程:创建RAID阵列后使用targetcli命令发布到iSCSI存储目录并创建ACL列表。学习配置使用iSCSI initiator服务程序发现、连接并使用iSCSI存储设备,最后编辑fstab文件将存储设备设置为开机启动。

18、了解MariaDB与MySQL数据管理系统的区别及历史,学会初始化数据库管理工具。能够熟练的使用MariaDB来创建用户及授权、并能够创建管理数据库及表单。MySQL数据库管理系统被Oracle公司收购后从开源换向到了封闭,导致包括红帽在内的许多Linux发行版选择了MariaDB。学习使用MariaDB数据库管理工具来管理数据库,学习对数据表单的新建、搜索、更新、插入、删除等常用操作。并且熟练掌握对数据库内用户的创建与授权,数据库的备份与恢复方法。

19、掌握一门中级的脚本语言:Perl、Python、Ruby、Lua等。


网络工程师需不需要学习Linux?来看看一位网络高工的心路历程。


机缘巧合下,我由一个电子信息专业的毕业生跨行走上了网络工程行业。这一路走来也是痛并快乐着。由于进入的是一个从未接触过的行业,遇到的每一项工作都是新奇且具有挑战性的。最开始只能跟着师傅干一些路由器与交换机的上架、跳纤等基础工作,在自己补足基础知识后也可以慢慢根据客户需要完成脚本编写、设备配置和网络改造等高级点的工作,这是一个推着自己不断接触新事物新技术的过程,也在此养成了持续学习的好习惯。在此有个感悟,比如在十年前,MPLS VPN应该是一个在网络行业中非常时髦的技术,但到了今天,它已经有被VXLAN、SDWAN和SR等新技术所取代的趋势。随着技术的快速发展,想要不被市场淘汰就必须紧跟步伐,在学习的过程中我接触到了Linux,接下来我讲讲网工和Linux会有什么样的联系。

其实第一次接触Linux是在上大学时学习嵌入式系统。简单的来讲,可能每个稍微智能一些的电子产品都是一个嵌入式系统,它由软件和硬件构成的,其中的软件系统就是由大名鼎鼎的Linux操作系统经过裁剪实现的。毕竟要做到专一功能,就要去掉不必要的功能,既能提高效率又能依托Linux稳定的性能。

随后在工作中遇到了一个问题,那就是软路由。客户现网的结构是各种各样的,并且客户都想用最少的钱实现最大的功能。软路由的出现在网络行业应该是一个标志性的事件,通过一个小盒子就能实现传统网络硬件的绝大部分功能甚至超越传统路由器功能。第一次见到软路由时真的吓了一跳,一个巴掌大的盒子居然也能起OSPF协议和IPSEC,并且很适合做一些不需要专有芯片实现的功能,比如分流功能。随后马上下定决心一定要研究透这个东西。在使用的过程中发现RouterOS这种软路由的配置很像是Linux系统,随着深入的研究,发现它就是基于Linux开发,不禁暗暗感叹Linux运用之广泛。之后更是了解到了还有基于FreeBSD系统的防火墙系统pfsense和流控系统Panabit系统,都是要拥有Linux知识才能玩转的,之后更令人震惊的是了解到思科、华为、华三、Juniper等厂家的系统都是基于Linux或Unix系统开发的,当然这是后话。随后开始想家用路由器能否使用软路由来实现呢,然后就发现了OpenWrt这个多用于家庭路由器的软路由系统,这个更加是Linux系统的亲儿子了,操作命令基本上一模一样,包括使用vim编辑各项定制服务和系统服务的配置文件、使用iptables 自定义路由器的防火墙配置、使用如df free top等命令查看系统状态等。在此建议如果家里有可以刷系统的路由器,强烈推荐使用此类系统,的确可以极大的增加路由器的功能,比如过滤广告等,极大提升生活质量。通过已有的Linux基础知识,我也顺利的完成了此类软路由相关工作,越发觉得知识越多只能越强大。

在做网络项目的过程中,遇到如金融等行业的客户对网络要求特别高,每一项现网的操作都需要我们十分谨慎,我们戏称金融客户的网线里流的不是数据而是钱,所以在网络割接之前一定要做好充足的准备,这就需要提前搭建实验环境做好测试才行。但使用真机搭建环境的机会少之又少,因为手上不会有和客户完全相同的设备,于是就要到模拟器上做实验。传统的模拟器如华三的HCL、华为的ensp、思科的gns3都只能模拟同一厂家的设备。思科还有Dynamips模拟器,Dynamips是由法国人Chris Fillot于2005年发布的用于模拟Cisco设备的模拟器,它可以运行标准的IOS镜像,虽然此模拟器比较陈旧,但仍然有很多网工愿意使用。后来了解到有一个叫eve的模拟器非常强大,可以模拟市面上绝大部分主流厂家的设备,不单是各种型号的路由器与交换机,还能模拟如防火墙、苹果系统、负载均衡、软路由,甚至连安卓系统都能在上面运行,有这等强大的工具当然要赶紧试一试了。安装之后发现它也是一个Linux系统,它基于Ubuntu系统二次开发,使用命令上与Ubuntu基本相同,只不过在导入需要模拟的设备镜像时有很多的规则,导入不同类型的设备要到不同的文件夹,而且命名规则等细节也有要求。想要玩转,除了要泡在论坛里,也要有过硬的Linux知识才可以。诸如物理网络与eve中设备的桥接,实现起来就是一次对网络与Linux知识的一次大测验,其中的细节需要下一定的功夫才能搞定。就这样一个网络工程师再次捡起了Linux知识投入战斗。后来发现身边的同事也有开始学习Linux的了,有需要搭建网络监控的同事通过搭建cacit和zabbix服务来学习,也有想要搭建自己博客的同事通过在云上搭建nginx和wordpress来学习,也有同事使用公司服务器安装ESXI并折腾各种系统来学习,更有一位同事开始研究Kali学习渗透测试,准备学成后转行到安全领域等等

我当年上大学这门课时学习嵌入式系统已经对Linux产生了一定的兴趣,并在网上找了一些书准备学习,其中有一本叫《Linux就该这么学》给我留下深刻的印象,也很符合我的要求,感觉这本书也是经过裁剪得到的,不像其他书里会列出很多平时不会用到的命令,通过对这本书的学习搭建了我对Linux的基础知识框架。在大学期间的这次学习,这也注定后面它会为我的工作提供一定的支持。我的Linux学习历程就先介绍到这,在此建议各位同仁不要在新技术上掉队,也不要忽略诸如Linux这种底层技术能力。


看完上面网络工程师的心得,再来看看嵌入式工程师的吧(韦东山以6000字长文告诉你如何学习linux)。

在100ASK_IMX6ULL售后群里,发现很多初学者只有单片机基础,甚至没有单片机基础。在学习Linux时,对很多概念比较陌生,导致不知道学什么,也不知道学了之后有什么用。所以我趁着假期,编写此文,从事嵌入式Linux培训12年来,我们写过很多《关于如何学习linux》的文章,在此浓缩为3个章节。

第1章 单片机和Linux的区别

1.1.有哪些产品使用单片机或Linux?
所有的电子产品,所用技术都可以认为要么是单片机,要么是Linux;GUI方面主要是QT/Android,它们都是运行于Linux之上的。也许你不服!不是还有ucos、vxwork、wince、ios吗?下面这个图是关于操作系统的占比,是2016年的,我没找到更新的图,但是很有参考意义:


我们说的单片机不使用操作系统,在上图中没有体现出来。但是使用单片机设备肯定远远超过Linux。很多人也是先学习单片机,从单片机进入电子工程师行业。



我们设计一个产品时,是使用单片机还是Linux,取决于成本:硬件成本、软件成本、维护成本、升级成本。而不应该根据个人偏好来选择:我喜欢单片机,所以就排斥使用Linux;我喜欢Linux,就排斥使用单片机。为了有更多的选择,我们需要既懂单片机,又懂Linux。

1.2.在硬件操作上单片机和Linux是类似的
以点灯为例,无论是单片机还是Linux,我们要做的事情都一样:
① 看原理图,确定引脚是哪一个,确定它输出什么电平才可以
② 看芯片手册,确定要怎么操作寄存器
③ 写程序

但是,怎么编写程序,单片机和Linux有很大不同。

1.3.在单片机中点灯、使用LCD
使用单片机开发程序时,我们一上来就写一个main函数,下面有一些简化的代码。

LED程序里面的init_led、led_on、led_off函数是你一个人写的,爱取什么名就取什么名,爱怎么写就怎么写。LCD程序里的函数也是你写的,完全是自由发挥。

很多单片机项目不是很复杂,2、3个人从上到下统统搞定,里面的函数大多时间是直接去读写寄存器。很多单片机项目严重依赖于硬件,换一个芯片后怎么办?重写一套代码呗。

在单片机程序里,没有应用程序、驱动程序的概念,很可能一个人包揽了硬件设计、模块调试(或称之为驱动)、功能开发(或称之为应用)的全部活。

1.4.在Linux中点灯、使用LCD
在Linux中,不允许应用开发人员直接去操作硬件,比如你想点个灯,不好意思,你无法直接访问寄存器;你需要通过驱动程序来访问寄存器。

为什么?有几大原因:
① Linux系统中运行着众多程序,必须保证质量差的程序无法破坏系统:假设你写的程序比较烂,那我不能让你去随便访问寄存器,把系统搞崩溃了怎么办?你本意是去点灯,但是你看错了寄存器,你把电源关了怎么办?所以这些操作硬件的活,还是交给信得过的人来做吧:交给驱动工程师,他既懂硬件又懂软件。

② 保证程序的可移植性:
编写应用程序时,大家都使用统一的函数,以后换一个芯片时,应用程序不用变;只需要根据这个接口提供驱动程序就可以了。

③ 团队协作:
使用Linux系统的项目一般比较大,术业有专攻,一个人不太可能从上到下都全部掌握。比如做人脸识别项目,有擅长做图像处理的,他可不管你要用多少种摄像头,有图像给他就可以。而多种摄像头的硬件操作方法各有不同,这些交给驱动程序工程师。

所以,在Linux中应用程序和驱动程序是分开的。以LED、LCD程序为例,简化的代码如下:


也许你已经大概猜出来了,应用程序怎么调用驱动程序?通过标准的接口:
①open:打开驱动程序。
② read/write:读、写数据。
③ ioctl:传入各种参数,获得各种参数。
④ mmap:内存映射,比如映射之后,应用程序可以直接读写LCD的显存。

你看!从这些接口里,我们根本看不到寄存器的操作。底层的程序驱动会根据这些调用,去设置寄存器、操作硬件。

所以,我高大上的应用工程师,干嘛苦哈哈地去看原理图、看芯片手册、读写寄存器,搞不好还要去调试硬件BUG。这些脏活、累活就交给驱动工程师吧。客户的需求千变万化,我996时间都不够用了。

切,我上懂软件、下懂硬件的驱动工程师,肯定不能把这么重要的活交给你去做了,把我的系统搞崩溃了怎么办。开玩笑的,有应用工程师、驱动工程师的优劣之分,大家都是为了做出产品。现在有一个趋势,一个任务从上到下你都需要懂,这就是所谓的全栈工程师。

在Linux中,“一切皆文件”,要访问某个硬件,也是要打开文件、读写文件。应用程序要根据标准的文件接口:open/read/write/ioctl/mmap等来访问驱动程序。既然如此,怎么写驱动程序呢?最简单的方法就是:APP要调用open来打开驱动程序,那驱动程序里就提供一个xxx_open函数来初始化硬件;APP要调用write来写数据,驱动程序里就提供一个xxx_write函数来接收数据并操作硬件。

用xxx_open、xxx_write来构成一个驱动程序,这就是驱动框架。怎么实现这些xxx_open、xxx_write函数?我们要做的事情跟单片机是类似的,一样要去看电路图、看芯片手册,然后在这些函数里读写寄存器:这称为硬件操作。所以Linux驱动程序= 驱动框架 + 硬件操作。有单片机基础的人,对硬件操作比较熟悉了,把重点放在驱动框架上就可以。

高能预警:驱动框架可不简单,对于LED来说是简单,但是还有更复杂的驱动程序,它要考虑“通用”,这很要命。

第2章 嵌入式Linux快速入门

这几天在群里跟学员聊天,有一位学员的学习方法很好:先观其广,再究其深。有时候要“不求甚解”,很多时候保持疑问先学下去,这些疑问就自然解决了。比如课程中涉及汇编知识,如果你要彻底弄清楚,你需要去学习《ARM架构与编程》;当你学完这本书,你的同学搞不好已经可以上手工作了。

2.1.短期的目标是什么?
我们先把学习目标定下来:快速了解嵌入式Linux开发的流程,知道要学什么,具备跟从业者交流的能力。

2.2.一个嵌入式Linux系统的组成  
下面我们用类比和逻辑推导出嵌入式Linux系统的组成,没错,“推导”。


从上图可以知道:
① 组成:嵌入式Linux系统 = bootloader + linux内核 + 根文件系统(里面含有APP)。
② bootloader:它的目的是启动内核,去哪读内核?读到哪里?去Flash等外设读内核,存到内存里去。所以需要有Flash里外设的驱动能力,为了调试方便还会有网络功能。所以,可以认为 booloader = 裸机集合,它就是一个复杂的单片机程序。
③ Linux内核:Linux内核的最主要目的是去启动APP,APP保存在哪里?保存在“根文件系统”里。“根文件系统”又保存在哪里?在Flash、SD卡等设备里,甚至可能在网络上。所以Linux内核要有这些Flash、SD卡里设备的驱动能力。

不仅如此,Linux内核还有进程调度能力、内存管理等功能。所以:Linux内核 = 驱动集合 + 进程调度 + 内存管理等。

2.3.要学习bootloader吗
Bootloader有很多种,常用的叫做u-boot。

在实际工作中,对于u-boot基本上是修修改改,甚至不改。但是u-boot本身是很复杂的,比如为了便于调试,它支持网络功能;有些内核是保存在FAT32分区里,于是它要能解析FAT32分区,读FAT32分区的文件。花那么多精力去学习u-boot,但是工作中基本用不到,这对初学者很不友善。所以,对于初学者,我建议:理解u-boot的作用、会使用u-boot的命令,这就可以了。如果你的工作就是修改、完善bootloader,那么再去研究它吧。

2.4.要学习Linux内核、要学习驱动程序吗
之前我们说过Linux内核 = 驱动集合 + 进程调度 + 内存管理等,如果要学习Linux内核,从驱动程序入手是一个好办法。但是人人都要学习Linux内核、人人都要学习Linux驱动吗?显然不是。

作为初学者,懂几个简单的驱动程序,有利于工作交流;理解中断、进程、线程的概念,无论是对驱动开发、应用程序开发,都是很有好处的。所以对于初学者,建议前期只学习这几个驱动:LED、按键、中断。
① LED驱动程序:这是最简单的驱动程序。
② 按键驱动程序:它也比较简单,从它引入“中断”。
③ 中断:从“中断”它可以引入:休眠-唤醒、进程/线程、POLL机制、异步通知等概念。这些概念无论是对驱动开发,还是对应用开发,都很重要。

所以,对于初学者,我建议必须学习这几个驱动:LED、按键、中断。入门之后,如果你想从事内核开发、驱动开发,那么可以去钻研几个驱动程序(输入系统、I2C总线、SPI总线等),掌握若干个大型驱动程序后,你对内核的套路就有所了解了,再去研究其他部分(比如进程管理、文件系统)时你会发现套路是如此通用。摄像头(VL42)、声卡ALSA驱动是Linux中比较复杂的2类驱动,它们是很难的,如果工作与此相关再去研究。

2.5.要学习Linux应用程序吗?先学一些基础技能,即使以后你只想研究内核,一些基本的应用开发编写能力也是需要的:
① 基本设备的访问,比如LCD、输入设备
② 进程、线程、进程通信、线程同步与互斥
③ 休眠-唤醒、POLL机制、信号
④ 网络编程

①②③部分的知识,跟驱动有密切的关系,它们是相辅相承的。掌握了基本驱动开发能力、基本应用开发能力之后,在工作中你就可以跟别人友好沟通了,不至于一脸懵逼。

2.6.应用程序是怎么启动的?要了解一下根文件系统
你辛辛苦苦写出了应用程序,怎么把它放到板子上,让它开机就自动启动?
你写的程序,它依赖于哪些库,这些库放到板子上哪个目录?
怎么做一个可升级的系统?即使升级中途断电了,也要保证程序至少还可以运行老的版本?

这些都需要我们了解一下根文件系统。先了解一下init进程:它要读取配置文件,根据配置文件启动各个APP。了解了init进程,你就了解了根文件系统的组成,就可以随心所欲裁剪系统,为你的项目制作出最精简的系统。

第3章 学习方法

3.1.先不要打破砂锅问到底
嵌入式涉及的东西太多太杂了,如果心里没有主线,碰到什么都要去研究个透彻,最终反而忘记自己要学什么了。嵌入式涉及硬件知识、软件知识,软件里涉及汇编、ARM架构、C语言、Makefile、Shell;又分为bootloader、内核、驱动、基本的APP、GUI。

比如我们会用到Makefile,了解它的基本规则,会用我们提供的Makefile就可以。不需要深入研究那些make函数,因为在工作中都有现成的Makefile给你使用,不需要自己去编写一套Makefile。何必花上好几天去深入研究它呢?

比如我们会用到bootloader,难道又要花上几个月来深入研究u-boot吗?工作中基本不需要改u-boot,会用那几个命令就可以。甚至有些学员先去买本shell的书来学习shell命令,何必?我们在视频中用到什么命令,你不懂时再去百度一下这些命令就可以了。不要脱离初学者的主线:应用基础、驱动基础。有了这2个基础后,你想深入研究某部分时,再去花时间吧。

3.2.思路要清晰,不怕抄代码
视频里的代码,请你一定要自己去写一次、写多次。为什么我现在写驱动那么熟?我2009年在华清远见上课时,每次上课我都要给学生写一次那些驱动,十几次下来闭着眼睛都知道内核的套路了。

记不住那些函数?我也记不住,我都是去参考同类的驱动程序,这又不是闭卷考试。但是要理清楚思路,你写这个程序要完成什么功能、怎么实现这些功能?这个要弄清楚。有了思路后再写代码,不知道怎么写?没关系,看看视频,看看示例,然后关闭视频看看能否自己写出来。

3.3.对自己的方向很了解,我只能带你到这里了
我的专长是操作系统,是快速地带领大家掌握一些项目开发的基础知识。如果你决定深入研究某方面时,我并不能带你多久。你要去看源码,去看这方面的专业书籍。比如想深入钻研内核的内存管理时,它有页表映射(你需要阅读ARM架构的手册)、SLAB分配器、vmalloc/malloc实现、mmap实现、缺页中断、父进程子进程之间的页面管理等等,内容非常多。有时候连书籍都没有,你需要直接啃代码。

当你想从事某个行业时,就需要深入研究行业相关的知识。比如CAN总线,它可以写成一本书:CAN协议、CAN报文、Socket CAN、车身网络拓扑结构,CAN应用报文,CAN网络管理报文,CAN诊断报文。

想做物联网网关,需要深入研究MQTT,MQTT协议相对简单,但是MQTT英文原版协议有130多页,中文版有近100页,是一本小书了。

每个行业都有自己的业务逻辑,在掌握基本的编程能力之一,你需要结合具体的业务去深入学习。


运维是不是IT行业里技术含量最低的岗位?


从本质上说,运维其实是用自己的技术储备知识,保证自己所管理的IT服务可以正常运转的岗位。就好比盖一间房子,产品开发负责房子的规划、设计师负责房子的外形设计,开发工程师负责盖房子,而运维则负责给房子打地基。而打地基并不是说简单挖个坑就可以了,里面的技术含量是很高的,坑的大小、深度、尺寸、湿度等都要深入研究才行。房子盖起来之后,大家都只会关注房子建好之后的样式,很少有人会关注房子的地基情况,但一旦房子塌了,大家就会想是否地基打的牢靠,此时运维就要出来背锅了。

运维的工作有深有浅

如果我们不知道运维的具体工作内容,就没有权利评价运维工作的技术含量,一般来说,互联网公司中的运维内容分两个层次:
1、小一点的公司运维工作比较简单,简单来说就是部署服务、修电脑、安装系统、装软件、处理网络问题等等,什么杂活都干,甚至连弄路由器、切网线都要做
2、大一点的公司运维工作比较具体,分工非常明确。
1).桌面运维,确实技术含量不高,但需要经验丰富,解决问题头脑灵活;
2).网络运维,也就是网工,要精通各种网络协议、架构,思科、华为、华三的路由交换,至少精通两门;
3).数据库运维,数据库运维就当 DBA 理解吧,起码要熟练,应该精通数据库;
4).操作系统运维就要精通操作系统,要知道操作系统内部的工作原理,要懂得一些硬件知识,还要懂得网络协议用于排查问题;
5).服务器运维等还有很多,都需要涉猎面广,并同时多门技术傍身。

然后,我们回到上面的问题:“运维是计算机行业里技术含量最低的岗位吗?”

没有技术含量低的岗位,完全就是看你怎么做。桌面运维,可以利用域控的组策略,通过脚本把很多东西做成自动的,很少再需要人去参与,这技术含量就提升了。所以说岗位的技术含量可以人为提升的,完全就是看你怎么做。



运维技术差很可能只是因为公司小

如果企业很小,大家所看到的运维工作只能是很表面的基础工作,而且很多运维岗位现在已经被云服务代替了,运维所做的内容也就是在云平台上操作一下软件。其实可能会觉得在云平台上操作软件很简单,但如果没有计算机相关的知识积累,很难知道云平台上的功能实现,这点上说技术含量就不低了。

如果企业逐渐成长到大体量公司后,运维的价值就凸显出来了。如云上与线下资源的管理,数据库的管理,网络的管理,计算资源,网络资源的负载,调度处理,都需要丰富的计算机理论知识及实战经验,否则无法为上层提供出稳定可靠的服务。而作为提供互联网服务的企业,能否稳定可靠的让用户使用互联网服务是安身立命之本。想像一个企业,三天两头出故障,服务不能用,虽然凸显了运维的存在感,那么大家是否还会信任你的产品。

什么才是最Low的岗位

题外话,我们觉得“有部分做后台开发”才是计算机行业里技术含量最低的岗位:
1).因为他们有些人只会增删改查
2).有时候增删改查还整不明白,写个 SQL 把数据库拖死了,还跑DBA这里来问
3).还有些开发觉的服务器 ping 不通,就等同于无法访问。比如说想访问 443 端口,他们会先ping 服务器,对协议是一点概念都没有。

所以还是那句话:没有技术含量低的岗位,完全就是看你怎么做。


运维工作内容一览

运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够7×24小时为用户提供高质量的服务。


什么是运维和运维工程师:

一、初入运维领域的头衔:
运维实习生
系统管理员
网络管理员

二、使用频率最高的运维头衔:
运维工程师
IT运维工程师
Linux运维工程师
运维开发工程师
应用运维工程师

三、侧重某项技能或行业的运维头衔:
系统运维工程师
数据库运维工程师
网络运维工程师
安全运维工程师
桌面运维工程师
软件运维工程师
业务运维工程师
CDN运维工程师
IDC运维工程师
存储运维工程师
硬件运维工程师
游戏运维工程师
与业务强相关的岗位,如:直播运维工程师、中间件运维工程师

四、新兴的运维头衔:
自动化运维软件开发工程师
DevOps运维开发工程师

五、资深的运维头衔:
高级运维工程师
运维专家

六、走上管理岗位的运维头衔:
运维主管
运维经理
高级运维经理
运维总监

七、最洋气的运维头衔
SRE(Site Reliability Engineer)


运维人员对公司互联网业务所依赖的基础设施、基础服务、线上业务进行稳定性加强,进行日常巡检发现服务可能存在的隐患,对整体架构进行优化以屏蔽常见的运行故障,多数据中接入提高业务的容灾能力。

运维的手段=>通过监控、日志分析等及时发现和响应服务故障,减少服务中断的时间,使公司的互联网业务符合预期的可用性要求,持续稳定地为用户提供务。

运维的安全=>从业务运行所涉及的各个层面,确保用户能够安全、完整地访问在线业务。

从网络边界划分、ACL 管理、流量分析、DDoS 防御,到操作系统、开源软件的漏洞扫描和修补,再到应用服务的XSS、SQL注入防护;从安全流程梳、代码白盒黑盒扫描、权限审计,到入侵行为检测、业务风险控制等。运维人员需要保障公司提供的互联网业 运行在安全、可控的状态下,确保公司业务数据和用户隐私数据的安全,同时还需要具备抵御各种恶意攻击的能力。在确保业务稳定、安全的前提下,还需保障业务高效的运转,公司内快速的产出。运维工作需要对业务进行各方面优化。比如,IO 优化提升数据库性能,图片压缩降低带宽使用量等,提供的互联网业务以较小的资源投入带来最大的用户价值和体验。同时还需要通过各种工具平台提升内部产品发布交付的效率,提升公司内运维相关的工作效率。

工作分类运维

运维的工作方向比较多,随着业务规模的不断发展,越成熟的互联网公司,运维岗位会划分得越细。当前很多大型的互联网公司,在初创时期只有系统运维,随着服务规模、服务质量的要求,也逐渐进行了工作细分。一般情况下运维团队的工作分类和职责如下。


图:运维团队的工作分类


一、系统运维

系统运维负责IDC、网络、CDN和基础服务的建设(LVS、NTP、DNS);负责资产管理,服务器选型、交付和维修。详细的工作职责如下:

1.IDC数据中心与网络建设
收集业务需求,预估未来数据中心的发展规模,从骨干网的分布,数据中心建筑,以及Internet接入、网络攻击防御能力、扩容能力、空间预留、外接专线能力、现场服务支撑能力等方面评估选型数据中心。负责数据中心的建设、现场维护工作。设计及规划生产网络架构,这里面包括:数据中心网络架构、传输网架构、CDN网络架构等,以及网络调优等日常运维工作。

2.负载均衡和SNAT规划
负载均衡器是整个站点架构中的流量入口,根据网络规模和业务需求,构建负载均衡集群。完成网络与业务服务器的衔接,提供高性能、高可用的负载调度能力,以及统一的网络层防攻击能力。SNAT 集中提供数据中心的公网访问服务,通过集群化部署,保证出网服务的高性能与高可用。

3.CDN 规划和建设
CDN 工作划分为第三方和自建两部分。建立第三方 CDN 的选型和调度控制;根据业务发展趋势,规划CDN新节点建设布局;完善CDN业务及监控,保障CDN 系统稳定、高效运行。分析业务加速频道的文件特性和数量,制定最优的加速策略和资源匹配;负责用户劫持等CDN日常故障排查工作。

4.服务器选型、交付和维护
负责服务器的测试选型,包含服务器整机、部件的基础性测试和业务测试,降低整机功率,提升机架部署密度等。结合对公司业务的了解,推广新硬件、新方案减少业务的服务器投入规模。负责服务器硬件故障的诊断定位,服务器硬件监控、健康检查工具的开发和维护。

5.OS、内核相关维护工作
负责整体平台的 OS 选型、定制和内核优化,以及 Patch 的更新和内部版本发布;建立基础的YUM包管理和分发中心,提供常用包版本库;跟进日常各类 OS 相关故障;针对不同的业务类型,提供定向的优化支持。

6.资产管理
记录和管理运维相关的基础物理信息,包括数据中心、网络、机柜、服务器、ACL、IP等各种资源信息,制定有效的流程,确保信息的准确性;开放API接口,为自动化运维提供数据支持。

7.基础服务建设
业务对 DNS、NTP、SYSLOG 等基础服务的依赖非常高,需要设计高可用架构避免单点,提供稳定的基础服务。

8.运维平台研发
运维研发负责通用的运维平台设计和研发工作,如:资产管理、监控系统、运维平台、数据权限管理系统等。提供各种API供运维或研发人员使用,封装更高层的自动化运维系统。记录和管理服务及其关联关系,协助运维人员自动化、流程化地完成日常运维操作,包括机器管理、重启、改名、初始化、域名管理、流量切换和故障预案实施等。

9.监控系统
负责监控系统的设计、开发工作,完成公司服务器和各种网络设备的资源指标、线上业务运行指标的收集、告警、存储、分析、展示和数据挖掘等工作,持续提高告警的及时性、准确性和智能性,促进公司服务器资源的合理化调配。


二、应用运维

应用运维负责线上服务的变更、服务状态监控、服务容灾和数据备份等工作,对服务进行例行排查、故障应急处理等工作。详细的工作职责如下所述。

1.设计评审
在产品研发阶段,参与产品设计评审,从运维的角度提出评审意见,使服务满足运维准入的高可用要求。

2.服务管理
负责制定线上业务升级变更及回滚方案,并进行变更实施。掌握所负责的服务及服务间关联关系、服务依赖的各种资源。能够发现服务上的缺陷,及时通报并推进解决。制定服务稳定性指标及准入标准,同时不断完善和优化程序和系统的功能、效率,提高运行质量。完善监控内容,提高报警准确度。在线上服务出现故障时,第一时间响应,对已知线上故障能按流程进行通报并按预案执行,未知故障组织相关人员联合排障。

3.资源管理
对各服务的服务器资产进行管理,梳理服务器资源状况、数据中心分布情况、网络专线及带宽情况,能够合理使用服务器资源,根据不同服务的需求,分配不同配置的服务器,确保服务器资源的充分利用。

4.例行检查
制定服务例行排查点,并不断完善。根据制定的服务排查点,对服务进行定期检查。对排查过程中发现的问题,及时进行追查,排除可能存在的隐患。

5.预案管理
确定服务所需的各项监控、系统指标的阈值或临界点,以及出现该情况后的处理预案。建立和更新服务预案文档,并根据日常故障情况不断补充完善,提高预案完备性。能够制定和评审各类预案,周期性进行预案演练,确保预案的可执行性。

6.数据备份
制定数据备份策略,按规范进行数据备份工作。保证数据备份的可用性和完整性,定期开展数据恢复性测试。

7.自动化部署系统
参与部署自动化系统的开发,负责自动化部署系统所需要的基础数据和信息,负责权限管理、API开发、Web端开发。结合云计算,研发和提供PaaS相关高可用平台,进一步提高服务的部署速度和用户体验,提升资源利用率。


三、数据库运维

数据库运维负责数据存储方案设计、数据库表设计、索引设计和SQL优化,对数据库进行变更、监控、备份、高可用设计等工作。详细的工作职责如下所述。

1.设计评审
在产品研发初始阶段,参与设计方案评审,从DBA的角度提出数据存储方案、库表设计方案、SQL开发标准、索引设计方案等,使服务满足数据库使用的高可用、高性能要求。

2.容量规划
掌握所负责服务的数据库的容量上限,清楚地了解当前瓶颈点,当服务还未到达容量上限时,及时进行优化、分拆或者扩容。

3.数据备份与灾备
制定数据备份与灾备策略,定期完成数据恢复性测试,保证数据备份的可用性和完整性。

4.数据库监控
完善数据库存活和性能监控,及时了解数据库运行状态及故障。

5.数据库安全
建设数据库账号体系,严格控制账号权限与开放范围,降低误操作和数据泄露的风险;加强离线备份数据的管理,降低数据泄露的风险。

6.数据库高可用和性能优化
对数据库单点风险和故障设计相应的切换方案,降低故障对数据库服务的影响;不断对数据库整体性能进行优化,包括新存储方案引进、硬件优化、文件系统优化、数据库优化、SQL优化等,在保障成本不增加或者少量增加的情况下,数据库可以支撑更多的业务请求。

7.自动化系统建设
设计开发数据库自动化运维系统,包括数据库部署、自动扩容、分库分表、权限管理、备份恢复、SQL审核和上线、故障切换等功能。


四、安全运维

运维安全负责网络、系统和业务等方面的安全加固工作,进行常规的安全扫描、渗透测试,进行安全工具和系统研发以及安全事件应急处理。详细的工作职责如下所述。

1.安全制度建立
根据公司内部的具体流程,制定切实可行,且行之有效的安全制度。

2.安全培训
定期向员工提供具有针对性的安全培训和考核,在全公司内建立安全负责人制度。

3.风险评估
通过黑白盒测试和检查机制,定期产生对物理网络、服务器、业务应用、用户数据等方面的总体风险评估结果。

4.安全建设
根据风险评估结果,加固最薄弱的环节,包括设计安全防线、部署安全设备、及时更新补丁、防御病毒、源代码自动扫描和业务产品安全咨询等。为了降低可能泄露数据的价值,通过加密、匿名化、混淆数据,乃至定期删除等技术手段和流程来达到目的。

5.安全合规
为了满足例如支付牌照等合规性要求,安全团队承担着安全合规的对外接口人工作。

6.应急响应
建立安全报警系统,通过安全中心收集第三方发现的安全问题,组织各部门对已经发现的安全问题进行修复、影响面评估、事后安全原因追查。


运维工作发展过程

早期的运维团队在人员较少的情况下,主要是进行数据中心建设、基础网络建设、服务器采购和服务器安装交付工作。几乎很少涉及线上服务的变更、监控、管理等工作。此时的运维团队更多的属于基础建设的角色,提供一个简单、可用的网络环境和系统环境即可。

随着业务产品的逐渐成熟,对于服务质量方面就有了更高的要求。这个时候的运维团队还会承担一些服务器监控的工作,同时会负责 LVS、Nginx 等与业务逻辑无关的 4/7 层运维工作。这个时候服务变更更多的是逐台的手工操作,或者有一些简单批量脚本的出现。监控的焦点更多的在服务器状态和资源使用情况上,对服务应用状态的监控几乎很少,监控更多的使用各种开源系统如Nagios、Cacti等。

由于业务规模和复杂度的持续增加,运维团队会逐渐划分为应用运维和系统运维两大块。应用运维开始接手线上业务,逐步开展服务监控梳理、数据备份以及服务变更的工作。随着对服务的深入,应用运维工程师有能力开始对服务进行一些简单的优化。同时,为了应对每天大量的服务变更,我们也开始编写各类运维工具,针对某些特定的服务能够很方便的批量变更。

随着业务规模的增大,基础设施由于容量规划不足或抵御风险能力较弱导致的故障也越来越多,迫使运维人员开始将更多的精力投入到多数据中心容灾、预案管理的方向上。业务规模达到一定程度后,开源的监控系统在性能和功能方面,已经无法满足业务需求;大量的服务变更、复杂的服务关系,以前靠人工记录、工具变更的方式不管在效率还是准确性方面也都无法满足业务需求。

在安全方面也出现了各种大大小小的事件,迫使我们投入更多的精力在安全防御上。逐渐的,运维团队形成之前提到的5个大的工作分类,每个分类都需要有专精的人才。此时系统运维更专注于基础设施的建设和运维,提供稳定、高效的网络环境,交付服务器等资源给应用运维工程师。应用运维更专注于服务运行状态和效率。

数据库运维属于应用运维工作的细化,更专注于数据库领域的自动化、性能优化和安全防御。运维研发和运维安全提供各类平台、工具,进一步提升运维工程师的工作效率,使业务服务运行得更加稳定、高效和安全。可以将运维发展过程划分为4个阶段,如图2所示。


图:运维发展过程

手工管理阶段:业务流量不大,服务器数量相对较少,系统复杂度不高。对于日常的业务管理操作,大家更多的是逐台登录服务器进行手工操作,属于各自为战,每个人都有自己的操作方式,缺少必要的操作标准、流程机制,比如业务目录环境都是各式各样的。

工具批量操作阶段:随着服务器规模、系统复杂度的增加,全人工的操作方式已经不能满足业务的快速发展需要。因此,运维人员逐渐开始使用批量化的操作工具,针对不同操作类型出现了不同的脚本程序。但各团队都有自己的工具,每次操作需求发生变化时都需要调整工具。这主要是因为对于环境、操作的规范不够,导致可程序化处理能力较弱。此时,虽然效率提升了一部分,但很快又遇到了瓶颈。操作的质量并没有太多的提升,甚至可能因为批量执行而导致更大规模的问题出现。我们开始建立大量的流程规范,比如复查机制,先上线一台服务器观察10分钟后再继续后面的操作,一次升级完成后至少要观察20分钟等。这些主要还是靠人来监督和执行,但在实际过程中执行往往不到位,反而降低了工作效率。

平台管理阶段:在这个阶段,对于运维效率和误操作率有了更高的要求,我们决定开始建设运维平台,通过平台承载标准、流程,进而解放人力和提高质量。这个时候对服务的变更动作进行了抽象,形成了操作方法、服务目录环境、服务运行方式等统一的标准,如程序的启停接口必须包括启动、停止、重载等。通过平台来约束操作流程,如上面提到的上线一台服务器观察10分钟。在平台中强制设定暂停检查点,在第一台服务器操作完成后,需要运维人员填写相应的检查项,然后才可以继续执行后续的部署动作。

系统自调度阶段:更大规模的服务数量、更复杂的服务关联关系、各个运维平台的林立,原有的将批量操作转化成平台操作的方式已经不再适合,需要对服务变更进行更高一层的抽象。将每一台服务器抽象成一个容器,由调度系统根据资源使用情况,将服务调度、部署到合适的服务器上,自动化完成与周边各个运维系统的联动,比如监控系统、日志系统、备份系统等。通过自调度系统,根据服务运行情况动态伸缩容量,能够自动化处理常见的服务故障。运维人员的工作也会前置到产品设计阶段,协助研发人员改造服务使其可以接入到自调度系统中。在整个运维的发展过程中,希望所有的工作都自动化起来,减少人的重复工作,降低知识传递的成本,使我们的运维交付更高效、更安全,使产品运行更稳定。对于故障的处理,也希望由事后处理变成提前发现,由人工处理变成系统自动容灾。


该文章最后由 Administrator 于 2023-10-07 10:52:49 更新,目前是第 2 版。