意外删除所有内核后如何还原系统?


Answers:


93

引导到实时CD(或实时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无需sudo,因为您在chroot之后是root)
  7. 成功安装内核后,退出chroot并卸载一些文件系统:

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

这就是我的建议。我不明白为什么它不起作用。
奥利(Oli)

好的,谢谢您的确认。我还添加了完成步骤,正在卸载/mnt。Ubuntu通常负责卸载/同步文件系统,但是对我来说这看起来更干净。
Lekensteyn

1
@MaheshKatta您需要首先安装RAID。因此,您将映射一个/dev/mdxxx驱动器-假设它是mdadm,而不是第二步(在其中安装单个驱动器)。
奥利(Oli)

4
@James Edit /etc/resolv.conf(如果它是符号链接,请将其删除),然后nameserver 8.8.8.8在其中放入类似内容(Google公共DNS服务器)。如有必要,请更换它。
Lekensteyn 2014年

3
Nvm。看来我必须在chroot本身中编辑文件。也许您应该cp /etc/resolv.conf /mnt/etc/resolv.conf在进入chroot之前添加答案。无论如何,这对我都有效
Peter Raeves 2015年

56

扩展程序占了大多数可能发生的并发症,包括连接于互联网的问题chroot,不知道要安装的内核包(Ubuntu的12.10之前,它不会永远linux-image-generic),不知道当初哪个分区,甚至哪个物理驱动器包含/文件系统,并具有单独的/boot分区。

尽管您会注意到一些相似之处,但我没有在这里参考其他任何过程编写此文档。我确实是基于此处的过程(尽管这些指令是针对完全不同的东西,但我已经对其进行了广泛的修改,并且仅复制了一些命令而不是散文)是基于此过程的。

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

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

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

  3. 当桌面启动时,请确保您已连接到Internet。如果不是,请连接到Internet。查看您是否已连接到Internet的一种方法是打开Web浏览器。您甚至可以通过在现场CD / DVD / USB系统的Web浏览器中显示“询问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分区,则可能是第一个分区。但是,如果第一个/boot分区很小(小于1 GB),则该分区可能是一个单独的分区(也请记住一个分区)。

      请注意,是否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. 确定是否上网从内部工作chrootping荷兰国际集团,是已知的正常响应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. 在中设置网络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
    

    (最后的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位实时CD来修复已安装的32位系统。因此,如果您不知道安装的Ubuntu系统是32位还是64位,请通过运行以下命令进行检查(在中chroot而不是在单独的终端窗口/标签中):

        dpkg-architecture -qDEB_HOST_ARCH_BITS
        

        输出将是3264

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

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

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

        (自从安装程序获得安装PAE内核的能力以来,Ubuntu的安装程序便会选择该方法进行安装。请参见此错误的解决方法。如果想了解PAE是什么,请参阅此Wikipedia文章。了解Ubuntu中的PAE,请参见Ubuntu Wiki页面。)

        如果您不知道自己有多少RAM,请运行以下命令找出:

        grep MemTotal /proc/meminfo
        

        千字节为单位列出。要转换为千兆字节,请除以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

    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引导菜单中选择另一个)。另外,如果您打算保留两个内核,并且不小心卸载了一个以上的内核并重新启动,则仍然有一个内核可以引导。


1
这可能是我所读过的关于如何在Linux中执行复杂操作的最佳书面说明。谢谢
ZincX 2012年

哇,这超级有帮助!非常感谢!
拉斐尔·西拉克(RafałCieślak)2013年

2
非常感谢Eliah-愚蠢地删除了我所有的Linux映像之后,您保存了我的培根。我唯一遇到的麻烦是:sudo cp /etc/resolv.conf /mnt/etc/resolv.conf我得到了一个“ cp:不通过悬挂的符号链接'/mnt/etc/resolv.conf'写入”错误。我找到了这个线程,并按照一个海报的指示进行操作:在“ cp /etc/resolv.conf /mnt/etc/resolv.conf”之前添加“ rm /mnt/etc/resolv.conf”,以解决悬空的符号链接问题。

@ xcal400 /etc/resolv.conf现在由管理resolvconf,它在使用NetworkManager时会自动生成,并且可以安全地使用rm /etc/resolv.conf发现的方式将其删除。
Lekensteyn

3
这个应该是公认的答案。谢谢!
Jean-Michel Garcia'Feb

0

当我删除内核时,我在Ubuntu论坛上找到了该解决方案。我遵循了所有步骤,系统得以恢复。希望对您有帮助。

chroot可能有效,chroot表示启动系统时更改根文件系统。例如,您从实时CD开始,但是将根目录“ /”更改为ubuntu的安装位置。

假设您的ubuntu安装在/ dev / sda2上,那么您可以尝试以下命令:

码:

sudo mount /dev/sda2 /mnt
sudo cp /etc/resolv.conf /mnt/etc/
sudo cp /etc/hosts /mnt/etc/
sudo mount --bind /dev/ /mnt/dev
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
dbus-uuidgen > /var/lib/dbus/machine-id
dpkg-divert --local --rename --add /sbin/initctl
ln -s /bin/true /sbin/initctl

现在您的根目录为“ /”,位于/ dev / sda2上,请尝试安装内核

apt-get update
apt-get install linux-image-2.6.32-26-generic
update-initramfs -cv -k all
update-grub

我不得不在这里做一些猜测,因为我以前从未做过,但这应该是关于它的。不知道您是否收到一些fstab错误警告(例如找不到root)。

现在,您需要清理一些东西并卸载已安装的分区:代码:

rm /etc/resolv.conf
rm /etc/hosts
rm /var/lib/dbus/machine-id
rm /sbin/initctl
dpkg-divert --rename --remove /sbin/initctl
umount /proc # if this doesn't work try umount -lf /proc
umount /sys
umount /dev/pts
exit
sudo umount /mnt

然后您可以重新启动以查看它是否有效。

线程的URL:http : //art.ubuntuforums.org/showthread.php?t=1688928


为什么要更换/etc/hosts和拆卸/sbin/initctl?在那里是有原因的。
Lekensteyn 2011年

这似乎最终基于LiveCDCustomization;修复已安装的系统不需要执行某些步骤。特别是,不需要使用/sbin/initctldbus-uuidgen或做任何事情dpkg-divert。您可能需要更换/etc/hosts才能连接到Internet,但通常不需要,并且,如果这样做,则应放回原件。在已安装的系统(而不是先引导然后解压squashfs文件系统的实时CD)上,您不必运行update-initramfs甚至不需要update-grub安装内核。
伊莱亚·卡根

另外,由于此过程不会安装任何内核元软件包,因此除非安装了元软件包,否则以后可能无法正确更新内核。此外,linux-image-2.6.32-26-generic对于大多数人来说,它并不是正确的内核。
伊利亚·卡根

0

之后,我从昨天Trusty14.04删除旧的内核(FTR:我并没有删除这两个最近期的!)我的系统将不再启动。GRUB显示

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

不知道为什么。

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

幸运的是,我找到了此页面。该Boot-Repair工具正确无误,我的系统再次运行。


0

我只是想补充一下我今天升级到Willy的经历。我整理了一下,发现自己只有记忆力测试。google让我了解到我已经删除了内核。我遇到的一个限制是网络速度慢,因此不能选择下载完整的ISO。因此,我使用Ubuntu Minimal CD(仅40MB)并在其上启动。在检测到硬件选件(帮助我连接到无线设备)之后,我进入了外壳选件。我遵循@Lekensteyn的说明,成功了。不过有几件事:您必须先进行复制,resolv.conf然后再使用chroot,否则DNS将被搞砸,并且由于已登录的用户,因此root无需在任何地方使用sudo。

我知道它的存在,但是我认为添加此答案将为那些会遇到此问题的人们增加价值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.