Linux

ext4 文件系統上超過 2GB 的文件“不允許操作”

  • January 20, 2018

我有點神秘。我有一個使用 ext4 作為主文件系統的 Ubuntu 17.04 系統(從 16.04 LTS 升級)。我使用 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,因為它小於 1M 2G,但如果我將其更改為 2048,我將無法讀取該文件。我知道 ext4 的最低限制為 16GB,但我遠低於此。

我在發布之前進行了徹底的搜尋,沒有什麼與我的問題有關。不,這不是脂肪。是ext4。訪問文件後,我在 dmesg 中沒有看到任何錯誤,因為這會顯示 apparmour 錯誤。我懷疑這是一個不可變的燙髮,因為我什至沒有權限對其進行 lsattr。我有一個幾乎相同的 Ubuntu 17.04 系統,它執行良好(除了它是全新安裝的,而不是通過從 16.04 升級的)。

如果我寫到 /dev/shm 而不是 /tmp,我可以 md5sum 一個 3GB 的文件就好了……所以有些東西與它掛載 / 的方式有關。/dev/shm 顯然是不同的掛載點,而不是 ext4。

# ls -l asm8.iso
-rw-r--r-- 1 根 2253135872 Jan 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 上讀取標誌時不允許操作
# mount |grep " / "
/dev/mapper/asci--vg-root on / type 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 extent 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% / 開發
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% Mounted on
開發者 2046118 419 2045699 1% /開發者
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,user,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/秒

根@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/秒

根@asci /tmp
# ls -ls /tmp/file*.iso
2096132 -rw-r--r-- 1 根 2146435072 Jan 19 05:52 /tmp/file2047.iso
2097156 -rw-r--r-- 1 根 2147483648 Jan 19 05:53 /tmp/file2048.iso

儘管 md5sum、cat 和 wc 都說“不允許操作”,但似乎我可以在它們上執行 file 和 stat:

# 文件 *.iso
file2047.iso:數據
file2048.iso:可寫,普通文件,無讀取權限

這裡是統計。我沒有看到顯著的差異。

# 統計 * .iso
文件:file2047.iso
大小:2146435072 塊:4192264 IO 塊:4096 正常文件
設備:fd00h/64768d 索引節點: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 索引節點: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 輸出。

#服務apparmor停止

根@asci /tmp
# service apparmor 拆解
* 解除安裝 AppArmor 配置文件
...完畢。

根@asci /tmp
# update-rc.d -f apparmor 刪除

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

我的天啊。最終修復它的是“apt remove apparmor; reboot”。現在它起作用了。所以它一定是一個apparmor配置文件。我不使用它,因此預設 apparmor 設置中的某些內容會阻止查看超過 2G 的文件。有誰知道這可能是什麼設置?我現在必須重新安裝才能知道。

我已經解決了我的問題。無法訪問大小超過 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/秒

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

一分鐘內,md5sum 不再起作用。

為了排除 crontabs,我禁用了 crontab,還編寫了一個 1-liner 腳本以在成功讀取時輸出 0,如果不成功則輸出 1。請注意,它在第 40 秒中斷(表明很可能不是 cron 作業):

# 而 [ 1 == 1 ]; do echo -n "`date` - ";dd if=asm8.iso bs=1M count=30 2>&1|grep -c "Operation not permi"; 睡眠 1;日期 >> /var/log/ps.log;ps -efww >> /var/log/ps.log; 完畢
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”-B10000 > /tmp/ps39
# cat ps.log |grep“2018 年 1 月 19 日星期五 18:57:40 CET”-A10000 |grep“2018 年 1 月 19 日星期五 18:57:41”-B10000 > /tmp/ps40
# cd /tmp

比較第 39 秒和第 40 秒之間的 ps 輸出:

# 差異 ps39 ps40
2018 年 1 月 19 日星期五 18:57:40 CET
266c266
根 2412 1276 97 18:57?00:00:19 /opt/isec/ens/threatprevention/bin/isectpd
275,276c275,278
根 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
> 根 2663 2518 0 18:57 pts/1 00:00:00 ps -efww

就是這樣了!一旦 isectpd 程序在第 40 秒啟動,它就禁止訪問我的 2GB 文件。

一旦我這樣做:

# systemctl 停止 isectpd

它開始工作了。顯然,在我了解如何允許來自 McAfee 的 > 2GB 文件之前,這是一個創可貼。如果有人對此有任何經驗,請隨時加入。

乾杯。

引用自:https://serverfault.com/questions/892340