前言
/dev/loop1 是一块虚拟磁盘, 挂在到目标 qemu 虚拟机上面
然后 我的操作是 新增了一部分 源码, 可执行文件, 然后 启动虚拟机, 结果 挂载虚拟磁盘之后 这部分可执行文件 获取不到, 当然 这里并没有彻底搞明白问题为什么会产生
只是有一定的解决方式
文件系统信息如下
root@ubuntu:~/linux/linux-4.10.14# df -h
Filesystem Size Used Avail Use% Mounted on
udev 1.8G 0 1.8G 0% /dev
tmpfs 395M 21M 374M 6% /run
/dev/sda1 58G 20G 36G 37% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/loop1 331M 18M 293M 6% /root/linux/linux-4.10.14/images/share
tmpfs 395M 0 395M 0% /run/user/0
新增的这部分 源码, 可执行文件如下
root@ubuntu:~/linux/linux-4.10.14# ll images/share/ | grep Test16
-rwxr-xr-x 1 root root 11776 Feb 20 16:56 Test16Arp*
-rw-r--r-- 1 root root 2410 Feb 20 16:56 Test16Arp.c
-rwxr-xr-x 1 root root 9704 Mar 3 16:00 Test16SigSegvAccessConstants*
-rw-r--r-- 1 root root 105 Mar 3 16:00 Test16SigSegvAccessConstants.c
-rwxr-xr-x 1 root root 9952 Mar 3 16:00 Test16SigSegvAccessInvalidStackAddr01*
-rw-r--r-- 1 root root 142 Mar 3 16:00 Test16SigSegvAccessInvalidStackAddr01.c
-rwxr-xr-x 1 root root 10120 Mar 3 16:00 Test16SigSegvAccessInvalidStackAddr02*
-rw-r--r-- 1 root root 189 Mar 3 16:00 Test16SigSegvAccessInvalidStackAddr02.c
-rwxr-xr-x 1 root root 9840 Mar 3 16:00 Test16SigSegvAccessInvalidStackAddr03*
-rw-r--r-- 1 root root 133 Mar 3 16:00 Test16SigSegvAccessInvalidStackAddr03.c
-rwxr-xr-x 1 root root 9848 Mar 3 16:00 Test16SigSegvAccessInvalidStackAddr04*
-rw-r--r-- 1 root root 402 Mar 3 16:00 Test16SigSegvAccessInvalidStackAddr04.c
-rwxr-xr-x 1 root root 9704 Mar 3 16:00 Test16SigSegvAccessKernelAddr*
-rw-r--r-- 1 root root 110 Mar 3 16:00 Test16SigSegvAccessKernelAddr.c
-rwxr-xr-x 1 root root 9680 Mar 3 16:00 Test16SigSegvAccessNpe*
-rw-r--r-- 1 root root 92 Mar 3 16:00 Test16SigSegvAccessNpe.c
进入虚拟机之后, 挂载上磁盘, 然后 ls 新增的这部分文件, 发现一部分源码文件报错, 一部分 可执行文件报错
(initramfs) ls | grep Test16SigSegvAccessConstants
[ 407.137886] EXT4-fs error (device sda): ext4_lookup:1611: inode #2: comm sh: deleted inode referenced: 47
ls: ./Test16SigSegvAccessInvalidStackAddr01.c: Structure needs cleaning
[ 407.148854] EXT4-fs error (device sda): ext4_lookup:1611: inode #2: comm sh: deleted inode referenced: 45
ls: ./Test16SigSegvAccessConstants.c: Structure needs cleaning
[ 407.161050] EXT4-fs error (device sda): ext4_lookup:1611: inode #2: comm sh: deleted inode referenced: 48
ls: ./Test16SigSegvAccessInvalidStackAddr02: Structure needs cleaning
[ 407.166270] EXT4-fs error (device sda): ext4_lookup:1611: inode #2: comm sh: deleted inode referenced: 44
ls: ./Test16SigSegvAccessConstants: Structure needs cleaning
[ 407.171517] EXT4-fs error (device sda): ext4_lookup:1611: inode #2: comm sh: deleted inode referenced: 46
ls: ./Test16SigSegvAccessInvalidStackAddr01: Structure needs cleaning
扫描二维码关注公众号,回复:
14633735 查看本文章
问题的调试
这里根据 ino 获取 inode 拿到了 ESTALE 错误码, 然后 进而是后面的日志输出报错
查找 inode 的具体的地方
在 inode_hashtable 中查询 ino 对应的节点, 结果没有查询到
上游 ext4_lookup 中拿到的是一个 dummy 节点, 然后 上一个函数 ext4_iget 中根据 inode 的属性判断该节点被删除, 反馈 ESTALE 信息给上游节点
可能的情况就是在文件夹中写入了 报错的相关文件的记录信息
但是 具体的文件没有写入, 或者 没有挂在到 /jerry 上面
问题的解决
关机
从新拷贝一下 这部分文件 到虚拟磁盘
然后 开机, 就可以了
完