当磁盘无法写入的时候,一般有以下可能:
- 文件系统只读
- 磁盘已满
- I节点使用完
只读的文件系统
文件系统自动设置成只读可能是系统自我保护的一种机制,因此需要实现弄清究竟什么原因造成了文件系统的只读。如果想要改变文件系统的只读属性,重新挂载目标分区即可。
例1. 重新挂载改变/home分区的读写属性
#mount -o remount, rw /home
-o 选项后面接了两个mount命令的专有选项,remount 是指重新挂载指定文件系统,rw指定重新挂载时的读写属性,该命令不改变挂载点,只是改变制定分区的读写属性。
磁盘满
磁盘使用率、剩余空间等可以使用df命令查看
例2. 查看当前已挂载的所有分区及使用情况
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 133G 8.6G 118G 7% /
none 4.0K 0 4.0K 0% /sys/fs/cgroup
udev 5.9G 4.0K 5.9G 1% /dev
tmpfs 1.2G 868K 1.2G 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 5.9G 0 5.9G 0% /run/shm
none 100M 0 100M 0% /run/user
/dev/sda1 93M 3.4M 90M 4% /boot/efi
-h 自动以适合阅读的单位显示,该例子的磁盘空间显然还很充分。
有时候会发现,df结果中的使用空间”Used”和容量”Size”存在一定的差距,但是可用空间”Avail”却所剩无几,同时使用率”Use %”居高不下,甚至达到100%。这种情况并不奇怪,因为Linux为了避免系统存储空间完全占用导致的root用户无法登陆,为root用户保留了一块保留区块,供磁盘使用率过高时root用户登录系统完成必要的清理操作。仅有root用户可以在这些保留块中写入数据,可以通过tune2fs工具查看保留块的大小。
例3. 使用tune2fs查看系统保留块
# tune2fs -l /dev/xvda1 | grep -i "block"
Block count: 16776704
Reserved block count: 838832
Free blocks: 15870165
First block: 0
Block size: 4096
Reserved GDT blocks: 1020
Blocks per group: 32768
Inode blocks per group: 512
Flex block group size: 16
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
Journal backup: inode blocks
其中,第3行显示系统保留块的数量,第6行显示每块的大小(4KB),二者相乘可以计算保留块的总大小
第11、12行显示能对保留区块执行写入操作的用户和用户组编号,这里都是root;
上面只是查看某个文件系统上所有目录的大小。
例4. 使用du查看目录占用的空间
# cd /
# du -ckx | sort -n > /tmp/dir_space
使用tail查看保存的/tmp/dir_space文件可以看到根文件系统下最大的10个目录:
674236 ./var/log
904232 ./usr/lib
1372776 ./var/lib/glance/images
1372868 ./var/lib/glance
1523512 ./var/lib/mongodb
2082052 ./usr
4003024 ./var/lib
4878944 ./var
8798036 .
8798036 total
这里可以看到/var/log目录是很大的,由于/var/log目录存放的是一些日志文件,日志文件通常也是占用系统空间的源泉,可以通过释放日志文件空间来获得存储空间:
# ls -lhs /var/log/syslog.1
1.3M -rw-r----- 1 syslog adm 1.3M Aug 12 06:34 syslog.1
# bash -c "> /var/log/syslog.1"
# ls -lhs /var/log/syslog.1
0 -rw-r----- 1 syslog adm 0 Aug 12 15:16 syslog.1
该例子将分卷后的syslog文件截断,实际上就是删除指定日志文件的内容。当然也可以直接删除对应的日志文件。
I节点不足
当df显示磁盘空间充足,但是文件系统却报错自己已满,无法写入时,需要检查是否耗尽了I节点。
在系统中创建一个新文件将会获得一个唯一的I节点,就无法再创建新的文件了,这在系统创建大量文件时才有可能发生。使用df -i命令可以查看I节点的使用情况。
例5. 查看I节点的使用情况
# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
udev 503145 424 502721 1% /dev
tmpfs 505857 335 505522 1% /run
/dev/xvda1 4194304 130790 4063514 4% /
none 505857 2 505855 1% /sys/fs/cgroup
none 505857 3 505854 1% /run/lock
none 505857 1 505856 1% /run/shm
none 505857 2 505855 1% /run/user
可以看到当前各个文件系统的I节点充足。
一旦遇到I节点用光的情形,有以下几种选择:
- 删除大量文件
- 将大量文件移动到其他的文件系统中
- 将大量的文件压缩成一个文件
- 备份当前文件系统中的所有文件,重新格式化之前的磁盘,获取更多的I节点,再将文件复制回去。