"FATAL: Module scsi_wait_scan not found" 解决方法

本文详细介绍了如何在dracut模块的90kernel-modules目录下,将本地块设备函数配置从'ata_scsi_ioctl|scsi_add_host|blk_init_queue|register_mtd_blktrans|scsi_esp_register|register_virtio_device'更改为'ata_scsi_ioctl|scsi_add_host|blk_mq_init_queue|register_mtd_blktrans|scsi_esp_register|register_virtio_device',并提供了相关链接和bugzilla问题跟踪。

修改文件: /usr/share/dracut/modules.d/90kernel-modules/installkernel

将 local blockfuncs='ata_scsi_ioctl|scsi_add_host|blk_init_queue|register_mtd_blktrans|scsi_esp_register|register_virtio_device'

改为 local blockfuncs='ata_scsi_ioctl|scsi_add_host|blk_mq_init_queue|register_mtd_blktrans|scsi_esp_register|register_virtio_device'


参见:

http://git.kernel.org/cgit/boot/dracut/dracut.git/commit/?id=faa17f09218ed7e2ce4362cc2d9319f8d5b7a37f


关于这个问题的 bugzilla:

https://bugzilla.kernel.org/show_bug.cgi?id=60758

<think>我们遇到的问题是执行 `modprobe nf_nat` 时出现错误:`FATAL: Module nf_nat not found in directory /lib/modules/4.4.0-19041-Microsoft`。 这个错误表明系统在指定的内核模块目录中找不到 `nf_nat` 模块。特别值得注意的是,内核版本字符串中包含 `Microsoft`,这暗示我们可能是在 Windows Subsystem for Linux (WSL) 的环境中运行。 ### 原因分析: 1. **WSL 1 的限制**:WSL 1 使用的是 Microsoft 构建的转换层,它并不支持加载自定义内核模块。WSL 1 的内核模块是预编译的,并且用户无法添加或修改。 2. **WSL 2 的改进**:WSL 2 使用了完整的 Linux 内核,但默认情况下,该内核可能并未包含所有模块,特别是像 `nf_nat` 这样的模块可能被排除以减小体积。 3. **模块不存在**:当前内核版本(4.4.0-19041-Microsoft)对应的模块目录中确实没有 `nf_nat` 模块。 ### 解决方案: #### 1. 确认 WSL 版本 运行以下命令检查 WSL 版本: ```bash uname -a # 或者 cat /etc/os-release ``` 如果内核版本中包含 `Microsoft` 且主版本号为4.x,通常是 WSL 1。 #### 2. 切换到 WSL 2(推荐) 如果当前是 WSL 1,建议升级到 WSL 2: - 步骤1:在 Windows 中启用“虚拟机平台”功能(需重启)。 - 步骤2:设置默认版本为 WSL 2: ```powershell wsl --set-default-version 2 ``` - 步骤3:转换现有发行版: ```powershell wsl --set-version <发行版名称> 2 ``` 然后重启 WSL 实例。 #### 3. 在 WSL 2 中检查内核模块 WSL 2 使用自己的 Linux 内核,但默认可能未启用 NAT 模块。可以尝试: - 更新 WSL 2 内核:通过 Windows Update 或手动下载最新内核([微软官网](https://docs.microsoft.com/en-us/windows/wsl/wsl2-kernel))。 - 检查内核配置:在 WSL 2 中运行: ```bash zcat /proc/config.gz | grep CONFIG_NF_NAT ``` 如果输出为 `CONFIG_NF_NAT=m` 或 `CONFIG_NF_NAT=y`,则支持 NAT 模块,但如果是 `=m`,需要加载模块(但WSL2默认可能未提供模块文件)。 注意:WSL 2 的内核模块通常位于 `/lib/modules/$(uname -r)/kernel` 下,但用户无法通过 `modprobe` 随意加载模块(因为内核是微软特别构建的,可能限制模块加载)。 #### 4. 替代方案:使用 Windows 功能 如果必须在 WSL 1/2 中使用 NAT 功能,且无法加载模块: - 使用 Windows 自带的端口转发(如 `netsh interface portproxy`)代替 iptables NAT。 - 对于 Docker,建议使用 Docker Desktop for Windows(它自带完整的 Linux 虚拟机,支持 NAT)。 #### 5. 其他注意事项 - 在 WSL 1 中,网络功能是通过翻译层实现的,因此 iptables 的很多功能(尤其是 NAT)不可用。 - WSL 2 虽然使用真实内核,但为了保持轻量,默认编译时可能去掉了部分模块。如果需要完整支持,可考虑使用虚拟机(如 VirtualBox)替代。 ### 总结 在 WSL 环境中加载内核模块(如 `nf_nat`)通常不可行,尤其是 WSL 1。升级到 WSL 2 并确保内核支持 NAT 是首选方案,但若仍失败,建议使用替代的网络配置方法或切换到完整的 Linux 虚拟机。 §§相关问题§§ 1. WSL 1 和 WSL 2 在 Linux 内核支持上有哪些主要区别? 2. 如何升级现有的 WSL 1 发行版到 WSL 2? 3. 在 WSL 2 中如何检查当前内核是否支持 iptables NAT 功能? 4. 如果在 WSL 中无法使用 iptables NAT,有哪些替代方法实现端口转发? </think>### 错误分析 错误信息 `modprobe: FATAL: Module nf_nat not found in directory /lib/modules/4.4.0-19041-Microsoft` 的核心问题在于: 1. **WSL 环境限制**:内核版本 `4.4.0-19041-Microsoft` 表明这是 Windows Subsystem for Linux (WSL),其内核由 Microsoft 定制编译,默认**不包含**标准 Linux 内核模块(如 `nf_nat`)。 2. **模块不可加载**:WSL 1 使用转换层模拟 Linux 系统调用,**不支持加载内核模块**;WSL 2 虽基于真实 Linux 内核,但微软构建时移除了 NAT 等网络模块以简化体积。 3. **路径验证失败**:`/lib/modules/4.4.0-19041-Microsoft` 目录下确实不存在 `nf_nat.ko` 等内核模块文件。 --- ### 解决方案 #### ▶ 方案1:切换至 WSL 2(推荐) WSL 2 使用完整 Linux 内核(版本 ≥5.10),但仍需手动启用 NAT 支持: 1. 在 Windows PowerShell 中升级默认版本: ```powershell wsl --set-default-version 2 ``` 2. 确认 WSL 2 内核支持 NAT: ```bash grep CONFIG_NF_NAT /proc/config.gz # 输出 CONFIG_NF_NAT=y 表示支持 ``` 3. **注意**:微软官方构建的 WSL 2 内核仍可能缺失模块,需自行编译内核([教程](https://docs.microsoft.com/zh-cn/windows/wsl/build-custom-kernel))。 #### ▶ 方案2:使用替代网络工具 在 WSL 中**无法直接使用 iptables NAT**,需改用: - **Windows 端口转发**(管理员 PowerShell): ```powershell netsh interface portproxy add v4tov4 listenport=80 connectport=80 connectaddress=127.0.0.1 ``` - **SSH 隧道**: ```bash ssh -L 8080:localhost:80 user@remote-server ``` #### ▶ 方案3:避开 NAT 依赖 - 容器环境(Docker):使用 Docker Desktop for Windows(自带完整网络栈)。 - 开发测试:改用基于 Hyper-V 的 Linux 虚拟机(如 Ubuntu VM)。 #### ▶ 方案4:验证 WSL 模式并降级 1. 检查当前模式: ```powershell wsl -l -v # 查看发行版及 WSL 版本 ``` 2. 若为 WSL 2 且需要降级: ```powershell wsl --set-version <发行版名称> 1 ``` **代价**:WSL 1 完全无法使用 iptables NAT。 --- ### 关键注意事项 - **WSL 1/2 均不支持 `modprobe` 加载自定义模块**,微软明确声明[此限制](https://github.com/microsoft/WSL/issues/834)。 - 若必须使用 iptables NAT,唯一可靠方案是**改用标准 Linux 物理机/虚拟机**。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值