歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> 解決linux系統下因分區目錄劃分過小,導致tomcat使用系統臨時文件夾(/tmp)沒有足夠空間而報錯的問題

解決linux系統下因分區目錄劃分過小,導致tomcat使用系統臨時文件夾(/tmp)沒有足夠空間而報錯的問題

日期:2017/3/3 13:39:43   编辑:Linux技術

1. 故障現象.

B/S應用進行文件上傳後,系統反饋:沒有足夠的磁盤空間(No enough space available).

2. 故障分析

檢查文件占用情況如下:
[code][root@Qa2 /]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root  6.7G  6.7G  20k  100% /
devtmpfs                 7.8G     0  7.8G   0% /dev
tmpfs                    7.8G     0  7.8G   0% /dev/shm
tmpfs                    7.8G   41M  7.8G   1% /run
tmpfs                    7.8G     0  7.8G   0% /sys/fs/cgroup
/dev/vdb                 303G  132G  171G  44% /mnt
/dev/vda1                497M  163M  335M  33% /boot
tmpfs                    1.6G     0  1.6G   0% /run/user/0

再看看磁盤分區情況:
[code][root@Qa2 /]# fdisk -l
Disk /dev/vda: 8589 MB, 8589934592 bytes, 16777216 sectors

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     1026047      512000   83  Linux
/dev/vda2         1026048    16777215     7875584   8e  Linux LVM

Disk /dev/vdb: 325.3 GB, 325343772672 bytes, 635437056 sectors

Disk /dev/mapper/centos-root: 7159 MB, 7159676928 bytes, 13983744 sectors

Disk /dev/mapper/centos-swap: 859 MB, 859832320 bytes, 1679360 sectors

可以看到,系統目錄/占用情況100%,應該就是因為它100%占用後,沒有更多空間給tomcat使用.
繼續檢查文件占用情況:
[code][root@Qa2 /]# du -hd 1 /
137M    /boot
0       /dev
0       /proc
41M     /run
0       /sys
22M     /etc
64K     /root
3.6G    /tmp
171M    /var
2.2G    /usr
0       /home
0       /media
132G    /mnt
0       /opt
0       /srv

再看看目錄掛載情況:
[code][root@Qa2 /]# mount
/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,noquota)
/dev/vdb on /mnt type xfs (rw,noatime,attr2,inode64,noquota)
/dev/vda1 on /boot type xfs (rw,relatime,attr2,inode64,noquota)

分析:
* 系統文件根目錄(/)只分配了6.7G,占用100%
* /tmp在根目錄內,占用3.6G;/usr占2.2G;/mnt是額外掛載的文件夾,不會算在6.7G內
所以,十分懷疑是/tmp占用過大導致,最好能讓/tmp文件夾增大空間,這樣就能解決根目錄/被100%占用的情況.
那麼如何增大/tmp文件空間呢?因為linux系統下,一切資源都是文件.
所以,可以將額外的磁盤掛載到/tmp上,這樣以後存入/tmp文件夾內的文件,就等同於寫入新的磁盤,就不會存在空間不足的情況了.

3. 准備新的磁盤

因為本系統是跑在kvm虛擬機中,所以增加新的磁盤可以通過掛載新的磁盤文件來實現.
以下操作,未說明時,均在宿主機上操作:
1) 創建一塊新的磁盤文件:
[root@imgHost /QA2]# qmenu-img create -f qcow2 -o size=10G QA2c.img

2) 修改啟動腳本,掛載新的磁盤文件–QA2c.img
[code][root@imgHost /QA2]# vi boot.sh
#! /bin/bash  
/usr/libexec/qemu-kvm -cpu host -enable-kvm -smp 2 -m 16384 -net nic,model=virtio,macaddr=52:54:1C:D7:63:C9 -net tap,ifname=vnet9,script=../tools/qemu-ifup,downscript=../tools/qemu-ifdown -drive file=./QA2a.img,if=virtio -drive file=./QA2b.img,if=virtio -drive file=./QA2c.img,if=virtio -daemonize

3) 啟動虛擬機
[code] [root@imgHost /QA2]# ./boot.sh
 > ::1:5908

虛擬機啟動成功,返回提示說明,虛擬機向外提供vnc連入端口是5908
4) 用VNCViewer連入虛擬機
[root@imgHost /QA2]# vncviewer :5908

等待系統啟動完畢,進入系統
* 以上這幾步,屬於kvm虛擬機和VPC方面的使用知識,不是本文的重點,所以沒有展開描述。後續時間充足的情況下,會補充進來。*
5) 格式化新加入的磁盤
[code][root@Qa2 /]# fdisk -l
Disk /dev/vda: 8589 MB, 8589934592 bytes, 16777216 sectors

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     1026047      512000   83  Linux
/dev/vda2         1026048    16777215     7875584   8e  Linux LVM

Disk /dev/vdb: 325.3 GB, 325343772672 bytes, 635437056 sectors

Disk /dev/vdc: 10.7 GB, 10737418240 bytes, 20971520 sectors

Disk /dev/mapper/centos-root: 7159 MB, 7159676928 bytes, 13983744 sectors

Disk /dev/mapper/centos-swap: 859 MB, 859832320 bytes, 1679360 sectors

可以看到新加入的磁盤:/dev/vdc,現在對其進行分區和格式化:
[code][root@Qa2 /]# fdisk /dev/vdc
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xcb345313.

Command (m for help): m
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   g   create a new empty GPT partition table
   G   create an IRIX (SGI) partition table
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition\'s system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

Command (m for help): g
Building a new GPT disklabel (GUID: 542E4712-E80A-4DDC-A76A-AD3FABCD0AB2)

Command (m for help): n
Partition number (1-128, default 1):    回車,用默認值,如果想劃分多個分區,要指定分區號
First sector (2048-20971486, default 2048): 回車用默認值
Last sector, +sectors or +size{K,M,G,T,P} (2048-20971486, default 20971486):    回車用默認值,指定分區大小,可隨意指定,512M,40G,2T等
Created partition 1 //創建了分區1,如果不是我這樣一路默認回車而將整個磁盤劃為一個分區的,可以隨後再劃分第二個分區

Command (m for help): w     //保存分區表並退出

新磁盤分區後,還需要格式化一下,然後才能用.這與window是一致的.
[root@Qa2 /]# mkfs.ext4 /dev/vdc

自此新硬盤准備完畢.

4. tmp文件夾重新掛載

因為tmp文件夾是系統文件,直接替換它的掛載是不允許的,所以要特殊點,簡單說,就是要進入像window中的安全模式去.
[root@Qa2 /]# init 1 //重啟系統,進入單用戶模式;因為用到重啟,所以這些操作都不能在ssh下,而是在vnc中操作

以下命令未說明時,均運行在單用戶模式下:
[code]Welcome to emergency mode! After logging in, type: 
    "journalctl -xb"        to view system logs
    "systemctl reboot"      to reboot
    "systemctl default" or ^D   to boot into default mode.

Give root password for maintenance
(or type Control-D to continue): root-password-to-log-in
[root@Qa2 ~]# cd /
[root@Qa2 /]# ll
total 32
lrwxrwxrwx    1 root root    7 Jan 12 15:54 bin -> usr/bin
dr-xr-xr-x.   4 root root 4096 Mar 31 11:22 boot
drwxr-xr-x   19 root root 3020 Apr 18 10:56 dev
drwxr-xr-x.  91 root root 8192 May  3 17:16 etc
drwxr-xr-x.   2 root root    6 Apr  1 14:40 home
lrwxrwxrwx    1 root root    7 Jan 12 15:54 lib -> usr/lib
lrwxrwxrwx    1 root root    9 Jan 12 15:54 lib64 -> usr/lib64
drwxr-xr-x.   2 root root    6 Aug 12  2015 media
drwxr-xr-x    9 root root  123 May  5 20:10 mnt
drwxr-xr-x.   2 root root    6 Aug 12  2015 opt
dr-xr-xr-x  120 root root    0 Apr 18 10:56 proc
dr-xr-x---.   4 root root 4096 Apr 21 16:04 root
drwxr-xr-x   26 root root  720 Apr 18 11:30 run
lrwxrwxrwx    1 root root    8 Jan 12 15:54 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6 Aug 12  2015 srv
dr-xr-xr-x   13 root root    0 Apr 18 10:56 sys
drwxrwxrwt.  12 root root 4096 May  7 03:45 tmp
drwxr-xr-x.  14 root root 4096 Jan 12 20:29 usr
drwxr-xr-x.  22 root root 4096 Apr 18 10:56 var
[root@Qa2 /]# mv /tmp /tmp.old
[root@Qa2 /]# ll |grep tmp
drwxrwxrwt.  12 root root 4096 May  7 03:45 tmp.old
[root@Qa2 /]# mkdir /tmp
[root@Qa2 /]# ll |grep tmp
drwxrwxrwt.  12 root root 4096 May  7 03:45 tmp
drwxrwxrwt.  12 root root 4096 May  7 03:45 tmp.old
[root@Qa2 /]# mout /dev/vdc /tmp

自此,系統文件夾tmp已經重新掛載到新加入的硬盤vdc中去了.但是,這種掛載只是暫時的,重啟電腦就丟了,所以需要持久化保存這個配置.
下面做的就是,將這種掛載情況持久化保存起來–寫入/etc/fstab
[code][root@Qa2 /]# vi /etc/fstab
#
# /etc/fstab
# Create by anaconda on Tue Jan 12 03:22:56 2016
# 
# Acessible filesystem, by reference, are maintained under 'dev/disk'
# See man pages fstab(5), find(8), mount(8) and/or blkid(8) for more info
#
# 設備            掛載點 文件類型    選項      
/dev/mapper/centos-root  /  xfs     defaults    0 0
/dev/mapper/centos-swap  swap   swap        defaults    0 0
/dev/vdb        /mnt    xfs     noatime,async   0 0

# add new mount point below, by Anyvone(Clazz) 
/dev/vdc        /tmp    ext4    default     0 0
:wq

[root@Qa2 /]# systemctl reboot

重啟後,即正常啟動系統,自此,完成本次故障的所有操作.
如不放心,可在重啟前,將tmp.old文件夾下的內容,拷貝自新掛載的tmp文件夾內.
[知識補充] fstab的介紹
[code]/etc/fstab 文件包含了如下字段,通過空格或 Tab 分隔:
<file system>   <dir>   <type>  <options>   <dump>  <pass>
<file systems> - 要掛載的分區或存儲設備.
<dir> - <file systems>的掛載位置。
<type> - 要掛載設備或是分區的文件系統類型,支持許多種不同的文件系統:ext2, ext3, ext4, reiserfs, xfs, jfs, smbfs, iso9660, vfat, ntfs, swap 及 auto。 設置成auto類型,mount 命令會猜測使用的文件系統類型,對 CDROM 和 DVD 等移動設備是非常有用的。
<options> - 掛載時使用的參數,注意有些mount 參數是特定文件系統才有的。一些比較常用的參數有:
auto - 在啟動時或鍵入了 mount -a 命令時自動掛載。
noauto - 只在你的命令下被掛載。
exec - 允許執行此分區的二進制文件。
noexec - 不允許執行此文件系統上的二進制文件。
ro - 以只讀模式掛載文件系統。
rw - 以讀寫模式掛載文件系統。
user - 允許任意用戶掛載此文件系統,若無顯示定義,隱含啟用 noexec, nosuid, nodev 參數。
users - 允許所有 users 組中的用戶掛載文件系統.
nouser - 只能被 root 掛載。
owner - 允許設備所有者掛載.
sync - I/O 同步進行。
async - I/O 異步進行。
dev - 解析文件系統上的塊特殊設備。
nodev - 不解析文件系統上的塊特殊設備。
suid - 允許 suid 操作和設定 sgid 位。這一參數通常用於一些特殊任務,使一般用戶運行程序時臨時提升權限。
nosuid - 禁止 suid 操作和設定 sgid 位。
noatime - 不更新文件系統上 inode 訪問記錄,可以提升性能(參見 atime 參數)。
nodiratime - 不更新文件系統上的目錄 inode 訪問記錄,可以提升性能(參見 atime 參數)。
relatime - 實時更新 inode access 記錄。只有在記錄中的訪問時間早於當前訪問才會被更新。(與 noatime 相似,但不會打斷如 mutt 或其它程序探測文件在上次訪問後是否被修改的進程。),可以提升性能(參見 atime 參數)。
flush - vfat 的選項,更頻繁的刷新數據,復制對話框或進度條在全部數據都寫入後才消失。
defaults - 使用文件系統的默認掛載參數,例如 ext4 的默認參數為:rw, suid, dev, exec, auto, nouser, async.
<dump> dump 工具通過它決定何時作備份. dump 會檢查其內容,並用數字來決定是否對這個文件系統進行備份。 允許的數字是 0 和 1 。0 表示忽略, 1 則進行備份。大部分的用戶是沒有安裝 dump 的 ,對他們而言 <dump> 應設為 0。
<pass> fsck 讀取 <pass> 的數值來決定需要檢查的文件系統的檢查順序。允許的數字是0, 1, 和2。 根目錄應當獲得最高的優先權 1, 其它所有需要被檢查的設備設置為 2. 0 表示設備不會被 fsck 所檢查。

關於fstab的更多信息,請參閱:/content/7046408.html
Copyright © Linux教程網 All Rights Reserved