成功せずに、非常に大きないくつかのディレクトリを削除しようとしました。以下はいくつかの観察事項です。
# cwd contains the two larger directories
$ ls -lhF
drwxrwxr-x 2 hongxu hongxu 471M Oct 16 18:52 J/
drwxr-xr-x 2 hongxu hongxu 5.8M Oct 16 17:21 u/
# Note that this is the output of `ls` of the directory themselves so they should be *huge*
# J/ seems much larger than u/ (containing more files), so take u/ as an example
$ rm -rf u/
# hang for a very long time, and finally report
rm: traversal failed: u: Bad message
$ cd u/
# can cd into u/ without problems
$ ls -lhF
# hang for a long time; cancel succeeds when I press Ctrl-C
$ rm *
# hang for a long time; cancel fails when I press Ctrl-C
# however there are no process associated with `rm` as reported by `ps aux`
どちらのディレクトリにもほとんど小さなファイルがたくさん含まれています(それぞれ10,000個を超えないと思います)。これで、より多くのディスク容量を確保するために、これら2つのディレクトリを削除する必要があります。どうすればいいですか?
アップデート1:
かなりの時間(> 2時間)が経過したことをrm -rf u/
示す出力を見てください。rm: traversal failed: u: Bad message
だから問題は効率ではないようです。
アップデート2:
適用すると、fsck
次のように報告されます(良好に見えます)。
$ sudo fsck -A -y /dev/sda2
fsck from util-linux 2.31.1
fsck.fat 4.1 (2017-01-24)
/dev/sda1: 13 files, 1884/130812 clusters
$ df /dev/sda2
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 244568380 189896000 43628648 82% /
アップデート3:
関連があるかもしれませんが、そうでない場合、これら2つのディレクトリ(それは問題ではありません!J/
およびu/
)には、コマンドterminfo
によって生成されたディレクトリが含まれます。通常のコンパイルされたterminfoファイル(内部ディレクトリなど)とは異なり、これらのファイルは一部のファジング技術を使用して生成されるため、「適切なディレクトリ」ではない可能性があります。 「terminfoファイルです。tic
/lib/terminfo
アップデート4:
さらなる観察:
$ find u/ -type f | while read f; do echo $f; rm -f $f; done
# hang for a long time, IUsed (`df -i /dev/sda2`) not decreased
$ mkdir emptyfolder && rsync -r --delete emptyfolder/ u/
# hang for a long time, IUsed (`df -i /dev/sda2`) not decreased
$ strace rm -rf u/
execve("/bin/rm", ["rm", "-rf", "u"], 0x7fffffffc550 /* 121 vars */) = 0
brk(NULL) = 0x555555764000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=125128, ...}) = 0
mmap(NULL, 125128, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ffff7fd8000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260\34\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2030544, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffff7fd6000
mmap(NULL, 4131552, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffff79e4000
mprotect(0x7ffff7bcb000, 2097152, PROT_NONE) = 0
mmap(0x7ffff7dcb000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e7000) = 0x7ffff7dcb000
mmap(0x7ffff7dd1000, 15072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7ffff7dd1000
close(3) = 0
arch_prctl(ARCH_SET_FS, 0x7ffff7fd7540) = 0
mprotect(0x7ffff7dcb000, 16384, PROT_READ) = 0
mprotect(0x555555762000, 4096, PROT_READ) = 0
mprotect(0x7ffff7ffc000, 4096, PROT_READ) = 0
munmap(0x7ffff7fd8000, 125128) = 0
brk(NULL) = 0x555555764000
brk(0x555555785000) = 0x555555785000
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=1683056, ...}) = 0
mmap(NULL, 1683056, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ffff7e3b000
close(3) = 0
ioctl(0, TCGETS, {B38400 opost isig icanon echo ...}) = 0
lstat("/", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
newfstatat(AT_FDCWD, "u", {st_mode=S_IFDIR|0755, st_size=6045696, ...}, AT_SYMLINK_NOFOLLOW) = 0
openat(AT_FDCWD, "u", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW|O_DIRECTORY) = 3
fstat(3, {st_mode=S_IFDIR|0755, st_size=6045696, ...}) = 0
fcntl(3, F_GETFL) = 0x38800 (flags O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_NOFOLLOW|O_DIRECTORY)
fcntl(3, F_SETFD, FD_CLOEXEC) = 0
getdents(3, /* 2 entries */, 32768) = 48
getdents(3, /* 1 entries */, 32768) = 24
... (repeated lines)
getdents(3, /* 1 entries */, 32768) = 24
getdents(3strace: Process 5307 detached
<detached ...>
# (manually killed)
$ ls -f1 u/
./
../
../
../
../
... (repeated lines)
../
$ sudo journalctl -ex
Oct 17 16:00:16 CSLRF03AU kernel: JBD2: Spotted dirty metadata buffer (dev = sda2, blocknr = 0). There's a risk of filesystem corruption in case of system crash.
Oct 17 16:00:20 CSLRF03AU kernel: EXT4-fs error: 6971 callbacks suppressed
Oct 17 16:00:20 CSLRF03AU kernel: EXT4-fs error (device sda2): ext4_htree_next_block:948: inode #9789534: block 1020: comm find: Directory index failed checksum
Oct 17 16:00:20 CSLRF03AU kernel: EXT4-fs error (device sda2): ext4_htree_next_block:948: inode #9789534: block 1020: comm zsh: Directory index failed checksum
Oct 17 16:00:20 CSLRF03AU kernel: EXT4-fs error (device sda2): ext4_htree_next_block:948: inode #9789534: block 1020: comm rm: Directory index failed checksum
Oct 17 16:00:20 CSLRF03AU kernel: EXT4-fs error (device sda2): ext4_htree_next_block:948: inode #9789534: block 1020: comm find: Directory index failed checksum
Oct 17 16:00:20 CSLRF03AU kernel: EXT4-fs error (device sda2): ext4_htree_next_block:948: inode #9789534: block 1020: comm rsync: Directory index failed checksum
Oct 17 16:00:20 CSLRF03AU kernel: EXT4-fs error (device sda2): ext4_htree_next_block:948: inode #9789534: block 1020: comm zsh: Directory index failed checksum
Oct 17 16:00:20 CSLRF03AU kernel: EXT4-fs error (device sda2): ext4_htree_next_block:948: inode #9789534: block 1020: comm zsh: Directory index failed checksum
Oct 17 16:00:20 CSLRF03AU kernel: EXT4-fs error (device sda2): ext4_htree_next_block:948: inode #9789534: block 1020: comm rm: Directory index failed checksum
Oct 17 16:00:20 CSLRF03AU kernel: EXT4-fs error (device sda2): ext4_htree_next_block:948: inode #9789534: block 1020: comm find: Directory index failed checksum
Oct 17 16:00:20 CSLRF03AU kernel: EXT4-fs error (device sda2): ext4_htree_next_block:948: inode #9789534: block 1020: comm find: Directory index failed checksum
# #9789534 is the inode of `u/` as reported by `ls -i`
したがって、ファイルシステムが破損する必要があります。しかし、再起動しても機能しません。 :(
答え1
さて、ついに問題を解決しました。これはls
、ディスプレイエラーやその他のユーティリティの誤動作を引き起こすファイルシステムエラーが原因で発生します。
申し訳ありません。質問タイトルが誤解を招く場合があります。 (実際にはたくさんのファイルがありますが、u/
ディレクトリはあまり大きくない)。
破損したファイルシステムがあったため、ライブUSBを使用して問題を解決しました/
。修正は、破損したディスクがある場所に適用するだけでしたsudo fsck -cfk /dev/sda2
。dev/sda2
答え2
を使用して大容量ファイルを削除することはできませんrm
。あなたはできます
find u/ -type f -print0 | xargs -r -0 rm -f
すべてのファイルを削除するには、ファイルのみが削除されます。
find u/ -print0 | xargs -r -0 rm -rf
システムに次のオプションがある場合は、このオプションを使用できます--delete
。find
find u/ -type f --delete
またはファンキーな方法でrsync
:
mkdir emptyfolder
rsync -r --delete emptyfolder/ u/
rsync
rm
一部のスキャンをバイパスするので、コンテンツを削除するよりもはるかに高速です。
答え3
find /u -type f | while read f; do rm -f $f; done
少し時間がかかりますが、試してみることができます。何らかの理由で他の方法が失敗しても、bashのループは完全に機能します。