解决linux系统下因分区目录划分过小,导致tomcat使用系统临时文件夹(/tmp)没有足够空间而报错的问题

1. 故障现象.

B/S应用进行文件上传后,系统反馈:没有足够的磁盘空间(No enough space available).

2. 故障分析

检查文件占用情况如下:

[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

再看看磁盘分区情况:

[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使用.

继续检查文件占用情况:

[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

再看看目录挂载情况:

[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

[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) 启动虚拟机

 [root@imgHost /QA2]# ./boot.sh
 > ::1:5908

虚拟机启动成功,返回提示说明,虚拟机向外提供vnc连入端口是5908

4) 用VNCViewer连入虚拟机
[root@imgHost /QA2]# vncviewer :5908
等待系统启动完毕,进入系统

* 以上这几步,属于kvm虚拟机和VPC方面的使用知识,不是本文的重点,所以没有展开描述。后续时间充足的情况下,会补充进来。*

5) 格式化新加入的磁盘

[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,现在对其进行分区和格式化:

[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中操作

以下命令未说明时,均运行在单用户模式下:

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

[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的介绍

/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的更多信息,请参阅:http://blog.csdn.net/richerg85/article/details/17917129

你可能感兴趣的:(linux)