我正在运行 Ubuntu 12.04 LTS LAMP 服务器。在运行 apt-get dist-upgrade 后,我收到一条错误消息,指出我的根目录已满,因此按照我在网上找到的说明,我使用 apt-get 卸载了一些旧内核。但是,我不知何故不小心卸载了所有内核。我的系统现在不会重新启动。
我在 2011 年找到了一个关于解决此问题的线程 如何在意外删除所有内核后恢复系统?
但是当我尝试按照说明进行操作时,它们对我不起作用。
当我这样做时:
sudo parted -l
我明白了:
Model: ATA WDC WD20EZRX-00D (scsi)
Disk /dev/sda: 2000GB
Sector size (logical/physical): 512B/4096B
Partition Table: msdos
Number Start End Size Type File system Flags
1 1049kB 256MB 255MB primary ext2 boot
2 257MB 2000GB 2000GB extended
5 257MB 2000GB 2000GB logical lvm
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)
我不明白为什么分区 1 是 ext2,因为这是 12.04 LTS 的全新安装,但我按照指示执行了此命令:
sudo mount /dev/sda1 /mnt
然后我尝试了这个命令:
sudo mount --bind /dev /mnt/dev
它说找不到挂载点。
所以,我这样做了:
mkdir /mnt/dev
然后它做了安装。
好的,现在我已准备好按照说明使用 chroot:
sudo chroot /mnt
我明白了:
chroot: failed to run command '/bin/bash': No such file or directory
我提前道歉,但我对 linux 了解不够,无法弄清楚这里发生了什么。有人可以帮我吗?我需要很长时间才能在我的服务器上重新安装所有内容。
更新: 感谢您的回答。当我进入
sudo pvs
Run Code Online (Sandbox Code Playgroud)
我得到:
PV VG Fmt Attr PSize PFree
/dev/sda5 HOP-Server lvm2 a- 1.82t 136.00m
Run Code Online (Sandbox Code Playgroud)
然后,我输入
sudo lvdisplay /dev/HOP-Server
Run Code Online (Sandbox Code Playgroud)
得到这个:
--- Logical volume ---
LV Name /dev/HOP-Server/root
VG Name HOP-Server
LV UUID feUsjU-HFHi-WFre-322J-SlWF-0J1K-zpiTQX
LV Write Access read/write
LV Status NOT available
LV Size 1.81 TiB
Current LE 474993
Segments 1
Allocation inherit
Read ahead sectors auto
--- Logical volume ---
LV Name /dev/HOP-Server/swap_1
VG Name HOP-Server
LV UUID tuJSFw-EKU4-oeLI-A934-srj2-DA2L-VqZtYr
LV Write Access read/write
LV Status NOT available
LV Size 7.20 GiB
Current LE 1843
Segments 1
Allocation inherit
Read ahead sectors auto
Run Code Online (Sandbox Code Playgroud)
这与您的示例略有不同,但我认为我应该输入
sudo mount /dev/HOP-Server/root /mnt **UPDATED**
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时,我得到了这个:
mount: special device /dev/HOP-Server/root does not exist
Run Code Online (Sandbox Code Playgroud)
**更新:** 我使用这个网页来帮助我挂载文件系统分区:
http://linuxwave.blogspot.com/2007/11/mounting-lvm-disk-using-ubuntu-livecd.html
Run Code Online (Sandbox Code Playgroud)
在那之后,我能够按照原始说明的其余部分没有错误。但是,当我重新启动时,唯一的选择是启动两个版本的内存测试实用程序。我再次重新启动了 Live CD 并再次按照说明进行操作。当我访问内核的 apt-get 时,它说它是最新的。
更新:好的,我再次挂载了分区,我可以看到 /root 中有一个名为 initrd.img-3.2.0-56-generic 的文件。IIRC,这是最新的内核。我运行了 update-grub,但它给了我错误,“找不到 / 的设备”。
更新:经过另一次搜索,我发现了这个:
http://sourceforge.net/apps/mediawiki/bootinfoscript/index.php?title=Boot_Problems:Cannot_Find_A_Device_For_boot/grub
Run Code Online (Sandbox Code Playgroud)
我遵循了那个程序,它没有出现任何错误。但是,现在当我启动时,我得到了这个:
error: ELF header smaller than expected
grub rescue>
Run Code Online (Sandbox Code Playgroud)
您的 Ubuntu 似乎使用 LVM 作为其根目录。您挂载的 ext2 分区包含使您的系统能够启动和挂载 lvm 的基本必需品,其余的(包括bash)存储在那里。
为了找到包含您的数据的 LVM 卷,您需要lvm2包,该包未安装在实时系统上。因此,安装它。
sudo apt-get install lvm2
通过列出所有卷组来查找包含根分区的卷组。
sudo pvs
输出应该看起来像
PV VG Fmt Attr PSize PFree
/dev/sda2 vg1 lvm2 a-- 1,64t 236,91g
Run Code Online (Sandbox Code Playgroud)
第二列包含卷组的名称,在本例中为vg1。有了它,您可以通过发出以下命令来获取有关该组中包含的卷的信息
sudo lvdisplay /dev/vg1
输出看起来像
--- Logical volume ---
LV Path /dev/vg1/lv1
LV Name lv1
VG Name vg1
LV UUID kE8qXE-bI4u-NLzZ-u37A-wZfx-NtaU-57PqRj
LV Write Access read/write
LV Creation host, time ,
LV Status available
# open 1
LV Size 1000,00 GiB
Current LE 256000
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 254:0
Run Code Online (Sandbox Code Playgroud)
您正在寻找 LV 名称,在本例中为lv1。如果只有一个卷,那应该是您的根驱动器。否则,将它们全部挂载并查看哪一个包含您的系统数据。
安装卷就像这样简单
sudo mount /dev/vg1/lv1 /mnt
完成此操作后,您应该继续按照您找到的线程中的说明进行操作。
更新:如评论中所述,由于您使用的是单独的引导分区 ( /dev/sda1),因此您必须将其挂载到/mnt/boot/. 您找到的线程中的第二个答案包含更多详细信息。
更新 2:最新的错误通常表明您的 grub 安装有问题。如果您有权访问远程 GUI,您可以尝试使用Boot Repair。如果这没有帮助,或者您只有一个终端,我建议创建一个专注于这个新问题的新线程。