最近我们发现多个用户设备掉电后重启,系统不工作。

研究这些返修设备,发现这些设备的表象是网络连接失败,DNS resolve不了。进一步发现/etc/resolv.conf为空,所以应用程序没法进行DNS resolve。但是在同一个路由器下面,其他设备是可以正常获取DNS 服务器信息的,后来检查dhcpc的log,发现他获取了DNS信息,但是写/etc/resolv.conf失败,这样应用程序读取dns server时就会失败。

为啥写文件失败呢?后来我们用df检查根文件系统,发现文件系统已经被占满了。下面显示整个16M的根目录空间都被占了

/ # df
Filesystem 1K-blocks Used Available Use% Mounted on
overlay 0 100% /
none % /dev
run % /run
shm % /dev/shm
ubi2:exa_data_ % /config
ubi2:exa_data_ % /log
ubi2:exa_data_ % /tokens
tmpfs % /dev/snd
tmpfs % /dev/input/event0
tmpfs % /dev/hbi
tmpfs % /tmp/ubus.sock
tmpfs % /run/dbus/system_bus_socket
cgroup_root % /sys/fs/cgroup
/ # lsof |grep deleted
/sbin/rc /run/openrc/exclusive/bootmisc (deleted)
/sbin/rc /run/openrc/exclusive/networking (deleted)
/sbin/rc /run/openrc/exclusive/syslog (deleted)
/sbin/rc /run/openrc/exclusive/avs-server (deleted)
/ # exit

但是我们到文件系统mount到的目录用du查看时,却发现实际的文件并没有占那么多。下面显示upperdir只占用了7M

[router] /overlay # du -d 1
2 ./workdir
7043 ./upperdir
12 ./lost+found
7058 .

那么多余的空间都跑哪去了呢?接着我们来检查一下文件系统对应的img。发现这个img居然被破坏了,这样就导致我们用df看到的信息不正确。

~$ fsck.ext4 rootfs_overlay.img
e2fsck 1.44.1 (24-Mar-2018)
rootfs_overlay.img contains a file system with errors, check forced.
Pass 1: Checking inodes, blocks, and sizes
Inode 2378, i_blocks is 2, should be 0. Fix<y>? no
Deleted inode 2381 has zero dtime. Fix<y>? no
Deleted inode 2386 has zero dtime. Fix<y>? no
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Block bitmap differences: +2612 -(8525--8526) -(8708--8720) -8725 -8731 -(8769--8772) -9235 -(9239--9248) -10319 -(10380--10396) -(10781--10785) -10923 -(12353--12356) -(12649--12656) -(13513--13764)
Fix<y>? no
Free blocks count wrong for group #1 (7063, counted=7062).
Fix<y>? no
Free blocks count wrong (8361, counted=8356).
Fix<y>? no
Inode bitmap differences: -2381 -2386
Fix<y>? no rootfs_overlay.img: ********** WARNING: Filesystem still has errors **********
rootfs_overlay.img: 351/4096 files (2.3% non-contiguous), 8023/16384 blocks

 

之后我们用fsck将这个image修复。然后重新mount文件系统,系统这时就工作正常了。

~$ fsck.ext4 rootfs_overlay.img
e2fsck 1.44.1 (24-Mar-2018)
rootfs_overlay.img contains a file system with errors, check forced.
Pass 1: Checking inodes, blocks, and sizes
Inode 2378, i_blocks is 2, should be 0. Fix<y>? yes
Deleted inode 2381 has zero dtime. Fix<y>? yes
Deleted inode 2386 has zero dtime. Fix<y>? yes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Block bitmap differences: +2612 -(8525--8526) -(8708--8720) -8725 -8731 -(8769--8772) -9235 -(9239--9248) -10319 -(10380--10396) -(10781--10785) -10923 -(12353--12356) -(12649--12656) -(13513--13764)
Fix<y>? yes
Free blocks count wrong for group #0 (1294, counted=1293).
Fix<y>? yes
Free blocks count wrong for group #1 (7063, counted=7382).
Fix<y>? yes
Free blocks count wrong (8361, counted=8675).
Fix<y>? yes
Inode bitmap differences: -2381 -2386
Fix<y>? yes
Free inodes count wrong for group #1 (1711, counted=1713).
Fix<y>? yes
Free inodes count wrong (3745, counted=3747).
Fix ('a' enables 'yes' to all) <y>? yes to all rootfs_overlay.img: ***** FILE SYSTEM WAS MODIFIED *****
rootfs_overlay.img: 349/4096 files (2.3% non-contiguous), 7709/16384 blocks
~$ fsck.ext4 rootfs_overlay.img
e2fsck 1.44.1 (24-Mar-2018)
rootfs_overlay.img: clean, 349/4096 files, 7709/16384 blocks
~$

  

文件系统被破坏,这个对于嵌入式系统来说,是一个很大的风险,设备极有可能变砖,导致返修。好在ext4是一个日志类型的文件系统,我们可以根据日志对文件系统进行恢复。所以设备启动,mount文件系统之前,一定要用fsck进行检查,一旦发现错误,必须立刻修复。

ext4文件系统启动自检的必要性的更多相关文章

  1. linux文件系统启动流程、启动脚本

    linux文件系统启动流程.启动脚本 下面是一张Linux启动流程图: 在了解启动流程之前,我们应该先知道系统的几个重要脚本和配置文件,他们对应的路径为: 1. /sbin/init 2. /etc/ ...

  2. 从ramdisk根文件系统启动Linux成功,及使用initramfs启动linux

    下面两篇文章是ARM9论坛上的讲解ramdisk文件系统的很不错的文章 今天做了个试验,让Linux2.6.29.4从ramdisk根文件系统启动成功,总结一下. 其中涉及的内容较多,很多东西不再详述 ...

  3. 从ramdisk根文件系统启动Linux 二

    今天做了个试验,让Linux2.6.29.4从ramdisk根文件系统启动成功,总结一下.其中涉及的内容较多,很多东西不再详述,如需深入研究请查阅相关资料(百度或谷歌一下一大堆). 开发环境:Fedo ...

  4. 使用nfs作为根文件系统启动,(3)

    通过设置u-boot的bootargs来更改开机自动进入nfs远端服务器,不需要mount指令,实现虚拟机编译程序后直接通过u-boot烧写程序 1  使用nfs作为根文件系统启动 1.1    pr ...

  5. Linux文件系统启动过程及login的实现

    1. busybox简介 busybox是一个集成了一百多个最常用linux命令和工具的软件,它将许多常用的LINUX命令和工具结合到了一个单独的可执行程序中.虽然与相应的GNU工具比较起来,busy ...

  6. Linux内核3.0移植并基于Initramfs根文件系统启动

    Linux内核移植与启动 Target borad:FL2440 Bootloader:U-boot-2010.09 交叉编译器:buildroot-2012.08 1.linux内核基础知识 首先, ...

  7. [svc]为何linux ext4文件系统目录默认大小是4k?

    linux ext4普通盘为什么目录大小是4k? Why does every directory have a size 4096 bytes (4 K)? To understand this, ...

  8. 【转】嵌入式Linux文件系统启动脚本及分析

    原文网址:http://www.linuxidc.com/Linux/2011-03/33728.htm 在内核初始化完成后,嵌入式linux 文件系统的启动过程主要包含以下几个步骤: 1. 执行/s ...

  9. 轻松六步教会你如何修改system.img.ext4文件

    http://bbs.xiaomi.cn/thread-2943923-1-1.html 希望更多的ROM作者,看了此教程后,学会ROM制作,给大家带来更多更好的ROM 首先下载如下包 Linux U ...

随机推荐

  1. flask使用blinker信号机制解耦业务代码解决ImportError: cannot import name 'app',以异步发送邮件为例

    百度了大半天,不知道怎么搞,直到学习了blinker才想到解决办法,因为之前写java都是文件分开的, 所以发送邮件业务代码也放到view里面,但是异步线程需要使用app,蛋疼的是其他模块不能从app ...

  2. 使用H5与webGL的3D 可视化地铁展示

    前言 工业互联网,物联网,可视化等名词在我们现在信息化的大背景下已经是耳熟能详,日常生活的交通,出行,吃穿等可能都可以用信息化的方式来为我们表达,在传统的可视化监控领域,一般都是基于 Web SCAD ...

  3. javase第一章(了解java)

    ------------恢复内容开始------------ java介绍 java这门语言,如果你是一名IT从业者,那么就一定是会有所耳闻的,毕竟,这是编程史上其商业化最成功的一门语言,当然, 编程 ...

  4. HDU_4570_区间dp

    http://acm.hdu.edu.cn/showproblem.php?pid=4570 连题目都看不懂,直接找了题解,copy了过来= =. 一个长度为n的数列,将其分成若干段(每一段的长度要& ...

  5. HDU_1175_dfs

    http://acm.hdu.edu.cn/showproblem.php?pid=1175 dfs(x,y,i,num),xy表示位置,i表示方向,num表示转向次数,num=2时候的剪枝很重要. ...

  6. UVA5913 Dictionary Sizes(字典树)(转载)

    题目大意:给出n个旧单词,要从这n个旧单词中构造新单词.构造条件是 S = Sa + Sb,其中Sa为某个旧单词的非空前缀,Sb为某个单词的非空后缀.求所有的新单词和旧单词中有多少个不同的单词. 思路 ...

  7. bootstrap 按钮组件

    按钮组件主要的类名: .btn-toolbar     把几个  .btn-group 组合在一起,更复杂的组件 .btn-group .btn-group-vertical   垂直堆叠显示    ...

  8. Python 元类 - Metaclasses

    Python 元类 - Metaclasses 默认情况下儿, classes 是有 type() 构造的. 类的结构体在一个新的 namespace 被执行, 类的名字 class name 绑定( ...

  9. VFP检测SQL Server的五个实例代码

    ** 需要指出的是,无论下面哪种方式的代码,都需要打开本机的网络共享,否则找不到SQL服务器** 例一 ************************************************ ...

  10. VFP调用API来控制USB摄像头,实现拍照或录像

    *--前提:VFP7.0以上;Windows 2K及以上*--控件:AVICAP32.DLL *--定义:一般放到主程序或表单(集)的Load事件中Public WM_CAP_DRIVER_DISCO ...