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

Eri*_*ett 77 kernel

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

Lek*_*eyn 108

启动到 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
    
    Run Code Online (Sandbox Code Playgroud)
  4. (可选)当您连接到网络时,请使用 Live 环境中的 DNS 服务器(否则可能无法解析主机名):

    cp /etc/resolv.conf /mnt/etc/resolv.conf
    
    Run Code Online (Sandbox Code Playgroud)
  5. chroot 进入/mntsudo chroot /mnt
  6. 安装 Linux 内核:(apt-get install linux-image-generic不需要 sudo,因为你在 chroot 之后是 root)
  7. 成功安装内核后,退出 chroot 并卸载一些文件系统:

    exit
    sudo umount /mnt/sys
    sudo umount /mnt/proc
    sudo umount /mnt/dev
    sudo umount /mnt
    
    Run Code Online (Sandbox Code Playgroud)
  8. 重新启动并移除 CD 或 USB: sudo reboot

  • @James 编辑`/etc/resolv.conf`(如果它是符号链接,则将其删除)并在其中放入类似`nameserver 8.8.8.8` 的内容(Google 公共DNS 服务器)。如有必要,请更换它。 (5认同)
  • 净值。看起来我必须在 chroot 本身中编辑该文件。也许你应该在进入 chroot 之前添加答案`cp /etc/resolv.conf /mnt/etc/resolv.conf`。无论如何这对我有用 (3认同)

Eli*_*gan 62

这个扩展的过程解释了可能发生的大部分复杂情况,包括在 中连接到 Internet 的问题chroot,不知道要安装哪个内核包(在 Ubuntu 12.10 之前,它不会总是这样linux-image-generic),一开始不知道哪个分区甚至哪个物理驱动器包含/文件系统,并有一个单独的/boot分区。

虽然您会注意到一些相似之处,但我并未参考此处的任何其他过程来编写此内容。我确实基于这里的程序(尽管这些说明用于完全不同的东西,但我对它们进行了广泛的改编,并且只复制了一些命令,而不是散文)。

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

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

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

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

  4. 打开一个终端窗口Ctrl+ Alt+ T

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

     sudo parted -l
    
    Run Code Online (Sandbox Code Playgroud)

    您会看到类似这样的内容(但不会完全像这样):

    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!
    
    Run Code Online (Sandbox Code Playgroud)
  6. 检查您获得的输出,以确定包含安装在硬盘驱动器上的 Ubuntu 系统/文件系统的分区的设备名称(您正在修复)。

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

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

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

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

      Disk /dev/sda: 21.5GB
      Run Code Online (Sandbox Code Playgroud)
       1      1049kB  20.4GB  20.4GB  primary   ext4            boot
      Run Code Online (Sandbox Code Playgroud)
    • 如果您有多个物理驱动器,您将获得多个列表,如上所示。但是除非您安装了另一个类 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
    Run Code Online (Sandbox Code Playgroud)
  8. 检查您正在修复的损坏的 Ubuntu 系统是否有一个/boot必须单独挂载的单独分区。(如果你确定没有,你可以跳过这个。)

    要检查,请运行:

    ls /mnt/boot
    
    Run Code Online (Sandbox Code Playgroud)

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

    但是如果没有输出,那么你将不得不挂载/boot文件系统:

    sudo mount BOOT-PARTITION /mnt/boot
    Run Code Online (Sandbox Code Playgroud)

    替换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
    
    Run Code Online (Sandbox Code Playgroud)
  10. 确定 Internet 访问是否可以从内部chroot通过pinging 一些已知可以正常响应 ping 的可靠主机进行:

    ping -c 5 www.google.com
    
    Run Code Online (Sandbox Code Playgroud)

    您应该会看到如下内容:

    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
    
    Run Code Online (Sandbox Code Playgroud)
    • 如果看起来大体如此,并且之前的数字% packet loss小于 100,则说明 Internet 连接chroot正常:

      5 packets transmitted, 5 received, 0% packet loss, time 4006ms
      Run Code Online (Sandbox Code Playgroud)

      它正在工作,因此您可以跳过步骤 11

    • 如果看起来差不多,而且之前的数字% packet loss是 100,则连接需要故障排除。确保 live CD 系统上的连接(例如,通过 Web 浏览器,或通过在单独的、未chroot编辑的终端选项卡/窗口中运行相同的命令)工作。确保您正确输入命令。www.google.com如果你没去过,请使用。

    • 如果输出看起来根本不像上面那样,而是显示ping: unknown host www.google.com,那么网络在chroot.

  11. chroot. 除非您unknown host在上面的步骤 10 中遇到错误,否则请跳过此步骤。

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

    打开一个新的终端选项卡( Ctrl+ Shift+ T),或者,如果您愿意,可以打开一个新的终端窗口( 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
    
    Run Code Online (Sandbox Code Playgroud)

    (最后的exit命令关闭新选项卡/窗口。)

    重复上面的步骤 10 以确保现在可以从chroot. 这应该。

  12. 找出应该安装哪个内核包。通常,这将是linux-image-generic。但不总是。

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

    lsb_release -r
    
    Run Code Online (Sandbox Code Playgroud)
    • 在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
        
        Run Code Online (Sandbox Code Playgroud)

        输出将是3264

        (请注意,uname -m没有找到这个信息以正确的方式,因为在运行,即使chroot,这将告诉你的架构运行的内核,它是活的CD系统的内核,而不是安装(碎)系统的内核。)

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

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

        (这是Ubuntu的安装程序会选择如何哪一个成立,自从安装获得安装PAE内核的能力。见分辨率这个错误。如果您想了解PAE是什么,看到这个维基百科的文章。如果你想了解 Ubuntu 中的 PAE,请参阅此 Ubuntu wiki 页面。)

        如果您不知道自己有多少 RAM,请运行此命令以了解:

        grep MemTotal /proc/meminfo
        
        Run Code Online (Sandbox Code Playgroud)

        千字节为单位列出。要转换为GB,请除以 1,048,576 (1024 2 )。

        • 3 场演出 = 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
    Run Code Online (Sandbox Code Playgroud)

    linux-image-generic如果不同,请替换为您在上面的第 12 步中决定安装的任何其他内核包。

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

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

    cp /etc/hosts.old /etc/hosts
    
    Run Code Online (Sandbox Code Playgroud)
  15. 卸载文件系统,exitchroot:

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

免责声明:我没有在每个可能的Ubuntu 系统上测试上述过程,所以它可能存在我没有发现的错误。

将来,我建议始终尝试安装两个内核。最好有两个,以防其中一个因任何原因停止工作(您可以在 GRUB2 引导菜单中选择另一个)。另外,如果您打算保留两个内核,并且不小心卸载了一个超出您的预期并重新启动的内核,那么您仍然有一个可以从中引导。

  • 非常感谢 Eliah - 在愚蠢地删除了我所有的 linux 映像之后,你救了我的培根。我唯一遇到的问题是在这一步: sudo cp /etc/resolv.conf /mnt/etc/resolv.conf 我得到了一个“cp:没有通过悬挂符号链接`/mnt/etc/resolv.conf'写入”错误。我找到了这个 [thread](http://community.plus.net/forum/?topic=113899.msg981747) 并按照一张海报的说明:“rm /mnt/etc/resolv.conf”在“cp / etc/resolv.conf /mnt/etc/resolv.conf”来解决悬空符号链接问题。 (3认同)
  • 这应该是公认的答案。谢谢! (3认同)