No space left on device问题,inode爆满

对于linux的分区查看是否使用占满通常我们都会通过df -h查看,但是还存在有另外一种情况,就是当前分区中存在数量庞大的细小文件时(一般可能都是0-4Byte的文件,通常是由于程序的缓存机制造成的),也会造成空间满的问题,具体创建文件时候会提示“No space left on device”。

我们可以通过df -i查看,某一个分区的inode满了。

现象:
对于这种情况可以通过df -hi查看,一般会看到IUse%=100%,IFree=0,Inodes=IUsed,这就说明inode满了。
查找问题:
这个时候我们要进入到问题分区对应的挂载目录,可以通过find ./ -type f来查看,当发现一个路径下的文件一直很长时间都不断的显示时候,我们就可以定位造成的问题路径和文件了。
或者确定是有0字节或其他固定大小的细小文件造成的,通过查找0字节或其他具体字节来确定路径。其命令为:find ./ -type f -size 0(如果细小文件不是0字节或不确定大小此方法就不适用)
再有一种可以通过统计对应目录的文件数量进行判断,操作命令为:for i in ./*; do echo $i; find $i | wc -l; done
处理方法:
当确定路径后,我们就可以进行清理工作了。由于文件非常多时,rm等很多命令直接使用都会报错(Argument list too long)使用不了,可以使用查找问题的方式来进行操作,进入到问题目录下,具体操作为:

find ./ -type f |xargs rm

在网上还有其他一些清理文件的命令,提供了不同的思路,这里也记录参考一下:

例1:
lsattr ./|awk -F"/" '{print $2}' | xargs -i rm -rf {}
注:此方法要确定lsattr查看后的文件名是第几列,根据实际情况定义awk的列,在这里是根据/为分隔符的第二列是文件名

例2:
find ./ -exec rm {} \

特别说明:
在ext3文件系统下,默认的block是4096,inode是8192,inode的大小是128,但在ext4文件系统下,默认的block是4096,inode是16384,inode的大小是256。因此如果是很多的小文件存在,比如有非常多的文件小于16384Byte以下的文件存在,在ext4文件系统上比ext3上更容易出现inode满而block没满的问题。
对于这种问题,我们可以在进行分区格式化时候人工指定inode的匹配大小,具体来说可以这样:mkfs.ext4 -b 4096 -i 8192 /dev/sdb1。这样设置就和ext3的block和inode的分配一样了。

关于inode的知识点:
inode这个概念是存在于linux的ext文件系统中。
对于硬盘来说,最小的存储单位是扇区(sector),每个扇区可存储512个字节(Byte)。但对于ext文件系统的linux操作系统,读取硬盘时候不是一个扇区一个扇区去读取,而是一次性连续读取多个扇区,这多个扇区就构成了ext文件系统的最小存储单位“块”(block),它是文件存储的最小单位。块的大小一般是4KB,即连续八个扇区组成一个块。
文件的数据都是存储在“块”中,那么还需要一个地方用来存储文件的元信息,例如文件的创建者、创建日期、大小、权限等(文件内容如果相当于书,那么这其实可以比喻成书的出版社字数等信息)。这个文件的元信息在ext系统中就被叫做inode,一般被译为“索引节点”或“i节点”。
一般可以用stat命令查看某个文件的inode信息,例如:stat install.log
硬盘在被系统格式化成ext系统的时候,操作系统会自动讲硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。这个其实在格式化完一个分区后,把分区挂载好后,df -h就可以看到没有任何文件的分区会有一定的占用,这个其实就是inode占用的空间。
查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令,具体是:df -i
查看每个inode节点的大小,可以用如下命令:
dumpe2fs -h /dev/sda1 | grep "Inode size"
由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。
每个inode都有一个号码,linux操作系统用inode号码来识别不同的文件,系统内部不使用文件名。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。
使用ls -i命令,可以看到文件名对应的inode号码,例如:ls -i install.log

inode的特殊作用:
由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。
  1. 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。
  2. 移动文件或重命名文件,只是改变文件名,不影响inode号码。
  3. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。
第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。

参考:http://www.cnblogs.com/itech/archive/2012/05/15/2502284.html
http://blog.chinaunix.net/uid-8504518-id-2030619.html

完全解密wdcp的php程序

wdcp的代码完全解密php程序如下,可以把wdcp的php代码批量还原为php源程序

<?php
/**
* wd_decode
*/

function wd_decode($filename) {

$data = unpack('C*', substr(file_get_contents($filename), 9));
$key = array(0xB8, 0x35, 0x6, 0x2, 0x88, 0x1, 0x5B, 0x7, 0x44, 0x0);
$j = count($data);
foreach($data as $k => &$v) {
$v = $key [ 2 * ($j % 5) ] ^ ~$v;
// $v = sprintf('%u', $v);
$v &= 0xFF;
$v = pack('C*', $v);
-- $j;
}
return @gzuncompress(join('', $data));
}

//scandir("wdcp");
//print_r(glob_mark($path));

$dir='wdcp';
$phpfile='';
function traverse($path = '.') {
$current_dir = opendir($path); //opendir()返回一个目录句柄,失败返回false
while(($file = readdir($current_dir)) !== false) { //readdir()返回打开目录句柄中的一个条目
$sub_dir = $path . DIRECTORY_SEPARATOR . $file; //构建子目录路径
if($file == '.' || $file == '..') {
continue;
} else if(is_dir($sub_dir)) { //如果是目录,进行递归
// echo 'Directory ' . $file . ':<br>';
traverse($sub_dir);
} else { //如果是文件,直接输出
$phpfile=$path.DIRECTORY_SEPARATOR.$file;
$filestr=explode('.',$phpfile);
$strnum=sizeof($filestr);
if($filestr[$strnum-1]=='php'){
//echo $phpfile."\n";
$content=wd_decode($phpfile);
if(!empty($content)){
$fp=fopen($phpfile,'wb');
fwrite($fp,$content);
fclose($fp);
}
}
// echo $path.DIRECTORY_SEPARATOR.$file;
// echo 'File in Directory ' . $path . ': ' . $file . '<br>';
}
}
}

traverse($dir);

注:核心功能代码可参考http://tkxxd.net/thread-1843-1-1.html,转载请注明出处