如标题中所述 - 我的 Linux 内核似乎缺少对 iptables 正常运行至关重要的文件/目录。我可以通过重新安装内核来临时解决这个问题,但这不是永久解决,因为重新启动后我又回到了我开始的地方。
当我运行时,iptables -L
我收到一条错误消息,“也许 iptables 或您的内核需要升级。” 我发现我可以通过运行来解决此错误sudo apt-get install --reinstall linux-modules-5.8.0-59-generic
。我注意到重新安装后,我的目录中有其他文件和目录/lib/modules/5.8.0-59-generic
,这使我相信我的内核默认情况下缺少这些文件和目录,并导致 iptables 无法正常运行。重新启动后,它又会丢失这些文件/目录,并且 iptables 无法正常工作。
是否可以永久重新安装内核模块,所以我不必在每次重新启动后重新安装以使 iptables 工作?
我正在运行 Ubuntu 20.04.2,如上所述,我的内核是 5.8.0-59-generic。我很感激我能得到的任何帮助!
编辑:
我得到的输出ls /boot/vmlinuz*
是:[vmlinuz 输出]:https ://i.stack.imgur.com/dDroe.png或者作为文本:
/boot/vmlinuz /boot/vmlinuz-5.4.0-77-generic /boot/vmlinuz-5.8.0-48-generic /boot/vmlinuz-5.8.0-55-generic /boot/vmlinuz-5.8.0-59-generic /boot/vmlinuz.old
我得到的输出apt-cache policy linux-image-generic
是: [apt-cache output]: https://isstatic.askoverflow.dev/OY9Cj.png或者作为文本:
linux-image-generic: Installed: 5.4.0.77.80 Candidate: 5.4.0.77.80 Version table: *** 5.4.0.77.80 500 500 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages 500 http://archive.ubuntu.com/ubuntu focal-security/main amd64 Packages 100 /var/lib/dpkg/status 5.4.0.26.32 500 500 http://archive.ubuntu.com/ubuntu focal/main amd64 Packages
正在运行的计算机是戴尔 Optiplex 3020,其规格如下:
- CPU:四核 Intel(R) Core(TM) i5-4570 CPU @ 3.20 GHz
- 内存:8Gb 内存
编辑:我不确定这些命令的输出将如何帮助我,我非常感谢进一步的指导,因为我仍然没有接近解决这个问题!
您启动时使用的内核不是您安装的内核。简而言之,您安装的模块适用于另一个 - 可能是较旧或较新的内核,由引导加载程序选择,可能未更新。
您可以使用 来验证这一点
cat /proc/version
。这将显示当前运行的内核。apt install --reinstall linux-modules-`cut -d\ -f3 /proc/version`
应该安装正确的版本。您可以使用
dpkg -l|grep linux-
查看已安装的内容。至于让引导加载程序停止重新启动到相同的旧版本,
sudo update-grub
可能会解决这个问题。或者,您可以查看/boot/grub/grub.cfg
更多信息,或者在引导时按住Shift或按下ESC并选择适当的内核。(有关更多故障排除,请参阅https://askubuntu.com/questions/281119/how-do-you-run-update-grub)尽管 Linux 遵循“单片”设计,其中大多数功能都可以内置到内核本身中,但如今可用的功能如此之多,因此将尽可能多的功能(例如 iptables)移出“可加载内核模块”更有意义”。它有一个很棒的功能,可以根据需要“自动加载”这些模块 - 但这些模块通常非常特定于内核版本 - 它没有找到那些 - 看
ls /usr/lib/modules/*
- 是什么给了你错误消息。您可以查看当前加载了哪些模块
lsmod
。您还可以insmod
使用rmmod
. (参见man insmod
等等。)在过去的 30 年中,计算机发生了很大的变化,不仅将模块存储在主分区上,还需要将它们存储在临时 RAM 磁盘中
initrd
,因为有时需要这些模块来访问实际的硬盘驱动器或文件系统。update-grub
负责将所需模块的副本存储在initrd
相关 Linux 内核的相关文件中。通常,只要内核可以以某种方式读取您的根文件系统,您就可以使用任何内核启动任何 Linux 根文件系统。因此,您通常可以通过从实时可启动 Linux 启动,然后挂载您的主文件系统来轻松修复或备份您的系统。(要找到它,请参阅
lsblk
和mount
)要在您的实际系统上工作,即使您从另一个系统启动,请参阅chroot
。例如,如果您实时启动,并且您的硬盘显示为/dev/sdb1
then you canfsck /dev/sdb
然后mount /dev/sdb1 /mnt
,然后sudo mount -t proc - /mnt/sdb1/proc; sudo mount -o bind /dev /mnt/sdb1/dev; sudo chroot /mnt/sdb1
然后您可以运行apt install
orupdate-grub
和exit
andsudo reboot
。)由于许多因素 - 磁盘空间不足、电缆松动、硬件损坏、断电、EMF、宇宙射线,文件可能会损坏或丢失。现代软件擅长解决大部分问题。与其他系统相比,Linux 的优点在于它为您提供了更多修复它的机会,而不是仅仅重新安装 - 并更多地了解它在此过程中的工作方式。
对于@Titou ...我想我是因为内核损坏而出现这个错误??我通过备份和重新安装 Ubuntu 操作系统解决了这个问题。这样做之后,我就再也没有遇到过问题。