解决八种Linux硬盘问题的技巧
不能在Linux或者类UNIX系统的硬盘上写入数据?想解决服务器上磁盘损坏的问题吗?想知道你为什么总是在屏幕上看到“磁盘已满”的字眼吗?想学习处理这些问题的办法吗?试试一下这8个解决Linux及UNIX服务器硬盘问题的小贴士吧。
#1 - 错误: 设备上无剩余空间
当你的类UNIX系统磁盘写满了时你会在屏幕上看到这样的信息。本例中,我运行fallocate命令然后我的系统就会提示磁盘空间已经耗尽:
- $ fallocate -l 1G test4.img
- fallocate: test4.img: fallocate failed:No space left on device
第一步是运行df命令来查看一个有分区的文件系统的总磁盘空间和可用空间的信息:
- $ df
或者试试可读性比较强的输出格式:
- $ df -h
部分输出内容:
- FilesystemSizeUsedAvailUse%Mounted on
- /dev/sda6 117G54G57G49%/
- udev 993M4.0K993M1%/dev
- tmpfs 201M264K200M1%/run
- none 5.0M05.0M0%/run/lock
- none 1002M01002M0%/run/shm
- /dev/sda1 1.8G115M1.6G7%/boot
- /dev/sda7 4.7G145M4.4G4%/tmp
- /dev/sda9 9.4G628M8.3G7%/var
- /dev/sda8 94G579M89G1%/ftpusers
- /dev/sda10 4.0G4.0G0100%/ftpusers/tmp
使用df命令输出可以清楚地发现,在 /dev/sda10 分区下总共4.0Gb的空间被全部写满了。
修复磁盘写满的问题
1.用gzip,bzip2或tar命令压缩未压缩的日志和其它文件:
- gzip /ftpusers/tmp/*.log
- bzip2 /ftpusers/tmp/large.file.name
2.在类UNIX系统中用rm命令删除不想要的文件:
- rm -rf /ftpusers/tmp/*.bmp
- rsync --remove-source-files -azv /ftpusers/tmp/*.mov /mnt/usbdisk/
- rsync --remove-source-files -azv /ftpusers/tmp/*.mov server2:/path/to/dest/dir/
4.在类UNIX系统中找出最占磁盘空间的目录或文件:
- du -a /ftpusers/tmp | sort -n -r | head -n 10
- du -cks *| sort -rn | head
5.清空指定文件。这招对日志文件很有效:
- truncate -s 0/ftpusers/ftp.upload.log
- ### bash/sh等 ##
- >/ftpusers/ftp.upload.log
- ## perl ##
- perl -e'truncate "filename", LENGTH'
6.在Linux和UNIX中找出并删除显示着但已经被删除的大文件:
- ## 基于Linux/Unix/OSX/BSD等系统 ##
- lsof -nP | grep '(deleted)'
- ## 只基于Linux ##
- find /proc/*/fd -ls | grep '(deleted)'
清空它:
- ## 基于Linux/Unix/OSX/BSD等所有系统 ##
- >"/path/to/the/deleted/file.name"
- ## 只基于Linux ##
- >"/proc/PID-HERE/fd/FD-HERE"
#2 - 文件系统是只读模式吗?
当你尝试新建或保存一个文件时,你可能最终得到诸如以下的错误:
- $ cat > file
- -bash: file:Read-only file system
运行mount命令来查看被挂载的文件系统是否处于只读状态:
- $ mount
- $ mount | grep '/ftpusers'
在基于Linux的系统中要修复这个问题,只需将这个处于只读状态的文件系统重新挂载即可:
- # mount -o remount,rw /ftpusers/tmp
(LCTT 译注:如果硬盘由于硬件故障而 fallback 到只读模式,建议不要强制变回读写模式,而是赶快替换硬盘)
另外,我是这样用rw模式重新挂载FreeBSD 9.x服务器的根目录的:
- # mount -o rw /dev/ad0s1a /
#3 - Am I running out of inodes?
有时候,df命令能显示出磁盘有空余的空间但是系统却声称文件系统已经写满了。此时你需要用以下命令来检查能在文件系统中识别文件及其属性的索引节点:
- $ df -i
- $ df -i /ftpusers/
部分输出内容:
- FilesystemInodesIUsedIFreeIUse%Mounted on
- /dev/sda8 62504961156862389281%/ftpusers
如上 /ftpusers 下有总计62,50,496KB大小的索引节点但是只有11,568KB被使用。你可以在 /ftpusers 位置下另外创建62,38,928KB大小的文件。如果你的索引节点100%被使用了,试试看以下的选项:
- 找出不想要的文件并删除它,或者把它移动到其它服务器上。
- 找出不想要的大文件并删除它,或者把它移动到其它服务器上。
(LCTT 译注:如果一个分区存储了太多的小文件,会出现 inode 用完而存储扇区还有空闲的情况,这种情况下要么清除小文件或在不需要独立访问的情况下将它们打包成一个大文件;要么将数据保存好之后重新分区,并设置分区的 -t news 属性,增加 inode 分配)
#4 - 我的硬盘驱动器宕了吗?
日志文件中的输入/输出错误(例如 /var/log/messages)说明硬盘出了一些问题并且可能已经失效,你可以用smartctl命令来查看硬盘的错误,这是一个在类UNIX系统下控制和监控硬盘状态的一个命令。语法如下:
- smartctl -a /dev/DEVICE
- # 在Linux服务器下检查 /dev/sda
- smartctl -a /dev/sda
你也可以用"Disk Utility"这个软件来获得同样的信息。
图 01: Gnome磁盘工具(Applications > System Tools > Disk Utility)
注意: 不要对S.M.A.R.T.工具期望太高,它在某些状况下无法工作,我们要定期做备份。