正如标题中提到的那样 - 我的 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 输出]:https://i.stack.imgur.com/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
运行的计算机是 Dell Optiplex 3020,其规格为:
- CPU:四核 Intel(R) Core(TM) i5-4570 CPU @ 3.20 GHz
- 内存:8GB
编辑:我不确定这些命令的输出将如何帮助我,并且我真的很感激进一步的指导,因为我仍然没有接近解决这个问题!
答案1
您启动时使用的内核不是您安装的内核。简而言之,您安装的模块是另一个内核 - 可能是引导加载程序选择的较旧或较新的内核,可能未更新。
您可以使用 来验证这一点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
您可以fsck /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
或update-grub
和exit
和sudo reboot
。)
文件可能因多种因素而损坏或丢失 - 磁盘空间不足、电缆松动、硬件损坏、断电、电磁场、宇宙射线。现代软件擅长解决其中的大部分问题。与其他系统相比,Linux 的优点在于它为您提供了更多修复机会,而不仅仅是重新安装 - 并在修复过程中了解更多有关其工作原理的信息。
答案2
对于@Titou...我认为我遇到此错误是因为内核损坏?我通过备份并重新安装 Ubuntu 操作系统解决了该问题。执行此操作后,我再也没有遇到过问题。
答案3
我遇到了类似的问题,包 iptables 在重新启动时被删除,并解决了它这方式。