ファイルシステムがアンマウントされていますが、まだ使用されているのはなぜですか?

ファイルシステムがアンマウントされていますが、まだ使用されているのはなぜですか?

私は長い間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)言う:

unshareprivateutil-linuxバージョン2.27は、新しいネームスペースが実際に共有されないように、新しいマウントネームスペースに自動的に伝播を設定するためです。この機能はオプションを使用して無効にできます--propagation unchanged。これがprivateカーネルのデフォルト値であることに注意してください。

他のツールもこれを行うことができます。ここでは、デフォルトのマウントポイントを変更し、/mnt/propagation常に。--propagation unchanged//

  1. そして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.
    

    クリーンアップするには、新しくインストールされた名前空間でシェルを終了します。

  2. そして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
    

便利な参考資料:

おすすめ記事