/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應用的基礎


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM