免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 16953 | 回复: 9
打印 上一主题 下一主题

[系统管理] 难题!!文件系统kernel: EXT4-fs error [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-02-26 18:06 |只看该作者 |倒序浏览
操作系统突然报错,看上去像是文件系统的BUG,上网搜了搜,没有找到解决方法,大家帮忙看看怎么处理啊,谢谢

【报错】
Feb 24 17:22:52 localhost kernel: scanning ...
Feb 24 18:12:45 localhost kernel: scanning ...
Feb 25 03:38:02 localhost kernel: EXT4-fs error (device sda6): htree_dirblock_to_tree: bad entry in directory #48122: directory entry across blocks
- block=32412offset=12(12), inode=84, rec_len=28540, name_len=0
Feb 25 03:38:02 localhost kernel: EXT4-fs error (device sda6): ext4_lookup: deleted inode referenced: 185482
Feb 25 14:44:26 localhost kernel: stty[22154]: segfault at 60f008 ip 0000003870c02bbf sp 00007fff38188c50 error 4 in ld-2.12.so[3870c00000+20000]
Feb 25 14:44:26 localhost abrt[22155]: Saved core dump of pid 22154 (/bin/stty) to /var/spool/abrt/ccpp-2014-02-25-14:44:26-22154 (122880 bytes)
Feb 25 14:44:26 localhost abrtd: Directory 'ccpp-2014-02-25-14:44:26-22154' creation detected
Feb 25 14:44:29 localhost kernel: Bridge firewalling registered
Feb 25 14:44:35 localhost abrtd: Sending an email...

【服务器sda6分区信息】
[root@localhost ~]# fdisk -l|grep sda6
/dev/sda6            1939        2321     3072000   83  Linux

[root@localhost ~]# mount |grep sda6
/dev/sda6 on / type ext4 (rw)

[root@localhost ~]# df -hT|grep sda6
/dev/sda6     ext4    2.9G  2.6G  207M  93% /

[root@localhost ~]# ls -l /dev/disk/by-uuid/|grep sda6
lrwxrwxrwx 1 root root 10 Jan 26 08:56 dd78fcbe-2be4-4c5c-96fd-4c78af4a2f01 -> ../../sda6

[root@localhost ~]# grep dd78fcbe-2be4-4c5c-96fd-4c78af4a2f01 /etc/fstab
UUID=dd78fcbe-2be4-4c5c-96fd-4c78af4a2f01 /                       ext4    defaults        1 1

分区信息:
[root@localhost ~]#df -hT
Filesystem    Type    Size  Used Avail Use% Mounted on
/dev/sda6     ext4    2.9G  2.6G  206M  93% /
tmpfs        tmpfs     32G  888K   32G   1% /dev/shm
/dev/sda1     ext4    194M   32M  153M  18% /boot
/dev/sda7      xfs    1.7T  140G  1.5T   9% /home

操作系统版本:
[root@localhost  ~]# cat /etc/issue
CentOS release 6.4 (Final)
Kernel \r on an \m

内核版本:
[root@localhost  ~]# uname -a
Linux localhost  2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
2 [报告]
发表于 2014-02-27 10:02 |只看该作者
回复 1# 513964839


    虽然不确定具体信息的含义,但是 “name_len=0” 貌似很不对啊,最短的是"."吧

论坛徽章:
71
15-16赛季CBA联赛之同曦
日期:2018-08-23 15:41:42辰龙
日期:2014-08-15 09:07:43狮子座
日期:2014-06-03 13:55:33亥猪
日期:2014-06-02 11:17:08巨蟹座
日期:2014-05-06 10:02:03午马
日期:2014-05-04 08:18:27亥猪
日期:2014-04-29 11:11:32技术图书徽章
日期:2014-04-24 15:51:26技术图书徽章
日期:2014-04-17 11:01:53辰龙
日期:2014-04-15 12:45:46亥猪
日期:2014-04-11 09:06:23射手座
日期:2014-04-01 15:28:10
3 [报告]
发表于 2014-02-27 11:06 |只看该作者
fsck看看   

论坛徽章:
0
4 [报告]
发表于 2014-02-27 11:12 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
5 [报告]
发表于 2014-02-27 11:57 |只看该作者
kernel 相关代码:
  1. int __ext4_check_dir_entry(const char *function, unsigned int line,
  2.                            struct inode *dir, struct file *filp,
  3.                            struct ext4_dir_entry_2 *de,
  4.                            struct buffer_head *bh, char *buf, int size,
  5.                            unsigned int offset)
  6. {
  7.         const char *error_msg = NULL;
  8.         const int rlen = ext4_rec_len_from_disk(de->rec_len,
  9.                                                 dir->i_sb->s_blocksize);

  10.         if (unlikely(rlen < EXT4_DIR_REC_LEN(1)))
  11.                 error_msg = "rec_len is smaller than minimal";
  12.         else if (unlikely(rlen % 4 != 0))
  13.                 error_msg = "rec_len % 4 != 0";
  14.         else if (unlikely(rlen < EXT4_DIR_REC_LEN(de->name_len)))
  15.                 error_msg = "rec_len is too small for name_len";
  16.         else if (unlikely(((char *) de - buf) + rlen > size))
  17.                 error_msg = "directory entry across range";
  18.         else if (unlikely(le32_to_cpu(de->inode) >
  19.                         le32_to_cpu(EXT4_SB(dir->i_sb)->s_es->s_inodes_count)))
  20.                 error_msg = "inode out of bounds";
  21.         else
  22.                 return 0;

  23.         if (filp)
  24.                 ext4_error_file(filp, function, line, bh->b_blocknr,
  25.                                 "bad entry in directory: %s - offset=%u(%u), "
  26.                                 "inode=%u, rec_len=%d, name_len=%d",
  27.                                 error_msg, (unsigned) (offset % size),
  28.                                 offset, le32_to_cpu(de->inode),
  29.                                 rlen, de->name_len);
  30.         else
  31.                 ext4_error_inode(dir, function, line, bh->b_blocknr,
  32.                                 "bad entry in directory: %s - offset=%u(%u), "
  33.                                 "inode=%u, rec_len=%d, name_len=%d",
  34.                                 error_msg, (unsigned) (offset % size),
  35.                                 offset, le32_to_cpu(de->inode),
  36.                                 rlen, de->name_len);

  37.         return 1;
  38. }
复制代码

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
6 [报告]
发表于 2014-02-27 12:09 |只看该作者
回复 5# openspace


不知道 0 长度的目录项是怎么产生的
这块盘之前跑了很长时间了?还是刚从其他系统上移到当前系统上?

论坛徽章:
71
15-16赛季CBA联赛之同曦
日期:2018-08-23 15:41:42辰龙
日期:2014-08-15 09:07:43狮子座
日期:2014-06-03 13:55:33亥猪
日期:2014-06-02 11:17:08巨蟹座
日期:2014-05-06 10:02:03午马
日期:2014-05-04 08:18:27亥猪
日期:2014-04-29 11:11:32技术图书徽章
日期:2014-04-24 15:51:26技术图书徽章
日期:2014-04-17 11:01:53辰龙
日期:2014-04-15 12:45:46亥猪
日期:2014-04-11 09:06:23射手座
日期:2014-04-01 15:28:10
7 [报告]
发表于 2014-02-27 13:09 |只看该作者
回复 5# openspace


    代码看不懂啊

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
8 [报告]
发表于 2014-02-27 13:32 |只看该作者
刚才给的代码是 upstream 的
找了个 2.6.34 的
  1. 64 int ext4_check_dir_entry(const char *function, struct inode *dir,
  2. 65                          struct ext4_dir_entry_2 *de,
  3. 66                          struct buffer_head *bh,
  4. 67                          unsigned int offset)
  5. 68 {
  6. 69         const char *error_msg = NULL;
  7. 70         const int rlen = ext4_rec_len_from_disk(de->rec_len,
  8. 71                                                 dir->i_sb->s_blocksize);
  9. 72
  10. 73         if (rlen < EXT4_DIR_REC_LEN(1))
  11. 74                 error_msg = "rec_len is smaller than minimal";
  12. 75         else if (rlen % 4 != 0)
  13. 76                 error_msg = "rec_len % 4 != 0";
  14. 77         else if (rlen < EXT4_DIR_REC_LEN(de->name_len))
  15. 78                 error_msg = "rec_len is too small for name_len";
  16. 79         else if (((char *) de - bh->b_data) + rlen > dir->i_sb->s_blocksize)
  17. 80                 error_msg = "directory entry across blocks";
  18. 81         else if (le32_to_cpu(de->inode) >
  19. 82                         le32_to_cpu(EXT4_SB(dir->i_sb)->s_es->s_inodes_count))
  20. 83                 error_msg = "inode out of bounds";
  21. 84
  22. 85         if (error_msg != NULL)
  23. 86                 __ext4_error(dir->i_sb, function,
  24. 87                         "bad entry in directory #%lu: %s - block=%llu"
  25. 88                         "offset=%u(%u), inode=%u, rec_len=%d, name_len=%d",
  26. 89                         dir->i_ino, error_msg,
  27. 90                         (unsigned long long) bh->b_blocknr,     
  28. 91                         (unsigned) (offset%bh->b_size), offset,
  29. 92                         le32_to_cpu(de->inode),
  30. 93                         rlen, de->name_len);
  31. 94         return error_msg == NULL ? 1 : 0;
  32. 95 }
复制代码
Feb 25 03:38:02 localhost kernel: EXT4-fs error (device sda6): htree_dirblock_to_tree: bad entry in directory #48122: directory entry across blocks
- block=32412offset=12(12), inode=84, rec_len=28540, name_len=0
对应到
86                 __ext4_error(dir->i_sb, function,
87                         "bad entry in directory #%lu: %s - block=%llu"
88                         "offset=%u(%u), inode=%u, rec_len=%d, name_len=%d",
89                         dir->i_ino, error_msg,
90                         (unsigned long long) bh->b_blocknr,     
91                         (unsigned) (offset%bh->b_size), offset,
92                         le32_to_cpu(de->inode),
93                         rlen, de->name_len);

可以看出
dir->i_ino  = 48122
(unsigned long long) bh->b_blocknr =  32412
(unsigned) (offset%bh->b_size) = 12
offset = 12
le32_to_cpu(de->inode) = 84
rlen = 28540
de->name_len = 0

这里面有 2 个比较奇怪的地方:
   * name_len 为 0,想不出什么样的目录表项名字长度为 0
   * rlen = 28540,一般 ext4 最大目录项长度为 ~64K (#define EXT4_MAX_REC_LEN   ((1<<16)-1)),虽然没有超过最大值,但是感觉这个目录表项太长了

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
9 [报告]
发表于 2014-02-27 13:34 |只看该作者
回复 1# 513964839


    fsck 后还会出现吗?

论坛徽章:
0
10 [报告]
发表于 2014-03-01 12:48 |只看该作者
回复 9# openspace
下周重启系统试试

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP