私は長い間ext4ファイルシステムを使用してきましたが、ext4ファイルシステムで奇妙な動作を見たのは今回が初めてです。プライマリデバイスでI / Oエラーが発生し、
ext4ファイルシステムが存在する場所にファイルシステムが読み取り専用で再マウントされました。これは大丈夫であり、構成について予想通りです。ただし、不明な理由により、ファイルシステムを完全にアンマウントすることは不可能です。コマンドが正常に返されます。さらにコマンドを実行すると、「インストールされていません」と表示されます。コマンド出力からインストール項目が消えました。ファイルシステムは他の場所にマウントされません。しかし。まず、dmesgに一般的なテキストは表示されません。実際、dmesgには何もありません。 2番目のもの(それ自体が何か間違っていることを示す):/dev/dm-2
umount /the/mount/point
mount
EXT4-fs: unmounting filesystem
root# cat /proc/meminfo | grep dirty
Dirty: 9457728 kB
root# time sync
real 0m0.012s
user 0m0.000s
sys 0m0.002s
root# cat /proc/meminfo | grep dirty
Dirty: 9453632 kB
3番目の点:デバッグディレクトリが/sys/fs/ext4/dm-2
まだ存在します。/sys/fs/ext4/dm-2/simulate_fail
ファイルシステムが閉じられたら「1」を書きます。しかし、何もせず、dmesgに何も表示しません。
最後に、4番目はデバイスを使用不能にします。
root# e2fsck -fy /dev/dm-2
e2fsck 1.46.5 (30-Dec-2021)
/dev/dm-2 is in use.
e2fsck: Cannot continue, aborting.
再起動などが可能であることを知っています。この質問は、簡単な初心者の問題を解決するためのものではありません。 ext4ファイルシステムの経験がある人がこの動作の原因を理解するのに役立つことを願っています。
デバイスdm-2
は他の場所に設置されず、バンドルされてマウントされず、他の用途にも使用されません。
で測定したときにダーティキャッシュを使用する他の項目はありませんでしたcat /proc/meminfo | grep dirty
。
成功した削除呼び出しはMNT_DETACH
(unused-l
フラグ)ではありません。それにもかかわらず、ほぼ即座に成功しました(異常ですね)。マウントポイントはもはやマウントされません。しかし、上で説明したように、ファイルシステムがアンマウントされていないことが簡単にわかります。
アップデート:ABが指摘したように、ファイルシステムがまだ別の名前空間にマウントされていることを確認しました。他の名前空間にインストールしていないので、何も表示されないと予想しました。しかし、驚くべきことに別の名前空間にインストールされ、驚くべきことに(ユーザー名が変更されました):
4026533177 mnt 1 3411291 an-unrelated-nonroot-user xdg-dbus-proxy --args=43
その名前空間に移動してそれを使用して削除しようとしましたが、nsenter -t 3411291 -m -- umount /the/mount/point
その結果、dmesgで分割エラー(コアダンプ)が発生しました。
[970130.866738] Buffer I/O error on dev dm-2, logical block 0, lost sync page write
[970130.867925] EXT4-fs error (device dm-2): ext4_mb_release_inode_pa:4846: group 9239, free 2048, pa_free 4
[970130.870291] Buffer I/O error on dev dm-2, logical block 0, lost sync page write
[970130.949466] divide error: 0000 [#1] PREEMPT SMP PTI
[970130.950677] CPU: 49 PID: 4118804 Comm: umount Tainted: P W OE 6.1.68-missmika #1
[970130.953056] Hardware name: OEM X79G/X79G, BIOS 4.6.5 08/02/2022
[970130.953121] RIP: 0010:mb_update_avg_fragment_size+0x35/0x120
[970130.953121] Code: 41 54 53 4c 8b a7 98 03 00 00 41 f6 44 24 7c 80 0f 84 9a 00 00 00 8b 46 14 48 89 f3 85 c0 0f 84 8c 00 00 00 99 b9 ff ff ff ff <f7> 7e 18 0f bd c8 41 89 cd 41 83 ed 01 0f 88 ce 00 00 00 0f b6 47
[970130.957139] RSP: 0018:ffffb909e3123a28 EFLAGS: 00010202
[970130.957139] RAX: 000000000000082a RBX: ffff91140ac554d8 RCX: 00000000ffffffff
[970130.957139] RDX: 0000000000000000 RSI: ffff91140ac554d8 RDI: ffff910ead74f800
[970130.957139] RBP: ffffb909e3123a40 R08: 0000000000000000 R09: 0000000000004800
[970130.957139] R10: ffff910ead74f800 R11: ffff9114b7126000 R12: ffff910eb31d2000
[970130.957139] R13: 0000000000000007 R14: ffffb909e3123b80 R15: ffff911d732beffc
[970130.957139] FS: 00007f6d94ab4800(0000) GS:ffff911d7fcc0000(0000) knlGS:0000000000000000
[970130.957139] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[970130.957139] CR2: 00003d140602f000 CR3: 0000000365690002 CR4: 00000000001706e0
[970130.957139] Call Trace:
[970130.957139] <TASK>
[970130.957139] ? show_regs.cold+0x1a/0x1f
[970130.957139] ? __die_body+0x24/0x70
[970130.957139] ? __die+0x2f/0x3b
[970130.957139] ? die+0x34/0x60
[970130.957139] ? do_trap+0xdf/0x100
[970130.957139] ? do_error_trap+0x73/0xa0
[970130.957139] ? mb_update_avg_fragment_size+0x35/0x120
[970130.957139] ? exc_divide_error+0x3f/0x60
[970130.957139] ? mb_update_avg_fragment_size+0x35/0x120
[970130.957139] ? asm_exc_divide_error+0x1f/0x30
[970130.957139] ? mb_update_avg_fragment_size+0x35/0x120
[970130.957139] ? mb_set_largest_free_order+0x11c/0x130
[970130.957139] mb_free_blocks+0x24d/0x5e0
[970130.957139] ? ext4_validate_block_bitmap.part.0+0x29/0x3e0
[970130.957139] ? __getblk_gfp+0x33/0x3b0
[970130.957139] ext4_mb_release_inode_pa.isra.0+0x12e/0x350
[970130.957139] ext4_discard_preallocations+0x22e/0x490
[970130.957139] ext4_clear_inode+0x31/0xb0
[970130.957139] ext4_evict_inode+0xba/0x750
[970130.989137] evict+0xd0/0x180
[970130.989137] dispose_list+0x39/0x60
[970130.989137] evict_inodes+0x18e/0x1a0
[970130.989137] generic_shutdown_super+0x46/0x1b0
[970130.989137] kill_block_super+0x2b/0x60
[970130.989137] deactivate_locked_super+0x39/0x80
[970130.989137] deactivate_super+0x46/0x50
[970130.989137] cleanup_mnt+0x109/0x170
[970130.989137] __cleanup_mnt+0x16/0x20
[970130.989137] task_work_run+0x65/0xa0
[970130.989137] exit_to_user_mode_prepare+0x152/0x170
[970130.989137] syscall_exit_to_user_mode+0x2a/0x50
[970130.989137] ? __x64_sys_umount+0x1a/0x30
[970130.989137] do_syscall_64+0x6d/0x90
[970130.989137] ? syscall_exit_to_user_mode+0x38/0x50
[970130.989137] ? __x64_sys_newfstatat+0x22/0x30
[970130.989137] ? do_syscall_64+0x6d/0x90
[970130.989137] ? exit_to_user_mode_prepare+0x3d/0x170
[970130.989137] ? syscall_exit_to_user_mode+0x38/0x50
[970130.989137] ? __x64_sys_close+0x16/0x50
[970130.989137] ? do_syscall_64+0x6d/0x90
[970130.989137] ? exc_page_fault+0x8b/0x180
[970130.989137] entry_SYSCALL_64_after_hwframe+0x64/0xce
[970130.989137] RIP: 0033:0x7f6d94925a3b
[970130.989137] Code: fb 43 0f 00 f7 d8 64 89 01 48 83 c8 ff c3 90 f3 0f 1e fa 31 f6 e9 05 00 00 00 0f 1f 44 00 00 f3 0f 1e fa b8 a6 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 05 c3 0f 1f 40 00 48 8b 15 c1 43 0f 00 f7 d8
[970130.989137] RSP: 002b:00007ffdd60f7d08 EFLAGS: 00000246 ORIG_RAX: 00000000000000a6
[970130.989137] RAX: 0000000000000000 RBX: 0000000000000000 RCX: 00007f6d94925a3b
[970130.989137] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 000055ca1c6f7d60
[970130.989137] RBP: 000055ca1c6f7b30 R08: 0000000000000000 R09: 00007ffdd60f6a90
[970130.989137] R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000
[970130.989137] R13: 000055ca1c6f7d60 R14: 000055ca1c6f7c40 R15: 000055ca1c6f7b30
[970130.989137] </TASK>
[970130.989137] Modules linked in: 88x2bu(OE) erofs dm_zero zram ext2 hfs hfsplus xfs kvdo(OE) dm_bufio mikasecfs(OE) simplefsplus(OE) melon(OE) mikatest(OE) iloveaki(OE) tls vboxnetadp(OE) vboxnetflt(OE) vboxdrv(OE) ip6t_REJECT nf_reject_ipv6 ip6t_rt ipt_REJECT nf_reject_ipv4 xt_recent xt_tcpudp nft_limit xt_limit xt_addrtype xt_pkttype nft_chain_nat xt_MASQUERADE xt_nat nf_nat xt_conntrack nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 nft_compat nf_tables binfmt_misc nfnetlink nvidia_uvm(POE) nvidia_drm(POE) intel_rapl_msr intel_rapl_common nvidia_modeset(POE) sb_edac nls_iso8859_1 x86_pkg_temp_thermal intel_powerclamp coretemp nvidia(POE) snd_hda_codec_realtek snd_hda_codec_generic ledtrig_audio snd_hda_codec_hdmi cfg80211 joydev snd_hda_intel input_leds snd_intel_dspcfg snd_intel_sdw_acpi snd_hda_codec kvm_intel snd_hda_core snd_hwdep kvm snd_pcm snd_seq_midi rapl snd_seq_midi_event snd_rawmidi intel_cstate serio_raw pcspkr snd_seq video wmi snd_seq_device snd_timer drm_kms_helper fb_sys_fops snd syscopyarea sysfillrect sysimgblt soundcore
[970130.989137] ioatdma dca mac_hid sch_fq_codel dm_multipath scsi_dh_rdac scsi_dh_emc scsi_dh_alua msr parport_pc ppdev lp parport drm efi_pstore ip_tables x_tables autofs4 raid10 raid456 async_raid6_recov async_memcpy async_pq async_xor async_tx raid1 raid0 multipath linear crct10dif_pclmul hid_generic crc32_pclmul ghash_clmulni_intel sha512_ssse3 sha256_ssse3 sha1_ssse3 usbhid cdc_ether aesni_intel usbnet uas hid crypto_simd r8152 cryptd usb_storage mii psmouse ahci i2c_i801 r8169 lpc_ich libahci i2c_smbus realtek [last unloaded: 88x2bu(OE)]
[970131.024615] ---[ end trace 0000000000000000 ]---
[970131.203209] RIP: 0010:mb_update_avg_fragment_size+0x35/0x120
[970131.204344] Code: 41 54 53 4c 8b a7 98 03 00 00 41 f6 44 24 7c 80 0f 84 9a 00 00 00 8b 46 14 48 89 f3 85 c0 0f 84 8c 00 00 00 99 b9 ff ff ff ff <f7> 7e 18 0f bd c8 41 89 cd 41 83 ed 01 0f 88 ce 00 00 00 0f b6 47
[970131.207841] RSP: 0018:ffffb909e3123a28 EFLAGS: 00010202
[970131.209048] RAX: 000000000000082a RBX: ffff91140ac554d8 RCX: 00000000ffffffff
[970131.210284] RDX: 0000000000000000 RSI: ffff91140ac554d8 RDI: ffff910ead74f800
[970131.211512] RBP: ffffb909e3123a40 R08: 0000000000000000 R09: 0000000000004800
[970131.212749] R10: ffff910ead74f800 R11: ffff9114b7126000 R12: ffff910eb31d2000
[970131.213977] R13: 0000000000000007 R14: ffffb909e3123b80 R15: ffff911d732beffc
[970131.215181] FS: 00007f6d94ab4800(0000) GS:ffff911d7fcc0000(0000) knlGS:0000000000000000
[970131.216370] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[970131.217553] CR2: 00003d140602f000 CR3: 0000000365690002 CR4: 00000000001706e0
[970131.218740] note: umount[4118804] exited with preempt_count 1
マシンはまだ動作しており、他のファイルシステムを同期させることができます。
root# sync -f /
root#
しかし、グローバル同期ではありません。
root# sync
(goes D state forever)
このGhostファイルシステムに関連するダーティキャッシュが消えず、ファイルシステムがまだ「マウント」されている
この問題の理由は何ですか?
答え1
免責事項:部分的なカーネルエラーが発生する理由は、この回答で説明できず、説明しません。これはカーネルのバグのように見え、I / Oエラー条件が原因で発生する可能性があります。
長い話を短く
新しいマウントネームスペースが元のマウントネームスペースからマウントされたファイルシステムを継承している場合、ファイルシステムはまだ使用されている可能性がありますが、2つの間の伝播設定によって元のネームスペースからアンマウントが有効になりません。新しい名前空間。このコマンドは、findmnt -A -o +PROPAGATION
出力に表示される各マウントポイントの伝播状態も表示します。
通常、これは起こってはいけません。システム環境のためシステム/
共有マウントはカーネルのデフォルトではなく最初に行われるため、private
マウント解除は共有グループ内で伝播できます。したがって、システム化されていない環境やツールが--make-private
一部のインストールで明示的に使用されている場合、これはより簡単に発生すると予想されます。--make-private
特に、仮想擬似ファイルシステムの用途は依然として存在する。
このようなことが起こらないようにする1つの方法は次のとおりです。新しいマウントネームスペースを作成する前に共有でマウントポイントを変更します mount --make-shared ...
。
共有マウントと非共有マウントで何が起こるかを説明するために実験を行った。私は、システム化された環境または非システム化された環境で実験が同じようにうまく機能することを確認しようとしています。
実験
これは以下のように複製できます(一部の値を/dev/loop0
調整する必要があります)。
# truncate -s $((2**20)) /tmp/test.raw
# mkfs.ext4 -Elazy_itable_init=0,lazy_journal_init=0 -L test /tmp/test.raw
mke2fs 1.47.0 (5-Feb-2023)
Filesystem too small for a journal
Discarding device blocks: done
Creating filesystem with 1024 1k blocks and 128 inodes
Allocating group tables: done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
# losetup -f --show /tmp/test.raw
/dev/loop0
# mkdir -p /mnt/propagation/test
これにより、ディレクトリをマウントポイントに切り替えて、システム全体を変更せずに後で変更実験を伝播できます。
# mount --bind /mnt/propagation /mnt/propagation
これで、実験によって異なる結果が出ることがあります。
unshare(1)
言う:
unshare
private
util-linuxバージョン2.27は、新しいネームスペースが実際に共有されないように、新しいマウントネームスペースに自動的に伝播を設定するためです。この機能はオプションを使用して無効にできます--propagation unchanged
。これがprivate
カーネルのデフォルト値であることに注意してください。
他のツールもこれを行うことができます。ここでは、デフォルトのマウントポイントを変更し、/mnt/propagation
常に。--propagation unchanged
/
/
そして
shared
# mount --make-shared /mnt/propagation # mount /dev/loop0 /mnt/propagation/test # ls /mnt/propagation/test lost+found # cat /proc/self/mountinfo | grep /mnt/propagation/test 862 854 7:0 / /mnt/propagation/test rw,relatime shared:500 - ext4 /dev/loop0 rw
2番目の(ルート)シェルを作成し、新しいインストール名前空間の共有を解除します(区別するためにプロンプトをNMNS#に変更しました)。
# unshare -m --propagation unchanged -- NMNS# cat /proc/self/mountinfo | grep /mnt/propagation/test 1454 1453 7:0 / /mnt/propagation/test rw,relatime shared:500 - ext4 /dev/loop0 rw NMNS# cd /mnt/propagation/test
さらに、
shared:500
リンクは両方の名前空間にマウントされます。ある名前空間からマウントを解除すると、別の名前空間でもマウントが解除されます。元のシェル(元のマウントネームスペース)からマウント解除します。
# umount /mnt/propagation/test umount: /mnt/propagation/test: target is busy.
リソース使用量をオフにする:
NMNS# cd /
# umount /mnt/propagation/test #
今回は効果がありました。
新しいマウントネームスペースからも消えることを確認してください。
NMNS# cat /proc/self/mountinfo | grep /mnt/propagation/test NMNS#
カーネルは、
dmesg
ファイルシステムが(どこでも)アンマウントされたことを記録します。たとえば、次のようになります。EXT4-fs (loop0): unmounting filesystem e74e0353-ace0-4eff-86ae-30e288db853e.
クリーンアップするには、新しくインストールされた名前空間でシェルを終了します。
そして
private
# mount --make-private /mnt/propagation # mount /dev/loop0 /mnt/propagation/test # cat /proc/self/mountinfo | grep /mnt/propagation/test 857 854 7:0 / /mnt/propagation/test rw,relatime - ext4 /dev/loop0 rw
もう共有しないでください。
他の場所:
# unshare -m --propagation unchanged -- NMNS# cat /proc/self/mountinfo | grep /mnt/propagation/test 1454 1453 7:0 / /mnt/propagation/test rw,relatime - ext4 /dev/loop0 rw NMNS# echo $$ 232529
# umount /mnt/propagation/test # e2fsck /dev/loop0 e2fsck 1.47.0 (5-Feb-2023) /dev/loop0 is in use. e2fsck: Cannot continue, aborting. #
ファイルシステムは、新しいインストール名前空間にマウントされたままです。
元の名前空間でこの悪意のある名前空間を見つけるには、次のコマンドを実行します。
# for pid in $(lsns --noheadings -t mnt -o PID); do nsenter -t "$pid" -m -- findmnt /mnt/propagation/test && echo $pid; done nsenter: failed to execute findmnt: No such file or directory TARGET SOURCE FSTYPE OPTIONS /mnt/propagation/test /dev/loop0 ext4 rw,relatime 232529 #
注:
nsenter: failed to execute findmnt: No such file or directory
実行中のLXCコンテナのマウントネームスペースはfindmnt
使用できなくなります。ループはマウントポイントを使用して新しいネームスペース内のプロセスのPIDを見つけます(注:実際の状況では、同じマウントネームスペースで別のPIDになる可能性があるため重要ではありません)。極端な場合は、マウントネームスペースの変更、マウント確認、(u)マウントをすべて一度に実行できる専用コマンドが必要です。このマウントは、プロセスがマウントされたファイルシステムを積極的に使用する場合(成功防止)、必要な残りの保持リソース(PID 232529)を削除するか、この名前空間からアンマウントすることによって
umount
削除できます。# nsenter -t 232529 -m -- umount /mnt/propagation/test # e2fsck /dev/loop0 e2fsck 1.47.0 (5-Feb-2023) test: clean, 11/128 files, 58/1024 blocks
便利な参考資料: