ext4 文件系统中超过 2GB 的文件出现“操作不允许”

ext4 文件系统中超过 2GB 的文件出现“操作不允许”

我有点困惑。我有一个 Ubuntu 17.04 系统(从 16.04 LTS 升级而来),使用 ext4 作为其主文件系统。我使用 wget 和 curl 下载了一个 2.3GB 的 iso,但我无法挂载它。事实上,我无法对它执行任何操作:md5sum、wc、cat、mount -o loop 等……否则会收到“操作不允许”的提示。但我可以“rm”它。我是 root,文件的权限是 644。我无法对它执行“lsattr”或“chattr”,否则会收到“操作不允许”的提示。我已经证明它与文件大小完全相关,因为我这样做了:dd if=/dev/zero of=/tmp/test.iso bs=1M count=2047,我可以读取 test.iso,因为它比 2G 少 1M,但如果我将其更改为 2048,我将无法读取该文件。我知道 ext4 的最低限制是 16GB,但我的容量远远低于这个数字。文件似乎创建得很好。

在发帖之前我进行了彻底的搜索,没有任何内容与我的问题相关。不,它不是 FAT。它是 ext4。访问文件后,我在 dmesg 中没有看到任何错误,因为这会显示 apparmour 错误。我怀疑它不是一个不可变的权限,因为我甚至没有权限对其进行 lsattr。我有一个几乎相同的 Ubuntu 17.04 系统,它运行良好(除了它是全新安装的,而不是通过从 16.04 升级而安装的)。

如果我写入 /dev/shm 而不是 /tmp,我可以很好地对 3GB 文件进行 md5sum......因此这与它的挂载 / 方式有关。/dev/shm 显然是一个不同的挂载点而不是 ext4。

# ls -l asm8.iso
-rw-r--r-- 1 root root 2253135872 1 月 15 日 20:27 asm8.iso
#md5sum asm8.iso
md5sum:asm8.iso:操作不允许
# strace -f md5sum asm8.iso
...
open("asm8.iso", O_RDONLY) = -1 EPERM(操作不允许)
...
# lsattr asm8.iso
lsattr:读取 asm8.iso 上的标志时不允许操作
# 安装 |grep " / "
/dev/mapper/asci—vg-root on / 类型 ext4 (rw,relatime,errors=remount-ro,data=ordered)
# tune2fs -l /dev/mapper/asci--vg-root

...
文件系统功能:has_journal ext_attr resize_inode dir_index filetype needs_recovery scope flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
文件系统标志:signed_directory_hash
文件系统状态:干净
文件系统操作系统类型:Linux
...

我比较了工作系统,唯一的区别是它没有 uninit_bg,并且有 2 个附加项:64bit、metadata_csum。我研究了这些标志,它们似乎与问题无关。

有人有什么想法吗?如果您想查看任何命令的输出,我很乐意与您分享。提前致谢。

以下是额外信息:

# df -h
文件系统大小已使用可用使用率%安装于
udev 7.9G 0 7.9G 0%/dev
tmpfs 1.6G 114M 1.5G 8% /运行
/dev/mapper/asci—vg-root 992G 643G 299G 69% /
tmpfs 7.9G 0 7.9G 0%/dev/shm
tmpfs 5.0M 0 5.0M 0% /运行/锁定
tmpfs 7.9G 0 7.9G 0%/sys/fs/cgroup
/dev/sda1 472M 116M 332M 26% /boot
tmpfs 1.6G 0 1.6G 0%/运行/用户/999
tmpfs 1.6G 0 1.6G 0%/运行/用户/1003
tmpfs 1.6G 0 1.6G 0%/运行/用户/0
tmpfs 1.6G 0 1.6G 0%/运行/用户/1008
# df -i
文件系统 Inodes IUsed IFree IUse% 挂载于
udev 2046118 419 2045699 1%/dev
tmpfs 2051789 712 2051077 1% /运行
/dev/mapper/asci--vg-root 66035712 3469883 62565829 6% /
tmpfs 2051789 1 2051788 1%/ dev / shm
tmpfs 2051789 5 2051784 1% /运行/锁定
tmpfs 2051789 16 2051773 1%/sys/fs/cgroup
/dev/sda1 124928 315 124613 1% /启动
tmpfs 2051789 5 2051784 1%/运行/用户/999
tmpfs 2051789 5 2051784 1%/运行/用户/1003
tmpfs 2051789 5 2051784 1%/运行/用户/0
tmpfs 2051789 5 2051784 1%/运行/用户/1008
# 猫 /etc/fstab
#/etc/fstab:静态文件系统信息。
#
# 使用“blkid”打印一个
# 设备;这可以与 UUID= 一起使用,作为命名设备的更可靠方式
# 即使添加和删除磁盘也可以正常工作。请参阅 fstab(5)。
#
#                
/dev/mapper/asci--vg-root / ext4 错误=remount-ro 0 1
# 安装期间 /boot 位于 /dev/sda1 上
UUID=20926db6-5e54-4907-912a-5fe996f45adc /boot ext2 默认值        
0 2
/dev/mapper/asci--vg-swap_1 无 交换 sw 0 0
/dev/fd0 /media/floppy0 自动 rw,用户,noauto,exec,utf8 0 0

这不是一个目录问题,因为文件在同一个目录中创建得很好:我可以创建这 2 个文件。

根@asci /tmp
# dd if=/dev/zero of=/tmp/file2047.iso bs=1M count=2047
2047+0 条记录
2047+0 条记录
已复制 2146435072 字节(2.1 GB,2.0 GiB),6.46013 秒,332 MB/s

根@asci /tmp
# dd if=/dev/zero of=/tmp/file2048.iso bs=1M count=2048
2048+0 条记录
2048+0 条记录
已复制 2147483648 字节(2.1 GB,2.0 GiB),60.2936 秒,35.6 MB/s

根@asci /tmp
# ls -ls /tmp/文件*.iso
2096132 -rw-r--r-- 1 root root 2146435072 1 月 19 日 05:52 /tmp/file2047.iso
2097156 -rw-r--r-- 1 root root 2147483648 1 月 19 日 05:53 /tmp/file2048.iso

尽管 md5sum、cat 和 wc 都显示“操作不允许”,但似乎我可以对它们运行文件和统计:

# 文件 *.iso
file2047.iso:数据
file2048.iso:可写,常规文件,无读取权限

这是统计数据。我没有看到明显差异。

# 统计 *.iso
  文件:file2047.iso
  大小:2146435072 块:4192264 IO 块:4096 常规文件
设备:fd00h/64768d Inode:7380361 链接:1
访问:(0644 / -rw-r--r--)Uid:(0 / root)Gid:(0 / root)
访问时间:2018-01-19 05:52:30.925760162 +0100
修改:2018-01-19 05:52:30.921760136 +0100
更改:2018-01-19 05:52:30.921760136 +0100
 出生日期:-
  文件:file2048.iso
  大小:2147483648 块:4194312 IO 块:4096 常规文件
设备:fd00h/64768d Inode:7380363 链接:1
访问:(0644 / -rw-r--r--)Uid:(0 / root)Gid:(0 / root)
访问时间:2018-01-19 05:52:36.765797317 +0100
修改:2018-01-19 05:53:37.034180299 +0100
更改:2018-01-19 05:53:37.034180299 +0100
 出生日期:-

我不是 apparmor 专家,但我没有经历学习过程,而是直接禁用了它,你可以看到它仍然是一个问题。我怀疑这不是问题,因为我认为“dmesg”应该报告 apparmor 阻止消息,而在我的测试期间没有新的 dmesg 输出。

# 停止服务

根@asci /tmp
# 服务 apparmor 拆卸
 * 卸载 AppArmor 配置文件
   ...完毕。

根@asci /tmp
# 更新-rc.d -f apparmor 删除

根@asci /tmp
# wc -c 文件 2048.iso
wc:file2048.iso:操作不允许

天哪。最后修复它的方法是“apt remove apparmor; reboot”。现在它起作用了。所以它一定是 apparmor 配置文件。我不使用它,所以默认 apparmor 设置中的某些内容阻止查看超过 2G 的文件。有人知道那是什么设置吗?我现在必须重新安装才能知道。

答案1

我的问题已经解决了。无法访问超过 2GB 的文件的原因是我的防病毒软件(McAfee for Linux - Endpoint Security for Linux Threat Prevention)。不是因为 apparmor、奇怪的文件系统选项、权限、磁盘空间或较旧的文件系统。

这是我得出结论的过程。故障排除步骤可能很有趣。重新启动后,我可以快速创建一个 2G 文件并像这样探测它:

根@asci /tmp
# dd if=/dev/zero of=/tmp/file2049.iso bs=1M count=2049
2049+0 条记录
2049+0 条记录
已复制 2148532224 字节(2.1 GB,2.0 GiB),2.05888 秒,1.0 GB/s

根@asci /tmp
#md5sum file2049.iso
4555da35a7064cc499ba1e3f6fa1993a 文件2049.iso

一分钟之内,md5sum 不再起作用。

为了排除 crontab,我禁用了 crontab,还编写了一个一行脚本,在读取成功时输出 0,在读取失败时输出 1。请注意,它在第 40 秒中断(表明很可能不是 cron 作业):

# while [ 1 == 1 ]; do echo -n "`date` - ";dd if=asm8.iso bs=1M count=30 2>&1|grep -c "操作不允许"; sleep 1;date >> /var/log/ps.log; ps -efww >> /var/log/ps.log; done
2018 年 1 月 19 日星期五 18:57:28 CET - 0
2018 年 1 月 19 日星期五 18:57:30 CET - 0
2018 年 1 月 19 日星期五 18:57:31 CET - 0
2018 年 1 月 19 日星期五 18:57:32 CET - 0
2018 年 1 月 19 日星期五 18:57:33 CET - 0
2018 年 1 月 19 日星期五 18:57:34 CET - 0
2018 年 1 月 19 日星期五 18:57:35 CET - 0
2018 年 1 月 19 日星期五 18:57:36 CET - 0
2018 年 1 月 19 日星期五 18:57:37 CET - 0
2018 年 1 月 19 日星期五 18:57:38 CET - 0
2018 年 1 月 19 日星期五 18:57:39 CET - 0
2018 年 1 月 19 日星期五 18:57:40 CET - 1
2018 年 1 月 19 日星期五 18:57:41 CET - 1
2018 年 1 月 19 日星期五 18:57:42 CET - 1
2018 年 1 月 19 日星期五 18:57:43 CET - 1
2018 年 1 月 19 日星期五 18:57:44 CET - 1

我只 dd 了文件的开头,因为这就是我测试它所需要的全部内容,因为读取整个文件需要 48 秒。我将 ps 输出记录到 /var/log/ps.log。为了通过比较第 39 秒和第 40 秒之间的变化来对 ps 输出进​​行差异分析,我执行了以下操作:

# cat ps.log |grep "2018 年 1 月 19 日星期五 18:57:39 CET" -A10000 |grep "2018 年 1 月 19 日星期五 18:57:40 CET" -B10000 > /tmp/ps39
# cat ps.log |grep "2018 年 1 月 19 日星期五 18:57:40 CET" -A10000 |grep "2018 年 1 月 19 日星期五 18:57:41 CET" -B10000 > /tmp/ps40
# CD /tmp

比较第 39 秒和第 40 秒的 ps 输出:

# 差异 ps39 ps40
 2018 年 1 月 19 日 星期五 18:57:40 CET
266c266
 root 2412 1276 97 18:57 ? 00:00:19 /opt/isec/ens/threatprevention/bin/isectpd
275,276c275,278
 root 2632 2412 1 18:57 ? 00:00:00 /opt/isec/ens/threatprevention/bin/isectpd
> 根 2635 2412 11 18:57 ? 00:00:00 /opt/isec/ens/threatprevention/bin/isectpd
> root 2663 2518 0 18:57 pts/1 00:00:00 ps -efww

就是这样!一旦 isectpd 进程在第 40 秒启动,它就会禁用对我的 2GB 文件的访问。

有一次我这样做了:

# 系统控制停止 isectpd

它开始起作用了。显然,在我找到如何允许 McAfee 处理大于 2GB 的文件之前,这只是权宜之计。如果有人有这方面的经验,请随时提出意见。

干杯。

相关内容