.. SPDX-License-Identifier: GPL-2.0 .. include:: ../../disclaimer-vi.rst :Original: Documentation/fault-injection/nvme-fault-injection.rst :Translator: Google Translate (machine translation) :Upstream-at: 8541d8f725c6 .. warning:: Tài liệu này được dịch tự động bằng máy và chưa được review bởi người dịch. Nội dung có thể không chính xác hoặc khó hiểu ở một số chỗ. Khi có sự khác biệt với bản gốc, bản gốc luôn là chuẩn. Bản dịch chất lượng cao (được review) được đặt trong thư mục vi_VN/. Tiêm lỗi NVMe ==================== Khung tiêm lỗi của Linux cung cấp một cách có hệ thống để hỗ trợ chèn lỗi thông qua debugfs trong thư mục /sys/kernel/debug. Khi nào được bật, NVME_SC_INVALID_OPCODE mặc định không thử lại sẽ là được đưa vào nvme_try_complete_req. Người dùng có thể thay đổi trạng thái mặc định mã và không có cờ thử lại thông qua debugfs. Danh sách lệnh chung Trạng thái có thể được tìm thấy trong include/linux/nvme.h Các ví dụ sau đây cho thấy cách đưa lỗi vào nvme. Đầu tiên, kích hoạt cấu hình kernel CONFIG_FAULT_INJECTION_DEBUG_FS, biên dịch lại kernel. Sau khi khởi động kernel, hãy thực hiện theo dõi. Ví dụ 1: Chèn mã trạng thái mặc định mà không cần thử lại --------------------------------------------------------- :: gắn kết/dev/nvme0n1/mnt echo 1 > /sys/kernel/debug/nvme0n1/fault_inject/times echo 100 > /sys/kernel/debug/nvme0n1/fault_inject/xác suất cp a.file /mnt Kết quả mong đợi:: cp: không thể stat ‘/mnt/a.file’: Lỗi đầu vào/đầu ra Tin nhắn từ dmesg:: FAULT_INJECTION: buộc phải thất bại. tên error_inject, khoảng 1, xác suất 100, khoảng trắng 0, lần 1 CPU: 0 PID: 0 Comm: bộ trao đổi/0 Không bị nhiễm bẩn 4.15.0-rc8+ #2 Tên phần cứng: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 01/12/2006 Theo dõi cuộc gọi: dump_stack+0x5c/0x7d nên_fail+0x148/0x170 nvme_ Should_fail+0x2f/0x50 [nvme_core] nvme_process_cq+0xe7/0x1d0 [nvme] nvme_irq+0x1e/0x40 [nvme] __handle_irq_event_percpu+0x3a/0x190 xử lý_irq_event_percpu+0x30/0x70 hand_irq_event+0x36/0x60 xử lý_fasteoi_irq+0x78/0x120 xử lý_irq+0xa7/0x130 ? tick_irq_enter+0xa8/0xc0 do_IRQ+0x43/0xc0 common_interrupt+0xa2/0xa2 RIP: 0010:native_safe_halt+0x2/0x10 RSP: 0018:ffffffff82003e90 EFLAGS: 00000246 ORIG_RAX: ffffffffffffffdd RAX: ffffffff817a10c0 RBX: ffffffff82012480 RCX: 00000000000000000 RDX: 0000000000000000 RSI: 00000000000000000 RDI: 0000000000000000 RBP: 00000000000000000 R08: 000000008e38ce64 R09: 0000000000000000 R10: 0000000000000000 R11: 00000000000000000 R12: ffffffff82012480 R13: ffffffff82012480 R14: 0000000000000000 R15: 00000000000000000 ? __sched_text_end+0x4/0x4 default_idle+0x18/0xf0 do_idle+0x150/0x1d0 cpu_startup_entry+0x6f/0x80 start_kernel+0x4c4/0x4e4 ? set_init_arg+0x55/0x55 thứ cấp_startup_64+0xa5/0xb0 print_req_error: Lỗi I/O, dev nvme0n1, khu vực 9240 Lỗi EXT4-fs (thiết bị nvme0n1): ext4_find_entry:1436: inode #2: comm cp: đọc thư mục lblock 0 Ví dụ 2: Chèn mã trạng thái mặc định bằng thử lại ------------------------------------------------- :: gắn kết/dev/nvme0n1/mnt echo 1 > /sys/kernel/debug/nvme0n1/fault_inject/times echo 100 > /sys/kernel/debug/nvme0n1/fault_inject/xác suất echo 1 > /sys/kernel/debug/nvme0n1/fault_inject/status echo 0 > /sys/kernel/debug/nvme0n1/fault_inject/dont_retry cp a.file /mnt Kết quả mong đợi:: lệnh thành công không có lỗi Tin nhắn từ dmesg:: FAULT_INJECTION: buộc phải thất bại. tên error_inject, khoảng 1, xác suất 100, khoảng trắng 0, lần 1 CPU: 1 PID: 0 Comm: bộ trao đổi/1 Không bị nhiễm độc 4.15.0-rc8+ #4 Tên phần cứng: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 01/12/2006 Theo dõi cuộc gọi: dump_stack+0x5c/0x7d nên_fail+0x148/0x170 nvme_ Should_fail+0x30/0x60 [nvme_core] nvme_loop_queue_response+0x84/0x110 [nvme_loop] nvmet_req_complete+0x11/0x40 [nvmet] nvmet_bio_done+0x28/0x40 [nvmet] blk_update_request+0xb0/0x310 blk_mq_end_request+0x18/0x60 Flush_smp_call_function_queue+0x3d/0xf0 smp_call_function_single_interrupt+0x2c/0xc0 call_function_single_interrupt+0xa2/0xb0 RIP: 0010:native_safe_halt+0x2/0x10 RSP: 0018:ffffc9000068bec0 EFLAGS: 00000246 ORIG_RAX: ffffffffffffff04 RAX: ffffffff817a10c0 RBX: ffff88011a3c9680 RCX: 00000000000000000 RDX: 0000000000000000 RSI: 00000000000000000 RDI: 0000000000000000 RBP: 00000000000000001 R08: 000000008e38c131 R09: 0000000000000000 R10: 0000000000000000 R11: 00000000000000000 R12: ffff88011a3c9680 R13: ffff88011a3c9680 R14: 0000000000000000 R15: 0000000000000000 ? __sched_text_end+0x4/0x4 default_idle+0x18/0xf0 do_idle+0x150/0x1d0 cpu_startup_entry+0x6f/0x80 start_secondary+0x187/0x1e0 thứ cấp_startup_64+0xa5/0xb0 Ví dụ 3: Chèn lỗi vào lệnh quản trị viên thứ 10 ------------------------------------------------------ :: echo 100 > /sys/kernel/debug/nvme0/fault_inject/xác suất echo 10 > /sys/kernel/debug/nvme0/fault_inject/space echo 1 > /sys/kernel/debug/nvme0/fault_inject/times thiết lập lại nvme/dev/nvme0 Kết quả mong đợi:: Sau khi đặt lại bộ điều khiển NVMe, quá trình khởi tạo lại có thể thành công hoặc không. Nó phụ thuộc vào lệnh quản trị nào thực sự bị buộc phải thất bại. Tin nhắn từ dmesg:: nvme nvme0: đặt lại bộ điều khiển FAULT_INJECTION: buộc phải thất bại. tên error_inject, khoảng 1, xác suất 100, khoảng trắng 1, lần 1 CPU: 0 PID: 0 Comm: bộ chuyển đổi/0 Không bị nhiễm bẩn 5.2.0-rc2+ #2 Tên phần cứng: MSI MS-7A45/B150M MORTAR ARCTIC (MS-7A45), BIOS 1.50 25/04/2017 Theo dõi cuộc gọi: dump_stack+0x63/0x85 nên_fail+0x14a/0x170 nvme_ Should_fail+0x38/0x80 [nvme_core] nvme_irq+0x129/0x280 [nvme] ? blk_mq_end_request+0xb3/0x120 __handle_irq_event_percpu+0x84/0x1a0 xử lý_irq_event_percpu+0x32/0x80 hand_irq_event+0x3b/0x60 xử lý_edge_irq+0x7f/0x1a0 xử lý_irq+0x20/0x30 do_IRQ+0x4e/0xe0 common_interrupt+0xf/0xf RIP: 0010:cpuidle_enter_state+0xc5/0x460 Mã: ff e8 8f 5f 86 ff 80 7d c7 00 74 17 9c 58 0f 1f 44 00 00 f6 c4 02 0f 85 69 03 00 00 31 ff e8 62 aa 8c ff fb 66 0f 1f 44 00 00 <45> 85 ed 0f 88 37 03 00 00 4c 8b 45 d0 4c 2b 45 b8 48 ba cf f7 53 RSP: 0018:ffffffff88c03dd0 EFLAGS: 00000246 ORIG_RAX: ffffffffffffffdc RAX: ffff9dac25a2ac80 RBX: ffffffff88d53760 RCX: 0000000000000001f RDX: 0000000000000000 RSI: 000000002d958403 RDI: 0000000000000000 RBP: ffffffff88c03e18 R08: fffffff75e35ffb7 R09: 00000a49a56c0b48 R10: ffffffff88c03da0 R11: 0000000000001b0c R12: ffff9dac25a34d00 R13: 0000000000000006 R14: 00000000000000006 R15: ffffffff88d53760 cpuidle_enter+0x2e/0x40 call_cpuidle+0x23/0x40 do_idle+0x201/0x280 cpu_startup_entry+0x1d/0x20 phần còn lại_init+0xaa/0xb0 Arch_call_rest_init+0xe/0x1b start_kernel+0x51c/0x53b x86_64_start_reservations+0x24/0x26 x86_64_start_kernel+0x74/0x77 thứ cấp_startup_64+0xa4/0xb0 nvme nvme0: Không thể đặt số lượng hàng đợi (16385) nvme nvme0: Hàng đợi IO chưa được tạo