linux中的inode

在阿里云的监控平台上看到Inode占用率,查了下资料,复制了一篇文章,原文链接:http://www.ruanyifeng.com/blog/2011/12/inode.html

inode是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础。

我觉得,理解inode,不仅有助于提高系统操作水平,还有助于体会Unix设计哲学,即如何把底层的复杂性抽象成一个简单概念,从而大大简化用户接口。

下面就是我的inode学习笔记,尽量保持简单。

===================================

理解inode

作者:阮一峰

一、inode是什么?

理解inode,要从文件储存说起。

文件储存在硬盘上,硬盘的最小存储单位叫做”扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。

操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个”块”(block)。这种由多个扇区组成的”块”,是文件存取的最小单位。”块”的大小,最常见的是4KB,即连续八个 sector组成一个 block。

文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点”。

每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。

二、inode的内容

inode包含文件的元信息,具体来说有以下内容:

  * 文件的字节数

* 文件拥有者的User ID

* 文件的Group ID

* 文件的读、写、执行权限

* 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。

* 链接数,即有多少文件名指向这个inode

* 文件数据block的位置

可以用stat命令,查看某个文件的inode信息:

  stat example.txt

总之,除了文件名以外的所有文件信息,都存在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节点的大小,可以用如下命令:

  sudo dumpe2fs -h /dev/hda | grep “Inode size”

由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。

四、inode号码

每个inode都有一个号码,操作系统用inode号码来识别不同的文件。

这里值得重复一遍,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。

表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。

使用ls -i命令,可以看到文件名对应的inode号码:

  ls -i example.txt

五、目录文件

Unix/Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。

目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。

ls命令只列出目录文件中的所有文件名:

  ls /etc

ls -i命令列出整个目录文件,即文件名和inode号码:

  ls -i /etc

如果要查看文件的详细信息,就必须根据inode号码,访问inode节点,读取信息。ls -l命令列出文件的详细信息。

  ls -l /etc

理解了上面这些知识,就能理解目录的权限。目录文件的读权限(r)和写权限(w),都是针对目录文件本身。由于目录文件内只有文件名和inode号码,所以如果只有读权限,只能获取文件名,无法获取其他信息,因为其他信息都储存在inode节点中,而读取inode节点内的信息需要目录文件的执行权限(x)。

六、硬链接

一般情况下,文件名和inode号码是”一一对应”关系,每个inode号码对应一个文件名。但是,Unix/Linux系统允许,多个文件名指向同一个inode号码。

这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为”硬链接”(hard link)。

ln命令可以创建硬链接:

  ln 源文件 目标文件

运行上面这条命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中有一项叫做”链接数”,记录指向该inode的文件名总数,这时就会增加1。

反过来,删除一个文件名,就会使得inode节点中的”链接数”减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。

这里顺便说一下目录文件的”链接数”。创建目录时,默认会生成两个目录项:”.”和”..”。前者的inode号码就是当前目录的inode号码,等同于当前目录的”硬链接”;后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的”硬链接”。所以,任何一个目录的”硬链接”总数,总是等于2加上它的子目录总数(含隐藏目录)。

七、软链接

除了硬链接以外,还有一种特殊情况。

文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的”软链接”(soft link)或者”符号链接(symbolic link)。

这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:”No such file or directory”。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode”链接数”不会因此发生变化。

ln -s命令可以创建软链接。

  ln -s 源文文件或目录 目标文件或目录

八、inode的特殊作用

由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。

1. 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。

2. 移动文件或重命名文件,只是改变文件名,不影响inode号码。

3. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。

第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。

(完)

linux copy directory

Some times I can’t remember how to copy the whole directory on centos, here is the code

cp -arf /home/test/*  /home2/test
#-a     Same as -dR --preserve=ALL
#-R, -r, --recursive    Copy directories recursively.
#-f    force overwrite
#-p    Same as --preserve=mode,ownership,timestamps
#-d    Same as --no-dereference --preserve=links.
#--no-dereference    Never follow symbolic links in SOURCE.

https://www.computerhope.com/unix/ucp.htm

转:我是怎样运用这本书,给自己的产品找用户的

原文:https://book.douban.com/review/7705859/
“Most startups don’t fail because they can’t build a product. Most startups fail because they can’t get traction.”

初次做产品,最常碰到的问题,就是产品做好以后,发现——“我靠,没有用户”
那怎么办呢?怎么才能给自己的产品找到用户?

难道,就要像其他人一样,在朋友圈里面做广告了吗?
我不喜欢朋友圈,也不喜欢在朋友圈打广告的人。而且,我的产品,朋友圈里目标用户也并不多

于是,读了这本书,思路开拓了很多,介绍了非常多找用户的办法,很有启发。我也才知道,原来找用户,并不意味着就一定要在朋友圈发广告。

以下是我读了这本书之后,运用来给我的产品找用户的,希望对大家能有所帮助

1. 整体思路

我的产品:Product Chase(http://productchaseapp.herokuapp.com/), 更有意思的产品和科技阅读
目标用户:做产品的人,e.g. 上Product Hunt, Hacker News, 读Paul Graham的人,产品经理等等

整体思路:论坛->Product Hunt等类似站点->软文投递

要点:
a. 逐次曝光,改进文案
不是一次性同步在多个地方曝光,而是逐个进行。一是因为刚开始,是MVP,主要还是看做的东西到底有没有用,有没有价值,而不是纯粹的市场推广;另一方面,我并不清楚刚开始应该怎么向别人介绍我的产品,怎么写比较简单自然,所以先一个一个帖子写,写得多了,最后自然就知道怎样介绍了,也就是文案的改进。

b. 逐步积累用户,方便之后拉票
大的网站,比如NEXT、知乎,想要凭一己之力就拿到流量,是非常难的
最好是能有人先投上几票,有一个基础的数据,这样可能更吸引人。
但是刚开始,用户为0,怎么去拉票呢?所以先从论坛、小的站点开始,找到最初的用户
当然,也可以直接拜托无关的人投票,只是我不想那样做,我觉得别人也不会很舒服

c. 重复曝光
我觉得,只看到一次产品,是很难成为用户的。应该重复出现几次,才有可能认识这个产品
另外,对于任何一个渠道,只曝光一次,也绝不会利用尽了它的流量。因为很有可能大家不是每天都看的。多曝光几次,也有可能得到更多的新用户。
所以,刚开始,是发链接,做纯粹的产品介绍。然后,可以分享一些数据、经历的文章作为二次曝光。

原则:不做“广告”。因为我讨厌广告。我真正在做的,是介绍一个我认为非常有用的东西,分享给大家(这也是我做这个产品的原因)。而不是发红包,然后“请大家转发~”。(这款产品的“软文”,也始终是在分享一些经历的同时,顺便介绍我的产品)

2. 具体过程

前期,主要是直接介绍产品,之后,是写一些经验分享,也顺便介绍自己的产品
不过我的产品,后来又多了一个功能(Tech2Pocket),因此之后又开始新一轮活动。所以,下面的并不是简单的“线性关系”,有前后两个阶段

第1阶段
a. 最早期,直接介绍,看看大家的反应
Product Hunt, 5.24 https://www.producthunt.com/tech/product-chase
RubyChina, 5.31 https://ruby-china.org/topics/25821
实现, 6.7 http://shixian.com/projects/2416
V2EX, 6.11 http://v2ex.com/t/197726
MindStore, 6.15 http://mindstore.io/mind/4503/
HackerNews, 7.31 https://news.ycombinator.com/item?id=9979965
Demo8, 8.3 http://www.demo8.com/demo/39527/Product%20Chase
StartupClass, 8.3 http://startupclass.club/topics/226
NEXT, 8.9 http://next.36kr.com/posts/17023

b. 文章,分享经验,顺便介绍产品
Ruby China, 8.4 https://ruby-china.org/topics/26771
V2EX, 8.5 http://v2ex.com/t/200017, 8.13 http://v2ex.com/t/212626
简书, 6.20 http://www.jianshu.com/p/x3otP8 8.8 http://www.jianshu.com/p/153996594bb3
知乎, 8.24 http://www.zhihu.com/question/28884819/answer/58221195 ,8.26 http://www.zhihu.com/question/20469024/answer/60593401
少数派, 8.17 http://matrix.sspai.com/p/b71e0d40
人人都是产品经理, 9.6 http://www.woshipm.com/operate/199369.html
PMCaff, 11.9 http://www.pmcaff.com/article?id=2000000000000273

第2阶段(Tech2Pocket)
Ruby China, 8.21 https://ruby-china.org/topics/27016
HackerNews, 10.4 https://news.ycombinator.com/item?id=10326289
MindStore, 10.7 http://mindstore.io/mind/6648/
V2EX, 10.29 http://v2ex.com/t/231829#reply16
NEXT, 11.14 http://next.36kr.com/posts/22520

3. 结果

首先,要说明的是,这里并不是在给一个成熟的产品做市场推广,而是MVP 测试。主要是看做的东西,到底有没有价值,是不是大家需要的。

因此,更重要的是大家的反馈。而这种反馈又是多种多样的,有的人说你的产品是垃圾,有的人说你的产品非常有帮助。怎么面对这些反馈,是个更为重要的问题。但是这个太大了,就不细说了

Hit: Product Hunt, HackerNews(第2次), NEXT
Fail: 人人都是产品经理, 少数派,知乎,简书, Pocket, 微博私人推荐(纯银等等), HackerNews(第1次), Product Hunt (第2次), Quora(以及整个国外的推广)

部分数据,可以看这里:http://www.zhihu.com/question/28884819/answer/58221195

其中,像第2次投递NEXT就挺游刃有余了,因为直接让认识的用户先投票,就很轻松的有了基础数据,最终也拿到了不错的流量。比较遗憾的,是在知乎没有拉到流量。而且,在国外的推广做得挺失败,因为本来主要面对的是国外用户。但是在国外,并没有类似V2EX, Ruby China的地方,可以积累初始用户。最开始,在Prodoct Hunt上认识了几个用户,但是当时不是很懂这些,也就流失了。

累计的访问量,应该有5000UV,一分钱都没花的,我觉得挺棒。

那么,现在的结果如何呢?究竟得到了多少用户?
现在的每周用户,在100人左右。(这是现在的平稳状况,也就是推广冷却之后,没有任何外部提醒的情况下,有这么多人会自己上这个网站看看)

绕了这么大一个圈子,搞了这么多事,一周才100个用户,是不是失败了?

我不这么认为

因为这个网站本身就是利用的免费服务器+爬虫,代码量并不多,推广也没有任何花费
也就是说,在成本几乎为0的情况下,我的产品, 让这个世界上100多个人的生活,更美好了

我觉得,挺好。

更不必说,在这个过程中,认识了很多朋友,互联网的从业者,而这是我这个圈外人非常欠缺的(更不必说相关经验的积累和提高了)
而且,这个产品本身,本就是一种“建议”,觉得现有Product Hunt和Pocket可以这么做。通过用户的反馈,我验证了自己的想法是有意义的。接下来的目标也变了,也不再是去推广,而是去改进这个小产品,并且找到愿意一起做这个事情的人

4. 其他一些找用户的好案例、书

蝉游记
http://firecacada.blog.163.com/blog/static/7074376201213101723499/
http://www.jianshu.com/p/cce380ad3e54
一起
http://36kr.com/p/532701.html
Lean Customer Development
http://book.douban.com/subject/25981171/
Become a Technical Marketer,一本小册子,也值得一读
http://www.amazon.com/Become-Technical-Marketer-Accelerating-Automating-ebook/dp/B00UIC5HQM/

5. 我最喜欢本书的地方

其实就是这句话——
Most startups don’t fail because they can’t build a product. Most startups fail because they can’t get traction.

我觉得也是所有做产品的人需要意识到(也是非常容易忽略的),用户非常非常的重要。以及书中提到的种种用来获取用户的渠道,非常有启发性

我的挑战:在业务量低时刻苦训练,在业务量高时才能从容应对

在业务量低时刻苦训练,在业务量高时才能从容应对

很久以前,包括现在,我都会偶尔幻想着,做出一款牛B的产品,很快就像马化腾、扎克伯格那样改变世界,赚
够一辈子花不完的钱,马上走向人生巅峰,我必定是那个命中注定的人物。

时常会自己想象,如果我有一个产品,顾客蜂拥而至,我在马上用各种人才,各种工具来应对蜂拥而至的客户,
功成名就,站在颁奖台分享个人经验,想想都开心。

这样的想象是让人很开心的,但是实际情况往往没有那么让人开心。

想要通往成功之路,必须要提前想好N种失败的可能性,及对应的对策,对策中的每一项技能,就是我们平时需
要加以刻苦训练的。团队,产品,技术,营销,一家企业的死法有1万种,每个团队的基因又不一样,技术开发
团队基本上不会在技术上失败,销售出身的老板,基本上不会在了解客户让败北。

上面提到了“基本上”这个词,拿技术团队来讲,如果要想达到基本上不失败,要学习,练习各种编程语言,
语言框架,算法,数据库等等,技术迭代日新月异,每天要学习练习学习练习学习练习,不要管业务量高低,
如果业务量高,你才去学习练习新技能,晚了。

现实是残酷的,即便你天天学习练习技术,失败还是99%的比例,除了技术,还有团队、产品、技术、营销。

上面的是大方向,以下几个问题可以帮助自己更加清晰的完成小目标。
团队:
员工培训 & 技能分享
引导自己/别人 发现问题&思考问题&解决问题
引导搭建更加顺畅的工作流程,部分异步。多多鼓励人才,让人自我进步,不能管太细。
自己:
你擅长什么,长处是什么?#技术开发
你的挑战是什么? #每周2-3人的一对一沟通 #不断的招聘,发现人才 #不断学习新技术,练习新技术,练习新技术,再练,之后运用
做成这件挑战的概率有多大,怎么样做到?
如何调用员工积极性?#赚钱时分享钱财 #满足个人成就感
——————————————————————————–
发现问题&思考问题&解决问题
这部分可能不是练习就可以获得的技能,无论作为员工还是管理人员,老板都会强调说发挥主人翁精神。因为
老板不可能方方面面都做的完美,必须要所有团队成员来“发现问题&思考问题&解决问题”。

发现问题,很简单,待一段就知道哪些地方有问题了;
思考问题,开始复杂了,因为通常都是思考着如何解决问题;
解决问题时,会更加复杂,因为想要解决问题,就必须要推动很多人去改变,就像推着一辆拉货的板车走上坡
路那种难度,但你还是要推,这是价值所在。