Linux学习二三事
首先,这篇文章是写给那些想成为linux高手,并真正想用linux做些事情的人。作者没有读过内核源代码,不知道 linux工作原理等等,但是通过学习摸索,至少找到了通往高手的道路的方向。1、linux不是玩具
如果你想系统的学习linux,你必需清楚的认识到这一点。现在有很多人,号称是linux爱好者,但是他们大部分的事情还是用windows 做,而linux只是作为一个随便玩玩的系统。他们懂得一些linux的基本操作,知道有linux这个玩艺,也因为经常听人家说linux好就咬定了 linux就是好。只要有人说linux比windows差,那么他们就奋起反驳,他们也看不起用windows的人,认为用windows的人水平低。 但是自己用电脑的大部分时间还是用windows并且把重要的文件都放在了windows分区,因为他们骨子里只把linux当做玩具,没有真正领悟 linux的精髓所在。如果你真正想系统的学习linux,想用linux有所作为,那么请忘记windows的思维方式,慢慢感受和习惯linux的操 作方式,总有一天你会真正体验到他的奥妙所在,从而从自己内心深处喜欢他,使用他,而不是为了赶时髦或向人炫耀而使用他。
2、手头有一本好的入门教材吗
“如果你还没有好好的读完过一本linux安装及入门教材就不要到初学者论坛来问题!因为你连问问题的资格都没有! ” 这是我的一个比较偏激的观点。
如果你现在开始下决心学习linux了,那么第一件你要做的事情是到书店去挑一本好书。而不是到论坛社区去问该用什么版本,该如何学习 linux。一本好的入门教材可以让你快速领悟linux的操作方式,系统的基本使用等等。而且都是前人总结经验写出来的,他可以帮你搭起一个学习 linux的框架,对linux有一个总体的认识。就好比建一撞大楼前先打好地基,搭好混凝土框架。以后就可以慢慢往这个框架里添砖加瓦,最后建起大楼。而那些想急于学习的,不想看书,只想靠混论坛来学习linux知识的人,就好比建一撞大楼,今天建好第一层,然后第一层就要全部粉刷好,装修好,家具买好住进去,然后第二天再开始建第二层。这样没有整体规划的学习是学不好linux的,最后的结果是浪费自己的时间,也浪费别人的时间。如果你不信,可以让实事去告诉你,以一年为限,你和你的一个朋友同时从开始学linux,计算机基础差不多。你去买几本好书自己慢慢看边看边做实验,让你的朋友整天到各大论坛瞎混零散的学些linux知识。也许一开始,你的朋友会比你懂得多,但是一年以后你的水平肯定在你的朋友之上。在初学阶段,不要随便在论坛上发问,多看书是根本,即使真的非问不可的问题,也要先自己动手察资料解决。实在不行再来问,高手不会鄙视菜鸟,因为每一个高手都是从菜鸟过来的,他们都知道菜鸟的苦衷。但是高手会看不起那些自己不愿动手动脑不会学习解决问题而只想得到现成答案的人。那样的人会被高手在心里暗骂成不配用linux的蠢货。
你需要以下几种书:一本好入门教材->一本linux指令参考手册->linux系统管理手册->讲解linux系统原理的书。
一开始,你只需要入门教材就可以了。并且严格安教材的讲解去学习,不要一天到晚想着去装显卡驱动啦,装游戏啦,装软件啦,这些都没有必要。你就当你自己的电脑不能上网,只能通过 看书学习。慢慢看书,稳抓稳打。慢慢地就融会贯通了。这时候你再到linux初学者论坛去看看,你在那里早已经是高手了。
另外,一开始你要选定一本入门教材,但是不能只看一本,因为有些书上讲的,可能是另外的书上没有的。因此,重点选一本教材看完。然后再看两三本入门教材浏览一下。作为对第一本书的知识的扩充和巩固。在看书过程中,如果你有什么不懂的,不要急于上论坛问,自己认真看几次,实在不懂没有关系,把问题放在那里。不要钻牛角尖不懂不肯放手,这种精神是好的,但是方法是错误的。你尽管学下去,也许你看完书本以后的内容,就对前面不懂的内容豁然开朗了。这是在学习linux中常有的情况。
另外,现在很多入门书籍是针对非技术型用户的。(我把那些对linux本身不感兴趣,只想用他来上网,听音乐和打字的人称为非技术型用户,而把对linux本身感兴趣的人称为技术用户)
这些针对非技术型用户的入门书籍几乎通篇都是插图,讲解的内容都是如何在图形界面下操作。这些书籍并不能帮你成为一个高手。反而会让你养成倚赖鼠标和图形界面操作的习惯以后很难改掉。因此不能看这些书,一定要买那些一开始就从系统基本机构基本命令开始讲解的书籍。我看过的第一本linux入门书籍共有十多章,但是他从第十一章开始才大致的讲解了一下图形界面的知识。我很感谢这本书,让我一开始就脱离了windows的思维方式,给我以后的进一步学习带来了很大帮助。
完成以上的内容,你就完成了建大楼打地基建混凝土框架的过程了。可以接下来进一步学习了。
3、你看完系统自带的文档了吗?
当你完成入门的过程后,就可以开始读其他的文档,然后到论坛的精华区看看,向你建起来的大楼框架中添砖头了。当然,首先要读的,还是系统自带的文档。
绝大多数linux发行版都自带非常详细的文档。比如我一直在用的redhat,他有从系统安装到系统安全,针对不同层次的人的详尽文档。静下心来,把这 些文档读完,比看任何论坛的精华区都有用。书籍和文档就好比是你每天都离不开的一日三餐,论坛区的精华文档就好比是点心和水果。你可以不吃点心和水果,但是决不能不吃正餐。
当然,不能为看文档而看文档,你一定要边看边安文档中说的做试验验证。这样才印象深刻,否则看过就忘记了等于没有看。另外,如果真心想学习linux就不 要吝啬,也不要害怕丢失数据而不敢做实验。我建议你去买一个小的二手硬盘,然后放开手干。不要怕丢失数据而不敢做,如果你没有学会技能,将来做了 linux系统管理员或者网络管理员到那时因为不会而丢了数据就是大事情了。
4、学习linux不是逛自由市场。
经常看到有人问用什么版本的linux好,其实只要你认真学习无论什么版本都挺好的。要知道,开发linux发行版的人都是通读过linux内核代码,对 linux原理极其精通的人,而且每一个开发团队都对他的发行版做过测试后放出的。那些国际知名的大品牌更是如此。 因此,讨论什么版本好并无意义,关键是你是不是真心想学。不过,为了避免曲高和寡,最好选用的人多的版本,比如redhat manrake suse 等等。 国内有一两个linux版本做的也不错,但是国内的linux都是面向非技术型用户开发的,因此,如果你想成为高手,建议不要用国内的版本。
学习linux不是逛自由市场,选定版本就要静下心来学习。不要今天换版本明天要升级。这样对你没有好处。我见过一些人号称用过十几种甚至几十种 linux,向人谈论起来头头是到,好像懂的很多,但是如果你让他去用linux搭建一个web服务器,做一个linux网关,他就什么都不会了。他们把 时间都浪费在了版本的转换上了。
5、你能看懂英文文档吗?
谈论这个问题,我有点低气不足,因为我自己的英语很差。但是,至少我可以无障碍的读完一般的计算机文档。计算机英语很简单,只要熟悉了计算机专业英语,高中毕业的水平就可以轻松的阅读计算机文档了。如果你的英语实在太差了,连最简单的计算机英语文档都看不懂,那么在学习linux的同时,请赶紧学习英语。也许你说,你可以看翻译的文档,当我还是一个菜菜鸟的时候,也是这样认为的。但是,后来才发现,如果你想深入学习linux,看不懂因为文档实在是太难了。写的最好的,最全面的文档都是英语写的,最先发布的技术信息也都是用英语写的。即便是非英语国家的人发布技术文档,也都首先翻译成英语在国际学术杂志 和网络上发表。你去看看各大软硬件生产商的官方网站,有哪一个不是用英语作为其主站的? 长期用windows的人会很不习惯这一点,装个软件还要看半天文档,应为windows用起来实在太简单了。但是如果你想学习linux就必需学会看各种文档,而大部分的文档都是用英语写的。我发现很多人甚至连man文档都不会看,有什么命令不会用了就跑到论坛上来问,还装出一副可怜相,乞讨一个命令的用法。有这些时间还不如自己看看man文档,即使你一个一个单词的翻译成中文再自己看都比问别人强,因为别人的回答再怎么详尽都比不上man文档详尽。安 装一个新的软件时先看README,再看INSTALL然后看FAQ,最后才动手安装,这样遇到问题就知道为什么。否则,说明文档都不看,结果出了问题再来找答案反而浪费时间! 古人说欲速则不达就是这个道理!
6、忘记windows的思维方式
思想性的转变比暂时性的技术提高更有用,因为他能帮助你加快学习速度。现在很多人用linux。但是,他们用linux的方式完全是 windows的那一套方式。骨子里都是windows的思想。这样是不能领悟linux的精髓体验不到他的优越性的。我前几天看到一个朋友要把刚装了不到2天的mandrake 10 删除掉,我问他为什么,他说太慢了,受不了,还是用windows快。然后我留意了一下他用linux的方式,他的所有操作都带着windows的影子。 他连最基本的删除,移动文件这样的操作都要用鼠标,这样当然慢了!最后我只好说,你删除吧,你不适合用linux,linux不是这样用的。各位可以去看 看那些linux高级用户,他们是怎样操作的。通常他们都是在X上开一个xterm或者rxvt终端,80%以上的操作都在这个终端下用命令完成,因为 linux的命令行十分强大,速度也十分快,简单的几个命令的组合就能完成非常复杂的操作。举一个例子:linux的常用命令find,去看看man文档,初学者一定会觉得太复杂而不原意用,但是你一旦学会了就对他爱不释手。他的功能实在太强了,在配合exec参数或者通过管道重定向到xargs命令和 grep命令,那么他能完成非常复杂的操作,如果同样的操作你用图形界面的工具来完成,恐怕要多花十几倍的时间。因此linux高手经常会说:如果没有 find和grep我们还怎么活。但是现在大部分的linux初级用户受到windows影响都喜欢用图形界面的工具来完成一些基本的操作,我并不是说图 形界面不好。只是由于linux和windows设计思想的不同他们的操作方式也有很大不同。在windows下用图形界面操作会比敲命令快,但是 linux是一个命令行组成的操作系统,他的精髓在命令行! 无论图形界面发展到什么水平这个原理是不会变的!
7、入门以后多学命令
当你看完了一两本入门书籍后就应该扩充自己的知识,多学习linux命令,但是不要在初学阶段就系统的学习linux命令,初学阶段只要学会书上提到过的 命令就可以了。单靠学习各种命令而成为高手是不可能的,但不会命令而成为高手也是不可能的。这就好比学英语,什么语法都不懂,只捧着单词手册背单词是学不 会英语的,但是没有单词词汇量英语水平也提不高的。
在linux中学习命令的最好办法是学习bash脚本编程。bash脚本比起其他语言来学习简单,但是功能却十分强大。通过学习bash编程,能让你掌握 大量的linux命令。另外,买一本命令参考手册是必要的,遇到不知道怎么用的命令可以随时查询,这要比察man文档快。特别适合英语不好,看不懂man 文档的人。
在linux中,命令可分为系统基本命令和应用程序命令。系统基本命令是所有的unix类系统都支持的命令,走到哪都不变,只要是unix类系统上就肯定 有。比如ls,rm,rmdir,cp,cd,mv,cat等等。这样的基本命令大约有200个,这些命令是一定要掌握的,我买了一本这本书非常好,他根据命令的常用指数分类,标明3颗星的为最常用命令,一定要掌握,两颗星的其次,1颗星的只要知道一下就可以了虽然 现在都已经FC3了,但是经典的UNIX基本命令几十年来都没有变过!另外有些命令是linux特有的或者是某一个应用程序的可执行文件比如xmms播放 器。这些只要知道就可以了,不知道也无所谓。有些命令比较少用,因此通常都记不住他的用法,对于这些命令至少要知道有这个命令,脑子里有印象,需要用的时 候察一下手册就可以了,但是决不能不知道这个命令的存在!
8、学会管理系统
等到有了基本知识,也掌握了一定量的命令用法后,就可以进一步学习管理系统。这些内容入门书上会有,但是不会很深入。要深入的学习系统管理,就要去买一本 类似之类的书。认真的看书并做实验,可以让你很快的进步。学习配置各种网络服务器,用linux搭建网络,这些都 是学习linux系统管理和网络管理的好方法。 到了这个阶段就可以经常上网察察资料,看发布软件的官方网站文档和FAQ,看看论坛精华区文章。但是不能本末倒置,多看书还是根本。书籍和官方文档可以让 你系统的学习,但是论坛可以让你学到一些小知识,小技巧。我本人也经常到论坛上来看看,因为即便是一个新手,也可能会发现一些你所不知道的小技巧,看论坛 可以学到这些小技巧。但是我看文档和看论坛的时间比不会小于4:1 。 可以把平时积累的问题一次在论坛上发问。 但是初学的时候不要频繁上论坛,因为你要问的问题都在书上写着,耐心一点,你很快就能看到了。
9、了结系统结构
等你有了一定的系统管理知识,知道了/etc下那些配置文件有什么用,知道了一般的网络服务器如何配置后,就可以去了解系统结构了。 了解系统结构不是要你去看什么文件夹放什么内容,而是要学习一些原理性的东西。比如系统是如何引导的,引导后启动了那些东西。系统中哪些是最基本的库文 件,有什么用等等。学习系统结构的最好方法是自己做一个linux系统,再也没有什么能比自己做一个linux系统更能学习系统结构的了。LFS (linux from strach)可以教你从源代码自己编译一个系统。通过自己编译一个系统,你就可以了结linux系统结构,知道哪些文件是干什么用的,以及他们如何协调 工作。当然,在你达到LFS水平之前还有很多事情要做,比如学会如何编译安装源代码发布的软件和编译新的内核等等。到了LFS水平,那么在大多数 linux论坛上你就可以被人称作”高手”了!到了这个地步,就相当于一撞大楼已经基本建好,但是还需要粉刷和装修,真正的细活还在后面!

永远记住天外有天,人外有人的道理。即便有了LFS水平,在那些搞linux系统开发,通读过linux内核代码的人看来你还是一个菜鸟。因此请时刻保持虚心的态度。即便是在 论坛上只有一颗星级别的人,也有可能是一个潜在的,真正的高手! 大多数真正的高手平时都在搞研发工作,哪里有时间上论坛啊! 倒是有很多大学还没毕业的学生,整天混在论坛上。
10、学习专业课程
如果你不是计算机专业的,而想把linux学好,就一定要学习专业课程。学习微机原理,操作系统,计算机网络等等专业课程是必需的。为什么同时开始学习 linux,有些人学的非常快,不到半年就成了高手,有些人玩来玩去还玩不出名堂,玩了一两年还是菜鸟? 因为那些学得快的人有基础,他们都学过专业课程。同样一篇文档,没有基础的人可能看了三遍还不明白,基础扎实的眼睛扫两下就懂了! 这就是专业和非专业的差别! 因此,要想达到更高的境界就一定要学习基础的专业课程。
11、保持虚心学习的态度
天外有天,人外有人。保持虚心的学习态度不仅能让你学到更多知识,而且会让你受人尊重。在linux的世界里,越是水平高的人越谦虚,因为他们知道自己还有很多不知道的。
上文源自:互联网
看完上面的学习指导,是否还是有不明白的地方呢,不妨来看看红帽公司的考试要求,能提供更明白的技能方向,RHCSA 8(EX200)认证考试目标:
红帽认证的系统管理员(RHCSA)是最抢手的Linux认证之一,红帽(Red Hat)对旧的RHCSA考试进行了一些更改,包括从RHEL 7切换到RHEL 8 Linux系统。创建RHCSA考试(EX200)旨在测试您在各种环境和部署方案中的系统管理知识,在RHCSA考试中测试的技能是所有Red Hat产品进行系统管理的基础,在参加RHCE考试之前,您需要通过RHCSA考试。RHCSA的考试目标,它们分为以下8个类别。
1.了解和使用基本工具
访问shell提示符并使用正确的语法执行命令。
使用输入输出重定向(>, >>, |, 2>等)。
使用grep和正则表达式分析文本。
使用SSH访问远程系统。
登录并在多用户目标中切换用户。
使用tar,star,gzip和bzip2存档,压缩,解压缩和解压缩文件。
创建和编辑文本文件。
创建,删除,复制和移动文件和目录。
创建硬链接和软链接。
列出,设置和更改标准ugo/rwx权限。
在/usr/share/doc中找到,阅读和使用系统文档,包括手册,信息和文件。
2.操作正在运行的系统
正常引导,重新引导和关闭系统。
手动将系统引导到不同的目标。
中断引导过程以获取对系统的访问权限。
识别CPU/内存密集型进程并终止进程。
调整流程安排。
查找和解释系统日志文件和日志。
保留系统日志。
启动,停止和检查网络服务的状态。
在系统之间安全地传输文件。
3.配置本地存储
列出,创建,删除MBR和GPT磁盘上的分区。
创建和删除物理卷。
将物理卷分配给卷组。
创建和删除逻辑卷。
配置系统以在引导时通过通用唯一ID(UUID)或标签挂载文件系统。
添加新的分区和逻辑卷,并以无损方式交换到系统。
4.创建和配置文件系统
创建,挂载,卸载和使用vfat,ext4和xfs文件系统。
使用NFS挂载和卸载网络文件系统。
扩展现有逻辑卷。
创建和配置set-GID目录以进行协作。
配置磁盘压缩。
管理分层存储。
诊断并纠正文件权限问题。
5.部署,配置和维护系统
使用at和cron安排任务。
启动和停止服务,并将服务配置为在启动时自动启动。
配置系统以自动引导到特定目标。
配置时间服务客户端。
从Red Hat Network,远程存储库或本地文件系统安装和更新软件包。
使用软件包模块流。
修改系统引导程序。
6.管理基本网络
配置IPv4和IPv6地址。
配置主机名解析。
将网络服务配置为在启动时自动启动。
使用firewall-cmd/firewall限制网络访问。
7.管理用户和组
创建,删除和修改本地用户帐户。
更改密码并调整本地用户帐户的密码使用期限。
创建,删除和修改本地组和组成员身份。
配置超级用户访问
8.管理安全性
使用firewall-cmd/firewalld配置防火墙设置。
为SSH配置基于密钥的身份验证。
设置SELinux的强制和许可模式。
列出并标识SELinux文件和进程上下文。
恢复默认文件上下文。
使用布尔设置修改系统SELinux设置。
诊断并解决例行SELinux策略违规。
特别说明
以上就是新的RHCSA 8(EX200)认证考试目标,您只有掌握以上列出的Linux技术,才有可能获得该认证。同时Red Hat鼓励您考虑采用Red Hat System Administration I(RH124)和Red Hat System Administration II(RH134)来帮助进行准备。
Linux内核一览
使用linux是避不开的kernel,但是内核的内容实在是太多了,每一个子系统都能出好几本书。期望在遇到问题之前,将kernel的知识全部了解,是不实际;需要找到一种方法,能够快速地找到与问题相关的知识。搜索引擎都是不靠谱的,因为通过搜索只能得到零碎、不一定正确的内容,构建起知识体系,关注第一手资料的索引才是王道。Kernel源码中包含到文档很丰富、收集了kernel各个方面的内容:Linux Kernel Documentation 在线阅读。红帽(RedHat)Linux的产品文档是特别优秀的资料:Product Documentation for Red Hat Enterprise Linux,知识库也是很靠谱的:redhat knowledgebase。

《Linux 内核完全注释》和《品读 Linux0.11 核心代码》,大致理解 Linux0.11 内核的全貌:




sysctl
内核有非常多可调整参数,它们在/proc和/sys目录中以文件的形式暴露出来。Kernnel的Documentation/sysctl目录汇聚了所有内核参数。
memory
可以用命令slabtop查看kernel memory的使用情况,或者直接查看/proc/slabinfo。
NUMA
NUMA和与硬件平台相关的. 简单讲就是有的硬件平台支持多个CPU, 多套内存。每一个这样的单位看作是一个cell, 每个cell有必须一个独立的处理器,cell可以有或者没有自己的内存。cell内部的处理器可以访问cell本地的内存,也可以访问另一个cell的内存, 前者的访问速度比后者快。
NUMA使多个cell并行的运行,内存的带宽可以随着具有本地内存的cell数量增加而增长。同时也带来了一些需要考虑的问题:
1.cell上的执行进程申请内存的时候, 根据怎样的策略尽心内存分配?
2.进程是否可以在cell间迁移, 进程的资源是否可以在cell间迁移, 迁移的策略是怎样的?
3.应用程序要怎样利用numa获得较高的性能?
问题1和问题2在内核文档由详细介绍。问题3则是程序员需要考虑的,可以想到以下几点:
1.考虑将进程绑定到特定cell,消除迁移开销
2.减少对其它cell的内存的访问
3.精细控制进程使用的内存,例如明确指定某块内存需要从cell本地获取(在做设计的时候就要考虑这一点)
关于NUMA环境下的内存分配策略可见:linux-3.2.12\Documentation\vm\numa_memory_policy.txt
可以通过linux的系统函数指定进程的某段地址空间的内存分配策略,策略作用域如下图:
+------------------------------------------------------------------+
| Default Policy |
| |
| +--------------------------| +--------------------------| |
| | Task/Process Policy | | Task/Process Policy | |
| | | | | |
| | +-----------------+ | | +-----------------+ | |
| | | VMA Policy | | | | VMA Policy | | |
| | +-----------------+ | | +-----------------+ | |
| | | | | |
| | +-----------------+ | | +-----------------+ | |
| | | Shared Policy | | | | Shared Policy | | |
| | +-----------------+ | | +-----------------+ | |
| | | | | |
| +--------------------------+ +--------------------------+ |
| |
+------------------------------------------------------------------+
1.Default Policy是 local allocation
2.中心的Policy掩盖外围的Policy
3.设置新Policy不影响设置之前已经使用旧Policy进行了实际内存分配的地址空间
4.Task/Process Policy作用于单独的进程整个地址空间, 子进程继承父进程的Task/Process Policy,子线程继承父线程的Task/Process,兄弟线程直接互不相干
5.VMA Policy只作用于anonymous pages(栈、堆、使用MAP_ANONYMOUS标记并且没有MAP_SHARED标记的mmap空间)
6.共用同一个虚拟地址空间的Tasks(例如线程)在该虚拟地址空间上使用同样的VMA Policy
7.Shared Policy作用于进程间共享的内存, 共享此空间进程在这空间见到的同样的Shared Policy(shmget、使用MAP_SHARED标记的mmap空间)
8.Default Policy作用于整个系统
Task/Process Policy作用于整个进程地址空间
VMA Policy和Shared Policy作用于单独进程地址空间中的某段地址
VMA Policy和Shared Policy的作用的地址空间可以分割
9./proc/XXX/numa_maps中可以看到整个进程Policy状态
NUMA环境下的内存分配策略比较复杂,看中文描述时容易出现一字之差谬之千里的情况,所以强烈建议阅读英文版的内核文档。Linux提供了三个系统调用用于控制NUMA的内存策略:
set_mempolicy //set default NUMA memory policy for a process and its children
get_mempolicy //Retrieve NUMA memory policy for a process
mbind //set memory policy for a memory range
在linux还可以使用numactl命令指定进程或者共享内存的分配策略
numactl
关于NUMA环境下的页面迁移:linux-3.2.12\Documentation\vm\page_migration。
NUMA环境下,进程运行时,进程的虚拟地址空间没有发生变换,但对应的的物理内存可以在多个node之间迁移。node是linux-3.2.12\Documentation\vm\page_migration中提到的词,指的应该是拥有独立内存的cell。当进程被调度到另一个node上执行时,将该进程使用的物理页迁移到执行该进程的node上,可以提高内存存取速率。
进程迁移函数:move_pages
Hugepages:linux-3.2.12\Documentation\vm\hugetlbpage.txt
使用hugepages的目的是减少内存页面总数,提高TLB缓存的命中率。
《深入理解计算机系统结构》中对内存的地址转换有非常详细的说明。
进程见到的内存地址只是内存的虚拟地址,不是真正的物理内存的地址,因此在访问内存的内容时,需要将内存的虚拟地址转换成实际的物理地址。而内存的虚拟地址和物理地址的对应关系是通过页表结构管理的。为了提高地址转换的效率,CPU中存在TLB页表项缓存,但是缓存的大小是非常小的。因此如 果减少页表项的数目, 可以延长TLB中缓存的页表项的刷新周期,从而提高命中率。使用前提:
kernel is build with option CONFIG_HUGETLBFS
查看内核编译选项:
cat /boot/config-`uname -r`
信息查看
整体信息:
cat /proc/meminfo
HugePages_Total: vvv
HugePages_Free: www
HugePages_Rsvd: xxx
HugePages_Surp: yyy
Hugepagesize: zzz kB
where:
HugePages_Total is the size of the pool of huge pages.
HugePages_Free is the number of huge pages in the pool that are not yet allocated.
HugePages_Rsvd is short for "reserved," and is the number of huge pages for
which a commitment to allocate from the pool has been made,
but no allocation has yet been made. Reserved huge pages
guarantee that an application will be able to allocate a
huge page from the pool of huge pages at fault time.
HugePages_Surp is short for "surplus," and is the number of huge pages in
the pool above the value in /proc/sys/vm/nr_hugepages. The
maximum number of surplus huge pages is controlled by
/proc/sys/vm/nr_overcommit_hugepages.
不同size大小hugepage的信息:
/sys/kernel/mm/hugepages/hugepages-2048kB
NUMA环境单个node的内存状态:
/sys/devices/system/node/nodeX/meminfo
配置参数:
/proc/sys/vm/nr_hugepages //persistent huge pages number
hugepage申请
hugepage申请其实就是将物理内存中一块单独的划分出来,对这部分内存使用大内存页。对于2M的内存页可以在系统运行时直接修改/proc中参数分配,1G的内存页必须在系统启动时分配。
在系统运行时分配页面大小为2M的内存:
//分配1024个2M的内存页
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
//如果是NUMA机器,需要在每个node上单独分配
echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
在系统启动时通过内核参数指定要分配的内存:
hugepages=XXX //hugepages页面数目
hugepagessz=XXX //hugepages页面的大小
default_hugepagesz=XXX //hugepages默认页面大小
通过/proc申请:
/proc/sys/vm/nr_hugepages //已经分配的hugepages的页面数目(with default hugepage size),可以通过修改里面的数值增加/删除页面
注意:hugepages分配后,使用的内存不能在做其它用途,也不能被swap out。
注意:申请hugepages不等于使用hugepages,申请是系统预留了这部分空间。
在NUMA环境中,会从每个node上尝试申请内存,如果某个node缺少足够的连续内存,这些页面被其它的node分担。这也意味着hugepages应当尽可能早的分配,在内存有足够连续的空闲的时候,例如启动时。
hugepages使用
linux-3.2.12\Documentation\vm\中给出了两个使用示例:hugepage-mmap.c,hugepage-shm.c
在使用下面的方式的时候,注意关闭selinux,否则会发现无法对hugepage进行操作,并会看到内核日志。
使用mmap的方式
在系统中挂载一个类型为hugetlbfs的虚拟文件系统,在其中写入的任何数据都保存在hugetlbfs中:
mount -t hugetlbfs nodev /mnt/huge
使用shm的方式
直接使用shmget申请SHM_HUGETLB,见man shmget。
应用
已经有一些应用程序支持hugetlbfs,例如mysql、oracle、dpdk等。在使用某个应用程序时要注意查阅手册中有没有相关内容。
networking
网络相关的文档位于Documentation/networking中。
cgroup
通过cgroup(Control Group)可以限制Tasks可以占用的资源,总共包含8类资源:
1. Block IO Controller
2. CPU Accounting Controller
3. Device Whitelist Controller
4. HugeTLB Controller
5. Memory Resource Controller
6. Network Classifier
7. Network Priority
8. Cpusets
9. Freezer
通过mount和文件操作就可以使用cgroup(内核文档中有示例)。
libcgroups是一套操作cgroup的C Library。cgroup的每个Controller都有一套不同的虚拟文件,有的用于显示状态信息和统计数据、有的用于设置cgroup参数。
UIO - User-space drivers
UIO技术是指将Linux Device
Driver拆分成两部分,一部分是非常小的内核模块,只包含必须在内核中实现的部分,另一个部分则是在用户空间的实现的具体操作。通过这种方式,可以将驱动开发的大部分任务由内核空间移动到用户空间,简化了开发过程,并且降低了在内核模块引入严重BUG的风险。
UIO设备的信息可以在用户空间从设备或者sysfs中获得,UIO设备的设备文件依次命名为/dev/uio0、/dev/uio1、/dev/uio2…
对UIO设备文件进行read()、select()时,阻塞获得产生的中断号。
对UIO设备文件进行write()时,根据写入的32bit的值,disable/enable对应的中断。
UIO设备的属性文件位于/sys/class/uio/uioX目录中,可以从用户空间读取数值。
UIO设备可以有1个或多个可以被mmap的内存区域,对应信息存放在/sys/class/uio/uioX/maps/mapX/中:
name: A string identifier for this mapping. This is optional, the string can be empty. Drivers can set this to make it easier for userspace to find the correct mapping.
addr: The address of memory that can be mapped. 可以被映射的地址
size: The size, in bytes, of the memory pointed to by addr. 空间的大小
offset: The offset, in bytes, that has to be added to the pointer returned by mmap() to get to the actual device memory. This is important if the device's memory is not page aligned. Remember that pointers returned by mmap() are always page aligned, so it is good style to always add this offset.
x86平台上,UIO设备的ioport信息位于/sys/class/uio/uioX/portio目录中,可以在用户空间使用ioperm()、iopl()、inb()、outb()等进行操作。
namespace
类别:
Mount namespaces (CLONE_NEWNS,2.4.19): 文件系统挂载隔离
UTS namespaces (CLONE_NEWUTS,2.6.19): hostname、NIS domain name隔离
IPC namespaces (CLONE_NEWIPC,2.6.19): IPC资源隔离
PID namespaces (CLONE_NEWPID,2.6.24): 进程号隔离
Network namespaces (CLONE_NEWNT,2.6.24,2.6.29): 网络隔离
User namespaces (CLONE_NEWUSER,2.6.23,3.8): 用户和组的隔离
with Linux3.8, unprivileged processes can create user namespaces in which they have full privileges.
namespaces API
clone():创建namespace
setns():将调用进程从当前namespace移动到另一个namespace
unshare():创建namespace,并将调用进程加入到新建的namespace
AppArmor
AppArmor用于控制Linux程序的操作权限。内核从2.6.36开始整合了AppArmor。
SELinux
SELinux是flask体系在linux上的实现,旨在提供强制的访问控制, 提高系统的安全性。SELinux Background介绍了SELinux的产生过程。
NSA的“National Information Assurance Research Laboratory”的研究员与“Secure Computing Corporation (SCC)” 合作开发一种基于类型强制(Type Enforcement)高强度的、灵活的强制访问控制架构。最早在“LOCK”系统上实现了该 架构,随后NSA和SCC开发了该架构的两个“Mach-based”的原型:DTMach和DTOS。
然后NSA、SCC与犹他大学(Utah)的“FLUK”研究组将该架构迁移到“Fluke”的研制工作中,在这个过程中这套架构得到了强化,能更好地支持动态策略,被命名为“Flask”。最后NSA将“Flask”架构集成到了Linux系统中,NSA的工作被Linux接收,并被Solaris、FreeBSD、Darwin kernel等引入。
SELinux工作原理是进行强制访问控制(MAC, mandatory access control),每个文件和每个进程都有一个上下文(context),进程对文件进行操作时,SELinux检查该进程是否具有操作文件的权限。它提供了细致到进程的细粒度的权限控制,可以通过-Z选项查看文件或者进程的SELinux上下文:
//查看文件的SELinux上下文:
[root@localhost targeted]# ls -Z
drwxr-xr-x. root root system_u:object_r:default_context_t:s0 contexts
drwxr-xr-x. root root system_u:object_r:selinux_login_config_t:s0 logins
drwxr-xr-x. root root system_u:object_r:selinux_config_t:s0 modules
drwxr-xr-x. root root system_u:object_r:semanage_store_t:s0 policy
-rw-r--r--. root root system_u:object_r:selinux_config_t:s0 setrans.conf
-rw-r--r--. root root unconfined_u:object_r:selinux_config_t:s0 seusers
//查看进程的SELinux上下文:
[root@localhost targeted]# ps auZ|grep ssh
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 9820 0.0 0.0 103244 820 pts/1 S+ 00:39 0:00 grep ssh
上面 XX_u:XX_r:XX_t:XX 样式的内容就是SELinux上下文,各自字段含义如下:
user:role:type:mls
user: SELinux users
role:
type:
mls: Multi-Level Security
策略文件
在linux目录/usr/share/selinux/devel/中包含策略文件格式规范(需要安装有selinux-policy-3.7.19-195.el6.noarch)
[root@localhost devel]# pwd
/usr/share/selinux/devel
[root@localhost devel]# ls -l example.*
-rw-r--r--. 1 root root 185 Feb 22 2013 example.fc
-rw-r--r--. 1 root root 1033 Feb 22 2013 example.if
-rw-r--r--. 1 root root 516 Feb 22 2013 example.te
Linux提供了SELinux的管理工具
修改文件或目录的SELinux Context:man chcon
策略管理:man semanage //SELinux策略管理
需要安装 policycoreutils-python 软件包。