Kylin Desktop V11 2603 挂载 SKF 后立即操作卡死
现象
在 Kylin Desktop V11 2603 系统中,插入 SKF U 盘设备后,系统会自动挂载。若立即调用 SKF SDK 进行设备枚举,或调用 umount 卸载设备,会出现卡住、无响应的情况;但如果在插入后等待约 20 秒,再执行上述操作,则可正常运行。
排查
插入 SKF U 盘并等待系统自动挂载后,立刻使用 umount 命令卸载设备:
csis@csis-pc:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 931.5G 0 disk
sdb 8:16 1 3.4G 0 disk
└─sdb1 8:17 1 3.4G 0 part /run/media/csis/Factory
nvme0n1 259:0 0 232.9G 0 disk
├─nvme0n1p1 259:1 0 512M 0 part /boot/efi
├─nvme0n1p2 259:2 0 2G 0 part /boot
├─nvme0n1p3 259:3 0 93G 0 part /sysroot/ostree/deploy/kylin/var
│ /var
│ /sysroot
│ /usr
│ /
├─nvme0n1p4 259:4 0 25.9G 0 part
├─nvme0n1p5 259:5 0 93G 0 part /root
│ /home
│ /data
└─nvme0n1p6 259:6 0 18.6G 0 part [SWAP]
csis@csis-pc:~$ umount /run/media/csis/Factory
此时已经卡住,新开 SSH 连接,查看不可中断睡眠状态的进程信息:
csis@csis-pc:~$ ps -eo pid,state,comm | awk '$2 == "D"'
11 D kworker/u16:0+events_freezable_pwr_efficient
170 D kworker/u16:4+flush-8:16
4578 D kworker/u18:2+i915_flip
56359 D hwinfo
csis@csis-pc:~$ echo w | sudo tee /proc/sysrq-trigger
csis@csis-pc:~$ sudo dmesg -Hw
[ +9.864187] sysrq: Show Blocked State
[ +0.000024] task:kworker/u16:0 state:D stack:0 pid:11 tgid:11 ppid:2 flags:0x00004000
[ +0.000006] Workqueue: events_freezable_pwr_efficient disk_events_workfn
[ +0.000021] Call Trace:
[ +0.000002] <TASK>
[ +0.000004] __schedule+0x2dc/0x610
[ +0.000005] schedule+0x33/0xc0
[ +0.000002] io_schedule+0x46/0x80
[ +0.000002] blk_mq_get_tag+0x117/0x2a0
[ +0.000003] ? __pfx_autoremove_wake_function+0x10/0x10
[ +0.000006] __blk_mq_alloc_requests+0x1bb/0x500
[ +0.000020] blk_mq_alloc_request+0x22b/0x2c0
[ +0.000003] ? get_nohz_timer_target+0x29/0x150
[ +0.000004] scsi_execute_cmd+0xea/0x300
[ +0.000004] scsi_test_unit_ready+0x6e/0xf0
[ +0.000003] sd_check_events+0x108/0x1a0
[ +0.000022] disk_check_events+0x39/0x110
[ +0.000003] disk_events_workfn+0x19/0x20
[ +0.000002] process_one_work+0x188/0x3c0
[ +0.000023] worker_thread+0x32f/0x4e0
[ +0.000002] ? __pfx_worker_thread+0x10/0x10
[ +0.000002] kthread+0xef/0x120
[ +0.000003] ? __pfx_kthread+0x10/0x10
[ +0.000003] ret_from_fork+0xc3/0xf0
[ +0.000003] ? __pfx_kthread+0x10/0x10
[ +0.000003] ret_from_fork_asm+0x1a/0x30
[ +0.000004] </TASK>
[ +0.000016] task:kworker/u16:4 state:D stack:0 pid:170 tgid:170 ppid:2 flags:0x00004000
[ +0.000004] Workqueue: writeback wb_workfn (flush-8:16)
[ +0.000004] Call Trace:
[ +0.000001] <TASK>
[ +0.000002] __schedule+0x2dc/0x610
[ +0.000003] schedule+0x33/0xc0
[ +0.000018] io_schedule+0x46/0x80
[ +0.000002] folio_wait_bit_common+0x142/0x370
[ +0.000004] ? __pfx_wake_page_function+0x10/0x10
[ +0.000004] __folio_lock+0x17/0x20
[ +0.000002] write_cache_pages+0x2ca/0x3e0
[ +0.000004] ? __pfx_blkdev_get_block+0x10/0x10
[ +0.000003] ? __pfx_block_write_full_folio+0x10/0x10
[ +0.000017] blkdev_writepages+0x57/0x90
[ +0.000004] do_writepages+0x72/0x1c0
[ +0.000002] ? fprop_fraction_percpu+0x34/0x80
[ +0.000005] __writeback_single_inode+0x44/0x290
[ +0.000004] ? inode_to_bdi+0x38/0x50
[ +0.000003] writeback_sb_inodes+0x239/0x540
[ +0.000006] __writeback_inodes_wb+0x54/0xf0
[ +0.000003] ? queue_io+0x104/0x110
[ +0.000003] wb_writeback+0x1a9/0x330
[ +0.000004] wb_workfn+0x2d3/0x420
[ +0.000002] ? try_to_wake_up+0x81/0x5b0
[ +0.000004] process_one_work+0x188/0x3c0
[ +0.000003] worker_thread+0x32f/0x4e0
[ +0.000003] ? __pfx_worker_thread+0x10/0x10
[ +0.000001] kthread+0xef/0x120
[ +0.000003] ? __pfx_kthread+0x10/0x10
[ +0.000003] ret_from_fork+0xc3/0xf0
[ +0.000002] ? __pfx_kthread+0x10/0x10
[ +0.000002] ret_from_fork_asm+0x1a/0x30
[ +0.000004] </TASK>
[ +0.000032] task:pool-udisksd state:D stack:0 pid:56176 tgid:1533 ppid:1 flags:0x00004002
[ +0.000004] Call Trace:
[ +0.000001] <TASK>
[ +0.000001] __schedule+0x2dc/0x610
[ +0.000004] schedule+0x33/0xc0
[ +0.000002] io_schedule+0x46/0x80
[ +0.000002] blk_mq_get_tag+0x117/0x2a0
[ +0.000002] ? __pfx_autoremove_wake_function+0x10/0x10
[ +0.000004] __blk_mq_alloc_requests+0x1bb/0x500
[ +0.000003] blk_mq_submit_bio+0x1a5/0x690
[ +0.000003] ? enqueue_hrtimer+0x3c/0x90
[ +0.000004] __submit_bio+0x96/0x180
[ +0.000003] submit_bio_noacct_nocheck+0x164/0x230
[ +0.000003] submit_bio_noacct+0x1ab/0x400
[ +0.000003] submit_bio+0x34/0x90
[ +0.000002] submit_bh_wbc+0x149/0x170
[ +0.000003] __block_write_full_folio+0x1ec/0x410
[ +0.000003] ? __pfx_blkdev_get_block+0x10/0x10
[ +0.000019] ? __pfx_blkdev_get_block+0x10/0x10
[ +0.000003] block_write_full_folio+0xa2/0xd0
[ +0.000003] write_cache_pages+0x11a/0x3e0
[ +0.000018] ? __pfx_blkdev_get_block+0x10/0x10
[ +0.000002] ? __pfx_block_write_full_folio+0x10/0x10
[ +0.000006] blkdev_writepages+0x57/0x90
[ +0.000004] do_writepages+0x72/0x1c0
[ +0.000002] ? _raw_spin_lock_irqsave+0xe/0x20
[ +0.000003] filemap_fdatawrite_wbc+0x6a/0x90
[ +0.000003] __filemap_fdatawrite_range+0x58/0x80
[ +0.000004] filemap_flush+0x1c/0x30
[ +0.000002] sync_blockdev_nowait+0x1b/0x30
[ +0.000003] sync_filesystem+0x60/0xb0
[ +0.000002] generic_shutdown_super+0x29/0x170
[ +0.000003] kill_block_super+0x1b/0x40
[ +0.000002] deactivate_locked_super+0x32/0xb0
[ +0.000003] deactivate_super+0x40/0x50
[ +0.000002] cleanup_mnt+0xc6/0x160
[ +0.000003] __cleanup_mnt+0x12/0x20
[ +0.000002] task_work_run+0x5e/0x90
[ +0.000003] exit_to_user_mode_loop+0xf8/0x120
[ +0.000003] do_syscall_64+0x117/0x130
[ +0.000003] entry_SYSCALL_64_after_hwframe+0x76/0xe0
[ +0.000004] RIP: 0033:0x7eb1c976abbb
[ +0.000029] RSP: 002b:00007eb1c37fd4b8 EFLAGS: 00000246 ORIG_RAX: 00000000000000a6
[ +0.000003] RAX: 0000000000000000 RBX: 00007eb1b40098c0 RCX: 00007eb1c976abbb
[ +0.000001] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 00007eb1b400e390
[ +0.000002] RBP: 00007eb1c37fd500 R08: 00007eb1b4000090 R09: 0000000000000040
[ +0.000001] R10: 0000000000000000 R11: 0000000000000246 R12: 00007eb1c37fd6d0
[ +0.000028] R13: 00007eb1b8002610 R14: 0000000000000000 R15: 0000000000000000
[ +0.000003] </TASK>
[ +0.000153] task:kworker/u18:1 state:D stack:0 pid:52287 tgid:52287 ppid:2 flags:0x00004000
[ +0.000004] Workqueue: i915_flip intel_atomic_commit_work [i915]
[ +0.000197] Call Trace:
[ +0.000001] <TASK>
[ +0.000002] __schedule+0x2dc/0x610
[ +0.000003] schedule+0x33/0xc0
[ +0.000003] intel_atomic_commit_fence_wait+0xb0/0x140 [i915]
[ +0.000143] ? __pfx_autoremove_wake_function+0x10/0x10
[ +0.000003] ? __pfx_autoremove_wake_function+0x10/0x10
[ +0.000003] intel_atomic_commit_tail+0x49/0x7f0 [i915]
[ +0.000140] ? save_fpregs_to_fpstate+0x1b/0x60
[ +0.000005] intel_atomic_commit_work+0x12/0x20 [i915]
[ +0.000224] process_one_work+0x188/0x3c0
[ +0.000002] worker_thread+0x32f/0x4e0
[ +0.000003] ? __pfx_worker_thread+0x10/0x10
[ +0.000002] kthread+0xef/0x120
[ +0.000003] ? __pfx_kthread+0x10/0x10
[ +0.000003] ret_from_fork+0xc3/0xf0
[ +0.000001] ? __pfx_kthread+0x10/0x10
[ +0.000003] ret_from_fork_asm+0x1a/0x30
[ +0.000004] </TASK>
[ +0.000005] task:hwinfo state:D stack:0 pid:56359 tgid:56359 ppid:36932 flags:0x00000002
[ +0.000003] Call Trace:
[ +0.000001] <TASK>
[ +0.000001] __schedule+0x2dc/0x610
[ +0.000004] schedule+0x33/0xc0
[ +0.000002] schedule_timeout+0x14b/0x160
[ +0.000004] wait_for_completion+0x88/0x180
[ +0.000003] __flush_work+0x72/0xc0
[ +0.000003] ? __pfx_wq_barrier_func+0x10/0x10
[ +0.000003] cancel_delayed_work_sync+0x67/0x80
[ +0.000003] disk_block_events+0x7c/0x80
[ +0.000002] blkdev_get_by_dev.part.0+0x12d/0x320
[ +0.000004] bdev_open_by_dev+0xa3/0xc0
[ +0.000003] ? __pfx_blkdev_open+0x10/0x10
[ +0.000002] blkdev_open+0x3e/0xa0
[ +0.000003] do_dentry_open+0x1ff/0x510
[ +0.000004] vfs_open+0x2d/0x40
[ +0.000002] do_open+0x2c0/0x440
[ +0.000003] path_openat+0x12d/0x2c0
[ +0.000004] do_filp_open+0xaf/0x160
[ +0.000005] do_sys_openat2+0xb3/0x120
[ +0.000003] __x64_sys_openat+0x6c/0xa0
[ +0.000002] x64_sys_call+0x199f/0x1f20
[ +0.000002] do_syscall_64+0x4c/0x130
[ +0.000003] entry_SYSCALL_64_after_hwframe+0x76/0xe0
[ +0.000025] RIP: 0033:0x774ee29de615
[ +0.000018] RSP: 002b:00007ffdc9b809f0 EFLAGS: 00000202 ORIG_RAX: 0000000000000101
[ +0.000002] RAX: ffffffffffffffda RBX: 0000000000000800 RCX: 0000774ee29de615
[ +0.000002] RDX: 0000000000000800 RSI: 0000565fe145c600 RDI: 00000000ffffff9c
[ +0.000002] RBP: 0000565fe145c600 R08: 0000565fe1177010 R09: 0000000000000007
[ +0.000001] R10: 0000000000000000 R11: 0000000000000202 R12: 00007ffdc9b80ae8
[ +0.000001] R13: 00007ffdc9b80ae4 R14: 00007ffdc9b80b70 R15: 0000565fe11772a0
[ +0.000003] </TASK>
可以观察到与 hwinfo 命令有关,查看是谁在调用 hwinfo:
csis@csis-pc:~$ ps -ef | grep '[h]winfo'
root 71766 36932 1 16:28 ? 00:00:00 hwinfo --disk
csis@csis-pc:~$ ps -fp 36932
UID PID PPID C STIME TTY TIME CMD
root 36932 1 0 16:05 ? 00:00:00 /usr/bin/python3 /usr/bin/kylin-assistant-systemdaemon.py
csis@csis-pc:~$ pstree -aps 71766
systemd,1 splash
└─kylin-assistant,36932 /usr/bin/kylin-assistant-systemdaemon.py
└─hwinfo,71766 --disk
csis@csis-pc:~$ ps -o pid,ppid,user,stat,wchan:32,cmd -p 71766,36932
PID PPID USER STAT WCHAN CMD
36932 1 root Sl - /usr/bin/python3 /usr/bin/kylin-assistant-systemdaemon.py
71766 36932 root D - hwinfo --disk
是麒麟官方的 Python 脚本在调用 hwinfo,进一步筛选:
csis@csis-pc:~$ sudo grep -RniE 'loadInfoFromHwinfo|--disk' /usr/lib/python3/dist-packages/kylin-assistant-daemon 2>/dev/null
/usr/lib/python3/dist-packages/kylin-assistant-daemon/systemdaemon/kamonitorthread.py:52: hwinfoList = self.cmdTool.loadInfoFromHwinfo("--monitor")["list"]
/usr/lib/python3/dist-packages/kylin-assistant-daemon/systemdaemon/networkadaptorthread.py:84: adaptorList = self.cmdTool.loadInfoFromHwinfo("--network")["list"]
/usr/lib/python3/dist-packages/kylin-assistant-daemon/systemdaemon/networkadaptorthread.py:120: usbNetList = self.cmdTool.loadInfoFromHwinfo("--usb")["list"]
/usr/lib/python3/dist-packages/kylin-assistant-daemon/systemdaemon/networkadaptorthread.py:138: usbNetList = self.cmdTool.loadInfoFromHwinfo("--usb")["list"]
/usr/lib/python3/dist-packages/kylin-assistant-daemon/systemdaemon/networkadaptorthread.py:169: hwinfoList = self.cmdTool.loadInfoFromHwinfo("--network")["list"]
/usr/lib/python3/dist-packages/kylin-assistant-daemon/systemdaemon/kacmdtool.py:154: def loadInfoFromHwinfo(self, param):
/usr/lib/python3/dist-packages/kylin-assistant-daemon/systemdaemon/kacmdtool.py:921: # diskList = cc.loadInfoFromHwinfo("--disk")
/usr/lib/python3/dist-packages/kylin-assistant-daemon/systemdaemon/kacamerainfo.py:47: hwinfoList = self.cmdTool.loadInfoFromHwinfo("--usb")["list"]
/usr/lib/python3/dist-packages/kylin-assistant-daemon/systemdaemon/kakeyboardinfo.py:47: hwinfoList = self.cmdTool.loadInfoFromHwinfo("--keyboard")["list"]
/usr/lib/python3/dist-packages/kylin-assistant-daemon/systemdaemon/kaharddiskinfo.py:130: diskList = self.cmdTool.loadInfoFromHwinfo("--disk")
/usr/lib/python3/dist-packages/kylin-assistant-daemon/systemdaemon/kamouseinfo.py:54: hwinfoList = self.cmdTool.loadInfoFromHwinfo("--mouse")["list"]
/usr/lib/python3/dist-packages/kylin-assistant-daemon/systemdaemon/kagraphicscardinfo.py:101: cardList = self.cmdTool.loadInfoFromHwinfo("--display")["list"]
/usr/lib/python3/dist-packages/kylin-assistant-daemon/systemdaemon/kabluetoothinfo.py:48: hwinfoList = self.cmdTool.loadInfoFromHwinfo("--usb")["list"]
/usr/lib/python3/dist-packages/kylin-assistant-daemon/systemdaemon/kabluetoothinfo.py:49: bThwinfoList = self.cmdTool.loadInfoFromHwinfo("--bluetooth")["list"]
/usr/lib/python3/dist-packages/kylin-assistant-daemon/systemdaemon/audioadaptorthread.py:193: adaptorList = self.cmdTool.loadInfoFromHwinfo("--sound")["list"]
/usr/lib/python3/dist-packages/kylin-assistant-daemon/sessiondaemon/kacmdtool.py:83: def loadInfoFromHwinfo(self, param):
/usr/lib/python3/dist-packages/kylin-assistant-daemon/sessiondaemon/kacmdtool.py:713: # diskList = cc.loadInfoFromHwinfo("--disk")
可见 hwinfo 的硬盘相关调用在 /usr/lib/python3/dist-packages/kylin-assistant-daemon/systemdaemon/kaharddiskinfo.py 的第 130 行。
处理
可以使用 sudo apt remove hwinfo 直接卸载掉 hwinfo,或者使用 sudo sed -i '130s/^/#/' /usr/lib/python3/dist-packages/kylin-assistant-daemon/systemdaemon/kaharddiskinfo.py 注释掉 hwinfo 调用。