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