意外删除所有内核后如何恢复系统?

意外删除所有内核后如何恢复系统?

我试图删除旧内核,但一定是删除了 Ubuntu 11.04 笔记本电脑上的所有内核。有没有办法通过 USB 启动或在另一个系统上安装硬盘来解决这个问题?

答案1

启动到 live CD(或 live USB),挂载一些系统,chroot 进入其中并安装内核。成功安装内核后,卸载文件系统。

  1. 打开终端
  2. 挂载 Ubuntu 分区:sudo mount /dev/sdXY /mnt
  3. 挂载一些特殊分区:

    sudo mount --bind /dev /mnt/dev
    sudo mount --bind /proc /mnt/proc
    sudo mount --bind /sys /mnt/sys
    
  4. (可选)当您连接到网络时,请使用 Live 环境中的 DNS 服务器(否则主机名可能无法解析):

    cp /etc/resolv.conf /mnt/etc/resolv.conf
    
  5. Chroot 进入/mntsudo chroot /mnt
  6. 安装 Linux 内核:apt-get install linux-image-generic(chroot 后,由于您是 root 用户,因此不需要 sudo)
  7. 成功安装内核后,退出 chroot 并卸载一些文件系统:

    exit
    sudo umount /mnt/sys
    sudo umount /mnt/proc
    sudo umount /mnt/dev
    sudo umount /mnt
    
  8. 重新启动并移除 CD 或 USB:sudo reboot

答案2

扩展程序解决了大多数可能发生的复杂情况,包括无法连接到互联网chroot,不知道要安装哪个内核包(在 Ubuntu 12.10 之前,它不会总是linux-image-generic),一开始并不知道哪个分区甚至哪个物理驱动器包含文件/系统,并且有一个单独的/boot分区。

我写这篇文章时并没有参考这里的其他程序,尽管你会注意到一些相似之处。我确实大致基于此处的程序(尽管这些说明针对的是完全不同的东西,但我对它们进行了广泛的改编,并且只复制了一些命令,而不是散文)。

你删除了所有内核包,Ubuntu 在没有安装内核的情况下无法启动。因此,解决方案是从实时 CD/DVD/USB 启动,chroot进入已安装的系统,并在其中安装内核。

  1. 从 Ubuntu 实时 CD/DVD 或实时 USB 闪存驱动器启动。

  2. 选择尝试 Ubuntu(不是安装 Ubuntu)。

  3. 当桌面出现时,请确保您已连接到互联网。如果没有,请连接到互联网。查看您是否已连接到互联网的一种方法是打开 Web 浏览器。您甚至可以按照其余说明,在实时 CD/DVD/USB 系统中的 Web 浏览器中打开此 Ask Ubuntu 答案。我强烈建议您这样做。

  4. Ctrl使用+ Alt+打开终端窗口T

  5. 在终端窗口中,运行此命令以列出您的分区:

     sudo parted -l
    

    你会看到类似这样的内容(但不会是确切地像这样):

    Model: VMware, VMware Virtual S (scsi)
    Disk /dev/sda: 21.5GB
    Sector size (logical/physical): 512B/512B
    Partition Table: msdos
    
    Number  Start   End     Size    Type      File system     Flags
     1      1049kB  20.4GB  20.4GB  primary   ext4            boot
     2      20.4GB  21.5GB  1072MB  extended
     5      20.4GB  21.5GB  1072MB  logical   linux-swap(v1)
    
    
    Warning: Unable to open /dev/sr0 read-write (Read-only file system).  /dev/sr0
    has been opened read-only.
    Error: Can't have a partition outside the disk!
    
  6. 检查所得到的输出,以确定包含/文件系统安装在您正在修复的硬盘上的 Ubuntu 系统。

    • 如果您只有一个ext4分区,那就是这个分区。

    • 如果您有多个ext4分区,那么它可能是第一个分区。但是,如果第一个分区非常小(小于 1 GB),那么它可能是一个单独的/boot分区(也请记住这个分区)。

      请注意,下面是否boot列出Flags与分区是否为单独分区关系不大/boot。我的系统(其信息列于上方)不是有一个单独的/boot分区。

    • 分区的设备名称以物理驱动器的设备名称开头,紧接着Disk第二行。然后只需将分区号添加到末尾即可。因此,包含以下分区的设备名称我的 /文件系统是/dev/sda1。以下是我找到该信息的两行:

      Disk /dev/sda: 21.5GB
       1      1049kB  20.4GB  20.4GB  primary   ext4            boot
    • 如果您有多个物理驱动器,您将获得多个列表,如上所示。但除非您安装了另一个类 Unix 系统,否则您可能只有一个包含ext4分区的驱动器,至少没有故意在另一个驱动器上创建它们。如果您确实有多个带分区的驱动器ext4,那么ext4包含/文件系统的分区可能位于包含一个linux-swap分区。

    • 它是可能的您的 Ubuntu 系统的/文件系统位于 以外的分区类型上ext4。发生这种情况时,几乎总是ext3,并且几乎总是在相当旧的系统上。这种情况很少见,除非您自己有意这样设置。

    记住包含文件系统的分区的设备名称/(或将其写下来)。如果它不同于/dev/sda1,然后你将替换/dev/sda1按照以下步骤操作。

    (如果看起来您有一个单独的/boot分区,也请记住该设备名称。)

  7. /文件系统挂载到/mnt,并挂载其/dev文件系统:

    sudo mount /dev/sda1 /mnt
    sudo mount --bind /dev /mnt/dev
  8. 检查你正在修复的损坏的 Ubuntu 系统是否有单独的/boot分区,必须单独安装。(如果你当然如果没有,你可以跳过这一步。

    要检查,请运行:

    ls /mnt/boot
    

    如果有输出(类似grub memtest86+.bin memtest86+_multiboot.bin,但不一定完全相同),则损坏的系统/boot与其位于同一分区上/,您无需挂载任何东西即可访问它。

    但如果没有输出,那么您将必须挂载/boot文件系统:

    sudo mount BOOT-PARTITION /mnt/boot

    代替BOOT-PARTITION使用分区的设备名称/boot(参见上面的步骤6)。

  9. chroot进入损坏的系统,挂载剩余的重要虚拟文件系统,并设置一些重要的环境变量:

    sudo chroot /mnt
    mount -t proc none /proc
    mount -t sysfs none /sys
    mount -t devpts none /dev/pts
    export HOME=/root
    export LC_ALL=C
    
  10. 确定互联网访问是否chroot有效ping一些已知可以正常响应 ping 的可靠主机:

    ping -c 5 www.google.com
    

    你应该看到类似这样的内容:

    PING www.l.google.com (74.125.131.147) 56(84) bytes of data.
    64 bytes from vc-in-f147.1e100.net (74.125.131.147): icmp_req=1 ttl=44 time=61.3 ms
    64 bytes from vc-in-f147.1e100.net (74.125.131.147): icmp_req=2 ttl=44 time=62.3 ms
    64 bytes from vc-in-f147.1e100.net (74.125.131.147): icmp_req=3 ttl=44 time=61.8 ms
    64 bytes from vc-in-f147.1e100.net (74.125.131.147): icmp_req=4 ttl=44 time=63.8 ms
    64 bytes from vc-in-f147.1e100.net (74.125.131.147): icmp_req=5 ttl=44 time=66.6 ms
    
    --- www.l.google.com ping statistics ---
    5 packets transmitted, 5 received, 0% packet loss, time 4006ms
    rtt min/avg/max/mdev = 61.367/63.212/66.608/1.897 ms
    
    • 如果看起来大致如此,并且之前的数字% packet loss小于 100,则表示 Internet 连接正常chroot

      5 packets transmitted, 5 received, 0% packet loss, time 4006ms

      它正在发挥作用,所以你可以跳过步骤 11

    • 如果看起来大致如此,并且之前的数字% packet loss是 100,则需要对连接进行故障排除。确保实时 CD 系统上的连接(例如,通过 Web 浏览器,或在单独的非终端chroot选项卡/窗口中运行相同的命令)有效。确保您正确输入了命令。www.google.com如果您还没有这样做,请使用。

    • 如果输出根本不像上面的内容,而是显示ping: unknown host www.google.com,那么网络尚未正常工作chroot

  11. 在 中设置网络chrootunknown host除非上面第 10 步出现错误,否则请跳过此步骤。

    要设置网络,请备份损坏的系统的hosts文件,并复制实时 CD 系统的hostsresolv.conf文件。(您不必备份损坏系统的版本resolv.conf,因为该文件会自动实时重新生成。)

    打开新的终端选项卡Ctrl++ ShiftT或者,如果你愿意的话,新的终端窗口Ctrl+ Shift+ N,或者只是Ctrl+ Alt+ T)。在其中运行以下命令:

    sudo cp /mnt/etc/hosts /mnt/etc/hosts.old
    sudo cp /etc/hosts /mnt/etc/hosts
    sudo cp /etc/resolv.conf /mnt/etc/resolv.conf
    exit
    

    exit最后的命令关闭新标签/窗口。)

    重复上述第 10 步,确保 Internet 访问现在可从 内正常工作chroot。应该可以。

  12. 确定应该安装哪个内核包。通常情况下,这将是linux-image-generic。但并非总是如此。

    如果你不确定要安装哪个版本,这将部分取决于你安装了哪个 Ubuntu 版本,部分取决于其他信息。如果你不确定安装了哪个 Ubuntu 版本,请通过运行此命令(在 中)来查找chroot不是在单独的终端窗口/选项卡中):

    lsb_release -r
    
    • 在 Ubuntu 12.10(下一个 Ubuntu 版本,目前正在开发中)上,它总是将会linux-image-generic。(见, 和

    • 在 Ubuntu 12.04 LTS 上,可能的可能性是linux-image-genericlinux-image-generic-pae。(与以前的版本不同,12.04 不再具有单独的服务器和桌面内核。)

      • 如果安装的 Ubuntu 系统(您正在修复)是 64 位版本,请使用linux-image-generic。(linux-image-generic-pae仅适用于 32 位系统。)

        可以在 32 位或 64 位计算机上安装 32 位 Ubuntu 系统。此外,您可能正在使用 32 位或 64 位 Live CD 来修复已安装的 32 位系统。因此,如果您不知道安装Ubuntu系统是 32 位还是 64 位,请通过运行此命令进行检查(在 中chroot不是在单独的终端窗口/选项卡中):

        dpkg-architecture -qDEB_HOST_ARCH_BITS
        

        输出将是3264

        uname -m(请注意不是找到这些信息的正确方法,因为即使在运行时chroot,它也会告诉你的架构运行内核,这是 Live CD 系统的内核,而不是已安装的(已损坏的)系统的内核。)

      • 如果安装的 Ubuntu 系统(您正在修复)是 32 位版本,则使用的最佳内核将取决于您有多少 RAM。我建议:

        • linux-image-generic如果你的 RAM 小于 3 GB
        • linux-image-generic-pae如果您有 3 GB 或更多的 RAM。

        (自从 Ubuntu 安装程序获得安装 PAE 内核的能力以来,它就是这样选择安装哪一个的。参见决议这个错误。如果你想了解什么是 PAE,请参阅这篇维基百科文章。如果你想了解 Ubuntu 中的 PAE,请参阅这个 Ubuntu 维基页面

        如果你不知道你有多少 RAM,请运行以下命令来查找:

        grep MemTotal /proc/meminfo
        

        列在千字节. 转换为千兆字节,除以 1,048,576(1024 2)。

        • 3 GB = 3,145,728 kB
    • 在 Ubuntu 版本上12.04,可能的可能性是linux-image-genericlinux-image-generic-paelinux-image-server

      • 如果您正在运行 Ubuntu Server 系统,请使用linux-image-server
      • 否则,请按照上述针对 12.04 系统的建议进行操作。
  13. 这是您期盼已久的时刻!在损坏的系统中安装内核。

    (与以前一样,除非另有明确说明,这些命令在中运行chroot,而不是在单独的终端窗口/选项卡中运行。)

    apt-get update
    apt-get -y install linux-image-generic

    代替linux-image-generic与您在上面的第 12 步中决定安装的任何其他内核包(如果不同)一起。

  14. 如果您必须执行步骤 11 来设置网络chroot,请恢复旧hosts文件。如果您跳过了步骤 11,请也跳过此步骤。

    要恢复它,请运行以下命令:

    cp /etc/hosts.old /etc/hosts
    
  15. 卸载文件系统,exit退出chroot

    umount /proc || umount -lf /proc
    umount /sys /dev/pts
    exit
    sudo umount /mnt/dev /mnt
    
  16. 关闭实时 CD/DVD/USB 系统,移除实时 CD/DVD 或 USB 闪存驱动器。启动您刚刚修复的硬盘上安装的系统。您已在其中安装了一个内核包(作为安装的一部分,它提供的内核将重新添加到 GRUB2 启动菜单中)。如果一切正常,您的系统应该可以顺利启动。(我认为这次启动时间可能会比平时长一点。)

免责声明:我没有测试上述程序尽一切可能Ubuntu 系统,因此可能存在我尚未发现的错误。

在未来,我建议始终努力保持内核安装。最好有两个,以防其中一个因任何原因停止工作(您可以在 GRUB2 启动菜单中选择另一个)。另外,如果您打算保留内核,并且您意外地卸载了一个比您想要卸载的多的内核并重新启动,但您仍然有一个内核需要启动。

答案3

我只是想补充一下我今天升级 Willy 的经历。我清理了一下,发现只有 memtest。google 让我明白我已经删除了内核。我的一个限制是网络速度很慢,所以下载完整的 ISO 不是选项。所以我用了Ubuntu 最小 CD(仅 40MB)并启动它。在检测到硬件选项(帮助我连接到无线)后,我进入了 shell 选项。我按照 @Lekensteyn 的指示操作,成功了。不过有几点需要注意:你必须resolv.conf在进入 chroot 之前进行复制,否则你的 DNS 将被搞砸,而且由于登录用户是 root,所以在任何地方都不需要 sudo。

我知道这已经很老了,但我认为添加这个答案将为那些遇到此问题的人增加价值。

答案4

昨天我从 Trusty14.04 中删除了旧内核后(FTR:我确实不是删除最近的两个!)我的系统无法启动了。 GRUB 显示

Error: File not found
Error: You need to load the kernel first

不知道为什么。

然后我跟着Eliah Kagan 的出色指导从 Live CD安装linux-image-generic。它确实安装了 150 MB 的新内核,但遗憾的是这并没有解决问题。

幸运的是,我发现这一页。该Boot-Repair工具已修复,我的系统已重新运行。

相关内容