苹果相关

浏览模式: 标准 | 列表 | 图文
linux下的多线程运行PHP

linux下的多线程运行PHP

关注一下这玩意是因为在命令行下写程序的时候,发现不能够自我守护。都只能用shell来再开一个进程监控。本来想做三角监控的,但想想,只是为了一个小程序,我得写三个程序来自我守护,真没劲啊。
所以,找到pcntl_fock函数的时候很激动,其实在很久以前看过,但是没关注过,毕竟很多时间跑命令行程序的时候,一下子就跑完了,真正跑了不退出的程序,真的很少用。

<?php
$pid = pcntl_fork();
if($pid == -1){
//创建失败咱就退出呗,没啥好说的
die('could not fork');
}
else{
if($pid){
//从这里开始写的代码是父进程的,因为写的是系统程序,记得退出的时候给个返回值
exit(0);
}
else{
//从这里开始写的代码都是在新的进程里执行的,同样正常退出的话,最好也给一个返回值
exit(0);
}
}
?>

所以,以下内容就来自于上述代码中有涉及到的博客:

这样一改好理解多了,如果你父进程希望知道子进程正常退出的话,可以加上前面的pcntl_wait.
函数的用法是整明白了,在实际的工作中有什么用处呢?
1.后台程序
命令行程序好写,服务程序也好写,笔者觉得这服务程序最难写.想想原来想在windows下写个服务啥的,又是要注册服务又是要这样那样的老费劲了.现在专职管理linux想让个命令行程序在后台运行,直接在命令后面加个&就搞定了.但是这样总觉得土.有了pcntl_fork突然发现世界是那么的美好.当主进程成功创建子进程并获得子进程的id以后,自己在临死前还不忘说一句:"我已成功运行,我的id是:xxxx(子进程的id)",完了还给系统返回个0(正常退出),哈哈,死都死的那么有尊严.
前面说的是程序常驻内存的情况,当然了这时候要注意内存的释放以及向日志文件打印信息,而不是往屏幕上(一打印信息程序就退出的哟).还有一种情况是:程序被其它脚本调用,其它脚本只关心程序是不是正常运行,如果程序要运行很长时间才能运行完的话,最好不让脚本等待.这样的话pcntl_fork又派上用场了:)
2.延时处理.
有的时候,我们程序退出的时候要清理自身产生的东西,比如说要删除自己(当然了linux下面是可以删除正在运行的文件的,只是举个例子),这个时候就可以另起动一个进程,然后自己结束了,把事情交给另一个进程来做.当我们写服务程序的时候,我们肯定是写日志文件记录程序的运行情况(要不谁知道程序是不是在那睡大觉的:0).程序正常退出的时候我们可以写一条日志说程序退出了,但是当程序收到linux下伟大的kill -9的时候,怎么记录自己的退出行为呢?额.....这个和php的进程信号有关好像和这个没多大关系.
另一种情况:一个完善的程序一般都支持start,stop,restart这样的参数.start好说,stop也好说,既然start和stop都好说了,这个restart就先stop然后再start就可以了啊.额...好像又和pcntl_fork没多大关系,当你收到重启的信号总不能还是kill然后再start吧,是不是太黄太暴力了?还是温柔一点,让当前进程退出,让另外的进程再把它拉起来吧.在windows下想实现这一点似乎很困难呢,比如程序更新的时候,一般都是单写更新程序,或者程序退出的时候另起动一个批处理启动自己:)
3.不死进程
其实就是传说中的双进程了.早些年的时候万象网管为了达到不被恶意结束的目的用的就是这招了.虽然咱不用担心程序被人恶意停止,但是也保不齐主程序因为任务太重抗不住自己先挂了(这种情况也不是不会发生).所以......
说了这么多,只是对写程序的一些思考,对一个函数用法的延伸.我想到了这么多,你呢?

不知道是否能够做到这个地步,但是先关注一下,只是现在加班频繁,都不知道有没有时间来折腾它。套用锅巴说的一句:忙的象狗的人往 往都是穷鬼

收到linode的通知,顺便记录一下

收到linode的通知,顺便记录一下

这两封邮件来自linode,说实话,觉得linode真心不错。。

比如这一封:
We are currently aware of an issue with the host that your Linode resides on (tokyo49). This issue requires a reboot to resolve. We do apologize for any inconvenience this issue may cause. Your patience and understanding is greatly appreciated. Please do not hesitate to contact us if you have any questions or concerns.

然后过了将近10分钟左右 :
The host that your Linode resides on has been successfully rebooted. Your Linode will return to its last state shortly (running or powered off). There is no need to issue boot jobs for your Linode at this time. Thank you for your patience and understanding. Please feel free to update this ticket in the event that you have any additional questions or concerns about this matter.

于是,linode的管理邮件又自动发来:
Hello xxxxxxx! The following activity has recently occurred:

* linode??????- (7659786) Host initiated restart - Completed Wed, 16 May 2012 04:23:49 GMT
* linode?????- (7659950) Lassie initiated boot - Failed Wed, 16 May 2012 04:23:58 GMT

This is a new feature. You can change your notification settings via https://manager.linode.com/profile.
果然,这些功能是真心不错啊。如果以后有短信息发送就好了。
国内的VPS有哪个有类似功能的?不过国内我是不想用了,NND,备案备案,备死人的案。

Linux命令行下面一个有趣的小命令(tested in ubuntu)

Linux命令行下面一个有趣的小命令(tested in ubuntu)

在微博的#SAE技术分享# 看到一些有意思的东西,比如这一篇的标题,嗯,确实是有一些奇怪的玩意。
比如,ubuntu下的apt-get moo,居然出来了这样的玩意,你能相信吗?》

root@webserver:/# apt-get moo
(__)
(oo)
/------\/
/ | ||
* /\---/\
~~ ~~
...."Have you mooed today?"...

好一只羊?还有一些其他的命令,比如yes,好象记得这个命令是专门用来处理自动化安装的吧?即自动输入y,N个,直到安装完成,如果没有安装,就在屏幕上拼命的输出。。。
还有一些其他的。。比如banner,会将你输入的字符用##打印出来,比如我这个:

root@webserver:/# banner bannertest

##### ## # # # # ###### #####
# # # # ## # ## # # # #
##### # # # # # # # # ##### # #
# # ###### # # # # # # # #####
# # # # # ## # ## # # #
##### # # # # # # ###### # #

,再比如fortune,这个函数很有意思,既能学英文又可以很好玩,该网页上这么显示了:

orange@orange-desktop:~$ fortune
Q:How many IBM types does it take to change a light bulb?
A:Fifteen. One to do it, and fourteen to write document number
GC7500439-0001, Multitasking Incandescent Source System Facility,
of which 10% of the pages state only "This page intentionally
left blank", and 20% of the definitions are of the form "A:.....
consists of sequences of non-blank characters separated by blanks".

想看更多?到这里看一下吧:http://www.linuxidc.com/Linux/2007-05/3784.htm,不是每个linuxer都是闷瓜。

转:Redis学习手册(内存优化)

转:Redis学习手册(内存优化)

项目中在使用Redis,自然对内存这玩意相对比较看重一点,虽然内存不值钱,但能节约一点内存也就意味着可以存储更多的东西。
所以在博客园看到这篇文章的时候,不管现在是用了没,先备份一下资料,我英文烂 ,有点英文资料虽然能看懂,但毕竟不是母语,看起来累。
原文是在这里:
内容详细如下:http://www.cnblogs.com/stephen-liu74/archive/2012/04/11/2370521.html
一、特殊编码:

自从Redis 2.2之后,很多数据类型都可以通过特殊编码的方式来进行存储空间的优化。其中,Hash、List和由Integer组成的Sets都可以通过该方式来优化存储结构,以便占用更少的空间,在有些情况下,可以省去9/10的空间。
这些特殊编码对于Redis的使用而言是完全透明的,事实上,它只是CPU和内存之间的一个交易而言。如果内存使用率方面高一些,那么在操作数据时消耗的CPU自然要多一些,反之亦然。在Redis中提供了一组配置参数用于设置与特殊编码相关的各种阈值,如:
#如果Hash中字段的数量小于参数值,Redis将对该Key的Hash Value采用特殊编码。
hash-max-zipmap-entries 64
#如果Hash中各个字段的最大长度不超过512字节,Redis也将对该Key的Hash Value采用特殊编码方式。
hash-max-zipmap-value 512
#下面两个参数的含义基本等同于上面两个和Hash相关的参数,只是作用的对象类型为List。
list-max-ziplist-entries 512
list-max-ziplist-value 64
#如果set中整型元素的数量不超过512时,Redis将会采用该特殊编码。
set-max-intset-entries 512
倘若某个已经被编码的值再经过修改之后超过了配置信息中的最大限制,那么Redis会自动将其转换为正常编码格式,这一操作是非常快速的,但是如果反过 来操作,将一个正常编码的较大值转换为特殊编码,Redis的建议是,在正式做之前最好先简单测试一下转换效率,因为这样的转换往往是非常低效的。

二、BIT和Byte级别的操作:

从Redis 2.2开始,Redis提供了GETRANGE/SETRANGE/GETBIT/SETBIT四个用于字符串类型Key/Value的命令。通过这些命 令,我们便可以像操作数组那样来访问String类型的值数据了。比如唯一标识用户身份的ID,可能仅仅是String值的其中一段子字符串。这样就可以 通过GETRANGE/SETRANGE命令来方便的提取。再有就是可以使用BITMAP来表示用户的性别信息,如1表示male,0表示female。 用这种方式来表示100,000,000个用户的性别信息时,也仅仅占用12MB的存储空间,与此同时,在通过SETBIT/GETBIT命令进行数据遍 历也是非常高效的。

三、尽可能使用Hash:

由于小的Hash类型数据占用的空间相对较少,因此我们在实际应用时应该尽可能的考虑使用Hash类型,比如用户的注册信息,这其中包括姓名、性别、 email、年龄和口令等字段。我们当然可以将这些信息以Key的形式进行存储,而用户填写的信息则以String Value的形式存储。然而Redis则更为推荐以Hash的形式存储,以上信息则以Field/Value的形式表示。
现在我们就通过学习Redis的存储机制来进一步证明这一说法。在该篇博客的开始处已经提到了特殊编码机制,其中有两个和Hash类型相关的配置参 数:hash-max-zipmap-entries和hash-max-zipmap-value。至于它们的作用范围前面已经给出,这里就不再过多的 赘述了。现在我们先假设存储在Hash Value中的字段数量小于hash-max-zipmap-entries,而每个元素的长度又同时小于hash-max-zipmap-value。 这样每当有新的Hash类型的Key/Value存储时,Redis都会为Hash Value创建定长的空间,最大可预分配的字节数为:
total_bytes = hash-max-zipmap-entries * hash-max-zipmap-value
这样一来,Hash中所有字段的位置已经预留,并且可以像访问数组那样随机的访问Field/Value,他们之间的步长间隔为hash-max- zipmap-value。只有当Hash Value中的字段数量或某一新元素的长度分别超过以上两个参数值时,Redis才会考虑将他们以Hash Table的方式进行重新存储,否则将始终保持这种高效的存储和访问方式。不仅如此,由于每个Key都要存储一些关联的系统信息,如过期时间、LRU等, 因此和String类型的Key/Value相比,Hash类型极大的减少了Key的数量(大部分的Key都以Hash字段的形式表示并存储了),从而进 一步优化了存储空间的使用效率。

------EOF----
这里还有几篇类似的文章:

  1. redis学习笔记之发布订阅
  2. Redis学习手册(事务)
  3. Redis之七种武器(http://blog.nosqlfan.com/html/2942.html)
  4. Redis学习手册(Key操作命令)
  5. RedisWindowsDownload (http://code.google.com/p/servicestack/wiki/RedisWindowsDownload)
  6. Redis几个认识误区
  7. Redis入门笔记(二)-配置及运行Deploy a High Performance Key-Value Store using Redis on Ubuntu 10.10 (Maverick) (http://library.linode.com/databases/redis/ubuntu-10.10-maverick)
  8. Redis消息通知系统的实现(http://huoding.com/2012/02/29/146)
  9. redis 分布式,主从同步(http://blog.51yip.com/cache/1320.html)
让CRONTAB精确到秒的执行任务

让CRONTAB精确到秒的执行任务

众所周知,crontab的最小粒度是分,即当第一位是“*/1”时,即最小单位是每分钟执行。
但是,有时候我们要按秒执行,当然这是比较夸张的了,但每半分钟执行一次还是有可能的,这时候就没有办法了,所以后 来 找啊找,就找到了一篇说明:

*/1 * * * * sh /root/cron.sh
*/1 * * * * sleep 30 && sh /root/cron.sh

执行的时候先sleep 30秒,变相的达到每半分钟执行此命令,果然很变态

windows下面也有模拟crontab的软件,如crontabs,pycrontab等,都是注册成一个服务,然后再执行,但是没有一个软件是比较好用的。总有小问题。

CPU突然过高。。。

CPU突然过高。。。

突然收到一封邮件,来自linode。。
Your Linode, linode????, has exceeded the notification threshold (90) for CPU Usage by averaging 111.6% for the last 2 hours. The dashboard for this Linode is located at: <https://manager.linode.com/linodes/dashboard/????>

This is an automated message, please do not respond to this email. If you have questions, please open a support ticket.

You can view or change your alert thresholds under the "Settings" tab of the Linode Manager.

This is not meant as a warning or a representation that you are misusing your resources. We encourage you to modify the thresholds based on your own individual needs.

-----------
上去一看,果然:
211a8107f45229a83d239e4a61a081a1
现在开始怀疑,burst的服务器挂掉是不是也是因为这个原因。但,一点不通知也不应该啊。看LOG也看不出什么原因,真纠结啊

gentoo常用命令

gentoo常用命令

由于burst上面的虚拟机经常挂掉,然后我申请要退款,burst建议我换个OS或者Reinstall看看,我一咬牙,把VPS换到了linode上面,于是 把burst上面的VPS的OS换成了gentoo,结果我ssh上去之后习惯性的ls,居然告诉我命令不存在。我晶啊。
这下子玩大了。然后找了一下资料,emerge upgrade后,才有了这个命令,我傻眼了。想装B没装成,害惨自己了。
于是,找了下资料,参考:http://hi.baidu.com/chinsung/blog/item/3d21b6deee859f5dccbf1a51.html

1. 更新系统并移除孤立依赖的软件包
# emerge --update --deep --newuse world
# emerge --depclean
# revdep-rebuild (搜索相应缺失的库,并且重新emerge相应的包,需安装gentoolkit,并需运行两次以便确认)

2. emerge常用参数:
2.0 world | system, world范围更广,包含了system,这是两个set,前面不用加--或-
2.1 -p pretend 预览
2.2 -a ask 先予询问
2.3 -c clean 清理系统
2.4 -C unmerge 卸载,与emerge相反
2.5 --depclean 深度清理,移除与系统无关的包
2.6 -h help 帮助文件
2.7 -v verbose 详细内容
2.8 -s search 查找
2.9 -S searchdesc 从文件名和描述中查找,要慢一些
2.10 -u update 升级软件包
2.11 -D deep 计算整个系统的依赖关系
2.12 -e emptytree 清空依赖树,一般不用,危险命令
2.13 -1 oneshot 一次性安装,不将其信息加入系统目录树
2.14 -o onlydeps 只安装其依赖关系,而不安装软件本身
2.15 -t tree 显示其目录树信息
2.16 -k usepkg 使用二进制包
2.17 -K usepkgonly 只使用二进制包
2.18 -f fetchonly 仅下载安装包
2.19 --sync 从指定的rsync站点更新portage树,先前所作所有portage树更改均失效
2.20 -N newuse 使用新的USE FLAG,如有必要,需重新编译
2.21 -n noreplace 更新system,但先前安装的软件不予覆盖

3. 查找最快的mirror
# mirrorselect -s3 -b10 -o -D >> /etc/make.conf
此命令对每个mirror均下载100k文件,以此确定最快源,要注意修改/etc/make.conf

4. 系统升级
# emerge --sync 或 # emerge-webrsync (更新或称同步portage树)
# emerge --update --deep --newuse world
# emerge --depclean -pv
# revdep-rebuild (需安装gentoolkit)
如果使用emerge-webrsync命令进行升级,可先下载最新的portage(以日期命名,而不要用latest命名)至/var/tmp/emerge-webrsync/目录

5. 查看安装XXX的情况,
同时列出了使用的 USE 和 LINGUAS
# emerge -pv XXX

6. 在world中增加记录,避免自己已手动编译的软件被再次编译
# emerge -n fcitx (添加fcitx至emerge tree)

7. 配置文件更新工具
# etc-update 或 # dispatch-conf

8. 查询XXX包用了什么USE(需gentoolkit)
# equery uses XXX

9. 找到 /bin/ls 所属包
# qfile /bin/ls

10. 列出 glibc 包所包含文件
# qlist glibc

11. /etc/portage/package.*应用举例

11.1 package.use

sys-apps/man-pages -nls sys-apps/pciutils -zlib media-libs/freetype bindist app-text/acroread linguas_zh_TW linguas_zh_CN linguas_en

作用:

不改变全局USE的同时,微调包的USE。 开始2个是说这2个包不使用相应的 USE,第三个说明要单独在这个包使用这个USE,最后一个是调整 LINGUAS 的,很容易明白。


11.2 package.keywords

sys-apps/hdparm ~x86

作用:

指定相应的包的 KEYWORDS。比如你想 hdparm 包用 ~x86 的版本,而不用 x86 的版本,就用这个来指定。 注意,因为 emerge 的设计,如果你的 make.conf 里边指定了 ~x86的话,你不能反过来通过指定 x86 而 不要 ~x86,只能用 -~x86 来达到目的。 引用 gentoo@freenode 上<kojiro>的话: ”ACCEPT_KEYWORDS is incremental“

11.3 package.mask

>sys-devel/libtool-1.5.23

作用:

屏蔽某个包某个版本,或者某些版本,甚至整个包。
比如 libtool-1.5.23b 在我的系统有问题,那么就屏蔽一下,只用 比 1.5.23 小的。

11.4 package.unmask

=net-www/apache-2.2.4 games-arcade/stepmania

和 mask 一样,不过效果正好相反。我要用 2.2.4 的 apache,但是 portage 把他 mask 了,所以手动 unmask 一下。

12. 往 default runlevel 里边加入 XXX 服务 (add)

# rc-update -a XXX default

13. 从 default runlevel 里边删除 XXX 服务 (delete)
# rc-update -d XXX default

14. 列出 default runlevel 所有的服务 (show)
# rc-update -s default

15. 删除过期的包
# eclean distfiles (请先 emerge gentoolkit)

16. 清除emerge过程中产生的临时文件
# rm -rf /var/tmp/portage/*

17. 清除所有安装源码包(除非太穷,否则不建议)
# rm -rf /usr/portage/distfiles/*

-------
不管它不管它,先备份,天知道以后会不会用,

巧用VMware虚拟机NAT端口映射使外网访问虚拟机

巧用VMware虚拟机NAT端口映射使外网访问虚拟机

以下内容只针对vmware(我只在Server上试过),不知道其他软件怎么样。
遇到的问题是这样的,有朋友的虚拟机出了点问题,想让我帮忙看看,可是如果通过 QQ远程连上去,再打开虚拟机会很卡,所以想到,是否可以让我直接SSH连接上,但因为虚拟机是NAT方式的连接,即IP是私有的,无法直接连上,找了些资料,发现NAT端口映射可以搞定。

以下是资料介绍:原文来自:http://www.linuxso.com/linuxrumen/141.html

  NAT中隐藏的端口映射,说明一下环境,利用当然是VMnet8网络连接,在虚拟机中架设win2003的WEB服务器利用WEB默认80端 口,IP为192.168.10.4,真实主机winxp系统有两个IP,内网连接192.168.10.1,外网上IP为 221.196.193.220。外网其他计算机,可以通过访问我的真实主机221.196.193.220,访问到win2003的WEB。

  首先说下原理,因为WEB服务是利用80端口,所以在Win2003上建立了WEB服务,80也就自动被打开,因为Win03是内网 ip(192.168.10.4),外网无法通过访问这个地址,找到我的web服务,但是可以通过外网地址(221.196.193.220)访问我的 XP系统,XP又能连接到Win2003,所以把80映射到我的Winxp的系统上是有可能的!

  那么废话了,现在说实际操作,打开--编辑--虚拟网络设置--NAT选项卡,如下图:

49325d76f989d727c6bc510779b8983b

选择编辑,打开NAT设置,这里保持默认就可以,如果你对你自己的网络很熟悉,可以更改网关等项目

f4a7ee586e86975c6b9d885065592426

直接打开端口转递,这里就是NAT的端口映射配置了,用实例的WEB服务举例,因为WEB属TCP连接,所以在TCP和UDP上我都做了,转换,点击添加

c6ff28cf346eff740a1455e602cb0dc0

主机端口,填入真实主机要被转换的端口,这里我用FTP又举了个例子,在真实的主机上1021上建立了FTP服务,这样访问时就需要ip后加:,如ftp://192.168.1.1:1021便可正常访问了,这里因为我的XP上没有web服务所以主机端口添的依旧是80.

  虚拟机IP地址,填入内网虚拟机的IP,这个是Win2003的IP,服务端口,对应那个服务就填入哪个端口,你可以参考其他文章,常用端口.

  描述,无所谓了,写个自己能看懂的就行,不些也没问题啊~

  这样一来,你的朋友就可以在IE下输入http://221.196.193.220/ 访问到你虚拟机中Win2003下的WEB服务了,什么?还不可以?自己访问成功可是其他人都不行?

  呵呵,不要急,如果你是WINXP SP2的系统,去看看你的防火墙设置吧,添加端口,不用我说了吧,安全起见,把TCP和UDP都加到例外中,就ok了~

  PS:1、在虚拟机里配置好IIS和动态域名解析软件

  2、如果你的主机处于内网中,请在路由器上设置端口映射,如果主机直接连接互联网,可以忽略此步骤。

-------

嗯,我是作了22端口映射,然后ssh主机的IP,果然能够连上,这下子操作起来访问很多了。

lnmp组件中sablog的配置纠错

lnmp组件中sablog的配置纠错

lnmp是现在相对比较容易和被大家所接受的一个套装。由于我用的是Sablog所以我在设定vhost的时候就选了sablog,但是告诉我第二行出错了。

仔细检查了一下,好象确实是有这个问题,一来好象是编码也有问题,二来它copy的规则有点象是discuz的规则,和sablog系统后台中的规则不一样。所以,我根据 sablog后台中的规则进行了修正,立刻正常了。
sablog的默认规则是支持apache的rewrite的。如下:

# BEGIN Sablog-X
RewriteEngine On
RewriteBase /
# 文章
RewriteRule ^show-([0-9]+)-([0-9]+)\.shtml$ index.php?action=show&id=$1&page=$2
# 分类
RewriteRule ^category-([0-9]+)-([0-9]+)\.shtml$ index.php?action=index&cid=$1&page=$2
# 只带月份的归档
RewriteRule ^archives-([0-9]+)-([0-9]+)\.shtml$ index.php?action=index&setdate=$1&page=$2
# 用户列表、高级搜索、注册、登陆
RewriteRule ^(archives|search|reg|login|index|links)\.shtml$ index.php?action=$1
# 全部评论、标签列表、引用列表 带分页
RewriteRule ^(comments|tagslist|trackbacks|index)-([0-9]+)\.shtml$ index.php?action=$1&page=$2
# END Sablog-X

注意那个.shtml,那是我自定义的URL后缀,所以你看我的博客的时候,都有这玩意。。。将就点了。说实话,我怀疑这个shtml对SEO有友好度,所以我才这么配置(纯属猜测)
改完后配置是这样的:

location / {

rewrite ^/show-([0-9]+)-([0-9]+)\.shtml$ /index.php?action=show&id=$1&page=$2 last;
rewrite ^/category-([0-9]+)-([0-9]+)\.shtml$ /index.php?action=index&cid=$1&page=$2 last;
rewrite ^/archives-([0-9]+)-([0-9]+)\.shtml$ /index.php?action=index&setdate=$1&page=$2 last;
rewrite ^/(archives|search|reg|login|index|links)\.shtml$ /index.php?action=$1 last;
rewrite ^/(comments|tagslist|trackbacks|index)-([0-9]+)\.shtml$ /index.php?action=$1&page=$2 last;
}

其实看到没,与apache下的配置很相像,只是在最前面加了 ^/ ,然后在指向的文件前加 /
同时在最后加 last;
嗯,就这样。。。灰常方便,你换了没?

linux中的inode简单介绍

linux中的inode简单介绍

linux下面有一个很恶心的说法,就是磁盘空间再大,但如果没有inode了,磁盘也就相当于没用了(这个没用是指剩余空间再大,也存不进东西)
这种问题在ext3上很容易出现,如果磁盘格式是Ext3,然后又是用来存一些小文件(如图片、icon等小而多的文件)时,很容易出现这种问题。所以一般图片服务器都是不用Ext格式的。
虚拟机上居然出现了这种问题,所以找了一下资料,找到了这篇文章:http://www.cnblogs.com/shapherd/archive/2012/02/07/2341638.html

最近在linux上创建目录的时候出现mkdir:Cannot create directory***: No space left on device, 但是df的时候发现空间还有几百G(有同事是中文的机器出现Mkdir: 无法创建目录***,设备上没有空间)。不能继续创建目录或者touch文件的原因是Inode满了。

Inode的数量是有限制的,每个文件对应一个Inode, 那么如何查看inode的最大数量呢,

[work@*** ~]$ df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/cciss/c0d0p2 1154176 172807 981369 15% /
/dev/cciss/c0d0p3 88309760 51951 88257809 1% /home

可以看到Inode的总量,已经使用的Inode数量,和剩余数量。
如果watch -n 1 “df -i”一下, 然后去创建一个文件, 会发现已用的加一,未用的减一
简单了解下Inode在文件系统中的地位:

a5d7effdc7af270f9aeafe3271415fc4

Linux会为每一个文件分配一个唯一的inode节点。在linux中,文件的文件名、文件属性、文件内容是分别存储的:文件名存放在目录项(即 dentry)中,文件属性存放在inode中,文件内容存放在block中。Linux在查找文件时,首先先读取dentry,dentry中存储的文 件名和inode编号的一个映射表, 根据这个表找到inode编号,再根据inode找到磁盘中的文件。
可以用ls -i查看文件对应的inode编号, 也可以直接stat一个文件, 会有很全的信息。

----------

ext4好象听说是好了很多,但更多的人在做图片服务器的时候都选择了:ReiserFS,可惜它不再更新了,为什么呢?因为。。。Linux文件系统reiserfs作者:Hans Reiser被判入狱15年

Linux文件系统reiserfs作者Hans Reiser因谋杀妻子正式被宣判入狱15年。今年早些时候,Reiser承认了罪行,并领着警察挖掘出妻子的遗体。他的陪审团在4月份判定Reiser一级谋杀罪名成立,将面临25年的监禁。但是随后政府和他进行了秘密交易,如果他透露妻子的遗体并放弃上诉的权利,他的入狱期限将降至15年。

在宣判前Reiser发表声明,“我真诚的为我的罪行向社会致歉。每一个生命都是神圣的,我取走了一个人类的生命,对此我感到难过。”Hans Reiser在2006年9月下午4:30杀手了妻子Nina,他用手捂住她的嘴,使她窒息而死。他暂时将其藏在浴室,后移至汽车,尸体一直在车上呆了两天直到他寻找到埋藏的地点。"

BTW:这里有一篇科普文章:http://www.serverfocus.org/reiserfs-vs-ext4-vs-xfs-vs-zfs-vs-btrfs

原来,reiserfs已经升级到4了。