15 拷贝文件到 qemu 虚拟机挂载的磁盘上面 结果显示文件已经被删除

前言

/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 上面 

问题的解决

关机 

从新拷贝一下 这部分文件  到虚拟磁盘 

然后 开机, 就可以了 

猜你喜欢

转载自blog.csdn.net/u011039332/article/details/129737668