web-dev-qa-db-ja.com

7zipでのE_FAILエラー

少し前に7Zipを使用してバックアップを実行しました。このバックアップでは、ファイルを14個の2GB(約)ファイルに分割しました。 Ubuntu Server15.10を実行しています。

これは私がそれらを抽出するために実行しようとしているものです:

7z x Backup.7z.001

私も試した場合に備えて(「x」と「e」の違いはわかりませんが):

7z e Backup.7z.001

そして、これは私が得るものです:

7-Zip 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7Zip Version 9.20 (locale=en_GB.UTF-8,Utf16=on,HugeFiles=on,2 CPUs)
Processing archive: Backup.7z.001
Error: E_FAIL 

調査を行っていますが、「E_FAIL」エラーは「ディスク容量不足」を意味しているようです。ただし、ディスク容量は十分にあります。これは、「df-h」を実行したときに得られるものです。

Filesystem               Size  Used Avail Use% Mounted on

udev                     791M     0  791M   0% /dev

tmpfs                    161M  5,6M  156M   4% /run

/dev/sda2                450G   73G  354G  18% /

tmpfs                    805M  4,0K  805M   1% /dev/shm

tmpfs                    5,0M     0  5,0M   0% /run/lock

tmpfs                    805M     0  805M   0% /sys/fs/cgroup

tmpfs                    161M     0  161M   0% /run/user/1000


/home/cristian/.Private  450G   73G  354G  18% /home/cristian

/ home/cristian、/ srv/samba/photosなどの多くのディレクトリで抽出してみました

1
Ckubrak

同様のエラーが発生しました。問題は、「file.7z.002」が欠落していたことでした。誤って「file.7z.001」を新しいフォルダにコピーしただけです。

1
Kala7a

3.5 GBISOファイルを8GBUSBフラッシュドライブにコピーしていました。

診断する

私の場合、@ kwubbufetowiczに出向し、straceを使用してシステムコールとシグナルを確認しました。man straceを参照してください。

strace 7z x [source] -o[target] 2>&1 | tee 7z-strace.log

最後の40行ほどの中に、次のシーケンスがあります。

open("[path to offending file]", O_WRONLY|O_CREAT, 0664) = 4
[...]
write(4, "[...])..."[...], 131072)          = 131071
munmap(0x7f1c9e0b3000, 135168)          = 0
write(4, "\354", 1)                     = -1 EFBIG (File too large)
close(3)                                = 0
close(4)                                = 0
brk(0x22be000)                          = 0x22be000
munmap(0x7f1c9c864000, 3837216)         = 0
rt_sigaction(SIGINT, {SIG_DFL, [INT], [...]
rt_sigaction(SIGTERM, {SIG_DFL, [TERM], [...]
write(1, "xtracting  [some file]/"..., 1108xtracting  [some file] 
[...]
ERROR: E_FAIL                

) = 1108
exit_group(2)                           = ?
+++ exited with 2 +++

したがって、ファイル4にパス書き込みがあり、同じファイルにメッセージEFBIG(ファイルが大きすぎます)で失敗し、一部のファイルが閉じられ、いくつかの中断および終了信号。最終的に、以前に表示されたエラーメッセージ:ERROR:E_FAIL。問題のあるファイルは4.3GBです。

また、私に言わせれば、端末に送信される最終メッセージは常に内部メッセージを反映している必要があります。 OPのPastebin には、次のように表示されます。

 write(1, "Error: E_FAIL                \n", 30Error: E_FAIL  ) = 30

これは一貫したメッセージです。私の場合、「ERROR:E_FAIL」は大文字のエラーで、端末で「EFBIG(ファイルが大きすぎます)」を呼び出し信号トレースで非表示にします。

基本的に、stdoutを額面どおりに取得して、トレースでさらに検索しないでください。大文字と小文字、およびエラーが発生するかどうかにも注意してください。 :E_FAILまたはエラー:E_FAIL **。

行動

私はこれを見つけました ブログ投稿 2014年の著者は3つの方法を提案しています:

  1. CD-ROMのように読み取り専用の圧縮アーカイブを探していて、-7Zipに書き込みを依頼しました。これを行うことはできないので、ディスク容量がないかのように失敗します。
  2. ディスク容量が不足しているドライブに解凍しようとしています。
  3. 大きなファイルを、その大きなファイルをサポートできないファイルシステムに解凍しようとしているため、ディスク領域がないかのように失敗します。

私の問題は、新しいフラッシュドライブがLinuxボックスに表示されたときにexFATまたはFAT32にフォーマットされていたことでした。したがって、大きなファイル(> 25GB)は、FAT32の制限である4GBを超えて書き込むことができませんでした。

基本的に、ディスクの空き容量は問題ではありません。ファイルシステムが書き込みたいファイルサイズをサポートできるかどうかを確認してください。

結果

この解決策は私のために働いた。 USBドライブをFAT32からNFTSに再フォーマットし、抽出を完了することができました。抽出後の合計使用容量は5.3GBです。

Everything is Ok

Folders: 85
Files: 942
Size:       5437451876
Compressed: 5443010560
) = 3646
exit_group(0)                           = ?
+++ exited with 0 +++
0
XavierStuvw