zoukankan      html  css  js  c++  java
  • /tmp/orbit-oracle/目录inode耗尽

    [root@iZ25zpeock2Z orbit-oracle]# cd /
    [root@iZ25zpeock2Z /]# du -cks * |sort -nr|head -n 20
    du: cannot access `proc/3493/task/3493/fd/4': No such file or directory
    du: cannot access `proc/3493/task/3493/fdinfo/4': No such file or directory
    du: cannot access `proc/3493/fd/4': No such file or directory
    du: cannot access `proc/3493/fdinfo/4': No such file or directory
    73276804 total
    50757720 u01
    14097384 app
    3020812 var
    2569672 dev
    2313092 usr
    195792 home
    157936 lib
    58780 tmp
    31408 etc
    26012 lib64
    24072 boot
    14436 sbin
    7792 bin
    1316 opt
    524 root
    24 logs
    16 lost+found
    4 srv
    4 selinux
    [root@iZ25zpeock2Z /]#

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

    [root@iZ25zpeock2Z orbit-oracle]# du -sh 
    58M .
    [root@iZ25zpeock2Z orbit-oracle]# pwd
    /tmp/orbit-oracle
    [root@iZ25zpeock2Z orbit-oracle]# cd linc-
    Display all 1185524 possibilities? (y or n)
    [root@iZ25zpeock2Z orbit-oracle]# ll -t|more
    total 0
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 23:53 linc-6f4b-0-35a89aa23d845
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 23:53 linc-6f3a-0-6c4d1ee3e33a
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:21 linc-3339-0-3f0ac0673c47a
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:21 linc-3326-0-4246a0fc3d870
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:21 linc-330d-0-5d91d1ca3f328
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:20 linc-3302-0-116242933f446
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:20 linc-32ef-0-bb2fe8b3f315
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:20 linc-32de-0-1c0964f13f39f
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:20 linc-32d3-0-5099db553d45c
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:20 linc-32c0-0-56b10d0e3defa
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:20 linc-32af-0-11e006e03f7ca
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:20 linc-32a4-0-1f6c7f673f6e0
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:20 linc-3291-0-420722403d065
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:20 linc-3280-0-18ff6bbf40083
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:20 linc-3275-0-73da1223d382
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:20 linc-3257-0-42df66103d86e
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:20 linc-324b-0-3bbf2ed3d087
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:19 linc-323e-0-229e9c753fb32
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:19 linc-3225-0-ac223993eeaa
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:19 linc-321a-0-273bc32240646
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:19 linc-320f-0-6614565f3e3ba
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:19 linc-31f6-0-16ad868f3d970
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:19 linc-31eb-0-7089e6fe3f814
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:19 linc-31e0-0-6cf307e140f7c
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:19 linc-31c5-0-42cf32aa3eb83
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:19 linc-31ba-0-16ffe4423ebb5
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:19 linc-31af-0-586a1bf43d7ae
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:19 linc-3195-0-3d227bb3d14d
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:19 linc-318a-0-5851d793e75f
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:18 linc-317c-0-55d7993e3f476
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:18 linc-3161-0-188802a83efb4
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:18 linc-3156-0-cc079383e7f6
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:18 linc-313f-0-14097e6a3c973
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:18 linc-3128-0-7305d9673d0b2
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:18 linc-311d-0-25cc2d503ef19
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:18 linc-310c-0-648c7cf83dc58
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:18 linc-30f9-0-740f906f3e637
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:18 linc-30ee-0-76a59c4a3d03e
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:18 linc-30d8-0-73950d123d7d6
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:18 linc-30bf-0-16e6e68c3df70
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:18 linc-30b0-0-370bc6693e109
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:17 linc-309d-0-35bd874406fc
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:17 linc-308a-0-4cdb7a103eb7a
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:17 linc-307f-0-3be4306f407d5
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:17 linc-306e-0-51edd97a3dba9
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:17 linc-305b-0-6a40b9033e11c
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:17 linc-3050-0-42e665513eaff
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:17 linc-303f-0-2b7fdde93fdf7
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:17 linc-302c-0-4921dcc13dede
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:17 linc-301b-0-777c1eb93e98e
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:17 linc-3010-0-2e803d213de8b
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:17 linc-2ffd-0-62fbb54c3d3dc
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:17 linc-2fec-0-4c5c94313d9bc
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:16 linc-2fe1-0-7a206d603ea76
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:16 linc-2fce-0-667b24263f813
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:16 linc-2fbd-0-6be877653f3a3
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:16 linc-2fb2-0-38ab82e13db4e
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:16 linc-2f9f-0-5814c553d033
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:16 linc-2f8e-0-7aae99a03ea84
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:16 linc-2f83-0-491c6dee3f716
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:16 linc-2f5b-0-6f67a5a4069e
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:16 linc-2f4a-0-4863854f3f06e
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:16 linc-2f39-0-2536a7733e1d8
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:16 linc-2f26-0-7806b9c23dc74
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:16 linc-2f14-0-217e566a40359
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:15 linc-2f09-0-30fcc440402cc
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:15 linc-2ef0-0-3bf3be7e3d5e3
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:15 linc-2ee5-0-51eeef693e782
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:15 linc-2eda-0-29fd520b3da59
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:15 linc-2ec1-0-53f77a9e3d40d
    srwxr-xr-x 1 oracle oinstall 0 Nov 17 06:15 linc-2eb6-0-aebd8dc3f79b

    [root@iZ25zpeock2Z orbit-oracle]# ls |wc -l
    1185524
    [root@iZ25zpeock2Z orbit-oracle]# rm -f *
    -bash: /bin/rm: Argument list too long
    [root@iZ25zpeock2Z orbit-oracle]# pwd
    /tmp/orbit-oracle
    [root@iZ25zpeock2Z orbit-oracle]# ls |wc -l
    1185524
    [root@iZ25zpeock2Z orbit-oracle]# ls |xargs rm -f *
    -bash: /usr/bin/xargs: Argument list too long
    [root@iZ25zpeock2Z orbit-oracle]# ls |wc -l
    1185524
    [root@iZ25zpeock2Z orbit-oracle]# find . -name "*" | xargs rm -rf '*' 
    rm: cannot remove directory: `.'
    ^C
    [root@iZ25zpeock2Z orbit-oracle]# ls |wc -l
    1035696
    [root@iZ25zpeock2Z orbit-oracle]# df -i
    Filesystem Inodes IUsed IFree IUse% Mounted on
    /dev/xvda1 1310720 1161190 149530 89% /
    tmpfs 1007257 738 1006519 1% /dev/shm
    /dev/xvdd1 19660800 45404 19615396 1% /u01
    /dev/xvdc1 9830400 12 9830388 1% /logs
    /dev/xvdb1 3276800 10559 3266241 1% /app
    [root@iZ25zpeock2Z orbit-oracle]# find . -name "*" | xargs rm -rf '*' 
    rm: cannot remove directory: `.'
    ^C
    [root@iZ25zpeock2Z orbit-oracle]# df -i
    Filesystem Inodes IUsed IFree IUse% Mounted on
    /dev/xvda1 1310720 751189 559531 58% /
    tmpfs 1007257 738 1006519 1% /dev/shm
    /dev/xvdd1 19660800 45404 19615396 1% /u01
    /dev/xvdc1 9830400 12 9830388 1% /logs
    /dev/xvdb1 3276800 10560 3266240 1% /app
    [root@iZ25zpeock2Z orbit-oracle]# ls |wc -l
    625698
    [root@iZ25zpeock2Z orbit-oracle]#

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

    http://hi.baidu.com/cpuramdisk/item/5aa49ce00c0757aecf2d4f24

    四种解决”Argument list too long”参数列表过长的办法

    在linux中删除大量文件时,直接用rm会出现:-bash: /bin/rm: 参数列表过长,的错误。

    这时可以用find命令来结合使用。

    例:
    1、rm * -rf 改为:
    find . -name "*" | xargs rm -rf '*' 就行了。

    2、rm test* -rf 改为:
    find . -name "test*" | xargs rm -rf "test*"

    mv时报参数列表过长,

    for i in *.m;do mv $i ${i%.m};done

    于是求助于google,探索过程就省略了,直接说解决方法吧:

    ls dir1 | xargs -t -I {} mv {} dir2/{}

    这里的一对大括号是原文给的例子里用的,后来看了参数的用法,其实那对大括号是可以用任意字符串替换的,比如:

    ls dir1 | xargs -t -I asdf mv asdf dir2/asdf

    效果和大括号那一版是完全一样的,就是看起来有点儿不严肃。

    需要说明的是,上面xargs的第二个参数,是大写的i,读作”爱“的那个字母,不是小写的L。至于参数的含义嘛,我忘了。

     Linux下 报错“命令参数列表过长”,在用mv命令一次移动3万多个文件时失败了,原始命令类似这样:”mv $(ls dir1) dir2“。错误提示的中心思想是:”你这参数也太TM多了吧“。

    按照LZ想法大概可以这么做:find /dir1/ -maxdepth 1 | xargs -i mv {} /dir2/
    如果参数过长,使用tar比较简单
    tar -C /dir1/ -cf - . | tar -xf - -C /dir2/

      于是求助于google,探索过程就省略了,直接说解决方法吧:

      ls dir1 | xargs -t -I {} mv {} dir2/{}

      这里的一对大括号是原文给的例子里用的,后来看了参数的用法,其实那对大括号是可以用任意字符串替换的,比如:

      ls dir1 | xargs -t -I asdf mv asdf dir2/asdf

      效果和大括号那一版是完全一样的,就是看起来有点儿不严肃。

      需要说明的是,上面xargs的第二个参数,是大写的i,读作”爱“的那个字母,不是小写的L。至于参数的含义嘛,我忘了。

    另外4种方法

    作为一个linux用户/系统管理员, 有些时候你会遇到以下错误提示:

    [user@localhost foo]$ mv * ../foo2

    bash: /bin/mv: Argument list too long


    “Argument list too long”参数列表过长错误经常发生在用户在一行简单命令中提供了过多的参数而导致,经常在ls *, cp *, rm * 等中出现。
    根据问题的原因以下提供了四种方法,可以根据自己的情况酌情选用

    方法1 : 将文件群手动划分为比较小的组合
    e.g 1:

    [user@localhost foo]$ mv [a-l]* ../foo2

    [user@localhost foo]$ mv [m-z]* ../foo2


    这是最基本的方法,只是简单的使参数数量符合要求,这种方法应用范围有限,只适用于文件列表中的名字分布比较均匀,另外这也是个初级用户可以考虑的解决方案,不过需要很多重复命令和对文件名分布的观察与猜测。

    方法2 : 使用find命令
    e.g 2:

    [user@localhost foo]$ find $foo -type f -name '*' -exec mv {}$foo2/. ;

    方法2通过find命令,将文件清单输出到mv命令,使其一次处理一个,这样就完全避免了过量参数的存在,另外通过不同的参数,可以指定除了名称以外的时间戳,权限,以及inode等匹配模式。
    方法2的缺点在于比较耗费时间。

    方法3 : 创建shell函数
    e.g 3.1:

    function huge_mv ()
    {whileread line1; do
    mv foo/$line1 ../foo2
    done
    }
    ls -1 foo/ | huge_mv

    写一个shell函数并不涉及到某种程度的复杂性, 这种方法比方法1和方法2相比更加灵活。
    下面我们来扩展一下例3.1 :
    e.g 3.2:

    function huge_mv ()
    {whileread line1; do
    md5sum foo/$line1 >> ~/md5sums
    ls -l foo/$line1 >> ~/backup_list
    mv foo/$line1 ../foo2
    done
    }
    ls -1 foo/ | huge_mv

    相比例3.1,例3.2生成了文件的md校验散列文件和名字备份,符合给自己留条后路的哲学。
    另外可以根据自己的需要无限制的扩展功能。

    方法4 : 终极解决方案,重新编译内核

    首先使用这个方案之前要谨慎,因为涉及到修改内核源代码,在生产环境中还是要斟酌一下并做好测试。
    另外,这个方法是从根本上解决的,一劳永逸的 
    这也是开放源码的好处之一 
    首先在内核源码中找到 include/linux/binfmts.h文件 ,搜索到以下字段:
    /*
    * MAX_ARG_PAGES defines the number of pages allocated for arguments
    * and envelope for the new program. 32 should suffice, this gives
    * a maximum env+arg of 128kB w/4KB pages!
    */
    #define MAX_ARG_PAGES 32

    修改 MAX_ARG_PAGES数值为 64 或者更高即可完善的解决参数受限问题。
    然后 重新编译并启用新内核即可。

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

    http://blog.csdn.net/iefreer/article/details/6124761

    http://www.ttlsa.com/linux/no-space-left-on-device/

    一. 收到报警

    线上有一台服务器磁盘检测告警了,提示空间不足。爬到服务器查看相关信息:

    inode

    /data分区只使用了71%,创建文件却提示磁盘空间不足,按理说不会出现这种情况的。难道inode耗尽?

    二. 分析原因

    查看/data分区inode使用情况相关信息如下:

    inode

    果不其然,IUse%=100%,导致无法创建文件。

    linux系统下,硬盘被分区格式化后,包含inode和block,inode是用来记录文件的大小,物理地址,属主,属组,读写权限,时间戳,被硬链接的次数等等元数据的。block是用来存储数据的。正因为这种文件系统结构,在linux下,除了剩余磁盘空间之外,还要剩余inode才行,两者缺一不可的。可通过dumpe2fs -h /dev/sdb1或tune2fs -l /dev/sdb1 来查看最大inode数和inode大小。一旦文件系统创建后,每个分区的可用inode数无法动态的进行调整,除非重新格式化。

    三. 查找原因并解决

    /data是线上业务数据目录,各种站点、日志、临时文件存放目录。其中有个程序产生大量的小文件造成的。可通过下面的命令找出占用空间最多的文件或目录:

    # du -cks * | sort -nr | head -n 20

    删除部分文件,释放inode。

    如需转载请注明出处:No space left on device http://www.ttlsa.com/html/2066.html

     ===========

    http://www.zijidelu.org/thread-46862-1-1.html

    看到这个错误,第一个反应是磁盘空间满了;但 df 一看,每个分区的空间都还富余的很。从 munin 的监控图表上看 Filesystem usage 也很平稳,但下面的 Inode usage 就有问题了,其中一个分区的 usage 已经到了100%。赶紧跑到服务器上 df -i 检查,果然是 Inode 耗尽。原来这个分区是用来扔各种日志和临时文件的,其中有某个程序产生的临时文件又小又多,又没有进行定时回滚,造成在磁盘空间耗尽之前文件系统的 Inode 就被用光了。

      Linux/Unix like OS 的文件系统中每个目录树中的节点并不是像 Windows 那样直接包含文件的具体信息,而只包含了文件名和 Inode number 。通过 Inode number 所找到对应于文件名的 Inode 节点中才真正记录了文件的大小/物理地址/所有者/访问权限/时间戳/被硬链接的次数等实际的 metadata 。因此你可以在 Linux 系统中通过硬链接( hard link ) 的方式给某个文件创建无数个位于不同目录下的文件名,而实际的文件数据只需要一份拷贝。

      但也正因为这种文件系统的结构,当你在 Linux 中进行 IO 操作的时候,需要的资源除了磁盘空间以外,还要有剩余的 Inode 才行。缺省情况下, Linux 在系统安装过程中按照1个 Inode 对应 2k 磁盘空间来计算每个分区的最大 Inode 数。一旦文件系统创建之后,每个分区可用 Inode 数就无法进行动态调整。

      正常来说,一般不太会出现某个分区的 Inode 耗尽而磁盘空间尚余的情况,除非像我碰到的这样垃圾小文件疯长而又没进行有效的清理。但如果确实需要的话,可以在创建文件系统(比如用 mke2fs )的时候根据实际需要来调整这个参数(比如分区如果用于存放超大视频文件的话 Inode 的数量可以少一些;如果打算存放的文件是大量小于 2k 的迷你文件的话就要考虑多创建一些 Inode)。

      其它人碰到的 No space left on device 原因:

      超出系统中同时运行的最大 message queue 个数限制 : 在 root 下用 sysctl kernel.msgmni 检查该参数,sysctl -w kernel.msgmni=XXX 重新设定即可。

     WARN  internal.ParameterParserImpl - Upload failed
    com.alibaba.service.upload.UploadException: Processing of multipart/form-data request failed. /tmp/upload_64f22eb1_113e12038a1__7fe6_00000000.tmp(No space left on device)
            at com.alibaba.service.upload.DefaultUploadService.parseRequest(DefaultUploadService.java:170)
            at com.alibaba.webx.request.context.parser.internal.ParameterParserImpl.parseUpload(P

    df  -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/sda2            4.9G 2.2G 2.4G  48% /
    /dev/sda1             99M  12M  83M  12% /boot
    none                 2.0G     0 2.0G   0% /dev/shm
    /dev/sda7            119G  45G  69G  40% /home
    /dev/sda3            4.9G 3.9G 685M  86% /usr
    /dev/sda5            2.9G 138M 2.6G   5% /var

    [admin@b2bsearch211 logs]$ df -i
    Filesystem           Inodes  IUsed  IFree IUse% Mounted on
    /dev/sda2            640000 640000      0 100% /
    /dev/sda1             26104     38  26066   1% /boot
    none                 218174      1 218173   1% /dev/shm
    /dev/sda7           15826944 147888 15679056   1% /home
    /dev/sda3            640000 147367 492633  24% /usr
    /dev/sda5            384000   3210 380790   1% /var
      df -i 可以看到Inode节点已经满了。

      通过删除大量的小文件得以解决。

    inode 是 UNIX 操作系统中的一种数据结构,其本质是结构体,它包含了与文件系统中各个文件相关的一些重要信息。在 UNIX 中创建文件系统时,同时将会创建大量的 inode 。通常,文件系统磁盘空间中大约百分之一空间分配给了 inode 表。   有时,人们使用了一些不同的术语,如 inode 和索引编号 (inumber)。这两个术语非常相似,并且相互关联,但它们所指的并不是同样的概念。inode 指的是数据结构;而索引编号实际上是 inode 的标识编号,因此也称其为inode 编号 或者索引编号。索引编号只是文件相关信息中一项重要的内容。下一个部分将介绍 inode 中的其他一些属性。   inode 表包含一份清单,其中列出了对应文件系统的所有 inode 编号。当用户搜索或者访问一个文件时,UNIX 系统通过 inode 表查找正确的 inode 编号。在找到 inode 编号之后,相关的命令才可以访问该 inode ,并对其进行适当的更改。   例如,使用 vi 来编辑一个文件。当您键入 vi <filename> 时,在 inode 表中找到 inode 编号之后,才允许您打开该 inode 。在 vi 的编辑会话期间,更改了该 inode 中的某些属性,当您完成操作并键入 :wq 时,将关闭并释放该 inode 。通过这种方式,如果两个用户试图对同一个文件进行编辑, inode 已经在第一个编辑会话期间分配给了另一个用户 ID (UID),因此第二个编辑任务就必须等待,直到该 inode 释放为止。
    1. inode 是作甚么的?  
      
      一个 filesystem 可以粗略地分成 inode table 与 data area 两部份.  
      inode table 上有许多的 inode, 每个 inode 分别 记录一个档案的属性,  
      与这个档案分布在哪些 datablock 上  
      
    2. 一个 inode 有多大呢?  
      
      128 byte!  
      
    3. inode 和 data area 的关系  
      
      在 new filesystem 时, 通常会有一个参数, 用来描述要分配多少比例的空间给  
      inode table. 举例来说,  
      
      newfs -i 2048  
      
      是指 file system 中, 每分配 2048 byte 给 data area, 就分配一个 inode  
      但是一个 inode 就并不是一定就用掉 2048 byte, 也不是说 files allocation  
      的最小单位是 2048 byte, 它仅仅只是代表 filesystem 中  
      inode table/data area 分配空间的比例是 128/2048 也就是 1/16  
      (换个角度想, 我们可以想成是预估 filesystem 中 file 平均大小是 2048 byte)  
      
      如果 inode table 太小, 那么在每个档案都很小的时候, 就会发生 inode 用光 而  
      datablock 还剩一堆的情形.  
      
    4. file allocation 的最小单位 和 inode 多少有没有关系呢?  
      
      没有关系!  
      
      FFS 中真正的最小单位是 fragment size 也就是我们在 new filesystem 时用的  
      
      newfs -b 8192 -f 1024  
                    ^^^^^^^^  
      ps: -b 8192 代表 blocksize=8192, 这种"较大单位"是用来加速大档案的存取用的  
      
    在 FreeBSD 中, 内定的是 -i 4096 -b 8192 -f 1024. 如果您要架 bbs/new 的话  
    可以考虑用 -i 1024 -b4096 -f1024  
      
    unixer  
      
    ============================================================================  
    From: alexj@mail.tmc.edu.tw (Ji, Wen-Jie)  
    Newsgroups: tw.bbs.comp.386bsd  
    Subject: Re: HELP !! The parameter of newfs  
    Date: Thu, 12 Dec 1996 01:39:31 GMT  
      
            没关系,我自己找到答案了,写在此让大家分享一下.  
            所谓 block size & fragment size, 这是属于 file system  
            的一种解决方案. 自4.3 BSD, BSD 用这种方法来解决档案 fragment  
            的问题  
                    先假设  a block size= 4K, a fragment size = 256Bytes.  
            假如你现在要将一个 1K 的新档案写入 file system, FS 会把它存入 4  
            个fragment,而不会存入 block,一但这个档案继续被 append 增加到 4K  
            时, FS 会将它转存到一个 block中, 而原来的 16 个fragments 就会被 clean  
                                               ^^^^^^^^^^^^^^^^^^^^  
                                           因为当你的档案大到 4K 时,它占用  
                                           了 16 (4K / 256 bytes) 个 fragments  
                    再举个例子, 如果现在又存了一个新的 4.1K 的档案, FS 会分配  
            一个 block 及 4个 fragment 给 这个档案,  
            因为 1 block + 4 fragments = 4 K + 256 bytes * 4 = 4.1K  
      
            所以,有此可知,对于一台 news server, bbs, 或是会有大量的小档案存取时,  
            为了降低 FS 的空间耗损率,应该采用 -b 4096 -f 256,  
            而不要采用预设值的 -b 8192 -f 1024,因为大部分的信件都不超过 512 bytes,  
            有些更不超过 256 bytes, 但是这样可能会降低存取的速度.但我相信不严重  
            有兴趣的人可以试试.  

    一:

    设置crontab 时提示No space left on device
    用df -k 检查还有空间

    用df -i  显示 /var 已占用100%,如果inode耗尽,则系统上将不能创建文件。

    在/var/spoo/clientmqueue/下有超多的文件 ls 半天没反应
    用rm -rf * 会自动跳出root,用xargs来解决。

    # cd /var/spool/clientmqueue

    # ls | xargs rm -f


    原因分析:系统中cron执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,而sendmail没有启动所以就产生了这些文件;
    解决办法:  将crontab里面的命令后面加上> /dev/null 2>&1







    二:

    故障现象:

    1 when you create a new y or file , system will say : No space left on device

    [shelladm@linux /var]# mkdir aa

    mkdir: cannot create y `aa': No space left on device


    2 when create crontab for account shelladm , you will receive error information as follows:


    "crontab.6655" 1L, 13C written

    crontab: installing new crontab

    cron/tmp.6655: No space left on device

    crontab: edits left in /tmp/crontab.6655

    处理步骤:

    1 检查分区使用率

    [root@linux ~]# df -lk
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/hda2              3020172    136008   2730744   5% /
    /dev/hda1               101089      9378     86492  10% /boot
    /dev/hda7            105708092  38996880  61341488  39% /b2006
    none                   1028548         0   1028548   0% /dev/shm
    /dev/hda3              3020172   1421092   1445660  50% /usr
    /dev/hda6               497829    371795    100332  79% /var
    分区/var的使用率只有79%,系统有空间可以用

    2 检查/var/lock下的文件,删除/var/lock/subsys/nfs后,touch /var/aa,成功创建文件,删除/var/aa

    3 发现删除/var/lock下的任意一个文件后

    [root@linux /var]#touch /var/aa        -------------------成功

    [root@linux /var]# touch aa1                -------------------失败
    touch: creating `aa1': No space left on device

    4 将检查扩大到/var下的其他目录,
    [root@linux icons]# cd /var/www/icons
    [root@linux icons]# mv a.gif /tmp
    [root@linux icons]# mv a.png /tmp     -------------------移走两个文件
    [root@linux icons]# df -li
    [root@linux icons]# touch aa
    [root@linux icons]# touch bb
    [root@linux icons]# touch cc
    touch: creating `cc': No space left on device -----------只能创建两个文件,当创建第三个文件时,出错

    5 怀疑分区/var的inode用尽导致上述问题,检查inode使用率

    [root@linux icons]# df -li
    Filesystem            Inodes   IUsed   IFree IUse% Mounted on
    /dev/hda2             384000   23698  360302    7% /
    /dev/hda1              26104      41   26063    1% /boot
    /dev/hda7            13434880    7964 13426916    1% /b2006
    none                  257137       1  257136    1% /dev/shm
    /dev/hda3             384000   78026  305974   21% /usr
    /dev/hda6             128520  128520       0  100% /var
    发现/var的inode使用率已经达到100%,空余的inode为0

    6 分区/var没有配置quota ,平均每个inode的占用空间为:497829k(var size)/128520(inodes)=3.87k,说明分区的最小block为4k,无法增加inode限额。

    7 发现/var/spool/clientmqueue下面有太多的文件,共有127679个,占用了127679/128520(inodes)=99.3%的inode
      系统的邮件配置有问题,导致系统发出的邮件堆积在队列中,占用的大量的inode.


    处理方法:确认/var/spool/clientmqueue下的文件已经无用后,删除之。然后/var写入正常。
              最好的解决办法是重新设置系统邮件,使其能正常发送。

    删除文件后的inode使用情况
    [root@linux clientmqueue]# df -li
    Filesystem            Inodes   IUsed   IFree IUse% Mounted on
    /dev/hda2             384000   23698  360302    7% /
    /dev/hda1              26104      41   26063    1% /boot
    /dev/hda7            13434880    7964 13426916    1% /b2006
    none                  257137       1  257136    1% /dev/shm
    /dev/hda3             384000   78026  305974   21% /usr
    /dev/hda6             128520    4561  123959    4% /var



    结论:分区/var的inode全部用尽,free inode为0,导致无法创建新的文件或目录,以后遇到类似的问题要注意
          用df -li 检查inode的使用情况。

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

    http://blog.csdn.net/hunanchenxingyu/article/details/38587633

    1、现象

    cp: cannot create directory `/mnt/usr/portage/app-emacs/h4x0r': No space left on device
    cp: cannot create directory `/mnt/usr/portage/app-emacs/csv-mode': No space left on device
    cp: cannot create directory `/mnt/usr/portage/app-emacs/ess': No space left on device
    cp: cannot create directory `/mnt/usr/portage/app-emacs/mew': No space left on device
    cp: cannot create directory `/mnt/usr/portage/app-emacs/org-mode': No space left on device
    cp: cannot create directory `/mnt/usr/portage/app-emacs/vhdl-mode': No space left on device
    cp: cannot create directory `/mnt/usr/portage/app-emacs/tdtd': No space left on device
    cp: cannot create directory `/mnt/usr/portage/app-emacs/dired-sort-menu': No space left on device
    cp: cannot create directory `/mnt/usr/portage/app-emacs/uboat': No space left on device
    cp: cannot create directory `/mnt/usr/portage/app-emacs/mode-compile': No space left on device

    2、分析

    df -i : 查看文件系统的inodes节点数

    root@lemaker:/extFlash1/rootfs/gentoo# df -i
    Filesystem           Inodes  IUsed  IFree IUse% Mounted on
    /dev/sda2           1179648 210218 969430   18% /
    udev                 124795    532 124263    1% /dev
    tmpfs                126991    455 126536    1% /run
    none                 126991      6 126985    1% /run/lock
    none                 126991      1 126990    1% /run/shm
    /dev/sda5             24096    231  23865    1% /boot
    /dev/sdb1            655360 317560 337800   49% /extFlash1
    /dev/mapper/loop0p2  222656 222656      0  100% /mnt

    由于文件系统所对应的inode已经全部使用,最终无法给后续复制的文件分配inode。

    3、解决方法

    重新格式化/dev/mapper/loop0p2,并指定inode数,如下:

    mkfs.ext4 /dev/mapper/loop0p2  -N 235000 (inode 数根据实际情况估计)

    http://bbs.chinaunix.net/thread-2195775-1-1.html

    2.6 inode与ln 

    一个文件包括有名称、内容和管理信息如权限或修改时间。
    管理信息就存放在Inode中,同时存放的还有文件的长度,文件放在磁盘的位置等

    查看一个文件的Inode号码
    # ls -i
    654076 test1  

    我们用ln使一个链指向一个已有的文件。
    #ln test1 test2
    #ls -i
    654076 test1  654076 test2
    这里test1和test2的Inode号码是一样的。
    也就是说他们其实是同一个文件(Inode号码相同,也即是文件放在磁盘的位置一样),但是具有两个名称。
    这样的好处是可以让一个文件存在不同的目录,或者存在不同的名称。
    对test1的修改也即是对test2的修改。
    # ls -l
    -rw-r--r--  2 root root 29 Dec 29 17:32 test1
    -rw-r--r--  2 root root 29 Dec 29 17:32 test2
                   ~~ 这里的2,就表示指向同一个Inode的链接数。

    删掉test2
    #ls -l
    -rw-r--r--  1 root root 29 Dec 29 17:32 test1

    或许会有疑惑,既然test1和test2是同一个文件,为什么删除test2,test1还在呢?
    在这种情况,删除test2只是删除了一条指向654076这个Inode的一个链接。
    文件依然存在。只有当最后一条链被删除时,即指向Inode的链接数为0时,文件才被删除。

    # ln /boot/grub/grub.conf /home/test/grub
    ln: creating hard link `grub' to `/boot/grub/grub.conf': Invalid cross-device link

    在这里,我的系统分了/,/boot,等分区
    ln有一个问题就是不能跨设备(分区或者文件子系统)创建链接,一是因为分区可以被mount和umount,
    跨分区的硬链接在分区umount会带来一些麻烦,另外每个分区的Inode值不相同。

    昨天看见有个帖说,除了swap区,可以把所有的磁盘分成一个区。
    但是这样当一个分区出现文件系统错误,可能所有的数据都没有了。
    而划分多个分区,每个分区的Inode不同。即使某个分区的数据错误,也不至于影响到整个系统。

    跨设备创建链接,可以使用
    #ln -s /test /home/test/test

    # ls -li /test
    13 -rw-r--r--  1 root root 0 Dec 29 17:45 /test

    # ls -li /home/test/test
    1697478 lrwxrwxrwx  1 root root 5 Dec 29 17:46 /home/test/test -> /test

    这样就是一个软链接,它是可以跨设备的,在文件类型这里会显示l
    可以看到它们的Inode号码是不同的,而且链接的数目分别各为1
    因此它们并不是同一个文件。

    在软链接的情况下,修改链接到的文件/home/test/test,也修改了被链接的文件/test。
    但这种方式和硬链接是不同的。这是通过某种机制来实现同步。而不是同一个文件的修改。

    删除链接到的文件,对被链接文件没有任何影响。
    而删除被链接文件/test,链接到的文件依然存在,但是会闪烁,提示被链接的文件不存在了
    也不能读取该文件了
    #rm /test
    # ls -il /home/test/test
    1697478 lrwxrwxrwx  1 root root 5 Dec 29 17:51 /home/test/test -> /test
    # more /home/test/test
    /home/test/test: No such file or directory

    事实上/home/test/test是存在的,作为一种特殊的文件类型为l的文件。
    只不过软链接的一些规则决定了它不可读。

    为了加深对文件Inode的理解,可以从mv和cp文件来说明:

    # cp test1 test2
    # ls -i
    654076 test1  654081 test2

    这两个文件Inode值不一样,cp的实质是复制创建了一个新文件

    #mv  test1 test3
    #ls -i
    654076 test3

    跟上面的比较,test1和test3的Inode是相同。
    所以mv只是更改了文件的名称,也即是访问文件的入口
    它们是指向同一个位置磁盘上的文件。

    但是如果mv一个文件到另一个分区。
    如前面所讲,不同分区的Inode值是不同的。
    # ls -il /root/fs/test
    654076 -rw-r--r--  1 root root 29 Dec 29 17:32 /home/fs/test
    # mv test /boot/test
    # ls -il /boot/test
    16 -rw-r--r--  1 root root 29 Dec 29 17:32 /boot/test

    所以mv文件到不同的分区,是删除掉原分区的文件之后在另外一个分区重新创建这个文件。
    因此有了一个不同的Inode值。

    2.7 调整Inode数量
    另外,每个分区的Inode数目是有限的。
    可以使用df -i来查看

    # df -i
    Filesystem            Inodes   IUsed   IFree IUse% Mounted on
    /dev/mapper/VolGroup00-LogVol00
                         1958400   97435 1860965    5% /
    /dev/sda1              26104      32   26072    1% /boot
    /dev/shm               23850       1   23849    1% /dev/shm

    当一个磁盘分区(文件子系统)的Inode被用光的时候,是无法再创建文件的。
    这种情况在邮件服务器或者BBS这种系统中容易出现,因为用户创建了很多小文件的情况。

    要增加Inode的数量只能umount文件系统,然后用mke2fs命令来调整

    #mke2fs.ext3 /dev/sda1 [ -N number-of-inodes ] 
    直接指定需要的Inode数目
    或者
    #mke2fs.ext3 /dev/sda1 [ -i bytes-per-inode ]
    调整字节/inode的比例,来达到增加创建inode数目的目的。
    磁盘空间一定的情况下,当然比例越小,能创建的Inode就越多

    当然如果你是只有很少但是很大的数据库文件。就可以调高bytes/inode的比例。
    (更多的关于mke2fs的信息,自己去man)

    不过注意。调整Inode相当于重新格式化了分区。原有的文件都会丢失
    所以确实需要调整的话,先要备份数据;
    或者在服务器搭建时预先设置好。

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

    http://www.eygle.com/archives/2007/07/inode_no_space_lefton_device.html

    这是一则学习笔记,具体问题ITPUB上提问的朋友已经自己解决。

    作者提出的问题是这样的:
    一台测试的服务器,停电再起来后发现listener起不来,报错如下:
    Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.191.100)(PORT=1521)))
    Error listening on: (ADDRESS=(PROTOCOL=ipc)(PARTIAL=yes)(QUEUESIZE=1))
    No longer listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.191.100)(PORT=1521)))
    TNS-12549: TNSperating system resource quota exceeded
    TNS-12560: TNSrotocol adapter error
    TNS-00519: Operating system resource quota exceeded
    Linux Error: 28: No space left on device

    对于这个提示,一般的直觉反映是磁盘空间用完了,不过这个错误肯定大家都能发现:

    首先查看log文件,已经2G了,打开看看日志里面也没发现什么异常,认为日志是自然增长到这么大的,于是直接cat /dev/null>listener.log把日志清空。然后listener还是起不来,仍然报上面的错误。之后重启机器,还是不行,检查磁盘空间也没有问题。

    显然没这么简单,以前的一些经验,当系统信号量不足时也可能导致这类错误提示。

    不过作者最后发现的问题是inode耗尽。
    在Linux上,我们可以用df -i来查看inode的分配情况:

    [oracle@jumper elog]$ df -i
    Filesystem Inodes IUsed IFree IUse% Mounted on
    /dev/hda3 131616 25376 106240 20% /
    /dev/hda1 66264 35 66229 1% /boot
    /dev/hda5 1048576 37166 1011410 4% /data1
    /dev/hda9 294336 6020 288316 3% /home
    /dev/hda6 1048576 20467 1028109 2% /opt
    none 64193 1 64192 1% /dev/shm
    /dev/hda8 524288 87362 436926 17% /usr
    /dev/hda7 524288 1598 522690 1% /var

    如果inode耗尽,则系统上将不能创建文件。监听器就可能无法启动。
    作者当时耗尽的/var下的inode,那么Oracle监听器是否需要使用var下的空间呢?
    我们看一下测试:

    [oracle@jumper tmp]$ strace -o lsnrctl.log lsnrctl start

    LSNRCTL for Linux: Version 9.2.0.4.0 - Production on 09-JUL-2007 15:45:09

    Copyright (c) 1991, 2002, Oracle Corporation. All rights reserved.

    Starting /opt/oracle/product/9.2.0/bin/tnslsnr: please wait...

    TNSLSNR for Linux: Version 9.2.0.4.0 - Production
    System parameter file is /opt/oracle/product/9.2.0/network/admin/listener.ora
    Log messages written to /opt/oracle/product/9.2.0/network/log/listener.log
    Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
    Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=172.16.33.11)(PORT=1521)))

    Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
    umovestr: Input/output error
    STATUS of the LISTENER
    ------------------------
    Alias LISTENER
    Version TNSLSNR for Linux: Version 9.2.0.4.0 - Production
    Start Date 09-JUL-2007 15:45:09
    Uptime 0 days 0 hr. 0 min. 0 sec
    Trace Level off
    Security OFF
    SNMP OFF
    Listener Parameter File /opt/oracle/product/9.2.0/network/admin/listener.ora
    Listener Log File /opt/oracle/product/9.2.0/network/log/listener.log
    Listening Endpoints Summary...
    (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=172.16.33.11)(PORT=1521)))
    Services Summary...
    Service "PLSExtProc" has 1 instance(s).
    Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
    Service "eygle" has 1 instance(s).
    Instance "eygle", status UNKNOWN, has 1 handler(s) for this service...
    Service "julia" has 1 instance(s).
    Instance "eygle", status UNKNOWN, has 1 handler(s) for this service...
    The command completed successfully

    检查一下跟踪文件:

    [oracle@jumper tmp]$ grep var lsnrctl.log 
    execve("/opt/oracle/product/9.2.0/bin/lsnrctl", ["lsnrctl", "start"], [/* 33 vars */]) = 0
    connect(4, {sa_family=AF_UNIX, path="/var/run/.nscd_socket"}, 110) = -1 ENOENT (No such file or directory)
    access("/var/tmp/.oracle", F_OK) = 0
    access("/var/tmp/.oracle/sEXTPROC", F_OK) = 0
    connect(4, {sa_family=AF_UNIX, path="/var/tmp/.oracle/sEXTPROC"}, 110) = 0

    启动监听文件后,/var/tmp/.oracle目录下会创建两个文件,用于外部存储过程调用的监听和本地监听:

    [oracle@jumper tmp]$ ll /var/tmp/.oracle/ |wc -l
    16
    [oracle@jumper tmp]$ lsnrctl stop

    LSNRCTL for Linux: Version 9.2.0.4.0 - Production on 09-JUL-2007 15:46:08

    Copyright (c) 1991, 2002, Oracle Corporation. All rights reserved.

    Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
    The command completed successfully
    [oracle@jumper tmp]$ ll /var/tmp/.oracle/ |wc -l
    14
    [oracle@jumper tmp]$ lsnrctl start

    LSNRCTL for Linux: Version 9.2.0.4.0 - Production on 09-JUL-2007 15:46:13

    Copyright (c) 1991, 2002, Oracle Corporation. All rights reserved.

    Starting /opt/oracle/product/9.2.0/bin/tnslsnr: please wait...

    TNSLSNR for Linux: Version 9.2.0.4.0 - Production
    System parameter file is /opt/oracle/product/9.2.0/network/admin/listener.ora
    Log messages written to /opt/oracle/product/9.2.0/network/log/listener.log
    Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
    Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=172.16.33.11)(PORT=1521)))

    Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
    STATUS of the LISTENER
    ------------------------
    Alias LISTENER
    Version TNSLSNR for Linux: Version 9.2.0.4.0 - Production
    Start Date 09-JUL-2007 15:46:13
    Uptime 0 days 0 hr. 0 min. 0 sec
    Trace Level off
    Security OFF
    SNMP OFF
    Listener Parameter File /opt/oracle/product/9.2.0/network/admin/listener.ora
    Listener Log File /opt/oracle/product/9.2.0/network/log/listener.log
    Listening Endpoints Summary...
    (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=172.16.33.11)(PORT=1521)))
    Services Summary...
    Service "PLSExtProc" has 1 instance(s).
    Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
    Service "eygle" has 1 instance(s).
    Instance "eygle", status UNKNOWN, has 1 handler(s) for this service...
    Service "julia" has 1 instance(s).
    Instance "eygle", status UNKNOWN, has 1 handler(s) for this service...
    The command completed successfully
    [oracle@jumper tmp]$ ll /var/tmp/.oracle/ |wc -l
    16
    [oracle@jumper tmp]$ ll .oracle/
    total 0
    srwxrwxrwx 1 oracle dba 0 Jan 18 2006 s#11126.1
    srwxrwxrwx 1 oracle dba 0 Jan 3 2007 s#12200.1
    srwxrwxrwx 1 oracle dba 0 Apr 24 2006 s#14328.1
    srwxrwxrwx 1 oracle dba 0 Oct 20 2006 s#14420.1
    srwxrwxrwx 1 oracle dba 0 May 8 2006 s#15102.1
    srwxrwxrwx 1 oracle dba 0 Mar 18 2005 s#16499.1
    srwxrwxrwx 1 oracle dba 0 Jul 9 15:46 s#16661.1
    srwxrwxrwx 1 oracle dba 0 May 18 2006 s#21975.1
    srwxrwxrwx 1 oracle dba 0 Jun 28 2005 s#23361.1
    srwxrwxrwx 1 oracle dba 0 Nov 3 2006 s#27269.1
    srwxrwxrwx 1 oracle dba 0 Nov 10 2006 s#4200.1
    srwxrwxrwx 1 oracle dba 0 Oct 17 2006 s#6146.1
    srwxrwxrwx 1 oracle dba 0 Aug 28 2006 s#6565.1
    srwxrwxrwx 1 oracle dba 0 Jun 27 2006 s#9884.1
    srwxrwxrwx 1 oracle dba 0 Jul 9 15:46 sEXTPROC

    这个原因才是导致监听器无法启动的罪魁祸首。

    遭遇者的日志记录参考:
    http://zhang41082.itpub.net/post/7167/305840

    -The End-

     

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

    参考资料:

     http://zhidao.baidu.com/question/1238517886290647819.html

    http://bbs.chinaunix.net/thread-2272344-1-1.html

    为什么/tmp/orbit-root下会又这么多socket文件呢???

    ORBit(Object Request Broker)相关的进程产生的,主要是因为对象或者进程间消息传递产生的临时文件。

    ORB是CORBA应用的基础
  • 相关阅读:
    android 使用adb重新建立 eclipse和模拟器间的连接
    android ADB server didn't ACK
    Android getSystemService()
    Android隐藏标题栏
    Android 与WCF REST 服务联调
    Eclipase 无法启动,启动界面显示完版本号之后无响应
    调用WCF REST服务时,使用JSON
    org.apache.http.conn.HttpHostConnectException: Connection to refused
    SqlServer跨域查询
    ASP.net导出Excel的几种方式
  • 原文地址:https://www.cnblogs.com/xzlive/p/11075554.html
Copyright © 2011-2022 走看看