专家级:
此级别一般是专业方向。不是通用技能。系统的了解和预备知识的准备相同重要。好比tcp的深入理解才会知道怎样作syn的ddos防御(不是内核的那个开关),对无线理论的深入了解,才干搞无线的内核和应用内容。前端
内核虚拟化、内核存储逻辑(scsi、pci、usb等专注的和串联的)、无线子系统、音频子系统、显卡子系统、电源管理子系统、网络子系统、电源管理子系统java
专家级以前的通常都要学会,工做中都会用到。这里的定级也限于对linux操做系统的使用,一般是软件和系统特性。也并无涉及太多的编程要求。编程是另外的一个方面。编程能力很差不必定linux水平不行,因此这里的定级不怎么考虑编程水平。python
对linux的使用者实用来替代windows的普通桌面用户(如使用startos),可能缘由是认为windows很差用。或者是感情问题。或者是版权问题,或者是为之后深刻linux作平滑准备的。
也有命令使用者。mysql
这部分人涵盖了很是多实际的工做岗位,典型的是运维。linux
运维有很是多细分的子岗位:系统管理,软件管理,后台server管理(好比数据库。http server),软件部署,安全等。ios
安全有时候划入运维,有时候单独列出。nginx
因此。linux用好了就是可以当饭吃的。golang
使用桌面可以鼠标点点便可,但是也可以用的很是销魂。web
也有专门的职业工做就是怎么把桌面用起来。算法
好比嵌入式里的裁剪和启动桌面(让startx命令跑起来)。
linux的桌面有很是多。普通的使用者一般会直接使用这几个桌面提供的环境和软件。
发行版有很是多,一般是不一样风格或者是服务于不一样目的的专用发行版。常见的通用的发行版有:Ubuntu、opensuse、fedora、debian、Mandriva、mint、。
眼下ubuntu大有一统之势,愈来愈多的使用者和开发人员转向ubuntu,甚至server后端曾经常用的centos也在慢慢的丢失市场给ubuntu server。
专用如kali(网络渗透)。puppy,lubuntu(精简),coreos,ubuntu core(虚拟化),router os(路由器)。这些专用发行版通常提供给专业用户,普通用户也可以使用,要发挥其所有威力。一般需要不少其它的行业知识。
常见桌面环境有很是多:ubuntu的unity、gnome、kde、Cinnamon、mate、lxde、xfce。通常各个发行版都会携带不一样的桌面魂晶,每个桌面环境的窗体风格都是不同的,还包含随桌面管理器携带的配套软件通常也是不同的(好比计算器。包管理器,音乐播放器等)。但是有的流行的软件仍是会被移植到不一样的桌面管理器上。但是大部分没有。
gnome、kde、unity的使用者最多。unity眼下仅仅用于Ubuntu。ubuntu也并不是仅仅支持unity一种,差点儿所有的桌面环境ubuntu都有相应的支持版本号。unity的使用率随着ubuntu的普及而迅速上升。
高级的桌面使用者通常可以自由的选择不一样的桌面环境,理解每个桌面环境工做的原理,理解X系统,可以远程多终端使用X。自由的选择启动甚至不启动X或者X的一部分。
理解X和桌面管理器与窗体管理器的差异。
framebuffer模式的显卡自己不具备不论什么运算数据的能力,他比如是一个临时存放水的水池.CPU将运算后的结果放到这个水池,水池再将结果 流到显示器.中间不会对数据作处理.在这中状况下,所有显示任务都有CPU完毕。CPU负担很是重.从frambuffer这个名字咱们就能推測到他的功能 了(数据侦缓冲).
在linux内核中有有framebuffer机制,摹仿framebuffer显卡的这样的功能.他的优势是把显卡的硬件结构抽象掉。把所有的显卡都当作一个”水池”来用.应用程序也可以直接读取这个水池的内容.framebuffer的设备名是 /dev/fb
可以用命令:
#dd if=/dev/zero of=/dev/fb
清空屏幕.假设你的X用的是framebuffer的驱动,屏幕将全变黑.经过移动鼠标,切换窗体等动做可以让原先的内容又一次显示.
假设你不用framebuffer驱动,可以在字符模式下作这个试验.屏幕将所有被清空.
如下的命令:
#dd if=/dev/fb of=fbfile
可以将fb中的内容保存下来,之后可以又一次写回屏幕:
#dd if=fbfile of=/dev/fb
做用类似于屏幕截图。但是截下的图不能用普通图片浏览器看.
linux字符界面在高分辨率下,启动时会有一个小企鹅logo,这个logo就是用framebuffer功能写上屏幕的.
Linux内核给用户提供了显示frame buffer。所有要显示的东西写到buffer去就行了。也就是内核提供了显示的机制,但是没有提供显示的内容。因此显示内容需要 操做系统去实现。
差点儿所有的linux显示的核心都是X系统。X是一种显示协议,实现这个协议的常用软件是Xfree8六、motif(商用),xorg、xnest等。
因此X也可以实现在windows中,苹果操做系统也是用的X。仅仅是是实现在内核中。
现在的发型版通常都默认使用xorg。好多人都看到x11这个词,X11R6 其实是 X Protocol version 11 Release 6(X协议第11版第六次发行)的意思。
运维人员可以说是最专业的linux使用者了,因为他们要关心linux整个系统的执行情况,是对linu系统的使用挖掘的最深的一群人。研发可能会更深刻,但是通常不如运维的广度和挥洒自如。
一个运维的基本功应该是查看系统状态的命令和脚本的编写,深刻一些的运维对linux有很是深入的了解。
运维常用的查看系统资源的命令有:
- 网络
- iftop:查看ip——ip的流量。还可以交互的查看port到port,以及进行过滤
- netstat(可以用ss替代)
- iptraf:图形化的观看ip流量
- nethogs
- tcpdump:抓包直接打印或者保存为pcap文件。甚至可以生成bpf代码
- ngrep:把网络数据包当成grep文件同样过滤。
高速查看网络数据的神器
- mascan:扫描器
- hscan:扫描器
- nmap:扫描器
- 内存
- vmstat
- io
- iostat:
- iotop
- 进程
- top:基础的进程查看工具。可以动态的查看进程的内存、cpu等系统资源。可以交互
- htop:加强的top,界面更美丽。功能也略多
- 其它:
- sar
- lsof
- acct
- monit
一些方便的工具应用:
nping、incron(使用inotify机制,当文件发生变化时本身主动执行注冊脚本。相应于cron是基于时间的,incron基于文件事件)。rsync(远程文件同步)、inotial(不是轮训的tail,而是基于文件变化事件的tail)
从/sys/文件夹如下看到系统当前的物理资源(好比经过rotational文件来推断一个设备是不是ssd),
通常的运维人员都会让本身的shell尽可能的帅起来,好比使用guake。tmux,zsh等,还要熟练使用ssh远程管理系统,以及相关配置。一般你们都是编写bash脚本。
通常的,运维人员的cron和本身主动化脚本都是管理的每台机器必有的。
系统管理员与运维人员很是类似,只是运维通常出现在互联网企业,系统管理员通常出现在传统企业。通常的。系统管理员比运维更偏向于使用现有工具。而运维对系统的了解和脚本的使用更熟悉一些。
通常对升级内核要求很少,但是升级系统版本号仍是有的。库的部署,部署环境(docker),解决环境问题。软件公布,配置管理等。
通常对etc下的配置文件都要很是熟
一个大头的工做很是多是:修电脑。。。。
好比数据库管理员、http server、ntp、dns server、ftp server等各类常见的server的搭建和配置管理。
提及来easy。但每个软件的配置文件都是一坨。详细阅读doc,多踩坑。祝君好运。
linux的安全系统发展至今很是全面,但是仍是远远不够,linux距离一个安全的操做系统还有很是长的路要走。
- 在linux中的基础安全是UGO文件权限,对于进程的能力限制capbilities。
- 提升的是内核的安全框架lsm。以及在lsm下实现的各类防火墙,好比实现flask框架的selinux和apparmor。
- 还有针对文件的,mount文件系统的时候指定acl就可以针对文件进行訪问控制。还有开源的杀毒程序clamav
- 还有訪问控制模块pam,可以把进程的认证工做由程序猿转交给系统管理员
内核剪裁、编译、改动、移植
内核的使用者多见于嵌入式开发和运维的内核升级。但是运维的内核升级通常涉及的功能裁剪较少,涉及的漏洞更新和功能加强较多。换句话说运维作内核是为了升级。嵌入式作内核是大部分为了降级。
很是重要的一点,linux内核从2.6.30版本号開始,基本不适用于嵌入式系统。
尽管仍声称为嵌入式应用作了诸多优化,但是业界的嵌入式开发基本停步在2.6.30版本号的内核。你可以看到内核的新功能和加强基本都是为了互联网而产生的。而针对这样的内核进行裁剪也愈来愈难,甚至要高版本号的内核在嵌入式板子上跑起来这个主要的工做也愈来愈复杂。这也从側面反映出了互联网的活力和嵌入式行业的守旧。
内核的裁剪工做最主要的不要求对内核怎样实现有太多的了解,但是需要知道内核实现的那些功能有什么,为什么需要。好比你得现有net设备。以后net功能才是可选。并且net功能的繁多,一个嵌入式设备根本大部分不需要。内核的编译排版很是重要的一点是依照功能的层级划分的,而不是依照功能的重要性划分的。
比方你会发现无线系统里rfid,led。业余无线电和wifi是平级的,但是大部分人对前三者是不会使用的,仅仅需要wifi。但是内核的编译选项的组织并无针对这样的需求上的流行程度进行优化。
因此一个内核裁剪者需要知道差点儿所有内核选项的做用,最好多试试。至于针对改动。内核的实现大部分为了通用性,对效率和安全的考量是很是少的。假设你深刻内核的代码层次的研究。你会发现内核的实现大部分在你使用的场景。你会有更优的算法。
你会想去又一次实现。但是,这里有一点linux内核最大的哲学:
内核的主要目的是抢占市场。
因此。内核会覆盖尽量多的功能,但是大部分功能的实现都不是企业级的。好比假设你的产品要支持打印机,你通常不会去用内核内置的功能,你会去购买更产品化的内核模块(好比kcodes),假设你的产品要支持samba,你会发现内核对ntfs的支持就是搞笑的,你仍是会去购买商用的ntfs内核模块(商用的和开源的是同一个公司开发的)。
当你多关注内核的发展时。你会发现开源发展的最好的模块一般是企业支持的,而这背后通常有商用版本号存在。这就是内核的本质,出发点是开源的,共享的。发展是靠利益驱动的,繁荣则是全然靠商业的。相同的。商业又会阻碍内核的发展,因此感激尚存的为了理想而生活的程序猿。他们该开个帐户,咱们给他捐款。0….
移植工做考验的大部分不是内核自己的技能,而是对gcc的了解程度。尤为是内核使用的Makefile系统。因此。想要作好嵌入式内核的移植工做。编译系统和链接的paper看一遍你基本就是大牛了。中国业界的大部分从业者。都不会去看的。我也不知道为啥,他们就是不去看。
。
。
。
开发人员就是传说中的程序猿。刚開始入门的程序猿一般会注重语法。helloworld就是这样的心态的典型写照。不一样级别的程序猿用户的素养要求是不同的。好比写业务代码,需要架构能力和编码标准。写高性能程序则需要数学。算法和高性能编程的硬件相关的知识。写实时代码又是需要另一套理论体系。编程的语法是基础,但是编程的核心历来都不是语法。
选择了一门好语言,基本就能肯定你要用他来作的事情。
不存在万金油的语言。注重效率的和注重高速开发的。注重project管理,注重描写叙述问题的都不是相同的语言(固然你要用C作web开发我也没办法),甚至还存在专门处理字符串最牛逼的语言(perl)。对于linux来讲,linux是个平台,开发高性能代码通常就得是asm,C和C++,需要性能和开发效率折中的可以有golang。脚本化的语言也是都可以用在linux上的,那取决于业务。
单有语言写个hello world还可以,project编程最重要的是库。
就是代码的复用。一个成熟的程序猿和一个入门级的程序猿的最大差异不在于语法的熟练程度,在于架构能力和库的复用能力。
因此,linux之于开发人员。不存在编程语言和库上的障碍。
基本上是内核所提供的功能上的。以及你怎样使用这样的功能(利用epoll、inotify等)
linux下常见的桌面主要是kde和gnome。但是基本没人敢用他们开发工业产品。因为指不定哪天他们就没了。照眼下看来,gnome伴随着ubuntu的unity用户UI统一天下的几率很是大,说不定往后愈来愈多的厂商愿意为ubuntu的gnome开发图形界面的应用。
眼下linux上的产品级的应用的图形界面通常使用Qt,java(swing)等成熟的。可移植的图形库。
因此眼下来看,假设你是桌面程序猿(andriod除外),你可能要用java和Qt的C++了。
因为andriod也是java,因此最划算的选择是用java(外国人对java有强大的热情,因为他是最先普及的工业化的编码语言,但不表明他是眼下最好的)。因此学习桌面应用开发基本上就是学习这两款产品的文档。
后端开发人员占领了很是大一部分it开发就业比例(界面,站点。等前端开发人数最多。变化最快,技术沉淀最难),差点儿所有面向社会的程序都有后台server(很是多单机程序是没有的)。也是差点儿所有的后台server都要存储数据。
因此后台开发人员要面对的核心开发点就是:网络使用、传输编码、数据存储和多线程编程。至于后台设计的业务。在这4大模块来看差点儿可以忽略。因此后端开发技术要求比較高。而眼下的server差点儿被linux一统江湖了,这个趋势还会愈演愈烈,windows在这个领域基本没救了。
今年golang在后端开发的流行度迅速崛起,但是大部分仍是使用C/C++,python作后台开发也有至关大比例的份额(别说人家的效率不行,人家快,效率可以用钱买机器解决)。因为golang大部分使用自带的网络库,因此这节不关golang啥事了。
网络常用的C/C++后端库是:原生的epoll、libevent、libev、boost::asio。ace。ace通常产业界没人用,较好不叫座。libev理论上比libevent高效,但是实际使用不见得。通常的工业级的开发都是使用libevent或者epoll,也有使用asio(比較少。因为C++难度高,大部分网络服务是C的)。
传输编码问题,曾经是直接使用本身定义的格式或者本身定义的json后面加压缩,后来发展出了序列化。
再后来序列化进一步发展造成了protocolBuffer, thrift, avro等大公司主导的传输格式。眼下通常要用网络数据传输protocol buffer用的最多,thrift强势崛起,avro刚刚起步,但是特性不俗。
数据存储问题。mysql差点儿是大小系统的第一选择。很是小的可能会使用sqlite,涉及到非IT大型企业可能用商用数据库比較多(本身不能开发,卖他的人又得赚钱)。nosql里mongodb用的比較多,但是近年各类nosql数据库千奇百怪。
有专门存放图的数据库,也有存储下载内容的分级的(rocksdb),也有存储地理信息的等等。
假设你是专业方向的开发人员,可能这些专门的数据库更适合你。
多线程编程,在C/C++的世界里没有太多的选择。一般是pthread,C++可以用boost:thread或者C++11的thread,其后台也是pthread。pthread基本可以一统江湖。
因此使用库的linux开发人员仅仅需要了解库的使用方法,固然对库后台是怎么调用操做系统详细实现的,可以了解也是很是好的。
假设你打算看看你的发行版上装的那些莫名其妙的库是用来干吗的。好比libncurses,libnss,libfuse等,而这些通常你平时开发应用程序都用不到。那么你基本作的就是系统级的后端开发了。系统开发与操做系统的关联很是大,学习系统开发就是在学习操做系统。
系统开发对内核信息的获取要经过proc和sys。这是必定要熟练掌握的。这两个proc还比較easy,但是内容也很是多。sys则比較庞杂。内容不少其它。好比你得清楚的知道/proc/sys/kernel/core_pattern里面存的是core dump的路径。ulimit -c可以用来设置core的大小,默认是0.这些基础的背景知识以及整个文件系统衍生出来的知识点是系统级后端开发的基础。
这些常用的开发内容包含:fifo文件,uevent,inotify,netlink。nice(实时进程),cpu亲和度,cgroup虚拟化。ptrace进程跟踪,子进程建立和控制,信号处理,文件锁。向量化的读写文件,文件描写叙述符操做,socket调用,epoll。文件与文件夹连接控制。锁。磁盘配额校验。进程记帐,权限控制,执行优先级(io和cpu),低级port操做和sg直接发scsi命令,交换分区控制。pdflush,kswapd等内核进程的调优。模块的装载与卸载。内存映射与加锁,cache操做,直接的网络操做。用户管理,消息队列、信号量与共享内存等。
系统级的后端开发直接是面向内核的使用,也就是系统级的开发人员基本就是内核的合格使用者。
运维开发人员比較接近于系统开发人员,但是运维开发人员比較多的使用cron命令,脚本,着重于系统资源的监控和划分。现在流行的devops好比ansible工具让运维与开发一鼓作气。运维开发人员首先是一个运维使用者,运维系统好比全网监控系统。包公布系统,主机探測系统。域名系统等都是运维开发人员的方向。一个运维开发人员不作详细业务,也不是直接为详细业务服务,而是让详细业务可以专一于详细业务。
通常的技能要求:常用运维命令,脚本。python
安全开发人员有两种。一种是怎样让本身开发的软件更安全,还有一种是就是开发安全防御软件。好比病毒扫描,防火墙,入侵检測,漏洞管理,权限控制等。
除了对安全使用者的技能的掌握外,还需要更深刻的了解白帽子们的安全防御细节和原理。一般能防的人也能攻。不知作别人怎么攻就在防基本是瞎防。攻防是互动进步的。
内核里有很是多针对安全开发的特性提供:内核加密接口和秘钥环、ASLR(进程启动栈随机化)、LSM机制。
作安全开发对系统自己的特性利用不大,对攻防手法的理解要求比較大。另外。防护系统一般是在业务的前面,因此要求低延时和高吞吐。因此基本上仅仅能使用C/C++(假设你见到哪一个防火墙用python写的,麻烦给我膜拜一下)。
因此安全开发的核心是业务和高效编程的能力。
而高效编程好比对dpdk、sse指令集的使用就是一个专门的学科了。业务就是安全相关的知识点。
大部分应用的后台就有两个要求:开发快,问题少。因此现在的市面上你会见到大把的时候golang、python甚至java作后台开发的案例。这样的形式的后台开发基本与操做系统无关,懂得主要的linux系统使用便可。
人们可以专一的面向业务。
内核开发人员的难度应该是最难的,假设谁提交了一个patch被内核接受了,那是很是了不得的事情。因为内核自己进展就很是大。并且内核开发没有市场上的职业相应,基本全靠偶然接触或者兴趣。职业最多的是驱动开发和内核裁剪小改动,另外文件系统开发和网络开发对内核也涉及到一些内核开发。因为内核的庞杂和耦合性比較重,学习自己就很是难了,更别说开发。但是假设你已经可以开发了。那很是多牛逼的开发就可以如探囊取物了,就像写一个C++程序那么顺手。
驱动开发对uevent、kobject系统的了解需求比較多,明确udev程序和dev文件夹的工做原理。设备号的管理,主要的内存申请和使用。进阶的可以了解内核socket编程。进程的控制等。内核驱动的编程最主要的仍是业务,要知道你控制的设备的寄存器和相应的总线在内核中的逻辑。
好比所有磁盘都是使用scsi命令,都要通过scsi层,usb。pci等总线的运做和内核接口的使用。
因为一切皆文件的思想,因此文件系统在linux中特别重要。
你得可以建立虚拟的设备,得学会利用dev下的设备,重要的,你得学会使用fd。这个fd就是简单的C里面open一个文件以后生成的那个,但是也是socket()以后生成的那个,因为是系统资源,因此fd是跨进程的,你仅仅要知道fd的号码,就可以在其它进程中直接使用。比方0,1,2(实际不是这个号码)号的fd就是输入输出和错误。
因此经过shell事实上可以作好多事情(O(∩_∩)O)
内核层次的文件系统开发,必须得了解文件使用的整个流程,一切皆文件仅仅是最上面的vfs层。往下还有通用块层(在这里要进行重要的电梯算法),还要scsi层,要把对逻辑文件的訪问变为对物理存储訪问的命令,还要pci层。还要usb层。逻辑成真总要通过物理。因此物理协议实现的了解也是必须的。
内核中提供了很是多默认的文件系统操做,很是多实现的文件系统都直接使用的默认的实现。有一类关键的文件系统是fuse,在用户端实现的。像个程序同样。这是内核为版权保护作的折中。
内核现在愈来愈多的倾向于把功能让给用户空间,大内核的思想在收缩。
因为开源的力量在一个点上确实不如商业高效。
文件系统通常可以以模块的方式提供,可以很是easy也可以很是复杂。因此文件系统开发对内核的了解与其它差异不大。但是对文件系统自己有比較高的知识储备要求。
好比完整性校验,extends大块。磁盘配额,磁盘訪问控制acl,热插播。B+树等。
Linux内核自己的网络协议栈比較低效,但是可以应付绝大多数的使用状况。使用内核原生的协议栈时,一般是使用netfilter的hook。用内核的模块作一些事情。对内核代码自己的改动是不建议的。详细作安全仍是包变换,有很是多netfilter的iptable自己就可以作。bpf更是提供了可编程的规则。
因此内核层面的网络开发核心是netfilter。
对于有高性能要求的。通常有新浪的fastsocket和intel的dpdk这两种协议栈可以供选择。fastsocket眼下还不支持长链接,但是nginx这样的短链接应用会收益良多。
dpdk没有socket的概念。纯粹的包处理,并且是在用户空间,完美的支持多CPU和numa系统。因此你可以看到阿里。腾讯,谷歌,百度等都是用dpdk来作的网络。